forked from jxson/front-matter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
80 lines (70 loc) · 1.87 KB
/
index.js
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
var parser = require('js-yaml')
var optionalByteOrderMark = '\\ufeff?'
var platform = typeof process !== 'undefined' ? process.platform : ''
var pattern = '^(' +
optionalByteOrderMark +
'(= yaml =|---)' +
'$([\\s\\S]*?)' +
'^(?:\\2|\\.\\.\\.)\\s*' +
'$' +
(platform === 'win32' ? '\\r?' : '') +
'(?:\\n)?)'
// NOTE: If this pattern uses the 'g' flag the `regex` variable definition will
// need to be moved down into the functions that use it.
var regex = new RegExp(pattern, 'm')
module.exports = extractor
module.exports.test = test
function extractor (string, options) {
string = string || ''
var defaultOptions = { allowUnsafe: false }
options = options instanceof Object ? { ...defaultOptions, ...options } : defaultOptions
options.allowUnsafe = Boolean(options.allowUnsafe)
var lines = string.split(/(\r?\n)/)
if (lines[0] && /= yaml =|---/.test(lines[0])) {
return parse(string, options.allowUnsafe)
} else {
return {
attributes: {},
body: string,
bodyBegin: 1
}
}
}
function computeLocation (match, body) {
var line = 1
var pos = body.indexOf('\n')
var offset = match.index + match[0].length
while (pos !== -1) {
if (pos >= offset) {
return line
}
line++
pos = body.indexOf('\n', pos + 1)
}
return line
}
function parse (string, allowUnsafe) {
var match = regex.exec(string)
if (!match) {
return {
attributes: {},
body: string,
bodyBegin: 1
}
}
var loader = allowUnsafe ? parser.load : parser.safeLoad
var yaml = match[match.length - 1].replace(/^\s+|\s+$/g, '')
var attributes = loader(yaml) || {}
var body = string.replace(match[0], '')
var line = computeLocation(match, string)
return {
attributes: attributes,
body: body,
bodyBegin: line,
frontmatter: yaml
}
}
function test (string) {
string = string || ''
return regex.test(string)
}