mono/packages/commons/dist/lang/frontmatter.js
2025-01-28 13:42:22 +01:00

48 lines
3.7 KiB
JavaScript

import yaml from 'js-yaml';
export function isFrontmatterValid(frontmatter) {
try {
// ensure frontmatter is JSON-serializable
JSON.stringify(frontmatter);
}
catch {
return false;
}
return typeof frontmatter === 'object' && frontmatter !== null;
}
// Capture frontmatter wrapped with `---`, including any characters and new lines within it.
// Only capture if `---` exists near the top of the file, including:
// 1. Start of file (including if has BOM encoding)
// 2. Start of file with any whitespace (but `---` must still start on a new line)
const frontmatterRE = /(?:^\uFEFF?|^\s*\n)---([\s\S]*?\n)---/;
export function extractFrontmatter(code) {
return frontmatterRE.exec(code)?.[1];
}
export function parseFrontmatter(code, options) {
const rawFrontmatter = extractFrontmatter(code);
if (rawFrontmatter == null) {
return { frontmatter: {}, rawFrontmatter: '', content: code };
}
const parsed = yaml.load(rawFrontmatter);
const frontmatter = (parsed && typeof parsed === 'object' ? parsed : {});
let content;
switch (options?.frontmatter ?? 'remove') {
case 'preserve':
content = code;
break;
case 'remove':
content = code.replace(`---${rawFrontmatter}---`, '');
break;
case 'empty-with-spaces':
content = code.replace(`---${rawFrontmatter}---`, ` ${rawFrontmatter.replace(/[^\r\n]/g, ' ')} `);
break;
case 'empty-with-lines':
content = code.replace(`---${rawFrontmatter}---`, rawFrontmatter.replace(/[^\r\n]/g, ''));
break;
}
return {
frontmatter,
rawFrontmatter,
content,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFuZy9mcm9udG1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxTQUFTLENBQUM7QUFFM0IsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFdBQWdDO0lBQ2xFLElBQUksQ0FBQztRQUNKLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUixPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxXQUFXLEtBQUssSUFBSSxDQUFDO0FBQ2hFLENBQUM7QUFFRCw0RkFBNEY7QUFDNUYsb0VBQW9FO0FBQ3BFLG1EQUFtRDtBQUNuRCxrRkFBa0Y7QUFDbEYsTUFBTSxhQUFhLEdBQUcsdUNBQXVDLENBQUM7QUFDOUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVk7SUFDOUMsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQXFCRCxNQUFNLFVBQVUsZ0JBQWdCLENBQy9CLElBQVksRUFDWixPQUFpQztJQUVqQyxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVoRCxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUM1QixPQUFPLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN6QyxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUF3QixDQUFDO0lBRWhHLElBQUksT0FBZSxDQUFDO0lBQ3BCLFFBQVEsT0FBTyxFQUFFLFdBQVcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMxQyxLQUFLLFVBQVU7WUFDZCxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsTUFBTTtRQUNQLEtBQUssUUFBUTtZQUNaLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sY0FBYyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEQsTUFBTTtRQUNQLEtBQUssbUJBQW1CO1lBQ3ZCLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNyQixNQUFNLGNBQWMsS0FBSyxFQUN6QixNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQ2xELENBQUM7WUFDRixNQUFNO1FBQ1AsS0FBSyxrQkFBa0I7WUFDdEIsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxjQUFjLEtBQUssRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFGLE1BQU07SUFDUixDQUFDO0lBRUQsT0FBTztRQUNOLFdBQVc7UUFDWCxjQUFjO1FBQ2QsT0FBTztLQUNQLENBQUM7QUFDSCxDQUFDIn0=