1 | var _ParsedHTMLRewriter_onMap, _ParsedHTMLRewriter_onDocument;
|
2 | import { __classPrivateFieldGet } from "tslib";
|
3 | import { parseHTML } from 'linkedom';
|
4 | import { asyncIterableToStream } from 'whatwg-stream-to-async-iter';
|
5 | import { ParsedHTMLRewriterElement, ParsedHTMLRewriterText, ParsedHTMLRewriterComment, ParsedHTMLRewriterDocumentType, ParsedHTMLRewriterEnd, promiseToAsyncIterable, append, treeWalkerToIter, } from './support.js';
|
6 | const ELEMENT_NODE = 1;
|
7 | const ATTRIBUTE_NODE = 2;
|
8 | const TEXT_NODE = 3;
|
9 | const COMMENT_NODE = 8;
|
10 | const DOCUMENT_NODE = 9;
|
11 | const DOCUMENT_TYPE_NODE = 10;
|
12 | const DOCUMENT_FRAGMENT_NODE = 11;
|
13 | const SHOW_ALL = -1;
|
14 | const SHOW_ELEMENT = 1;
|
15 | const SHOW_TEXT = 4;
|
16 | const SHOW_COMMENT = 128;
|
17 | const isText = (n) => (n === null || n === void 0 ? void 0 : n.nodeType) === TEXT_NODE;
|
18 | const isElement = (n) => (n === null || n === void 0 ? void 0 : n.nodeType) === ELEMENT_NODE;
|
19 | const isComment = (n) => (n === null || n === void 0 ? void 0 : n.nodeType) === COMMENT_NODE;
|
20 | function* findTextNodes(el, document) {
|
21 | const tw = document.createTreeWalker(el, SHOW_TEXT);
|
22 | for (const node of treeWalkerToIter(tw))
|
23 | yield node;
|
24 | }
|
25 | function* findCommentNodes(el, document) {
|
26 | const tw = document.createTreeWalker(el, SHOW_COMMENT);
|
27 | for (const node of treeWalkerToIter(tw))
|
28 | yield node;
|
29 | }
|
30 | function findNext(el) {
|
31 | while (el && !el.nextSibling)
|
32 | el = el.parentNode;
|
33 | return el && el.nextSibling;
|
34 | }
|
35 |
|
36 |
|
37 |
|
38 | export class ParsedHTMLRewriter {
|
39 | constructor() {
|
40 | _ParsedHTMLRewriter_onMap.set(this, new Map());
|
41 | _ParsedHTMLRewriter_onDocument.set(this, new Array());
|
42 | }
|
43 | on(selector, handlers) {
|
44 | append(__classPrivateFieldGet(this, _ParsedHTMLRewriter_onMap, "f"), selector, handlers);
|
45 | return this;
|
46 | }
|
47 | onDocument(handlers) {
|
48 | __classPrivateFieldGet(this, _ParsedHTMLRewriter_onDocument, "f").push(handlers);
|
49 | return this;
|
50 | }
|
51 | transform(response) {
|
52 |
|
53 |
|
54 |
|
55 | return new Response(asyncIterableToStream(promiseToAsyncIterable((async () => {
|
56 | var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
57 |
|
58 |
|
59 | const htmlText = await response.text();
|
60 | const { document } = parseHTML(htmlText);
|
61 |
|
62 |
|
63 |
|
64 |
|
65 | const elemMap = new Map();
|
66 | const htmlMap = new Map();
|
67 | const textMap = new Map();
|
68 | const commMap = new Map();
|
69 | for (const [selector, handlers] of __classPrivateFieldGet(this, _ParsedHTMLRewriter_onMap, "f")) {
|
70 | for (const elem of document.querySelectorAll(selector)) {
|
71 | for (const handler of handlers) {
|
72 | if (handler.element) {
|
73 | append(elemMap, elem, handler.element.bind(handler));
|
74 | }
|
75 |
|
76 |
|
77 | if (handler.innerHTML) {
|
78 | append(htmlMap, findNext(elem), [elem, handler.innerHTML.bind(handler)]);
|
79 | }
|
80 |
|
81 | if (handler.text) {
|
82 | for (const text of findTextNodes(elem, document)) {
|
83 | append(textMap, text, handler.text.bind(handler));
|
84 | }
|
85 | }
|
86 | if (handler.comments) {
|
87 | for (const comm of findCommentNodes(elem, document)) {
|
88 | append(commMap, comm, handler.comments.bind(handler));
|
89 | }
|
90 | }
|
91 | }
|
92 | }
|
93 | }
|
94 |
|
95 | if (document.doctype) {
|
96 | const doctype = new ParsedHTMLRewriterDocumentType(document.doctype);
|
97 | for (const handler of __classPrivateFieldGet(this, _ParsedHTMLRewriter_onDocument, "f")) {
|
98 | await ((_a = handler.doctype) === null || _a === void 0 ? void 0 : _a.call(handler, doctype));
|
99 | }
|
100 | }
|
101 |
|
102 |
|
103 | const walker = document.createTreeWalker(document, SHOW_ELEMENT | SHOW_TEXT | SHOW_COMMENT);
|
104 |
|
105 |
|
106 |
|
107 | const nodes = [...treeWalkerToIter(walker), null];
|
108 | for (const node of nodes) {
|
109 | for (const [prevElem, handler] of (_b = htmlMap.get(node)) !== null && _b !== void 0 ? _b : []) {
|
110 | await handler(prevElem.innerHTML);
|
111 | }
|
112 | if (isElement(node)) {
|
113 | const handlers = (_c = elemMap.get(node)) !== null && _c !== void 0 ? _c : [];
|
114 | for (const handler of handlers) {
|
115 | await handler(new ParsedHTMLRewriterElement(node, document));
|
116 | }
|
117 | }
|
118 | else if (isText(node)) {
|
119 | const handlers = (_d = textMap.get(node)) !== null && _d !== void 0 ? _d : [];
|
120 | const text = new ParsedHTMLRewriterText(node, document);
|
121 | for (const handler of handlers) {
|
122 | await handler(text);
|
123 | }
|
124 | for (const handler of __classPrivateFieldGet(this, _ParsedHTMLRewriter_onDocument, "f")) {
|
125 | await ((_e = handler.text) === null || _e === void 0 ? void 0 : _e.call(handler, text));
|
126 | }
|
127 | if (!isText(node.nextSibling)) {
|
128 | const textLast = new ParsedHTMLRewriterText(null, document);
|
129 | for (const handler of handlers) {
|
130 | await handler(textLast);
|
131 | }
|
132 | for (const handler of __classPrivateFieldGet(this, _ParsedHTMLRewriter_onDocument, "f")) {
|
133 | await ((_f = handler.text) === null || _f === void 0 ? void 0 : _f.call(handler, textLast));
|
134 | }
|
135 | }
|
136 | }
|
137 | else if (isComment(node)) {
|
138 | const handlers = (_g = commMap.get(node)) !== null && _g !== void 0 ? _g : [];
|
139 | const comment = new ParsedHTMLRewriterComment(node, document);
|
140 | for (const handler of handlers) {
|
141 | await handler(comment);
|
142 | }
|
143 | for (const handler of __classPrivateFieldGet(this, _ParsedHTMLRewriter_onDocument, "f")) {
|
144 | await ((_h = handler.comments) === null || _h === void 0 ? void 0 : _h.call(handler, comment));
|
145 | }
|
146 | }
|
147 | }
|
148 |
|
149 | const end = new ParsedHTMLRewriterEnd(document);
|
150 | for (const handler of __classPrivateFieldGet(this, _ParsedHTMLRewriter_onDocument, "f")) {
|
151 | await ((_j = handler.end) === null || _j === void 0 ? void 0 : _j.call(handler, end));
|
152 | }
|
153 | return new TextEncoder().encode(document.toString());
|
154 | })())), response);
|
155 | }
|
156 | }
|
157 | _ParsedHTMLRewriter_onMap = new WeakMap(), _ParsedHTMLRewriter_onDocument = new WeakMap();
|
158 |
|
\ | No newline at end of file |