import { DOCUMENT_MODE } from '../common/html.js'; export var NodeType; (function (NodeType) { NodeType["Document"] = "#document"; NodeType["DocumentFragment"] = "#document-fragment"; NodeType["Comment"] = "#comment"; NodeType["Text"] = "#text"; NodeType["DocumentType"] = "#documentType"; })(NodeType || (NodeType = {})); function createTextNode(value) { return { nodeName: NodeType.Text, value, parentNode: null, }; } export const defaultTreeAdapter = { //Node construction createDocument() { return { nodeName: NodeType.Document, mode: DOCUMENT_MODE.NO_QUIRKS, childNodes: [], }; }, createDocumentFragment() { return { nodeName: NodeType.DocumentFragment, childNodes: [], }; }, createElement(tagName, namespaceURI, attrs) { return { nodeName: tagName, tagName, attrs, namespaceURI, childNodes: [], parentNode: null, }; }, createCommentNode(data) { return { nodeName: NodeType.Comment, data, parentNode: null, }; }, //Tree mutation appendChild(parentNode, newNode) { parentNode.childNodes.push(newNode); newNode.parentNode = parentNode; }, insertBefore(parentNode, newNode, referenceNode) { const insertionIdx = parentNode.childNodes.indexOf(referenceNode); parentNode.childNodes.splice(insertionIdx, 0, newNode); newNode.parentNode = parentNode; }, setTemplateContent(templateElement, contentElement) { templateElement.content = contentElement; }, getTemplateContent(templateElement) { return templateElement.content; }, setDocumentType(document, name, publicId, systemId) { const doctypeNode = document.childNodes.find((node) => node.nodeName === NodeType.DocumentType); if (doctypeNode) { doctypeNode.name = name; doctypeNode.publicId = publicId; doctypeNode.systemId = systemId; } else { const node = { nodeName: NodeType.DocumentType, name, publicId, systemId, parentNode: null, }; defaultTreeAdapter.appendChild(document, node); } }, setDocumentMode(document, mode) { document.mode = mode; }, getDocumentMode(document) { return document.mode; }, detachNode(node) { if (node.parentNode) { const idx = node.parentNode.childNodes.indexOf(node); node.parentNode.childNodes.splice(idx, 1); node.parentNode = null; } }, insertText(parentNode, text) { if (parentNode.childNodes.length > 0) { const prevNode = parentNode.childNodes[parentNode.childNodes.length - 1]; if (defaultTreeAdapter.isTextNode(prevNode)) { prevNode.value += text; return; } } defaultTreeAdapter.appendChild(parentNode, createTextNode(text)); }, insertTextBefore(parentNode, text, referenceNode) { const prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1]; if (prevNode && defaultTreeAdapter.isTextNode(prevNode)) { prevNode.value += text; } else { defaultTreeAdapter.insertBefore(parentNode, createTextNode(text), referenceNode); } }, adoptAttributes(recipient, attrs) { const recipientAttrsMap = new Set(recipient.attrs.map((attr) => attr.name)); for (let j = 0; j < attrs.length; j++) { if (!recipientAttrsMap.has(attrs[j].name)) { recipient.attrs.push(attrs[j]); } } }, //Tree traversing getFirstChild(node) { return node.childNodes[0]; }, getChildNodes(node) { return node.childNodes; }, getParentNode(node) { return node.parentNode; }, getAttrList(element) { return element.attrs; }, //Node data getTagName(element) { return element.tagName; }, getNamespaceURI(element) { return element.namespaceURI; }, getTextNodeContent(textNode) { return textNode.value; }, getCommentNodeContent(commentNode) { return commentNode.data; }, getDocumentTypeNodeName(doctypeNode) { return doctypeNode.name; }, getDocumentTypeNodePublicId(doctypeNode) { return doctypeNode.publicId; }, getDocumentTypeNodeSystemId(doctypeNode) { return doctypeNode.systemId; }, //Node types isTextNode(node) { return node.nodeName === '#text'; }, isCommentNode(node) { return node.nodeName === '#comment'; }, isDocumentTypeNode(node) { return node.nodeName === NodeType.DocumentType; }, isElementNode(node) { return Object.prototype.hasOwnProperty.call(node, 'tagName'); }, // Source code location setNodeSourceCodeLocation(node, location) { node.sourceCodeLocation = location; }, getNodeSourceCodeLocation(node) { return node.sourceCodeLocation; }, updateNodeSourceCodeLocation(node, endLocation) { node.sourceCodeLocation = { ...node.sourceCodeLocation, ...endLocation }; }, }; //# sourceMappingURL=default.js.map