RightSquare = 93 // "]"
}
-const defaultDelimitersOpen = [123, 123] // "{{"
-const defaultDelimitersClose = [125, 125] // "}}"
+const defaultDelimitersOpen = new Uint8Array([123, 123]) // "{{"
+const defaultDelimitersClose = new Uint8Array([125, 125]) // "}}"
/** All the states the tokenizer can be in. */
const enum State {
InEntity
}
+/**
+ * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a
+ * tag name.
+ */
+function isTagStartChar(c: number): boolean {
+ return (
+ (c >= CharCodes.LowerA && c <= CharCodes.LowerZ) ||
+ (c >= CharCodes.UpperA && c <= CharCodes.UpperZ)
+ )
+}
+
export function isWhitespace(c: number): boolean {
return (
c === CharCodes.Space ||
}
}
- public delimiterOpen: number[] = defaultDelimitersOpen
- public delimiterClose: number[] = defaultDelimitersClose
- private matchDelimiter(c: number, delimiter: number[]): boolean {
+ public delimiterOpen: Uint8Array = defaultDelimitersOpen
+ public delimiterClose: Uint8Array = defaultDelimitersClose
+ private matchDelimiter(c: number, delimiter: Uint8Array): boolean {
if (c === delimiter[0]) {
const l = delimiter.length
for (let i = 1; i < l; i++) {
}
}
- /**
- * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.
- */
- private isTagStartChar(c: number) {
- return (
- (c >= CharCodes.LowerA && c <= CharCodes.LowerZ) ||
- (c >= CharCodes.UpperA && c <= CharCodes.UpperZ)
- )
- }
-
private startSpecial(sequence: Uint8Array, offset: number) {
this.isSpecial = true
this.currentSequence = sequence
} else if (c === CharCodes.Questionmark) {
this.state = State.InProcessingInstruction
this.sectionStart = this.index + 1
- } else if (this.isTagStartChar(c)) {
+ } else if (isTagStartChar(c)) {
const lower = c | 0x20
this.sectionStart = this.index
if (lower === Sequences.TitleEnd[2]) {
} else if (c === CharCodes.Gt) {
this.state = State.Text
} else {
- this.state = this.isTagStartChar(c)
+ this.state = isTagStartChar(c)
? State.InClosingTagName
: State.InSpecialComment
this.sectionStart = this.index
import { NO, extend } from '@vue/shared'
import { defaultOnError, defaultOnWarn } from '../errors'
import { isCoreComponent } from '../utils'
+import { TextModes } from '../parse'
type OptionalOptions =
- | 'getTextMode' // TODO
| 'whitespace'
| 'isNativeTag'
| 'isBuiltInComponent'
export const defaultParserOptions: MergedParserOptions = {
delimiters: [`{{`, `}}`],
getNamespace: () => Namespaces.HTML,
- // getTextMode: () => TextModes.DATA,
+ getTextMode: () => TextModes.DATA,
isVoidTag: NO,
isPreTag: NO,
isCustomElement: NO,
stack.length = 0
}
-function toCharCodes(str: string): number[] {
- return str.split('').map(c => c.charCodeAt(0))
+function toCharCodes(str: string): Uint8Array {
+ const ret = new Uint8Array()
+ for (let i = 0; i < str.length; i++) {
+ ret[i] = str.charCodeAt(i)
+ }
+ return ret
}
export function baseParse(input: string, options?: ParserOptions): RootNode {
NodeTypes,
isBuiltInType
} from '@vue/compiler-core'
-import { makeMap, isVoidTag, isHTMLTag, isSVGTag } from '@vue/shared'
+import { 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 = 0 /* Namespaces.HTML */,
SVG,
// 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') {
if (tag === 'textarea' || tag === 'title') {
return TextModes.RCDATA
}
- if (isRawTextContainer(tag)) {
+ if (tag === 'style' || tag === 'script') {
return TextModes.RAWTEXT
}
}