1const ALLOW_MANY = ['by', 'url', 'genre', 'license', 'tag']; 2 3export function getMetadata(raw_code) { 4 if (raw_code == null) { 5 console.error('could not extract metadata from missing pattern code'); 6 raw_code = ''; 7 } 8 const comment_regexp = /\/\*([\s\S]*?)\*\/|\/\/(.*)$/gm; 9 const comments = [...raw_code.matchAll(comment_regexp)].map((c) => (c[1] || c[2] || '').trim()); 10 const tags = {}; 11 12 const [prefix, title] = (comments[0] || '').split('"'); 13 if (prefix.trim() === '' && title !== undefined) { 14 tags['title'] = title; 15 } 16 17 for (const comment of comments) { 18 const tag_matches = comment.split('@').slice(1); 19 for (const tag_match of tag_matches) { 20 let [tag, tag_value] = tag_match.split(/ (.*)/s); 21 tag = tag.trim(); 22 tag_value = (tag_value || '').replaceAll(/ +/g, ' ').trim(); 23 24 if (ALLOW_MANY.includes(tag)) { 25 const tag_list = tag_value 26 .split(/[,\n]/) 27 .map((t) => t.trim()) 28 .filter((t) => t !== ''); 29 tags[tag] = tag in tags ? tags[tag].concat(tag_list) : tag_list; 30 } else { 31 tag_value = tag_value.replaceAll(/\s+/g, ' '); 32 tags[tag] = tag in tags ? tags[tag] + ' ' + tag_value : tag_value; 33 } 34 } 35 } 36 37 return tags; 38}