blob: 47613fe75ade35b603745b7b4e42f80d99395c1e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2012 Tasktop Technologies.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* David Green - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.wikitext.internal.parser.html;
import java.util.List;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
/**
* @author David Green
*/
class RemoveEmptySpansProcessor extends DocumentProcessor {
@Override
public void process(Document document) {
Element body = document.body();
boolean modifiedOne = false;
do {
modifiedOne = false;
// remove empty spans, and eliminate tags that only contain whitespace
for (Element element : body.getAllElements()) {
if (Html.isSpanElement(element)) {
// remove span with no children
List<Node> childNodes = element.childNodes();
if (childNodes.isEmpty()) {
element.remove();
modifiedOne = true;
} else {
// a span with a single text child that is only whitespace is removed (text is retained)
if (childNodes.size() == 1) {
Node node = childNodes.get(0);
if (node instanceof TextNode) {
TextNode textNode = (TextNode) node;
String text = textNode.text();
if (text.trim().length() == 0) {
textNode.remove();
element.before(textNode);
element.remove();
modifiedOne = true;
}
normalizeTextNodes((Element) textNode.parent());
}
}
}
}
// a br within a span that is a first or last child is moved out
Element parent = element.parent();
if (element.tagName().equalsIgnoreCase("br") && Html.isSpanElement(parent)) { //$NON-NLS-1$
List<Node> childNodes = parent.childNodes();
if (childNodes.get(0) == element) {
element.remove();
parent.before(element);
modifiedOne = true;
} else if (childNodes.get(childNodes.size() - 1) == element) {
element.remove();
parent.after(element);
modifiedOne = true;
}
}
}
} while (modifiedOne);
}
}