| // Generated by CoffeeScript 1.12.7 |
| (function() { |
| "use strict"; |
| var builder, defaults, escapeCDATA, requiresCDATA, wrapCDATA, |
| hasProp = {}.hasOwnProperty; |
| |
| builder = require('xmlbuilder'); |
| |
| defaults = require('./defaults').defaults; |
| |
| requiresCDATA = function(entry) { |
| return typeof entry === "string" && (entry.indexOf('&') >= 0 || entry.indexOf('>') >= 0 || entry.indexOf('<') >= 0); |
| }; |
| |
| wrapCDATA = function(entry) { |
| return "<![CDATA[" + (escapeCDATA(entry)) + "]]>"; |
| }; |
| |
| escapeCDATA = function(entry) { |
| return entry.replace(']]>', ']]]]><![CDATA[>'); |
| }; |
| |
| exports.Builder = (function() { |
| function Builder(opts) { |
| var key, ref, value; |
| this.options = {}; |
| ref = defaults["0.2"]; |
| for (key in ref) { |
| if (!hasProp.call(ref, key)) continue; |
| value = ref[key]; |
| this.options[key] = value; |
| } |
| for (key in opts) { |
| if (!hasProp.call(opts, key)) continue; |
| value = opts[key]; |
| this.options[key] = value; |
| } |
| } |
| |
| Builder.prototype.buildObject = function(rootObj) { |
| var attrkey, charkey, render, rootElement, rootName; |
| attrkey = this.options.attrkey; |
| charkey = this.options.charkey; |
| if ((Object.keys(rootObj).length === 1) && (this.options.rootName === defaults['0.2'].rootName)) { |
| rootName = Object.keys(rootObj)[0]; |
| rootObj = rootObj[rootName]; |
| } else { |
| rootName = this.options.rootName; |
| } |
| render = (function(_this) { |
| return function(element, obj) { |
| var attr, child, entry, index, key, value; |
| if (typeof obj !== 'object') { |
| if (_this.options.cdata && requiresCDATA(obj)) { |
| element.raw(wrapCDATA(obj)); |
| } else { |
| element.txt(obj); |
| } |
| } else if (Array.isArray(obj)) { |
| for (index in obj) { |
| if (!hasProp.call(obj, index)) continue; |
| child = obj[index]; |
| for (key in child) { |
| entry = child[key]; |
| element = render(element.ele(key), entry).up(); |
| } |
| } |
| } else { |
| for (key in obj) { |
| if (!hasProp.call(obj, key)) continue; |
| child = obj[key]; |
| if (key === attrkey) { |
| if (typeof child === "object") { |
| for (attr in child) { |
| value = child[attr]; |
| element = element.att(attr, value); |
| } |
| } |
| } else if (key === charkey) { |
| if (_this.options.cdata && requiresCDATA(child)) { |
| element = element.raw(wrapCDATA(child)); |
| } else { |
| element = element.txt(child); |
| } |
| } else if (Array.isArray(child)) { |
| for (index in child) { |
| if (!hasProp.call(child, index)) continue; |
| entry = child[index]; |
| if (typeof entry === 'string') { |
| if (_this.options.cdata && requiresCDATA(entry)) { |
| element = element.ele(key).raw(wrapCDATA(entry)).up(); |
| } else { |
| element = element.ele(key, entry).up(); |
| } |
| } else { |
| element = render(element.ele(key), entry).up(); |
| } |
| } |
| } else if (typeof child === "object") { |
| element = render(element.ele(key), child).up(); |
| } else { |
| if (typeof child === 'string' && _this.options.cdata && requiresCDATA(child)) { |
| element = element.ele(key).raw(wrapCDATA(child)).up(); |
| } else { |
| if (child == null) { |
| child = ''; |
| } |
| element = element.ele(key, child.toString()).up(); |
| } |
| } |
| } |
| } |
| return element; |
| }; |
| })(this); |
| rootElement = builder.create(rootName, this.options.xmldec, this.options.doctype, { |
| headless: this.options.headless, |
| allowSurrogateChars: this.options.allowSurrogateChars |
| }); |
| return render(rootElement, rootObj).end(this.options.renderOpts); |
| }; |
| |
| return Builder; |
| |
| })(); |
| |
| }).call(this); |