1package org.jsoup.nodes;
2
3import org.jsoup.helper.Validate;
4import org.jsoup.parser.Tag;
5import org.jsoup.select.Elements;
6
7import java.nio.charset.Charset;
8import java.nio.charset.CharsetEncoder;
9import java.util.ArrayList;
10import java.util.List;
11
…lines 12–107 unchanged (96 lines)
108 // pull text nodes out of root, html, and head els, and push into body. non-text nodes are already taken care
109 // of. do in inverse order to maintain text order.
110 normaliseTextNodes(head());
111 normaliseTextNodes(htmlEl);
112 normaliseTextNodes(this);
113
114 normaliseStructure("head", htmlEl);
115 normaliseStructure("body", htmlEl);
116
117 return this;
118 }
119
120 // does not recurse.
121 private void normaliseTextNodes(Element element) {
…lines 122–133 unchanged (12 lines)
134 body().prependChild(new TextNode(" ", ""));
135 body().prependChild(node);
136 }
137 }
138
139 // merge multiple <head> or <body> contents into one, delete the remainder, and ensure they are owned by <html>
140 private void normaliseStructure(String tag, Element htmlEl) {
141 Elements elements = this.getElementsByTag(tag);
142 Element master = elements.first(); // will always be available as created above if not existent
143 if (elements.size() > 1) { // dupes, move contents to master
144 List<Node> toMove = new ArrayList<Node>();
145 for (int i = 1; i < elements.size(); i++) {
146 Node dupe = elements.get(i);
147 for (Node node : dupe.childNodes)
148 toMove.add(node);
149 dupe.remove();
150 }
151
152 for (Node dupe : toMove)
153 master.appendChild(dupe);
154 }
155 // ensure parented by <html>
156 if (!master.parent().equals(htmlEl)) {
157 htmlEl.appendChild(master); // includes remove()
158 }
159 }
160
161 // fast method to get first by tag name, used for html, head, body finders
162 private Element findFirstElementByTagName(String tag, Node node) {
163 if (node.nodeName().equals(tag))
164 return (Element) node;
165 else {
…lines 166–316 unchanged (151 lines)