import { TextModes , ParserOptions , ElementNode , Namespaces , NodeTypes , isBuiltInType } from '@vue/compiler-core' ; import { makeMap , isVoidTag , isHTMLTag , isSVGTag } from '@vue/shared' ; import { TRANSITION , TRANSITION_GROUP } from './runtimeHelpers' ; import { decodeHtml } from './decodeHtml' ; import { decodeHtmlBrowser } from './decodeHtmlBrowser' ; const isRawTextContainer = makeMap ( 'style,iframe,script,noscript' , true ) ; export const enum DOMNamespaces { HTML = Namespaces . HTML , SVG , MATH_ML } export const parserOptions = { isVoidTag , isNativeTag : tag => isHTMLTag ( tag ) || isSVGTag ( tag ) , isPreTag : tag => tag === 'pre' , decodeEntities : __BROWSER__ ? decodeHtmlBrowser : decodeHtml , isBuiltInComponent : ( tag ) : symbol | undefined => { if ( isBuiltInType ( tag , `Transition` ) ) { return TRANSITION ; } else if ( isBuiltInType ( tag , `TransitionGroup` ) ) { return TRANSITION_GROUP ; } } , getNamespace ( tag , parent ) { let ns = parent ? parent . ns : DOMNamespaces . HTML ; if ( parent && ns === DOMNamespaces . MATH_ML ) { if ( parent . tag === 'annotation-xml' ) { if ( tag === 'svg' ) { return DOMNamespaces . SVG ; } if ( parent . props . some ( a => a . type === NodeTypes . ATTRIBUTE && a . name === 'encoding' && a . value != null && ( a . value . content === 'text/html' || a . value . content === 'application/xhtml+xml' ) ) ) { ns = DOMNamespaces . HTML ; } } else if ( /^m(?:[ions]|text)$/ . test ( parent . tag ) && tag !== 'mglyph' && tag !== 'malignmark' ) { ns = DOMNamespaces . HTML ; } } else if ( parent && ns === DOMNamespaces . SVG ) { if ( parent . tag === 'foreignObject' || parent . tag === 'desc' || parent . tag === 'title' ) { ns = DOMNamespaces . HTML ; } } if ( ns === DOMNamespaces . HTML ) { if ( tag === 'svg' ) { return DOMNamespaces . SVG ; } if ( tag === 'math' ) { return DOMNamespaces . MATH_ML ; } } return ns ; } , getTextMode ( { tag , ns } ) { if ( ns === DOMNamespaces . HTML ) { if ( tag === 'textarea' || tag === 'title' ) { return TextModes . RCDATA ; } if ( isRawTextContainer ( tag ) ) { return TextModes . RAWTEXT ; } } return TextModes . DATA ; } } ;