import { Namespaces, NodeTypes, type ParserOptions } from '@vue/compiler-core' import { isHTMLTag, isMathMLTag, isSVGTag, isVoidTag } from '@vue/shared' import { TRANSITION, TRANSITION_GROUP } from './runtimeHelpers' import { decodeHtmlBrowser } from './decodeHtmlBrowser' export const parserOptions: ParserOptions = { parseMode: 'html', isVoidTag, isNativeTag: tag => isHTMLTag(tag) || isSVGTag(tag) || isMathMLTag(tag), isPreTag: tag => tag === 'pre', decodeEntities: __BROWSER__ ? decodeHtmlBrowser : undefined, isBuiltInComponent: tag => { if (tag === 'Transition' || tag === 'transition') { return TRANSITION } else if (tag === 'TransitionGroup' || tag === 'transition-group') { return TRANSITION_GROUP } }, // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher getNamespace(tag, parent, rootNamespace) { let ns = parent ? parent.ns : rootNamespace if (parent && ns === Namespaces.MATH_ML) { if (parent.tag === 'annotation-xml') { if (tag === 'svg') { return Namespaces.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 = Namespaces.HTML } } else if ( /^m(?:[ions]|text)$/.test(parent.tag) && tag !== 'mglyph' && tag !== 'malignmark' ) { ns = Namespaces.HTML } } else if (parent && ns === Namespaces.SVG) { if ( parent.tag === 'foreignObject' || parent.tag === 'desc' || parent.tag === 'title' ) { ns = Namespaces.HTML } } if (ns === Namespaces.HTML) { if (tag === 'svg') { return Namespaces.SVG } if (tag === 'math') { return Namespaces.MATH_ML } } return ns }, }