2025-10-01 19:55:38 +02:00

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;