182 lines
5.4 KiB
JavaScript
182 lines
5.4 KiB
JavaScript
|
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
|