git-off

git off handles large files in git repos
git clone https://noulin.net/git/git-off.git
Log | Files | Refs | README

builder.js (2573B)


      1 var util = require('../util');
      2 var builder = require('xmlbuilder');
      3 
      4 function XmlBuilder() { }
      5 
      6 XmlBuilder.prototype.toXML = function(params, shape, rootElement, noEmpty) {
      7   var xml = builder.create(rootElement);
      8   applyNamespaces(xml, shape);
      9   serialize(xml, params, shape);
     10   return xml.children.length > 0 || noEmpty ? xml.root().toString() : '';
     11 };
     12 
     13 function serialize(xml, value, shape) {
     14   switch (shape.type) {
     15     case 'structure': return serializeStructure(xml, value, shape);
     16     case 'map': return serializeMap(xml, value, shape);
     17     case 'list': return serializeList(xml, value, shape);
     18     default: return serializeScalar(xml, value, shape);
     19   }
     20 }
     21 
     22 function serializeStructure(xml, params, shape) {
     23   util.arrayEach(shape.memberNames, function(memberName) {
     24     var memberShape = shape.members[memberName];
     25     if (memberShape.location !== 'body') return;
     26 
     27     var value = params[memberName];
     28     var name = memberShape.name;
     29     if (value !== undefined && value !== null) {
     30       if (memberShape.isXmlAttribute) {
     31         xml.att(name, value);
     32       } else if (memberShape.flattened) {
     33         serialize(xml, value, memberShape);
     34       } else {
     35         var element = xml.ele(name);
     36         applyNamespaces(element, memberShape);
     37         serialize(element, value, memberShape);
     38       }
     39     }
     40   });
     41 }
     42 
     43 function serializeMap(xml, map, shape) {
     44   var xmlKey = shape.key.name || 'key';
     45   var xmlValue = shape.value.name || 'value';
     46 
     47   util.each(map, function(key, value) {
     48     var entry = xml.ele(shape.flattened ? shape.name : 'entry');
     49     serialize(entry.ele(xmlKey), key, shape.key);
     50     serialize(entry.ele(xmlValue), value, shape.value);
     51   });
     52 }
     53 
     54 function serializeList(xml, list, shape) {
     55   if (shape.flattened) {
     56     util.arrayEach(list, function(value) {
     57       var name = shape.member.name || shape.name;
     58       var element = xml.ele(name);
     59       serialize(element, value, shape.member);
     60     });
     61   } else {
     62     util.arrayEach(list, function(value) {
     63       var name = shape.member.name || 'member';
     64       var element = xml.ele(name);
     65       serialize(element, value, shape.member);
     66     });
     67   }
     68 }
     69 
     70 function serializeScalar(xml, value, shape) {
     71   xml.txt(shape.toWireFormat(value));
     72 }
     73 
     74 function applyNamespaces(xml, shape) {
     75   var uri, prefix = 'xmlns';
     76   if (shape.xmlNamespaceUri) {
     77     uri = shape.xmlNamespaceUri;
     78     if (shape.xmlNamespacePrefix) prefix += ':' + shape.xmlNamespacePrefix;
     79   } else if (xml.isRoot && shape.api.xmlNamespaceUri) {
     80     uri = shape.api.xmlNamespaceUri;
     81   }
     82 
     83   if (uri) xml.att(prefix, uri);
     84 }
     85 
     86 module.exports = XmlBuilder;