Files
vim-ale/_webi/frontmarker.js

85 lines
1.6 KiB
JavaScript

'use strict';
var fs = require('fs');
var marked = require('marked').marked;
var frontmatter = '---';
var keyValRe = /(\w+): (.*)/;
function parseYamlish(txt) {
var end = false;
var cfg = { title: '', tagline: '', description: '', examples: '' };
var block = false;
var lines = txt.trim().split('\n');
var last;
if (frontmatter !== lines.shift()) {
throw new Error('no frontmatter marker at beginning of file');
}
function unblock() {
cfg[block] = marked.parse(cfg[block]);
block = false;
}
lines.some(function (line, i) {
if (frontmatter === line) {
// end of frontmatter
end = true;
return;
}
if (end) {
if (line.trim()) {
throw new Error('missing newline after frontmatter');
}
last = i;
return true;
}
if (!line[0]) {
if (block) {
cfg[block] += '\n';
} else {
throw new Error('invalid blank line in frontmatter');
}
}
if (block) {
if (!line || ' ' === line.slice(0, 2)) {
cfg[block] += line.slice(2) + '\n';
return;
}
unblock();
}
var m = line.match(keyValRe);
if (!m) {
throw new Error(
'invalid key format for: ' + JSON.stringify(line) + ' ' + i,
);
}
if ('|' === m[2]) {
block = m[1];
return;
}
cfg[m[1]] = m[2];
});
if (block) {
cfg[block] = marked.parse(cfg[block]);
}
cfg.examples = marked.parse(lines.slice(last).join('\n'));
return cfg;
}
module.exports.parse = parseYamlish;
if (require.main === module) {
console.info(
parseYamlish(fs.readFileSync(__dirname + '/../node/README.md', 'utf8')),
);
}