aboutsummaryrefslogtreecommitdiff
path: root/node_modules/istanbul-lib-report/lib/xml-writer.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/istanbul-lib-report/lib/xml-writer.js')
-rw-r--r--node_modules/istanbul-lib-report/lib/xml-writer.js87
1 files changed, 87 insertions, 0 deletions
diff --git a/node_modules/istanbul-lib-report/lib/xml-writer.js b/node_modules/istanbul-lib-report/lib/xml-writer.js
new file mode 100644
index 000000000..7f372fb3c
--- /dev/null
+++ b/node_modules/istanbul-lib-report/lib/xml-writer.js
@@ -0,0 +1,87 @@
+/*
+ Copyright 2012-2015, Yahoo Inc.
+ Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
+ */
+var INDENT = ' ';
+
+/**
+ * a utility class to produce well-formed, indented XML
+ * @param {ContentWriter} contentWriter the content writer that this utility wraps
+ * @constructor
+ */
+function XMLWriter(contentWriter) {
+ this.cw = contentWriter;
+ this.stack = [];
+}
+
+function attrString(attrs) {
+ if (!attrs) {
+ return '';
+ }
+ var ret = [];
+ Object.keys(attrs).forEach(function (k) {
+ var v = attrs[k];
+ ret.push(k + '="' + v + '"');
+ });
+ return ret.length === 0 ? '' : ' ' + ret.join(' ');
+}
+
+XMLWriter.prototype.indent = function (str) {
+ return this.stack.map(function () { return 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
+ */
+XMLWriter.prototype.openTag = function (name, attrs) {
+ var 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.
+ */
+XMLWriter.prototype.closeTag = function (name) {
+ if (this.stack.length === 0) {
+ throw new Error('Attempt to close tag ' + name + ' when not opened');
+ }
+ var stashed = this.stack.pop(),
+ 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
+ */
+XMLWriter.prototype.inlineTag = function (name, attrs, content) {
+ var 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
+ */
+XMLWriter.prototype.closeAll = function () {
+ var that = this;
+ this.stack.slice().reverse().forEach(function (name) {
+ that.closeTag(name);
+ });
+};
+
+module.exports = XMLWriter;