pax_global_header00006660000000000000000000000064141432240320014505gustar00rootroot0000000000000052 comment=e7cf231a6d2b3e139e231a284bf85c3c0ea34221 htmlparser2-7.2.0/000077500000000000000000000000001414322403200137565ustar00rootroot00000000000000htmlparser2-7.2.0/.eslintrc.json000066400000000000000000000042751414322403200165620ustar00rootroot00000000000000{ "extends": ["eslint:recommended", "prettier"], "env": { "node": true, "es6": true }, "rules": { "eqeqeq": [2, "smart"], "no-caller": 2, "dot-notation": 2, "no-var": 2, "prefer-const": 2, "prefer-arrow-callback": [2, { "allowNamedFunctions": true }], "arrow-body-style": [2, "as-needed"], "object-shorthand": 2, "prefer-template": 2, "one-var": [2, "never"], "prefer-destructuring": [2, { "object": true }], "capitalized-comments": 2, "multiline-comment-style": [2, "starred-block"], "spaced-comment": 2, "yoda": [2, "never"], "curly": [2, "multi-line"], "no-else-return": 2 }, "overrides": [ { "files": "*.ts", "extends": [ "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", "prettier" ], "parserOptions": { "sourceType": "module", "project": "./tsconfig.eslint.json" }, "rules": { "@typescript-eslint/prefer-for-of": 0, "@typescript-eslint/member-ordering": 0, "@typescript-eslint/explicit-function-return-type": 0, "@typescript-eslint/no-unused-vars": 0, "@typescript-eslint/no-use-before-define": [ 2, { "functions": false } ], "@typescript-eslint/consistent-type-definitions": [ 2, "interface" ], "@typescript-eslint/prefer-function-type": 2, "@typescript-eslint/no-unnecessary-type-arguments": 2, "@typescript-eslint/prefer-string-starts-ends-with": 2, "@typescript-eslint/prefer-readonly": 2, "@typescript-eslint/prefer-includes": 2, "@typescript-eslint/no-unnecessary-condition": 2, "@typescript-eslint/switch-exhaustiveness-check": 2, "@typescript-eslint/prefer-nullish-coalescing": 2 } } ] } htmlparser2-7.2.0/.gitattributes000066400000000000000000000001031414322403200166430ustar00rootroot00000000000000# Auto detect text files and perform LF normalization * text eol=lfhtmlparser2-7.2.0/.github/000077500000000000000000000000001414322403200153165ustar00rootroot00000000000000htmlparser2-7.2.0/.github/FUNDING.yml000066400000000000000000000000511414322403200171270ustar00rootroot00000000000000github: [fb55] tidelift: npm/htmlparser2 htmlparser2-7.2.0/.github/dependabot.yml000066400000000000000000000004401414322403200201440ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: npm directory: "/" schedule: interval: daily open-pull-requests-limit: 10 versioning-strategy: increase - package-ecosystem: "github-actions" directory: "/" schedule: interval: daily htmlparser2-7.2.0/.github/workflows/000077500000000000000000000000001414322403200173535ustar00rootroot00000000000000htmlparser2-7.2.0/.github/workflows/codeql-analysis.yml000066400000000000000000000013411414322403200231650ustar00rootroot00000000000000name: "CodeQL" on: push: branches: [master] pull_request: # The branches below must be a subset of the branches above branches: [master] schedule: - cron: "0 0 * * 0" jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write steps: - name: Checkout repository uses: actions/checkout@v2 - name: Initialize CodeQL uses: github/codeql-action/init@v1 with: languages: "javascript" - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v1 htmlparser2-7.2.0/.github/workflows/dependabot-automerge.yml000066400000000000000000000022361414322403200241740ustar00rootroot00000000000000# Based on https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/automating-dependabot-with-github-actions#enable-auto-merge-on-a-pull-request name: Dependabot auto-merge on: pull_request_target permissions: pull-requests: write contents: write jobs: dependabot: runs-on: ubuntu-latest if: ${{ github.actor == 'dependabot[bot]' }} steps: - name: Dependabot metadata id: metadata uses: dependabot/fetch-metadata@v1.1.1 with: github-token: "${{ secrets.GITHUB_TOKEN }}" - name: Enable auto-merge for Dependabot PRs # Automatically merge semver-patch and semver-minor PRs if: "${{ steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch' }}" run: gh pr merge --auto --squash "$PR_URL" env: PR_URL: ${{github.event.pull_request.html_url}} GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} htmlparser2-7.2.0/.github/workflows/nodejs-test.yml000066400000000000000000000030641414322403200223400ustar00rootroot00000000000000name: Node.js CI on: push: branches-ignore: - "dependabot/**" pull_request: env: CI: true FORCE_COLOR: 2 NODE_COV: 16 # The Node.js version to run coveralls on jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: node-version: 16 cache: npm - run: npm ci - run: npm run lint test: name: Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: node: - 10 - 12 - 14 - 16 steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node }} uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} cache: npm - run: npm ci - run: npm run build --if-present - name: Run Jest run: npm run test:jest if: matrix.node != env.NODE_COV - name: Run Jest with coverage run: npm run test:jest -- --coverage if: matrix.node == env.NODE_COV - name: Run Coveralls uses: coverallsapp/github-action@1.1.3 if: matrix.node == env.NODE_COV continue-on-error: true with: github-token: "${{ secrets.GITHUB_TOKEN }}" htmlparser2-7.2.0/.gitignore000066400000000000000000000000351414322403200157440ustar00rootroot00000000000000node_modules/ coverage/ lib/ htmlparser2-7.2.0/.prettierignore000066400000000000000000000000351414322403200170170ustar00rootroot00000000000000node_modules/ coverage/ lib/ htmlparser2-7.2.0/LICENSE000066400000000000000000000021201414322403200147560ustar00rootroot00000000000000Copyright 2010, 2011, Chris Winberry . All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.htmlparser2-7.2.0/README.md000066400000000000000000000164371414322403200152500ustar00rootroot00000000000000# htmlparser2 [![NPM version](http://img.shields.io/npm/v/htmlparser2.svg?style=flat)](https://npmjs.org/package/htmlparser2) [![Downloads](https://img.shields.io/npm/dm/htmlparser2.svg?style=flat)](https://npmjs.org/package/htmlparser2) [![Build Status](https://img.shields.io/github/workflow/status/fb55/htmlparser2/Node.js%20Test?label=tests&style=flat)](https://github.com/fb55/htmlparser2/actions?query=workflow%3A%22Node.js+Test%22) [![Coverage](http://img.shields.io/coveralls/fb55/htmlparser2.svg?style=flat)](https://coveralls.io/r/fb55/htmlparser2) The fast & forgiving HTML/XML parser. ## Installation npm install htmlparser2 A live demo of `htmlparser2` is available [here](https://astexplorer.net/#/2AmVrGuGVJ). ## Ecosystem | Name | Description | | ------------------------------------------------------------- | ------------------------------------------------------- | | [htmlparser2](https://github.com/fb55/htmlparser2) | Fast & forgiving HTML/XML parser | | [domhandler](https://github.com/fb55/domhandler) | Handler for htmlparser2 that turns documents into a DOM | | [domutils](https://github.com/fb55/domutils) | Utilities for working with domhandler's DOM | | [css-select](https://github.com/fb55/css-select) | CSS selector engine, compatible with domhandler's DOM | | [cheerio](https://github.com/cheeriojs/cheerio) | The jQuery API for domhandler's DOM | | [dom-serializer](https://github.com/cheeriojs/dom-serializer) | Serializer for domhandler's DOM | ## Usage `htmlparser2` itself provides a callback interface that allows consumption of documents with minimal allocations. For a more ergonomic experience, read [Getting a DOM](#getting-a-dom) below. ```javascript const htmlparser2 = require("htmlparser2"); const parser = new htmlparser2.Parser({ onopentag(name, attributes) { /* * This fires when a new tag is opened. * * If you don't need an aggregated `attributes` object, * have a look at the `onopentagname` and `onattribute` events. */ if (name === "script" && attributes.type === "text/javascript") { console.log("JS! Hooray!"); } }, ontext(text) { /* * Fires whenever a section of text was processed. * * Note that this can fire at any point within text and you might * have to stich together multiple pieces. */ console.log("-->", text); }, onclosetag(tagname) { /* * Fires when a tag is closed. * * You can rely on this event only firing when you have received an * equivalent opening tag before. Closing tags without corresponding * opening tags will be ignored. */ if (tagname === "script") { console.log("That's it?!"); } }, }); parser.write( "Xyz
")).toMatchSnapshot(); }); it("for normal style tag", () => { expect(tokenize("
")).toMatchSnapshot(); }); it("for normal sitle tag", () => { expect(tokenize("
")).toMatchSnapshot(); }); }); it("should not lose data when pausing", () => { const log: unknown[][] = []; const tokenizer = new Tokenizer( {}, new Proxy({} as any, { get(_, prop) { return (...args: unknown[]) => { if (prop === "ontext") { tokenizer.pause(); } log.push([prop, ...args]); }; }, }) ); tokenizer.write("& it up!"); tokenizer.resume(); tokenizer.resume(); tokenizer.end(); expect(log).toMatchSnapshot(); }); }); htmlparser2-7.2.0/src/Tokenizer.ts000066400000000000000000001007571414322403200171010ustar00rootroot00000000000000import decodeCodePoint from "entities/lib/decode_codepoint"; import { htmlDecodeTree, xmlDecodeTree, BinTrieFlags, determineBranch, } from "entities/lib/decode"; const enum CharCodes { Tab = 0x9, // "\t" NewLine = 0xa, // "\n" FormFeed = 0xc, // "\f" CarriageReturn = 0xd, // "\r" Space = 0x20, // " " ExclamationMark = 0x21, // "!" Num = 0x23, // "#" Amp = 0x26, // "&" SingleQuote = 0x27, // "'" DoubleQuote = 0x22, // '"' Dash = 0x2d, // "-" Slash = 0x2f, // "/" Zero = 0x30, // "0" Nine = 0x39, // "9" Semi = 0x3b, // ";" Lt = 0x3c, // "<" Eq = 0x3d, // "=" Gt = 0x3e, // ">" Questionmark = 0x3f, // "?" UpperA = 0x41, // "A" LowerA = 0x61, // "a" UpperF = 0x46, // "F" LowerF = 0x66, // "f" UpperZ = 0x5a, // "Z" LowerZ = 0x7a, // "z" LowerX = 0x78, // "x" OpeningSquareBracket = 0x5b, // "[" } /** All the states the tokenizer can be in. */ const enum State { Text = 1, BeforeTagName, // After < InTagName, InSelfClosingTag, BeforeClosingTagName, InClosingTagName, AfterClosingTagName, // Attributes BeforeAttributeName, InAttributeName, AfterAttributeName, BeforeAttributeValue, InAttributeValueDq, // " InAttributeValueSq, // ' InAttributeValueNq, // Declarations BeforeDeclaration, // ! InDeclaration, // Processing instructions InProcessingInstruction, // ? // Comments & CDATA BeforeComment, CDATASequence, InSpecialComment, InCommentLike, // Special tags BeforeSpecialS, // Decide if we deal with `= CharCodes.Zero && c <= CharCodes.Nine; } function isASCIIAlpha(c: number): boolean { return ( (c >= CharCodes.LowerA && c <= CharCodes.LowerZ) || (c >= CharCodes.UpperA && c <= CharCodes.UpperZ) ); } export interface Callbacks { onattribdata(value: string): void; onattribend(quote: string | undefined | null): void; onattribname(name: string): void; oncdata(data: string): void; onclosetag(name: string): void; oncomment(data: string): void; ondeclaration(content: string): void; onend(): void; onerror(error: Error, state?: State): void; onopentagend(): void; onopentagname(name: string): void; onprocessinginstruction(instruction: string): void; onselfclosingtag(): void; ontext(value: string): void; } /** * Sequences used to match longer strings. * * We don't have `Script`, `Style`, or `Title` here. Instead, we re-use the *End * sequences with an increased offset. */ const Sequences = { Cdata: new Uint16Array([0x43, 0x44, 0x41, 0x54, 0x41, 0x5b]), // CDATA[ CdataEnd: new Uint16Array([0x5d, 0x5d, 0x3e]), // ]]> CommentEnd: new Uint16Array([0x2d, 0x2d, 0x3e]), // `-->` ScriptEnd: new Uint16Array([ 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, ]), // ` this.sectionStart) { this.cbs.ontext(this.getSection()); } this._state = State.BeforeTagName; this.sectionStart = this._index; } else if (this.decodeEntities && c === CharCodes.Amp) { this._state = State.BeforeEntity; } } private currentSequence!: Uint16Array; private sequenceIndex = 0; private stateSpecialStartSequence(c: number) { const isEnd = this.sequenceIndex === this.currentSequence.length; const isMatch = isEnd ? // If we are at the end of the sequence, make sure the tag name has ended isEndOfTagSection(c) : // Otherwise, do a case-insensitive comparison (c | 0x20) === this.currentSequence[this.sequenceIndex]; if (!isMatch) { this.isSpecial = false; } else if (!isEnd) { this.sequenceIndex++; return; } this.sequenceIndex = 0; this._state = State.InTagName; this.stateInTagName(c); } /** Look for an end tag. For tags, also decode entities. */ private stateInSpecialTag(c: number) { if (this.sequenceIndex === this.currentSequence.length) { if (c === CharCodes.Gt || isWhitespace(c)) { const endOfText = this._index - this.currentSequence.length; if (this.sectionStart < endOfText) { // Spoof the index so that reported locations match up. const actualIndex = this._index; this._index = endOfText; this.cbs.ontext(this.getSection()); this._index = actualIndex; } this.isSpecial = false; this.sectionStart = endOfText + 2; // Skip over the `</` this.stateInClosingTagName(c); return; // We are done; skip the rest of the function. } this.sequenceIndex = 0; } if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) { this.sequenceIndex += 1; } else if (this.sequenceIndex === 0) { if (this.currentSequence === Sequences.TitleEnd) { // We have to parse entities in <title> tags. if (this.decodeEntities && c === CharCodes.Amp) { this._state = State.BeforeEntity; } } else if (this.fastForwardTo(CharCodes.Lt)) { // Outside of <title> tags, we can fast-forward. this.sequenceIndex = 1; } } else { // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`. this.sequenceIndex = Number(c === CharCodes.Lt); } } private stateCDATASequence(c: number) { if (c === Sequences.Cdata[this.sequenceIndex]) { if (++this.sequenceIndex === Sequences.Cdata.length) { this._state = State.InCommentLike; this.currentSequence = Sequences.CdataEnd; this.sequenceIndex = 0; this.sectionStart = this._index + 1; } } else { this.sequenceIndex = 0; this._state = State.InDeclaration; this.stateInDeclaration(c); // Reconsume the character } } /** * When we wait for one specific character, we can speed things up * by skipping through the buffer until we find it. * * @returns Whether the character was found. */ private fastForwardTo(c: number): boolean { while (++this._index < this.buffer.length) { if (this.buffer.charCodeAt(this._index) === c) { return true; } } /* * We increment the index at the end of the `parse` loop, * so set it to `buffer.length - 1` here. * * TODO: Refactor `parse` to increment index before calling states. */ this._index = this.buffer.length - 1; return false; } /** * Comments and CDATA end with `-->` and `]]>`. * * Their common qualities are: * - Their end sequences have a distinct character they start with. * - That character is then repeated, so we have to check multiple repeats. * - All characters but the start character of the sequence can be skipped. */ private stateInCommentLike(c: number) { if (c === this.currentSequence[this.sequenceIndex]) { if (++this.sequenceIndex === this.currentSequence.length) { // Remove 2 trailing chars const section = this.buffer.slice( this.sectionStart, this._index - 2 ); if (this.currentSequence === Sequences.CdataEnd) { this.cbs.oncdata(section); } else { this.cbs.oncomment(section); } this.sequenceIndex = 0; this.sectionStart = this._index + 1; this._state = State.Text; } } else if (this.sequenceIndex === 0) { // Fast-forward to the first character of the sequence if (this.fastForwardTo(this.currentSequence[0])) { this.sequenceIndex = 1; } } else if (c !== this.currentSequence[this.sequenceIndex - 1]) { // Allow long sequences, eg. --->, ]]]> this.sequenceIndex = 0; } } /** * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name. * * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar). * We allow anything that wouldn't end the tag. */ private isTagStartChar(c: number) { return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c); } private startSpecial(sequence: Uint16Array, offset: number) { this.isSpecial = true; this.currentSequence = sequence; this.sequenceIndex = offset; this._state = State.SpecialStartSequence; } private stateBeforeTagName(c: number) { if (c === CharCodes.ExclamationMark) { this._state = State.BeforeDeclaration; this.sectionStart = this._index + 1; } else if (c === CharCodes.Questionmark) { this._state = State.InProcessingInstruction; this.sectionStart = this._index + 1; } else if (this.isTagStartChar(c)) { const lower = c | 0x20; this.sectionStart = this._index; if (!this.xmlMode && lower === Sequences.TitleEnd[2]) { this.startSpecial(Sequences.TitleEnd, 3); } else { this._state = !this.xmlMode && lower === Sequences.ScriptEnd[2] ? State.BeforeSpecialS : State.InTagName; } } else if (c === CharCodes.Slash) { this._state = State.BeforeClosingTagName; } else { this._state = State.Text; this.stateText(c); } } private stateInTagName(c: number) { if (isEndOfTagSection(c)) { this.cbs.onopentagname(this.getSection()); this.sectionStart = -1; this._state = State.BeforeAttributeName; this.stateBeforeAttributeName(c); } } private stateBeforeClosingTagName(c: number) { if (isWhitespace(c)) { // Ignore } else if (c === CharCodes.Gt) { this._state = State.Text; } else { this._state = this.isTagStartChar(c) ? State.InClosingTagName : State.InSpecialComment; this.sectionStart = this._index; } } private stateInClosingTagName(c: number) { if (c === CharCodes.Gt || isWhitespace(c)) { this.cbs.onclosetag(this.getSection()); this.sectionStart = -1; this._state = State.AfterClosingTagName; this.stateAfterClosingTagName(c); } } private stateAfterClosingTagName(c: number) { // Skip everything until ">" if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) { this._state = State.Text; this.sectionStart = this._index + 1; } } private stateBeforeAttributeName(c: number) { if (c === CharCodes.Gt) { this.cbs.onopentagend(); if (this.isSpecial) { this._state = State.InSpecialTag; this.sequenceIndex = 0; } else { this._state = State.Text; } this.baseState = this._state; this.sectionStart = this._index + 1; } else if (c === CharCodes.Slash) { this._state = State.InSelfClosingTag; } else if (!isWhitespace(c)) { this._state = State.InAttributeName; this.sectionStart = this._index; } } private stateInSelfClosingTag(c: number) { if (c === CharCodes.Gt) { this.cbs.onselfclosingtag(); this._state = State.Text; this.baseState = State.Text; this.sectionStart = this._index + 1; this.isSpecial = false; // Reset special state, in case of self-closing special tags } else if (!isWhitespace(c)) { this._state = State.BeforeAttributeName; this.stateBeforeAttributeName(c); } } private stateInAttributeName(c: number) { if (c === CharCodes.Eq || isEndOfTagSection(c)) { this.cbs.onattribname(this.getSection()); this.sectionStart = -1; this._state = State.AfterAttributeName; this.stateAfterAttributeName(c); } } private stateAfterAttributeName(c: number) { if (c === CharCodes.Eq) { this._state = State.BeforeAttributeValue; } else if (c === CharCodes.Slash || c === CharCodes.Gt) { this.cbs.onattribend(undefined); this._state = State.BeforeAttributeName; this.stateBeforeAttributeName(c); } else if (!isWhitespace(c)) { this.cbs.onattribend(undefined); this._state = State.InAttributeName; this.sectionStart = this._index; } } private stateBeforeAttributeValue(c: number) { if (c === CharCodes.DoubleQuote) { this._state = State.InAttributeValueDq; this.sectionStart = this._index + 1; } else if (c === CharCodes.SingleQuote) { this._state = State.InAttributeValueSq; this.sectionStart = this._index + 1; } else if (!isWhitespace(c)) { this.sectionStart = this._index; this._state = State.InAttributeValueNq; this.stateInAttributeValueNoQuotes(c); // Reconsume token } } private handleInAttributeValue(c: number, quote: number) { if ( c === quote || (!this.decodeEntities && this.fastForwardTo(quote)) ) { this.cbs.onattribdata(this.getSection()); this.sectionStart = -1; this.cbs.onattribend(String.fromCharCode(quote)); this._state = State.BeforeAttributeName; } else if (this.decodeEntities && c === CharCodes.Amp) { this.baseState = this._state; this._state = State.BeforeEntity; } } private stateInAttributeValueDoubleQuotes(c: number) { this.handleInAttributeValue(c, CharCodes.DoubleQuote); } private stateInAttributeValueSingleQuotes(c: number) { this.handleInAttributeValue(c, CharCodes.SingleQuote); } private stateInAttributeValueNoQuotes(c: number) { if (isWhitespace(c) || c === CharCodes.Gt) { this.cbs.onattribdata(this.getSection()); this.sectionStart = -1; this.cbs.onattribend(null); this._state = State.BeforeAttributeName; this.stateBeforeAttributeName(c); } else if (this.decodeEntities && c === CharCodes.Amp) { this.baseState = this._state; this._state = State.BeforeEntity; } } private stateBeforeDeclaration(c: number) { if (c === CharCodes.OpeningSquareBracket) { this._state = State.CDATASequence; this.sequenceIndex = 0; } else { this._state = c === CharCodes.Dash ? State.BeforeComment : State.InDeclaration; } } private stateInDeclaration(c: number) { if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) { this.cbs.ondeclaration(this.getSection()); this._state = State.Text; this.sectionStart = this._index + 1; } } private stateInProcessingInstruction(c: number) { if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) { this.cbs.onprocessinginstruction(this.getSection()); this._state = State.Text; this.sectionStart = this._index + 1; } } private stateBeforeComment(c: number) { if (c === CharCodes.Dash) { this._state = State.InCommentLike; this.currentSequence = Sequences.CommentEnd; // Allow short comments (eg. <!-->) this.sequenceIndex = 2; this.sectionStart = this._index + 1; } else { this._state = State.InDeclaration; } } private stateInSpecialComment(c: number) { if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) { this.cbs.oncomment(this.getSection()); this._state = State.Text; this.sectionStart = this._index + 1; } } private stateBeforeSpecialS(c: number) { const lower = c | 0x20; if (lower === Sequences.ScriptEnd[3]) { this.startSpecial(Sequences.ScriptEnd, 4); } else if (lower === Sequences.StyleEnd[3]) { this.startSpecial(Sequences.StyleEnd, 4); } else { this._state = State.InTagName; this.stateInTagName(c); // Consume the token again } } private trieIndex = 0; private trieCurrent = 0; private trieResult: string | null = null; private entityExcess = 0; private stateBeforeEntity(c: number) { // Start excess with 1 to include the '&' this.entityExcess = 1; if (c === CharCodes.Num) { this._state = State.BeforeNumericEntity; } else if (c === CharCodes.Amp) { // We have two `&` characters in a row. Stay in the current state. } else { this.trieIndex = 0; this.trieCurrent = this.entityTrie[0]; this.trieResult = null; this._state = State.InNamedEntity; this.stateInNamedEntity(c); } } private stateInNamedEntity(c: number) { this.entityExcess += 1; this.trieIndex = determineBranch( this.entityTrie, this.trieCurrent, this.trieIndex + 1, c ); if (this.trieIndex < 0) { this.emitNamedEntity(); this._index--; return; } this.trieCurrent = this.entityTrie[this.trieIndex]; // If the branch is a value, store it and continue if (this.trieCurrent & BinTrieFlags.HAS_VALUE) { // If we have a legacy entity while parsing strictly, just skip the number of bytes if (!this.allowLegacyEntity() && c !== CharCodes.Semi) { // No need to consider multi-byte values, as the legacy entity is always a single byte this.trieIndex += 1; } else { // Add 1 as we have already incremented the excess const entityStart = this._index - this.entityExcess + 1; if (entityStart > this.sectionStart) { this.emitPartial( this.buffer.substring(this.sectionStart, entityStart) ); } // If this is a surrogate pair, combine the higher bits from the node with the next byte this.trieResult = this.trieCurrent & BinTrieFlags.MULTI_BYTE ? String.fromCharCode( this.entityTrie[++this.trieIndex], this.entityTrie[++this.trieIndex] ) : String.fromCharCode( this.entityTrie[++this.trieIndex] ); this.entityExcess = 0; this.sectionStart = this._index + 1; } } } private emitNamedEntity() { if (this.trieResult) { this.emitPartial(this.trieResult); } this._state = this.baseState; } private stateBeforeNumericEntity(c: number) { if ((c | 0x20) === CharCodes.LowerX) { this.entityExcess++; this._state = State.InHexEntity; } else { this._state = State.InNumericEntity; this.stateInNumericEntity(c); } } private decodeNumericEntity(base: 10 | 16, strict: boolean) { const entityStart = this._index - this.entityExcess - 1; const numberStart = entityStart + 2 + (base >> 4); if (numberStart !== this._index) { // Emit leading data if any if (entityStart > this.sectionStart) { this.emitPartial( this.buffer.substring(this.sectionStart, entityStart) ); } // Parse entity const entity = this.buffer.substring(numberStart, this._index); const parsed = parseInt(entity, base); this.emitPartial(decodeCodePoint(parsed)); this.sectionStart = this._index + Number(strict); } this._state = this.baseState; } private stateInNumericEntity(c: number) { if (c === CharCodes.Semi) { this.decodeNumericEntity(10, true); } else if (!isNumber(c)) { if (this.allowLegacyEntity()) { this.decodeNumericEntity(10, false); } else { this._state = this.baseState; } this._index--; } else { this.entityExcess++; } } private stateInHexEntity(c: number) { if (c === CharCodes.Semi) { this.decodeNumericEntity(16, true); } else if ( (c < CharCodes.LowerA || c > CharCodes.LowerF) && (c < CharCodes.UpperA || c > CharCodes.UpperF) && !isNumber(c) ) { if (this.allowLegacyEntity()) { this.decodeNumericEntity(16, false); } else { this._state = this.baseState; } this._index--; } else { this.entityExcess++; } } private allowLegacyEntity() { return ( !this.xmlMode && (this.baseState === State.Text || this.baseState === State.InSpecialTag) ); } /** * Remove data that has already been consumed from the buffer. */ private cleanup() { // If we are inside of text, emit what we already have. if ( this.running && this.sectionStart !== this._index && (this._state === State.Text || (this._state === State.InSpecialTag && this.sequenceIndex === 0)) ) { // TODO: We could emit attribute data here as well. this.cbs.ontext(this.buffer.substr(this.sectionStart)); this.sectionStart = this._index; } const start = this.sectionStart < 0 ? this._index : this.sectionStart; this.buffer = start === this.buffer.length ? "" : this.buffer.substr(start); this._index -= start; this.bufferOffset += start; if (this.sectionStart > 0) { this.sectionStart = 0; } } private shouldContinue() { return this._index < this.buffer.length && this.running; } /** * Iterates through the buffer, calling the function corresponding to the current state. * * States that are more likely to be hit are higher up, as a performance improvement. */ private parse() { while (this.shouldContinue()) { const c = this.buffer.charCodeAt(this._index); if (this._state === State.Text) { this.stateText(c); } else if (this._state === State.SpecialStartSequence) { this.stateSpecialStartSequence(c); } else if (this._state === State.InSpecialTag) { this.stateInSpecialTag(c); } else if (this._state === State.CDATASequence) { this.stateCDATASequence(c); } else if (this._state === State.InAttributeValueDq) { this.stateInAttributeValueDoubleQuotes(c); } else if (this._state === State.InAttributeName) { this.stateInAttributeName(c); } else if (this._state === State.InCommentLike) { this.stateInCommentLike(c); } else if (this._state === State.InSpecialComment) { this.stateInSpecialComment(c); } else if (this._state === State.BeforeAttributeName) { this.stateBeforeAttributeName(c); } else if (this._state === State.InTagName) { this.stateInTagName(c); } else if (this._state === State.InClosingTagName) { this.stateInClosingTagName(c); } else if (this._state === State.BeforeTagName) { this.stateBeforeTagName(c); } else if (this._state === State.AfterAttributeName) { this.stateAfterAttributeName(c); } else if (this._state === State.InAttributeValueSq) { this.stateInAttributeValueSingleQuotes(c); } else if (this._state === State.BeforeAttributeValue) { this.stateBeforeAttributeValue(c); } else if (this._state === State.BeforeClosingTagName) { this.stateBeforeClosingTagName(c); } else if (this._state === State.AfterClosingTagName) { this.stateAfterClosingTagName(c); } else if (this._state === State.BeforeSpecialS) { this.stateBeforeSpecialS(c); } else if (this._state === State.InAttributeValueNq) { this.stateInAttributeValueNoQuotes(c); } else if (this._state === State.InSelfClosingTag) { this.stateInSelfClosingTag(c); } else if (this._state === State.InDeclaration) { this.stateInDeclaration(c); } else if (this._state === State.BeforeDeclaration) { this.stateBeforeDeclaration(c); } else if (this._state === State.BeforeComment) { this.stateBeforeComment(c); } else if (this._state === State.InProcessingInstruction) { this.stateInProcessingInstruction(c); } else if (this._state === State.InNamedEntity) { this.stateInNamedEntity(c); } else if (this._state === State.BeforeEntity) { this.stateBeforeEntity(c); } else if (this._state === State.InHexEntity) { this.stateInHexEntity(c); } else if (this._state === State.InNumericEntity) { this.stateInNumericEntity(c); } else { // `this._state === State.BeforeNumericEntity` this.stateBeforeNumericEntity(c); } this._index++; } this.cleanup(); } private finish() { if (this._state === State.InNamedEntity) { this.emitNamedEntity(); } // If there is remaining data, emit it in a reasonable way if (this.sectionStart < this._index) { this.handleTrailingData(); } this.cbs.onend(); } /** Handle any trailing data. */ private handleTrailingData() { const data = this.buffer.substr(this.sectionStart); if (this._state === State.InCommentLike) { if (this.currentSequence === Sequences.CdataEnd) { this.cbs.oncdata(data); } else { this.cbs.oncomment(data); } } else if ( this._state === State.InNumericEntity && this.allowLegacyEntity() ) { this.decodeNumericEntity(10, false); // All trailing data will have been consumed } else if ( this._state === State.InHexEntity && this.allowLegacyEntity() ) { this.decodeNumericEntity(16, false); // All trailing data will have been consumed } else if ( this._state === State.InTagName || this._state === State.BeforeAttributeName || this._state === State.BeforeAttributeValue || this._state === State.AfterAttributeName || this._state === State.InAttributeName || this._state === State.InAttributeValueSq || this._state === State.InAttributeValueDq || this._state === State.InAttributeValueNq || this._state === State.InClosingTagName ) { /* * If we are currently in an opening or closing tag, us not calling the * respective callback signals that the tag should be ignored. */ } else { this.cbs.ontext(data); } } private getSection(): string { return this.buffer.substring(this.sectionStart, this._index); } private emitPartial(value: string) { if ( this.baseState !== State.Text && this.baseState !== State.InSpecialTag ) { this.cbs.onattribdata(value); } else { this.cbs.ontext(value); } } } �����������������htmlparser2-7.2.0/src/WritableStream.spec.ts��������������������������������������������������������0000664�0000000�0000000�00000002370�14143224032�0020775�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import fs from "fs"; import path from "path"; import { WritableStream } from "./WritableStream"; import * as helper from "./__fixtures__/test-helper"; describe("WritableStream", () => { test("should decode fragmented unicode characters", () => { const ontext = jest.fn(); const stream = new WritableStream({ ontext }); stream.write(Buffer.from([0xe2, 0x82])); stream.write(Buffer.from([0xac])); stream.write(""); stream.end(); expect(ontext).toBeCalledWith("€"); }); }); helper.createSuite("Stream", (test, cb) => { const filePath = path.join( __dirname, "__fixtures__", "Documents", test.file ); fs.createReadStream(filePath) .pipe( new WritableStream( helper.getEventCollector((err, events) => { cb(err, events); const handler = helper.getEventCollector(cb); const stream = new WritableStream(handler, test.options); fs.readFile(filePath, (err, data) => err ? cb(err) : stream.end(data) ); }), test.options ) ) .on("error", cb); }); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/WritableStream.ts�������������������������������������������������������������0000664�0000000�0000000�00000002266�14143224032�0020050�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import { Parser, Handler, ParserOptions } from "./Parser"; /* * NOTE: If either of these two imports produces a type error, * please update your @types/node dependency! */ import { Writable } from "stream"; import { StringDecoder } from "string_decoder"; // Following the example in https://nodejs.org/api/stream.html#stream_decoding_buffers_in_a_writable_stream function isBuffer(_chunk: string | Buffer, encoding: string): _chunk is Buffer { return encoding === "buffer"; } /** * WritableStream makes the `Parser` interface available as a NodeJS stream. * * @see Parser */ export class WritableStream extends Writable { private readonly _parser: Parser; private readonly _decoder = new StringDecoder(); constructor(cbs: Partial<Handler>, options?: ParserOptions) { super({ decodeStrings: false }); this._parser = new Parser(cbs, options); } _write(chunk: string | Buffer, encoding: string, cb: () => void): void { this._parser.write( isBuffer(chunk, encoding) ? this._decoder.write(chunk) : chunk ); cb(); } _final(cb: () => void): void { this._parser.end(this._decoder.end()); cb(); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/�����������������������������������������������������������������0000775�0000000�0000000�00000000000�14143224032�0017212�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Documents/�������������������������������������������������������0000775�0000000�0000000�00000000000�14143224032�0021153�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Documents/Atom_Example.xml���������������������������������������0000664�0000000�0000000�00000001640�14143224032�0024251�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!-- http://en.wikipedia.org/wiki/Atom_%28standard%29 --> <feed xmlns="http://www.w3.org/2005/Atom"> <title>Example Feed A subtitle. urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6 2003-12-13T18:30:02Z John Doe johndoe@example.com Atom-Powered Robots Run Amok urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a 2003-12-13T18:30:02Z

Some content.

htmlparser2-7.2.0/src/__fixtures__/Documents/Attributes.html000066400000000000000000000007671414322403200242010ustar00rootroot00000000000000 Attributes test htmlparser2-7.2.0/src/__fixtures__/Documents/Basic.html000066400000000000000000000001141414322403200230560ustar00rootroot00000000000000The TitleHello worldhtmlparser2-7.2.0/src/__fixtures__/Documents/RDF_Example.xml000066400000000000000000000050371414322403200237700ustar00rootroot00000000000000 A title to parse and remember https://github.com/fb55/htmlparser2/ en-us Copyright 2015 the authors webmaster@thisisafakedoma.in webmaster@thisisafakedoma.in https://github.com/fb55/htmlparser2/ A title to parse and remember Collection 2011-11-04T09:39:10-07:00 4 hourly <![CDATA[ Fast HTML Parsing ]]> http://somefakesite/path/to/something.html A link: Github ]]> 2011-11-04T09:35:17-07:00 en-us Copyright 2015 the authors http://somefakesite/path/to/something.html text 2011-11-04T09:35:17-07:00 <![CDATA[ This space intentionally left blank ]]> http://somefakesite/path/to/something-else.html 2011-11-04T09:34:54-07:00 en-us Copyright 2015 the authors http://somefakesite/path/to/something-else.html text 2011-11-04T09:34:54-07:00 htmlparser2-7.2.0/src/__fixtures__/Documents/RSS_Example.xml000066400000000000000000000052121414322403200240170ustar00rootroot00000000000000 Liftoff News http://liftoff.msfc.nasa.gov/ Liftoff to Space Exploration. en-us Tue, 10 Jun 2003 04:00:00 GMT Tue, 10 Jun 2003 09:41:01 GMT http://blogs.law.harvard.edu/tech/rss Weblog Editor 2.0 editor@example.com webmaster@example.com Star City http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>. Tue, 03 Jun 2003 09:39:21 GMT http://liftoff.msfc.nasa.gov/2003/06/03.html#item573 Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm">partial eclipse of the Sun</a> on Saturday, May 31st. Fri, 30 May 2003 11:06:42 GMT http://liftoff.msfc.nasa.gov/2003/05/30.html#item572 The Engine That Does More http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly. The proposed VASIMR engine would do that. Tue, 27 May 2003 08:37:32 GMT http://liftoff.msfc.nasa.gov/2003/05/27.html#item571 Astronauts' Dirty Laundry http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options. Tue, 20 May 2003 08:56:02 GMT http://liftoff.msfc.nasa.gov/2003/05/20.html#item570 htmlparser2-7.2.0/src/__fixtures__/Documents/Svg.html000066400000000000000000000004721414322403200226030ustar00rootroot00000000000000 SVG test Test x htmlparser2-7.2.0/src/__fixtures__/Events/000077500000000000000000000000001414322403200204565ustar00rootroot00000000000000htmlparser2-7.2.0/src/__fixtures__/Events/01-simple.json000066400000000000000000000016441414322403200230650ustar00rootroot00000000000000{ "name": "simple", "input": "

adsf

", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 3, "data": ["h1"] }, { "event": "attribute", "startIndex": 4, "endIndex": 14, "data": ["class", "test", null] }, { "event": "opentag", "startIndex": 0, "endIndex": 14, "data": [ "h1", { "class": "test" }, false ] }, { "event": "text", "startIndex": 15, "endIndex": 18, "data": ["adsf"] }, { "event": "closetag", "startIndex": 19, "endIndex": 23, "data": ["h1", false] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/02-template.json000066400000000000000000000026631414322403200234120ustar00rootroot00000000000000{ "name": "Template script tags", "input": "

", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 2, "data": ["p"] }, { "event": "opentag", "startIndex": 0, "endIndex": 2, "data": ["p", {}, false] }, { "event": "opentagname", "startIndex": 3, "endIndex": 10, "data": ["script"] }, { "event": "attribute", "startIndex": 11, "endIndex": 30, "data": ["type", "text/template", "\""] }, { "event": "opentag", "startIndex": 3, "endIndex": 31, "data": [ "script", { "type": "text/template" }, false ] }, { "event": "text", "startIndex": 32, "endIndex": 48, "data": ["

Heading1

"] }, { "event": "closetag", "startIndex": 49, "endIndex": 57, "data": ["script", false] }, { "event": "closetag", "startIndex": 58, "endIndex": 61, "data": ["p", false] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/03-lowercase_tags.json000066400000000000000000000020041414322403200245670ustar00rootroot00000000000000{ "name": "Lowercase tags", "input": "

adsf

", "options": { "parser": { "lowerCaseTags": true } }, "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 3, "data": ["h1"] }, { "event": "attribute", "startIndex": 4, "endIndex": 14, "data": ["class", "test", null] }, { "event": "opentag", "startIndex": 0, "endIndex": 14, "data": [ "h1", { "class": "test" }, false ] }, { "event": "text", "startIndex": 15, "endIndex": 18, "data": ["adsf"] }, { "event": "closetag", "startIndex": 19, "endIndex": 23, "data": ["h1", false] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/04-cdata.json000066400000000000000000000023121414322403200226440ustar00rootroot00000000000000{ "name": "CDATA", "input": "<> fo]]>", "options": { "parser": { "xmlMode": true } }, "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 4, "data": ["tag"] }, { "event": "opentag", "startIndex": 0, "endIndex": 4, "data": ["tag", {}, false] }, { "event": "cdatastart", "startIndex": 5, "endIndex": 41, "data": [] }, { "event": "text", "startIndex": 5, "endIndex": 41, "data": [" asdf ><> fo"] }, { "event": "cdataend", "startIndex": 5, "endIndex": 41, "data": [] }, { "event": "closetag", "startIndex": 42, "endIndex": 47, "data": ["tag", false] }, { "event": "processinginstruction", "startIndex": 48, "endIndex": 53, "data": ["![CD", "![CD"] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/05-cdata-special.json000066400000000000000000000013761414322403200242740ustar00rootroot00000000000000{ "name": "CDATA (inside special)", "input": "", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 7, "data": ["script"] }, { "event": "opentag", "startIndex": 0, "endIndex": 7, "data": ["script", {}, false] }, { "event": "text", "startIndex": 8, "endIndex": 52, "data": ["/*<> fo/*]]>*/"] }, { "event": "closetag", "startIndex": 53, "endIndex": 61, "data": ["script", false] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/06-leading-lt.json000066400000000000000000000003171414322403200236150ustar00rootroot00000000000000{ "name": "leading lt", "input": ">a>", "expected": [ { "event": "text", "startIndex": 0, "endIndex": 2, "data": [">a>"] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/07-self-closing.json000066400000000000000000000026041414322403200241640ustar00rootroot00000000000000{ "name": "Self-closing tags", "input": "Foo
", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 2, "data": ["a"] }, { "event": "attribute", "startIndex": 3, "endIndex": 24, "data": ["href", "http://test.com/", null] }, { "event": "opentag", "startIndex": 0, "endIndex": 24, "data": [ "a", { "href": "http://test.com/" }, false ] }, { "event": "text", "startIndex": 25, "endIndex": 27, "data": ["Foo"] }, { "event": "closetag", "startIndex": 28, "endIndex": 31, "data": ["a", false] }, { "event": "opentagname", "startIndex": 32, "endIndex": 35, "data": ["hr"] }, { "event": "opentag", "startIndex": 32, "endIndex": 38, "data": ["hr", {}, false] }, { "event": "closetag", "startIndex": 32, "endIndex": 38, "data": ["hr", true] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/08-implicit-close-tags.json000066400000000000000000000274671414322403200254670ustar00rootroot00000000000000{ "name": "Implicit close tags", "input": "
  1. TH

    Heading

    Div
    Div2
  2. Heading 2

Para

Heading 4

  • Hi
  • bye
", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 3, "data": ["ol"] }, { "event": "opentag", "startIndex": 0, "endIndex": 3, "data": ["ol", {}, false] }, { "event": "opentagname", "startIndex": 4, "endIndex": 7, "data": ["li"] }, { "event": "attribute", "startIndex": 8, "endIndex": 18, "data": ["class", "test", null] }, { "event": "opentag", "startIndex": 4, "endIndex": 18, "data": [ "li", { "class": "test" }, false ] }, { "event": "opentagname", "startIndex": 19, "endIndex": 23, "data": ["div"] }, { "event": "opentag", "startIndex": 19, "endIndex": 23, "data": ["div", {}, false] }, { "event": "opentagname", "startIndex": 24, "endIndex": 30, "data": ["table"] }, { "event": "attribute", "startIndex": 31, "endIndex": 47, "data": ["style", "width:100%", null] }, { "event": "opentag", "startIndex": 24, "endIndex": 47, "data": [ "table", { "style": "width:100%" }, false ] }, { "event": "opentagname", "startIndex": 48, "endIndex": 51, "data": ["tr"] }, { "event": "opentag", "startIndex": 48, "endIndex": 51, "data": ["tr", {}, false] }, { "event": "opentagname", "startIndex": 52, "endIndex": 55, "data": ["th"] }, { "event": "opentag", "startIndex": 52, "endIndex": 55, "data": ["th", {}, false] }, { "event": "text", "startIndex": 56, "endIndex": 57, "data": ["TH"] }, { "event": "closetag", "startIndex": 58, "endIndex": 61, "data": ["th", true] }, { "event": "opentagname", "startIndex": 58, "endIndex": 61, "data": ["td"] }, { "event": "attribute", "startIndex": 62, "endIndex": 71, "data": ["colspan", "2", null] }, { "event": "opentag", "startIndex": 58, "endIndex": 71, "data": [ "td", { "colspan": "2" }, false ] }, { "event": "opentagname", "startIndex": 72, "endIndex": 75, "data": ["h3"] }, { "event": "opentag", "startIndex": 72, "endIndex": 75, "data": ["h3", {}, false] }, { "event": "text", "startIndex": 76, "endIndex": 82, "data": ["Heading"] }, { "event": "closetag", "startIndex": 83, "endIndex": 87, "data": ["h3", false] }, { "event": "closetag", "startIndex": 88, "endIndex": 91, "data": ["td", true] }, { "event": "closetag", "startIndex": 88, "endIndex": 91, "data": ["tr", true] }, { "event": "opentagname", "startIndex": 88, "endIndex": 91, "data": ["tr"] }, { "event": "opentag", "startIndex": 88, "endIndex": 91, "data": ["tr", {}, false] }, { "event": "opentagname", "startIndex": 92, "endIndex": 95, "data": ["td"] }, { "event": "opentag", "startIndex": 92, "endIndex": 95, "data": ["td", {}, false] }, { "event": "opentagname", "startIndex": 96, "endIndex": 100, "data": ["div"] }, { "event": "opentag", "startIndex": 96, "endIndex": 100, "data": ["div", {}, false] }, { "event": "text", "startIndex": 101, "endIndex": 103, "data": ["Div"] }, { "event": "closetag", "startIndex": 104, "endIndex": 109, "data": ["div", false] }, { "event": "closetag", "startIndex": 110, "endIndex": 113, "data": ["td", true] }, { "event": "opentagname", "startIndex": 110, "endIndex": 113, "data": ["td"] }, { "event": "opentag", "startIndex": 110, "endIndex": 113, "data": ["td", {}, false] }, { "event": "opentagname", "startIndex": 114, "endIndex": 118, "data": ["div"] }, { "event": "opentag", "startIndex": 114, "endIndex": 118, "data": ["div", {}, false] }, { "event": "text", "startIndex": 119, "endIndex": 122, "data": ["Div2"] }, { "event": "closetag", "startIndex": 123, "endIndex": 128, "data": ["div", false] }, { "event": "closetag", "startIndex": 129, "endIndex": 136, "data": ["td", true] }, { "event": "closetag", "startIndex": 129, "endIndex": 136, "data": ["tr", true] }, { "event": "closetag", "startIndex": 129, "endIndex": 136, "data": ["table", false] }, { "event": "closetag", "startIndex": 137, "endIndex": 142, "data": ["div", false] }, { "event": "closetag", "startIndex": 143, "endIndex": 146, "data": ["li", true] }, { "event": "opentagname", "startIndex": 143, "endIndex": 146, "data": ["li"] }, { "event": "opentag", "startIndex": 143, "endIndex": 146, "data": ["li", {}, false] }, { "event": "opentagname", "startIndex": 147, "endIndex": 151, "data": ["div"] }, { "event": "opentag", "startIndex": 147, "endIndex": 151, "data": ["div", {}, false] }, { "event": "opentagname", "startIndex": 152, "endIndex": 155, "data": ["h3"] }, { "event": "opentag", "startIndex": 152, "endIndex": 155, "data": ["h3", {}, false] }, { "event": "text", "startIndex": 156, "endIndex": 164, "data": ["Heading 2"] }, { "event": "closetag", "startIndex": 165, "endIndex": 169, "data": ["h3", false] }, { "event": "closetag", "startIndex": 170, "endIndex": 175, "data": ["div", false] }, { "event": "closetag", "startIndex": 176, "endIndex": 180, "data": ["li", false] }, { "event": "closetag", "startIndex": 181, "endIndex": 185, "data": ["ol", false] }, { "event": "opentagname", "startIndex": 186, "endIndex": 188, "data": ["p"] }, { "event": "opentag", "startIndex": 186, "endIndex": 188, "data": ["p", {}, false] }, { "event": "text", "startIndex": 189, "endIndex": 192, "data": ["Para"] }, { "event": "closetag", "startIndex": 193, "endIndex": 196, "data": ["p", true] }, { "event": "opentagname", "startIndex": 193, "endIndex": 196, "data": ["h4"] }, { "event": "opentag", "startIndex": 193, "endIndex": 196, "data": ["h4", {}, false] }, { "event": "text", "startIndex": 197, "endIndex": 205, "data": ["Heading 4"] }, { "event": "closetag", "startIndex": 206, "endIndex": 210, "data": ["h4", false] }, { "event": "opentagname", "startIndex": 211, "endIndex": 213, "data": ["p"] }, { "event": "opentag", "startIndex": 211, "endIndex": 213, "data": ["p", {}, false] }, { "event": "closetag", "startIndex": 214, "endIndex": 217, "data": ["p", true] }, { "event": "opentagname", "startIndex": 214, "endIndex": 217, "data": ["ul"] }, { "event": "opentag", "startIndex": 214, "endIndex": 217, "data": ["ul", {}, false] }, { "event": "opentagname", "startIndex": 218, "endIndex": 221, "data": ["li"] }, { "event": "opentag", "startIndex": 218, "endIndex": 221, "data": ["li", {}, false] }, { "event": "text", "startIndex": 222, "endIndex": 223, "data": ["Hi"] }, { "event": "closetag", "startIndex": 224, "endIndex": 227, "data": ["li", true] }, { "event": "opentagname", "startIndex": 224, "endIndex": 227, "data": ["li"] }, { "event": "opentag", "startIndex": 224, "endIndex": 227, "data": ["li", {}, false] }, { "event": "text", "startIndex": 228, "endIndex": 230, "data": ["bye"] }, { "event": "closetag", "startIndex": 231, "endIndex": 235, "data": ["li", true] }, { "event": "closetag", "startIndex": 231, "endIndex": 235, "data": ["ul", false] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/09-attributes.json000066400000000000000000000031171414322403200237670ustar00rootroot00000000000000{ "name": "attributes (no white space, no value, no quotes)", "input": "", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 7, "data": ["button"] }, { "event": "attribute", "startIndex": 8, "endIndex": 20, "data": ["class", "test0", "\""] }, { "event": "attribute", "startIndex": 21, "endIndex": 33, "data": ["title", "test1", "\""] }, { "event": "attribute", "startIndex": 35, "endIndex": 44, "data": ["disabled", ""] }, { "event": "attribute", "startIndex": 44, "endIndex": 55, "data": ["value", "test2", null] }, { "event": "opentag", "startIndex": 0, "endIndex": 55, "data": [ "button", { "class": "test0", "title": "test1", "disabled": "", "value": "test2" }, false ] }, { "event": "text", "startIndex": 56, "endIndex": 59, "data": ["adsf"] }, { "event": "closetag", "startIndex": 60, "endIndex": 68, "data": ["button", false] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/10-crazy-attrib.json000066400000000000000000000021151414322403200242010ustar00rootroot00000000000000{ "name": "crazy attribute", "input": "

stuff

", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 2, "data": ["p"] }, { "event": "opentag", "startIndex": 0, "endIndex": 2, "data": ["p", {}, false] }, { "event": "opentagname", "startIndex": 3, "endIndex": 10, "data": ["script"] }, { "event": "opentag", "startIndex": 3, "endIndex": 10, "data": ["script", {}, false] }, { "event": "text", "startIndex": 11, "endIndex": 43, "data": ["var str = '", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 6, "data": ["title"] }, { "event": "opentag", "startIndex": 0, "endIndex": 6, "data": ["title", {}, false] }, { "event": "text", "startIndex": 7, "endIndex": 23, "data": ["foo"] }, { "event": "closetag", "startIndex": 24, "endIndex": 31, "data": ["title", false] }, { "event": "opentagname", "startIndex": 32, "endIndex": 38, "data": ["sitle"] }, { "event": "opentag", "startIndex": 32, "endIndex": 38, "data": ["sitle", {}, false] }, { "event": "opentagname", "startIndex": 39, "endIndex": 41, "data": ["b"] }, { "event": "opentag", "startIndex": 39, "endIndex": 41, "data": ["b", {}, false] }, { "event": "closetag", "startIndex": 42, "endIndex": 45, "data": ["b", false] }, { "event": "closetag", "startIndex": 46, "endIndex": 53, "data": ["sitle", false] }, { "event": "opentagname", "startIndex": 54, "endIndex": 60, "data": ["ttyle"] }, { "event": "opentag", "startIndex": 54, "endIndex": 60, "data": ["ttyle", {}, false] }, { "event": "opentagname", "startIndex": 61, "endIndex": 63, "data": ["b"] }, { "event": "opentag", "startIndex": 61, "endIndex": 63, "data": ["b", {}, false] }, { "event": "closetag", "startIndex": 64, "endIndex": 67, "data": ["b", false] }, { "event": "closetag", "startIndex": 68, "endIndex": 75, "data": ["ttyle", false] }, { "event": "opentagname", "startIndex": 76, "endIndex": 83, "data": ["script"] }, { "event": "opentag", "startIndex": 76, "endIndex": 83, "data": ["script", {}, false] }, { "event": "text", "startIndex": 84, "endIndex": 98, "data": ["</scripter</soo"] }, { "event": "closetag", "startIndex": 99, "endIndex": 107, "data": ["script", false] }, { "event": "opentagname", "startIndex": 108, "endIndex": 114, "data": ["style"] }, { "event": "opentag", "startIndex": 108, "endIndex": 114, "data": ["style", {}, false] }, { "event": "text", "startIndex": 115, "endIndex": 122, "data": ["</styler"] }, { "event": "closetag", "startIndex": 123, "endIndex": 130, "data": ["style", false] }, { "event": "opentagname", "startIndex": 131, "endIndex": 137, "data": ["scipt"] }, { "event": "opentag", "startIndex": 131, "endIndex": 137, "data": ["scipt", {}, false] }, { "event": "opentagname", "startIndex": 138, "endIndex": 145, "data": ["stylee"] }, { "event": "opentag", "startIndex": 138, "endIndex": 145, "data": ["stylee", {}, false] }, { "event": "opentagname", "startIndex": 146, "endIndex": 155, "data": ["scriptee"] }, { "event": "opentag", "startIndex": 146, "endIndex": 155, "data": ["scriptee", {}, false] }, { "event": "opentagname", "startIndex": 156, "endIndex": 160, "data": ["soo"] }, { "event": "opentag", "startIndex": 156, "endIndex": 160, "data": ["soo", {}, false] }, { "event": "closetag", "startIndex": 161, "endIndex": 161, "data": ["soo", true] }, { "event": "closetag", "startIndex": 161, "endIndex": 161, "data": ["scriptee", true] }, { "event": "closetag", "startIndex": 161, "endIndex": 161, "data": ["stylee", true] }, { "event": "closetag", "startIndex": 161, "endIndex": 161, "data": ["scipt", true] } ] } �������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/25-empty_tag_name.json������������������������������������0000664�0000000�0000000�00000000333�14143224032�0024565�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "Empty tag name", "input": "< ></ >", "expected": [ { "event": "text", "startIndex": 0, "endIndex": 6, "data": ["< ></ >"] } ] } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/26-not-quite-closed.json����������������������������������0000664�0000000�0000000�00000001420�14143224032�0024767�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "Not quite closed", "input": "<foo /bar></foo bar>", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 4, "data": ["foo"] }, { "event": "attribute", "startIndex": 6, "endIndex": 9, "data": ["bar", ""] }, { "event": "opentag", "startIndex": 0, "endIndex": 9, "data": [ "foo", { "bar": "" }, false ] }, { "event": "closetag", "startIndex": 10, "endIndex": 15, "data": ["foo", false] } ] } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/27-entities_in_attributes.json����������������������������0000664�0000000�0000000�00000002536�14143224032�0026365�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "Entities in attributes", "input": "<foo bar=& baz=\"&\" boo='&' noo=>", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 4, "data": ["foo"] }, { "event": "attribute", "startIndex": 5, "endIndex": 14, "data": ["bar", "&", null] }, { "event": "attribute", "startIndex": 15, "endIndex": 25, "data": ["baz", "&", "\""] }, { "event": "attribute", "startIndex": 27, "endIndex": 37, "data": ["boo", "&", "'"] }, { "event": "attribute", "startIndex": 39, "endIndex": 43, "data": ["noo", "", null] }, { "event": "opentag", "startIndex": 0, "endIndex": 43, "data": [ "foo", { "bar": "&", "baz": "&", "boo": "&", "noo": "" }, false ] }, { "event": "closetag", "startIndex": 44, "endIndex": 44, "data": ["foo", true] } ] } ������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/28-cdata_in_html.json�������������������������������������0000664�0000000�0000000�00000000567�14143224032�0024376�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "CDATA in HTML", "input": "<![CDATA[ foo ]]>", "expected": [ { "event": "comment", "startIndex": 0, "endIndex": 16, "data": ["[CDATA[ foo ]]"] }, { "event": "commentend", "startIndex": 0, "endIndex": 16, "data": [] } ] } �����������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/29-comment_edge-cases.json��������������������������������0000664�0000000�0000000�00000001462�14143224032�0025326�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "Comment edge-cases", "input": "<!-foo><!-- --- --><!--foo", "expected": [ { "event": "processinginstruction", "startIndex": 0, "endIndex": 6, "data": ["!-foo", "!-foo"] }, { "event": "comment", "startIndex": 7, "endIndex": 18, "data": [" --- "] }, { "event": "commentend", "startIndex": 7, "endIndex": 18, "data": [] }, { "event": "comment", "startIndex": 19, "endIndex": 26, "data": ["foo"] }, { "event": "commentend", "startIndex": 19, "endIndex": 26, "data": [] } ] } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/30-cdata_edge-cases.json����������������������������������0000664�0000000�0000000�00000002244�14143224032�0024727�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "CDATA edge-cases", "input": "<![CDATA><![CDATA[[]]sdaf]]><![CDATA[foo", "options": { "parser": { "recognizeCDATA": true } }, "expected": [ { "event": "processinginstruction", "startIndex": 0, "endIndex": 8, "data": ["![cdata", "![CDATA"] }, { "event": "cdatastart", "startIndex": 9, "endIndex": 27, "data": [] }, { "event": "text", "startIndex": 9, "endIndex": 27, "data": ["[]]sdaf"] }, { "event": "cdataend", "startIndex": 9, "endIndex": 27, "data": [] }, { "event": "cdatastart", "startIndex": 28, "endIndex": 40, "data": [] }, { "event": "text", "startIndex": 28, "endIndex": 40, "data": ["foo"] }, { "event": "cdataend", "startIndex": 28, "endIndex": 40, "data": [] } ] } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/31-comment_false-ending.json������������������������������0000664�0000000�0000000�00000000564�14143224032�0025655�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "Comment false ending", "input": "<!-- a-b-> -->", "expected": [ { "event": "comment", "startIndex": 0, "endIndex": 13, "data": [" a-b-> "] }, { "event": "commentend", "startIndex": 0, "endIndex": 13, "data": [] } ] } ��������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/32-script-ending-with-lessthan.json�����������������������0000664�0000000�0000000�00000001243�14143224032�0027131�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "Scripts ending with <", "input": "<script><</script>", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 7, "data": ["script"] }, { "event": "opentag", "startIndex": 0, "endIndex": 7, "data": ["script", {}, false] }, { "event": "text", "startIndex": 8, "endIndex": 8, "data": ["<"] }, { "event": "closetag", "startIndex": 9, "endIndex": 17, "data": ["script", false] } ] } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/33-cdata_more-edge-cases.json�����������������������������0000664�0000000�0000000�00000001140�14143224032�0025664�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "CDATA more edge-cases", "input": "<![CDATA[foo]bar]>baz]]>", "options": { "parser": { "recognizeCDATA": true } }, "expected": [ { "event": "cdatastart", "startIndex": 0, "endIndex": 23, "data": [] }, { "event": "text", "startIndex": 0, "endIndex": 23, "data": ["foo]bar]>baz"] }, { "event": "cdataend", "startIndex": 0, "endIndex": 23, "data": [] } ] } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/34-not-alpha-tags.json������������������������������������0000664�0000000�0000000�00000001002�14143224032�0024405�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "tag names are not ASCII alpha", "input": "<12>text</12>", "expected": [ { "event": "text", "startIndex": 0, "endIndex": 7, "data": ["<12>text"] }, { "event": "comment", "startIndex": 8, "endIndex": 12, "data": ["12"] }, { "event": "commentend", "startIndex": 8, "endIndex": 12, "data": [] } ] } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/35-non-br-void-close-tag.json�����������������������������0000664�0000000�0000000�00000002155�14143224032�0025607�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "open-implies-close case of (non-br) void close tag in non-XML mode", "input": "<select><input></select>", "options": { "parser": { "lowerCaseAttributeNames": true } }, "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 7, "data": ["select"] }, { "event": "opentag", "startIndex": 0, "endIndex": 7, "data": ["select", {}, false] }, { "event": "closetag", "startIndex": 8, "endIndex": 14, "data": ["select", true] }, { "event": "opentagname", "startIndex": 8, "endIndex": 14, "data": ["input"] }, { "event": "opentag", "startIndex": 8, "endIndex": 14, "data": ["input", {}, false] }, { "event": "closetag", "startIndex": 8, "endIndex": 14, "data": ["input", true] } ] } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/36-entity-in-attrib.json����������������������������������0000664�0000000�0000000�00000002057�14143224032�0025006�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "entity in attribute (#276)", "input": "<img src=\"?&image_uri=1&ℑ=2&image=3\"/>?&image_uri=1&ℑ=2&image=3", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 4, "data": ["img"] }, { "event": "attribute", "startIndex": 5, "endIndex": 41, "data": ["src", "?&image_uri=1&ℑ=2&image=3", "\""] }, { "event": "opentag", "startIndex": 0, "endIndex": 43, "data": [ "img", { "src": "?&image_uri=1&ℑ=2&image=3" }, false ] }, { "event": "closetag", "startIndex": 0, "endIndex": 43, "data": ["img", true] }, { "event": "text", "startIndex": 44, "endIndex": 74, "data": ["?&image_uri=1&ℑ=2&image=3"] } ] } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/37-entity-in-title.json�����������������������������������0000664�0000000�0000000�00000001267�14143224032�0024645�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "entity in title (#592)", "input": "<title>the "title"", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 6, "data": ["title"] }, { "event": "opentag", "startIndex": 0, "endIndex": 6, "data": ["title", {}, false] }, { "event": "text", "startIndex": 7, "endIndex": 26, "data": ["the \"title\""] }, { "event": "closetag", "startIndex": 27, "endIndex": 27, "data": ["title", true] } ] } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/38-entity-in-title-no-decode.json�������������������������0000664�0000000�0000000�00000001461�14143224032�0026475�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "entity in title - decodeEntities=false (#592)", "input": "<title>the "title"", "options": { "parser": { "decodeEntities": false } }, "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 6, "data": ["title"] }, { "event": "opentag", "startIndex": 0, "endIndex": 6, "data": ["title", {}, false] }, { "event": "text", "startIndex": 7, "endIndex": 27, "data": ["the "title""] }, { "event": "closetag", "startIndex": 28, "endIndex": 28, "data": ["title", true] } ] } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������htmlparser2-7.2.0/src/__fixtures__/Events/39-title-in-script.json�����������������������������������0000664�0000000�0000000�00000001275�14143224032�0024636�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": " in ", "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 7, "data": ["script"] }, { "event": "opentag", "startIndex": 0, "endIndex": 7, "data": ["script", {}, false] }, { "event": "text", "startIndex": 8, "endIndex": 17, "data": ["''"] }, { "event": "closetag", "startIndex": 18, "endIndex": 26, "data": ["script", false] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/40-xml_tags.json000066400000000000000000000020201414322403200234020ustar00rootroot00000000000000{ "name": "XML tags", "input": "<:foo><_bar>", "options": { "parser": { "xmlMode": true } }, "expected": [ { "event": "opentagname", "startIndex": 0, "endIndex": 5, "data": [":foo"] }, { "event": "opentag", "startIndex": 0, "endIndex": 5, "data": [":foo", {}, false] }, { "event": "opentagname", "startIndex": 6, "endIndex": 11, "data": ["_bar"] }, { "event": "opentag", "startIndex": 6, "endIndex": 11, "data": ["_bar", {}, false] }, { "event": "closetag", "startIndex": 12, "endIndex": 12, "data": ["_bar", true] }, { "event": "closetag", "startIndex": 12, "endIndex": 12, "data": [":foo", true] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/41-trailing-legacy-entity.json000066400000000000000000000003611414322403200261600ustar00rootroot00000000000000{ "name": "Trailing legacy entity", "input": "⨱×bar", "expected": [ { "event": "text", "startIndex": 0, "endIndex": 18, "data": ["⨱×bar"] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/42-trailing-numeric-entity.json000066400000000000000000000003401414322403200263540ustar00rootroot00000000000000{ "name": "Trailing numeric entity", "input": "55", "expected": [ { "event": "text", "startIndex": 0, "endIndex": 7, "data": ["55"] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/43-multibyte-entity.json000066400000000000000000000003531414322403200251260ustar00rootroot00000000000000{ "name": "Multi-byte entity", "input": "≧̸", "expected": [ { "event": "text", "startIndex": 0, "endIndex": 20, "data": ["≧̸"] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/44-indices.json000066400000000000000000000073431414322403200232230ustar00rootroot00000000000000{ "name": "Start & end indices from domhandler", "input": " The Title Hello world

", "expected": [ { "event": "processinginstruction", "startIndex": 0, "endIndex": 14, "data": ["!doctype", "!DOCTYPE html"] }, { "event": "text", "startIndex": 15, "endIndex": 15, "data": [" "] }, { "event": "opentagname", "startIndex": 16, "endIndex": 21, "data": ["html"] }, { "event": "opentag", "startIndex": 16, "endIndex": 21, "data": ["html", {}, false] }, { "event": "text", "startIndex": 22, "endIndex": 22, "data": [" "] }, { "event": "opentagname", "startIndex": 23, "endIndex": 29, "data": ["title"] }, { "event": "opentag", "startIndex": 23, "endIndex": 29, "data": ["title", {}, false] }, { "event": "text", "startIndex": 30, "endIndex": 38, "data": ["The Title"] }, { "event": "closetag", "startIndex": 39, "endIndex": 46, "data": ["title", false] }, { "event": "text", "startIndex": 47, "endIndex": 47, "data": [" "] }, { "event": "opentagname", "startIndex": 48, "endIndex": 53, "data": ["body"] }, { "event": "attribute", "startIndex": 54, "endIndex": 64, "data": ["class", "foo", "'"] }, { "event": "opentag", "startIndex": 48, "endIndex": 65, "data": [ "body", { "class": "foo" }, false ] }, { "event": "text", "startIndex": 66, "endIndex": 77, "data": ["Hello world "] }, { "event": "opentagname", "startIndex": 78, "endIndex": 80, "data": ["p"] }, { "event": "opentag", "startIndex": 78, "endIndex": 80, "data": ["p", {}, false] }, { "event": "closetag", "startIndex": 81, "endIndex": 84, "data": ["p", false] }, { "event": "closetag", "startIndex": 85, "endIndex": 91, "data": ["body", false] }, { "event": "text", "startIndex": 92, "endIndex": 92, "data": [" "] }, { "event": "comment", "startIndex": 93, "endIndex": 112, "data": [" the comment "] }, { "event": "commentend", "startIndex": 93, "endIndex": 112, "data": [] }, { "event": "text", "startIndex": 113, "endIndex": 113, "data": [" "] }, { "event": "closetag", "startIndex": 114, "endIndex": 120, "data": ["html", false] }, { "event": "text", "startIndex": 121, "endIndex": 121, "data": [" "] } ] } htmlparser2-7.2.0/src/__fixtures__/Events/45-self-closing-indices.json000066400000000000000000000027111414322403200256010ustar00rootroot00000000000000{ "name": "Self-closing indices (#941)", "options": { "parser": { "xmlMode": true } }, "input": "", "expected": [ { "event": "opentagname", "data": ["xml"], "startIndex": 0, "endIndex": 4 }, { "event": "opentag", "data": ["xml", {}, false], "startIndex": 0, "endIndex": 4 }, { "event": "opentagname", "data": ["a"], "startIndex": 5, "endIndex": 7 }, { "event": "opentag", "data": ["a", {}, false], "startIndex": 5, "endIndex": 8 }, { "event": "closetag", "data": ["a", true], "startIndex": 5, "endIndex": 8 }, { "event": "opentagname", "data": ["b"], "startIndex": 9, "endIndex": 11 }, { "event": "opentag", "data": ["b", {}, false], "startIndex": 9, "endIndex": 12 }, { "event": "closetag", "data": ["b", true], "startIndex": 9, "endIndex": 12 }, { "event": "closetag", "data": ["xml", false], "startIndex": 13, "endIndex": 18 } ] } htmlparser2-7.2.0/src/__fixtures__/Events/46-entity-after-lt.json000066400000000000000000000003501414322403200246260ustar00rootroot00000000000000{ "name": "Entity after <", "options": {}, "input": "<&", "expected": [ { "event": "text", "startIndex": 0, "endIndex": 5, "data": ["<&"] } ] } htmlparser2-7.2.0/src/__fixtures__/Feeds/000077500000000000000000000000001414322403200202405ustar00rootroot00000000000000htmlparser2-7.2.0/src/__fixtures__/Feeds/01-rss.json000066400000000000000000000001241414322403200221550ustar00rootroot00000000000000{ "name": "RSS (2.0)", "file": "RSS_Example.xml", "useSnapshot": true } htmlparser2-7.2.0/src/__fixtures__/Feeds/02-atom.json000066400000000000000000000001261414322403200223110ustar00rootroot00000000000000{ "name": "Atom (1.0)", "file": "Atom_Example.xml", "useSnapshot": true } htmlparser2-7.2.0/src/__fixtures__/Feeds/03-rdf.json000066400000000000000000000001231414322403200221220ustar00rootroot00000000000000{ "name": "RDF test", "file": "RDF_Example.xml", "useSnapshot": true } htmlparser2-7.2.0/src/__fixtures__/Stream/000077500000000000000000000000001414322403200204455ustar00rootroot00000000000000htmlparser2-7.2.0/src/__fixtures__/Stream/01-basic.json000066400000000000000000000001201414322403200226300ustar00rootroot00000000000000{ "name": "Basic html", "file": "Basic.html", "useSnapshot": true } htmlparser2-7.2.0/src/__fixtures__/Stream/02-RSS.json000066400000000000000000000001671414322403200222320ustar00rootroot00000000000000{ "name": "RSS feed", "options": { "xmlMode": true }, "file": "RSS_Example.xml", "useSnapshot": true } htmlparser2-7.2.0/src/__fixtures__/Stream/03-Atom.json000066400000000000000000000001711414322403200224570ustar00rootroot00000000000000{ "name": "Atom feed", "options": { "xmlMode": true }, "file": "Atom_Example.xml", "useSnapshot": true } htmlparser2-7.2.0/src/__fixtures__/Stream/04-RDF.json000066400000000000000000000001671414322403200222000ustar00rootroot00000000000000{ "name": "RDF feed", "options": { "xmlMode": true }, "file": "RDF_Example.xml", "useSnapshot": true } htmlparser2-7.2.0/src/__fixtures__/Stream/05-Attributes.json000066400000000000000000000001251414322403200237060ustar00rootroot00000000000000{ "name": "Attributes", "file": "Attributes.html", "useSnapshot": true } htmlparser2-7.2.0/src/__fixtures__/Stream/06-Svg.json000066400000000000000000000001071414322403200223200ustar00rootroot00000000000000{ "name": "SVG", "file": "Svg.html", "useSnapshot": true } htmlparser2-7.2.0/src/__fixtures__/test-helper.ts000066400000000000000000000105701414322403200220210ustar00rootroot00000000000000import { Parser, Handler, ParserOptions } from "../Parser"; import fs from "fs"; import path from "path"; /** * Write to the parser twice, once a bytes, once as * a single blob. * * @internal * @param handler Handler to execute. * @param options Parsing options. * @param data Data to write. */ export function writeToParser( handler: Partial, options: ParserOptions | undefined, data: string ): void { const parser = new Parser(handler, options); // First, try to run the test via chunks for (let i = 0; i < data.length; i++) { parser.write(data.charAt(i)); } parser.end(); // Then, parse everything parser.parseComplete(data); } interface Event { event: string; data: unknown[]; startIndex?: number; endIndex?: number; } /** * Creates a handler that calls the supplied callback with simplified events on * completion. * * @internal * @param cb Function to call with all events. */ export function getEventCollector( cb: (error: Error | null, events?: Event[]) => void ): Partial { const events: Event[] = []; let parser: Parser; function handle(event: string, ...data: unknown[]): void { if (event === "onerror") { cb(data[0] as Error); } else if (event === "onend") { cb(null, events); } else if (event === "onreset") { events.length = 0; } else if (event === "onparserinit") { parser = data[0] as Parser; // Don't collect event } else if ( event === "ontext" && events[events.length - 1]?.event === "text" ) { const last = events[events.length - 1]; // Combine text nodes (last.data[0] as string) += data[0]; last.endIndex = parser.endIndex; } else { // Remove `undefined`s from attribute responses, as they cannot be represented in JSON. if (event === "onattribute" && data[2] === undefined) { data.pop(); } if (!(parser.startIndex <= parser.endIndex)) { throw new Error( `Invalid start/end index ${parser.startIndex} > ${parser.endIndex}` ); } events.push({ event: event.substr(2), startIndex: parser.startIndex, endIndex: parser.endIndex, data, }); parser.endIndex; } } return new Proxy( {}, { get: (_, event) => handle.bind(null, event as string) } ); } /** * Runs a test suite twice, ensuring input data matches expectations. * * @param file Test file to execute. * @param done Function to call on completion. */ function getCallback(file: TestFile, done: (err?: Error | null) => void) { let firstResult: unknown | undefined; return (err: null | Error, actual?: unknown | unknown[]) => { expect(err).toBeNull(); if (firstResult) { expect(actual).toStrictEqual(firstResult); done(); } else { if (file.useSnapshot) { expect(actual).toMatchSnapshot(); } else { expect(actual).toStrictEqual(file.expected); } firstResult = actual; } }; } interface TestFile { name: string; options?: { parser?: ParserOptions; } & Partial; input: string; file: string; useSnapshot?: boolean; expected?: unknown | unknown[]; } /** * Creates a test suite for a particular directory, with * a specified test function. * * @internal * @param name Name of the test directory. * @param getResult Function to be called with the actual results. */ export function createSuite( name: "Events" | "Feeds" | "Stream", getResult: ( file: TestFile, done: (error: Error | null, actual?: unknown | unknown[]) => void ) => void ): void { describe(name, readDir); function readDir() { const dir = path.join(__dirname, name); fs.readdirSync(dir) .filter((file) => !file.startsWith(".") && !file.startsWith("_")) .map((name) => path.join(dir, name)) .map(require) .forEach(runTest); } function runTest(file: TestFile) { test(file.name, (done) => getResult(file, getCallback(file, done))); } } htmlparser2-7.2.0/src/__snapshots__/000077500000000000000000000000001414322403200173635ustar00rootroot00000000000000htmlparser2-7.2.0/src/__snapshots__/FeedHandler.spec.ts.snap000066400000000000000000000135161414322403200237730ustar00rootroot00000000000000// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Feeds Atom (1.0) 1`] = ` Object { "author": "johndoe@example.com", "description": "A subtitle.", "id": "urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6", "items": Array [ Object { "description": "Some content.", "id": "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", "link": "http://example.org/2003/12/13/atom03", "media": Array [], "pubDate": 2003-12-13T18:30:02.000Z, "title": "Atom-Powered Robots Run Amok", }, Object { "media": Array [], }, ], "link": "http://example.org/feed/", "title": "Example Feed", "type": "atom", "updated": 2003-12-13T18:30:02.000Z, } `; exports[`Feeds RDF test 1`] = ` Object { "id": "", "items": Array [ Object { "description": "Great test content
A link:
Github", "link": "http://somefakesite/path/to/something.html", "media": Array [], "title": "Fast HTML Parsing", }, Object { "description": "The early bird gets the worm", "link": "http://somefakesite/path/to/something-else.html", "media": Array [], "title": "This space intentionally left blank", }, ], "link": "https://github.com/fb55/htmlparser2/", "title": "A title to parse and remember", "type": "rdf", } `; exports[`Feeds RSS (2.0) 1`] = ` Object { "author": "editor@example.com", "description": "Liftoff to Space Exploration.", "id": "", "items": Array [ Object { "description": "How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's Star City.", "id": "http://liftoff.msfc.nasa.gov/2003/06/03.html#item573", "link": "http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp", "media": Array [], "pubDate": 2003-06-03T09:39:21.000Z, "title": "Star City", }, Object { "description": "Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a partial eclipse of the Sun on Saturday, May 31st.", "id": "http://liftoff.msfc.nasa.gov/2003/05/30.html#item572", "media": Array [], "pubDate": 2003-05-30T11:06:42.000Z, }, Object { "description": "Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly. The proposed VASIMR engine would do that.", "id": "http://liftoff.msfc.nasa.gov/2003/05/27.html#item571", "link": "http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp", "media": Array [], "pubDate": 2003-05-27T08:37:32.000Z, "title": "The Engine That Does More", }, Object { "description": "Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options.", "id": "http://liftoff.msfc.nasa.gov/2003/05/20.html#item570", "link": "http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp", "media": Array [ Object { "height": 200, "isDefault": false, "medium": "image", "url": "https://picsum.photos/200", "width": 200, }, ], "pubDate": 2003-05-20T08:56:02.000Z, "title": "Astronauts' Dirty Laundry", }, ], "link": "http://liftoff.msfc.nasa.gov/", "title": "Liftoff News", "type": "rss", "updated": 2003-06-10T09:41:01.000Z, } `; exports[`parseFeed (rssFeed) 1`] = ` Object { "author": "editor@example.com", "description": "Liftoff to Space Exploration.", "id": "", "items": Array [ Object { "description": "How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's Star City.", "id": "http://liftoff.msfc.nasa.gov/2003/06/03.html#item573", "link": "http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp", "media": Array [], "pubDate": 2003-06-03T09:39:21.000Z, "title": "Star City", }, Object { "description": "Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a partial eclipse of the Sun on Saturday, May 31st.", "id": "http://liftoff.msfc.nasa.gov/2003/05/30.html#item572", "media": Array [], "pubDate": 2003-05-30T11:06:42.000Z, }, Object { "description": "Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly. The proposed VASIMR engine would do that.", "id": "http://liftoff.msfc.nasa.gov/2003/05/27.html#item571", "link": "http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp", "media": Array [], "pubDate": 2003-05-27T08:37:32.000Z, "title": "The Engine That Does More", }, Object { "description": "Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options.", "id": "http://liftoff.msfc.nasa.gov/2003/05/20.html#item570", "link": "http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp", "media": Array [ Object { "height": 200, "isDefault": false, "medium": "image", "url": "https://picsum.photos/200", "width": 200, }, ], "pubDate": 2003-05-20T08:56:02.000Z, "title": "Astronauts' Dirty Laundry", }, ], "link": "http://liftoff.msfc.nasa.gov/", "title": "Liftoff News", "type": "rss", "updated": 2003-06-10T09:41:01.000Z, } `; htmlparser2-7.2.0/src/__snapshots__/Tokenizer.spec.ts.snap000066400000000000000000000046031414322403200236010ustar00rootroot00000000000000// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Tokenizer should not lose data when pausing 1`] = ` Array [ Array [ "ontext", "&", ], Array [ "ontext", " it up!", ], Array [ "onend", ], ] `; exports[`Tokenizer should support self-closing special tags for self-closing script tag 1`] = ` Array [ Array [ "onopentagname", "script", ], Array [ "onselfclosingtag", ], Array [ "onopentagname", "div", ], Array [ "onopentagend", ], Array [ "onclosetag", "div", ], Array [ "onend", ], ] `; exports[`Tokenizer should support self-closing special tags for self-closing style tag 1`] = ` Array [ Array [ "onopentagname", "style", ], Array [ "onselfclosingtag", ], Array [ "onopentagname", "div", ], Array [ "onopentagend", ], Array [ "onclosetag", "div", ], Array [ "onend", ], ] `; exports[`Tokenizer should support self-closing special tags for self-closing title tag 1`] = ` Array [ Array [ "onopentagname", "title", ], Array [ "onselfclosingtag", ], Array [ "onopentagname", "div", ], Array [ "onopentagend", ], Array [ "onclosetag", "div", ], Array [ "onend", ], ] `; exports[`Tokenizer should support standard special tags for normal script tag 1`] = ` Array [ Array [ "onopentagname", "script", ], Array [ "onopentagend", ], Array [ "onclosetag", "script", ], Array [ "onopentagname", "div", ], Array [ "onopentagend", ], Array [ "onclosetag", "div", ], Array [ "onend", ], ] `; exports[`Tokenizer should support standard special tags for normal sitle tag 1`] = ` Array [ Array [ "onopentagname", "title", ], Array [ "onopentagend", ], Array [ "onclosetag", "title", ], Array [ "onopentagname", "div", ], Array [ "onopentagend", ], Array [ "onclosetag", "div", ], Array [ "onend", ], ] `; exports[`Tokenizer should support standard special tags for normal style tag 1`] = ` Array [ Array [ "onopentagname", "style", ], Array [ "onopentagend", ], Array [ "onclosetag", "style", ], Array [ "onopentagname", "div", ], Array [ "onopentagend", ], Array [ "onclosetag", "div", ], Array [ "onend", ], ] `; htmlparser2-7.2.0/src/__snapshots__/WritableStream.spec.ts.snap000066400000000000000000002664011414322403200245620ustar00rootroot00000000000000// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Stream Atom feed 1`] = ` Array [ Object { "data": Array [ "?xml", "?xml version=\\"1.0\\" encoding=\\"utf-8\\"?", ], "endIndex": 37, "event": "processinginstruction", "startIndex": 0, }, Object { "data": Array [ " ", ], "endIndex": 38, "event": "text", "startIndex": 38, }, Object { "data": Array [ " http://en.wikipedia.org/wiki/Atom_%28standard%29 ", ], "endIndex": 95, "event": "comment", "startIndex": 39, }, Object { "data": Array [], "endIndex": 95, "event": "commentend", "startIndex": 39, }, Object { "data": Array [ " ", ], "endIndex": 96, "event": "text", "startIndex": 96, }, Object { "data": Array [ "feed", ], "endIndex": 102, "event": "opentagname", "startIndex": 97, }, Object { "data": Array [ "xmlns", "http://www.w3.org/2005/Atom", "\\"", ], "endIndex": 137, "event": "attribute", "startIndex": 103, }, Object { "data": Array [ "feed", Object { "xmlns": "http://www.w3.org/2005/Atom", }, false, ], "endIndex": 138, "event": "opentag", "startIndex": 97, }, Object { "data": Array [ " ", ], "endIndex": 140, "event": "text", "startIndex": 139, }, Object { "data": Array [ "title", ], "endIndex": 147, "event": "opentagname", "startIndex": 141, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 147, "event": "opentag", "startIndex": 141, }, Object { "data": Array [ "Example Feed", ], "endIndex": 159, "event": "text", "startIndex": 148, }, Object { "data": Array [ "title", false, ], "endIndex": 167, "event": "closetag", "startIndex": 160, }, Object { "data": Array [ " ", ], "endIndex": 169, "event": "text", "startIndex": 168, }, Object { "data": Array [ "subtitle", ], "endIndex": 179, "event": "opentagname", "startIndex": 170, }, Object { "data": Array [ "subtitle", Object {}, false, ], "endIndex": 179, "event": "opentag", "startIndex": 170, }, Object { "data": Array [ "A subtitle.", ], "endIndex": 190, "event": "text", "startIndex": 180, }, Object { "data": Array [ "subtitle", false, ], "endIndex": 201, "event": "closetag", "startIndex": 191, }, Object { "data": Array [ " ", ], "endIndex": 203, "event": "text", "startIndex": 202, }, Object { "data": Array [ "link", ], "endIndex": 209, "event": "opentagname", "startIndex": 204, }, Object { "data": Array [ "href", "http://example.org/feed/", "\\"", ], "endIndex": 240, "event": "attribute", "startIndex": 210, }, Object { "data": Array [ "rel", "self", "\\"", ], "endIndex": 251, "event": "attribute", "startIndex": 242, }, Object { "data": Array [ "link", Object { "href": "http://example.org/feed/", "rel": "self", }, false, ], "endIndex": 254, "event": "opentag", "startIndex": 204, }, Object { "data": Array [ "link", true, ], "endIndex": 254, "event": "closetag", "startIndex": 204, }, Object { "data": Array [ " ", ], "endIndex": 256, "event": "text", "startIndex": 255, }, Object { "data": Array [ "link", ], "endIndex": 262, "event": "opentagname", "startIndex": 257, }, Object { "data": Array [ "href", "http://example.org/", "\\"", ], "endIndex": 288, "event": "attribute", "startIndex": 263, }, Object { "data": Array [ "link", Object { "href": "http://example.org/", }, false, ], "endIndex": 291, "event": "opentag", "startIndex": 257, }, Object { "data": Array [ "link", true, ], "endIndex": 291, "event": "closetag", "startIndex": 257, }, Object { "data": Array [ " ", ], "endIndex": 293, "event": "text", "startIndex": 292, }, Object { "data": Array [ "id", ], "endIndex": 297, "event": "opentagname", "startIndex": 294, }, Object { "data": Array [ "id", Object {}, false, ], "endIndex": 297, "event": "opentag", "startIndex": 294, }, Object { "data": Array [ "urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6", ], "endIndex": 342, "event": "text", "startIndex": 298, }, Object { "data": Array [ "id", false, ], "endIndex": 347, "event": "closetag", "startIndex": 343, }, Object { "data": Array [ " ", ], "endIndex": 349, "event": "text", "startIndex": 348, }, Object { "data": Array [ "updated", ], "endIndex": 358, "event": "opentagname", "startIndex": 350, }, Object { "data": Array [ "updated", Object {}, false, ], "endIndex": 358, "event": "opentag", "startIndex": 350, }, Object { "data": Array [ "2003-12-13T18:30:02Z", ], "endIndex": 378, "event": "text", "startIndex": 359, }, Object { "data": Array [ "updated", false, ], "endIndex": 388, "event": "closetag", "startIndex": 379, }, Object { "data": Array [ " ", ], "endIndex": 390, "event": "text", "startIndex": 389, }, Object { "data": Array [ "author", ], "endIndex": 398, "event": "opentagname", "startIndex": 391, }, Object { "data": Array [ "author", Object {}, false, ], "endIndex": 398, "event": "opentag", "startIndex": 391, }, Object { "data": Array [ " ", ], "endIndex": 401, "event": "text", "startIndex": 399, }, Object { "data": Array [ "name", ], "endIndex": 407, "event": "opentagname", "startIndex": 402, }, Object { "data": Array [ "name", Object {}, false, ], "endIndex": 407, "event": "opentag", "startIndex": 402, }, Object { "data": Array [ "John Doe", ], "endIndex": 415, "event": "text", "startIndex": 408, }, Object { "data": Array [ "name", false, ], "endIndex": 422, "event": "closetag", "startIndex": 416, }, Object { "data": Array [ " ", ], "endIndex": 425, "event": "text", "startIndex": 423, }, Object { "data": Array [ "email", ], "endIndex": 432, "event": "opentagname", "startIndex": 426, }, Object { "data": Array [ "email", Object {}, false, ], "endIndex": 432, "event": "opentag", "startIndex": 426, }, Object { "data": Array [ "johndoe@example.com", ], "endIndex": 451, "event": "text", "startIndex": 433, }, Object { "data": Array [ "email", false, ], "endIndex": 459, "event": "closetag", "startIndex": 452, }, Object { "data": Array [ " ", ], "endIndex": 461, "event": "text", "startIndex": 460, }, Object { "data": Array [ "author", false, ], "endIndex": 470, "event": "closetag", "startIndex": 462, }, Object { "data": Array [ " ", ], "endIndex": 473, "event": "text", "startIndex": 471, }, Object { "data": Array [ "entry", ], "endIndex": 480, "event": "opentagname", "startIndex": 474, }, Object { "data": Array [ "entry", Object {}, false, ], "endIndex": 480, "event": "opentag", "startIndex": 474, }, Object { "data": Array [ " ", ], "endIndex": 483, "event": "text", "startIndex": 481, }, Object { "data": Array [ "title", ], "endIndex": 490, "event": "opentagname", "startIndex": 484, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 490, "event": "opentag", "startIndex": 484, }, Object { "data": Array [ "Atom-Powered Robots Run Amok", ], "endIndex": 518, "event": "text", "startIndex": 491, }, Object { "data": Array [ "title", false, ], "endIndex": 526, "event": "closetag", "startIndex": 519, }, Object { "data": Array [ " ", ], "endIndex": 529, "event": "text", "startIndex": 527, }, Object { "data": Array [ "link", ], "endIndex": 535, "event": "opentagname", "startIndex": 530, }, Object { "data": Array [ "href", "http://example.org/2003/12/13/atom03", "\\"", ], "endIndex": 578, "event": "attribute", "startIndex": 536, }, Object { "data": Array [ "link", Object { "href": "http://example.org/2003/12/13/atom03", }, false, ], "endIndex": 581, "event": "opentag", "startIndex": 530, }, Object { "data": Array [ "link", true, ], "endIndex": 581, "event": "closetag", "startIndex": 530, }, Object { "data": Array [ " ", ], "endIndex": 584, "event": "text", "startIndex": 582, }, Object { "data": Array [ "link", ], "endIndex": 590, "event": "opentagname", "startIndex": 585, }, Object { "data": Array [ "rel", "alternate", "\\"", ], "endIndex": 605, "event": "attribute", "startIndex": 591, }, Object { "data": Array [ "type", "text/html", "\\"", ], "endIndex": 622, "event": "attribute", "startIndex": 607, }, Object { "data": Array [ "href", "http://example.org/2003/12/13/atom03.html", "\\"", ], "endIndex": 671, "event": "attribute", "startIndex": 624, }, Object { "data": Array [ "link", Object { "href": "http://example.org/2003/12/13/atom03.html", "rel": "alternate", "type": "text/html", }, false, ], "endIndex": 673, "event": "opentag", "startIndex": 585, }, Object { "data": Array [ "link", true, ], "endIndex": 673, "event": "closetag", "startIndex": 585, }, Object { "data": Array [ " ", ], "endIndex": 676, "event": "text", "startIndex": 674, }, Object { "data": Array [ "link", ], "endIndex": 682, "event": "opentagname", "startIndex": 677, }, Object { "data": Array [ "rel", "edit", "\\"", ], "endIndex": 692, "event": "attribute", "startIndex": 683, }, Object { "data": Array [ "href", "http://example.org/2003/12/13/atom03/edit", "\\"", ], "endIndex": 741, "event": "attribute", "startIndex": 694, }, Object { "data": Array [ "link", Object { "href": "http://example.org/2003/12/13/atom03/edit", "rel": "edit", }, false, ], "endIndex": 743, "event": "opentag", "startIndex": 677, }, Object { "data": Array [ "link", true, ], "endIndex": 743, "event": "closetag", "startIndex": 677, }, Object { "data": Array [ " ", ], "endIndex": 746, "event": "text", "startIndex": 744, }, Object { "data": Array [ "id", ], "endIndex": 750, "event": "opentagname", "startIndex": 747, }, Object { "data": Array [ "id", Object {}, false, ], "endIndex": 750, "event": "opentag", "startIndex": 747, }, Object { "data": Array [ "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", ], "endIndex": 795, "event": "text", "startIndex": 751, }, Object { "data": Array [ "id", false, ], "endIndex": 800, "event": "closetag", "startIndex": 796, }, Object { "data": Array [ " ", ], "endIndex": 803, "event": "text", "startIndex": 801, }, Object { "data": Array [ "updated", ], "endIndex": 812, "event": "opentagname", "startIndex": 804, }, Object { "data": Array [ "updated", Object {}, false, ], "endIndex": 812, "event": "opentag", "startIndex": 804, }, Object { "data": Array [ "2003-12-13T18:30:02Z", ], "endIndex": 832, "event": "text", "startIndex": 813, }, Object { "data": Array [ "updated", false, ], "endIndex": 842, "event": "closetag", "startIndex": 833, }, Object { "data": Array [ " ", ], "endIndex": 845, "event": "text", "startIndex": 843, }, Object { "data": Array [ "content", ], "endIndex": 854, "event": "opentagname", "startIndex": 846, }, Object { "data": Array [ "type", "html", "\\"", ], "endIndex": 865, "event": "attribute", "startIndex": 855, }, Object { "data": Array [ "content", Object { "type": "html", }, false, ], "endIndex": 866, "event": "opentag", "startIndex": 846, }, Object { "data": Array [ "p", ], "endIndex": 869, "event": "opentagname", "startIndex": 867, }, Object { "data": Array [ "p", Object {}, false, ], "endIndex": 869, "event": "opentag", "startIndex": 867, }, Object { "data": Array [ "Some content.", ], "endIndex": 882, "event": "text", "startIndex": 870, }, Object { "data": Array [ "p", false, ], "endIndex": 886, "event": "closetag", "startIndex": 883, }, Object { "data": Array [ "content", false, ], "endIndex": 896, "event": "closetag", "startIndex": 887, }, Object { "data": Array [ " ", ], "endIndex": 898, "event": "text", "startIndex": 897, }, Object { "data": Array [ "entry", false, ], "endIndex": 906, "event": "closetag", "startIndex": 899, }, Object { "data": Array [ " ", ], "endIndex": 909, "event": "text", "startIndex": 907, }, Object { "data": Array [ "entry", ], "endIndex": 916, "event": "opentagname", "startIndex": 910, }, Object { "data": Array [ "entry", Object {}, false, ], "endIndex": 917, "event": "opentag", "startIndex": 910, }, Object { "data": Array [ "entry", true, ], "endIndex": 917, "event": "closetag", "startIndex": 910, }, Object { "data": Array [ " ", ], "endIndex": 919, "event": "text", "startIndex": 918, }, Object { "data": Array [ "feed", false, ], "endIndex": 926, "event": "closetag", "startIndex": 920, }, Object { "data": Array [ " ", ], "endIndex": 927, "event": "text", "startIndex": 927, }, ] `; exports[`Stream Attributes 1`] = ` Array [ Object { "data": Array [ "!doctype", "!doctype html", ], "endIndex": 14, "event": "processinginstruction", "startIndex": 0, }, Object { "data": Array [ " ", ], "endIndex": 15, "event": "text", "startIndex": 15, }, Object { "data": Array [ "html", ], "endIndex": 21, "event": "opentagname", "startIndex": 16, }, Object { "data": Array [ "html", Object {}, false, ], "endIndex": 21, "event": "opentag", "startIndex": 16, }, Object { "data": Array [ " ", ], "endIndex": 22, "event": "text", "startIndex": 22, }, Object { "data": Array [ "head", ], "endIndex": 28, "event": "opentagname", "startIndex": 23, }, Object { "data": Array [ "head", Object {}, false, ], "endIndex": 28, "event": "opentag", "startIndex": 23, }, Object { "data": Array [ " ", ], "endIndex": 30, "event": "text", "startIndex": 29, }, Object { "data": Array [ "title", ], "endIndex": 37, "event": "opentagname", "startIndex": 31, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 37, "event": "opentag", "startIndex": 31, }, Object { "data": Array [ "Attributes test", ], "endIndex": 52, "event": "text", "startIndex": 38, }, Object { "data": Array [ "title", false, ], "endIndex": 60, "event": "closetag", "startIndex": 53, }, Object { "data": Array [ " ", ], "endIndex": 61, "event": "text", "startIndex": 61, }, Object { "data": Array [ "head", false, ], "endIndex": 68, "event": "closetag", "startIndex": 62, }, Object { "data": Array [ " ", ], "endIndex": 69, "event": "text", "startIndex": 69, }, Object { "data": Array [ "body", ], "endIndex": 75, "event": "opentagname", "startIndex": 70, }, Object { "data": Array [ "body", Object {}, false, ], "endIndex": 75, "event": "opentag", "startIndex": 70, }, Object { "data": Array [ " ", ], "endIndex": 77, "event": "text", "startIndex": 76, }, Object { "data": Array [ " Normal attributes ", ], "endIndex": 103, "event": "comment", "startIndex": 78, }, Object { "data": Array [], "endIndex": 103, "event": "commentend", "startIndex": 78, }, Object { "data": Array [ " ", ], "endIndex": 105, "event": "text", "startIndex": 104, }, Object { "data": Array [ "button", ], "endIndex": 113, "event": "opentagname", "startIndex": 106, }, Object { "data": Array [ "id", "test0", "\\"", ], "endIndex": 123, "event": "attribute", "startIndex": 114, }, Object { "data": Array [ "class", "value0", "\\"", ], "endIndex": 138, "event": "attribute", "startIndex": 125, }, Object { "data": Array [ "title", "value1", "\\"", ], "endIndex": 153, "event": "attribute", "startIndex": 140, }, Object { "data": Array [ "button", Object { "class": "value0", "id": "test0", "title": "value1", }, false, ], "endIndex": 154, "event": "opentag", "startIndex": 106, }, Object { "data": Array [ "class=\\"value0\\" title=\\"value1\\"", ], "endIndex": 183, "event": "text", "startIndex": 155, }, Object { "data": Array [ "button", false, ], "endIndex": 192, "event": "closetag", "startIndex": 184, }, Object { "data": Array [ " ", ], "endIndex": 195, "event": "text", "startIndex": 193, }, Object { "data": Array [ " Attributes with no quotes or value ", ], "endIndex": 238, "event": "comment", "startIndex": 196, }, Object { "data": Array [], "endIndex": 238, "event": "commentend", "startIndex": 196, }, Object { "data": Array [ " ", ], "endIndex": 240, "event": "text", "startIndex": 239, }, Object { "data": Array [ "button", ], "endIndex": 248, "event": "opentagname", "startIndex": 241, }, Object { "data": Array [ "id", "test1", "\\"", ], "endIndex": 258, "event": "attribute", "startIndex": 249, }, Object { "data": Array [ "class", "value2", null, ], "endIndex": 272, "event": "attribute", "startIndex": 260, }, Object { "data": Array [ "disabled", "", ], "endIndex": 281, "event": "attribute", "startIndex": 273, }, Object { "data": Array [ "button", Object { "class": "value2", "disabled": "", "id": "test1", }, false, ], "endIndex": 281, "event": "opentag", "startIndex": 241, }, Object { "data": Array [ "class=value2 disabled", ], "endIndex": 302, "event": "text", "startIndex": 282, }, Object { "data": Array [ "button", false, ], "endIndex": 311, "event": "closetag", "startIndex": 303, }, Object { "data": Array [ " ", ], "endIndex": 314, "event": "text", "startIndex": 312, }, Object { "data": Array [ " Attributes with no space between them. No valid, but accepted by the browser ", ], "endIndex": 399, "event": "comment", "startIndex": 315, }, Object { "data": Array [], "endIndex": 399, "event": "commentend", "startIndex": 315, }, Object { "data": Array [ " ", ], "endIndex": 401, "event": "text", "startIndex": 400, }, Object { "data": Array [ "button", ], "endIndex": 409, "event": "opentagname", "startIndex": 402, }, Object { "data": Array [ "id", "test2", "\\"", ], "endIndex": 419, "event": "attribute", "startIndex": 410, }, Object { "data": Array [ "class", "value4", "\\"", ], "endIndex": 434, "event": "attribute", "startIndex": 421, }, Object { "data": Array [ "title", "value5", "\\"", ], "endIndex": 448, "event": "attribute", "startIndex": 435, }, Object { "data": Array [ "button", Object { "class": "value4", "id": "test2", "title": "value5", }, false, ], "endIndex": 449, "event": "opentag", "startIndex": 402, }, Object { "data": Array [ "class=\\"value4\\"title=\\"value5\\"", ], "endIndex": 477, "event": "text", "startIndex": 450, }, Object { "data": Array [ "button", false, ], "endIndex": 486, "event": "closetag", "startIndex": 478, }, Object { "data": Array [ " ", ], "endIndex": 487, "event": "text", "startIndex": 487, }, Object { "data": Array [ "body", false, ], "endIndex": 494, "event": "closetag", "startIndex": 488, }, Object { "data": Array [ " ", ], "endIndex": 495, "event": "text", "startIndex": 495, }, Object { "data": Array [ "html", false, ], "endIndex": 502, "event": "closetag", "startIndex": 496, }, ] `; exports[`Stream Basic html 1`] = ` Array [ Object { "data": Array [ "!doctype", "!DOCTYPE html", ], "endIndex": 14, "event": "processinginstruction", "startIndex": 0, }, Object { "data": Array [ "html", ], "endIndex": 20, "event": "opentagname", "startIndex": 15, }, Object { "data": Array [ "html", Object {}, false, ], "endIndex": 20, "event": "opentag", "startIndex": 15, }, Object { "data": Array [ "title", ], "endIndex": 27, "event": "opentagname", "startIndex": 21, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 27, "event": "opentag", "startIndex": 21, }, Object { "data": Array [ "The Title", ], "endIndex": 36, "event": "text", "startIndex": 28, }, Object { "data": Array [ "title", false, ], "endIndex": 44, "event": "closetag", "startIndex": 37, }, Object { "data": Array [ "body", ], "endIndex": 50, "event": "opentagname", "startIndex": 45, }, Object { "data": Array [ "body", Object {}, false, ], "endIndex": 50, "event": "opentag", "startIndex": 45, }, Object { "data": Array [ "Hello world", ], "endIndex": 61, "event": "text", "startIndex": 51, }, Object { "data": Array [ "body", false, ], "endIndex": 68, "event": "closetag", "startIndex": 62, }, Object { "data": Array [ "html", false, ], "endIndex": 75, "event": "closetag", "startIndex": 69, }, ] `; exports[`Stream RDF feed 1`] = ` Array [ Object { "data": Array [ "?xml", "?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?", ], "endIndex": 37, "event": "processinginstruction", "startIndex": 0, }, Object { "data": Array [ " ", ], "endIndex": 38, "event": "text", "startIndex": 38, }, Object { "data": Array [ "rdf:RDF", ], "endIndex": 47, "event": "opentagname", "startIndex": 39, }, Object { "data": Array [ "xmlns:rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "\\"", ], "endIndex": 102, "event": "attribute", "startIndex": 48, }, Object { "data": Array [ "xmlns", "http://purl.org/rss/1.0/", "\\"", ], "endIndex": 135, "event": "attribute", "startIndex": 104, }, Object { "data": Array [ "xmlns:ev", "http://purl.org/rss/1.0/modules/event/", "\\"", ], "endIndex": 185, "event": "attribute", "startIndex": 137, }, Object { "data": Array [ "xmlns:content", "http://purl.org/rss/1.0/modules/content/", "\\"", ], "endIndex": 242, "event": "attribute", "startIndex": 187, }, Object { "data": Array [ "xmlns:taxo", "http://purl.org/rss/1.0/modules/taxonomy/", "\\"", ], "endIndex": 297, "event": "attribute", "startIndex": 244, }, Object { "data": Array [ "xmlns:dc", "http://purl.org/dc/elements/1.1/", "\\"", ], "endIndex": 341, "event": "attribute", "startIndex": 299, }, Object { "data": Array [ "xmlns:syn", "http://purl.org/rss/1.0/modules/syndication/", "\\"", ], "endIndex": 398, "event": "attribute", "startIndex": 343, }, Object { "data": Array [ "xmlns:dcterms", "http://purl.org/dc/terms/", "\\"", ], "endIndex": 440, "event": "attribute", "startIndex": 400, }, Object { "data": Array [ "xmlns:admin", "http://webns.net/mvcb/", "\\"", ], "endIndex": 477, "event": "attribute", "startIndex": 442, }, Object { "data": Array [ "rdf:RDF", Object { "xmlns": "http://purl.org/rss/1.0/", "xmlns:admin": "http://webns.net/mvcb/", "xmlns:content": "http://purl.org/rss/1.0/modules/content/", "xmlns:dc": "http://purl.org/dc/elements/1.1/", "xmlns:dcterms": "http://purl.org/dc/terms/", "xmlns:ev": "http://purl.org/rss/1.0/modules/event/", "xmlns:rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "xmlns:syn": "http://purl.org/rss/1.0/modules/syndication/", "xmlns:taxo": "http://purl.org/rss/1.0/modules/taxonomy/", }, false, ], "endIndex": 478, "event": "opentag", "startIndex": 39, }, Object { "data": Array [ " ", ], "endIndex": 480, "event": "text", "startIndex": 479, }, Object { "data": Array [ "channel", ], "endIndex": 489, "event": "opentagname", "startIndex": 481, }, Object { "data": Array [ "rdf:about", "https://github.com/fb55/htmlparser2/", "\\"", ], "endIndex": 537, "event": "attribute", "startIndex": 490, }, Object { "data": Array [ "channel", Object { "rdf:about": "https://github.com/fb55/htmlparser2/", }, false, ], "endIndex": 538, "event": "opentag", "startIndex": 481, }, Object { "data": Array [ " ", ], "endIndex": 541, "event": "text", "startIndex": 539, }, Object { "data": Array [ "title", ], "endIndex": 548, "event": "opentagname", "startIndex": 542, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 548, "event": "opentag", "startIndex": 542, }, Object { "data": Array [ "A title to parse and remember", ], "endIndex": 577, "event": "text", "startIndex": 549, }, Object { "data": Array [ "title", false, ], "endIndex": 585, "event": "closetag", "startIndex": 578, }, Object { "data": Array [ " ", ], "endIndex": 588, "event": "text", "startIndex": 586, }, Object { "data": Array [ "link", ], "endIndex": 594, "event": "opentagname", "startIndex": 589, }, Object { "data": Array [ "link", Object {}, false, ], "endIndex": 594, "event": "opentag", "startIndex": 589, }, Object { "data": Array [ "https://github.com/fb55/htmlparser2/", ], "endIndex": 630, "event": "text", "startIndex": 595, }, Object { "data": Array [ "link", false, ], "endIndex": 637, "event": "closetag", "startIndex": 631, }, Object { "data": Array [ " ", ], "endIndex": 640, "event": "text", "startIndex": 638, }, Object { "data": Array [ "description", ], "endIndex": 653, "event": "opentagname", "startIndex": 641, }, Object { "data": Array [ "description", Object {}, false, ], "endIndex": 654, "event": "opentag", "startIndex": 641, }, Object { "data": Array [ "description", true, ], "endIndex": 654, "event": "closetag", "startIndex": 641, }, Object { "data": Array [ " ", ], "endIndex": 657, "event": "text", "startIndex": 655, }, Object { "data": Array [ "dc:language", ], "endIndex": 670, "event": "opentagname", "startIndex": 658, }, Object { "data": Array [ "dc:language", Object {}, false, ], "endIndex": 670, "event": "opentag", "startIndex": 658, }, Object { "data": Array [ "en-us", ], "endIndex": 675, "event": "text", "startIndex": 671, }, Object { "data": Array [ "dc:language", false, ], "endIndex": 689, "event": "closetag", "startIndex": 676, }, Object { "data": Array [ " ", ], "endIndex": 692, "event": "text", "startIndex": 690, }, Object { "data": Array [ "dc:rights", ], "endIndex": 703, "event": "opentagname", "startIndex": 693, }, Object { "data": Array [ "dc:rights", Object {}, false, ], "endIndex": 703, "event": "opentag", "startIndex": 693, }, Object { "data": Array [ "Copyright 2015 the authors", ], "endIndex": 729, "event": "text", "startIndex": 704, }, Object { "data": Array [ "dc:rights", false, ], "endIndex": 741, "event": "closetag", "startIndex": 730, }, Object { "data": Array [ " ", ], "endIndex": 744, "event": "text", "startIndex": 742, }, Object { "data": Array [ "dc:publisher", ], "endIndex": 758, "event": "opentagname", "startIndex": 745, }, Object { "data": Array [ "dc:publisher", Object {}, false, ], "endIndex": 758, "event": "opentag", "startIndex": 745, }, Object { "data": Array [ "webmaster@thisisafakedoma.in", ], "endIndex": 786, "event": "text", "startIndex": 759, }, Object { "data": Array [ "dc:publisher", false, ], "endIndex": 801, "event": "closetag", "startIndex": 787, }, Object { "data": Array [ " ", ], "endIndex": 804, "event": "text", "startIndex": 802, }, Object { "data": Array [ "dc:creator", ], "endIndex": 816, "event": "opentagname", "startIndex": 805, }, Object { "data": Array [ "dc:creator", Object {}, false, ], "endIndex": 816, "event": "opentag", "startIndex": 805, }, Object { "data": Array [ "webmaster@thisisafakedoma.in", ], "endIndex": 844, "event": "text", "startIndex": 817, }, Object { "data": Array [ "dc:creator", false, ], "endIndex": 857, "event": "closetag", "startIndex": 845, }, Object { "data": Array [ " ", ], "endIndex": 860, "event": "text", "startIndex": 858, }, Object { "data": Array [ "dc:source", ], "endIndex": 871, "event": "opentagname", "startIndex": 861, }, Object { "data": Array [ "dc:source", Object {}, false, ], "endIndex": 871, "event": "opentag", "startIndex": 861, }, Object { "data": Array [ "https://github.com/fb55/htmlparser2/", ], "endIndex": 907, "event": "text", "startIndex": 872, }, Object { "data": Array [ "dc:source", false, ], "endIndex": 919, "event": "closetag", "startIndex": 908, }, Object { "data": Array [ " ", ], "endIndex": 922, "event": "text", "startIndex": 920, }, Object { "data": Array [ "dc:title", ], "endIndex": 932, "event": "opentagname", "startIndex": 923, }, Object { "data": Array [ "dc:title", Object {}, false, ], "endIndex": 932, "event": "opentag", "startIndex": 923, }, Object { "data": Array [ "A title to parse and remember", ], "endIndex": 961, "event": "text", "startIndex": 933, }, Object { "data": Array [ "dc:title", false, ], "endIndex": 972, "event": "closetag", "startIndex": 962, }, Object { "data": Array [ " ", ], "endIndex": 975, "event": "text", "startIndex": 973, }, Object { "data": Array [ "dc:type", ], "endIndex": 984, "event": "opentagname", "startIndex": 976, }, Object { "data": Array [ "dc:type", Object {}, false, ], "endIndex": 984, "event": "opentag", "startIndex": 976, }, Object { "data": Array [ "Collection", ], "endIndex": 994, "event": "text", "startIndex": 985, }, Object { "data": Array [ "dc:type", false, ], "endIndex": 1004, "event": "closetag", "startIndex": 995, }, Object { "data": Array [ " ", ], "endIndex": 1007, "event": "text", "startIndex": 1005, }, Object { "data": Array [ "syn:updateBase", ], "endIndex": 1023, "event": "opentagname", "startIndex": 1008, }, Object { "data": Array [ "syn:updateBase", Object {}, false, ], "endIndex": 1023, "event": "opentag", "startIndex": 1008, }, Object { "data": Array [ "2011-11-04T09:39:10-07:00", ], "endIndex": 1048, "event": "text", "startIndex": 1024, }, Object { "data": Array [ "syn:updateBase", false, ], "endIndex": 1065, "event": "closetag", "startIndex": 1049, }, Object { "data": Array [ " ", ], "endIndex": 1068, "event": "text", "startIndex": 1066, }, Object { "data": Array [ "syn:updateFrequency", ], "endIndex": 1089, "event": "opentagname", "startIndex": 1069, }, Object { "data": Array [ "syn:updateFrequency", Object {}, false, ], "endIndex": 1089, "event": "opentag", "startIndex": 1069, }, Object { "data": Array [ "4", ], "endIndex": 1090, "event": "text", "startIndex": 1090, }, Object { "data": Array [ "syn:updateFrequency", false, ], "endIndex": 1112, "event": "closetag", "startIndex": 1091, }, Object { "data": Array [ " ", ], "endIndex": 1115, "event": "text", "startIndex": 1113, }, Object { "data": Array [ "syn:updatePeriod", ], "endIndex": 1133, "event": "opentagname", "startIndex": 1116, }, Object { "data": Array [ "syn:updatePeriod", Object {}, false, ], "endIndex": 1133, "event": "opentag", "startIndex": 1116, }, Object { "data": Array [ "hourly", ], "endIndex": 1139, "event": "text", "startIndex": 1134, }, Object { "data": Array [ "syn:updatePeriod", false, ], "endIndex": 1158, "event": "closetag", "startIndex": 1140, }, Object { "data": Array [ " ", ], "endIndex": 1161, "event": "text", "startIndex": 1159, }, Object { "data": Array [ "items", ], "endIndex": 1168, "event": "opentagname", "startIndex": 1162, }, Object { "data": Array [ "items", Object {}, false, ], "endIndex": 1168, "event": "opentag", "startIndex": 1162, }, Object { "data": Array [ " ", ], "endIndex": 1172, "event": "text", "startIndex": 1169, }, Object { "data": Array [ "rdf:Seq", ], "endIndex": 1181, "event": "opentagname", "startIndex": 1173, }, Object { "data": Array [ "rdf:Seq", Object {}, false, ], "endIndex": 1181, "event": "opentag", "startIndex": 1173, }, Object { "data": Array [ " ", ], "endIndex": 1186, "event": "text", "startIndex": 1182, }, Object { "data": Array [ "rdf:li", ], "endIndex": 1194, "event": "opentagname", "startIndex": 1187, }, Object { "data": Array [ "rdf:resource", "http://somefakesite/path/to/something.html", "\\"", ], "endIndex": 1251, "event": "attribute", "startIndex": 1195, }, Object { "data": Array [ "rdf:li", Object { "rdf:resource": "http://somefakesite/path/to/something.html", }, false, ], "endIndex": 1253, "event": "opentag", "startIndex": 1187, }, Object { "data": Array [ "rdf:li", true, ], "endIndex": 1253, "event": "closetag", "startIndex": 1187, }, Object { "data": Array [ " ", ], "endIndex": 1257, "event": "text", "startIndex": 1254, }, Object { "data": Array [ "rdf:Seq", false, ], "endIndex": 1267, "event": "closetag", "startIndex": 1258, }, Object { "data": Array [ " ", ], "endIndex": 1270, "event": "text", "startIndex": 1268, }, Object { "data": Array [ "items", false, ], "endIndex": 1278, "event": "closetag", "startIndex": 1271, }, Object { "data": Array [ " ", ], "endIndex": 1280, "event": "text", "startIndex": 1279, }, Object { "data": Array [ "channel", false, ], "endIndex": 1290, "event": "closetag", "startIndex": 1281, }, Object { "data": Array [ " ", ], "endIndex": 1292, "event": "text", "startIndex": 1291, }, Object { "data": Array [ "item", ], "endIndex": 1298, "event": "opentagname", "startIndex": 1293, }, Object { "data": Array [ "rdf:about", "http://somefakesite/path/to/something.html", "\\"", ], "endIndex": 1352, "event": "attribute", "startIndex": 1299, }, Object { "data": Array [ "item", Object { "rdf:about": "http://somefakesite/path/to/something.html", }, false, ], "endIndex": 1353, "event": "opentag", "startIndex": 1293, }, Object { "data": Array [ " ", ], "endIndex": 1356, "event": "text", "startIndex": 1354, }, Object { "data": Array [ "title", ], "endIndex": 1363, "event": "opentagname", "startIndex": 1357, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 1363, "event": "opentag", "startIndex": 1357, }, Object { "data": Array [], "endIndex": 1394, "event": "cdatastart", "startIndex": 1364, }, Object { "data": Array [ " Fast HTML Parsing ", ], "endIndex": 1394, "event": "text", "startIndex": 1364, }, Object { "data": Array [], "endIndex": 1394, "event": "cdataend", "startIndex": 1364, }, Object { "data": Array [ "title", false, ], "endIndex": 1402, "event": "closetag", "startIndex": 1395, }, Object { "data": Array [ " ", ], "endIndex": 1405, "event": "text", "startIndex": 1403, }, Object { "data": Array [ "link", ], "endIndex": 1411, "event": "opentagname", "startIndex": 1406, }, Object { "data": Array [ "link", Object {}, false, ], "endIndex": 1411, "event": "opentag", "startIndex": 1406, }, Object { "data": Array [ " http://somefakesite/path/to/something.html ", ], "endIndex": 1455, "event": "text", "startIndex": 1412, }, Object { "data": Array [ "link", false, ], "endIndex": 1462, "event": "closetag", "startIndex": 1456, }, Object { "data": Array [ " ", ], "endIndex": 1465, "event": "text", "startIndex": 1463, }, Object { "data": Array [ "description", ], "endIndex": 1478, "event": "opentagname", "startIndex": 1466, }, Object { "data": Array [ "description", Object {}, false, ], "endIndex": 1478, "event": "opentag", "startIndex": 1466, }, Object { "data": Array [], "endIndex": 1560, "event": "cdatastart", "startIndex": 1479, }, Object { "data": Array [ " Great test content
A link: Github ", ], "endIndex": 1560, "event": "text", "startIndex": 1479, }, Object { "data": Array [], "endIndex": 1560, "event": "cdataend", "startIndex": 1479, }, Object { "data": Array [ "description", false, ], "endIndex": 1574, "event": "closetag", "startIndex": 1561, }, Object { "data": Array [ " ", ], "endIndex": 1577, "event": "text", "startIndex": 1575, }, Object { "data": Array [ "dc:date", ], "endIndex": 1586, "event": "opentagname", "startIndex": 1578, }, Object { "data": Array [ "dc:date", Object {}, false, ], "endIndex": 1586, "event": "opentag", "startIndex": 1578, }, Object { "data": Array [ "2011-11-04T09:35:17-07:00", ], "endIndex": 1611, "event": "text", "startIndex": 1587, }, Object { "data": Array [ "dc:date", false, ], "endIndex": 1621, "event": "closetag", "startIndex": 1612, }, Object { "data": Array [ " ", ], "endIndex": 1624, "event": "text", "startIndex": 1622, }, Object { "data": Array [ "dc:language", ], "endIndex": 1637, "event": "opentagname", "startIndex": 1625, }, Object { "data": Array [ "dc:language", Object {}, false, ], "endIndex": 1637, "event": "opentag", "startIndex": 1625, }, Object { "data": Array [ "en-us", ], "endIndex": 1642, "event": "text", "startIndex": 1638, }, Object { "data": Array [ "dc:language", false, ], "endIndex": 1656, "event": "closetag", "startIndex": 1643, }, Object { "data": Array [ " ", ], "endIndex": 1659, "event": "text", "startIndex": 1657, }, Object { "data": Array [ "dc:rights", ], "endIndex": 1670, "event": "opentagname", "startIndex": 1660, }, Object { "data": Array [ "dc:rights", Object {}, false, ], "endIndex": 1670, "event": "opentag", "startIndex": 1660, }, Object { "data": Array [ "Copyright 2015 the authors", ], "endIndex": 1696, "event": "text", "startIndex": 1671, }, Object { "data": Array [ "dc:rights", false, ], "endIndex": 1708, "event": "closetag", "startIndex": 1697, }, Object { "data": Array [ " ", ], "endIndex": 1711, "event": "text", "startIndex": 1709, }, Object { "data": Array [ "dc:source", ], "endIndex": 1722, "event": "opentagname", "startIndex": 1712, }, Object { "data": Array [ "dc:source", Object {}, false, ], "endIndex": 1722, "event": "opentag", "startIndex": 1712, }, Object { "data": Array [ " http://somefakesite/path/to/something.html ", ], "endIndex": 1766, "event": "text", "startIndex": 1723, }, Object { "data": Array [ "dc:source", false, ], "endIndex": 1778, "event": "closetag", "startIndex": 1767, }, Object { "data": Array [ " ", ], "endIndex": 1781, "event": "text", "startIndex": 1779, }, Object { "data": Array [ "dc:title", ], "endIndex": 1791, "event": "opentagname", "startIndex": 1782, }, Object { "data": Array [ "dc:title", Object {}, false, ], "endIndex": 1791, "event": "opentag", "startIndex": 1782, }, Object { "data": Array [], "endIndex": 1822, "event": "cdatastart", "startIndex": 1792, }, Object { "data": Array [ " Fast HTML Parsing ", ], "endIndex": 1822, "event": "text", "startIndex": 1792, }, Object { "data": Array [], "endIndex": 1822, "event": "cdataend", "startIndex": 1792, }, Object { "data": Array [ "dc:title", false, ], "endIndex": 1833, "event": "closetag", "startIndex": 1823, }, Object { "data": Array [ " ", ], "endIndex": 1836, "event": "text", "startIndex": 1834, }, Object { "data": Array [ "dc:type", ], "endIndex": 1845, "event": "opentagname", "startIndex": 1837, }, Object { "data": Array [ "dc:type", Object {}, false, ], "endIndex": 1845, "event": "opentag", "startIndex": 1837, }, Object { "data": Array [ "text", ], "endIndex": 1849, "event": "text", "startIndex": 1846, }, Object { "data": Array [ "dc:type", false, ], "endIndex": 1859, "event": "closetag", "startIndex": 1850, }, Object { "data": Array [ " ", ], "endIndex": 1862, "event": "text", "startIndex": 1860, }, Object { "data": Array [ "dcterms:issued", ], "endIndex": 1878, "event": "opentagname", "startIndex": 1863, }, Object { "data": Array [ "dcterms:issued", Object {}, false, ], "endIndex": 1878, "event": "opentag", "startIndex": 1863, }, Object { "data": Array [ "2011-11-04T09:35:17-07:00", ], "endIndex": 1903, "event": "text", "startIndex": 1879, }, Object { "data": Array [ "dcterms:issued", false, ], "endIndex": 1920, "event": "closetag", "startIndex": 1904, }, Object { "data": Array [ " ", ], "endIndex": 1922, "event": "text", "startIndex": 1921, }, Object { "data": Array [ "item", false, ], "endIndex": 1929, "event": "closetag", "startIndex": 1923, }, Object { "data": Array [ " ", ], "endIndex": 1931, "event": "text", "startIndex": 1930, }, Object { "data": Array [ "item", ], "endIndex": 1937, "event": "opentagname", "startIndex": 1932, }, Object { "data": Array [ "rdf:about", "http://somefakesite/path/to/something-else.html", "\\"", ], "endIndex": 1996, "event": "attribute", "startIndex": 1938, }, Object { "data": Array [ "item", Object { "rdf:about": "http://somefakesite/path/to/something-else.html", }, false, ], "endIndex": 1997, "event": "opentag", "startIndex": 1932, }, Object { "data": Array [ " ", ], "endIndex": 2000, "event": "text", "startIndex": 1998, }, Object { "data": Array [ "title", ], "endIndex": 2007, "event": "opentagname", "startIndex": 2001, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 2007, "event": "opentag", "startIndex": 2001, }, Object { "data": Array [], "endIndex": 2056, "event": "cdatastart", "startIndex": 2008, }, Object { "data": Array [ " This space intentionally left blank ", ], "endIndex": 2056, "event": "text", "startIndex": 2008, }, Object { "data": Array [], "endIndex": 2056, "event": "cdataend", "startIndex": 2008, }, Object { "data": Array [ "title", false, ], "endIndex": 2064, "event": "closetag", "startIndex": 2057, }, Object { "data": Array [ " ", ], "endIndex": 2067, "event": "text", "startIndex": 2065, }, Object { "data": Array [ "link", ], "endIndex": 2073, "event": "opentagname", "startIndex": 2068, }, Object { "data": Array [ "link", Object {}, false, ], "endIndex": 2073, "event": "opentag", "startIndex": 2068, }, Object { "data": Array [ " http://somefakesite/path/to/something-else.html ", ], "endIndex": 2122, "event": "text", "startIndex": 2074, }, Object { "data": Array [ "link", false, ], "endIndex": 2129, "event": "closetag", "startIndex": 2123, }, Object { "data": Array [ " ", ], "endIndex": 2132, "event": "text", "startIndex": 2130, }, Object { "data": Array [ "description", ], "endIndex": 2145, "event": "opentagname", "startIndex": 2133, }, Object { "data": Array [ "description", Object {}, false, ], "endIndex": 2145, "event": "opentag", "startIndex": 2133, }, Object { "data": Array [], "endIndex": 2187, "event": "cdatastart", "startIndex": 2146, }, Object { "data": Array [ " The early bird gets the worm ", ], "endIndex": 2187, "event": "text", "startIndex": 2146, }, Object { "data": Array [], "endIndex": 2187, "event": "cdataend", "startIndex": 2146, }, Object { "data": Array [ "description", false, ], "endIndex": 2201, "event": "closetag", "startIndex": 2188, }, Object { "data": Array [ " ", ], "endIndex": 2204, "event": "text", "startIndex": 2202, }, Object { "data": Array [ "dc:date", ], "endIndex": 2213, "event": "opentagname", "startIndex": 2205, }, Object { "data": Array [ "dc:date", Object {}, false, ], "endIndex": 2213, "event": "opentag", "startIndex": 2205, }, Object { "data": Array [ "2011-11-04T09:34:54-07:00", ], "endIndex": 2238, "event": "text", "startIndex": 2214, }, Object { "data": Array [ "dc:date", false, ], "endIndex": 2248, "event": "closetag", "startIndex": 2239, }, Object { "data": Array [ " ", ], "endIndex": 2251, "event": "text", "startIndex": 2249, }, Object { "data": Array [ "dc:language", ], "endIndex": 2264, "event": "opentagname", "startIndex": 2252, }, Object { "data": Array [ "dc:language", Object {}, false, ], "endIndex": 2264, "event": "opentag", "startIndex": 2252, }, Object { "data": Array [ "en-us", ], "endIndex": 2269, "event": "text", "startIndex": 2265, }, Object { "data": Array [ "dc:language", false, ], "endIndex": 2283, "event": "closetag", "startIndex": 2270, }, Object { "data": Array [ " ", ], "endIndex": 2286, "event": "text", "startIndex": 2284, }, Object { "data": Array [ "dc:rights", ], "endIndex": 2297, "event": "opentagname", "startIndex": 2287, }, Object { "data": Array [ "dc:rights", Object {}, false, ], "endIndex": 2297, "event": "opentag", "startIndex": 2287, }, Object { "data": Array [ "Copyright 2015 the authors", ], "endIndex": 2323, "event": "text", "startIndex": 2298, }, Object { "data": Array [ "dc:rights", false, ], "endIndex": 2335, "event": "closetag", "startIndex": 2324, }, Object { "data": Array [ " ", ], "endIndex": 2338, "event": "text", "startIndex": 2336, }, Object { "data": Array [ "dc:source", ], "endIndex": 2349, "event": "opentagname", "startIndex": 2339, }, Object { "data": Array [ "dc:source", Object {}, false, ], "endIndex": 2349, "event": "opentag", "startIndex": 2339, }, Object { "data": Array [ " http://somefakesite/path/to/something-else.html ", ], "endIndex": 2398, "event": "text", "startIndex": 2350, }, Object { "data": Array [ "dc:source", false, ], "endIndex": 2410, "event": "closetag", "startIndex": 2399, }, Object { "data": Array [ " ", ], "endIndex": 2413, "event": "text", "startIndex": 2411, }, Object { "data": Array [ "dc:title", ], "endIndex": 2423, "event": "opentagname", "startIndex": 2414, }, Object { "data": Array [ "dc:title", Object {}, false, ], "endIndex": 2423, "event": "opentag", "startIndex": 2414, }, Object { "data": Array [], "endIndex": 2472, "event": "cdatastart", "startIndex": 2424, }, Object { "data": Array [ " This space intentionally left blank ", ], "endIndex": 2472, "event": "text", "startIndex": 2424, }, Object { "data": Array [], "endIndex": 2472, "event": "cdataend", "startIndex": 2424, }, Object { "data": Array [ "dc:title", false, ], "endIndex": 2483, "event": "closetag", "startIndex": 2473, }, Object { "data": Array [ " ", ], "endIndex": 2486, "event": "text", "startIndex": 2484, }, Object { "data": Array [ "dc:type", ], "endIndex": 2495, "event": "opentagname", "startIndex": 2487, }, Object { "data": Array [ "dc:type", Object {}, false, ], "endIndex": 2495, "event": "opentag", "startIndex": 2487, }, Object { "data": Array [ "text", ], "endIndex": 2499, "event": "text", "startIndex": 2496, }, Object { "data": Array [ "dc:type", false, ], "endIndex": 2509, "event": "closetag", "startIndex": 2500, }, Object { "data": Array [ " ", ], "endIndex": 2512, "event": "text", "startIndex": 2510, }, Object { "data": Array [ "dcterms:issued", ], "endIndex": 2528, "event": "opentagname", "startIndex": 2513, }, Object { "data": Array [ "dcterms:issued", Object {}, false, ], "endIndex": 2528, "event": "opentag", "startIndex": 2513, }, Object { "data": Array [ "2011-11-04T09:34:54-07:00", ], "endIndex": 2553, "event": "text", "startIndex": 2529, }, Object { "data": Array [ "dcterms:issued", false, ], "endIndex": 2570, "event": "closetag", "startIndex": 2554, }, Object { "data": Array [ " ", ], "endIndex": 2572, "event": "text", "startIndex": 2571, }, Object { "data": Array [ "item", false, ], "endIndex": 2579, "event": "closetag", "startIndex": 2573, }, Object { "data": Array [ " ", ], "endIndex": 2580, "event": "text", "startIndex": 2580, }, Object { "data": Array [ "rdf:RDF", false, ], "endIndex": 2590, "event": "closetag", "startIndex": 2581, }, ] `; exports[`Stream RSS feed 1`] = ` Array [ Object { "data": Array [ "?xml", "?xml version=\\"1.0\\"?", ], "endIndex": 20, "event": "processinginstruction", "startIndex": 0, }, Object { "data": Array [ " ", ], "endIndex": 21, "event": "text", "startIndex": 21, }, Object { "data": Array [ " http://cyber.law.harvard.edu/rss/examples/rss2sample.xml ", ], "endIndex": 86, "event": "comment", "startIndex": 22, }, Object { "data": Array [], "endIndex": 86, "event": "commentend", "startIndex": 22, }, Object { "data": Array [ " ", ], "endIndex": 87, "event": "text", "startIndex": 87, }, Object { "data": Array [ "rss", ], "endIndex": 92, "event": "opentagname", "startIndex": 88, }, Object { "data": Array [ "version", "2.0", "\\"", ], "endIndex": 105, "event": "attribute", "startIndex": 93, }, Object { "data": Array [ "rss", Object { "version": "2.0", }, false, ], "endIndex": 106, "event": "opentag", "startIndex": 88, }, Object { "data": Array [ " ", ], "endIndex": 110, "event": "text", "startIndex": 107, }, Object { "data": Array [ "channel", ], "endIndex": 119, "event": "opentagname", "startIndex": 111, }, Object { "data": Array [ "channel", Object {}, false, ], "endIndex": 119, "event": "opentag", "startIndex": 111, }, Object { "data": Array [ " ", ], "endIndex": 126, "event": "text", "startIndex": 120, }, Object { "data": Array [ "title", ], "endIndex": 133, "event": "opentagname", "startIndex": 127, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 133, "event": "opentag", "startIndex": 127, }, Object { "data": Array [ "Liftoff News", ], "endIndex": 145, "event": "text", "startIndex": 134, }, Object { "data": Array [ "title", false, ], "endIndex": 153, "event": "closetag", "startIndex": 146, }, Object { "data": Array [ " ", ], "endIndex": 160, "event": "text", "startIndex": 154, }, Object { "data": Array [ "link", ], "endIndex": 166, "event": "opentagname", "startIndex": 161, }, Object { "data": Array [ "link", Object {}, false, ], "endIndex": 166, "event": "opentag", "startIndex": 161, }, Object { "data": Array [ "http://liftoff.msfc.nasa.gov/", ], "endIndex": 195, "event": "text", "startIndex": 167, }, Object { "data": Array [ "link", false, ], "endIndex": 202, "event": "closetag", "startIndex": 196, }, Object { "data": Array [ " ", ], "endIndex": 209, "event": "text", "startIndex": 203, }, Object { "data": Array [ "description", ], "endIndex": 222, "event": "opentagname", "startIndex": 210, }, Object { "data": Array [ "description", Object {}, false, ], "endIndex": 222, "event": "opentag", "startIndex": 210, }, Object { "data": Array [ "Liftoff to Space Exploration.", ], "endIndex": 251, "event": "text", "startIndex": 223, }, Object { "data": Array [ "description", false, ], "endIndex": 265, "event": "closetag", "startIndex": 252, }, Object { "data": Array [ " ", ], "endIndex": 272, "event": "text", "startIndex": 266, }, Object { "data": Array [ "language", ], "endIndex": 282, "event": "opentagname", "startIndex": 273, }, Object { "data": Array [ "language", Object {}, false, ], "endIndex": 282, "event": "opentag", "startIndex": 273, }, Object { "data": Array [ "en-us", ], "endIndex": 287, "event": "text", "startIndex": 283, }, Object { "data": Array [ "language", false, ], "endIndex": 298, "event": "closetag", "startIndex": 288, }, Object { "data": Array [ " ", ], "endIndex": 305, "event": "text", "startIndex": 299, }, Object { "data": Array [ "pubDate", ], "endIndex": 314, "event": "opentagname", "startIndex": 306, }, Object { "data": Array [ "pubDate", Object {}, false, ], "endIndex": 314, "event": "opentag", "startIndex": 306, }, Object { "data": Array [ "Tue, 10 Jun 2003 04:00:00 GMT", ], "endIndex": 343, "event": "text", "startIndex": 315, }, Object { "data": Array [ "pubDate", false, ], "endIndex": 353, "event": "closetag", "startIndex": 344, }, Object { "data": Array [ " ", ], "endIndex": 361, "event": "text", "startIndex": 354, }, Object { "data": Array [ "lastBuildDate", ], "endIndex": 376, "event": "opentagname", "startIndex": 362, }, Object { "data": Array [ "lastBuildDate", Object {}, false, ], "endIndex": 376, "event": "opentag", "startIndex": 362, }, Object { "data": Array [ "Tue, 10 Jun 2003 09:41:01 GMT", ], "endIndex": 405, "event": "text", "startIndex": 377, }, Object { "data": Array [ "lastBuildDate", false, ], "endIndex": 421, "event": "closetag", "startIndex": 406, }, Object { "data": Array [ " ", ], "endIndex": 428, "event": "text", "startIndex": 422, }, Object { "data": Array [ "docs", ], "endIndex": 434, "event": "opentagname", "startIndex": 429, }, Object { "data": Array [ "docs", Object {}, false, ], "endIndex": 434, "event": "opentag", "startIndex": 429, }, Object { "data": Array [ "http://blogs.law.harvard.edu/tech/rss", ], "endIndex": 471, "event": "text", "startIndex": 435, }, Object { "data": Array [ "docs", false, ], "endIndex": 478, "event": "closetag", "startIndex": 472, }, Object { "data": Array [ " ", ], "endIndex": 485, "event": "text", "startIndex": 479, }, Object { "data": Array [ "generator", ], "endIndex": 496, "event": "opentagname", "startIndex": 486, }, Object { "data": Array [ "generator", Object {}, false, ], "endIndex": 496, "event": "opentag", "startIndex": 486, }, Object { "data": Array [ "Weblog Editor 2.0", ], "endIndex": 513, "event": "text", "startIndex": 497, }, Object { "data": Array [ "generator", false, ], "endIndex": 525, "event": "closetag", "startIndex": 514, }, Object { "data": Array [ " ", ], "endIndex": 532, "event": "text", "startIndex": 526, }, Object { "data": Array [ "managingEditor", ], "endIndex": 548, "event": "opentagname", "startIndex": 533, }, Object { "data": Array [ "managingEditor", Object {}, false, ], "endIndex": 548, "event": "opentag", "startIndex": 533, }, Object { "data": Array [ "editor@example.com", ], "endIndex": 566, "event": "text", "startIndex": 549, }, Object { "data": Array [ "managingEditor", false, ], "endIndex": 583, "event": "closetag", "startIndex": 567, }, Object { "data": Array [ " ", ], "endIndex": 590, "event": "text", "startIndex": 584, }, Object { "data": Array [ "webMaster", ], "endIndex": 601, "event": "opentagname", "startIndex": 591, }, Object { "data": Array [ "webMaster", Object {}, false, ], "endIndex": 601, "event": "opentag", "startIndex": 591, }, Object { "data": Array [ "webmaster@example.com", ], "endIndex": 622, "event": "text", "startIndex": 602, }, Object { "data": Array [ "webMaster", false, ], "endIndex": 634, "event": "closetag", "startIndex": 623, }, Object { "data": Array [ " ", ], "endIndex": 641, "event": "text", "startIndex": 635, }, Object { "data": Array [ "item", ], "endIndex": 647, "event": "opentagname", "startIndex": 642, }, Object { "data": Array [ "item", Object {}, false, ], "endIndex": 647, "event": "opentag", "startIndex": 642, }, Object { "data": Array [ " ", ], "endIndex": 658, "event": "text", "startIndex": 648, }, Object { "data": Array [ "title", ], "endIndex": 665, "event": "opentagname", "startIndex": 659, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 665, "event": "opentag", "startIndex": 659, }, Object { "data": Array [ "Star City", ], "endIndex": 674, "event": "text", "startIndex": 666, }, Object { "data": Array [ "title", false, ], "endIndex": 682, "event": "closetag", "startIndex": 675, }, Object { "data": Array [ " ", ], "endIndex": 692, "event": "text", "startIndex": 683, }, Object { "data": Array [ "link", ], "endIndex": 698, "event": "opentagname", "startIndex": 693, }, Object { "data": Array [ "link", Object {}, false, ], "endIndex": 698, "event": "opentag", "startIndex": 693, }, Object { "data": Array [ "http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp", ], "endIndex": 754, "event": "text", "startIndex": 699, }, Object { "data": Array [ "link", false, ], "endIndex": 761, "event": "closetag", "startIndex": 755, }, Object { "data": Array [ " ", ], "endIndex": 771, "event": "text", "startIndex": 762, }, Object { "data": Array [ "description", ], "endIndex": 784, "event": "opentagname", "startIndex": 772, }, Object { "data": Array [ "description", Object {}, false, ], "endIndex": 784, "event": "opentag", "startIndex": 772, }, Object { "data": Array [ "How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's Star City.", ], "endIndex": 1020, "event": "text", "startIndex": 785, }, Object { "data": Array [ "description", false, ], "endIndex": 1034, "event": "closetag", "startIndex": 1021, }, Object { "data": Array [ " ", ], "endIndex": 1044, "event": "text", "startIndex": 1035, }, Object { "data": Array [ "pubDate", ], "endIndex": 1053, "event": "opentagname", "startIndex": 1045, }, Object { "data": Array [ "pubDate", Object {}, false, ], "endIndex": 1053, "event": "opentag", "startIndex": 1045, }, Object { "data": Array [ "Tue, 03 Jun 2003 09:39:21 GMT", ], "endIndex": 1082, "event": "text", "startIndex": 1054, }, Object { "data": Array [ "pubDate", false, ], "endIndex": 1092, "event": "closetag", "startIndex": 1083, }, Object { "data": Array [ " ", ], "endIndex": 1102, "event": "text", "startIndex": 1093, }, Object { "data": Array [ "guid", ], "endIndex": 1108, "event": "opentagname", "startIndex": 1103, }, Object { "data": Array [ "guid", Object {}, false, ], "endIndex": 1108, "event": "opentag", "startIndex": 1103, }, Object { "data": Array [ "http://liftoff.msfc.nasa.gov/2003/06/03.html#item573", ], "endIndex": 1160, "event": "text", "startIndex": 1109, }, Object { "data": Array [ "guid", false, ], "endIndex": 1167, "event": "closetag", "startIndex": 1161, }, Object { "data": Array [ " ", ], "endIndex": 1175, "event": "text", "startIndex": 1168, }, Object { "data": Array [ "item", false, ], "endIndex": 1182, "event": "closetag", "startIndex": 1176, }, Object { "data": Array [ " ", ], "endIndex": 1189, "event": "text", "startIndex": 1183, }, Object { "data": Array [ "item", ], "endIndex": 1195, "event": "opentagname", "startIndex": 1190, }, Object { "data": Array [ "item", Object {}, false, ], "endIndex": 1195, "event": "opentag", "startIndex": 1190, }, Object { "data": Array [ " ", ], "endIndex": 1205, "event": "text", "startIndex": 1196, }, Object { "data": Array [ "description", ], "endIndex": 1218, "event": "opentagname", "startIndex": 1206, }, Object { "data": Array [ "description", Object {}, false, ], "endIndex": 1218, "event": "opentag", "startIndex": 1206, }, Object { "data": Array [ "Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a partial eclipse of the Sun on Saturday, May 31st.", ], "endIndex": 1435, "event": "text", "startIndex": 1219, }, Object { "data": Array [ "description", false, ], "endIndex": 1449, "event": "closetag", "startIndex": 1436, }, Object { "data": Array [ " ", ], "endIndex": 1459, "event": "text", "startIndex": 1450, }, Object { "data": Array [ "pubDate", ], "endIndex": 1468, "event": "opentagname", "startIndex": 1460, }, Object { "data": Array [ "pubDate", Object {}, false, ], "endIndex": 1468, "event": "opentag", "startIndex": 1460, }, Object { "data": Array [ "Fri, 30 May 2003 11:06:42 GMT", ], "endIndex": 1497, "event": "text", "startIndex": 1469, }, Object { "data": Array [ "pubDate", false, ], "endIndex": 1507, "event": "closetag", "startIndex": 1498, }, Object { "data": Array [ " ", ], "endIndex": 1517, "event": "text", "startIndex": 1508, }, Object { "data": Array [ "guid", ], "endIndex": 1523, "event": "opentagname", "startIndex": 1518, }, Object { "data": Array [ "guid", Object {}, false, ], "endIndex": 1523, "event": "opentag", "startIndex": 1518, }, Object { "data": Array [ "http://liftoff.msfc.nasa.gov/2003/05/30.html#item572", ], "endIndex": 1575, "event": "text", "startIndex": 1524, }, Object { "data": Array [ "guid", false, ], "endIndex": 1582, "event": "closetag", "startIndex": 1576, }, Object { "data": Array [ " ", ], "endIndex": 1590, "event": "text", "startIndex": 1583, }, Object { "data": Array [ "item", false, ], "endIndex": 1597, "event": "closetag", "startIndex": 1591, }, Object { "data": Array [ " ", ], "endIndex": 1604, "event": "text", "startIndex": 1598, }, Object { "data": Array [ "item", ], "endIndex": 1610, "event": "opentagname", "startIndex": 1605, }, Object { "data": Array [ "item", Object {}, false, ], "endIndex": 1610, "event": "opentag", "startIndex": 1605, }, Object { "data": Array [ " ", ], "endIndex": 1620, "event": "text", "startIndex": 1611, }, Object { "data": Array [ "title", ], "endIndex": 1627, "event": "opentagname", "startIndex": 1621, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 1627, "event": "opentag", "startIndex": 1621, }, Object { "data": Array [ "The Engine That Does More", ], "endIndex": 1652, "event": "text", "startIndex": 1628, }, Object { "data": Array [ "title", false, ], "endIndex": 1660, "event": "closetag", "startIndex": 1653, }, Object { "data": Array [ " ", ], "endIndex": 1670, "event": "text", "startIndex": 1661, }, Object { "data": Array [ "link", ], "endIndex": 1676, "event": "opentagname", "startIndex": 1671, }, Object { "data": Array [ "link", Object {}, false, ], "endIndex": 1676, "event": "opentag", "startIndex": 1671, }, Object { "data": Array [ "http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp", ], "endIndex": 1730, "event": "text", "startIndex": 1677, }, Object { "data": Array [ "link", false, ], "endIndex": 1737, "event": "closetag", "startIndex": 1731, }, Object { "data": Array [ " ", ], "endIndex": 1747, "event": "text", "startIndex": 1738, }, Object { "data": Array [ "description", ], "endIndex": 1760, "event": "opentagname", "startIndex": 1748, }, Object { "data": Array [ "description", Object {}, false, ], "endIndex": 1760, "event": "opentag", "startIndex": 1748, }, Object { "data": Array [ "Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly. The proposed VASIMR engine would do that.", ], "endIndex": 1923, "event": "text", "startIndex": 1761, }, Object { "data": Array [ "description", false, ], "endIndex": 1937, "event": "closetag", "startIndex": 1924, }, Object { "data": Array [ " ", ], "endIndex": 1947, "event": "text", "startIndex": 1938, }, Object { "data": Array [ "pubDate", ], "endIndex": 1956, "event": "opentagname", "startIndex": 1948, }, Object { "data": Array [ "pubDate", Object {}, false, ], "endIndex": 1956, "event": "opentag", "startIndex": 1948, }, Object { "data": Array [ "Tue, 27 May 2003 08:37:32 GMT", ], "endIndex": 1985, "event": "text", "startIndex": 1957, }, Object { "data": Array [ "pubDate", false, ], "endIndex": 1995, "event": "closetag", "startIndex": 1986, }, Object { "data": Array [ " ", ], "endIndex": 2005, "event": "text", "startIndex": 1996, }, Object { "data": Array [ "guid", ], "endIndex": 2011, "event": "opentagname", "startIndex": 2006, }, Object { "data": Array [ "guid", Object {}, false, ], "endIndex": 2011, "event": "opentag", "startIndex": 2006, }, Object { "data": Array [ "http://liftoff.msfc.nasa.gov/2003/05/27.html#item571", ], "endIndex": 2063, "event": "text", "startIndex": 2012, }, Object { "data": Array [ "guid", false, ], "endIndex": 2070, "event": "closetag", "startIndex": 2064, }, Object { "data": Array [ " ", ], "endIndex": 2078, "event": "text", "startIndex": 2071, }, Object { "data": Array [ "item", false, ], "endIndex": 2085, "event": "closetag", "startIndex": 2079, }, Object { "data": Array [ " ", ], "endIndex": 2092, "event": "text", "startIndex": 2086, }, Object { "data": Array [ "item", ], "endIndex": 2098, "event": "opentagname", "startIndex": 2093, }, Object { "data": Array [ "item", Object {}, false, ], "endIndex": 2098, "event": "opentag", "startIndex": 2093, }, Object { "data": Array [ " ", ], "endIndex": 2108, "event": "text", "startIndex": 2099, }, Object { "data": Array [ "title", ], "endIndex": 2115, "event": "opentagname", "startIndex": 2109, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 2115, "event": "opentag", "startIndex": 2109, }, Object { "data": Array [ "Astronauts' Dirty Laundry", ], "endIndex": 2140, "event": "text", "startIndex": 2116, }, Object { "data": Array [ "title", false, ], "endIndex": 2148, "event": "closetag", "startIndex": 2141, }, Object { "data": Array [ " ", ], "endIndex": 2158, "event": "text", "startIndex": 2149, }, Object { "data": Array [ "link", ], "endIndex": 2164, "event": "opentagname", "startIndex": 2159, }, Object { "data": Array [ "link", Object {}, false, ], "endIndex": 2164, "event": "opentag", "startIndex": 2159, }, Object { "data": Array [ "http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp", ], "endIndex": 2219, "event": "text", "startIndex": 2165, }, Object { "data": Array [ "link", false, ], "endIndex": 2226, "event": "closetag", "startIndex": 2220, }, Object { "data": Array [ " ", ], "endIndex": 2236, "event": "text", "startIndex": 2227, }, Object { "data": Array [ "description", ], "endIndex": 2249, "event": "opentagname", "startIndex": 2237, }, Object { "data": Array [ "description", Object {}, false, ], "endIndex": 2249, "event": "opentag", "startIndex": 2237, }, Object { "data": Array [ "Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options.", ], "endIndex": 2416, "event": "text", "startIndex": 2250, }, Object { "data": Array [ "description", false, ], "endIndex": 2430, "event": "closetag", "startIndex": 2417, }, Object { "data": Array [ " ", ], "endIndex": 2440, "event": "text", "startIndex": 2431, }, Object { "data": Array [ "pubDate", ], "endIndex": 2449, "event": "opentagname", "startIndex": 2441, }, Object { "data": Array [ "pubDate", Object {}, false, ], "endIndex": 2449, "event": "opentag", "startIndex": 2441, }, Object { "data": Array [ "Tue, 20 May 2003 08:56:02 GMT", ], "endIndex": 2478, "event": "text", "startIndex": 2450, }, Object { "data": Array [ "pubDate", false, ], "endIndex": 2488, "event": "closetag", "startIndex": 2479, }, Object { "data": Array [ " ", ], "endIndex": 2498, "event": "text", "startIndex": 2489, }, Object { "data": Array [ "guid", ], "endIndex": 2504, "event": "opentagname", "startIndex": 2499, }, Object { "data": Array [ "guid", Object {}, false, ], "endIndex": 2504, "event": "opentag", "startIndex": 2499, }, Object { "data": Array [ "http://liftoff.msfc.nasa.gov/2003/05/20.html#item570", ], "endIndex": 2556, "event": "text", "startIndex": 2505, }, Object { "data": Array [ "guid", false, ], "endIndex": 2563, "event": "closetag", "startIndex": 2557, }, Object { "data": Array [ " ", ], "endIndex": 2574, "event": "text", "startIndex": 2564, }, Object { "data": Array [ "media:content", ], "endIndex": 2589, "event": "opentagname", "startIndex": 2575, }, Object { "data": Array [ "height", "200", "\\"", ], "endIndex": 2601, "event": "attribute", "startIndex": 2590, }, Object { "data": Array [ "medium", "image", "\\"", ], "endIndex": 2616, "event": "attribute", "startIndex": 2603, }, Object { "data": Array [ "url", "https://picsum.photos/200", "\\"", ], "endIndex": 2648, "event": "attribute", "startIndex": 2618, }, Object { "data": Array [ "width", "200", "\\"", ], "endIndex": 2660, "event": "attribute", "startIndex": 2650, }, Object { "data": Array [ "media:content", Object { "height": "200", "medium": "image", "url": "https://picsum.photos/200", "width": "200", }, false, ], "endIndex": 2662, "event": "opentag", "startIndex": 2575, }, Object { "data": Array [ "media:content", true, ], "endIndex": 2662, "event": "closetag", "startIndex": 2575, }, Object { "data": Array [ " ", ], "endIndex": 2669, "event": "text", "startIndex": 2663, }, Object { "data": Array [ "item", false, ], "endIndex": 2676, "event": "closetag", "startIndex": 2670, }, Object { "data": Array [ " ", ], "endIndex": 2680, "event": "text", "startIndex": 2677, }, Object { "data": Array [ "channel", false, ], "endIndex": 2690, "event": "closetag", "startIndex": 2681, }, Object { "data": Array [ " ", ], "endIndex": 2691, "event": "text", "startIndex": 2691, }, Object { "data": Array [ "rss", false, ], "endIndex": 2697, "event": "closetag", "startIndex": 2692, }, ] `; exports[`Stream SVG 1`] = ` Array [ Object { "data": Array [ "!doctype", "!doctype html", ], "endIndex": 14, "event": "processinginstruction", "startIndex": 0, }, Object { "data": Array [ " ", ], "endIndex": 15, "event": "text", "startIndex": 15, }, Object { "data": Array [ "html", ], "endIndex": 21, "event": "opentagname", "startIndex": 16, }, Object { "data": Array [ "html", Object {}, false, ], "endIndex": 21, "event": "opentag", "startIndex": 16, }, Object { "data": Array [ " ", ], "endIndex": 22, "event": "text", "startIndex": 22, }, Object { "data": Array [ "head", ], "endIndex": 28, "event": "opentagname", "startIndex": 23, }, Object { "data": Array [ "head", Object {}, false, ], "endIndex": 28, "event": "opentag", "startIndex": 23, }, Object { "data": Array [ " ", ], "endIndex": 30, "event": "text", "startIndex": 29, }, Object { "data": Array [ "title", ], "endIndex": 37, "event": "opentagname", "startIndex": 31, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 37, "event": "opentag", "startIndex": 31, }, Object { "data": Array [ "SVG test", ], "endIndex": 45, "event": "text", "startIndex": 38, }, Object { "data": Array [ "title", false, ], "endIndex": 53, "event": "closetag", "startIndex": 46, }, Object { "data": Array [ " ", ], "endIndex": 54, "event": "text", "startIndex": 54, }, Object { "data": Array [ "head", false, ], "endIndex": 61, "event": "closetag", "startIndex": 55, }, Object { "data": Array [ " ", ], "endIndex": 62, "event": "text", "startIndex": 62, }, Object { "data": Array [ "body", ], "endIndex": 68, "event": "opentagname", "startIndex": 63, }, Object { "data": Array [ "body", Object {}, false, ], "endIndex": 68, "event": "opentag", "startIndex": 63, }, Object { "data": Array [ " ", ], "endIndex": 70, "event": "text", "startIndex": 69, }, Object { "data": Array [ "svg", ], "endIndex": 75, "event": "opentagname", "startIndex": 71, }, Object { "data": Array [ "version", "1.1", "\\"", ], "endIndex": 88, "event": "attribute", "startIndex": 76, }, Object { "data": Array [ "xmlns", "http://www.w3.org/2000/svg", "\\"", ], "endIndex": 123, "event": "attribute", "startIndex": 90, }, Object { "data": Array [ "xmlns:xlink", "http://www.w3.org/1999/xlink", "\\"", ], "endIndex": 166, "event": "attribute", "startIndex": 125, }, Object { "data": Array [ "svg", Object { "version": "1.1", "xmlns": "http://www.w3.org/2000/svg", "xmlns:xlink": "http://www.w3.org/1999/xlink", }, false, ], "endIndex": 167, "event": "opentag", "startIndex": 71, }, Object { "data": Array [ " ", ], "endIndex": 170, "event": "text", "startIndex": 168, }, Object { "data": Array [ "title", ], "endIndex": 177, "event": "opentagname", "startIndex": 171, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 177, "event": "opentag", "startIndex": 171, }, Object { "data": Array [ "Test", ], "endIndex": 181, "event": "text", "startIndex": 178, }, Object { "data": Array [ "title", false, ], "endIndex": 189, "event": "closetag", "startIndex": 182, }, Object { "data": Array [ " ", ], "endIndex": 192, "event": "text", "startIndex": 190, }, Object { "data": Array [ "animate", ], "endIndex": 201, "event": "opentagname", "startIndex": 193, }, Object { "data": Array [ "animate", Object {}, false, ], "endIndex": 203, "event": "opentag", "startIndex": 193, }, Object { "data": Array [ "animate", true, ], "endIndex": 203, "event": "closetag", "startIndex": 193, }, Object { "data": Array [ " ", ], "endIndex": 206, "event": "text", "startIndex": 204, }, Object { "data": Array [ "polygon", ], "endIndex": 215, "event": "opentagname", "startIndex": 207, }, Object { "data": Array [ "polygon", Object {}, false, ], "endIndex": 217, "event": "opentag", "startIndex": 207, }, Object { "data": Array [ "polygon", true, ], "endIndex": 217, "event": "closetag", "startIndex": 207, }, Object { "data": Array [ " ", ], "endIndex": 220, "event": "text", "startIndex": 218, }, Object { "data": Array [ "g", ], "endIndex": 223, "event": "opentagname", "startIndex": 221, }, Object { "data": Array [ "g", Object {}, false, ], "endIndex": 223, "event": "opentag", "startIndex": 221, }, Object { "data": Array [ " ", ], "endIndex": 227, "event": "text", "startIndex": 224, }, Object { "data": Array [ "path", ], "endIndex": 233, "event": "opentagname", "startIndex": 228, }, Object { "data": Array [ "path", Object {}, false, ], "endIndex": 233, "event": "opentag", "startIndex": 228, }, Object { "data": Array [ " ", ], "endIndex": 238, "event": "text", "startIndex": 234, }, Object { "data": Array [ "title", ], "endIndex": 245, "event": "opentagname", "startIndex": 239, }, Object { "data": Array [ "title", Object {}, false, ], "endIndex": 245, "event": "opentag", "startIndex": 239, }, Object { "data": Array [ "x", ], "endIndex": 246, "event": "text", "startIndex": 246, }, Object { "data": Array [ "title", false, ], "endIndex": 254, "event": "closetag", "startIndex": 247, }, Object { "data": Array [ " ", ], "endIndex": 259, "event": "text", "startIndex": 255, }, Object { "data": Array [ "animate", ], "endIndex": 268, "event": "opentagname", "startIndex": 260, }, Object { "data": Array [ "animate", Object {}, false, ], "endIndex": 270, "event": "opentag", "startIndex": 260, }, Object { "data": Array [ "animate", true, ], "endIndex": 270, "event": "closetag", "startIndex": 260, }, Object { "data": Array [ " ", ], "endIndex": 274, "event": "text", "startIndex": 271, }, Object { "data": Array [ "path", false, ], "endIndex": 281, "event": "closetag", "startIndex": 275, }, Object { "data": Array [ " ", ], "endIndex": 284, "event": "text", "startIndex": 282, }, Object { "data": Array [ "g", false, ], "endIndex": 288, "event": "closetag", "startIndex": 285, }, Object { "data": Array [ " ", ], "endIndex": 290, "event": "text", "startIndex": 289, }, Object { "data": Array [ "svg", false, ], "endIndex": 296, "event": "closetag", "startIndex": 291, }, Object { "data": Array [ " ", ], "endIndex": 297, "event": "text", "startIndex": 297, }, Object { "data": Array [ "body", false, ], "endIndex": 304, "event": "closetag", "startIndex": 298, }, Object { "data": Array [ " ", ], "endIndex": 305, "event": "text", "startIndex": 305, }, Object { "data": Array [ "html", false, ], "endIndex": 312, "event": "closetag", "startIndex": 306, }, Object { "data": Array [ " ", ], "endIndex": 313, "event": "text", "startIndex": 313, }, ] `; htmlparser2-7.2.0/src/__snapshots__/index.spec.ts.snap000066400000000000000000000022731414322403200227370ustar00rootroot00000000000000// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Index createDomStream 1`] = ` Array [ &This is text, , , ] `; exports[`Index parseDOM 1`] = ` Array [ ProcessingInstruction { "data": "?foo", "endIndex": null, "name": "?foo", "next": Yay!, "parent": [Circular] Yay! , "prev": null, "startIndex": null, "type": "directive", } Yay! , ] `; exports[`Index parseDocument 1`] = ` Document { "children": Array [ ProcessingInstruction { "data": "?foo", "endIndex": null, "name": "?foo", "next": Yay!, "parent": [Circular] Yay! , "prev": null, "startIndex": null, "type": "directive", } Yay! , ], "endIndex": null, "next": null, "parent": null, "prev": null, "startIndex": null, "type": "root", } `; htmlparser2-7.2.0/src/__tests__/000077500000000000000000000000001414322403200165035ustar00rootroot00000000000000htmlparser2-7.2.0/src/__tests__/events.ts000066400000000000000000000012501414322403200203550ustar00rootroot00000000000000import { Parser } from ".."; import * as helper from "../__fixtures__/test-helper"; helper.createSuite("Events", ({ options, input }, cb) => helper.writeToParser(helper.getEventCollector(cb), options?.parser, input) ); describe("Helper", () => { it("should handle errors", () => { const eventCb = jest.fn(); const parser = new Parser(helper.getEventCollector(eventCb)); parser.end(); parser.write("foo"); expect(eventCb).toHaveBeenCalledTimes(2); expect(eventCb).toHaveBeenNthCalledWith(1, null, []); expect(eventCb).toHaveBeenLastCalledWith( new Error(".write() after done!") ); }); }); htmlparser2-7.2.0/src/index.spec.ts000066400000000000000000000026551414322403200171650ustar00rootroot00000000000000import { parseDocument, parseDOM, createDomStream, DomHandler, DefaultHandler, RssHandler, } from "."; import { FeedHandler } from "./FeedHandler"; import { Element } from "domhandler"; // Add an `attributes` prop to the Element for now, to make it possible for Jest to render DOM nodes. Object.defineProperty(Element.prototype, "attributes", { get() { return Object.keys(this.attribs).map((name) => ({ name, value: this.attribs[name], })); }, configurable: true, enumerable: false, }); describe("Index", () => { test("parseDocument", () => { const dom = parseDocument("Yay!"); expect(dom).toMatchSnapshot(); }); test("parseDOM", () => { const dom = parseDOM("Yay!"); expect(dom).toMatchSnapshot(); }); test("createDomStream", (done) => { const domStream = createDomStream((err, dom) => { expect(err).toBeNull(); expect(dom).toMatchSnapshot(); done(); }); for (const c of "&This is text") { domStream.write(c); } domStream.end(); }); describe("API", () => { it("should export the appropriate APIs", () => { expect(RssHandler).toEqual(FeedHandler); expect(DomHandler).toEqual(DefaultHandler); }); }); }); htmlparser2-7.2.0/src/index.ts000066400000000000000000000043151414322403200162270ustar00rootroot00000000000000import { Parser, ParserOptions } from "./Parser"; export { Parser, ParserOptions }; import { DomHandler, DomHandlerOptions, Node, Element, Document, } from "domhandler"; export { DomHandler, DomHandlerOptions }; type Options = ParserOptions & DomHandlerOptions; // Helper methods /** * Parses the data, returns the resulting document. * * @param data The data that should be parsed. * @param options Optional options for the parser and DOM builder. */ export function parseDocument(data: string, options?: Options): Document { const handler = new DomHandler(undefined, options); new Parser(handler, options).end(data); return handler.root; } /** * Parses data, returns an array of the root nodes. * * Note that the root nodes still have a `Document` node as their parent. * Use `parseDocument` to get the `Document` node instead. * * @param data The data that should be parsed. * @param options Optional options for the parser and DOM builder. * @deprecated Use `parseDocument` instead. */ export function parseDOM(data: string, options?: Options): Node[] { return parseDocument(data, options).children; } /** * Creates a parser instance, with an attached DOM handler. * * @param cb A callback that will be called once parsing has been completed. * @param options Optional options for the parser and DOM builder. * @param elementCb An optional callback that will be called every time a tag has been completed inside of the DOM. */ export function createDomStream( cb: (error: Error | null, dom: Node[]) => void, options?: Options, elementCb?: (element: Element) => void ): Parser { const handler = new DomHandler(cb, options, elementCb); return new Parser(handler, options); } export { default as Tokenizer, Callbacks as TokenizerCallbacks, } from "./Tokenizer"; import * as ElementType from "domelementtype"; export { ElementType }; /* * All of the following exports exist for backwards-compatibility. * They should probably be removed eventually. */ export * from "./FeedHandler"; export * as DomUtils from "domutils"; // Old names for Dom- & FeedHandler export { DomHandler as DefaultHandler }; export { FeedHandler as RssHandler } from "./FeedHandler"; htmlparser2-7.2.0/tsconfig.eslint.json000066400000000000000000000001201414322403200177530ustar00rootroot00000000000000{ "extends": "./tsconfig.json", "include": ["src"], "exclude": [] } htmlparser2-7.2.0/tsconfig.json000066400000000000000000000036141414322403200164710ustar00rootroot00000000000000{ "compilerOptions": { /* Basic Options */ "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, // "lib": [], /* Specify library files to be included in the compilation. */ "declaration": true /* Generates corresponding '.d.ts' file. */, "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, // "sourceMap": true, /* Generates corresponding '.map' file. */ "outDir": "lib" /* Redirect output structure to the directory. */, // "importHelpers": true, /* Import emit helpers from 'tslib'. */ /* Strict Type-Checking Options */ "strict": true /* Enable all strict type-checking options. */, /* Additional Checks */ "noUnusedLocals": true /* Report errors on unused locals. */, "noUnusedParameters": true /* Report errors on unused parameters. */, "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, /* Module Resolution Options */ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, "resolveJsonModule": true }, "include": ["src"], "exclude": [ "**/*.spec.ts", "**/__fixtures__/*", "**/__tests__/*", "**/__snapshots__/*" ] }