summaryrefslogtreecommitdiff
path: root/bin/wiki/ImportarDesdeURL/node_modules/domhandler/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'bin/wiki/ImportarDesdeURL/node_modules/domhandler/index.js')
-rw-r--r--bin/wiki/ImportarDesdeURL/node_modules/domhandler/index.js217
1 files changed, 217 insertions, 0 deletions
diff --git a/bin/wiki/ImportarDesdeURL/node_modules/domhandler/index.js b/bin/wiki/ImportarDesdeURL/node_modules/domhandler/index.js
new file mode 100644
index 00000000..e78efc37
--- /dev/null
+++ b/bin/wiki/ImportarDesdeURL/node_modules/domhandler/index.js
@@ -0,0 +1,217 @@
+var ElementType = require("domelementtype");
+
+var re_whitespace = /\s+/g;
+var NodePrototype = require("./lib/node");
+var ElementPrototype = require("./lib/element");
+
+function DomHandler(callback, options, elementCB){
+ if(typeof callback === "object"){
+ elementCB = options;
+ options = callback;
+ callback = null;
+ } else if(typeof options === "function"){
+ elementCB = options;
+ options = defaultOpts;
+ }
+ this._callback = callback;
+ this._options = options || defaultOpts;
+ this._elementCB = elementCB;
+ this.dom = [];
+ this._done = false;
+ this._tagStack = [];
+ this._parser = this._parser || null;
+}
+
+//default options
+var defaultOpts = {
+ normalizeWhitespace: false, //Replace all whitespace with single spaces
+ withStartIndices: false, //Add startIndex properties to nodes
+ withEndIndices: false, //Add endIndex properties to nodes
+};
+
+DomHandler.prototype.onparserinit = function(parser){
+ this._parser = parser;
+};
+
+//Resets the handler back to starting state
+DomHandler.prototype.onreset = function(){
+ DomHandler.call(this, this._callback, this._options, this._elementCB);
+};
+
+//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._handleCallback =
+DomHandler.prototype.onerror = function(error){
+ if(typeof this._callback === "function"){
+ this._callback(error, this.dom);
+ } else {
+ if(error) throw error;
+ }
+};
+
+DomHandler.prototype.onclosetag = function(){
+ //if(this._tagStack.pop().name !== name) this._handleCallback(Error("Tagname didn't match!"));
+
+ var elem = this._tagStack.pop();
+
+ if(this._options.withEndIndices && elem){
+ elem.endIndex = this._parser.endIndex;
+ }
+
+ if(this._elementCB) this._elementCB(elem);
+};
+
+DomHandler.prototype._createDomElement = function(properties){
+ if (!this._options.withDomLvl1) return properties;
+
+ var element;
+ if (properties.type === "tag") {
+ element = Object.create(ElementPrototype);
+ } else {
+ element = Object.create(NodePrototype);
+ }
+
+ for (var key in properties) {
+ if (properties.hasOwnProperty(key)) {
+ element[key] = properties[key];
+ }
+ }
+
+ return element;
+};
+
+DomHandler.prototype._addDomElement = function(element){
+ var parent = this._tagStack[this._tagStack.length - 1];
+ var siblings = parent ? parent.children : this.dom;
+ var previousSibling = siblings[siblings.length - 1];
+
+ element.next = null;
+
+ if(this._options.withStartIndices){
+ element.startIndex = this._parser.startIndex;
+ }
+ if(this._options.withEndIndices){
+ element.endIndex = this._parser.endIndex;
+ }
+
+ if(previousSibling){
+ element.prev = previousSibling;
+ previousSibling.next = element;
+ } else {
+ element.prev = null;
+ }
+
+ siblings.push(element);
+ element.parent = parent || null;
+};
+
+DomHandler.prototype.onopentag = function(name, attribs){
+ var properties = {
+ type: name === "script" ? ElementType.Script : name === "style" ? ElementType.Style : ElementType.Tag,
+ name: name,
+ attribs: attribs,
+ children: []
+ };
+
+ var element = this._createDomElement(properties);
+
+ this._addDomElement(element);
+
+ this._tagStack.push(element);
+};
+
+DomHandler.prototype.ontext = function(data){
+ //the ignoreWhitespace is officially dropped, but for now,
+ //it's an alias for normalizeWhitespace
+ var normalize = this._options.normalizeWhitespace || this._options.ignoreWhitespace;
+
+ var lastTag;
+
+ if(!this._tagStack.length && this.dom.length && (lastTag = this.dom[this.dom.length-1]).type === ElementType.Text){
+ if(normalize){
+ lastTag.data = (lastTag.data + data).replace(re_whitespace, " ");
+ } else {
+ lastTag.data += data;
+ }
+ } else {
+ if(
+ this._tagStack.length &&
+ (lastTag = this._tagStack[this._tagStack.length - 1]) &&
+ (lastTag = lastTag.children[lastTag.children.length - 1]) &&
+ lastTag.type === ElementType.Text
+ ){
+ if(normalize){
+ lastTag.data = (lastTag.data + data).replace(re_whitespace, " ");
+ } else {
+ lastTag.data += data;
+ }
+ } else {
+ if(normalize){
+ data = data.replace(re_whitespace, " ");
+ }
+
+ var element = this._createDomElement({
+ data: data,
+ type: ElementType.Text
+ });
+
+ this._addDomElement(element);
+ }
+ }
+};
+
+DomHandler.prototype.oncomment = function(data){
+ var lastTag = this._tagStack[this._tagStack.length - 1];
+
+ if(lastTag && lastTag.type === ElementType.Comment){
+ lastTag.data += data;
+ return;
+ }
+
+ var properties = {
+ data: data,
+ type: ElementType.Comment
+ };
+
+ var element = this._createDomElement(properties);
+
+ this._addDomElement(element);
+ this._tagStack.push(element);
+};
+
+DomHandler.prototype.oncdatastart = function(){
+ var properties = {
+ children: [{
+ data: "",
+ type: ElementType.Text
+ }],
+ type: ElementType.CDATA
+ };
+
+ var element = this._createDomElement(properties);
+
+ this._addDomElement(element);
+ this._tagStack.push(element);
+};
+
+DomHandler.prototype.oncommentend = DomHandler.prototype.oncdataend = function(){
+ this._tagStack.pop();
+};
+
+DomHandler.prototype.onprocessinginstruction = function(name, data){
+ var element = this._createDomElement({
+ name: name,
+ data: data,
+ type: ElementType.Directive
+ });
+
+ this._addDomElement(element);
+};
+
+module.exports = DomHandler;