89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { escapeAttribute } from "./escape-attribute";
 | 
						|
import { XmlText } from "./XmlText";
 | 
						|
export class XmlNode {
 | 
						|
    name;
 | 
						|
    children;
 | 
						|
    attributes = {};
 | 
						|
    static of(name, childText, withName) {
 | 
						|
        const node = new XmlNode(name);
 | 
						|
        if (childText !== undefined) {
 | 
						|
            node.addChildNode(new XmlText(childText));
 | 
						|
        }
 | 
						|
        if (withName !== undefined) {
 | 
						|
            node.withName(withName);
 | 
						|
        }
 | 
						|
        return node;
 | 
						|
    }
 | 
						|
    constructor(name, children = []) {
 | 
						|
        this.name = name;
 | 
						|
        this.children = children;
 | 
						|
    }
 | 
						|
    withName(name) {
 | 
						|
        this.name = name;
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    addAttribute(name, value) {
 | 
						|
        this.attributes[name] = value;
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    addChildNode(child) {
 | 
						|
        this.children.push(child);
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    removeAttribute(name) {
 | 
						|
        delete this.attributes[name];
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    n(name) {
 | 
						|
        this.name = name;
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    c(child) {
 | 
						|
        this.children.push(child);
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    a(name, value) {
 | 
						|
        if (value != null) {
 | 
						|
            this.attributes[name] = value;
 | 
						|
        }
 | 
						|
        return this;
 | 
						|
    }
 | 
						|
    cc(input, field, withName = field) {
 | 
						|
        if (input[field] != null) {
 | 
						|
            const node = XmlNode.of(field, input[field]).withName(withName);
 | 
						|
            this.c(node);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    l(input, listName, memberName, valueProvider) {
 | 
						|
        if (input[listName] != null) {
 | 
						|
            const nodes = valueProvider();
 | 
						|
            nodes.map((node) => {
 | 
						|
                node.withName(memberName);
 | 
						|
                this.c(node);
 | 
						|
            });
 | 
						|
        }
 | 
						|
    }
 | 
						|
    lc(input, listName, memberName, valueProvider) {
 | 
						|
        if (input[listName] != null) {
 | 
						|
            const nodes = valueProvider();
 | 
						|
            const containerNode = new XmlNode(memberName);
 | 
						|
            nodes.map((node) => {
 | 
						|
                containerNode.c(node);
 | 
						|
            });
 | 
						|
            this.c(containerNode);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    toString() {
 | 
						|
        const hasChildren = Boolean(this.children.length);
 | 
						|
        let xmlText = `<${this.name}`;
 | 
						|
        const attributes = this.attributes;
 | 
						|
        for (const attributeName of Object.keys(attributes)) {
 | 
						|
            const attribute = attributes[attributeName];
 | 
						|
            if (attribute != null) {
 | 
						|
                xmlText += ` ${attributeName}="${escapeAttribute("" + attribute)}"`;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return (xmlText += !hasChildren ? "/>" : `>${this.children.map((c) => c.toString()).join("")}</${this.name}>`);
 | 
						|
    }
 | 
						|
}
 |