writer.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. var _ = require("underscore");
  2. var xmlbuilder = require("xmlbuilder");
  3. exports.writeString = writeString;
  4. function writeString(root, namespaces) {
  5. var uriToPrefix = _.invert(namespaces);
  6. var nodeWriters = {
  7. element: writeElement,
  8. text: writeTextNode
  9. };
  10. function writeNode(builder, node) {
  11. return nodeWriters[node.type](builder, node);
  12. }
  13. function writeElement(builder, element) {
  14. var elementBuilder = builder.element(mapElementName(element.name), element.attributes);
  15. element.children.forEach(function(child) {
  16. writeNode(elementBuilder, child);
  17. });
  18. }
  19. function mapElementName(name) {
  20. var longFormMatch = /^\{(.*)\}(.*)$/.exec(name);
  21. if (longFormMatch) {
  22. var prefix = uriToPrefix[longFormMatch[1]];
  23. return prefix + (prefix === "" ? "" : ":") + longFormMatch[2];
  24. } else {
  25. return name;
  26. }
  27. }
  28. function writeDocument(root) {
  29. var builder = xmlbuilder
  30. .create(mapElementName(root.name), {
  31. version: '1.0',
  32. encoding: 'UTF-8',
  33. standalone: true
  34. });
  35. _.forEach(namespaces, function(uri, prefix) {
  36. var key = "xmlns" + (prefix === "" ? "" : ":" + prefix);
  37. builder.attribute(key, uri);
  38. });
  39. root.children.forEach(function(child) {
  40. writeNode(builder, child);
  41. });
  42. return builder.end();
  43. }
  44. return writeDocument(root);
  45. }
  46. function writeTextNode(builder, node) {
  47. builder.text(node.value);
  48. }