default.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. 'use strict';
  2. var DOCUMENT_MODE = require('../common/html').DOCUMENT_MODE;
  3. //Node construction
  4. exports.createDocument = function () {
  5. return {
  6. nodeName: '#document',
  7. mode: DOCUMENT_MODE.NO_QUIRKS,
  8. childNodes: []
  9. };
  10. };
  11. exports.createDocumentFragment = function () {
  12. return {
  13. nodeName: '#document-fragment',
  14. childNodes: []
  15. };
  16. };
  17. exports.createElement = function (tagName, namespaceURI, attrs) {
  18. return {
  19. nodeName: tagName,
  20. tagName: tagName,
  21. attrs: attrs,
  22. namespaceURI: namespaceURI,
  23. childNodes: [],
  24. parentNode: null
  25. };
  26. };
  27. exports.createCommentNode = function (data) {
  28. return {
  29. nodeName: '#comment',
  30. data: data,
  31. parentNode: null
  32. };
  33. };
  34. var createTextNode = function (value) {
  35. return {
  36. nodeName: '#text',
  37. value: value,
  38. parentNode: null
  39. };
  40. };
  41. //Tree mutation
  42. var appendChild = exports.appendChild = function (parentNode, newNode) {
  43. parentNode.childNodes.push(newNode);
  44. newNode.parentNode = parentNode;
  45. };
  46. var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) {
  47. var insertionIdx = parentNode.childNodes.indexOf(referenceNode);
  48. parentNode.childNodes.splice(insertionIdx, 0, newNode);
  49. newNode.parentNode = parentNode;
  50. };
  51. exports.setTemplateContent = function (templateElement, contentElement) {
  52. templateElement.content = contentElement;
  53. };
  54. exports.getTemplateContent = function (templateElement) {
  55. return templateElement.content;
  56. };
  57. exports.setDocumentType = function (document, name, publicId, systemId) {
  58. var doctypeNode = null;
  59. for (var i = 0; i < document.childNodes.length; i++) {
  60. if (document.childNodes[i].nodeName === '#documentType') {
  61. doctypeNode = document.childNodes[i];
  62. break;
  63. }
  64. }
  65. if (doctypeNode) {
  66. doctypeNode.name = name;
  67. doctypeNode.publicId = publicId;
  68. doctypeNode.systemId = systemId;
  69. }
  70. else {
  71. appendChild(document, {
  72. nodeName: '#documentType',
  73. name: name,
  74. publicId: publicId,
  75. systemId: systemId
  76. });
  77. }
  78. };
  79. exports.setDocumentMode = function (document, mode) {
  80. document.mode = mode;
  81. };
  82. exports.getDocumentMode = function (document) {
  83. return document.mode;
  84. };
  85. exports.detachNode = function (node) {
  86. if (node.parentNode) {
  87. var idx = node.parentNode.childNodes.indexOf(node);
  88. node.parentNode.childNodes.splice(idx, 1);
  89. node.parentNode = null;
  90. }
  91. };
  92. exports.insertText = function (parentNode, text) {
  93. if (parentNode.childNodes.length) {
  94. var prevNode = parentNode.childNodes[parentNode.childNodes.length - 1];
  95. if (prevNode.nodeName === '#text') {
  96. prevNode.value += text;
  97. return;
  98. }
  99. }
  100. appendChild(parentNode, createTextNode(text));
  101. };
  102. exports.insertTextBefore = function (parentNode, text, referenceNode) {
  103. var prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1];
  104. if (prevNode && prevNode.nodeName === '#text')
  105. prevNode.value += text;
  106. else
  107. insertBefore(parentNode, createTextNode(text), referenceNode);
  108. };
  109. exports.adoptAttributes = function (recipient, attrs) {
  110. var recipientAttrsMap = [];
  111. for (var i = 0; i < recipient.attrs.length; i++)
  112. recipientAttrsMap.push(recipient.attrs[i].name);
  113. for (var j = 0; j < attrs.length; j++) {
  114. if (recipientAttrsMap.indexOf(attrs[j].name) === -1)
  115. recipient.attrs.push(attrs[j]);
  116. }
  117. };
  118. //Tree traversing
  119. exports.getFirstChild = function (node) {
  120. return node.childNodes[0];
  121. };
  122. exports.getChildNodes = function (node) {
  123. return node.childNodes;
  124. };
  125. exports.getParentNode = function (node) {
  126. return node.parentNode;
  127. };
  128. exports.getAttrList = function (element) {
  129. return element.attrs;
  130. };
  131. //Node data
  132. exports.getTagName = function (element) {
  133. return element.tagName;
  134. };
  135. exports.getNamespaceURI = function (element) {
  136. return element.namespaceURI;
  137. };
  138. exports.getTextNodeContent = function (textNode) {
  139. return textNode.value;
  140. };
  141. exports.getCommentNodeContent = function (commentNode) {
  142. return commentNode.data;
  143. };
  144. exports.getDocumentTypeNodeName = function (doctypeNode) {
  145. return doctypeNode.name;
  146. };
  147. exports.getDocumentTypeNodePublicId = function (doctypeNode) {
  148. return doctypeNode.publicId;
  149. };
  150. exports.getDocumentTypeNodeSystemId = function (doctypeNode) {
  151. return doctypeNode.systemId;
  152. };
  153. //Node types
  154. exports.isTextNode = function (node) {
  155. return node.nodeName === '#text';
  156. };
  157. exports.isCommentNode = function (node) {
  158. return node.nodeName === '#comment';
  159. };
  160. exports.isDocumentTypeNode = function (node) {
  161. return node.nodeName === '#documentType';
  162. };
  163. exports.isElementNode = function (node) {
  164. return !!node.tagName;
  165. };