const HTML = require('../../packages/parse5/lib/common/html');
function getSerializedTreeIndent(indent) {
let str = '|';
for (let i = 0; i < indent + 1; i++) {
str += ' ';
}
return str;
}
function getElementSerializedNamespaceURI(element, treeAdapter) {
switch (treeAdapter.getNamespaceURI(element)) {
case HTML.NAMESPACES.SVG:
return 'svg ';
case HTML.NAMESPACES.MATHML:
return 'math ';
default:
return '';
}
}
function serializeNodeList(nodes, indent, treeAdapter) {
let str = '';
nodes.forEach(node => {
str += getSerializedTreeIndent(indent);
if (treeAdapter.isCommentNode(node)) {
str += `\n`;
} else if (treeAdapter.isTextNode(node)) {
str += `"${treeAdapter.getTextNodeContent(node)}"\n`;
} else if (treeAdapter.isDocumentTypeNode(node)) {
const publicId = treeAdapter.getDocumentTypeNodePublicId(node);
const systemId = treeAdapter.getDocumentTypeNodeSystemId(node);
str += `\n';
} else {
const tn = treeAdapter.getTagName(node);
str += `<${getElementSerializedNamespaceURI(node, treeAdapter) + tn}>\n`;
let childrenIndent = indent + 2;
const serializedAttrs = [];
treeAdapter.getAttrList(node).forEach(attr => {
let attrStr = getSerializedTreeIndent(childrenIndent);
if (attr.prefix) {
attrStr += `${attr.prefix} `;
}
attrStr += `${attr.name}="${attr.value}"\n`;
serializedAttrs.push(attrStr);
});
str += serializedAttrs.sort().join('');
if (tn === HTML.TAG_NAMES.TEMPLATE && treeAdapter.getNamespaceURI(node) === HTML.NAMESPACES.HTML) {
str += `${getSerializedTreeIndent(childrenIndent)}content\n`;
childrenIndent += 2;
node = treeAdapter.getTemplateContent(node);
}
str += serializeNodeList(treeAdapter.getChildNodes(node), childrenIndent, treeAdapter);
}
});
return str;
}
module.exports = function serializeToDatFileFormat(rootNode, treeAdapter) {
return serializeNodeList(treeAdapter.getChildNodes(rootNode), 0, treeAdapter);
};