| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 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
- },
- }
|