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