mirror of
https://github.com/react/react-native-devtools-frontend.git
synced 2026-10-11 14:14:36 +08:00
- Updates stylelint to 13.8.0 - Updates ESLint to 7.14.0 - Updates @typescript-eslint to 4.9.0 DISABLE_THIRD_PARTY_CHECK=NPM update R=jacktfranklin@chromium.org Change-Id: I207e204607ede782710e042c17d6510c7f696905 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2566806 Reviewed-by: Jack Franklin <jacktfranklin@chromium.org> Commit-Queue: Tim van der Lippe <tvanderlippe@chromium.org>
478 lines
10 KiB
JavaScript
478 lines
10 KiB
JavaScript
exports.tokenize = tokenizeHtml
|
||
exports.resolveTo = resolveToHtml
|
||
exports.concrete = true
|
||
|
||
var asciiAlpha = require('../character/ascii-alpha')
|
||
var asciiAlphanumeric = require('../character/ascii-alphanumeric')
|
||
|
||
var markdownLineEnding = require('../character/markdown-line-ending')
|
||
var markdownLineEndingOrSpace = require('../character/markdown-line-ending-or-space')
|
||
var markdownSpace = require('../character/markdown-space')
|
||
|
||
var fromCharCode = require('../constant/from-char-code')
|
||
var basics = require('../constant/html-block-names')
|
||
var raws = require('../constant/html-raw-names')
|
||
|
||
var blank = require('./partial-blank-line')
|
||
|
||
var nextBlank = {tokenize: tokenizeNextBlank, partial: true}
|
||
|
||
function resolveToHtml(events) {
|
||
var index = events.length
|
||
|
||
while (index--) {
|
||
if (events[index][0] === 'enter' && events[index][1].type === 'htmlFlow') {
|
||
break
|
||
}
|
||
}
|
||
|
||
if (index > 1 && events[index - 2][1].type === 'linePrefix') {
|
||
// Add the prefix start to the HTML token.
|
||
events[index][1].start = events[index - 2][1].start
|
||
// Add the prefix start to the HTML line token.
|
||
events[index + 1][1].start = events[index - 2][1].start
|
||
// Remove the line prefix.
|
||
events.splice(index - 2, 2)
|
||
}
|
||
|
||
return events
|
||
}
|
||
|
||
function tokenizeHtml(effects, ok, nok) {
|
||
var self = this
|
||
var kind
|
||
var startTag
|
||
var buffer
|
||
var index
|
||
var marker
|
||
|
||
return start
|
||
|
||
function start(code) {
|
||
effects.enter('htmlFlow')
|
||
effects.enter('htmlFlowData')
|
||
effects.consume(code)
|
||
return open
|
||
}
|
||
|
||
function open(code) {
|
||
if (code === 33) {
|
||
effects.consume(code)
|
||
return declarationStart
|
||
}
|
||
|
||
if (code === 47) {
|
||
effects.consume(code)
|
||
return tagCloseStart
|
||
}
|
||
|
||
if (code === 63) {
|
||
effects.consume(code)
|
||
kind = 3
|
||
// While we’re in an instruction instead of a declaration, we’re on a `?`
|
||
// right now, so we do need to search for `>`, similar to declarations.
|
||
return self.interrupt ? ok : continuationDeclarationInside
|
||
}
|
||
|
||
if (asciiAlpha(code)) {
|
||
effects.consume(code)
|
||
buffer = fromCharCode(code)
|
||
startTag = true
|
||
return tagName
|
||
}
|
||
|
||
return nok(code)
|
||
}
|
||
|
||
function declarationStart(code) {
|
||
if (code === 45) {
|
||
effects.consume(code)
|
||
kind = 2
|
||
return commentOpenInside
|
||
}
|
||
|
||
if (code === 91) {
|
||
effects.consume(code)
|
||
kind = 5
|
||
buffer = 'CDATA['
|
||
index = 0
|
||
return cdataOpenInside
|
||
}
|
||
|
||
if (asciiAlpha(code)) {
|
||
effects.consume(code)
|
||
kind = 4
|
||
return self.interrupt ? ok : continuationDeclarationInside
|
||
}
|
||
|
||
return nok(code)
|
||
}
|
||
|
||
function commentOpenInside(code) {
|
||
if (code === 45) {
|
||
effects.consume(code)
|
||
return self.interrupt ? ok : continuationDeclarationInside
|
||
}
|
||
|
||
return nok(code)
|
||
}
|
||
|
||
function cdataOpenInside(code) {
|
||
if (code === buffer.charCodeAt(index++)) {
|
||
effects.consume(code)
|
||
return index === buffer.length
|
||
? self.interrupt
|
||
? ok
|
||
: continuation
|
||
: cdataOpenInside
|
||
}
|
||
|
||
return nok(code)
|
||
}
|
||
|
||
function tagCloseStart(code) {
|
||
if (asciiAlpha(code)) {
|
||
effects.consume(code)
|
||
buffer = fromCharCode(code)
|
||
return tagName
|
||
}
|
||
|
||
return nok(code)
|
||
}
|
||
|
||
function tagName(code) {
|
||
if (
|
||
code === null ||
|
||
code === 47 ||
|
||
code === 62 ||
|
||
markdownLineEndingOrSpace(code)
|
||
) {
|
||
if (code !== 47 && startTag && raws.indexOf(buffer.toLowerCase()) > -1) {
|
||
kind = 1
|
||
return self.interrupt ? ok(code) : continuation(code)
|
||
}
|
||
|
||
if (basics.indexOf(buffer.toLowerCase()) > -1) {
|
||
kind = 6
|
||
|
||
if (code === 47) {
|
||
effects.consume(code)
|
||
return basicSelfClosing
|
||
}
|
||
|
||
return self.interrupt ? ok(code) : continuation(code)
|
||
}
|
||
|
||
kind = 7
|
||
// Do not support complete HTML when interrupting.
|
||
return self.interrupt
|
||
? nok(code)
|
||
: startTag
|
||
? completeAttributeNameBefore(code)
|
||
: completeClosingTagAfter(code)
|
||
}
|
||
|
||
if (code === 45 || asciiAlphanumeric(code)) {
|
||
effects.consume(code)
|
||
buffer += fromCharCode(code)
|
||
return tagName
|
||
}
|
||
|
||
return nok(code)
|
||
}
|
||
|
||
function basicSelfClosing(code) {
|
||
if (code === 62) {
|
||
effects.consume(code)
|
||
return self.interrupt ? ok : continuation
|
||
}
|
||
|
||
return nok(code)
|
||
}
|
||
|
||
function completeClosingTagAfter(code) {
|
||
if (markdownSpace(code)) {
|
||
effects.consume(code)
|
||
return completeClosingTagAfter
|
||
}
|
||
|
||
return completeEnd(code)
|
||
}
|
||
|
||
function completeAttributeNameBefore(code) {
|
||
if (code === 47) {
|
||
effects.consume(code)
|
||
return completeEnd
|
||
}
|
||
|
||
if (code === 58 || code === 95 || asciiAlpha(code)) {
|
||
effects.consume(code)
|
||
return completeAttributeName
|
||
}
|
||
|
||
if (markdownSpace(code)) {
|
||
effects.consume(code)
|
||
return completeAttributeNameBefore
|
||
}
|
||
|
||
return completeEnd(code)
|
||
}
|
||
|
||
function completeAttributeName(code) {
|
||
if (
|
||
code === 45 ||
|
||
code === 46 ||
|
||
code === 58 ||
|
||
code === 95 ||
|
||
asciiAlphanumeric(code)
|
||
) {
|
||
effects.consume(code)
|
||
return completeAttributeName
|
||
}
|
||
|
||
return completeAttributeNameAfter(code)
|
||
}
|
||
|
||
function completeAttributeNameAfter(code) {
|
||
if (code === 61) {
|
||
effects.consume(code)
|
||
return completeAttributeValueBefore
|
||
}
|
||
|
||
if (markdownSpace(code)) {
|
||
effects.consume(code)
|
||
return completeAttributeNameAfter
|
||
}
|
||
|
||
return completeAttributeNameBefore(code)
|
||
}
|
||
|
||
function completeAttributeValueBefore(code) {
|
||
if (
|
||
code === null ||
|
||
code === 60 ||
|
||
code === 61 ||
|
||
code === 62 ||
|
||
code === 96
|
||
) {
|
||
return nok(code)
|
||
}
|
||
|
||
if (code === 34 || code === 39) {
|
||
effects.consume(code)
|
||
marker = code
|
||
return completeAttributeValueQuoted
|
||
}
|
||
|
||
if (markdownSpace(code)) {
|
||
effects.consume(code)
|
||
return completeAttributeValueBefore
|
||
}
|
||
|
||
marker = undefined
|
||
return completeAttributeValueUnquoted(code)
|
||
}
|
||
|
||
function completeAttributeValueQuoted(code) {
|
||
if (code === marker) {
|
||
effects.consume(code)
|
||
return completeAttributeValueQuotedAfter
|
||
}
|
||
|
||
if (code === null || markdownLineEnding(code)) {
|
||
return nok(code)
|
||
}
|
||
|
||
effects.consume(code)
|
||
return completeAttributeValueQuoted
|
||
}
|
||
|
||
function completeAttributeValueUnquoted(code) {
|
||
if (
|
||
code === null ||
|
||
code === 34 ||
|
||
code === 39 ||
|
||
code === 60 ||
|
||
code === 61 ||
|
||
code === 62 ||
|
||
code === 96 ||
|
||
markdownLineEndingOrSpace(code)
|
||
) {
|
||
return completeAttributeNameAfter(code)
|
||
}
|
||
|
||
effects.consume(code)
|
||
return completeAttributeValueUnquoted
|
||
}
|
||
|
||
function completeAttributeValueQuotedAfter(code) {
|
||
if (code === 47 || code === 62 || markdownSpace(code)) {
|
||
return completeAttributeNameBefore(code)
|
||
}
|
||
|
||
return nok(code)
|
||
}
|
||
|
||
function completeEnd(code) {
|
||
if (code === 62) {
|
||
effects.consume(code)
|
||
return completeAfter
|
||
}
|
||
|
||
return nok(code)
|
||
}
|
||
|
||
function completeAfter(code) {
|
||
if (markdownSpace(code)) {
|
||
effects.consume(code)
|
||
return completeAfter
|
||
}
|
||
|
||
return code === null || markdownLineEnding(code)
|
||
? continuation(code)
|
||
: nok(code)
|
||
}
|
||
|
||
function continuation(code) {
|
||
if (code === 45 && kind === 2) {
|
||
effects.consume(code)
|
||
return continuationCommentInside
|
||
}
|
||
|
||
if (code === 60 && kind === 1) {
|
||
effects.consume(code)
|
||
return continuationRawTagOpen
|
||
}
|
||
|
||
if (code === 62 && kind === 4) {
|
||
effects.consume(code)
|
||
return continuationClose
|
||
}
|
||
|
||
if (code === 63 && kind === 3) {
|
||
effects.consume(code)
|
||
return continuationDeclarationInside
|
||
}
|
||
|
||
if (code === 93 && kind === 5) {
|
||
effects.consume(code)
|
||
return continuationCharacterDataInside
|
||
}
|
||
|
||
if (markdownLineEnding(code) && (kind === 6 || kind === 7)) {
|
||
return effects.check(
|
||
nextBlank,
|
||
continuationClose,
|
||
continuationAtLineEnding
|
||
)(code)
|
||
}
|
||
|
||
if (code === null || markdownLineEnding(code)) {
|
||
return continuationAtLineEnding(code)
|
||
}
|
||
|
||
effects.consume(code)
|
||
return continuation
|
||
}
|
||
|
||
function continuationAtLineEnding(code) {
|
||
effects.exit('htmlFlowData')
|
||
return htmlContinueStart(code)
|
||
}
|
||
|
||
function htmlContinueStart(code) {
|
||
if (code === null) {
|
||
return done(code)
|
||
}
|
||
|
||
if (markdownLineEnding(code)) {
|
||
effects.enter('lineEnding')
|
||
effects.consume(code)
|
||
effects.exit('lineEnding')
|
||
return htmlContinueStart
|
||
}
|
||
|
||
effects.enter('htmlFlowData')
|
||
return continuation(code)
|
||
}
|
||
|
||
function continuationCommentInside(code) {
|
||
if (code === 45) {
|
||
effects.consume(code)
|
||
return continuationDeclarationInside
|
||
}
|
||
|
||
return continuation(code)
|
||
}
|
||
|
||
function continuationRawTagOpen(code) {
|
||
if (code === 47) {
|
||
effects.consume(code)
|
||
buffer = ''
|
||
return continuationRawEndTag
|
||
}
|
||
|
||
return continuation(code)
|
||
}
|
||
|
||
function continuationRawEndTag(code) {
|
||
if (code === 62 && raws.indexOf(buffer.toLowerCase()) > -1) {
|
||
effects.consume(code)
|
||
return continuationClose
|
||
}
|
||
|
||
if (asciiAlpha(code) && buffer.length < 6) {
|
||
effects.consume(code)
|
||
buffer += fromCharCode(code)
|
||
return continuationRawEndTag
|
||
}
|
||
|
||
return continuation(code)
|
||
}
|
||
|
||
function continuationCharacterDataInside(code) {
|
||
if (code === 93) {
|
||
effects.consume(code)
|
||
return continuationDeclarationInside
|
||
}
|
||
|
||
return continuation(code)
|
||
}
|
||
|
||
function continuationDeclarationInside(code) {
|
||
if (code === 62) {
|
||
effects.consume(code)
|
||
return continuationClose
|
||
}
|
||
|
||
return continuation(code)
|
||
}
|
||
|
||
function continuationClose(code) {
|
||
if (code === null || markdownLineEnding(code)) {
|
||
effects.exit('htmlFlowData')
|
||
return done(code)
|
||
}
|
||
|
||
effects.consume(code)
|
||
return continuationClose
|
||
}
|
||
|
||
function done(code) {
|
||
effects.exit('htmlFlow')
|
||
return ok(code)
|
||
}
|
||
}
|
||
|
||
function tokenizeNextBlank(effects, ok, nok) {
|
||
return start
|
||
|
||
function start(code) {
|
||
effects.exit('htmlFlowData')
|
||
effects.enter('lineEndingBlank')
|
||
effects.consume(code)
|
||
effects.exit('lineEndingBlank')
|
||
return effects.attempt(blank, ok, nok)
|
||
}
|
||
}
|