aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-08-16 15:18:58 +0100
committerMichael Williamson <mike@zwobble.org>2015-08-16 15:18:58 +0100
commitd8c0a72e33e661590cdfea63fcaa0926b2b589ff (patch)
tree49bb2801ef8ab93eb2dbae71776da302e2ccdc29 /lib
parent93625f1557428915f7a68156e1edc95b9d849eae (diff)
Basic support for writing XML namespaces
Diffstat (limited to 'lib')
-rw-r--r--lib/xml/writer.js69
1 files changed, 45 insertions, 24 deletions
diff --git a/lib/xml/writer.js b/lib/xml/writer.js
index 418a4b9..66cc8de 100644
--- a/lib/xml/writer.js
+++ b/lib/xml/writer.js
@@ -1,36 +1,57 @@
+var _ = require("underscore");
var xmlbuilder = require("xmlbuilder");
exports.writeString = writeString;
-function writeString(root) {
- var builder = xmlbuilder
- .create(root.name, {
- version: '1.0',
- encoding: 'UTF-8',
- standalone: true
- });
- root.children.forEach(function(child) {
- writeNode(builder, child);
- });
- return builder.end();
-}
+function writeString(root, namespaces) {
+ var uriToPrefix = _.invert(namespaces);
+
+ var nodeWriters = {
+ element: writeElement,
+ text: writeTextNode
+ };
-var nodeWriters = {
- element: writeElement,
- text: writeTextNode
-};
+ function writeNode(builder, node) {
+ return nodeWriters[node.type](builder, node);
+ }
-function writeNode(builder, node) {
- return nodeWriters[node.type](builder, node);
-}
+ function writeElement(builder, element) {
+ var elementBuilder = builder.element(mapElementName(element.name), element.attributes);
+ element.children.forEach(function(child) {
+ writeNode(elementBuilder, child);
+ });
+ }
+
+ function mapElementName(name) {
+ var longFormMatch = /^\{(.*)\}(.*)$/.exec(name);
+ if (longFormMatch) {
+ return uriToPrefix[longFormMatch[1]] + ":" + longFormMatch[2];
+ } else {
+ return name;
+ }
+ }
+
+ function writeDocument(root) {
+ var builder = xmlbuilder
+ .create(root.name, {
+ version: '1.0',
+ encoding: 'UTF-8',
+ standalone: true
+ });
+
+ _.forEach(namespaces, function(uri, prefix) {
+ builder.attribute("xmlns:" + prefix, uri);
+ });
+
+ root.children.forEach(function(child) {
+ writeNode(builder, child);
+ });
+ return builder.end();
+ }
-function writeElement(builder, element) {
- var elementBuilder = builder.element(element.name, element.attributes);
- element.children.forEach(function(child) {
- writeNode(elementBuilder, child);
- });
+ return writeDocument(root);
}
function writeTextNode(builder, node) {