193fb6ee3Sopenharmony_ciimport { html, type TreeAdapter, type TreeAdapterTypeMap, type Token } from 'parse5';
293fb6ee3Sopenharmony_ci
393fb6ee3Sopenharmony_cifunction getSerializedTreeIndent(indent: number): string {
493fb6ee3Sopenharmony_ci    return '|'.padEnd(indent + 2, ' ');
593fb6ee3Sopenharmony_ci}
693fb6ee3Sopenharmony_ci
793fb6ee3Sopenharmony_cifunction getElementSerializedNamespaceURI<T extends TreeAdapterTypeMap>(
893fb6ee3Sopenharmony_ci    element: T['element'],
993fb6ee3Sopenharmony_ci    treeAdapter: TreeAdapter<T>
1093fb6ee3Sopenharmony_ci): string {
1193fb6ee3Sopenharmony_ci    switch (treeAdapter.getNamespaceURI(element)) {
1293fb6ee3Sopenharmony_ci        case html.NS.SVG: {
1393fb6ee3Sopenharmony_ci            return 'svg ';
1493fb6ee3Sopenharmony_ci        }
1593fb6ee3Sopenharmony_ci        case html.NS.MATHML: {
1693fb6ee3Sopenharmony_ci            return 'math ';
1793fb6ee3Sopenharmony_ci        }
1893fb6ee3Sopenharmony_ci        default: {
1993fb6ee3Sopenharmony_ci            return '';
2093fb6ee3Sopenharmony_ci        }
2193fb6ee3Sopenharmony_ci    }
2293fb6ee3Sopenharmony_ci}
2393fb6ee3Sopenharmony_ci
2493fb6ee3Sopenharmony_cifunction serializeNodeList<T extends TreeAdapterTypeMap>(
2593fb6ee3Sopenharmony_ci    nodes: T['node'][],
2693fb6ee3Sopenharmony_ci    indent: number,
2793fb6ee3Sopenharmony_ci    treeAdapter: TreeAdapter<T>
2893fb6ee3Sopenharmony_ci): string {
2993fb6ee3Sopenharmony_ci    let str = '';
3093fb6ee3Sopenharmony_ci
3193fb6ee3Sopenharmony_ci    for (let node of nodes) {
3293fb6ee3Sopenharmony_ci        str += getSerializedTreeIndent(indent);
3393fb6ee3Sopenharmony_ci
3493fb6ee3Sopenharmony_ci        if (treeAdapter.isCommentNode(node)) {
3593fb6ee3Sopenharmony_ci            str += `<!-- ${treeAdapter.getCommentNodeContent(node)} -->\n`;
3693fb6ee3Sopenharmony_ci        } else if (treeAdapter.isTextNode(node)) {
3793fb6ee3Sopenharmony_ci            str += `"${treeAdapter.getTextNodeContent(node)}"\n`;
3893fb6ee3Sopenharmony_ci        } else if (treeAdapter.isDocumentTypeNode(node)) {
3993fb6ee3Sopenharmony_ci            const publicId = treeAdapter.getDocumentTypeNodePublicId(node);
4093fb6ee3Sopenharmony_ci            const systemId = treeAdapter.getDocumentTypeNodeSystemId(node);
4193fb6ee3Sopenharmony_ci
4293fb6ee3Sopenharmony_ci            str += `<!DOCTYPE ${treeAdapter.getDocumentTypeNodeName(node) || ''}`;
4393fb6ee3Sopenharmony_ci
4493fb6ee3Sopenharmony_ci            if (publicId || systemId) {
4593fb6ee3Sopenharmony_ci                str += ` "${publicId}" "${systemId}"`;
4693fb6ee3Sopenharmony_ci            }
4793fb6ee3Sopenharmony_ci
4893fb6ee3Sopenharmony_ci            str += '>\n';
4993fb6ee3Sopenharmony_ci        } else {
5093fb6ee3Sopenharmony_ci            const tn = treeAdapter.getTagName(node);
5193fb6ee3Sopenharmony_ci
5293fb6ee3Sopenharmony_ci            str += `<${getElementSerializedNamespaceURI(node, treeAdapter) + tn}>\n`;
5393fb6ee3Sopenharmony_ci
5493fb6ee3Sopenharmony_ci            let childrenIndent = indent + 2;
5593fb6ee3Sopenharmony_ci            const serializedAttrs = treeAdapter.getAttrList(node).map((attr: Token.Attribute) => {
5693fb6ee3Sopenharmony_ci                let attrStr = getSerializedTreeIndent(childrenIndent);
5793fb6ee3Sopenharmony_ci
5893fb6ee3Sopenharmony_ci                if (attr.prefix) {
5993fb6ee3Sopenharmony_ci                    attrStr += `${attr.prefix} `;
6093fb6ee3Sopenharmony_ci                }
6193fb6ee3Sopenharmony_ci
6293fb6ee3Sopenharmony_ci                attrStr += `${attr.name}="${attr.value}"\n`;
6393fb6ee3Sopenharmony_ci
6493fb6ee3Sopenharmony_ci                return attrStr;
6593fb6ee3Sopenharmony_ci            });
6693fb6ee3Sopenharmony_ci
6793fb6ee3Sopenharmony_ci            str += serializedAttrs.sort().join('');
6893fb6ee3Sopenharmony_ci
6993fb6ee3Sopenharmony_ci            if (tn === html.TAG_NAMES.TEMPLATE && treeAdapter.getNamespaceURI(node) === html.NS.HTML) {
7093fb6ee3Sopenharmony_ci                str += `${getSerializedTreeIndent(childrenIndent)}content\n`;
7193fb6ee3Sopenharmony_ci                childrenIndent += 2;
7293fb6ee3Sopenharmony_ci                node = treeAdapter.getTemplateContent(node);
7393fb6ee3Sopenharmony_ci            }
7493fb6ee3Sopenharmony_ci
7593fb6ee3Sopenharmony_ci            str += serializeNodeList(treeAdapter.getChildNodes(node), childrenIndent, treeAdapter);
7693fb6ee3Sopenharmony_ci        }
7793fb6ee3Sopenharmony_ci    }
7893fb6ee3Sopenharmony_ci
7993fb6ee3Sopenharmony_ci    return str;
8093fb6ee3Sopenharmony_ci}
8193fb6ee3Sopenharmony_ci
8293fb6ee3Sopenharmony_ciexport function serializeToDatFileFormat<T extends TreeAdapterTypeMap>(
8393fb6ee3Sopenharmony_ci    rootNode: T['parentNode'],
8493fb6ee3Sopenharmony_ci    treeAdapter: TreeAdapter<T>
8593fb6ee3Sopenharmony_ci): string {
8693fb6ee3Sopenharmony_ci    return serializeNodeList(treeAdapter.getChildNodes(rootNode), 0, treeAdapter);
8793fb6ee3Sopenharmony_ci}
88