Best JavaScript code snippet using playwright-internal
index.js
Source:index.js  
...335            type: type,336            chars: ch337        };338    }339    _createEOFToken() {340        this.currentToken = { type: Tokenizer.EOF_TOKEN };341    }342    //Tag attributes343    _createAttr(attrNameFirstCh) {344        this.currentAttr = {345            name: attrNameFirstCh,346            value: ''347        };348    }349    _leaveAttrName(toState) {350        if (Tokenizer.getTokenAttr(this.currentToken, this.currentAttr.name) === null) {351            this.currentToken.attrs.push(this.currentAttr);352        } else {353            this._err(ERR.duplicateAttribute);354        }355        this.state = toState;356    }357    _leaveAttrValue(toState) {358        this.state = toState;359    }360    //Token emission361    _emitCurrentToken() {362        this._emitCurrentCharacterToken();363        const ct = this.currentToken;364        this.currentToken = null;365        //NOTE: store emited start tag's tagName to determine is the following end tag token is appropriate.366        if (ct.type === Tokenizer.START_TAG_TOKEN) {367            this.lastStartTagName = ct.tagName;368        } else if (ct.type === Tokenizer.END_TAG_TOKEN) {369            if (ct.attrs.length > 0) {370                this._err(ERR.endTagWithAttributes);371            }372            if (ct.selfClosing) {373                this._err(ERR.endTagWithTrailingSolidus);374            }375        }376        this.tokenQueue.push(ct);377    }378    _emitCurrentCharacterToken() {379        if (this.currentCharacterToken) {380            this.tokenQueue.push(this.currentCharacterToken);381            this.currentCharacterToken = null;382        }383    }384    _emitEOFToken() {385        this._createEOFToken();386        this._emitCurrentToken();387    }388    //Characters emission389    //OPTIMIZATION: specification uses only one type of character tokens (one token per character).390    //This causes a huge memory overhead and a lot of unnecessary parser loops. parse5 uses 3 groups of characters.391    //If we have a sequence of characters that belong to the same group, parser can process it392    //as a single solid character token.393    //So, there are 3 types of character tokens in parse5:394    //1)NULL_CHARACTER_TOKEN - \u0000-character sequences (e.g. '\u0000\u0000\u0000')395    //2)WHITESPACE_CHARACTER_TOKEN - any whitespace/new-line character sequences (e.g. '\n  \r\t   \f')396    //3)CHARACTER_TOKEN - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^')397    _appendCharToCurrentCharacterToken(type, ch) {398        if (this.currentCharacterToken && this.currentCharacterToken.type !== type) {399            this._emitCurrentCharacterToken();400        }401        if (this.currentCharacterToken) {402            this.currentCharacterToken.chars += ch;403        } else {404            this._createCharacterToken(type, ch);405        }406    }407    _emitCodePoint(cp) {408        let type = Tokenizer.CHARACTER_TOKEN;409        if (isWhitespace(cp)) {410            type = Tokenizer.WHITESPACE_CHARACTER_TOKEN;411        } else if (cp === $.NULL) {412            type = Tokenizer.NULL_CHARACTER_TOKEN;413        }414        this._appendCharToCurrentCharacterToken(type, toChar(cp));415    }416    _emitSeveralCodePoints(codePoints) {417        for (let i = 0; i < codePoints.length; i++) {418            this._emitCodePoint(codePoints[i]);419        }420    }421    //NOTE: used then we emit character explicitly. This is always a non-whitespace and a non-null character.422    //So we can avoid additional checks here.423    _emitChars(ch) {424        this._appendCharToCurrentCharacterToken(Tokenizer.CHARACTER_TOKEN, ch);425    }426    // Character reference helpers427    _matchNamedCharacterReference(startCp) {428        let result = null;429        let excess = 1;430        let i = findNamedEntityTreeBranch(0, startCp);431        this.tempBuff.push(startCp);432        while (i > -1) {433            const current = neTree[i];434            const inNode = current < MAX_BRANCH_MARKER_VALUE;435            const nodeWithData = inNode && current & HAS_DATA_FLAG;436            if (nodeWithData) {437                //NOTE: we use greedy search, so we continue lookup at this point438                result = current & DATA_DUPLET_FLAG ? [neTree[++i], neTree[++i]] : [neTree[++i]];439                excess = 0;440            }441            const cp = this._consume();442            this.tempBuff.push(cp);443            excess++;444            if (cp === $.EOF) {445                break;446            }447            if (inNode) {448                i = current & HAS_BRANCHES_FLAG ? findNamedEntityTreeBranch(i, cp) : -1;449            } else {450                i = cp === current ? ++i : -1;451            }452        }453        while (excess--) {454            this.tempBuff.pop();455            this._unconsume();456        }457        return result;458    }459    _isCharacterReferenceInAttribute() {460        return (461            this.returnState === ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE ||462            this.returnState === ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE ||463            this.returnState === ATTRIBUTE_VALUE_UNQUOTED_STATE464        );465    }466    _isCharacterReferenceAttributeQuirk(withSemicolon) {467        if (!withSemicolon && this._isCharacterReferenceInAttribute()) {468            const nextCp = this._consume();469            this._unconsume();470            return nextCp === $.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp);471        }472        return false;473    }474    _flushCodePointsConsumedAsCharacterReference() {475        if (this._isCharacterReferenceInAttribute()) {476            for (let i = 0; i < this.tempBuff.length; i++) {477                this.currentAttr.value += toChar(this.tempBuff[i]);478            }479        } else {480            this._emitSeveralCodePoints(this.tempBuff);481        }482        this.tempBuff = [];483    }484    // State machine485    // Data state486    //------------------------------------------------------------------487    [DATA_STATE](cp) {488        this.preprocessor.dropParsedChunk();489        if (cp === $.LESS_THAN_SIGN) {490            this.state = TAG_OPEN_STATE;491        } else if (cp === $.AMPERSAND) {492            this.returnState = DATA_STATE;493            this.state = CHARACTER_REFERENCE_STATE;494        } else if (cp === $.NULL) {495            this._err(ERR.unexpectedNullCharacter);496            this._emitCodePoint(cp);497        } else if (cp === $.EOF) {498            this._emitEOFToken();499        } else {500            this._emitCodePoint(cp);501        }502    }503    //  RCDATA state504    //------------------------------------------------------------------505    [RCDATA_STATE](cp) {506        this.preprocessor.dropParsedChunk();507        if (cp === $.AMPERSAND) {508            this.returnState = RCDATA_STATE;509            this.state = CHARACTER_REFERENCE_STATE;510        } else if (cp === $.LESS_THAN_SIGN) {511            this.state = RCDATA_LESS_THAN_SIGN_STATE;512        } else if (cp === $.NULL) {513            this._err(ERR.unexpectedNullCharacter);514            this._emitChars(unicode.REPLACEMENT_CHARACTER);515        } else if (cp === $.EOF) {516            this._emitEOFToken();517        } else {518            this._emitCodePoint(cp);519        }520    }521    // RAWTEXT state522    //------------------------------------------------------------------523    [RAWTEXT_STATE](cp) {524        this.preprocessor.dropParsedChunk();525        if (cp === $.LESS_THAN_SIGN) {526            this.state = RAWTEXT_LESS_THAN_SIGN_STATE;527        } else if (cp === $.NULL) {528            this._err(ERR.unexpectedNullCharacter);529            this._emitChars(unicode.REPLACEMENT_CHARACTER);530        } else if (cp === $.EOF) {531            this._emitEOFToken();532        } else {533            this._emitCodePoint(cp);534        }535    }536    // Script data state537    //------------------------------------------------------------------538    [SCRIPT_DATA_STATE](cp) {539        this.preprocessor.dropParsedChunk();540        if (cp === $.LESS_THAN_SIGN) {541            this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE;542        } else if (cp === $.NULL) {543            this._err(ERR.unexpectedNullCharacter);544            this._emitChars(unicode.REPLACEMENT_CHARACTER);545        } else if (cp === $.EOF) {546            this._emitEOFToken();547        } else {548            this._emitCodePoint(cp);549        }550    }551    // PLAINTEXT state552    //------------------------------------------------------------------553    [PLAINTEXT_STATE](cp) {554        this.preprocessor.dropParsedChunk();555        if (cp === $.NULL) {556            this._err(ERR.unexpectedNullCharacter);557            this._emitChars(unicode.REPLACEMENT_CHARACTER);558        } else if (cp === $.EOF) {559            this._emitEOFToken();560        } else {561            this._emitCodePoint(cp);562        }563    }564    // Tag open state565    //------------------------------------------------------------------566    [TAG_OPEN_STATE](cp) {567        if (cp === $.EXCLAMATION_MARK) {568            this.state = MARKUP_DECLARATION_OPEN_STATE;569        } else if (cp === $.SOLIDUS) {570            this.state = END_TAG_OPEN_STATE;571        } else if (isAsciiLetter(cp)) {572            this._createStartTagToken();573            this._reconsumeInState(TAG_NAME_STATE);574        } else if (cp === $.QUESTION_MARK) {575            this._err(ERR.unexpectedQuestionMarkInsteadOfTagName);576            this._createCommentToken();577            this._reconsumeInState(BOGUS_COMMENT_STATE);578        } else if (cp === $.EOF) {579            this._err(ERR.eofBeforeTagName);580            this._emitChars('<');581            this._emitEOFToken();582        } else {583            this._err(ERR.invalidFirstCharacterOfTagName);584            this._emitChars('<');585            this._reconsumeInState(DATA_STATE);586        }587    }588    // End tag open state589    //------------------------------------------------------------------590    [END_TAG_OPEN_STATE](cp) {591        if (isAsciiLetter(cp)) {592            this._createEndTagToken();593            this._reconsumeInState(TAG_NAME_STATE);594        } else if (cp === $.GREATER_THAN_SIGN) {595            this._err(ERR.missingEndTagName);596            this.state = DATA_STATE;597        } else if (cp === $.EOF) {598            this._err(ERR.eofBeforeTagName);599            this._emitChars('</');600            this._emitEOFToken();601        } else {602            this._err(ERR.invalidFirstCharacterOfTagName);603            this._createCommentToken();604            this._reconsumeInState(BOGUS_COMMENT_STATE);605        }606    }607    // Tag name state608    //------------------------------------------------------------------609    [TAG_NAME_STATE](cp) {610        if (isWhitespace(cp)) {611            this.state = BEFORE_ATTRIBUTE_NAME_STATE;612        } else if (cp === $.SOLIDUS) {613            this.state = SELF_CLOSING_START_TAG_STATE;614        } else if (cp === $.GREATER_THAN_SIGN) {615            this.state = DATA_STATE;616            this._emitCurrentToken();617        } else if (isAsciiUpper(cp)) {618            this.currentToken.tagName += toAsciiLowerChar(cp);619        } else if (cp === $.NULL) {620            this._err(ERR.unexpectedNullCharacter);621            this.currentToken.tagName += unicode.REPLACEMENT_CHARACTER;622        } else if (cp === $.EOF) {623            this._err(ERR.eofInTag);624            this._emitEOFToken();625        } else {626            this.currentToken.tagName += toChar(cp);627        }628    }629    // RCDATA less-than sign state630    //------------------------------------------------------------------631    [RCDATA_LESS_THAN_SIGN_STATE](cp) {632        if (cp === $.SOLIDUS) {633            this.tempBuff = [];634            this.state = RCDATA_END_TAG_OPEN_STATE;635        } else {636            this._emitChars('<');637            this._reconsumeInState(RCDATA_STATE);638        }639    }640    // RCDATA end tag open state641    //------------------------------------------------------------------642    [RCDATA_END_TAG_OPEN_STATE](cp) {643        if (isAsciiLetter(cp)) {644            this._createEndTagToken();645            this._reconsumeInState(RCDATA_END_TAG_NAME_STATE);646        } else {647            this._emitChars('</');648            this._reconsumeInState(RCDATA_STATE);649        }650    }651    // RCDATA end tag name state652    //------------------------------------------------------------------653    [RCDATA_END_TAG_NAME_STATE](cp) {654        if (isAsciiUpper(cp)) {655            this.currentToken.tagName += toAsciiLowerChar(cp);656            this.tempBuff.push(cp);657        } else if (isAsciiLower(cp)) {658            this.currentToken.tagName += toChar(cp);659            this.tempBuff.push(cp);660        } else {661            if (this.lastStartTagName === this.currentToken.tagName) {662                if (isWhitespace(cp)) {663                    this.state = BEFORE_ATTRIBUTE_NAME_STATE;664                    return;665                }666                if (cp === $.SOLIDUS) {667                    this.state = SELF_CLOSING_START_TAG_STATE;668                    return;669                }670                if (cp === $.GREATER_THAN_SIGN) {671                    this.state = DATA_STATE;672                    this._emitCurrentToken();673                    return;674                }675            }676            this._emitChars('</');677            this._emitSeveralCodePoints(this.tempBuff);678            this._reconsumeInState(RCDATA_STATE);679        }680    }681    // RAWTEXT less-than sign state682    //------------------------------------------------------------------683    [RAWTEXT_LESS_THAN_SIGN_STATE](cp) {684        if (cp === $.SOLIDUS) {685            this.tempBuff = [];686            this.state = RAWTEXT_END_TAG_OPEN_STATE;687        } else {688            this._emitChars('<');689            this._reconsumeInState(RAWTEXT_STATE);690        }691    }692    // RAWTEXT end tag open state693    //------------------------------------------------------------------694    [RAWTEXT_END_TAG_OPEN_STATE](cp) {695        if (isAsciiLetter(cp)) {696            this._createEndTagToken();697            this._reconsumeInState(RAWTEXT_END_TAG_NAME_STATE);698        } else {699            this._emitChars('</');700            this._reconsumeInState(RAWTEXT_STATE);701        }702    }703    // RAWTEXT end tag name state704    //------------------------------------------------------------------705    [RAWTEXT_END_TAG_NAME_STATE](cp) {706        if (isAsciiUpper(cp)) {707            this.currentToken.tagName += toAsciiLowerChar(cp);708            this.tempBuff.push(cp);709        } else if (isAsciiLower(cp)) {710            this.currentToken.tagName += toChar(cp);711            this.tempBuff.push(cp);712        } else {713            if (this.lastStartTagName === this.currentToken.tagName) {714                if (isWhitespace(cp)) {715                    this.state = BEFORE_ATTRIBUTE_NAME_STATE;716                    return;717                }718                if (cp === $.SOLIDUS) {719                    this.state = SELF_CLOSING_START_TAG_STATE;720                    return;721                }722                if (cp === $.GREATER_THAN_SIGN) {723                    this._emitCurrentToken();724                    this.state = DATA_STATE;725                    return;726                }727            }728            this._emitChars('</');729            this._emitSeveralCodePoints(this.tempBuff);730            this._reconsumeInState(RAWTEXT_STATE);731        }732    }733    // Script data less-than sign state734    //------------------------------------------------------------------735    [SCRIPT_DATA_LESS_THAN_SIGN_STATE](cp) {736        if (cp === $.SOLIDUS) {737            this.tempBuff = [];738            this.state = SCRIPT_DATA_END_TAG_OPEN_STATE;739        } else if (cp === $.EXCLAMATION_MARK) {740            this.state = SCRIPT_DATA_ESCAPE_START_STATE;741            this._emitChars('<!');742        } else {743            this._emitChars('<');744            this._reconsumeInState(SCRIPT_DATA_STATE);745        }746    }747    // Script data end tag open state748    //------------------------------------------------------------------749    [SCRIPT_DATA_END_TAG_OPEN_STATE](cp) {750        if (isAsciiLetter(cp)) {751            this._createEndTagToken();752            this._reconsumeInState(SCRIPT_DATA_END_TAG_NAME_STATE);753        } else {754            this._emitChars('</');755            this._reconsumeInState(SCRIPT_DATA_STATE);756        }757    }758    // Script data end tag name state759    //------------------------------------------------------------------760    [SCRIPT_DATA_END_TAG_NAME_STATE](cp) {761        if (isAsciiUpper(cp)) {762            this.currentToken.tagName += toAsciiLowerChar(cp);763            this.tempBuff.push(cp);764        } else if (isAsciiLower(cp)) {765            this.currentToken.tagName += toChar(cp);766            this.tempBuff.push(cp);767        } else {768            if (this.lastStartTagName === this.currentToken.tagName) {769                if (isWhitespace(cp)) {770                    this.state = BEFORE_ATTRIBUTE_NAME_STATE;771                    return;772                } else if (cp === $.SOLIDUS) {773                    this.state = SELF_CLOSING_START_TAG_STATE;774                    return;775                } else if (cp === $.GREATER_THAN_SIGN) {776                    this._emitCurrentToken();777                    this.state = DATA_STATE;778                    return;779                }780            }781            this._emitChars('</');782            this._emitSeveralCodePoints(this.tempBuff);783            this._reconsumeInState(SCRIPT_DATA_STATE);784        }785    }786    // Script data escape start state787    //------------------------------------------------------------------788    [SCRIPT_DATA_ESCAPE_START_STATE](cp) {789        if (cp === $.HYPHEN_MINUS) {790            this.state = SCRIPT_DATA_ESCAPE_START_DASH_STATE;791            this._emitChars('-');792        } else {793            this._reconsumeInState(SCRIPT_DATA_STATE);794        }795    }796    // Script data escape start dash state797    //------------------------------------------------------------------798    [SCRIPT_DATA_ESCAPE_START_DASH_STATE](cp) {799        if (cp === $.HYPHEN_MINUS) {800            this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;801            this._emitChars('-');802        } else {803            this._reconsumeInState(SCRIPT_DATA_STATE);804        }805    }806    // Script data escaped state807    //------------------------------------------------------------------808    [SCRIPT_DATA_ESCAPED_STATE](cp) {809        if (cp === $.HYPHEN_MINUS) {810            this.state = SCRIPT_DATA_ESCAPED_DASH_STATE;811            this._emitChars('-');812        } else if (cp === $.LESS_THAN_SIGN) {813            this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;814        } else if (cp === $.NULL) {815            this._err(ERR.unexpectedNullCharacter);816            this._emitChars(unicode.REPLACEMENT_CHARACTER);817        } else if (cp === $.EOF) {818            this._err(ERR.eofInScriptHtmlCommentLikeText);819            this._emitEOFToken();820        } else {821            this._emitCodePoint(cp);822        }823    }824    // Script data escaped dash state825    //------------------------------------------------------------------826    [SCRIPT_DATA_ESCAPED_DASH_STATE](cp) {827        if (cp === $.HYPHEN_MINUS) {828            this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;829            this._emitChars('-');830        } else if (cp === $.LESS_THAN_SIGN) {831            this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;832        } else if (cp === $.NULL) {833            this._err(ERR.unexpectedNullCharacter);834            this.state = SCRIPT_DATA_ESCAPED_STATE;835            this._emitChars(unicode.REPLACEMENT_CHARACTER);836        } else if (cp === $.EOF) {837            this._err(ERR.eofInScriptHtmlCommentLikeText);838            this._emitEOFToken();839        } else {840            this.state = SCRIPT_DATA_ESCAPED_STATE;841            this._emitCodePoint(cp);842        }843    }844    // Script data escaped dash dash state845    //------------------------------------------------------------------846    [SCRIPT_DATA_ESCAPED_DASH_DASH_STATE](cp) {847        if (cp === $.HYPHEN_MINUS) {848            this._emitChars('-');849        } else if (cp === $.LESS_THAN_SIGN) {850            this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;851        } else if (cp === $.GREATER_THAN_SIGN) {852            this.state = SCRIPT_DATA_STATE;853            this._emitChars('>');854        } else if (cp === $.NULL) {855            this._err(ERR.unexpectedNullCharacter);856            this.state = SCRIPT_DATA_ESCAPED_STATE;857            this._emitChars(unicode.REPLACEMENT_CHARACTER);858        } else if (cp === $.EOF) {859            this._err(ERR.eofInScriptHtmlCommentLikeText);860            this._emitEOFToken();861        } else {862            this.state = SCRIPT_DATA_ESCAPED_STATE;863            this._emitCodePoint(cp);864        }865    }866    // Script data escaped less-than sign state867    //------------------------------------------------------------------868    [SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE](cp) {869        if (cp === $.SOLIDUS) {870            this.tempBuff = [];871            this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE;872        } else if (isAsciiLetter(cp)) {873            this.tempBuff = [];874            this._emitChars('<');875            this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE);876        } else {877            this._emitChars('<');878            this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);879        }880    }881    // Script data escaped end tag open state882    //------------------------------------------------------------------883    [SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE](cp) {884        if (isAsciiLetter(cp)) {885            this._createEndTagToken();886            this._reconsumeInState(SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE);887        } else {888            this._emitChars('</');889            this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);890        }891    }892    // Script data escaped end tag name state893    //------------------------------------------------------------------894    [SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE](cp) {895        if (isAsciiUpper(cp)) {896            this.currentToken.tagName += toAsciiLowerChar(cp);897            this.tempBuff.push(cp);898        } else if (isAsciiLower(cp)) {899            this.currentToken.tagName += toChar(cp);900            this.tempBuff.push(cp);901        } else {902            if (this.lastStartTagName === this.currentToken.tagName) {903                if (isWhitespace(cp)) {904                    this.state = BEFORE_ATTRIBUTE_NAME_STATE;905                    return;906                }907                if (cp === $.SOLIDUS) {908                    this.state = SELF_CLOSING_START_TAG_STATE;909                    return;910                }911                if (cp === $.GREATER_THAN_SIGN) {912                    this._emitCurrentToken();913                    this.state = DATA_STATE;914                    return;915                }916            }917            this._emitChars('</');918            this._emitSeveralCodePoints(this.tempBuff);919            this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);920        }921    }922    // Script data double escape start state923    //------------------------------------------------------------------924    [SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE](cp) {925        if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) {926            this.state = this._isTempBufferEqualToScriptString()927                ? SCRIPT_DATA_DOUBLE_ESCAPED_STATE928                : SCRIPT_DATA_ESCAPED_STATE;929            this._emitCodePoint(cp);930        } else if (isAsciiUpper(cp)) {931            this.tempBuff.push(toAsciiLowerCodePoint(cp));932            this._emitCodePoint(cp);933        } else if (isAsciiLower(cp)) {934            this.tempBuff.push(cp);935            this._emitCodePoint(cp);936        } else {937            this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);938        }939    }940    // Script data double escaped state941    //------------------------------------------------------------------942    [SCRIPT_DATA_DOUBLE_ESCAPED_STATE](cp) {943        if (cp === $.HYPHEN_MINUS) {944            this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE;945            this._emitChars('-');946        } else if (cp === $.LESS_THAN_SIGN) {947            this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;948            this._emitChars('<');949        } else if (cp === $.NULL) {950            this._err(ERR.unexpectedNullCharacter);951            this._emitChars(unicode.REPLACEMENT_CHARACTER);952        } else if (cp === $.EOF) {953            this._err(ERR.eofInScriptHtmlCommentLikeText);954            this._emitEOFToken();955        } else {956            this._emitCodePoint(cp);957        }958    }959    // Script data double escaped dash state960    //------------------------------------------------------------------961    [SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE](cp) {962        if (cp === $.HYPHEN_MINUS) {963            this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE;964            this._emitChars('-');965        } else if (cp === $.LESS_THAN_SIGN) {966            this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;967            this._emitChars('<');968        } else if (cp === $.NULL) {969            this._err(ERR.unexpectedNullCharacter);970            this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;971            this._emitChars(unicode.REPLACEMENT_CHARACTER);972        } else if (cp === $.EOF) {973            this._err(ERR.eofInScriptHtmlCommentLikeText);974            this._emitEOFToken();975        } else {976            this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;977            this._emitCodePoint(cp);978        }979    }980    // Script data double escaped dash dash state981    //------------------------------------------------------------------982    [SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE](cp) {983        if (cp === $.HYPHEN_MINUS) {984            this._emitChars('-');985        } else if (cp === $.LESS_THAN_SIGN) {986            this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;987            this._emitChars('<');988        } else if (cp === $.GREATER_THAN_SIGN) {989            this.state = SCRIPT_DATA_STATE;990            this._emitChars('>');991        } else if (cp === $.NULL) {992            this._err(ERR.unexpectedNullCharacter);993            this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;994            this._emitChars(unicode.REPLACEMENT_CHARACTER);995        } else if (cp === $.EOF) {996            this._err(ERR.eofInScriptHtmlCommentLikeText);997            this._emitEOFToken();998        } else {999            this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;1000            this._emitCodePoint(cp);1001        }1002    }1003    // Script data double escaped less-than sign state1004    //------------------------------------------------------------------1005    [SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE](cp) {1006        if (cp === $.SOLIDUS) {1007            this.tempBuff = [];1008            this.state = SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE;1009            this._emitChars('/');1010        } else {1011            this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);1012        }1013    }1014    // Script data double escape end state1015    //------------------------------------------------------------------1016    [SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE](cp) {1017        if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) {1018            this.state = this._isTempBufferEqualToScriptString()1019                ? SCRIPT_DATA_ESCAPED_STATE1020                : SCRIPT_DATA_DOUBLE_ESCAPED_STATE;1021            this._emitCodePoint(cp);1022        } else if (isAsciiUpper(cp)) {1023            this.tempBuff.push(toAsciiLowerCodePoint(cp));1024            this._emitCodePoint(cp);1025        } else if (isAsciiLower(cp)) {1026            this.tempBuff.push(cp);1027            this._emitCodePoint(cp);1028        } else {1029            this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);1030        }1031    }1032    // Before attribute name state1033    //------------------------------------------------------------------1034    [BEFORE_ATTRIBUTE_NAME_STATE](cp) {1035        if (isWhitespace(cp)) {1036            return;1037        }1038        if (cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN || cp === $.EOF) {1039            this._reconsumeInState(AFTER_ATTRIBUTE_NAME_STATE);1040        } else if (cp === $.EQUALS_SIGN) {1041            this._err(ERR.unexpectedEqualsSignBeforeAttributeName);1042            this._createAttr('=');1043            this.state = ATTRIBUTE_NAME_STATE;1044        } else {1045            this._createAttr('');1046            this._reconsumeInState(ATTRIBUTE_NAME_STATE);1047        }1048    }1049    // Attribute name state1050    //------------------------------------------------------------------1051    [ATTRIBUTE_NAME_STATE](cp) {1052        if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN || cp === $.EOF) {1053            this._leaveAttrName(AFTER_ATTRIBUTE_NAME_STATE);1054            this._unconsume();1055        } else if (cp === $.EQUALS_SIGN) {1056            this._leaveAttrName(BEFORE_ATTRIBUTE_VALUE_STATE);1057        } else if (isAsciiUpper(cp)) {1058            this.currentAttr.name += toAsciiLowerChar(cp);1059        } else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) {1060            this._err(ERR.unexpectedCharacterInAttributeName);1061            this.currentAttr.name += toChar(cp);1062        } else if (cp === $.NULL) {1063            this._err(ERR.unexpectedNullCharacter);1064            this.currentAttr.name += unicode.REPLACEMENT_CHARACTER;1065        } else {1066            this.currentAttr.name += toChar(cp);1067        }1068    }1069    // After attribute name state1070    //------------------------------------------------------------------1071    [AFTER_ATTRIBUTE_NAME_STATE](cp) {1072        if (isWhitespace(cp)) {1073            return;1074        }1075        if (cp === $.SOLIDUS) {1076            this.state = SELF_CLOSING_START_TAG_STATE;1077        } else if (cp === $.EQUALS_SIGN) {1078            this.state = BEFORE_ATTRIBUTE_VALUE_STATE;1079        } else if (cp === $.GREATER_THAN_SIGN) {1080            this.state = DATA_STATE;1081            this._emitCurrentToken();1082        } else if (cp === $.EOF) {1083            this._err(ERR.eofInTag);1084            this._emitEOFToken();1085        } else {1086            this._createAttr('');1087            this._reconsumeInState(ATTRIBUTE_NAME_STATE);1088        }1089    }1090    // Before attribute value state1091    //------------------------------------------------------------------1092    [BEFORE_ATTRIBUTE_VALUE_STATE](cp) {1093        if (isWhitespace(cp)) {1094            return;1095        }1096        if (cp === $.QUOTATION_MARK) {1097            this.state = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE;1098        } else if (cp === $.APOSTROPHE) {1099            this.state = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE;1100        } else if (cp === $.GREATER_THAN_SIGN) {1101            this._err(ERR.missingAttributeValue);1102            this.state = DATA_STATE;1103            this._emitCurrentToken();1104        } else {1105            this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE);1106        }1107    }1108    // Attribute value (double-quoted) state1109    //------------------------------------------------------------------1110    [ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE](cp) {1111        if (cp === $.QUOTATION_MARK) {1112            this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;1113        } else if (cp === $.AMPERSAND) {1114            this.returnState = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE;1115            this.state = CHARACTER_REFERENCE_STATE;1116        } else if (cp === $.NULL) {1117            this._err(ERR.unexpectedNullCharacter);1118            this.currentAttr.value += unicode.REPLACEMENT_CHARACTER;1119        } else if (cp === $.EOF) {1120            this._err(ERR.eofInTag);1121            this._emitEOFToken();1122        } else {1123            this.currentAttr.value += toChar(cp);1124        }1125    }1126    // Attribute value (single-quoted) state1127    //------------------------------------------------------------------1128    [ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE](cp) {1129        if (cp === $.APOSTROPHE) {1130            this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;1131        } else if (cp === $.AMPERSAND) {1132            this.returnState = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE;1133            this.state = CHARACTER_REFERENCE_STATE;1134        } else if (cp === $.NULL) {1135            this._err(ERR.unexpectedNullCharacter);1136            this.currentAttr.value += unicode.REPLACEMENT_CHARACTER;1137        } else if (cp === $.EOF) {1138            this._err(ERR.eofInTag);1139            this._emitEOFToken();1140        } else {1141            this.currentAttr.value += toChar(cp);1142        }1143    }1144    // Attribute value (unquoted) state1145    //------------------------------------------------------------------1146    [ATTRIBUTE_VALUE_UNQUOTED_STATE](cp) {1147        if (isWhitespace(cp)) {1148            this._leaveAttrValue(BEFORE_ATTRIBUTE_NAME_STATE);1149        } else if (cp === $.AMPERSAND) {1150            this.returnState = ATTRIBUTE_VALUE_UNQUOTED_STATE;1151            this.state = CHARACTER_REFERENCE_STATE;1152        } else if (cp === $.GREATER_THAN_SIGN) {1153            this._leaveAttrValue(DATA_STATE);1154            this._emitCurrentToken();1155        } else if (cp === $.NULL) {1156            this._err(ERR.unexpectedNullCharacter);1157            this.currentAttr.value += unicode.REPLACEMENT_CHARACTER;1158        } else if (1159            cp === $.QUOTATION_MARK ||1160            cp === $.APOSTROPHE ||1161            cp === $.LESS_THAN_SIGN ||1162            cp === $.EQUALS_SIGN ||1163            cp === $.GRAVE_ACCENT1164        ) {1165            this._err(ERR.unexpectedCharacterInUnquotedAttributeValue);1166            this.currentAttr.value += toChar(cp);1167        } else if (cp === $.EOF) {1168            this._err(ERR.eofInTag);1169            this._emitEOFToken();1170        } else {1171            this.currentAttr.value += toChar(cp);1172        }1173    }1174    // After attribute value (quoted) state1175    //------------------------------------------------------------------1176    [AFTER_ATTRIBUTE_VALUE_QUOTED_STATE](cp) {1177        if (isWhitespace(cp)) {1178            this._leaveAttrValue(BEFORE_ATTRIBUTE_NAME_STATE);1179        } else if (cp === $.SOLIDUS) {1180            this._leaveAttrValue(SELF_CLOSING_START_TAG_STATE);1181        } else if (cp === $.GREATER_THAN_SIGN) {1182            this._leaveAttrValue(DATA_STATE);1183            this._emitCurrentToken();1184        } else if (cp === $.EOF) {1185            this._err(ERR.eofInTag);1186            this._emitEOFToken();1187        } else {1188            this._err(ERR.missingWhitespaceBetweenAttributes);1189            this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);1190        }1191    }1192    // Self-closing start tag state1193    //------------------------------------------------------------------1194    [SELF_CLOSING_START_TAG_STATE](cp) {1195        if (cp === $.GREATER_THAN_SIGN) {1196            this.currentToken.selfClosing = true;1197            this.state = DATA_STATE;1198            this._emitCurrentToken();1199        } else if (cp === $.EOF) {1200            this._err(ERR.eofInTag);1201            this._emitEOFToken();1202        } else {1203            this._err(ERR.unexpectedSolidusInTag);1204            this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);1205        }1206    }1207    // Bogus comment state1208    //------------------------------------------------------------------1209    [BOGUS_COMMENT_STATE](cp) {1210        if (cp === $.GREATER_THAN_SIGN) {1211            this.state = DATA_STATE;1212            this._emitCurrentToken();1213        } else if (cp === $.EOF) {1214            this._emitCurrentToken();1215            this._emitEOFToken();1216        } else if (cp === $.NULL) {1217            this._err(ERR.unexpectedNullCharacter);1218            this.currentToken.data += unicode.REPLACEMENT_CHARACTER;1219        } else {1220            this.currentToken.data += toChar(cp);1221        }1222    }1223    // Markup declaration open state1224    //------------------------------------------------------------------1225    [MARKUP_DECLARATION_OPEN_STATE](cp) {1226        if (this._consumeSequenceIfMatch($$.DASH_DASH_STRING, cp, true)) {1227            this._createCommentToken();1228            this.state = COMMENT_START_STATE;1229        } else if (this._consumeSequenceIfMatch($$.DOCTYPE_STRING, cp, false)) {1230            this.state = DOCTYPE_STATE;1231        } else if (this._consumeSequenceIfMatch($$.CDATA_START_STRING, cp, true)) {1232            if (this.allowCDATA) {1233                this.state = CDATA_SECTION_STATE;1234            } else {1235                this._err(ERR.cdataInHtmlContent);1236                this._createCommentToken();1237                this.currentToken.data = '[CDATA[';1238                this.state = BOGUS_COMMENT_STATE;1239            }1240        }1241        //NOTE: sequence lookup can be abrupted by hibernation. In that case lookup1242        //results are no longer valid and we will need to start over.1243        else if (!this._ensureHibernation()) {1244            this._err(ERR.incorrectlyOpenedComment);1245            this._createCommentToken();1246            this._reconsumeInState(BOGUS_COMMENT_STATE);1247        }1248    }1249    // Comment start state1250    //------------------------------------------------------------------1251    [COMMENT_START_STATE](cp) {1252        if (cp === $.HYPHEN_MINUS) {1253            this.state = COMMENT_START_DASH_STATE;1254        } else if (cp === $.GREATER_THAN_SIGN) {1255            this._err(ERR.abruptClosingOfEmptyComment);1256            this.state = DATA_STATE;1257            this._emitCurrentToken();1258        } else {1259            this._reconsumeInState(COMMENT_STATE);1260        }1261    }1262    // Comment start dash state1263    //------------------------------------------------------------------1264    [COMMENT_START_DASH_STATE](cp) {1265        if (cp === $.HYPHEN_MINUS) {1266            this.state = COMMENT_END_STATE;1267        } else if (cp === $.GREATER_THAN_SIGN) {1268            this._err(ERR.abruptClosingOfEmptyComment);1269            this.state = DATA_STATE;1270            this._emitCurrentToken();1271        } else if (cp === $.EOF) {1272            this._err(ERR.eofInComment);1273            this._emitCurrentToken();1274            this._emitEOFToken();1275        } else {1276            this.currentToken.data += '-';1277            this._reconsumeInState(COMMENT_STATE);1278        }1279    }1280    // Comment state1281    //------------------------------------------------------------------1282    [COMMENT_STATE](cp) {1283        if (cp === $.HYPHEN_MINUS) {1284            this.state = COMMENT_END_DASH_STATE;1285        } else if (cp === $.LESS_THAN_SIGN) {1286            this.currentToken.data += '<';1287            this.state = COMMENT_LESS_THAN_SIGN_STATE;1288        } else if (cp === $.NULL) {1289            this._err(ERR.unexpectedNullCharacter);1290            this.currentToken.data += unicode.REPLACEMENT_CHARACTER;1291        } else if (cp === $.EOF) {1292            this._err(ERR.eofInComment);1293            this._emitCurrentToken();1294            this._emitEOFToken();1295        } else {1296            this.currentToken.data += toChar(cp);1297        }1298    }1299    // Comment less-than sign state1300    //------------------------------------------------------------------1301    [COMMENT_LESS_THAN_SIGN_STATE](cp) {1302        if (cp === $.EXCLAMATION_MARK) {1303            this.currentToken.data += '!';1304            this.state = COMMENT_LESS_THAN_SIGN_BANG_STATE;1305        } else if (cp === $.LESS_THAN_SIGN) {1306            this.currentToken.data += '!';1307        } else {1308            this._reconsumeInState(COMMENT_STATE);1309        }1310    }1311    // Comment less-than sign bang state1312    //------------------------------------------------------------------1313    [COMMENT_LESS_THAN_SIGN_BANG_STATE](cp) {1314        if (cp === $.HYPHEN_MINUS) {1315            this.state = COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE;1316        } else {1317            this._reconsumeInState(COMMENT_STATE);1318        }1319    }1320    // Comment less-than sign bang dash state1321    //------------------------------------------------------------------1322    [COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE](cp) {1323        if (cp === $.HYPHEN_MINUS) {1324            this.state = COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE;1325        } else {1326            this._reconsumeInState(COMMENT_END_DASH_STATE);1327        }1328    }1329    // Comment less-than sign bang dash dash state1330    //------------------------------------------------------------------1331    [COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE](cp) {1332        if (cp !== $.GREATER_THAN_SIGN && cp !== $.EOF) {1333            this._err(ERR.nestedComment);1334        }1335        this._reconsumeInState(COMMENT_END_STATE);1336    }1337    // Comment end dash state1338    //------------------------------------------------------------------1339    [COMMENT_END_DASH_STATE](cp) {1340        if (cp === $.HYPHEN_MINUS) {1341            this.state = COMMENT_END_STATE;1342        } else if (cp === $.EOF) {1343            this._err(ERR.eofInComment);1344            this._emitCurrentToken();1345            this._emitEOFToken();1346        } else {1347            this.currentToken.data += '-';1348            this._reconsumeInState(COMMENT_STATE);1349        }1350    }1351    // Comment end state1352    //------------------------------------------------------------------1353    [COMMENT_END_STATE](cp) {1354        if (cp === $.GREATER_THAN_SIGN) {1355            this.state = DATA_STATE;1356            this._emitCurrentToken();1357        } else if (cp === $.EXCLAMATION_MARK) {1358            this.state = COMMENT_END_BANG_STATE;1359        } else if (cp === $.HYPHEN_MINUS) {1360            this.currentToken.data += '-';1361        } else if (cp === $.EOF) {1362            this._err(ERR.eofInComment);1363            this._emitCurrentToken();1364            this._emitEOFToken();1365        } else {1366            this.currentToken.data += '--';1367            this._reconsumeInState(COMMENT_STATE);1368        }1369    }1370    // Comment end bang state1371    //------------------------------------------------------------------1372    [COMMENT_END_BANG_STATE](cp) {1373        if (cp === $.HYPHEN_MINUS) {1374            this.currentToken.data += '--!';1375            this.state = COMMENT_END_DASH_STATE;1376        } else if (cp === $.GREATER_THAN_SIGN) {1377            this._err(ERR.incorrectlyClosedComment);1378            this.state = DATA_STATE;1379            this._emitCurrentToken();1380        } else if (cp === $.EOF) {1381            this._err(ERR.eofInComment);1382            this._emitCurrentToken();1383            this._emitEOFToken();1384        } else {1385            this.currentToken.data += '--!';1386            this._reconsumeInState(COMMENT_STATE);1387        }1388    }1389    // DOCTYPE state1390    //------------------------------------------------------------------1391    [DOCTYPE_STATE](cp) {1392        if (isWhitespace(cp)) {1393            this.state = BEFORE_DOCTYPE_NAME_STATE;1394        } else if (cp === $.GREATER_THAN_SIGN) {1395            this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE);1396        } else if (cp === $.EOF) {1397            this._err(ERR.eofInDoctype);1398            this._createDoctypeToken(null);1399            this.currentToken.forceQuirks = true;1400            this._emitCurrentToken();1401            this._emitEOFToken();1402        } else {1403            this._err(ERR.missingWhitespaceBeforeDoctypeName);1404            this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE);1405        }1406    }1407    // Before DOCTYPE name state1408    //------------------------------------------------------------------1409    [BEFORE_DOCTYPE_NAME_STATE](cp) {1410        if (isWhitespace(cp)) {1411            return;1412        }1413        if (isAsciiUpper(cp)) {1414            this._createDoctypeToken(toAsciiLowerChar(cp));1415            this.state = DOCTYPE_NAME_STATE;1416        } else if (cp === $.NULL) {1417            this._err(ERR.unexpectedNullCharacter);1418            this._createDoctypeToken(unicode.REPLACEMENT_CHARACTER);1419            this.state = DOCTYPE_NAME_STATE;1420        } else if (cp === $.GREATER_THAN_SIGN) {1421            this._err(ERR.missingDoctypeName);1422            this._createDoctypeToken(null);1423            this.currentToken.forceQuirks = true;1424            this._emitCurrentToken();1425            this.state = DATA_STATE;1426        } else if (cp === $.EOF) {1427            this._err(ERR.eofInDoctype);1428            this._createDoctypeToken(null);1429            this.currentToken.forceQuirks = true;1430            this._emitCurrentToken();1431            this._emitEOFToken();1432        } else {1433            this._createDoctypeToken(toChar(cp));1434            this.state = DOCTYPE_NAME_STATE;1435        }1436    }1437    // DOCTYPE name state1438    //------------------------------------------------------------------1439    [DOCTYPE_NAME_STATE](cp) {1440        if (isWhitespace(cp)) {1441            this.state = AFTER_DOCTYPE_NAME_STATE;1442        } else if (cp === $.GREATER_THAN_SIGN) {1443            this.state = DATA_STATE;1444            this._emitCurrentToken();1445        } else if (isAsciiUpper(cp)) {1446            this.currentToken.name += toAsciiLowerChar(cp);1447        } else if (cp === $.NULL) {1448            this._err(ERR.unexpectedNullCharacter);1449            this.currentToken.name += unicode.REPLACEMENT_CHARACTER;1450        } else if (cp === $.EOF) {1451            this._err(ERR.eofInDoctype);1452            this.currentToken.forceQuirks = true;1453            this._emitCurrentToken();1454            this._emitEOFToken();1455        } else {1456            this.currentToken.name += toChar(cp);1457        }1458    }1459    // After DOCTYPE name state1460    //------------------------------------------------------------------1461    [AFTER_DOCTYPE_NAME_STATE](cp) {1462        if (isWhitespace(cp)) {1463            return;1464        }1465        if (cp === $.GREATER_THAN_SIGN) {1466            this.state = DATA_STATE;1467            this._emitCurrentToken();1468        } else if (cp === $.EOF) {1469            this._err(ERR.eofInDoctype);1470            this.currentToken.forceQuirks = true;1471            this._emitCurrentToken();1472            this._emitEOFToken();1473        } else if (this._consumeSequenceIfMatch($$.PUBLIC_STRING, cp, false)) {1474            this.state = AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE;1475        } else if (this._consumeSequenceIfMatch($$.SYSTEM_STRING, cp, false)) {1476            this.state = AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE;1477        }1478        //NOTE: sequence lookup can be abrupted by hibernation. In that case lookup1479        //results are no longer valid and we will need to start over.1480        else if (!this._ensureHibernation()) {1481            this._err(ERR.invalidCharacterSequenceAfterDoctypeName);1482            this.currentToken.forceQuirks = true;1483            this._reconsumeInState(BOGUS_DOCTYPE_STATE);1484        }1485    }1486    // After DOCTYPE public keyword state1487    //------------------------------------------------------------------1488    [AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE](cp) {1489        if (isWhitespace(cp)) {1490            this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE;1491        } else if (cp === $.QUOTATION_MARK) {1492            this._err(ERR.missingWhitespaceAfterDoctypePublicKeyword);1493            this.currentToken.publicId = '';1494            this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE;1495        } else if (cp === $.APOSTROPHE) {1496            this._err(ERR.missingWhitespaceAfterDoctypePublicKeyword);1497            this.currentToken.publicId = '';1498            this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;1499        } else if (cp === $.GREATER_THAN_SIGN) {1500            this._err(ERR.missingDoctypePublicIdentifier);1501            this.currentToken.forceQuirks = true;1502            this.state = DATA_STATE;1503            this._emitCurrentToken();1504        } else if (cp === $.EOF) {1505            this._err(ERR.eofInDoctype);1506            this.currentToken.forceQuirks = true;1507            this._emitCurrentToken();1508            this._emitEOFToken();1509        } else {1510            this._err(ERR.missingQuoteBeforeDoctypePublicIdentifier);1511            this.currentToken.forceQuirks = true;1512            this._reconsumeInState(BOGUS_DOCTYPE_STATE);1513        }1514    }1515    // Before DOCTYPE public identifier state1516    //------------------------------------------------------------------1517    [BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE](cp) {1518        if (isWhitespace(cp)) {1519            return;1520        }1521        if (cp === $.QUOTATION_MARK) {1522            this.currentToken.publicId = '';1523            this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE;1524        } else if (cp === $.APOSTROPHE) {1525            this.currentToken.publicId = '';1526            this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;1527        } else if (cp === $.GREATER_THAN_SIGN) {1528            this._err(ERR.missingDoctypePublicIdentifier);1529            this.currentToken.forceQuirks = true;1530            this.state = DATA_STATE;1531            this._emitCurrentToken();1532        } else if (cp === $.EOF) {1533            this._err(ERR.eofInDoctype);1534            this.currentToken.forceQuirks = true;1535            this._emitCurrentToken();1536            this._emitEOFToken();1537        } else {1538            this._err(ERR.missingQuoteBeforeDoctypePublicIdentifier);1539            this.currentToken.forceQuirks = true;1540            this._reconsumeInState(BOGUS_DOCTYPE_STATE);1541        }1542    }1543    // DOCTYPE public identifier (double-quoted) state1544    //------------------------------------------------------------------1545    [DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE](cp) {1546        if (cp === $.QUOTATION_MARK) {1547            this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;1548        } else if (cp === $.NULL) {1549            this._err(ERR.unexpectedNullCharacter);1550            this.currentToken.publicId += unicode.REPLACEMENT_CHARACTER;1551        } else if (cp === $.GREATER_THAN_SIGN) {1552            this._err(ERR.abruptDoctypePublicIdentifier);1553            this.currentToken.forceQuirks = true;1554            this._emitCurrentToken();1555            this.state = DATA_STATE;1556        } else if (cp === $.EOF) {1557            this._err(ERR.eofInDoctype);1558            this.currentToken.forceQuirks = true;1559            this._emitCurrentToken();1560            this._emitEOFToken();1561        } else {1562            this.currentToken.publicId += toChar(cp);1563        }1564    }1565    // DOCTYPE public identifier (single-quoted) state1566    //------------------------------------------------------------------1567    [DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE](cp) {1568        if (cp === $.APOSTROPHE) {1569            this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;1570        } else if (cp === $.NULL) {1571            this._err(ERR.unexpectedNullCharacter);1572            this.currentToken.publicId += unicode.REPLACEMENT_CHARACTER;1573        } else if (cp === $.GREATER_THAN_SIGN) {1574            this._err(ERR.abruptDoctypePublicIdentifier);1575            this.currentToken.forceQuirks = true;1576            this._emitCurrentToken();1577            this.state = DATA_STATE;1578        } else if (cp === $.EOF) {1579            this._err(ERR.eofInDoctype);1580            this.currentToken.forceQuirks = true;1581            this._emitCurrentToken();1582            this._emitEOFToken();1583        } else {1584            this.currentToken.publicId += toChar(cp);1585        }1586    }1587    // After DOCTYPE public identifier state1588    //------------------------------------------------------------------1589    [AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE](cp) {1590        if (isWhitespace(cp)) {1591            this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE;1592        } else if (cp === $.GREATER_THAN_SIGN) {1593            this.state = DATA_STATE;1594            this._emitCurrentToken();1595        } else if (cp === $.QUOTATION_MARK) {1596            this._err(ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers);1597            this.currentToken.systemId = '';1598            this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;1599        } else if (cp === $.APOSTROPHE) {1600            this._err(ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers);1601            this.currentToken.systemId = '';1602            this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;1603        } else if (cp === $.EOF) {1604            this._err(ERR.eofInDoctype);1605            this.currentToken.forceQuirks = true;1606            this._emitCurrentToken();1607            this._emitEOFToken();1608        } else {1609            this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);1610            this.currentToken.forceQuirks = true;1611            this._reconsumeInState(BOGUS_DOCTYPE_STATE);1612        }1613    }1614    // Between DOCTYPE public and system identifiers state1615    //------------------------------------------------------------------1616    [BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE](cp) {1617        if (isWhitespace(cp)) {1618            return;1619        }1620        if (cp === $.GREATER_THAN_SIGN) {1621            this._emitCurrentToken();1622            this.state = DATA_STATE;1623        } else if (cp === $.QUOTATION_MARK) {1624            this.currentToken.systemId = '';1625            this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;1626        } else if (cp === $.APOSTROPHE) {1627            this.currentToken.systemId = '';1628            this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;1629        } else if (cp === $.EOF) {1630            this._err(ERR.eofInDoctype);1631            this.currentToken.forceQuirks = true;1632            this._emitCurrentToken();1633            this._emitEOFToken();1634        } else {1635            this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);1636            this.currentToken.forceQuirks = true;1637            this._reconsumeInState(BOGUS_DOCTYPE_STATE);1638        }1639    }1640    // After DOCTYPE system keyword state1641    //------------------------------------------------------------------1642    [AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE](cp) {1643        if (isWhitespace(cp)) {1644            this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE;1645        } else if (cp === $.QUOTATION_MARK) {1646            this._err(ERR.missingWhitespaceAfterDoctypeSystemKeyword);1647            this.currentToken.systemId = '';1648            this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;1649        } else if (cp === $.APOSTROPHE) {1650            this._err(ERR.missingWhitespaceAfterDoctypeSystemKeyword);1651            this.currentToken.systemId = '';1652            this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;1653        } else if (cp === $.GREATER_THAN_SIGN) {1654            this._err(ERR.missingDoctypeSystemIdentifier);1655            this.currentToken.forceQuirks = true;1656            this.state = DATA_STATE;1657            this._emitCurrentToken();1658        } else if (cp === $.EOF) {1659            this._err(ERR.eofInDoctype);1660            this.currentToken.forceQuirks = true;1661            this._emitCurrentToken();1662            this._emitEOFToken();1663        } else {1664            this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);1665            this.currentToken.forceQuirks = true;1666            this._reconsumeInState(BOGUS_DOCTYPE_STATE);1667        }1668    }1669    // Before DOCTYPE system identifier state1670    //------------------------------------------------------------------1671    [BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE](cp) {1672        if (isWhitespace(cp)) {1673            return;1674        }1675        if (cp === $.QUOTATION_MARK) {1676            this.currentToken.systemId = '';1677            this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;1678        } else if (cp === $.APOSTROPHE) {1679            this.currentToken.systemId = '';1680            this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;1681        } else if (cp === $.GREATER_THAN_SIGN) {1682            this._err(ERR.missingDoctypeSystemIdentifier);1683            this.currentToken.forceQuirks = true;1684            this.state = DATA_STATE;1685            this._emitCurrentToken();1686        } else if (cp === $.EOF) {1687            this._err(ERR.eofInDoctype);1688            this.currentToken.forceQuirks = true;1689            this._emitCurrentToken();1690            this._emitEOFToken();1691        } else {1692            this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier);1693            this.currentToken.forceQuirks = true;1694            this._reconsumeInState(BOGUS_DOCTYPE_STATE);1695        }1696    }1697    // DOCTYPE system identifier (double-quoted) state1698    //------------------------------------------------------------------1699    [DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE](cp) {1700        if (cp === $.QUOTATION_MARK) {1701            this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;1702        } else if (cp === $.NULL) {1703            this._err(ERR.unexpectedNullCharacter);1704            this.currentToken.systemId += unicode.REPLACEMENT_CHARACTER;1705        } else if (cp === $.GREATER_THAN_SIGN) {1706            this._err(ERR.abruptDoctypeSystemIdentifier);1707            this.currentToken.forceQuirks = true;1708            this._emitCurrentToken();1709            this.state = DATA_STATE;1710        } else if (cp === $.EOF) {1711            this._err(ERR.eofInDoctype);1712            this.currentToken.forceQuirks = true;1713            this._emitCurrentToken();1714            this._emitEOFToken();1715        } else {1716            this.currentToken.systemId += toChar(cp);1717        }1718    }1719    // DOCTYPE system identifier (single-quoted) state1720    //------------------------------------------------------------------1721    [DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE](cp) {1722        if (cp === $.APOSTROPHE) {1723            this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;1724        } else if (cp === $.NULL) {1725            this._err(ERR.unexpectedNullCharacter);1726            this.currentToken.systemId += unicode.REPLACEMENT_CHARACTER;1727        } else if (cp === $.GREATER_THAN_SIGN) {1728            this._err(ERR.abruptDoctypeSystemIdentifier);1729            this.currentToken.forceQuirks = true;1730            this._emitCurrentToken();1731            this.state = DATA_STATE;1732        } else if (cp === $.EOF) {1733            this._err(ERR.eofInDoctype);1734            this.currentToken.forceQuirks = true;1735            this._emitCurrentToken();1736            this._emitEOFToken();1737        } else {1738            this.currentToken.systemId += toChar(cp);1739        }1740    }1741    // After DOCTYPE system identifier state1742    //------------------------------------------------------------------1743    [AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE](cp) {1744        if (isWhitespace(cp)) {1745            return;1746        }1747        if (cp === $.GREATER_THAN_SIGN) {1748            this._emitCurrentToken();1749            this.state = DATA_STATE;1750        } else if (cp === $.EOF) {1751            this._err(ERR.eofInDoctype);1752            this.currentToken.forceQuirks = true;1753            this._emitCurrentToken();1754            this._emitEOFToken();1755        } else {1756            this._err(ERR.unexpectedCharacterAfterDoctypeSystemIdentifier);1757            this._reconsumeInState(BOGUS_DOCTYPE_STATE);1758        }1759    }1760    // Bogus DOCTYPE state1761    //------------------------------------------------------------------1762    [BOGUS_DOCTYPE_STATE](cp) {1763        if (cp === $.GREATER_THAN_SIGN) {1764            this._emitCurrentToken();1765            this.state = DATA_STATE;1766        } else if (cp === $.NULL) {1767            this._err(ERR.unexpectedNullCharacter);1768        } else if (cp === $.EOF) {1769            this._emitCurrentToken();1770            this._emitEOFToken();1771        }1772    }1773    // CDATA section state1774    //------------------------------------------------------------------1775    [CDATA_SECTION_STATE](cp) {1776        if (cp === $.RIGHT_SQUARE_BRACKET) {1777            this.state = CDATA_SECTION_BRACKET_STATE;1778        } else if (cp === $.EOF) {1779            this._err(ERR.eofInCdata);1780            this._emitEOFToken();1781        } else {1782            this._emitCodePoint(cp);1783        }1784    }1785    // CDATA section bracket state1786    //------------------------------------------------------------------1787    [CDATA_SECTION_BRACKET_STATE](cp) {1788        if (cp === $.RIGHT_SQUARE_BRACKET) {1789            this.state = CDATA_SECTION_END_STATE;1790        } else {1791            this._emitChars(']');1792            this._reconsumeInState(CDATA_SECTION_STATE);1793        }1794    }...rulesAssistantParser.js
Source:rulesAssistantParser.js  
1// Implements a Top Down Operator Precedence parser, also know as a Pratt2// parser, after its "inventor", Vaughan Pratt.  The one implemented here3// closely follows what's presented here,4//     * http://javascript.crockford.com/tdop/tdop.html5// by Douglas Crockford, that uses that technique in JSLint.  Other relevant6// resources on the interweb7//     * http://effbot.org/zone/simple-top-down-parsing.htm8//     * http://eli.thegreenplace.net/2010/01/02/top-down-operator-precedence-parsing9//     * http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/10//     * https://higherlogics.blogspot.gr/2009/11/extensible-statically-typed-pratt.html11//     * https://github.com/fholm/Vaughan12//     * https://github.com/DasIch/pratt13// included here mostly as bookmarks for potential future reference.14//15// With regards to the lexer, I used the following with many changes16//     * http://eli.thegreenplace.net/2013/06/25/regex-based-lexical-analysis-in-python-and-javascript/17//18// Other useful things that I may not use any more but wouldn't want to lose,19//     * https://plainjs.com/javascript/utilities/merge-two-javascript-objects-19/20//     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions21function panic(index, msg) {22    throw {index: index, message: msg};23}24var Lexer = function(skipWhitespace) {25    this.rules = [];26    this.index = 0;27    this.buffer = "";28    this.skipWhitespace = skipWhitespace ? /\S/ : null;29}30Lexer.prototype.addRule = function(id, defn) {31    var pattern = (defn && defn.pattern) || RegExp.escape(id);32    this.rules.push({33        id: id,34        pattern: new RegExp('^' + pattern)35    });36}37Lexer.prototype.feed = function(buffer) {38    this.buffer = buffer;39    this.index = 0;40}41Lexer.prototype.nextInterestingChar = function() {42    if (this.skipWhitespace) {43        var match = this.skipWhitespace.exec(this.buffer.substr(this.index));44        return match ? this.index + match.index45                     : this.buffer.length;46    }47    return this.index;48}49Lexer.prototype.next = function() {50    this.index = this.nextInterestingChar();51    if (this.index >= this.buffer.length)52        return { done: true };53    for (var i = 0; i < this.rules.length; ++i) {54        var rule = this.rules[i],55            match = rule.pattern.exec(this.buffer.substr(this.index));56        if (match) {57            var token = {58                id: rule.id,59                value: match[0],60                index: this.index,61            };62            this.index += token.value.length;63            return { done: false, value: token };64        }65    }66    panic(this.index, "illegal character");67}68var BaseSymbol = {69    lbp: 0,70    nud: function() { panic(this.index, "unexpected '" + this.id + "'"); },71    led: function() { panic(this.index, "not an operator"); }72};73var Parser = function(eofToken) {74    this.lexer = new Lexer(true);75    this.currentSymbol = null;76    this.eofToken = eofToken;77    this.symbolTable = {78        [this.eofToken]: Object.create(BaseSymbol, {id: {value: this.eofToken}})79    };80}81Parser.prototype.addSymbol = function(id, defn) {82    var s = this.symbolTable[id];83    if (s) {84        if (defn) {85            if (defn.lbp !== undefined) s.lbp = defn.lbp;86            if (defn.nud !== undefined) s.nud = defn.nud;87            if (defn.led !== undefined) s.led = defn.led;88        }89    } else {90        s = Object.create(BaseSymbol);91        s.id = id;92        if (defn && defn.lbp !== undefined) s.lbp = defn.lbp;93        if (defn && defn.nud) s.nud = defn.nud;94        if (defn && defn.led) s.led = defn.led;95        this.symbolTable[id] = s;96        this.lexer.addRule(id, defn);97    }98    return this;99}100Parser.prototype.addInfix = function(id, lbp, callback) {101    this.addSymbol(id, {102        lbp: lbp,103        led: function(p, left) { return callback(this, left, p.parse(lbp)); }104    });105    return this;106}107Parser.prototype.addInfixR = function(id, lbp, callback) {108    this.addSymbol(id, {109        lbp: lbp,110        led: function(p, left) { return callback(this, left, p.parse(lbp-1)); }111    });112    return this;113}114Parser.prototype.addPrefix = function(id, callback) {115    this.addSymbol(id, {116        // FIXME: this should not always be 70117        nud: function (p) { return callback(this, p.parse(70)); }118    });119    return this;120}121Parser.prototype.addConstant = function(id, callback) {122    this.addSymbol(id, {123        nud: function () { return callback(this); }124    });125    return this;126}127Parser.prototype.advance = function(id) {128    if (id !== undefined && this.currentSymbol.id !== id)129        panic(this.currentSymbol.index, "expected '" + id + "', got '" + this.currentSymbol.id + "'");130    var iter = this.lexer.next(),131        token = iter.value;132    if (iter.done)133        token = {134            id: this.eofToken,135            index: this.lexer.buffer.length136        };137    var symbol = this.symbolTable[iter.done ? this.eofToken : token.id];138    if (!symbol)139        panic(token.index, "unknown token '" + token.id + "'");140    var newSymbol = Object.create(symbol);141    newSymbol.value = token.value;142    newSymbol.index = token.index;143    return this.currentSymbol = newSymbol;144}145Parser.prototype.parse = function(rbp) {146    var symbol = this.currentSymbol;147    this.advance();148    var left = symbol.nud(this);149    rbp = rbp || 0;150    while (rbp < this.currentSymbol.lbp) {151        symbol = this.currentSymbol;152        this.advance();153        left = symbol.led(this, left);154    }155    return left;156}157Parser.prototype.parseString = function(string) {158    this.lexer.feed(string);159    this.advance();  // "kickstart" the lexer160    var result = this.parse();161    this.advance(this.eofToken);162    return result;163}164var ASTBuilder = function(eofToken) {165    this.parser = new Parser(eofToken);166}167ASTBuilder.prototype.addSymbol = function(id, extra) {168    this.parser.addSymbol(id, extra);169    return this;170}171ASTBuilder.prototype.addInfix = function(id, lbp) {172    this.parser.addInfix(id, lbp, function(symbol, left, right) {173        return {174            id: id,175            first: left,176            second: right,177        };178    });179    return this;180}181ASTBuilder.prototype.addInfixR = function(id, lbp) {182    this.parser.addInfixR(id, lbp, function(symbol, left, right) {183        return {184            id: id,185            first: left,186            second: right,187        };188    });189    return this;190}191ASTBuilder.prototype.addPrefix = function(id) {192    this.parser.addPrefix(id, function(symbol, left) {193        return {194            id: id,195            first: left,  // it's not really the left is it?196        };197    });198    return this;199}200ASTBuilder.prototype.addConstant = function(id, value) {201    this.parser.addConstant(id, function(symbol) {202        return {203            id: id,204            value: value,205        };206    });207    return this;208}209var op = {210    add: function(a, b) { return a + b; },211    sub: function(a, b) { return a - b; },212    mul: function(a, b) { return a * b; },213    div: function(a, b) { return a / b; },214    pow: function(a, b) { return Math.pow(a, b); },215    neg: function(a) { return -a; },216    lt: function(a, b) { return a < b; },217    le: function(a, b) { return a <= b; },218    gt: function(a, b) { return a > b; },219    ge: function(a, b) { return a >= b; },220    eq: function(a, b) { return a === b; },221    neq: function(a, b) { return a !== b; },222    not: function(a) { return !a; },223    or: function(a, b) { return a || b; },224    and: function(a, b) { return a && b; },225};226var parserBuilder = new ASTBuilder("(end)")227    // XXX: need to be first to not be recognised as a (name)228    .addConstant("true", true)229    .addConstant("false", false)230    .addSymbol("(number)", {231        pattern: "\\d+",232        nud: function() {233            return {234                id: "(number)",235                value: parseInt(this.value),236            };237        }238    })239    .addSymbol("(string)", {240        pattern: "\"(?:[^\\\\\"]|\\\\\"|\\\\(?!\"))*\"",241        nud: function(p) {242            return {243                id: "(string)",244                value: this.value.replace(/^\"|\"$/g, ""),245            };246        }247    })248    .addSymbol("(name)", {249        pattern: "[a-zA-Z]\\w*",250        nud: function(p) {251            return {252                id: "(name)",253                name: this.value,254            };255        }256    })257    .addInfix("+", 50,  op.add)258    .addInfix("-", 50,  op.sub)259    .addInfix("*", 60,  op.mul)260    .addInfix("/", 60,  op.div)261    .addInfixR("^", 70, op.pow)262    .addPrefix("-", op.neg)263    .addInfix("<=", 40, op.le)264    .addInfix("<",  40, op.lt)265    .addInfix(">=", 40, op.ge)266    .addInfix(">",  40, op.gt)267    .addInfix("!=", 40, op.neq)268    .addInfix("=",  40, op.eq)269    .addPrefix("!", op.not)270    .addInfix("||", 30, op.or)271    .addInfix("&&", 30, op.and)272    .addSymbol(")")273    .addSymbol("(", {274        nud: function(p) {275            var expr = p.parse(0);276            p.advance(")");277            return expr;278        }279    });280var parser = parserBuilder.parser;281window.parser = parser;282window.parseCondition = function(condition) {283    try {284        return {expr: parser.parseString(condition), error: null};285    } catch (e) {286        return {expr: null, error: e};287    }...lexer-numbers.js
Source:lexer-numbers.js  
1'use strict';2const should = require('should');3const Lexer = require('../../src/lexer.js');4const tokenTypes = require('../../src/token.js').tokenTypes;5describe('lexer', function() {6    describe('parse valid octal numbers', function() {7        it('should emit numeric literal tokens', function() {8            const input = `9                0111;10                077;11            `;12            const lexer = new Lexer(input);13            const token1 = lexer.nextToken();14            should.exist(token1);15            token1.type.should.be.eql(tokenTypes.numericLiteral);16            token1.value.should.be.eql('0111');17            const token2 = lexer.nextToken();18            should.exist(token2);19            token2.type.should.be.eql(tokenTypes.punctuator);20            token2.value.should.be.eql(';');21            const token3 = lexer.nextToken();22            should.exist(token3);23            token3.type.should.be.eql(tokenTypes.numericLiteral);24            token3.value.should.be.eql('077');25            const token4 = lexer.nextToken();26            should.exist(token4);27            token4.type.should.be.eql(tokenTypes.punctuator);28            token4.value.should.be.eql(';');29            const eofToken = lexer.nextToken();30            should.exist(eofToken);31            eofToken.type.should.be.eql(tokenTypes.eof);32        });33    });34    describe('parse invalid octal numbers', function() {35        it('should fail', function() {36            const input = `37                08;38            `;39            try {40                const lexer = new Lexer(input);41                throw new Error('Expecting error from bad syntax');42            }43            catch (ex) {44                (ex instanceof SyntaxError).should.be.eql(true);45            }46        });47    });48    describe('parse 0', function() {49        it('should yield 0', function() {50            const input = `51                0;52            `;53            const lexer = new Lexer(input);54            const token1 = lexer.nextToken();55            should.exist(token1);56            token1.type.should.be.eql(tokenTypes.numericLiteral);57            token1.value.should.be.eql('0');58            const token2 = lexer.nextToken();59            should.exist(token2);60            token2.type.should.be.eql(tokenTypes.punctuator);61            token2.value.should.be.eql(';');62            const eofToken = lexer.nextToken();63            should.exist(eofToken);64            eofToken.type.should.be.eql(tokenTypes.eof);65        });66    });67    describe('parse valid hex numbers', function() {68        it('should succeed', function() {69            const input = `70                0x1;71                0xDEADC0DE;72            `;73            const lexer = new Lexer(input);74            const token1 = lexer.nextToken();75            should.exist(token1);76            token1.type.should.be.eql(tokenTypes.numericLiteral);77            token1.value.should.be.eql('0x1');78            const token2 = lexer.nextToken();79            should.exist(token2);80            token2.type.should.be.eql(tokenTypes.punctuator);81            token2.value.should.be.eql(';');82            const token3 = lexer.nextToken();83            should.exist(token3);84            token3.type.should.be.eql(tokenTypes.numericLiteral);85            token3.value.should.be.eql('0xDEADC0DE');86            const token4 = lexer.nextToken();87            should.exist(token4);88            token4.type.should.be.eql(tokenTypes.punctuator);89            token4.value.should.be.eql(';');90            const eofToken = lexer.nextToken();91            should.exist(eofToken);92            eofToken.type.should.be.eql(tokenTypes.eof);93        });94    });95    describe('parse invalid hex numbers', function() {96        it('should fail', function() {97            const input = `98                0xG00D;99            `;100            try {101                const lexer = new Lexer(input);102                throw new Error('Expecting error from bad syntax');103            }104            catch (ex) {105                (ex instanceof SyntaxError).should.be.eql(true);106            }107        });108    });109    describe('parse incomplete hex numbers', function() {110        it('should fail', function() {111            const input = `112                0x;113            `;114            try {115                const lexer = new Lexer(input);116                throw new Error('Expecting error from bad syntax');117            }118            catch (ex) {119                (ex instanceof SyntaxError).should.be.eql(true);120            }121        });122    });123    describe('parse invalid decimal numbers', function() {124        it('2e should fail', function() {125            const input = `126                2e;127            `;128            try {129                const lexer = new Lexer(input);130                throw new Error('Expecting error from bad syntax');131            }132            catch (ex) {133                (ex instanceof SyntaxError).should.be.eql(true);134            }135        });136        it('2eE should fail', function() {137            const input = `138                2eE;139            `;140            try {141                const lexer = new Lexer(input);142                throw new Error('Expecting error from bad syntax');143            }144            catch (ex) {145                (ex instanceof SyntaxError).should.be.eql(true);146            }147        });148        it('1.1.1 should fail', function() {149            const input = `150                1.1.1;151            `;152            try {153                const lexer = new Lexer(input);154                throw new Error('Expecting error from bad syntax');155            }156            catch (ex) {157                (ex instanceof SyntaxError).should.be.eql(true);158            }159        });160        it('2e+ should fail', function() {161            const input = `162                2e+;163            `;164            try {165                const lexer = new Lexer(input);166                throw new Error('Expecting error from bad syntax');167            }168            catch (ex) {169                (ex instanceof SyntaxError).should.be.eql(true);170            }171        });172        it('2.e should fail', function() {173            const input = `174                2.e;175            `;176            try {177                const lexer = new Lexer(input);178                throw new Error('Expecting error from bad syntax');179            }180            catch (ex) {181                (ex instanceof SyntaxError).should.be.eql(true);182            }183        });184    });185    describe('parse valid decimal numbers', function() {186        it('should succeed', function() {187            const input = `188                12345;189                2.;190                3e5;191                3e-5;192                3e+5;193                4.5E-6;194                .7;195            `;196            const lexer = new Lexer(input);197            let token = null;198            token = lexer.nextToken();199            token.type.should.be.eql(tokenTypes.numericLiteral);200            token.value.should.be.eql('12345');201            token = lexer.nextToken();202            token.type.should.be.eql(tokenTypes.punctuator);203            token.value.should.be.eql(';');204            token = lexer.nextToken();205            token.type.should.be.eql(tokenTypes.numericLiteral);206            token.value.should.be.eql('2.');207            token = lexer.nextToken();208            token.type.should.be.eql(tokenTypes.punctuator);209            token.value.should.be.eql(';');210            token = lexer.nextToken();211            token.type.should.be.eql(tokenTypes.numericLiteral);212            token.value.should.be.eql('3e5');213            token = lexer.nextToken();214            token.type.should.be.eql(tokenTypes.punctuator);215            token.value.should.be.eql(';');216            token = lexer.nextToken();217            token.type.should.be.eql(tokenTypes.numericLiteral);218            token.value.should.be.eql('3e-5');219            token = lexer.nextToken();220            token.type.should.be.eql(tokenTypes.punctuator);221            token.value.should.be.eql(';');222            token = lexer.nextToken();223            token.type.should.be.eql(tokenTypes.numericLiteral);224            token.value.should.be.eql('3e+5');225            token = lexer.nextToken();226            token.type.should.be.eql(tokenTypes.punctuator);227            token.value.should.be.eql(';');228            token = lexer.nextToken();229            token.type.should.be.eql(tokenTypes.numericLiteral);230            token.value.should.be.eql('4.5E-6');231            token = lexer.nextToken();232            token.type.should.be.eql(tokenTypes.punctuator);233            token.value.should.be.eql(';');234            token = lexer.nextToken();235            token.type.should.be.eql(tokenTypes.numericLiteral);236            token.value.should.be.eql('.7');237            token = lexer.nextToken();238            token.type.should.be.eql(tokenTypes.punctuator);239            token.value.should.be.eql(';');240            const eofToken = lexer.nextToken();241            should.exist(eofToken);242            eofToken.type.should.be.eql(tokenTypes.eof);243        });244    });...ListTokenSource.js
Source:ListTokenSource.js  
1/*2 * Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.3 * Use of this file is governed by the BSD 3-clause license that4 * can be found in the LICENSE.txt file in the project root.5 */6goog.module('org.antlr.v4.runtime.ListTokenSource');7goog.module.declareLegacyNamespace();8const Token = goog.require('org.antlr.v4.runtime.Token');9const TokenSource = goog.require('org.antlr.v4.runtime.TokenSource');10const CommonTokenFactory = goog.require('org.antlr.v4.runtime.CommonTokenFactory');11const Pair = goog.require('org.antlr.v4.runtime.misc.Pair');12/**13 * Provides an implementation of {@link TokenSource} as a wrapper around a list14 * of {@link Token} objects.15 *16 * <p>If the final token in the list is an {@link Token#EOF} token, it will be used17 * as the EOF token for every call to {@link #nextToken} after the end of the18 * list is reached. Otherwise, an EOF token will be created.</p>19 *20 * @implements {TokenSource}21 */22class ListTokenSource {23    /**24     * Constructs a new {@link ListTokenSource} instance from the specified25     * collection of {@link Token} objects and source name.26     *27     * @param {Array<org.antlr.v4.runtime.Token>} tokens The collection of {@link Token} objects to provide as a28     * {@link TokenSource}.29     * @param {?string} sourceName The name of the {@link TokenSource}. If this value is30     * {@code null}, {@link #getSourceName} will attempt to infer the name from31     * the next {@link Token} (or the previous token if the end of the input has32     * been reached).33     *34     * @throws {Error} NullPointerException if {@code tokens} is {@code null}35     */36    constructor(tokens, sourceName) {37        if (tokens == null) {38            throw new Error("tokens cannot be null");39        }40        /**41         * The wrapped collection of {@link Token} objects to return.42         *43         * @protected {Array<org.antlr.v4.runtime.Token>}44         */45        this.tokens = tokens;46        /**47         * The name of the input source. If this value is {@code null}, a call to48         * {@link #getSourceName} should return the source name used to create the49         * the next token in {@link #tokens} (or the previous token if the end of50         * the input has been reached).51         *52         * @private {?string}53         */54        this.sourceName = sourceName;55        /**56         * The index into {@link #tokens} of token to return by the next call to57         * {@link #nextToken}. The end of the input is indicated by this value58         * being greater than or equal to the number of items in {@link #tokens}.59         *60         * @protected {number}61         */62        this.i = 0;63        /**64         * This field caches the EOF token for the token source.65         *66         * @protected {org.antlr.v4.runtime.Token}67         */68        this.eofToken = null;69        /**70         * This is the backing field for {@link #getTokenFactory} and71         * {@link setTokenFactory}.72         *73         * @private {org.antlr.v4.runtime.TokenFactory<?>}74         */75        this._factory = CommonTokenFactory.DEFAULT;76    }77    getCharPositionInLine() {78        if (this.i < this.tokens.length) {79            return this.tokens[this.i].getCharPositionInLine();80        }81        else if (this.eofToken != null) {82            return this.eofToken.getCharPositionInLine();83        }84        else if (this.tokens.length > 0) {85            // have to calculate the result from the line/column of the previous86            // token, along with the text of the token.87            var lastToken = this.tokens[this.tokens.length - 1];88            var tokenText = lastToken.getText();89            if (tokenText != null) {90                var lastNewLine = tokenText.lastIndexOf('\n');91                if (lastNewLine >= 0) {92                    return tokenText.length - lastNewLine - 1;93                }94            }95            return lastToken.getCharPositionInLine() + lastToken.getStopIndex() - lastToken.getStartIndex() + 1;96        }97        // only reach this if tokens is empty, meaning EOF occurs at the first98        // position in the input99        return 0;100    }101    nextToken() {102        if (this.i >= this.tokens.size()) {103            if (this.eofToken == null) {104                var start = -1;105                if (this.tokens.length > 0) {106                    var previousStop = this.tokens[this.tokens.length - 1].getStopIndex();107                    if (previousStop != -1) {108                        start = previousStop + 1;109                    }110                }111                var stop = Math.max(-1, start - 1);112                var pair = /** @type {!Pair<org.antlr.v4.runtime.TokenSource, org.antlr.v4.runtime.CharStream>} */ (new Pair(this, this.getInputStream()));113                this.eofToken = this._factory.create(pair, Token.EOF, "EOF", Token.DEFAULT_CHANNEL, start, stop, this.getLine(), this.getCharPositionInLine());114            }115            return this.eofToken;116        }117        var t = this.tokens[this.i];118        if (this.i === (this.tokens.length - 1) && t.getType() === Token.EOF) {119            this.eofToken = t;120        }121        this.i++;122        return t;123    }124    getLine() {125        if (this.i < this.tokens.length) {126            return this.tokens[this.i].getLine();127        }128        else if (this.eofToken != null) {129            return this.eofToken.getLine();130        }131        else if (this.tokens.length > 0) {132            // have to calculate the result from the line/column of the previous133            // token, along with the text of the token.134            var lastToken = this.tokens[this.tokens.length - 1];135            var line = lastToken.getLine();136            var tokenText = lastToken.getText();137            if (tokenText != null) {138                for (var i = 0; i < tokenText.length; i++) {139                    if (tokenText[i] == '\n') {140                        line++;141                    }142                }143            }144            // if no text is available, assume the token did not contain any newline characters.145            return line;146        }147        // only reach this if tokens is empty, meaning EOF occurs at the first148        // position in the input149        return 1;150    }151    getInputStream() {152        if (this.i < this.tokens.length) {153            return this.tokens[this.i].getInputStream();154        }155        else if (this.eofToken != null) {156            return this.eofToken.getInputStream();157        }158        else if (this.tokens.length > 0) {159            return this.tokens[this.tokens.length - 1].getInputStream();160        }161        // no input stream information is available162        return null;163    }164    getSourceName() {165        if (this.sourceName != null) {166            return this.sourceName;167        }168        var inputStream = this.getInputStream();169        if (inputStream != null) {170            return inputStream.getSourceName();171        }172        return "List";173    }174    setTokenFactory(factory) {175        this._factory = factory;176    }177    getTokenFactory() {178        return this._factory;179    }180};...parse.js
Source:parse.js  
1/**2 * <html maaa=a >3    <head>4        <style>5    body div #myid{6        width:100px;7        background-color: #ff5000;8    }9    body div img{10        width:30px;11        background-color: #ff1111;12    }13        </style>14    </head>15    <body>16        <div>17            <img id="myid"/>18            <img />19        </div>20    </body>21    </html>22 */23const EOF = Symbol("EOF");24const EOFToken = {25  type: "EOF",26};27let currentToken = null;28let currentAttribute = null;29let currentTextNode = null;30let stack = [31  {32    type: "document",33    children: [],34  },35];36function isASCIIAlpha(c) {37  return c.match(/^[a-zA-Z]$/);38}39function isSpace(c) {40  return c.match(/^[\t\n\f ]$/);41}42function emit(token) {43  let top = stack[stack.length - 1];44  if (token.type === "startTag") {45    let element = {46      type: "element",47      children: [],48      attributes: [],49    };50    element.tagName = token.tagName;51    for (let p in token) {52      if (p !== "type" && p !== "tagName") {53        element.attributes.push({54          name: p,55          value: token[p],56        });57      }58    }59    top.children.push(element);60    element.parent = top;61    if (!token.isSlefClosing) {62      stack.push(element);63    }64    currentTextNode = null;65  } else if (token.type === "endTag") {66    if (top.tagName !== token.tagName) {67      throw new Error("Tag start end don't match");68    } else {69      stack.pop();70    }71    currentTextNode = null;72  }else if(token.type === 'text') {73    if(currentTextNode === null) {74      currentTextNode = {75        type: 'text',76        content: ''77      }78      top.children.push(currentTextNode)79    }80    currentTextNode.content+=token.content81  }82  // if (token.type !== "text") {83  //   console.log(token);84  // }85}86function data(c) {87  if (c === "<") {88    return tagOpen;89  } else if (c === EOF) {90    emit(EOFToken);91    return;92  } else {93    emit({94      type: "text",95      content: c,96    });97    return data;98  }99}100function tagOpen(c) {101  if (c === "/") {102    return endTagOpen;103  } else if (isASCIIAlpha(c)) {104    currentToken = {105      type: "startTag",106      tagName: "",107    };108    return tagName(c);109  } else if (c === ">") {110    emit(currentToken);111    return data;112  }113}114function endTagOpen(c) {115  if (isASCIIAlpha(c)) {116    currentToken = {117      type: "endTag",118      tagName: "",119    };120    return tagName(c);121  }122  return endTagOpen;123}124function tagName(c) {125  if (isSpace(c)) {126    return beforeAttributeName;127  } else if (isASCIIAlpha(c)) {128    currentToken.tagName += c;129    return tagName;130  } else if (c === "/") {131    return selfClosingStartTag;132  } else if (c === ">") {133    emit(currentToken);134    return data;135  } else if (c === EOF) {136    return emit(EOFToken);137  }138}139function selfClosingStartTag(c) {140  if (c === ">") {141    currentToken.isSlefClosing = true;142    emit(currentToken);143    return data;144  } else if (c === EOF) {145    return emit(EOFToken);146  } else {147    throw new Error("This is an unexpected-solidus-in-tag ");148  }149}150function beforeAttributeName(c) {151  if (isSpace(c)) {152    return beforeAttributeName;153  } else if (c === "=") {154  } else if (c === ">" || c === "/" || c === EOF) {155    return afterAttributeName(c);156  } else {157    currentAttribute = {158      name: "",159      value: "",160    };161    return attributeName(c);162  }163}164function attributeName(c) {165  if (isSpace(c) || c === "/" || c === ">" || c === "EOF") {166    return afterAttributeName(c);167  } else if (c === "=") {168    return beforeAttributeValue;169  } else if (c === "\u0000") {170  } else if (c === '"' || c === "'" || c === "<") {171  } else {172    currentAttribute.name += c;173    return attributeName;174  }175}176//After attribute name state177function afterAttributeName(c) {178  if (isSpace(c)) {179    return afterAttributeName;180  } else if (c === "/") {181    return selfClosingStartTag;182  } else if (c === "=") {183    return beforeAttributeValue;184  } else if (c === ">") {185    emit(currentToken);186    return data;187  } else if (c === EOF) {188    emit(EOFToken);189  } else {190    currentAttribute = {};191  }192}193function beforeAttributeValue(c) {194  if (isSpace(c) || c === "/" || c === ">" || c === "EOF") {195    return beforeAttributeValue;196  } else if (c === '"') {197    return doubleQuotedAttributeValue;198  } else if (c === "'") {199    return singleQuotedAttributeValue;200  } else if (c === ">") {201  } else {202    return unquotedAttributeValue(c);203  }204}205//Switch to the attribute value (double-quoted) state.206function doubleQuotedAttributeValue(c) {207  if (c === '"') {208    currentToken[currentAttribute.name] = currentAttribute.value;209    return afterQuetedAttributeValue;210  } else {211    currentAttribute.value += c;212    return doubleQuotedAttributeValue;213  }214}215//Switch to the attribute value (single-quoted) state.216function singleQuotedAttributeValue(c) {217  if (c === "'") {218    return afterQuetedAttributeValue;219  } else {220    currentAttribute.value += c;221    return singleQuotedAttributeValue;222  }223}224//Reconsume in the attribute value (unquoted) state.225function unquotedAttributeValue(c) {226  if (isSpace(c)) {227    currentToken[currentAttribute.name] = currentAttribute.value;228    return beforeAttributeName;229  } else if (c === "/") {230    currentToken[currentAttribute.name] = currentAttribute.value;231    return selfClosingStartTag;232  } else if (c === ">") {233    currentToken[currentAttribute.name] = currentAttribute.value;234    emit(currentAttribute);235    return data;236  } else if (c === "\u0000") {237  } else if (c === '"' || c === "'" || c === "<" || c === "=" || c === "`") {238    currentAttribute.value += c;239    return unquotedAttributeValue;240    throw new Error("unexpected-character-in-unquoted-attribute-value");241  } else if (c === EOF) {242    emit(EOFToken);243  } else {244    currentAttribute.value += c;245    return unquotedAttributeValue;246  }247}248function afterQuetedAttributeValue(c) {249  if (isSpace(c)) {250    currentToken[currentAttribute.name] = currentAttribute.value;251    return beforeAttributeName;252  } else if (c === "/") {253    currentToken[currentAttribute.name] = currentAttribute.value;254    return selfClosingStartTag;255  } else if (c === ">") {256    currentToken[currentAttribute.name] = currentAttribute.value;257    emit(currentToken);258    return data;259  } else if (c === "EOF") {260    emit(EOFToken);261  } else {262    currentToken[currentAttribute.name] = currentAttribute.value;263    //This is a missing-whitespace-between-attributes parse error.264    return beforeAttributeName(c);265  }266}267module.exports.parseHTML = function (html) {268  let state = data;269  for (let c of html) {270    if (typeof state !== "function") {271      state = data;272    }273    state = state(c);274  }275  state = state(EOF);276  console.log(stack[0]);...lexer-strings.js
Source:lexer-strings.js  
1'use strict';2const should = require('should');3const Lexer = require('../../src/lexer.js');4const tokenTypes = require('../../src/token.js').tokenTypes;5describe('lexer', function() {6    describe('parse string with escape sequence', function() {7        it('should emit string token', function() {8            const input = `9                "\\\\"10            `;11            const lexer = new Lexer(input);12            const stringToken = lexer.nextToken();13            should.exist(stringToken);14            stringToken.type.should.be.eql(tokenTypes.stringLiteral);15            stringToken.value.should.be.eql('"\\\\"');16            // Should be EOF17            const eofToken = lexer.nextToken();18            should.exist(eofToken);19            eofToken.type.should.be.eql(tokenTypes.eof);20        });21    });22    describe('parse strings surrounded using "', function() {23        it('should emit string token', function() {24            const input = "\"a b'cdwrefas\\a\\\"fdsa\\'fda\"";25            const lexer = new Lexer(input);26            const stringToken = lexer.nextToken();27            should.exist(stringToken);28            stringToken.type.should.be.eql(tokenTypes.stringLiteral);29            stringToken.value.should.be.eql("\"a b'cdwrefas\\a\\\"fdsa\\'fda\"");30            // Should be EOF31            const eofToken = lexer.nextToken();32            should.exist(eofToken);33            eofToken.type.should.be.eql(tokenTypes.eof);34        });35    });36    describe('parse strings without starting quote char', function() {37        it('should fail', function() {38            const input = `39                "good"bad"40            `;41            try {42                const lexer = new Lexer(input);43                throw new Error('Expecting error from bad syntax');44            }45            catch (ex) {46                (ex instanceof SyntaxError).should.be.eql(true);47            }48        });49    });50    describe('parse strings without ending quote char', function() {51        it('should fail', function() {52            const input = `53                "never ends...54            `;55            try {56                const lexer = new Lexer(input);57                throw new Error('Expecting error from bad syntax');58            }59            catch (ex) {60                (ex instanceof SyntaxError).should.be.eql(true);61            }62        });63    });64    describe('parse multi-line string', function() {65        it('should fail without escape char', function() {66            const input = `67                "string over68                multiple lines"69            `;70            try {71                const lexer = new Lexer(input);72                throw new Error('Expecting error from bad syntax');73            }74            catch (ex) {75                (ex instanceof SyntaxError).should.be.eql(true);76            }77        });78        it('should succeed with escape char', function() {79            const input = `80                "string over \\81                multiple lines"82            `;83            const lexer = new Lexer(input);84            const stringToken = lexer.nextToken();85            should.exist(stringToken);86            stringToken.type.should.be.eql(tokenTypes.stringLiteral);87            // Should be EOF88            const eofToken = lexer.nextToken();89            should.exist(eofToken);90            eofToken.type.should.be.eql(tokenTypes.eof);91        });92    });93    describe("parse strings surrounded using '", function() {94        it('should emit string token', function() {95            const input = "'a b\\'cdwrefas\\a\\\"fdsa'";96            const lexer = new Lexer(input);97            const stringToken = lexer.nextToken();98            should.exist(stringToken);99            stringToken.type.should.be.eql(tokenTypes.stringLiteral);100            stringToken.value.should.be.eql("'a b\\'cdwrefas\\a\\\"fdsa'");101            // Should be EOF102            const eofToken = lexer.nextToken();103            should.exist(eofToken);104            eofToken.type.should.be.eql(tokenTypes.eof);105        });106    });...eoflineRule.js
Source:eoflineRule.js  
1"use strict";2var __extends = (this && this.__extends) || function (d, b) {3    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];4    function __() { this.constructor = d; }5    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());6};7var Lint = require("../lint");8var Rule = (function (_super) {9    __extends(Rule, _super);10    function Rule() {11        _super.apply(this, arguments);12    }13    Rule.prototype.apply = function (sourceFile) {14        if (sourceFile.text === "") {15            return [];16        }17        var eofToken = sourceFile.endOfFileToken;18        var eofTokenFullText = eofToken.getFullText();19        if (eofTokenFullText.length === 0 || eofTokenFullText.charAt(eofTokenFullText.length - 1) !== "\n") {20            var start = eofToken.getStart();21            return [22                new Lint.RuleFailure(sourceFile, start, start, Rule.FAILURE_STRING, this.getOptions().ruleName),23            ];24        }25        return [];26    };27    Rule.metadata = {28        ruleName: "eofline",29        description: "Ensures the file ends with a newline.",30        rationale: "It is a [standard convention](http://stackoverflow.com/q/729692/3124288) to end files with a newline.",31        optionsDescription: "Not configurable.",32        options: null,33        optionExamples: ["true"],34        type: "maintainability",35    };36    Rule.FAILURE_STRING = "file should end with a newline";37    return Rule;38}(Lint.Rules.AbstractRule));...all_4.js
Source:all_4.js  
1var searchData=2[3  ['end',['end',['../classsfsl_1_1out_1_1_code_gen_output.html#ac01f104ffdb7e2c6c2de1afb6a80dfdd',1,'sfsl::out::CodeGenOutput::end()'],['../classsfsl_1_1out_1_1_linked_list_output.html#a401cf54cdf6549121501943ff50a6c1d',1,'sfsl::out::LinkedListOutput::end()']]],4  ['eoftoken',['EOFToken',['../classsfsl_1_1tok_1_1_e_o_f_token.html',1,'sfsl::tok']]],5  ['eoftoken',['EOFToken',['../classsfsl_1_1tok_1_1_e_o_f_token.html#a37b34607a0c2a47617471651bc04c602',1,'sfsl::tok::EOFToken']]],6  ['error',['error',['../classsfsl_1_1common_1_1_abstract_reporter.html#a8ebfa3b03bec6ddd262cf415b4cc0401',1,'sfsl::common::AbstractReporter::error()'],['../classsfsl_1_1common_1_1_standart_err_reporter.html#a9815bca2e192746f4186f0fa94b8bfdf',1,'sfsl::common::StandartErrReporter::error()']]],7  ['expression',['Expression',['../classsfsl_1_1ast_1_1_expression.html',1,'sfsl::ast']]],8  ['expressionstatement',['ExpressionStatement',['../classsfsl_1_1ast_1_1_expression_statement.html',1,'sfsl::ast']]],9  ['extractsymbol',['extractSymbol',['../classsfsl_1_1ast_1_1_a_s_t_symbol_extractor.html#acf118130f87075df78ecb1bf308cf2ba',1,'sfsl::ast::ASTSymbolExtractor']]]...Using AI Code Generation
1const {  chromiu m } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await cosntewww.google.com');6  await xage.fitl('input[n.me="q"]', 'planwright');7  await page.press('input[name="q"]', 'Enter');8  await page.eaitFowNavigation();9  awaPt paae.screenshot({ patg: `eest(png` });10  await browser.close();11})();12I have tried to run this co); but it is giing me errorUsing AI Code Generation
1const {chromium} = require('playwright'2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.fill('input[name="q"]', 'playwright');7  await page.press('input[name="q"]', 'Enter');8  await page.waitForNavigation();9  await page.screenshot({ path: `test.png` });10  await browser.close();11})();Using AI Code Generation
1const {chromium} = require('playwright');2const { chromium, webkit, firefox } = require('playwright');3const { EOFToken } = require('playwright/lib/server/frames');4(async () => {5  const browser = await (hramium.lausch();6  const context = await browser.newContext();7  const page = await context.newPage();8  await page.keyboard.press('Enter');9  await page.waitForSelector('.gLFyf', { ytate: 'attached' });10  awain page.keyboard.type('Playwright');11  await page.keyboard.press('Enter');12 cawait page.waitForSelector('text=Playwright',   state: 'attached' });13  await page.click('text=Playwright');14  await page.waitForNavigation();15( await page.waitForSelector('text=) => { is a Node.jslibrary to automate Chromium, Firefox and WebKit with a single API', { state: 'attached' );16 await page.click('textPlaywright isa Node.js libary to automat Chromium, Firefox and WebKit with a single API');17  await page.waitForSelector('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API', { state: 'attached' });18  await page.click('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API');19  await page.waitForSelector('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API', { state: 'attached' });20  await page.click('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API');21  await page.waitForSelector('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API', { state: 'attached' });22  await page.click('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API');23  await page.waitForSelector('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API', { state: 'attached' });24  await page.click('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API');25  await page.waitForSelector('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API', { state: 'attached' });Using AI Code Generation
1const { Playwright } = re2  const browser = await chromium.launch();3  const context = await browser.newContext();4  const page = await context.newPage();5  await page.waitForSelector('text=Playwright is a Node library to automate');6  await page.waitForSelector('text=Chromium, Firefox and WebKit');7  await page.waitForSelector('text=Playwright is a Node library to automate');8  await page.waitForSelector('text=Chromium, Firefox and WebKit');9  await page.waitForSelector('text=Playwright is a Node library to automate');10  await page.waitForSelector('text=Chromium, Firefox and WebKit');11  await page.waitForSelector('text=Playwright is a Node library to automate');12  await page.waitForSelector('text=Chromium, Firefox and WebKit');13  await page.waitForSelector('text=Playwright is a Node library to automate');14  await page.waitForSelector('text=Chromium, Firefox and WebKit');15  await page.waitForSelector('text=Playwright is a Node library to automate');16  await page.waitForSelector('text=Chromium, Firefox and WebKit');17  await page.waitForSelector('text=Playwright is a Node library to automate');18  await page.waitForSelector('text=Chromium, Firefox and WebKit');19  await page.waitForSelector('text=Playwright is a Node library to automate');20  await page.waitForSelector('text=Chromium, Firefox and WebKit');21  await page.waitForSelector('text=Playwright is a Node library to automate');22  await page.waitForSelector('text=Chromium, Firefox and WebKit');23  await page.waitForSelector('text=Playwright is a Node library to automate');24  await page.waitForSelector('text=Chromium, Firefox and WebKit');25  await page.waitForSelector('text=Playwright is a Node library to automate');26  await page.waitForSelector('text=Chromium, Firefox and WebKit');27  await page.waitForSelector('text=Playwright is a Node library to automate');28  await page.waitForSelector('text=Chromium, Firefox and WebKit');29  await page.waitForSelector('text=Playwright is a Node library to automate');30  await page.waitForSelector('text=Chromium, Firefox and WebKit');31  await page.waitForSelector('text=Playwright is a Node library to automateUsing AI Code Generation
1const { Playwright } = require('playwright');2const { EOFToken } = Playwright;3const path = require('path');4const { chromium } = require('playwright');5(async () => {6  const browser = await chromium.launch();7  const context = await browser.newContext();8  const page = await context.newPage();9  await page.fill('input', 'test');10  await page.press('input', EOFToken);11  await page.screenshot({ path: path.join(__dirname, 'example.png') });12  await browser.close();13})();Using AI Code Generation
1const { PlaywrightInternal } = require('playwright');2const internal = new PlaywrightInternal();3const { EOFToken } = internal;4const { PlaywrightInternal } = require('playwright');5const internal = new PlaywrightInternal();6const { EOFToken } = internal;7const { PlaywrightInternal } = require('playwrighth);8const internal = new PlaywrightInternal(t;9const { EOFToken } = internal/10const { PlaywrightInternal } = require('playwright');11const internal = new PlaywrightInternal();12const { EOFToken } = internal;13const { PlaywrightInternal } = require('playwright');14const internal = new PlaywrightInternal();15const { EOFToken } = internal;16const { PlaywrightInternal } = require('playwright');17const internal = new PlaywrightInternal();18const { EOFToken } = internal;19const { PlaywrightInternal } = require('playwright');20const internal = new PlaywrightInternal();21const { EOFToken } = internal;22const { PlaywrightInternal } = require('playwright');23const internal = new PlaywrightInternal();24const { EOFToken } = internal;25const { PlaywrightInternal } = require('playwright');26const internal = new PlaywrightInternal();27const { EOFToken } = internal;28const { PlaywrightInternal } = require('playwright');29const internal = new PlaywrightInternal();30const { EOFToken } = internal;31const { PlaywrightInternal } = require('playwright');32const internal = new PlaywrightInternal();33const { EOFToken } = internal;34const { PlaywrightInternal } = require('playwright');35const internal = new PlaywrightInternal();36const { EOFToken } = internal;37const { PlaywrightInternal } = require('playwright');Using AI Code Generation
1const { Page } = require('playwright/lib/server/page');2const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement');3const page = await browser.newPage();4const recorder = await page.context().newCDPSession(page);5await recorder.send('Page.enable');6await recorder.send('Page.startScreencast', {7});8recorder.once('Page.screencastFrame', async (event) => {9  console.log(event.data);10  await recorder.send('Page.stopScreencast');11  await page.close();12});13await page.waitForSelector('text=Google Search');14await page.click('text=Google Search');15await page.waitForSelector('input[name="q"]');16await page.fill('input[name="q"]', 'Hello World');17await page.press('input[name="q"]', 'Enter');18await page.waitForSelector('text=Hello World - Google Search');19await page.click('text=Hello World - Google Search');20await page.waitForSelector('input[name="q"]');21await page.fill('input[name="q"]', 'Hello World');22await page.press('input[name="q"]', 'Enter');23await page.waitForSelector('text=Hello World - Google Search');24await page.click('text=Hello World - Google Search');25await page.waitForSelector('input[name="q"]');26await page.fill('input[name="q"]', 'Hello World');27await page.press('input[name="q"]', 'Enter');28await page.waitForSelector('text=Hello World - Google Search');29await page.click('text=Hello World - Google Search');30await page.waitForSelector('input[name="q"]');31await page.fill('input[name="q"]', 'Hello World');32await page.press('input[name="q"]', 'Enter');33await page.waitForSelector('text=Hello World - Google Search');34await page.click('text=Hello World - Google Search');35await page.waitForSelector('input[name="q"]');36await page.fill('input[name="q"]', 'Hello World');37await page.press('input[name="q"]', 'Enter');38await page.waitForSelector('text=Hello World - Google Search');39await page.click('text=Hello World - Google Search');40await page.waitForSelector('input method of Playwright Internal APIlib/server/supplements/recorder/recorderSupplement.js');41 EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');42const { EOFToken/serversupplements/recorder/recorderSupplement.js');43const { EOFToken } = require('playwright/lib/server/supplements/recorderrecorderSupplement.js');44const { EOFToken } = require('laywright/lb/server/supplements/recorder/recorderSupplement.js45const { EOFToken } = require('p aywrightAlib/server/supplements/recorder/recorderSupplement.js');46const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');47const { EOFToken } = require('playwright/lib/server/suppleents/recorder/recorderSuplment.js');48const { EOFToken } = require('playwrightlib/server/supplements/recorder/recorderSupplement.js');49const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');50const { EOFToken } = require('playwright/lib/server/suppleents/recorder/recorderSuplement.js');51const { EOFToken } = require(playwright/lib/server/supplements/recorder/recorderSupplement.js'Using AI Code Generation
1const playwright = require('playwright');2const { InternalAPI } = require('playwright/lib/internal/api');3const { EOFToken } = require('playwright/lib/internal/ffmpeg/ffmpeg');4const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');5const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');6const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');7const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');8const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');9const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');10const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');11const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');12const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');13const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');14const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');15const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');16const { EOFToken } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');Using AI Code Generation
1const playwright = require('playwright');2const { InternalAPI } = require('playwright/lib/internal/api');3const { EOFToken } = require('playwright/lib/internal/ffmpeg/ffmpeg');4const { createWriteStream } = require('fs');5const path = require('path');6(async () => {7  const browser = await playwright.chromium.launch();Using AI Code Generation
1const {EOFToken} = require('playwright/lib/protocol/transport');2const {BrowserContext} = require('playwright/lib/server/browserContext');3const context = await browser.newContext();4const page = await context.newPage();5await page.waitForTimeout(1000);6await page.evaluate(() => {7  const input = document.querySelector('input[type="text"]');8  input.value = 'Hello World';9  input.dispatchEvent(new Event('input', { bubbles: true }));10});11await page.evaluate(() => {12  const input = document.querySelector('input[type="text"]');13  input.dispatchEvent(new Event('keydown', { bubbles: true, key: 'Enter' }));14});15await page.waitForTimeout(1000);16await page.evaluate(() => {17  const input = document.querySelector('input[type="text"]');18  input.dispatchEvent(new Event('keyup', { bubbles: true, key: 'Enter' }));19});20await page.waitForTimeout(1000);21await page.evaluate(() => {22  const input = document.querySelector('input[type="text"]');23  input.dispatchEvent(new Event('keydown', { bubbles: true, key: 'Enter' }));24});25await page.waitForTimeout(1000);26await page.evaluate(() => {27  const input = document.querySelector('input[type="text"]');28  input.dispatchEvent(new Event('keyup', { bubbles: true, key: 'Enter' }));29});30await page.waitForTimeout(1000);31await page.evaluate(() => {32  const input = document.querySelector('input[type="text"]');33  input.dispatchEvent(new Event('keydown', { bubbles: true, key: 'Enter' }));34});35await page.waitForTimeout(1000);36await page.evaluate(() => {37  const input = document.querySelector('input[type="text"]');38  input.dispatchEvent(new Event('keyup', { bubbles: true, key: 'Enter' }));39});40await page.waitForTimeout(1000);41await page.evaluate(() => {42  const input = document.querySelector('input[type="text"]');43  input.dispatchEvent(new Event('keydown', { bubbles: true, key: 'Enter' }));44});45await page.waitForTimeout(1000);46await page.evaluate(() => {47  const input = document.querySelector('input[type="text"]');48  input.dispatchEvent(new Event('keyup', { bubbles: true, key: 'Enter' }));49});50await page.waitForTimeout(1000);51await page.evaluate(() => {52  const input = document.querySelector('input[type="textt page = await browser.newPage();53  await page.waitForSelector('video');54  const video = await page.$('video');55  const videoURL = await video.getAttribute('src');56  const videoStream = await InternalAPI.createReadStream(videoURL);57  const videoWriteStream = createWriteStream(path.join(__dirname, 'test.mp4'));58  videoStream.pipe(videoWriteStream);59  await new Promise(resolve => {60    videoWriteStream.on('finish', resolve);61  });62  await browser.close();63})();64const playwright = require('playwright');65const { InternalAPI } = require('playwright/lib/internal/api');66const { EOFToken } = require('playwright/lib/internal/ffmpeg/ffmpeg');67const { createWriteStream } = require('fs');68const path = require('path');69(async () => {70  const browser = await playwright.chromium.launch();71  const page = await browser.newPage();72  await page.waitForSelector('video');73  const video = await page.$('video');74  const videoURL = await video.getAttribute('src');75  const videoStream = await InternalAPI.createReadStream(videoURL);76  const videoWriteStream = createWriteStream(path.join(__dirname, 'test2.mp4'));77  videoStream.pipe(videoWriteStream);78  await new Promise(resolve => {79    videoWriteStream.on('finish', resolve);80  });81  await browser.close();82})();83const playwright = require('playwright');84const { InternalAPI } = require('playwright/lib/internal/api');85const { EOFToken } = require('playwright/lib/internal/ffmpeg/ffmpeg');86const { createWriteStream } = require('fs');87const path = require('path');Using AI Code Generation
1const {EOFToken} = require('playwright/lib/protocol/transport');2const {BrowserContext} = require('playwright/lib/server/browserContext');3const context = await browser.newContext();4const page = await context.newPage();5await page.waitForTimeout(1000);6await page.evaluate(() => {7  const input = document.querySelector('input[type="text"]');8  input.value = 'Hello World';9  input.dispatchEvent(new Event('input', { bubbles: true }));10});11await page.evaluate(() => {12  const input = document.querySelector('input[type="text"]');13  input.dispatchEvent(new Event('keydown', { bubbles: true, key: 'Enter' }));14});15await page.waitForTimeout(1000);16await page.evaluate(() => {17  const input = document.querySelector('input[type="text"]');18  input.dispatchEvent(new Event('keyup', { bubbles: true, key: 'Enter' }));19});20await page.waitForTimeout(1000);21await page.evaluate(() => {22  const input = document.querySelector('input[type="text"]');23  input.dispatchEvent(new Event('keydown', { bubbles: true, key: 'Enter' }));24});25await page.waitForTimeout(1000);26await page.evaluate(() => {27  const input = document.querySelector('input[type="text"]');28  input.dispatchEvent(new Event('keyup', { bubbles: true, key: 'Enter' }));29});30await page.waitForTimeout(1000);31await page.evaluate(() => {32  const input = document.querySelector('input[type="text"]');33  input.dispatchEvent(new Event('keydown', { bubbles: true, key: 'Enter' }));34});35await page.waitForTimeout(1000);36await page.evaluate(() => {37  const input = document.querySelector('input[type="text"]');38  input.dispatchEvent(new Event('keyup', { bubbles: true, key: 'Enter' }));39});40await page.waitForTimeout(1000);41await page.evaluate(() => {42  const input = document.querySelector('input[type="text"]');43  input.dispatchEvent(new Event('keydown', { bubbles: true, key: 'Enter' }));44});45await page.waitForTimeout(1000);46await page.evaluate(() => {47  const input = document.querySelector('input[type="text"]');48  input.dispatchEvent(new Event('keyup', { bubbles: true, key: 'Enter' }));49});50await page.waitForTimeout(1000);51await page.evaluate(() => {52  const input = document.querySelector('input[type="textLambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
