UNPKG

@11ty/gray-matter

Version:

Parse front-matter from a string or file. Fast, reliable and easy to use. Parses YAML front matter by default, but also has support for YAML, JSON, TOML Front-Matter, with options to set custom delimiters. Used by metalsmith, assemble, verb and many other

54 lines (44 loc) 1.4 kB
'use strict'; const getEngine = require('./engine'); const defaults = require('./defaults'); const { isObject } = require('./utils'); module.exports = function(file, data, options) { if (data == null && options == null) { if (isObject(file)) { data = file.data; options = {}; } else if (typeof file === 'string') { return file; } else { throw new TypeError('expected file to be a string or object'); } } const str = file.content; const opts = defaults(options); if (data == null) { if (!opts.data) return file; data = opts.data; } const language = file.language || opts.language; const engine = getEngine(language, opts); if (typeof engine.stringify !== 'function') { throw new TypeError('expected "' + language + '.stringify" to be a function'); } data = Object.assign({}, file.data, data); const open = opts.delimiters[0]; const close = opts.delimiters[1]; const matter = engine.stringify(data, options).trim(); let buf = ''; if (matter !== '{}') { buf = newline(open) + newline(matter) + newline(close); } if (typeof file.excerpt === 'string' && file.excerpt !== '') { if (str.indexOf(file.excerpt.trim()) === -1) { buf += newline(file.excerpt) + newline(close); } } return buf + newline(str); }; function newline(str) { return str.slice(-1) !== '\n' ? str + '\n' : str; }