XML.prototype._toXMLString = function()

in asdoc/XML.js [2958:3094]


XML.prototype._toXMLString = function(indentLevel, ancestors) {
  indentLevel = typeof indentLevel !== 'undefined' ? indentLevel : 0;
  ancestors = typeof ancestors !== 'undefined' ? ancestors : null;
  var /** @type {number} */ i = 0;
  var /** @type {number} */ nextIndentLevel = 0;
  var /** @type {number} */ len = 0;
  //var /** @type {number} */ i = 0;
  //var /** @type {number} */ len = 0;
  var /** @type {Namespace} */ ns;
  var /** @type {Array} */ strArr = [];
  indentLevel = (isNaN(indentLevel) ? 0 : indentLevel) >> 0;
  var /** @type {Array} */ indentArr = [];
  for (i = 0; i < indentLevel; i++)
    indentArr.push(XML._indentStr);
  var /** @type {string} */ indent = indentArr.join("");
  
/**
 * @const
 * @type {string}
 */
var nodeType = this.getNodeRef();
  var /** @type {string} */ strValue = this.getValue();
  if (nodeType == XML.TEXT) {
    if (XML.prettyPrinting) {
      var /** @type {string} */ v = strValue.trim();
      if (v.indexOf('<![CDATA[') == 0) {
        return indent + v;
      }
      return indent + XML.escapeElementValue(v);
    }
    if (strValue.indexOf('<![CDATA[') == 0)
      return strValue;
    return XML.escapeElementValue(strValue);
  }
  if (nodeType == XML.ATTRIBUTE)
    return indent + XML.escapeAttributeValue(strValue);
  if (nodeType == XML.COMMENT)
    return indent + "<!--" + strValue + "-->";
  if (nodeType == XML.PROCESSING_INSTRUCTION)
    return indent + "<?" + this.name().localName + " " + strValue + "?>";
  var /** @type {Array} */ inScopeNS;
  if (!ancestors) {
    ancestors = [];
    inScopeNS = this.inScopeNamespaces();
  }
  else
    inScopeNS = this._namespaces ? this._namespaces : [];
  var /** @type {QName} */ myQName = this._name;
  var /** @type {Array} */ declarations;
  if (ancestors.length == 0) {
    declarations = inScopeNS;
  } else {
    declarations = [];
    len = (inScopeNS.length) >> 0;
    for (i = 0; i < len; i++) {
      if (!XML.namespaceInArray(inScopeNS[i], ancestors))
        declarations.push(new Namespace(inScopeNS[i]));
    }
  }
  len = this.attributeLength();
  for (i = 0; i < len; i++) {
    ns = new Namespace(this._attributes[i].name().getNamespace(declarations.concat(ancestors)));
    if (ns.prefix === null) {
      ns.setPrefix("");
      declarations.push(ns);
    }
  }
  ns = new Namespace(myQName.getNamespace(declarations.concat(ancestors)));
  if (ns.prefix === null) {
    ns.setPrefix("");
    declarations.push(ns);
  }
  if (XML.prettyPrinting && indentLevel > 0) {
    strArr.push(new Array(indentLevel + 1).join(XML._indentStr));
  }
  strArr.push("<");
  if (ns.prefix)
    strArr.push(ns.prefix + ":");
  strArr.push(myQName.localName);
  len = this.attributeLength();
  for (i = 0; i < len; i++) {
    strArr.push(" ");
    var /** @type {QName} */ aName = this._attributes[i].name();
    var /** @type {Namespace} */ ans = aName.getNamespace(declarations.concat(ancestors));
    if (ans.prefix) {
      strArr.push(ans.prefix);
      strArr.push(":");
    }
    strArr.push(aName.localName);
    strArr.push('="');
    strArr.push(XML.escapeAttributeValue(this._attributes[i].getValue()));
    strArr.push('"');
  }
  for (i = 0; i < declarations.length; i++) {
    var /** @type {string} */ decVal = XML.escapeAttributeValue(declarations[i].uri);
    if (decVal) {
      strArr.push(" xmlns");
      if (declarations[i].prefix) {
        strArr.push(":");
        strArr.push(declarations[i].prefix);
      }
      strArr.push('="');
      strArr.push(decVal);
      strArr.push('"');
    }
  }
  len = this.childrenLength();
  if (len == 0) {
    strArr.push("/>");
    return strArr.join("");
  }
  strArr.push(">");
  var /** @type {boolean} */ indentChildren = len > 1 || (len == 1 && this._children[0].getNodeRef() != XML.TEXT);
  //var /** @type {number} */ nextIndentLevel = 0;
  if (XML.prettyPrinting && indentChildren)
    nextIndentLevel = (indentLevel + 1) >> 0;
  else
    nextIndentLevel = 0;
  for (i = 0; i < len; i++) {
    if (XML.prettyPrinting && indentChildren)
      strArr.push("\n");
    strArr.push(this._children[i]._toXMLString(nextIndentLevel, ancestors.concat(declarations)));
  }
  if (XML.prettyPrinting && indentChildren) {
    strArr.push("\n");
    if (indentLevel > 0)
      strArr.push(new Array(indentLevel + 1).join(XML._indentStr));
  }
  strArr.push("</");
  if (ns.prefix) {
    strArr.push(ns.prefix);
    strArr.push(":");
  }
  strArr.push(myQName.localName);
  strArr.push(">");
  return strArr.join("");
};