46 lines
1 KiB
JavaScript
46 lines
1 KiB
JavaScript
|
/**
|
||
|
* @typedef {import('hast').Element} Element
|
||
|
* @typedef {import('hast').Parents} Parents
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @callback OmitHandle
|
||
|
* Check if a tag can be omitted.
|
||
|
* @param {Element} element
|
||
|
* Element to check.
|
||
|
* @param {number | undefined} index
|
||
|
* Index of element in parent.
|
||
|
* @param {Parents | undefined} parent
|
||
|
* Parent of element.
|
||
|
* @returns {boolean}
|
||
|
* Whether to omit a tag.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
const own = {}.hasOwnProperty
|
||
|
|
||
|
/**
|
||
|
* Factory to check if a given node can have a tag omitted.
|
||
|
*
|
||
|
* @param {Record<string, OmitHandle>} handlers
|
||
|
* Omission handlers, where each key is a tag name, and each value is the
|
||
|
* corresponding handler.
|
||
|
* @returns {OmitHandle}
|
||
|
* Whether to omit a tag of an element.
|
||
|
*/
|
||
|
export function omission(handlers) {
|
||
|
return omit
|
||
|
|
||
|
/**
|
||
|
* Check if a given node can have a tag omitted.
|
||
|
*
|
||
|
* @type {OmitHandle}
|
||
|
*/
|
||
|
function omit(node, index, parent) {
|
||
|
return (
|
||
|
own.call(handlers, node.tagName) &&
|
||
|
handlers[node.tagName](node, index, parent)
|
||
|
)
|
||
|
}
|
||
|
}
|