UNPKG

hexo-front-matter

Version:
154 lines 4.61 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.stringify = exports.escape = exports.split = exports.parse = void 0; const yaml_1 = require("yaml"); const timestamp_1 = require("./timestamp"); const rPrefixSep = /^(-{3,}|;{3,})/; const rFrontMatter = /^(-{3,}|;{3,})\r?\n([\s\S]+?)\r?\n\1\r?\n?([\s\S]*)/; const rFrontMatterNew = /^([\s\S]+?)\r?\n(-{3,}|;{3,})\r?\n?([\s\S]*)/; function split(str) { if (typeof str !== 'string') throw new TypeError('str is required!'); const matchOld = str.match(rFrontMatter); if (matchOld) { return { data: matchOld[2], content: matchOld[3] || '', separator: matchOld[1], prefixSeparator: true }; } if (rPrefixSep.test(str)) return { content: str }; const matchNew = str.match(rFrontMatterNew); if (matchNew) { return { data: matchNew[1], content: matchNew[3] || '', separator: matchNew[2], prefixSeparator: false }; } return { content: str }; } exports.split = split; function parse(str, options = {}) { if (typeof str !== 'string') throw new TypeError('str is required!'); const splitData = split(str); const raw = splitData.data; if (!raw) return { _content: str }; let data; if (splitData.separator.startsWith(';')) { data = parseJSON(raw); } else { data = parseYAML(raw, options); } if (!data) return { _content: str }; data._content = splitData.content; return data; } exports.parse = parse; function parseYAML(str, options) { const result = (0, yaml_1.parse)(escapeYAML(str), { customTags: [(0, timestamp_1.timestampFactory)(options.defaultTimeZone)] }); if (typeof result !== 'object') return; return result; } function parseJSON(str) { try { return JSON.parse(`{${str}}`); } catch (err) { return; // eslint-disable-line } } function escapeYAML(str) { if (typeof str !== 'string') throw new TypeError('str is required!'); return str.replace(/\r?\n(\t+)/g, (match, tabs) => { let result = '\n'; for (let i = 0, len = tabs.length; i < len; i++) { result += ' '; } return result; }); } exports.escape = escapeYAML; function stringify(obj, options = {}) { if (!obj) throw new TypeError('obj is required!'); const { _content: content = '' } = obj; delete obj._content; if (!Object.keys(obj).length) return content; const { mode, prefixSeparator } = options; const separator = options.separator || (mode === 'json' ? ';;;' : '---'); let result = ''; if (prefixSeparator) result += `${separator}\n`; if (mode === 'json') { result += stringifyJSON(obj); } else { result += stringifyYAML(obj, { defaultStringType: 'PLAIN', singleQuote: true }); } result += `${separator}\n${content}`; return result; } exports.stringify = stringify; function stringifyYAML(obj, options) { const keys = Object.keys(obj); const data = {}; const nullKeys = []; const dateKeys = []; let key, value, i, len; for (i = 0, len = keys.length; i < len; i++) { key = keys[i]; value = obj[key]; if (value == null) { nullKeys.push(key); } else if (value instanceof Date) { dateKeys.push(key); } else { data[key] = value; } } let result = (0, yaml_1.stringify)(data, options); if (dateKeys.length) { for (i = 0, len = dateKeys.length; i < len; i++) { key = dateKeys[i]; result += `${key}: ${formatDate(obj[key])}\n`; } } if (nullKeys.length) { for (i = 0, len = nullKeys.length; i < len; i++) { result += `${nullKeys[i]}:\n`; } } return result; } function stringifyJSON(obj) { return JSON.stringify(obj, null, ' ') // Remove indention .replace(/\r?\n {2}/g, () => '\n') // Remove prefixing and trailing braces .replace(/^{\r?\n|}$/g, ''); } function doubleDigit(num) { return num.toString().padStart(2, '0'); } function formatDate(date) { return `${date.getFullYear()}-${doubleDigit(date.getMonth() + 1)}-${doubleDigit(date.getDate())} ${doubleDigit(date.getHours())}:${doubleDigit(date.getMinutes())}:${doubleDigit(date.getSeconds())}`; } //# sourceMappingURL=front_matter.js.map