55 lines
1.4 KiB
JavaScript
55 lines
1.4 KiB
JavaScript
|
/**
|
||
|
* @typedef {import('hast').Comment} Comment
|
||
|
* @typedef {import('hast').Parents} Parents
|
||
|
*
|
||
|
* @typedef {import('../index.js').State} State
|
||
|
*/
|
||
|
|
||
|
import {stringifyEntities} from 'stringify-entities'
|
||
|
|
||
|
const htmlCommentRegex = /^>|^->|<!--|-->|--!>|<!-$/g
|
||
|
|
||
|
// Declare arrays as variables so it can be cached by `stringifyEntities`
|
||
|
const bogusCommentEntitySubset = ['>']
|
||
|
const commentEntitySubset = ['<', '>']
|
||
|
|
||
|
/**
|
||
|
* Serialize a comment.
|
||
|
*
|
||
|
* @param {Comment} node
|
||
|
* Node to handle.
|
||
|
* @param {number | undefined} _1
|
||
|
* Index of `node` in `parent.
|
||
|
* @param {Parents | undefined} _2
|
||
|
* Parent of `node`.
|
||
|
* @param {State} state
|
||
|
* Info passed around about the current state.
|
||
|
* @returns {string}
|
||
|
* Serialized node.
|
||
|
*/
|
||
|
export function comment(node, _1, _2, state) {
|
||
|
// See: <https://html.spec.whatwg.org/multipage/syntax.html#comments>
|
||
|
return state.settings.bogusComments
|
||
|
? '<?' +
|
||
|
stringifyEntities(
|
||
|
node.value,
|
||
|
Object.assign({}, state.settings.characterReferences, {
|
||
|
subset: bogusCommentEntitySubset
|
||
|
})
|
||
|
) +
|
||
|
'>'
|
||
|
: '<!--' + node.value.replace(htmlCommentRegex, encode) + '-->'
|
||
|
|
||
|
/**
|
||
|
* @param {string} $0
|
||
|
*/
|
||
|
function encode($0) {
|
||
|
return stringifyEntities(
|
||
|
$0,
|
||
|
Object.assign({}, state.settings.characterReferences, {
|
||
|
subset: commentEntitySubset
|
||
|
})
|
||
|
)
|
||
|
}
|
||
|
}
|