@@ -39,6 +39,9 @@ import {visit} from 'unist-util-visit'
39
39
import { webNamespaces } from 'web-namespaces'
40
40
import { zwitch } from 'zwitch'
41
41
42
+ const gfmTagfilterExpression =
43
+ / < ( \/ ? ) ( i f r a m e | n o e m b e d | n o f r a m e s | p l a i n t e x t | s c r i p t | s t y l e | t e x t a r e a | t i t l e | x m p ) (? = [ \t \n \f \r / > ] ) / gi
44
+
42
45
// Node types associated with MDX.
43
46
// <https://github.com/mdx-js/mdx/blob/8a56312/packages/mdx/lib/node-types.js>
44
47
const knownMdxNames = new Set ( [
@@ -325,7 +328,13 @@ function handleRaw(node, state) {
325
328
326
329
// Now pass `node.value`.
327
330
setPoint ( state , pointStart ( node ) )
328
- state . parser . tokenizer . write ( node . value , false )
331
+
332
+ state . parser . tokenizer . write (
333
+ state . options . tagfilter
334
+ ? node . value . replace ( gfmTagfilterExpression , '<$1$2' )
335
+ : node . value ,
336
+ false
337
+ )
329
338
// @ts -expect-error: private.
330
339
state . parser . tokenizer . _runParsingLoop ( )
331
340
@@ -596,10 +605,11 @@ function endTag(node, state) {
596
605
tagName === state . parser . tokenizer . lastStartTagName &&
597
606
// `<textarea>` and `<title>`
598
607
( state . parser . tokenizer . state === TokenizerMode . RCDATA ||
599
- // `<iframe>`, `<noembed>`, `<style>`, `<xmp>`
608
+ // `<iframe>`, `<noembed>`, `<noframes>`, `< style>`, `<xmp>`
600
609
state . parser . tokenizer . state === TokenizerMode . RAWTEXT ||
601
610
// `<script>`
602
611
state . parser . tokenizer . state === TokenizerMode . SCRIPT_DATA )
612
+ // Note: `<plaintext>` not needed, as it’s the last element.
603
613
) {
604
614
state . parser . tokenizer . state = TokenizerMode . DATA
605
615
}
0 commit comments