| // 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);
 |