Skip to content

Instantly share code, notes, and snippets.

@safareli
Last active August 29, 2015 14:10
Show Gist options
  • Save safareli/aa648c94861c1b2acb22 to your computer and use it in GitHub Desktop.
Save safareli/aa648c94861c1b2acb22 to your computer and use it in GitHub Desktop.
var XML2jsobj = function(){
var negate
, isNodeOfType
, isElement
, isTextNode
, hasOneChild
, and
, adder
, addAttribute
, addTextNode
, addWithExtractor;
negate = function negate (f) {
return function negative() {
f.apply(this,arguments);
}
};
isNodeOfType = function isNodeOfTypeGen(type){
return function isNodeOfType(node) {
return node.nodeType == type;
}
};
isElement = isNodeOfType(1); //ELEMENT_NODE
isTextNode = isNodeOfType(3); //TEXT_NODE
hasOneChild = function hasOneChild(node){
return node.childNodes.length == 1
};
and = function () {
var predicates = arguments;
return function(){
var args = arguments;
return [].every.call(predicates,function(predicate){
return predicate.apply(this,args);
}, this);
};
};
adder = (function (add){
return function (f){
return function (data) {
return function(){
return f.apply(this,[add.bind(undefined,data)].concat(arguments));
};
};
};
})(function Add(data, name, value) {
if (data[name]) {
if (data[name].constructor != Array) {
data[name] = [data[name]];
}
data[name][data[name].length] = value;
}
else {
data[name] = value;
}
});
addAttribute = adder(function addAttribute(add,attr) {
add(attr.name, attr.value);
})
addTextNode = adder(function addTextNode(add, node) {
add(node.nodeName, node.firstChild.nodeValue);
})
addWithExtractor = adder(function addRecure(add, node, extractor) {
add(node.nodeName, extractor(node));
})
return function XML2jsobj(node) {
var data = {}, elements = node.childNodes.filter(isElement);
node.attributes.forEach(addAttribute(data));
elements.filter(and(hasOneChild,isTextNode)).forEach(addTextNode(data));
elements.filter(negate(and(hasOneChild,isTextNode))).forEach(addWithExtractor(data, XML2jsobj));
return data;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment