210 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var DOCUMENT_MODE = require('../common/html').DOCUMENT_MODE;
 | |
| 
 | |
| //Node construction
 | |
| exports.createDocument = function () {
 | |
|     return {
 | |
|         nodeName: '#document',
 | |
|         mode: DOCUMENT_MODE.NO_QUIRKS,
 | |
|         childNodes: []
 | |
|     };
 | |
| };
 | |
| 
 | |
| exports.createDocumentFragment = function () {
 | |
|     return {
 | |
|         nodeName: '#document-fragment',
 | |
|         childNodes: []
 | |
|     };
 | |
| };
 | |
| 
 | |
| exports.createElement = function (tagName, namespaceURI, attrs) {
 | |
|     return {
 | |
|         nodeName: tagName,
 | |
|         tagName: tagName,
 | |
|         attrs: attrs,
 | |
|         namespaceURI: namespaceURI,
 | |
|         childNodes: [],
 | |
|         parentNode: null
 | |
|     };
 | |
| };
 | |
| 
 | |
| exports.createCommentNode = function (data) {
 | |
|     return {
 | |
|         nodeName: '#comment',
 | |
|         data: data,
 | |
|         parentNode: null
 | |
|     };
 | |
| };
 | |
| 
 | |
| var createTextNode = function (value) {
 | |
|     return {
 | |
|         nodeName: '#text',
 | |
|         value: value,
 | |
|         parentNode: null
 | |
|     };
 | |
| };
 | |
| 
 | |
| 
 | |
| //Tree mutation
 | |
| var appendChild = exports.appendChild = function (parentNode, newNode) {
 | |
|     parentNode.childNodes.push(newNode);
 | |
|     newNode.parentNode = parentNode;
 | |
| };
 | |
| 
 | |
| var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) {
 | |
|     var insertionIdx = parentNode.childNodes.indexOf(referenceNode);
 | |
| 
 | |
|     parentNode.childNodes.splice(insertionIdx, 0, newNode);
 | |
|     newNode.parentNode = parentNode;
 | |
| };
 | |
| 
 | |
| exports.setTemplateContent = function (templateElement, contentElement) {
 | |
|     templateElement.content = contentElement;
 | |
| };
 | |
| 
 | |
| exports.getTemplateContent = function (templateElement) {
 | |
|     return templateElement.content;
 | |
| };
 | |
| 
 | |
| exports.setDocumentType = function (document, name, publicId, systemId) {
 | |
|     var doctypeNode = null;
 | |
| 
 | |
|     for (var i = 0; i < document.childNodes.length; i++) {
 | |
|         if (document.childNodes[i].nodeName === '#documentType') {
 | |
|             doctypeNode = document.childNodes[i];
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (doctypeNode) {
 | |
|         doctypeNode.name = name;
 | |
|         doctypeNode.publicId = publicId;
 | |
|         doctypeNode.systemId = systemId;
 | |
|     }
 | |
| 
 | |
|     else {
 | |
|         appendChild(document, {
 | |
|             nodeName: '#documentType',
 | |
|             name: name,
 | |
|             publicId: publicId,
 | |
|             systemId: systemId
 | |
|         });
 | |
|     }
 | |
| };
 | |
| 
 | |
| exports.setDocumentMode = function (document, mode) {
 | |
|     document.mode = mode;
 | |
| };
 | |
| 
 | |
| exports.getDocumentMode = function (document) {
 | |
|     return document.mode;
 | |
| };
 | |
| 
 | |
| exports.detachNode = function (node) {
 | |
|     if (node.parentNode) {
 | |
|         var idx = node.parentNode.childNodes.indexOf(node);
 | |
| 
 | |
|         node.parentNode.childNodes.splice(idx, 1);
 | |
|         node.parentNode = null;
 | |
|     }
 | |
| };
 | |
| 
 | |
| exports.insertText = function (parentNode, text) {
 | |
|     if (parentNode.childNodes.length) {
 | |
|         var prevNode = parentNode.childNodes[parentNode.childNodes.length - 1];
 | |
| 
 | |
|         if (prevNode.nodeName === '#text') {
 | |
|             prevNode.value += text;
 | |
|             return;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     appendChild(parentNode, createTextNode(text));
 | |
| };
 | |
| 
 | |
| exports.insertTextBefore = function (parentNode, text, referenceNode) {
 | |
|     var prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1];
 | |
| 
 | |
|     if (prevNode && prevNode.nodeName === '#text')
 | |
|         prevNode.value += text;
 | |
|     else
 | |
|         insertBefore(parentNode, createTextNode(text), referenceNode);
 | |
| };
 | |
| 
 | |
| exports.adoptAttributes = function (recipient, attrs) {
 | |
|     var recipientAttrsMap = [];
 | |
| 
 | |
|     for (var i = 0; i < recipient.attrs.length; i++)
 | |
|         recipientAttrsMap.push(recipient.attrs[i].name);
 | |
| 
 | |
|     for (var j = 0; j < attrs.length; j++) {
 | |
|         if (recipientAttrsMap.indexOf(attrs[j].name) === -1)
 | |
|             recipient.attrs.push(attrs[j]);
 | |
|     }
 | |
| };
 | |
| 
 | |
| 
 | |
| //Tree traversing
 | |
| exports.getFirstChild = function (node) {
 | |
|     return node.childNodes[0];
 | |
| };
 | |
| 
 | |
| exports.getChildNodes = function (node) {
 | |
|     return node.childNodes;
 | |
| };
 | |
| 
 | |
| exports.getParentNode = function (node) {
 | |
|     return node.parentNode;
 | |
| };
 | |
| 
 | |
| exports.getAttrList = function (element) {
 | |
|     return element.attrs;
 | |
| };
 | |
| 
 | |
| //Node data
 | |
| exports.getTagName = function (element) {
 | |
|     return element.tagName;
 | |
| };
 | |
| 
 | |
| exports.getNamespaceURI = function (element) {
 | |
|     return element.namespaceURI;
 | |
| };
 | |
| 
 | |
| exports.getTextNodeContent = function (textNode) {
 | |
|     return textNode.value;
 | |
| };
 | |
| 
 | |
| exports.getCommentNodeContent = function (commentNode) {
 | |
|     return commentNode.data;
 | |
| };
 | |
| 
 | |
| exports.getDocumentTypeNodeName = function (doctypeNode) {
 | |
|     return doctypeNode.name;
 | |
| };
 | |
| 
 | |
| exports.getDocumentTypeNodePublicId = function (doctypeNode) {
 | |
|     return doctypeNode.publicId;
 | |
| };
 | |
| 
 | |
| exports.getDocumentTypeNodeSystemId = function (doctypeNode) {
 | |
|     return doctypeNode.systemId;
 | |
| };
 | |
| 
 | |
| //Node types
 | |
| exports.isTextNode = function (node) {
 | |
|     return node.nodeName === '#text';
 | |
| };
 | |
| 
 | |
| exports.isCommentNode = function (node) {
 | |
|     return node.nodeName === '#comment';
 | |
| };
 | |
| 
 | |
| exports.isDocumentTypeNode = function (node) {
 | |
|     return node.nodeName === '#documentType';
 | |
| };
 | |
| 
 | |
| exports.isElementNode = function (node) {
 | |
|     return !!node.tagName;
 | |
| };
 |