refactor: finish moving ssh-* scripts to own installers
[webi-installers/.git] / _webi / frontmarker.js
1 'use strict';
2
3 var fs = require('fs');
4 var marked = require('marked');
5
6 var frontmatter = '---';
7 var keyValRe = /(\w+): (.*)/;
8
9 function parseYamlish(txt) {
10   var end = false;
11   var cfg = { title: '', tagline: '', description: '', examples: '' };
12   var block = false;
13
14   var lines = txt.trim().split('\n');
15   var moreRe = /\s+/;
16   var last;
17
18   if (frontmatter !== lines.shift()) {
19     throw new Error('no frontmatter marker at beginning of file');
20   }
21
22   function unblock() {
23     cfg[block] = marked(cfg[block]);
24     block = false;
25   }
26
27   lines.some(function (line, i) {
28     if (frontmatter === line) {
29       // end of frontmatter
30       end = true;
31       return;
32     }
33
34     if (end) {
35       if (line.trim()) {
36         throw new Error('missing newline after frontmatter');
37       }
38       last = i;
39       return true;
40     }
41
42     if (!line[0]) {
43       if (block) {
44         cfg[block] += '\n';
45       } else {
46         throw new Error('invalid blank line in frontmatter');
47       }
48     }
49
50     if (block) {
51       if (!line || '  ' === line.slice(0, 2)) {
52         cfg[block] += line.slice(2) + '\n';
53         return;
54       }
55       unblock();
56     }
57
58     var m = line.match(keyValRe);
59     if (!m) {
60       throw new Error(
61         'invalid key format for: ' + JSON.stringify(line) + ' ' + i
62       );
63     }
64     if ('|' === m[2]) {
65       block = m[1];
66       return;
67     }
68     cfg[m[1]] = m[2];
69   });
70
71   if (block) {
72     cfg[block] = marked(cfg[block]);
73   }
74   cfg.examples = marked(lines.slice(last).join('\n'));
75
76   return cfg;
77 }
78
79 module.exports.parse = parseYamlish;
80
81 if (require.main === module) {
82   console.info(
83     parseYamlish(fs.readFileSync(__dirname + '/../node/README.md', 'utf8'))
84   );
85 }