Node::normalize

  1. void Node::normalize()
  2. {
  3. // Go through the subtree beneath us, normalizing all nodes. This means that
  4. // any two adjacent text nodes are merged and any empty text nodes are removed.
  5.  
  6. RefPtr<Node> node = this;
  7. while (Node* firstChild = node->firstChild())
  8. node = firstChild;
  9. while (node) {
  10. NodeType type = node->nodeType();
  11. if (type == ELEMENT_NODE)
  12. toElement(node.get())->normalizeAttributes();
  13.  
  14. if (node == this)
  15. break;
  16.  
  17. if (type != TEXT_NODE) {
  18. node = NodeTraversal::nextPostOrder(node.get());
  19. continue;
  20. }
  21.  
  22. RefPtr<Text> text = toText(node.get());
  23.  
  24. // Remove empty text nodes.
  25. if (!text->length()) {
  26. // Care must be taken to get the next node before removing the current node.
  27. node = NodeTraversal::nextPostOrder(node.get());
  28. text->remove(IGNORE_EXCEPTION);
  29. continue;
  30. }
  31.  
  32. // Merge text nodes.
  33. while (Node* nextSibling = node->nextSibling()) {
  34. if (nextSibling->nodeType() != TEXT_NODE)
  35. break;
  36. RefPtr<Text> nextText = toText(nextSibling);
  37.  
  38. // Remove empty text nodes.
  39. if (!nextText->length()) {
  40. nextText->remove(IGNORE_EXCEPTION);
  41. continue;
  42. }
  43.  
  44. // Both non-empty text nodes. Merge them.
  45. unsigned offset = text->length();
  46. text->appendData(nextText->data(), IGNORE_EXCEPTION);
  47. document()->textNodesMerged(nextText.get(), offset);
  48. nextText->remove(IGNORE_EXCEPTION);
  49. }
  50.  
  51. node = NodeTraversal::nextPostOrder(node.get());
  52. }
  53. }
  54.  
Programming language: 
C++