diff --git a/package-lock.json b/package-lock.json index f70da5e9..f0d07d2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "domhandler", "version": "4.2.0", "license": "BSD-2-Clause", "dependencies": { @@ -17,7 +18,7 @@ "@typescript-eslint/parser": "^4.29.3", "eslint": "^7.32.0", "eslint-config-prettier": "^8.1.0", - "htmlparser2": "^7.0.0", + "htmlparser2": "^7.1.1", "jest": "^27.1.0", "prettier": "^2.0.5", "ts-jest": "^27.0.5", @@ -1110,9 +1111,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.2.tgz", - "integrity": "sha512-TbG4TOx9hng8FKxaVrCisdaxKxqEwJ3zwHoCWXZ0Jw6mnvTInpaB99/2Cy4+XxpXtjNv9/TgfGSvZFyfV/t8Fw==", + "version": "16.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.5.tgz", + "integrity": "sha512-E7SpxDXoHEpmZ9C1gSqwadhE6zPRtf3g0gJy9Y51DsImnR5TcDs3QEiV/3Q7zOM8LWaZp5Gph71NK6ElVMG1IQ==", "dev": true }, "node_modules/@types/prettier": { @@ -1433,6 +1434,9 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { @@ -1696,6 +1700,9 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/char-regex": { @@ -1865,6 +1872,11 @@ }, "engines": { "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decimal.js": { @@ -1946,13 +1958,13 @@ } }, "node_modules/dom-serializer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz", - "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "dependencies": { "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", + "domhandler": "^4.2.0", "entities": "^2.0.0" }, "funding": { @@ -1992,9 +2004,9 @@ } }, "node_modules/domhandler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.1.0.tgz", - "integrity": "sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", "dev": true, "dependencies": { "domelementtype": "^2.2.0" @@ -2007,14 +2019,14 @@ } }, "node_modules/domutils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.2.tgz", - "integrity": "sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", - "domhandler": "^4.1.0" + "domhandler": "^4.2.0" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -2257,6 +2269,9 @@ }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { @@ -2673,6 +2688,9 @@ }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { @@ -2780,9 +2798,9 @@ "dev": true }, "node_modules/htmlparser2": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.0.0.tgz", - "integrity": "sha512-IhdltX9BWhYQft4UPA92jFasNajskja0om6vU0DaIEL4OseCg5zE+mHAMr51AT89TbzzECrQWJ4CZ5NVYTPlKw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.1.1.tgz", + "integrity": "sha512-hZb0lfG0hbhR/hB879zbBr8Opv0Be9Zp+JYHgqTw5epF++aotu/zmMTPLy/60iJyR1MaD/3pYRp7xYteXsZMEA==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -2794,7 +2812,7 @@ "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", - "domutils": "^2.5.2", + "domutils": "^2.8.0", "entities": "^3.0.1" } }, @@ -4372,6 +4390,9 @@ "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/require-directory": { @@ -4455,13 +4476,30 @@ }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/run-parallel": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -5126,9 +5164,9 @@ } }, "node_modules/ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.4.tgz", + "integrity": "sha512-zP9z6GXm6zC27YtspwH99T3qTG7bBFv2VIkeHstMLrLlDJuzA7tQ5ls3OJ1hOGGCzTQPniNJoHXIAOS0Jljohg==", "dev": true, "engines": { "node": ">=8.3.0" @@ -6063,9 +6101,9 @@ "dev": true }, "@types/node": { - "version": "16.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.2.tgz", - "integrity": "sha512-TbG4TOx9hng8FKxaVrCisdaxKxqEwJ3zwHoCWXZ0Jw6mnvTInpaB99/2Cy4+XxpXtjNv9/TgfGSvZFyfV/t8Fw==", + "version": "16.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.5.tgz", + "integrity": "sha512-E7SpxDXoHEpmZ9C1gSqwadhE6zPRtf3g0gJy9Y51DsImnR5TcDs3QEiV/3Q7zOM8LWaZp5Gph71NK6ElVMG1IQ==", "dev": true }, "@types/prettier": { @@ -6687,13 +6725,13 @@ } }, "dom-serializer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz", - "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "requires": { "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", + "domhandler": "^4.2.0", "entities": "^2.0.0" } }, @@ -6720,23 +6758,23 @@ } }, "domhandler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.1.0.tgz", - "integrity": "sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", "dev": true, "requires": { "domelementtype": "^2.2.0" } }, "domutils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.2.tgz", - "integrity": "sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", - "domhandler": "^4.1.0" + "domhandler": "^4.2.0" } }, "electron-to-chromium": { @@ -7316,14 +7354,14 @@ "dev": true }, "htmlparser2": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.0.0.tgz", - "integrity": "sha512-IhdltX9BWhYQft4UPA92jFasNajskja0om6vU0DaIEL4OseCg5zE+mHAMr51AT89TbzzECrQWJ4CZ5NVYTPlKw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.1.1.tgz", + "integrity": "sha512-hZb0lfG0hbhR/hB879zbBr8Opv0Be9Zp+JYHgqTw5epF++aotu/zmMTPLy/60iJyR1MaD/3pYRp7xYteXsZMEA==", "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", - "domutils": "^2.5.2", + "domutils": "^2.8.0", "entities": "^3.0.1" }, "dependencies": { @@ -9096,9 +9134,9 @@ } }, "ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.4.tgz", + "integrity": "sha512-zP9z6GXm6zC27YtspwH99T3qTG7bBFv2VIkeHstMLrLlDJuzA7tQ5ls3OJ1hOGGCzTQPniNJoHXIAOS0Jljohg==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 9ac6f47f..d0684c29 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@typescript-eslint/parser": "^4.29.3", "eslint": "^7.32.0", "eslint-config-prettier": "^8.1.0", - "htmlparser2": "^7.0.0", + "htmlparser2": "^7.1.1", "jest": "^27.1.0", "prettier": "^2.0.5", "ts-jest": "^27.0.5", diff --git a/src/__fixtures__/24-with-start-indices.json b/src/__fixtures__/24-with-start-indices.json index 0a8788fa..dcdd7310 100644 --- a/src/__fixtures__/24-with-start-indices.json +++ b/src/__fixtures__/24-with-start-indices.json @@ -1,7 +1,6 @@ { "name": "withStartIndices adds correct startIndex properties", "options": { "withStartIndices": true }, - "streaming": false, "html": " The Title Hello world

", "expected": [ { diff --git a/src/__fixtures__/25-with-end-indices.json b/src/__fixtures__/25-with-end-indices.json index 1a318e4a..c2407ef0 100644 --- a/src/__fixtures__/25-with-end-indices.json +++ b/src/__fixtures__/25-with-end-indices.json @@ -1,7 +1,6 @@ { "name": "withEndIndices adds correct endIndex properties", "options": { "withEndIndices": true }, - "streaming": false, "html": " The Title Hello world

", "expected": [ { diff --git a/src/index.spec.ts b/src/index.spec.ts index 19e3b8bc..7c735894 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -10,9 +10,9 @@ describe("DomHandler", () => { .filter((name) => name.endsWith(".json")) // Only allow .json files .map((name) => resolve(basePath, name)) .map(require) - .forEach(({ name, html, options = {}, streaming = true, expected }) => + .forEach(({ name, html, options = {}, expected }) => test(name, () => { - const result = parse(html, options, streaming); + const result = parse(html, options); compare(result, expected); }) @@ -21,8 +21,7 @@ describe("DomHandler", () => { function parse( data: string, - options: DomHandlerOptions & ParserOptions, - streaming: boolean + options: DomHandlerOptions & ParserOptions ): Node[] { const results: Node[][] = []; @@ -34,21 +33,17 @@ function parse( const parser = new Parser(handler, options); // First, try to run the fixture via chunks - if (streaming) { - for (let i = 0; i < data.length; i++) { - parser.write(data.charAt(i)); - } - - parser.done(); + for (let i = 0; i < data.length; i++) { + parser.write(data.charAt(i)); } + parser.done(); + // Then parse everything parser.parseComplete(data); - if (streaming) { - // Ensure streaming doesn't change anything. - expect(results[0]).toEqual(results[1]); - } + // Ensure streaming doesn't change anything. + expect(results[0]).toEqual(results[1]); return results[0]; } diff --git a/src/index.ts b/src/index.ts index 8e9c0c5e..3dd38bda 100644 --- a/src/index.ts +++ b/src/index.ts @@ -43,6 +43,7 @@ export interface DomHandlerOptions { const defaultOpts: DomHandlerOptions = { withStartIndices: false, withEndIndices: false, + xmlMode: false, }; interface ParserInterface { @@ -117,7 +118,7 @@ export class DomHandler { this.done = false; this.tagStack = [this.root]; this.lastNode = null; - this.parser = this.parser ?? null; + this.parser = null; } // Signals the handler that parsing is done @@ -156,6 +157,9 @@ export class DomHandler { if (lastNode && lastNode.type === ElementType.Text) { lastNode.data += data; + if (this.options.withEndIndices) { + lastNode.endIndex = this.parser!.endIndex; + } } else { const node = new Text(data); this.addNode(node); diff --git a/src/node.spec.ts b/src/node.spec.ts index b0d4a35d..f7fe6b50 100644 --- a/src/node.spec.ts +++ b/src/node.spec.ts @@ -61,7 +61,7 @@ describe("Nodes", () => { }).children[0]; const clone = result.cloneNode(true); expect(clone.startIndex).toBe(0); - expect(clone.endIndex).toBe(22); + expect(clone.endIndex).toBe(23); }); it("should throw an error when cloning unsupported types", () => {