XMLNode.js
  1  // Generated by CoffeeScript 1.12.7
  2  (function() {
  3    var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, isEmpty, isFunction, isObject, ref,
  4      hasProp = {}.hasOwnProperty;
  5  
  6    ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty;
  7  
  8    XMLElement = null;
  9  
 10    XMLCData = null;
 11  
 12    XMLComment = null;
 13  
 14    XMLDeclaration = null;
 15  
 16    XMLDocType = null;
 17  
 18    XMLRaw = null;
 19  
 20    XMLText = null;
 21  
 22    XMLProcessingInstruction = null;
 23  
 24    module.exports = XMLNode = (function() {
 25      function XMLNode(parent) {
 26        this.parent = parent;
 27        if (this.parent) {
 28          this.options = this.parent.options;
 29          this.stringify = this.parent.stringify;
 30        }
 31        this.children = [];
 32        if (!XMLElement) {
 33          XMLElement = require('./XMLElement');
 34          XMLCData = require('./XMLCData');
 35          XMLComment = require('./XMLComment');
 36          XMLDeclaration = require('./XMLDeclaration');
 37          XMLDocType = require('./XMLDocType');
 38          XMLRaw = require('./XMLRaw');
 39          XMLText = require('./XMLText');
 40          XMLProcessingInstruction = require('./XMLProcessingInstruction');
 41        }
 42      }
 43  
 44      XMLNode.prototype.element = function(name, attributes, text) {
 45        var childNode, item, j, k, key, lastChild, len, len1, ref1, val;
 46        lastChild = null;
 47        if (attributes == null) {
 48          attributes = {};
 49        }
 50        attributes = attributes.valueOf();
 51        if (!isObject(attributes)) {
 52          ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
 53        }
 54        if (name != null) {
 55          name = name.valueOf();
 56        }
 57        if (Array.isArray(name)) {
 58          for (j = 0, len = name.length; j < len; j++) {
 59            item = name[j];
 60            lastChild = this.element(item);
 61          }
 62        } else if (isFunction(name)) {
 63          lastChild = this.element(name.apply());
 64        } else if (isObject(name)) {
 65          for (key in name) {
 66            if (!hasProp.call(name, key)) continue;
 67            val = name[key];
 68            if (isFunction(val)) {
 69              val = val.apply();
 70            }
 71            if ((isObject(val)) && (isEmpty(val))) {
 72              val = null;
 73            }
 74            if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
 75              lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
 76            } else if (!this.options.separateArrayItems && Array.isArray(val)) {
 77              for (k = 0, len1 = val.length; k < len1; k++) {
 78                item = val[k];
 79                childNode = {};
 80                childNode[key] = item;
 81                lastChild = this.element(childNode);
 82              }
 83            } else if (isObject(val)) {
 84              lastChild = this.element(key);
 85              lastChild.element(val);
 86            } else {
 87              lastChild = this.element(key, val);
 88            }
 89          }
 90        } else {
 91          if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
 92            lastChild = this.text(text);
 93          } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
 94            lastChild = this.cdata(text);
 95          } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
 96            lastChild = this.comment(text);
 97          } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
 98            lastChild = this.raw(text);
 99          } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {
100            lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);
101          } else {
102            lastChild = this.node(name, attributes, text);
103          }
104        }
105        if (lastChild == null) {
106          throw new Error("Could not create any elements with: " + name);
107        }
108        return lastChild;
109      };
110  
111      XMLNode.prototype.insertBefore = function(name, attributes, text) {
112        var child, i, removed;
113        if (this.isRoot) {
114          throw new Error("Cannot insert elements at root level");
115        }
116        i = this.parent.children.indexOf(this);
117        removed = this.parent.children.splice(i);
118        child = this.parent.element(name, attributes, text);
119        Array.prototype.push.apply(this.parent.children, removed);
120        return child;
121      };
122  
123      XMLNode.prototype.insertAfter = function(name, attributes, text) {
124        var child, i, removed;
125        if (this.isRoot) {
126          throw new Error("Cannot insert elements at root level");
127        }
128        i = this.parent.children.indexOf(this);
129        removed = this.parent.children.splice(i + 1);
130        child = this.parent.element(name, attributes, text);
131        Array.prototype.push.apply(this.parent.children, removed);
132        return child;
133      };
134  
135      XMLNode.prototype.remove = function() {
136        var i, ref1;
137        if (this.isRoot) {
138          throw new Error("Cannot remove the root element");
139        }
140        i = this.parent.children.indexOf(this);
141        [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1;
142        return this.parent;
143      };
144  
145      XMLNode.prototype.node = function(name, attributes, text) {
146        var child, ref1;
147        if (name != null) {
148          name = name.valueOf();
149        }
150        attributes || (attributes = {});
151        attributes = attributes.valueOf();
152        if (!isObject(attributes)) {
153          ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
154        }
155        child = new XMLElement(this, name, attributes);
156        if (text != null) {
157          child.text(text);
158        }
159        this.children.push(child);
160        return child;
161      };
162  
163      XMLNode.prototype.text = function(value) {
164        var child;
165        child = new XMLText(this, value);
166        this.children.push(child);
167        return this;
168      };
169  
170      XMLNode.prototype.cdata = function(value) {
171        var child;
172        child = new XMLCData(this, value);
173        this.children.push(child);
174        return this;
175      };
176  
177      XMLNode.prototype.comment = function(value) {
178        var child;
179        child = new XMLComment(this, value);
180        this.children.push(child);
181        return this;
182      };
183  
184      XMLNode.prototype.commentBefore = function(value) {
185        var child, i, removed;
186        i = this.parent.children.indexOf(this);
187        removed = this.parent.children.splice(i);
188        child = this.parent.comment(value);
189        Array.prototype.push.apply(this.parent.children, removed);
190        return this;
191      };
192  
193      XMLNode.prototype.commentAfter = function(value) {
194        var child, i, removed;
195        i = this.parent.children.indexOf(this);
196        removed = this.parent.children.splice(i + 1);
197        child = this.parent.comment(value);
198        Array.prototype.push.apply(this.parent.children, removed);
199        return this;
200      };
201  
202      XMLNode.prototype.raw = function(value) {
203        var child;
204        child = new XMLRaw(this, value);
205        this.children.push(child);
206        return this;
207      };
208  
209      XMLNode.prototype.instruction = function(target, value) {
210        var insTarget, insValue, instruction, j, len;
211        if (target != null) {
212          target = target.valueOf();
213        }
214        if (value != null) {
215          value = value.valueOf();
216        }
217        if (Array.isArray(target)) {
218          for (j = 0, len = target.length; j < len; j++) {
219            insTarget = target[j];
220            this.instruction(insTarget);
221          }
222        } else if (isObject(target)) {
223          for (insTarget in target) {
224            if (!hasProp.call(target, insTarget)) continue;
225            insValue = target[insTarget];
226            this.instruction(insTarget, insValue);
227          }
228        } else {
229          if (isFunction(value)) {
230            value = value.apply();
231          }
232          instruction = new XMLProcessingInstruction(this, target, value);
233          this.children.push(instruction);
234        }
235        return this;
236      };
237  
238      XMLNode.prototype.instructionBefore = function(target, value) {
239        var child, i, removed;
240        i = this.parent.children.indexOf(this);
241        removed = this.parent.children.splice(i);
242        child = this.parent.instruction(target, value);
243        Array.prototype.push.apply(this.parent.children, removed);
244        return this;
245      };
246  
247      XMLNode.prototype.instructionAfter = function(target, value) {
248        var child, i, removed;
249        i = this.parent.children.indexOf(this);
250        removed = this.parent.children.splice(i + 1);
251        child = this.parent.instruction(target, value);
252        Array.prototype.push.apply(this.parent.children, removed);
253        return this;
254      };
255  
256      XMLNode.prototype.declaration = function(version, encoding, standalone) {
257        var doc, xmldec;
258        doc = this.document();
259        xmldec = new XMLDeclaration(doc, version, encoding, standalone);
260        if (doc.children[0] instanceof XMLDeclaration) {
261          doc.children[0] = xmldec;
262        } else {
263          doc.children.unshift(xmldec);
264        }
265        return doc.root() || doc;
266      };
267  
268      XMLNode.prototype.doctype = function(pubID, sysID) {
269        var child, doc, doctype, i, j, k, len, len1, ref1, ref2;
270        doc = this.document();
271        doctype = new XMLDocType(doc, pubID, sysID);
272        ref1 = doc.children;
273        for (i = j = 0, len = ref1.length; j < len; i = ++j) {
274          child = ref1[i];
275          if (child instanceof XMLDocType) {
276            doc.children[i] = doctype;
277            return doctype;
278          }
279        }
280        ref2 = doc.children;
281        for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) {
282          child = ref2[i];
283          if (child.isRoot) {
284            doc.children.splice(i, 0, doctype);
285            return doctype;
286          }
287        }
288        doc.children.push(doctype);
289        return doctype;
290      };
291  
292      XMLNode.prototype.up = function() {
293        if (this.isRoot) {
294          throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
295        }
296        return this.parent;
297      };
298  
299      XMLNode.prototype.root = function() {
300        var node;
301        node = this;
302        while (node) {
303          if (node.isDocument) {
304            return node.rootObject;
305          } else if (node.isRoot) {
306            return node;
307          } else {
308            node = node.parent;
309          }
310        }
311      };
312  
313      XMLNode.prototype.document = function() {
314        var node;
315        node = this;
316        while (node) {
317          if (node.isDocument) {
318            return node;
319          } else {
320            node = node.parent;
321          }
322        }
323      };
324  
325      XMLNode.prototype.end = function(options) {
326        return this.document().end(options);
327      };
328  
329      XMLNode.prototype.prev = function() {
330        var i;
331        i = this.parent.children.indexOf(this);
332        if (i < 1) {
333          throw new Error("Already at the first node");
334        }
335        return this.parent.children[i - 1];
336      };
337  
338      XMLNode.prototype.next = function() {
339        var i;
340        i = this.parent.children.indexOf(this);
341        if (i === -1 || i === this.parent.children.length - 1) {
342          throw new Error("Already at the last node");
343        }
344        return this.parent.children[i + 1];
345      };
346  
347      XMLNode.prototype.importDocument = function(doc) {
348        var clonedRoot;
349        clonedRoot = doc.root().clone();
350        clonedRoot.parent = this;
351        clonedRoot.isRoot = false;
352        this.children.push(clonedRoot);
353        return this;
354      };
355  
356      XMLNode.prototype.ele = function(name, attributes, text) {
357        return this.element(name, attributes, text);
358      };
359  
360      XMLNode.prototype.nod = function(name, attributes, text) {
361        return this.node(name, attributes, text);
362      };
363  
364      XMLNode.prototype.txt = function(value) {
365        return this.text(value);
366      };
367  
368      XMLNode.prototype.dat = function(value) {
369        return this.cdata(value);
370      };
371  
372      XMLNode.prototype.com = function(value) {
373        return this.comment(value);
374      };
375  
376      XMLNode.prototype.ins = function(target, value) {
377        return this.instruction(target, value);
378      };
379  
380      XMLNode.prototype.doc = function() {
381        return this.document();
382      };
383  
384      XMLNode.prototype.dec = function(version, encoding, standalone) {
385        return this.declaration(version, encoding, standalone);
386      };
387  
388      XMLNode.prototype.dtd = function(pubID, sysID) {
389        return this.doctype(pubID, sysID);
390      };
391  
392      XMLNode.prototype.e = function(name, attributes, text) {
393        return this.element(name, attributes, text);
394      };
395  
396      XMLNode.prototype.n = function(name, attributes, text) {
397        return this.node(name, attributes, text);
398      };
399  
400      XMLNode.prototype.t = function(value) {
401        return this.text(value);
402      };
403  
404      XMLNode.prototype.d = function(value) {
405        return this.cdata(value);
406      };
407  
408      XMLNode.prototype.c = function(value) {
409        return this.comment(value);
410      };
411  
412      XMLNode.prototype.r = function(value) {
413        return this.raw(value);
414      };
415  
416      XMLNode.prototype.i = function(target, value) {
417        return this.instruction(target, value);
418      };
419  
420      XMLNode.prototype.u = function() {
421        return this.up();
422      };
423  
424      XMLNode.prototype.importXMLBuilder = function(doc) {
425        return this.importDocument(doc);
426      };
427  
428      return XMLNode;
429  
430    })();
431  
432  }).call(this);