jevstrudel.git / website / src / metadata_parser.js
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}