blob: 87ae91d7d2a456fb2251a51a2a41f1d1b4fc55e0 [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
* Billy Huang - Bug 396332
*******************************************************************************/
package org.eclipse.mylyn.wikitext.internal.parser.html;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.mylyn.wikitext.parser.css.CssParser;
import org.eclipse.mylyn.wikitext.parser.css.CssRule;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Selector;
/**
* Repairs missing "#"-prefix in CSS color styles using hex color values
*
* @author Billy Huang
*/
public class RepairBrokenCSSColorStylesProcessor extends DocumentProcessor {
@Override
public void process(Document document) {
Element body = document.body();
CssParser cssParser = new CssParser();
for (Element element : Selector.select("[style]", body)) { //$NON-NLS-1$
String style = element.attr("style"); //$NON-NLS-1$
String newStyle = ""; //$NON-NLS-1$
List<CssRule> rules = null;
CssRule newRule = null;
if (style != null && style.length() > 0) {
rules = cssParser.parseBlockContent(style);
Iterator<CssRule> ruleIt = rules.iterator();
while (ruleIt.hasNext()) {
CssRule rule = ruleIt.next();
if ("color".equals(rule.name)) { //$NON-NLS-1$
String color = rule.value;
// no 3- or 6-character CSS color names are written in hex characters
Matcher invalidHexColorMatcher = Pattern.compile(
"^\\s*([0-9a-fA-F]{6}|[0-9a-fA-F]{3})(?:\\s+(.+))?\\s*$") //$NON-NLS-1$
.matcher(color);
if (invalidHexColorMatcher.matches()) {
String newColor = "#" + invalidHexColorMatcher.group(1); //$NON-NLS-1$
String additionalDeclarations = invalidHexColorMatcher.group(2);
if (additionalDeclarations != null) {
newColor += " " + additionalDeclarations; //$NON-NLS-1$
}
ruleIt.remove();
newRule = new CssRule("color", newColor.trim(), 0, 0, 0, 0); //$NON-NLS-1$
}
}
}
}
if (rules != null && newRule != null) {
newStyle = addRuleToStyle(newStyle, newRule);
for (CssRule rule : rules) {
newStyle = addRuleToStyle(newStyle, rule);
}
element.attr("style", newStyle); //$NON-NLS-1$
}
}
}
private String addRuleToStyle(String style, CssRule rule) {
return style += rule.name + ": " + rule.value + ";"; //$NON-NLS-1$ //$NON-NLS-2$
}
}