|
|
|
@ -1,5 +1,4 @@
|
|
|
|
|
define([], function () {
|
|
|
|
|
|
|
|
|
|
// this makes recursing a lot simpler
|
|
|
|
|
var isArray = function (A) {
|
|
|
|
|
return Object.prototype.toString.call(A)==='[object Array]';
|
|
|
|
@ -39,8 +38,14 @@ define([], function () {
|
|
|
|
|
return cb(hj[0], hj[1], children);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var prependDot = function (token) {
|
|
|
|
|
return '.' + token;
|
|
|
|
|
var classify = function (token) {
|
|
|
|
|
return '.' + token.trim();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var isValidClass = function (x) {
|
|
|
|
|
if (x && /\S/.test(x)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var isTruthy = function (x) {
|
|
|
|
@ -54,13 +59,13 @@ define([], function () {
|
|
|
|
|
if(!el.attributes){
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (predicate) {
|
|
|
|
|
if (!predicate(el)) {
|
|
|
|
|
// shortcircuit
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var attributes = {};
|
|
|
|
|
|
|
|
|
|
var i = 0;
|
|
|
|
@ -84,19 +89,25 @@ define([], function () {
|
|
|
|
|
var sel = el.tagName;
|
|
|
|
|
|
|
|
|
|
if(attributes.id){
|
|
|
|
|
// we don't have to do much to validate IDs because the browser
|
|
|
|
|
// will only permit one id to exist
|
|
|
|
|
// unless we come across a strange browser in the wild
|
|
|
|
|
sel = sel +'#'+ attributes.id;
|
|
|
|
|
delete attributes.id;
|
|
|
|
|
}
|
|
|
|
|
if(attributes.class){
|
|
|
|
|
// actually parse out classes so that we produce a valid selector
|
|
|
|
|
// string. leading or trailing spaces would have caused it to choke
|
|
|
|
|
// these are really common in generated html
|
|
|
|
|
/* TODO this can be done with RegExps alone, and it will be faster
|
|
|
|
|
but this works and is a little less error prone, albeit slower
|
|
|
|
|
come back and speed it up when it comes time to optimize */
|
|
|
|
|
|
|
|
|
|
sel = sel + attributes.class
|
|
|
|
|
.split(/\s+/)
|
|
|
|
|
.filter(isTruthy)
|
|
|
|
|
.map(prependDot)
|
|
|
|
|
.join('');
|
|
|
|
|
.split(/\s+/g)
|
|
|
|
|
.filter(isValidClass)
|
|
|
|
|
.map(classify)
|
|
|
|
|
.join('')
|
|
|
|
|
.replace(/\.\./g, '.');
|
|
|
|
|
delete attributes.class;
|
|
|
|
|
}
|
|
|
|
|
result.push(sel);
|
|
|
|
@ -109,11 +120,9 @@ define([], function () {
|
|
|
|
|
|
|
|
|
|
// js hint complains if we use 'var' here
|
|
|
|
|
i = 0;
|
|
|
|
|
|
|
|
|
|
for(; i < el.childNodes.length; i++){
|
|
|
|
|
children.push(DOM2HyperJSON(el.childNodes[i], predicate, filter));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result.push(children.filter(isTruthy));
|
|
|
|
|
|
|
|
|
|
if (filter) {
|
|
|
|
|