UNPKG

haar-convert

Version:

convert OpenCV Haar Cascade XML created by `opencv_traincascade`/`opencv_haartraining` to the format required for `haar-detect`

93 lines (86 loc) 2.42 kB
var sax = require("sax"); var noop = function() {}; function newTag(name, attrs) { return { name: name, children: [], content: "", attrs: attrs }; } function parse(xmlString, callback) { var strict = true; var parser = sax.parser(strict); var tagStack = [newTag("__root__")]; var currentTag = tagStack[0]; var _cb = callback; parser.onerror = function(e) { // an error happened. _cb(e); _cb = noop; }; parser.ontext = function(t) { currentTag.content += t; }; parser.onopentag = function(node) { // opened a tag. node has "name" and "attributes" var tag = newTag(node.name, node.attributes); currentTag.children.push(tag); tagStack.push(tag); currentTag = tag; }; parser.onclosetag = function() { tagStack.pop(); currentTag = tagStack[tagStack.length - 1]; }; parser.onend = function() { // parser stream is done, and ready to have more stuff written to it. _cb(null, currentTag); //the root tag single child _cb = noop; }; parser.write(xmlString).close(); } function slice(arrayLike, a, b) { return Array.prototype.slice.call(arrayLike, a, b); } function filter(arr, predicate) { var r = [], i = 0, l = arr.length; for (; i < l; i++) { if (predicate(arr[i])) { r.push(arr[i]); } } return r; } function path(startNode /*, ...path*/) { var path = slice(arguments, 1); return path.reduce( (node, next) => { //descned first-children only var child = children(node, next)[0]; if (!child) { throw new Error( "Could not find tag " + next + " in xml " + node.name ); } return child; }, startNode ); } // get children with given tags. function children(node /*, ...tags*/) { var tags = slice(arguments, 1); if (tags.length === 0) { return node.children; } if (tags.length === 1) { var tag = tags[0]; return filter(node.children, function(child) { return child.name === tag; }); } return filter(node.children, function(child) { return tags.indexOf(child.name) > -1; }); } module.exports = (exports = { parse: parse, children: children, path: path });