docs: function stringify(node, type, prettifier) {
    var str = "";
    type = type || getType(node);
  
    if (type == 1) {
      str += _elemToString(node);
    } else if (type == 9 || type == 11) {
      str = node[reservedChildrenKey].map(c => stringify(c)).join("");
    } else if (type == 2) {
      str += "<l3:a name=\"" + node.$key + "\">" + stringify(node.$value) + "</l3:a>";
    } else if (type == 5) {
      const val = node.map(c => stringify(c)).join("");
      str += "<l3:l" + (val ? ">" + val + "</l3:l>" : "/>");
    } else if (type == 6) {
      const val = Object.entries(node).reduce(function (a, c) {
        return a + stringify({
          $key: c[0],
          $value: stringify(c[1])
        });
      }, "");
      str += "<l3:m" + (val ? ">" + val + "</l3:m>" : "/>");
    } else if (type == 14 || type == 15) {
      const val = node[reservedArgsKey].reduce((a, c) => a + stringify(c), "");
  
      if (type == 14) {
        str += "<l3:f name=\"" + node[reservedNameKey] + "\"" + (val ? ">" + val + "</l3:f>" : "/>");
      } else {
        str += "<l3:q" + (val ? ">" + val + "</l3:q>" : "/>");
      }
    } else {
      if (type == 7) {
        str += "<?" + node[reservedValueKeys[7]] + "?>";
      } else if (type == 8) {
        str += "<!--" + node[reservedValueKeys[8]] + "-->";
      } else if (type == 10) {
        str += "<!DOCTYPE " + node[reservedValueKeys[10]] + ">";
      } else {
        const val = node === null ? "null" : node;
        str += type == 12 ? "<l3:x>" + val + "</l3:x>" : val;
      }
    }
  
    return prettifier ? prettifier(str) : str;
  }