You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
6.2 KiB
172 lines
6.2 KiB
"use strict"; |
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { |
|
if (k2 === undefined) k2 = k; |
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); |
|
}) : (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;
|
|
|