52 lines
1.4 KiB
Plaintext
52 lines
1.4 KiB
Plaintext
|
/**
|
|||
|
* @typedef {import('micromark-util-types').CompileContext} CompileContext
|
|||
|
* @typedef {import('micromark-util-types').HtmlExtension} HtmlExtension
|
|||
|
* @typedef {import('micromark-util-types').Token} Token
|
|||
|
*/
|
|||
|
|
|||
|
// An opening or closing tag start, followed by a case-insensitive specific tag name,
|
|||
|
// followed by HTML whitespace, a greater than, or a slash.
|
|||
|
const reFlow =
|
|||
|
/<(\/?)(iframe|noembed|noframes|plaintext|script|style|title|textarea|xmp)(?=[\t\n\f\r />])/gi
|
|||
|
|
|||
|
// As HTML (text) parses tags separately (and very strictly), we don’t need to be
|
|||
|
// global.
|
|||
|
const reText = new RegExp('^' + reFlow.source, 'i')
|
|||
|
|
|||
|
/**
|
|||
|
* Create an HTML extension for `micromark` to support GitHubs weird and
|
|||
|
* useless tagfilter when serializing to HTML.
|
|||
|
*
|
|||
|
* @returns {HtmlExtension}
|
|||
|
* Extension for `micromark` that can be passed in `htmlExtensions` to support
|
|||
|
* GitHubs weird and useless tagfilter when serializing to HTML.
|
|||
|
*/
|
|||
|
export function gfmTagfilterHtml() {
|
|||
|
return {
|
|||
|
exit: {
|
|||
|
htmlFlowData(token) {
|
|||
|
exitHtmlData.call(this, token, reFlow)
|
|||
|
},
|
|||
|
htmlTextData(token) {
|
|||
|
exitHtmlData.call(this, token, reText)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @this {CompileContext}
|
|||
|
* @param {Token} token
|
|||
|
* @param {RegExp} filter
|
|||
|
* @returns {undefined}
|
|||
|
*/
|
|||
|
function exitHtmlData(token, filter) {
|
|||
|
let value = this.sliceSerialize(token)
|
|||
|
|
|||
|
if (this.options.allowDangerousHtml) {
|
|||
|
value = value.replace(filter, '<$1$2')
|
|||
|
}
|
|||
|
|
|||
|
this.raw(this.encode(value))
|
|||
|
}
|