e58beecc97
BREAKING CHANGE: `getTextMode` compiler option signature has changed from ```ts (tag: string, ns: string, parent: ElementNode | undefined) => TextModes ``` to ```ts (node: ElementNode, parent: ElementNode | undefined) => TextModes ```
101 lines
2.6 KiB
TypeScript
101 lines
2.6 KiB
TypeScript
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 = /*#__PURE__*/ makeMap(
|
|
'style,iframe,script,noscript',
|
|
true
|
|
)
|
|
|
|
export const enum DOMNamespaces {
|
|
HTML = Namespaces.HTML,
|
|
SVG,
|
|
MATH_ML
|
|
}
|
|
|
|
export const parserOptions: ParserOptions = {
|
|
isVoidTag,
|
|
isNativeTag: tag => isHTMLTag(tag) || isSVGTag(tag),
|
|
isPreTag: tag => tag === 'pre',
|
|
decodeEntities: __BROWSER__ ? decodeHtmlBrowser : decodeHtml,
|
|
|
|
isBuiltInComponent: (tag: string): symbol | undefined => {
|
|
if (isBuiltInType(tag, `Transition`)) {
|
|
return TRANSITION
|
|
} else if (isBuiltInType(tag, `TransitionGroup`)) {
|
|
return TRANSITION_GROUP
|
|
}
|
|
},
|
|
|
|
// https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
|
|
getNamespace(tag: string, parent: ElementNode | undefined): DOMNamespaces {
|
|
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
|
|
},
|
|
|
|
// https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments
|
|
getTextMode({ tag, ns }: ElementNode): TextModes {
|
|
if (ns === DOMNamespaces.HTML) {
|
|
if (tag === 'textarea' || tag === 'title') {
|
|
return TextModes.RCDATA
|
|
}
|
|
if (isRawTextContainer(tag)) {
|
|
return TextModes.RAWTEXT
|
|
}
|
|
}
|
|
return TextModes.DATA
|
|
}
|
|
}
|