-
Notifications
You must be signed in to change notification settings - Fork 0
/
parseFrontmatter.ts
41 lines (33 loc) · 975 Bytes
/
parseFrontmatter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
* SPDX-FileCopyrightText: Copyright 2021 Greg Hurrell
* SPDX-License-Identifier: MIT
*/
import StringScanner from './StringScanner';
const FRONTMATTER_DELIMITER_REGEXP = /---(?:\r?\n|$)/;
const KEY_REGEXP = /[ \t]*[^ \t:]+[ \t]*:[ \t]*/;
const VALUE_REGEXP = /[^\r\n]+(?:\r?\n|$)/;
export default function parseFrontmatter(
input: string,
description?: string
): {
content: string;
metadata: {
[key: string]: string;
};
} {
const metadata: {[key: string]: string} = {};
const scanner = new StringScanner(input, description);
if (scanner.scan(FRONTMATTER_DELIMITER_REGEXP)) {
while (scanner.peek(KEY_REGEXP)) {
const key = scanner.expect(KEY_REGEXP).split(':')[0].trim();
const value = scanner.expect(VALUE_REGEXP, 'value').trim();
metadata[key] = value;
}
scanner.expect(FRONTMATTER_DELIMITER_REGEXP, '---');
}
const content = scanner.expect(/.*/s).trimLeft();
return {
content,
metadata,
};
}