Skip to content

Commit

Permalink
wip: getting ready for textmode handling
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Nov 25, 2023
1 parent 5a855c5 commit 81e941d
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 29 deletions.
35 changes: 18 additions & 17 deletions packages/compiler-core/src/parser/Tokenizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ export const enum CharCodes {
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 {
Expand Down Expand Up @@ -115,6 +115,17 @@ 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 ||
Expand Down Expand Up @@ -261,9 +272,9 @@ export default class Tokenizer {
}
}

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++) {
Expand Down Expand Up @@ -420,16 +431,6 @@ export default class Tokenizer {
}
}

/**
* 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
Expand All @@ -444,7 +445,7 @@ export default class Tokenizer {
} 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]) {
Expand Down Expand Up @@ -476,7 +477,7 @@ export default class Tokenizer {
} 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
Expand Down
12 changes: 8 additions & 4 deletions packages/compiler-core/src/parser/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ import { CompilerCompatOptions } from '../compat/compatConfig'
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'
Expand All @@ -45,7 +45,7 @@ const decodeMap: Record<string, string> = {
export const defaultParserOptions: MergedParserOptions = {
delimiters: [`{{`, `}}`],
getNamespace: () => Namespaces.HTML,
// getTextMode: () => TextModes.DATA,
getTextMode: () => TextModes.DATA,
isVoidTag: NO,
isPreTag: NO,
isCustomElement: NO,
Expand Down Expand Up @@ -598,8 +598,12 @@ function reset() {
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 {
Expand Down
10 changes: 2 additions & 8 deletions packages/compiler-dom/src/parserOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,11 @@ import {
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,
Expand All @@ -38,7 +33,6 @@ export const parserOptions: ParserOptions = {
// 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') {
Expand Down Expand Up @@ -90,7 +84,7 @@ export const parserOptions: ParserOptions = {
if (tag === 'textarea' || tag === 'title') {
return TextModes.RCDATA
}
if (isRawTextContainer(tag)) {
if (tag === 'style' || tag === 'script') {
return TextModes.RAWTEXT
}
}
Expand Down

0 comments on commit 81e941d

Please sign in to comment.