58 lines
1.4 KiB
JavaScript
58 lines
1.4 KiB
JavaScript
|
/**
|
||
|
* @typedef {import('micromark-util-types').CompileContext} CompileContext
|
||
|
* @typedef {import('micromark-util-types').Handle} Handle
|
||
|
* @typedef {import('micromark-util-types').HtmlExtension} HtmlExtension
|
||
|
* @typedef {import('micromark-util-types').TokenType} TokenType
|
||
|
* @typedef {import('./to-matters.js').Options} Options
|
||
|
*/
|
||
|
|
||
|
import {toMatters} from './to-matters.js'
|
||
|
|
||
|
/**
|
||
|
* Create an extension for `micromark` to support frontmatter when serializing
|
||
|
* to HTML.
|
||
|
*
|
||
|
* > 👉 **Note**: this makes sure nothing is generated in the output HTML for
|
||
|
* > frontmatter.
|
||
|
*
|
||
|
* @param {Options | null | undefined} [options='yaml']
|
||
|
* Configuration (default: `'yaml'`).
|
||
|
* @returns {HtmlExtension}
|
||
|
* Extension for `micromark` that can be passed in `htmlExtensions`, to
|
||
|
* support frontmatter when serializing to HTML.
|
||
|
*/
|
||
|
export function frontmatterHtml(options) {
|
||
|
const matters = toMatters(options)
|
||
|
/** @type {HtmlExtension['enter']} */
|
||
|
const enter = {}
|
||
|
/** @type {HtmlExtension['exit']} */
|
||
|
const exit = {}
|
||
|
let index = -1
|
||
|
while (++index < matters.length) {
|
||
|
const type = /** @type {TokenType} */ matters[index].type
|
||
|
enter[type] = start
|
||
|
exit[type] = end
|
||
|
}
|
||
|
return {
|
||
|
enter,
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @this {CompileContext}
|
||
|
* @type {Handle}
|
||
|
*/
|
||
|
function start() {
|
||
|
this.buffer()
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @this {CompileContext}
|
||
|
* @type {Handle}
|
||
|
*/
|
||
|
function end() {
|
||
|
this.resume()
|
||
|
this.setData('slurpOneLineEnding', true)
|
||
|
}
|
||
|
}
|