-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
rerelease with better compatibility for browserify
- Loading branch information
ansuz
committed
May 12, 2016
1 parent
2e70fc7
commit fad9322
Showing
2 changed files
with
105 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
define(function () { | ||
// this makes recursing a lot simpler | ||
var isArray = function (A) { | ||
return Object.prototype.toString.call(A)==='[object Array]'; | ||
}; | ||
|
||
var callOnHyperJSON = function (hj, cb) { | ||
var children; | ||
|
||
if (hj && hj[2]) { | ||
children = hj[2].map(function (child) { | ||
if (isArray(child)) { | ||
// if the child is an array, recurse | ||
return callOnHyperJSON(child, cb); | ||
} else if (typeof (child) === 'string') { | ||
return child; | ||
} else { | ||
// the above branches should cover all methods | ||
// if we hit this, there is a problem | ||
throw new Error(); | ||
} | ||
}); | ||
} else { | ||
children = []; | ||
} | ||
// this should return the top level element of your new DOM | ||
return cb(hj[0], hj[1], children); | ||
}; | ||
|
||
var isTruthy = function (x) { | ||
return x; | ||
}; | ||
|
||
var DOM2HyperJSON = function(el, predicate, filter){ | ||
if(!el.tagName && el.nodeType === Node.TEXT_NODE){ | ||
return el.textContent; | ||
} | ||
if(!el.attributes){ | ||
return; | ||
} | ||
if (predicate) { | ||
if (!predicate(el)) { | ||
// shortcircuit | ||
return; | ||
} | ||
} | ||
|
||
var attributes = {}; | ||
|
||
var i = 0; | ||
for(;i < el.attributes.length; i++){ | ||
var attr = el.attributes[i]; | ||
if(attr.name && attr.value){ | ||
attributes[attr.name] = attr.value; | ||
} | ||
} | ||
|
||
// this should never be longer than three elements | ||
var result = []; | ||
|
||
// get the element type, id, and classes of the element | ||
// and push them to the result array | ||
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; | ||
} | ||
result.push(sel); | ||
|
||
// second element of the array is the element attributes | ||
result.push(attributes); | ||
|
||
// third element of the array is an array of child nodes | ||
var children = []; | ||
|
||
// 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) { | ||
return filter(result); | ||
} else { | ||
return result; | ||
} | ||
}; | ||
|
||
var mod = module.exports = { | ||
fromDOM: DOM2HyperJSON, | ||
callOn: callOnHyperJSON | ||
}; | ||
|
||
return mod; | ||
}()); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters