177 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | |
|     if (k2 === undefined) k2 = k;
 | |
|     var desc = Object.getOwnPropertyDescriptor(m, k);
 | |
|     if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | |
|       desc = { enumerable: true, get: function() { return m[k]; } };
 | |
|     }
 | |
|     Object.defineProperty(o, k2, desc);
 | |
| }) : (function(o, m, k, k2) {
 | |
|     if (k2 === undefined) k2 = k;
 | |
|     o[k2] = m[k];
 | |
| }));
 | |
| var __exportStar = (this && this.__exportStar) || function(m, exports) {
 | |
|     for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
 | |
| };
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.DomHandler = void 0;
 | |
| var domelementtype_1 = require("domelementtype");
 | |
| var node_1 = require("./node");
 | |
| __exportStar(require("./node"), exports);
 | |
| var reWhitespace = /\s+/g;
 | |
| // Default options
 | |
| var defaultOpts = {
 | |
|     normalizeWhitespace: false,
 | |
|     withStartIndices: false,
 | |
|     withEndIndices: false,
 | |
|     xmlMode: false,
 | |
| };
 | |
| var DomHandler = /** @class */ (function () {
 | |
|     /**
 | |
|      * @param callback Called once parsing has completed.
 | |
|      * @param options Settings for the handler.
 | |
|      * @param elementCB Callback whenever a tag is closed.
 | |
|      */
 | |
|     function DomHandler(callback, options, elementCB) {
 | |
|         /** The elements of the DOM */
 | |
|         this.dom = [];
 | |
|         /** The root element for the DOM */
 | |
|         this.root = new node_1.Document(this.dom);
 | |
|         /** Indicated whether parsing has been completed. */
 | |
|         this.done = false;
 | |
|         /** Stack of open tags. */
 | |
|         this.tagStack = [this.root];
 | |
|         /** A data node that is still being written to. */
 | |
|         this.lastNode = null;
 | |
|         /** Reference to the parser instance. Used for location information. */
 | |
|         this.parser = null;
 | |
|         // Make it possible to skip arguments, for backwards-compatibility
 | |
|         if (typeof options === "function") {
 | |
|             elementCB = options;
 | |
|             options = defaultOpts;
 | |
|         }
 | |
|         if (typeof callback === "object") {
 | |
|             options = callback;
 | |
|             callback = undefined;
 | |
|         }
 | |
|         this.callback = callback !== null && callback !== void 0 ? callback : null;
 | |
|         this.options = options !== null && options !== void 0 ? options : defaultOpts;
 | |
|         this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;
 | |
|     }
 | |
|     DomHandler.prototype.onparserinit = function (parser) {
 | |
|         this.parser = parser;
 | |
|     };
 | |
|     // Resets the handler back to starting state
 | |
|     DomHandler.prototype.onreset = function () {
 | |
|         this.dom = [];
 | |
|         this.root = new node_1.Document(this.dom);
 | |
|         this.done = false;
 | |
|         this.tagStack = [this.root];
 | |
|         this.lastNode = null;
 | |
|         this.parser = null;
 | |
|     };
 | |
|     // Signals the handler that parsing is done
 | |
|     DomHandler.prototype.onend = function () {
 | |
|         if (this.done)
 | |
|             return;
 | |
|         this.done = true;
 | |
|         this.parser = null;
 | |
|         this.handleCallback(null);
 | |
|     };
 | |
|     DomHandler.prototype.onerror = function (error) {
 | |
|         this.handleCallback(error);
 | |
|     };
 | |
|     DomHandler.prototype.onclosetag = function () {
 | |
|         this.lastNode = null;
 | |
|         var elem = this.tagStack.pop();
 | |
|         if (this.options.withEndIndices) {
 | |
|             elem.endIndex = this.parser.endIndex;
 | |
|         }
 | |
|         if (this.elementCB)
 | |
|             this.elementCB(elem);
 | |
|     };
 | |
|     DomHandler.prototype.onopentag = function (name, attribs) {
 | |
|         var type = this.options.xmlMode ? domelementtype_1.ElementType.Tag : undefined;
 | |
|         var element = new node_1.Element(name, attribs, undefined, type);
 | |
|         this.addNode(element);
 | |
|         this.tagStack.push(element);
 | |
|     };
 | |
|     DomHandler.prototype.ontext = function (data) {
 | |
|         var normalizeWhitespace = this.options.normalizeWhitespace;
 | |
|         var lastNode = this.lastNode;
 | |
|         if (lastNode && lastNode.type === domelementtype_1.ElementType.Text) {
 | |
|             if (normalizeWhitespace) {
 | |
|                 lastNode.data = (lastNode.data + data).replace(reWhitespace, " ");
 | |
|             }
 | |
|             else {
 | |
|                 lastNode.data += data;
 | |
|             }
 | |
|             if (this.options.withEndIndices) {
 | |
|                 lastNode.endIndex = this.parser.endIndex;
 | |
|             }
 | |
|         }
 | |
|         else {
 | |
|             if (normalizeWhitespace) {
 | |
|                 data = data.replace(reWhitespace, " ");
 | |
|             }
 | |
|             var node = new node_1.Text(data);
 | |
|             this.addNode(node);
 | |
|             this.lastNode = node;
 | |
|         }
 | |
|     };
 | |
|     DomHandler.prototype.oncomment = function (data) {
 | |
|         if (this.lastNode && this.lastNode.type === domelementtype_1.ElementType.Comment) {
 | |
|             this.lastNode.data += data;
 | |
|             return;
 | |
|         }
 | |
|         var node = new node_1.Comment(data);
 | |
|         this.addNode(node);
 | |
|         this.lastNode = node;
 | |
|     };
 | |
|     DomHandler.prototype.oncommentend = function () {
 | |
|         this.lastNode = null;
 | |
|     };
 | |
|     DomHandler.prototype.oncdatastart = function () {
 | |
|         var text = new node_1.Text("");
 | |
|         var node = new node_1.NodeWithChildren(domelementtype_1.ElementType.CDATA, [text]);
 | |
|         this.addNode(node);
 | |
|         text.parent = node;
 | |
|         this.lastNode = text;
 | |
|     };
 | |
|     DomHandler.prototype.oncdataend = function () {
 | |
|         this.lastNode = null;
 | |
|     };
 | |
|     DomHandler.prototype.onprocessinginstruction = function (name, data) {
 | |
|         var node = new node_1.ProcessingInstruction(name, data);
 | |
|         this.addNode(node);
 | |
|     };
 | |
|     DomHandler.prototype.handleCallback = function (error) {
 | |
|         if (typeof this.callback === "function") {
 | |
|             this.callback(error, this.dom);
 | |
|         }
 | |
|         else if (error) {
 | |
|             throw error;
 | |
|         }
 | |
|     };
 | |
|     DomHandler.prototype.addNode = function (node) {
 | |
|         var parent = this.tagStack[this.tagStack.length - 1];
 | |
|         var previousSibling = parent.children[parent.children.length - 1];
 | |
|         if (this.options.withStartIndices) {
 | |
|             node.startIndex = this.parser.startIndex;
 | |
|         }
 | |
|         if (this.options.withEndIndices) {
 | |
|             node.endIndex = this.parser.endIndex;
 | |
|         }
 | |
|         parent.children.push(node);
 | |
|         if (previousSibling) {
 | |
|             node.prev = previousSibling;
 | |
|             previousSibling.next = node;
 | |
|         }
 | |
|         node.parent = parent;
 | |
|         this.lastNode = null;
 | |
|     };
 | |
|     return DomHandler;
 | |
| }());
 | |
| exports.DomHandler = DomHandler;
 | |
| exports.default = DomHandler;
 |