site/node_modules/rehype-parse/lib/index.js

64 lines
1.8 KiB
JavaScript
Raw Permalink Normal View History

2024-10-14 06:09:33 +00:00
/**
* @typedef {import('hast').Root} Root
* @typedef {import('hast-util-from-html').Options} FromHtmlOptions
* @typedef {import('unified').Parser<Root>} Parser
*/
/**
* @typedef {Omit<FromHtmlOptions, 'onerror'> & RehypeParseFields} Options
* Configuration.
*
* @typedef RehypeParseFields
* Extra fields.
* @property {boolean | null | undefined} [emitParseErrors=false]
* Whether to emit parse errors while parsing (default: `false`).
*
* > 👉 **Note**: parse errors are currently being added to HTML.
* > Not all errors emitted by parse5 (or us) are specced yet.
* > Some documentation may still be missing.
*/
import {fromHtml} from 'hast-util-from-html'
/**
* Plugin to add support for parsing from HTML.
*
* > 👉 **Note**: this is not an XML parser.
* > It supports SVG as embedded in HTML.
* > It does not support the features available in XML.
* > Passing SVG files might break but fragments of modern SVG should be fine.
* > Use [`xast-util-from-xml`][xast-util-from-xml] to parse XML.
*
* @param {Options | null | undefined} [options]
* Configuration (optional).
* @returns {undefined}
* Nothing.
*/
export default function rehypeParse(options) {
/** @type {import('unified').Processor<Root>} */
// @ts-expect-error: TS in JSDoc generates wrong types if `this` is typed regularly.
const self = this
const {emitParseErrors, ...settings} = {...self.data('settings'), ...options}
self.parser = parser
/**
* @type {Parser}
*/
function parser(doc, file) {
return fromHtml(doc, {
...settings,
onerror: emitParseErrors
? function (message) {
if (file.path) {
message.name = file.path + ':' + message.name
message.file = file.path
}
file.messages.push(message)
}
: undefined
})
}
}