granula
Version:
i18n tool for angular.js applications
146 lines (137 loc) • 4.2 kB
JavaScript
(function() {
var emptyIsUndefined, htmlparser2, nodeEnd, nodeStart, nodeToHtml, _;
htmlparser2 = require('htmlparser2');
_ = require('underscore');
emptyIsUndefined = function(str) {
if ((str != null ? str.length : void 0) === 0) {
return void 0;
} else {
return str;
}
};
module.exports.htmlDocument = function(html) {
var dom, handler, parser;
dom = null;
handler = new htmlparser2.DomHandler((function(e, adom) {
return dom = adom;
}), {
normalizeWhitespace: true
});
parser = new htmlparser2.Parser(handler);
parser.write(html);
parser.done();
return {
processWithChildren: function(element, cb) {
var _ref,
_this = this;
cb(element);
return ((_ref = element.children) != null ? _ref : []).forEach(function(ch) {
return _this.processWithChildren(ch, cb);
});
},
forEach: function(action) {
var _this = this;
return dom.forEach(function(el) {
return _this.processWithChildren(el, action);
});
},
root: function() {
return dom;
},
getText: function(element) {
var nodeToText;
nodeToText = function(parts, element) {
var child, _i, _len, _ref, _ref1;
if (element.type === 'text') {
parts.push(element.data);
}
_ref1 = (_ref = element.children) != null ? _ref : [];
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
child = _ref1[_i];
nodeToText(parts, child);
}
return parts;
};
return nodeToText([], element).join("");
},
getChildNodes: function(element) {
var _ref, _ref1;
return (_ref = (_ref1 = element.children) != null ? _ref1.filter(function(ch) {
return ch.type !== 'text';
}) : void 0) != null ? _ref : [];
},
hasAttribute: function(element, attribute) {
var _ref;
return ((_ref = element.attribs) != null ? _ref[attribute] : void 0) !== void 0;
},
getAttribute: function(element, attribute) {
var _ref;
return emptyIsUndefined((_ref = element.attribs) != null ? _ref[attribute] : void 0);
},
getPath: function(element) {
var args, parts;
parts = [];
while (element) {
parts.unshift(element);
element = element.parent;
}
args = function(element) {
return _.pairs(_.pick(element.attribs, "id", "class")).map(function(_arg) {
var name, val;
name = _arg[0], val = _arg[1];
return "" + name + "=\"" + val + "\"";
}).join(" ");
};
return parts.map(function(e) {
return "<" + e.name + " " + (args(e)) + ">";
}).join(" / ");
},
getInnerHtml: function(element) {
var child, parts, _i, _len, _ref;
parts = [];
_ref = element.children;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
child = _ref[_i];
nodeToHtml(parts, child);
}
return parts.join("");
},
getHtml: function(element) {
return nodeToHtml([], element).join("");
}
};
};
nodeStart = function(parts, element) {
var attr, val, _ref;
parts.push("<" + element.name);
_ref = element.attribs;
for (attr in _ref) {
val = _ref[attr];
parts.push(" " + attr);
if (attr !== val && !_.isEmpty(val)) {
parts.push("=\"" + val + "\"");
}
}
return parts.push(">");
};
nodeEnd = function(parts, element) {
return parts.push("</" + element.name + ">");
};
nodeToHtml = function(parts, element) {
var child, _i, _len, _ref, _ref1;
if (element.type === 'text') {
parts.push(element.data);
}
if (element.type !== 'tag') {
return;
}
nodeStart(parts, element);
_ref1 = (_ref = element.children) != null ? _ref : [];
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
child = _ref1[_i];
nodeToHtml(parts, child);
}
nodeEnd(parts, element);
return parts;
};
}).call(this);