51 lines
1.1 KiB
JavaScript
51 lines
1.1 KiB
JavaScript
|
var parser = require('js-yaml')
|
||
|
var optionalByteOrderMark = '\\ufeff?'
|
||
|
var pattern = '^(' +
|
||
|
optionalByteOrderMark +
|
||
|
'(= yaml =|---)' +
|
||
|
'$([\\s\\S]*?)' +
|
||
|
'^(?:\\2|\\.\\.\\.)' +
|
||
|
'$' +
|
||
|
(process.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) {
|
||
|
string = string || ''
|
||
|
|
||
|
var lines = string.split(/(\r?\n)/)
|
||
|
if (lines[0] && /= yaml =|---/.test(lines[0])) {
|
||
|
return parse(string)
|
||
|
} else {
|
||
|
return { attributes: {}, body: string }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function parse (string) {
|
||
|
var match = regex.exec(string)
|
||
|
|
||
|
if (!match) {
|
||
|
return {
|
||
|
attributes: {},
|
||
|
body: string
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var yaml = match[match.length - 1].replace(/^\s+|\s+$/g, '')
|
||
|
var attributes = parser.load(yaml) || {}
|
||
|
var body = string.replace(match[0], '')
|
||
|
|
||
|
return { attributes: attributes, body: body, frontmatter: yaml }
|
||
|
}
|
||
|
|
||
|
function test (string) {
|
||
|
string = string || ''
|
||
|
|
||
|
return regex.test(string)
|
||
|
}
|