mammoth.js/lib/xmlreader.js
2013-03-29 18:57:02 +00:00

76 lines
1.8 KiB
JavaScript

var q = require("q");
var sax = require("sax");
var _ = require("underscore");
exports.read = read;
function read(xmlString) {
var parser = sax.parser(true, {xmlns: true, position: false});
//~ parser.onerror = function(error) {
//~ Q.fcall(function () {
//~ throw new Error("Can't do it");
//~ });
//~ };
var rootElement = {children: []};
var currentElement = rootElement;
var stack = [];
var deferred = q.defer();
parser.onopentag = function(node) {
var attributes = mapValues(node.attributes, function(attribute) {
return attribute.value;
});
var element = new Element(node.name, attributes);
currentElement.children.push(element);
stack.push(currentElement);
currentElement = element
};
parser.onclosetag = function(node) {
currentElement = stack.pop();
};
parser.ontext = function(text) {
if (currentElement !== rootElement) {
currentElement.children.push({
type: "text",
value: text
});
}
};
parser.onend = function() {
deferred.resolve({
root: rootElement.children[0]
});
};
parser.write(xmlString).close();
return deferred.promise;
}
function mapValues(input, mapper, context) {
return _.reduce(input, function (obj, v, k) {
obj[k] = mapper.call(context, v, k, input);
return obj;
}, {}, context);
}
function Element(name, attributes) {
this.type = "element";
this.name = name;
this.attributes = attributes;
this.children = [];
}
Element.prototype.first = function(name) {
return _.find(this.children, function(child) {
return child.name == name;
});
}