stew-select
Version:
CSS selectors that allow regular expressions. Stew is a meatier soup.
229 lines (212 loc) • 6.98 kB
JavaScript
// Generated by CoffeeScript 1.6.3
(function() {
var DOMUtil, exports;
DOMUtil = (function() {
function DOMUtil(params) {
var _ref;
if (params == null) {
params = {};
}
this.decode = (_ref = params.decode) != null ? _ref : function(str) {
return str;
};
}
DOMUtil.prototype.parse_html = function(html, options, callback) {
var err, handler, parser, _ref;
if (typeof options === 'function' && typeof callback !== 'function') {
_ref = [callback, options], options = _ref[0], callback = _ref[1];
}
if (this.htmlparser == null) {
try {
this.htmlparser = require('htmlparser');
} catch (_error) {
err = _error;
callback(err, null);
}
}
if (this.htmlparser != null) {
handler = new this.htmlparser.DefaultHandler(function(err, domset) {
if (err != null) {
return callback(err, null);
} else if (Array.isArray(domset) && domset.length <= 1) {
return callback(null, domset[0]);
} else {
return callback(null, domset);
}
});
parser = new this.htmlparser.Parser(handler, options);
return parser.parseComplete(html);
}
};
DOMUtil.prototype.as_node = function(nodeset) {
if (Array.isArray(nodeset)) {
return nodeset[0];
} else {
return nodeset;
}
};
DOMUtil.prototype.as_nodeset = function(node) {
if (Array.isArray(node)) {
return node;
} else if (node != null) {
return [node];
} else {
return [];
}
};
DOMUtil.prototype._kt = function() {
return true;
};
DOMUtil.prototype.to_text = function(elt, filter) {
var buffer,
_this = this;
if (filter == null) {
filter = this._kt;
}
buffer = '';
this.walk_dom(elt, {
visit: function(node, node_metadata, all_metadata) {
if (filter(node, node_metadata, all_metadata)) {
if ((node != null ? node.type : void 0) === 'text' && ((node != null ? node.raw : void 0) != null)) {
buffer += _this.decode(node.raw);
}
return {
'continue': true,
'visit_children': true
};
} else {
return {
'continue': true,
'visit_children': false
};
}
}
});
return buffer;
};
DOMUtil.prototype.inner_text = function(elt, filter) {
return this.to_text(elt, filter);
};
DOMUtil.prototype.to_html = function(elt) {
var buffer;
buffer = '';
this.walk_dom(elt, {
visit: function(node) {
var name, value, _ref;
switch (node.type) {
case 'text':
buffer += node.raw;
break;
case 'tag':
buffer += "<" + node.name;
if (node.attribs != null) {
_ref = node.attribs;
for (name in _ref) {
value = _ref[name];
buffer += " " + name + "=\"" + value + "\"";
}
}
buffer += ">";
}
return true;
},
after_visit: function(node) {
switch (node.type) {
case 'tag':
buffer += "</" + node.name + ">";
}
return true;
}
});
return buffer;
};
DOMUtil.prototype.inner_html = function(elt) {
var buffer, node, _i, _len;
buffer = null;
if (Array.isArray(elt)) {
buffer = '';
for (_i = 0, _len = elt.length; _i < _len; _i++) {
node = elt[_i];
if (node.children != null) {
buffer += this.to_html(node.children);
}
}
} else if ((elt != null ? elt.children : void 0) != null) {
buffer = this.to_html(elt.children);
}
return buffer;
};
DOMUtil.prototype.walk_dom = function(dom, callbacks) {
var dom_metadata, node, node_metadata, nodes, should_continue, sib_index, _i, _len, _results;
if (typeof callbacks === 'function') {
callbacks = {
visit: callbacks
};
}
nodes = this.as_nodeset(dom);
dom_metadata = [];
_results = [];
for (sib_index = _i = 0, _len = nodes.length; _i < _len; sib_index = ++_i) {
node = nodes[sib_index];
node_metadata = {
parent: null,
path: [],
siblings: nodes,
sib_index: sib_index
};
node._stew_node_id = dom_metadata.length;
dom_metadata.push(node_metadata);
should_continue = this._unguarded_walk_dom(node, node_metadata, dom_metadata, callbacks);
if (!should_continue) {
break;
} else {
_results.push(void 0);
}
}
return _results;
};
DOMUtil.prototype._unguarded_walk_dom = function(node, node_metadata, dom_metadata, callbacks) {
var child, index, new_node_metadata, new_path, response, should_continue, _i, _len, _ref;
response = {
'continue': true,
'visit_children': true
};
if (callbacks.visit != null) {
response = callbacks.visit(node, node_metadata, dom_metadata);
}
if (response === true || (response != null ? response['continue'] : void 0) === true || ((response != null ? response['continue'] : void 0) == null)) {
if ((node.children != null) && (response === true || (response != null ? response['visit_children'] : void 0) === true || ((response != null ? response['visit_children'] : void 0) == null))) {
new_path = [].concat(node_metadata.path);
new_path.push(node);
_ref = node.children;
for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) {
child = _ref[index];
new_node_metadata = {
parent: node,
path: new_path,
siblings: node.children,
sib_index: index
};
child._stew_node_id = dom_metadata.length;
dom_metadata.push(new_node_metadata);
should_continue = this._unguarded_walk_dom(child, new_node_metadata, dom_metadata, callbacks);
if (!should_continue) {
return false;
}
}
}
if (callbacks['after_visit'] != null) {
response = callbacks.after_visit(node, node_metadata, dom_metadata);
return response === true || (response != null ? response['continue'] : void 0) === true || ((response != null ? response['continue'] : void 0) == null);
} else {
return true;
}
} else {
return false;
}
};
return DOMUtil;
})();
exports = exports != null ? exports : this;
exports.DOMUtil = DOMUtil;
}).call(this);