108 lines
4.2 KiB
JavaScript
108 lines
4.2 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var XML_1 = require("./XML");
|
|
function setFreeNamespaceName(leftName, rightName, attributes) {
|
|
var kname = 'a';
|
|
var value = leftName + ':';
|
|
while (attributes['xmlns:' + kname] !== undefined || value.indexOf(kname + ':') === 0) {
|
|
var newChar = kname.charCodeAt(0) + 1;
|
|
if (newChar > 'z'.charCodeAt(0))
|
|
kname = 'x' + String.fromCharCode(newChar);
|
|
else
|
|
kname = kname.substr(0, kname.length - 1) + String.fromCharCode(newChar);
|
|
}
|
|
attributes['xmlns:' + kname] = value;
|
|
return kname + ':' + rightName;
|
|
}
|
|
function explodeName(name, attributes, findNamespaceInParents) {
|
|
var li1 = Math.max(name.lastIndexOf(':'), name.lastIndexOf('/'));
|
|
if (li1 === -1)
|
|
return name;
|
|
var leftName = name.substring(0, li1);
|
|
var rightName = name.substring(li1 + 1);
|
|
var namespace = attributes['xmlns:' + leftName];
|
|
if (namespace) {
|
|
return name;
|
|
}
|
|
if (findNamespaceInParents(leftName))
|
|
return name;
|
|
return setFreeNamespaceName(leftName, rightName, attributes);
|
|
}
|
|
var XMLElementBuilder = (function () {
|
|
function XMLElementBuilder(name, attributes, parent) {
|
|
if (!attributes)
|
|
attributes = {};
|
|
this.parent = parent;
|
|
this.attributes = attributes;
|
|
var slashLastIndex = name.lastIndexOf('/');
|
|
if (slashLastIndex > -1) {
|
|
var leftName = name.substring(0, slashLastIndex);
|
|
var rightName = name.substring(slashLastIndex + 1);
|
|
name = setFreeNamespaceName(leftName, rightName, this.attributes);
|
|
}
|
|
this.name = name;
|
|
this.type = 'element';
|
|
this.elements = [];
|
|
}
|
|
XMLElementBuilder.prototype.toXML = function (includeDeclaration) {
|
|
return XML_1.XML.toXML(this, includeDeclaration);
|
|
};
|
|
XMLElementBuilder.prototype.toJSON = function (includeDeclaration) {
|
|
return XML_1.XML.toJSON(this.toXML(includeDeclaration));
|
|
};
|
|
XMLElementBuilder.prototype.ele = function (name, attributes, insertAtStart) {
|
|
var el = new XMLElementBuilder(name, attributes, this);
|
|
if (insertAtStart)
|
|
this.elements.unshift(el);
|
|
else
|
|
this.elements.push(el);
|
|
return el;
|
|
};
|
|
XMLElementBuilder.prototype.findNamespace = function (namespace) {
|
|
var valueFound = this.attributes['xmlns:' + namespace];
|
|
if (valueFound)
|
|
return valueFound;
|
|
if (!this.parent)
|
|
return undefined;
|
|
return this.parent.findNamespace(namespace);
|
|
};
|
|
XMLElementBuilder.exportFindNamespace = function (element) {
|
|
return function (ns) {
|
|
return element.findNamespace(ns);
|
|
};
|
|
};
|
|
XMLElementBuilder.prototype.add = function (element) {
|
|
if (element.constructor === Array)
|
|
return element.map(this.add.bind(this));
|
|
if (!element.type)
|
|
element = {
|
|
type: 'text',
|
|
text: element.toString()
|
|
};
|
|
if (element.type === 'element') {
|
|
if (!element.attributes)
|
|
element.attributes = {};
|
|
element.name = explodeName(element.name, element.attributes, XMLElementBuilder.exportFindNamespace(this));
|
|
if (element.elements) {
|
|
var list_1 = [];
|
|
element.elements.forEach(function (e) { return list_1.push(e); });
|
|
while (list_1.length > 0) {
|
|
var current = list_1.shift();
|
|
if (current.type !== 'element')
|
|
continue;
|
|
if (current.elements)
|
|
current.elements.forEach(function (e) { return list_1.push(e); });
|
|
if (!current.attributes)
|
|
current.attributes = {};
|
|
current.name = explodeName(current.name, current.attributes, XMLElementBuilder.exportFindNamespace(this));
|
|
}
|
|
}
|
|
}
|
|
element.parent = this;
|
|
this.elements.push(element);
|
|
return element;
|
|
};
|
|
return XMLElementBuilder;
|
|
}());
|
|
exports.XMLElementBuilder = XMLElementBuilder;
|