123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- 'use strict';
- /*
- Copyright 2012-2015, Yahoo Inc.
- Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
- */
- const INDENT = ' ';
- function attrString(attrs) {
- return Object.entries(attrs || {})
- .map(([k, v]) => ` ${k}="${v}"`)
- .join('');
- }
- /**
- * a utility class to produce well-formed, indented XML
- * @param {ContentWriter} contentWriter the content writer that this utility wraps
- * @constructor
- */
- class XMLWriter {
- constructor(contentWriter) {
- this.cw = contentWriter;
- this.stack = [];
- }
- indent(str) {
- return this.stack.map(() => INDENT).join('') + str;
- }
- /**
- * writes the opening XML tag with the supplied attributes
- * @param {String} name tag name
- * @param {Object} [attrs=null] attrs attributes for the tag
- */
- openTag(name, attrs) {
- const str = this.indent(`<${name + attrString(attrs)}>`);
- this.cw.println(str);
- this.stack.push(name);
- }
- /**
- * closes an open XML tag.
- * @param {String} name - tag name to close. This must match the writer's
- * notion of the tag that is currently open.
- */
- closeTag(name) {
- if (this.stack.length === 0) {
- throw new Error(`Attempt to close tag ${name} when not opened`);
- }
- const stashed = this.stack.pop();
- const str = `</${name}>`;
- if (stashed !== name) {
- throw new Error(
- `Attempt to close tag ${name} when ${stashed} was the one open`
- );
- }
- this.cw.println(this.indent(str));
- }
- /**
- * writes a tag and its value opening and closing it at the same time
- * @param {String} name tag name
- * @param {Object} [attrs=null] attrs tag attributes
- * @param {String} [content=null] content optional tag content
- */
- inlineTag(name, attrs, content) {
- let str = '<' + name + attrString(attrs);
- if (content) {
- str += `>${content}</${name}>`;
- } else {
- str += '/>';
- }
- str = this.indent(str);
- this.cw.println(str);
- }
- /**
- * closes all open tags and ends the document
- */
- closeAll() {
- this.stack
- .slice()
- .reverse()
- .forEach(name => {
- this.closeTag(name);
- });
- }
- }
- module.exports = XMLWriter;
|