@@ -39,6 +39,9 @@ import {visit} from 'unist-util-visit'
3939import { webNamespaces } from 'web-namespaces'
4040import { zwitch } from 'zwitch'
4141
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+
4245// Node types associated with MDX.
4346// <https://github.com/mdx-js/mdx/blob/8a56312/packages/mdx/lib/node-types.js>
4447const knownMdxNames = new Set ( [
@@ -325,7 +328,13 @@ function handleRaw(node, state) {
325328
326329 // Now pass `node.value`.
327330 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+ )
329338 // @ts -expect-error: private.
330339 state . parser . tokenizer . _runParsingLoop ( )
331340
@@ -596,10 +605,11 @@ function endTag(node, state) {
596605 tagName === state . parser . tokenizer . lastStartTagName &&
597606 // `<textarea>` and `<title>`
598607 ( state . parser . tokenizer . state === TokenizerMode . RCDATA ||
599- // `<iframe>`, `<noembed>`, `<style>`, `<xmp>`
608+ // `<iframe>`, `<noembed>`, `<noframes>`, `< style>`, `<xmp>`
600609 state . parser . tokenizer . state === TokenizerMode . RAWTEXT ||
601610 // `<script>`
602611 state . parser . tokenizer . state === TokenizerMode . SCRIPT_DATA )
612+ // Note: `<plaintext>` not needed, as it’s the last element.
603613 ) {
604614 state . parser . tokenizer . state = TokenizerMode . DATA
605615 }
0 commit comments