package org.lodder.subtools.sublibrary.xml;
/**
* Source: http://www.rgagnon.com/javadetails/java-0307.html
*/
import java.util.HashMap;
public class StringUtils {
private StringUtils() {}
private static HashMap<String, String> htmlEntities;
static {
htmlEntities = new HashMap<String, String>();
htmlEntities.put("<", "<");
htmlEntities.put(">", ">");
htmlEntities.put("&", "&");
htmlEntities.put(""", "\"");
htmlEntities.put("à", "à");
htmlEntities.put("À", "À");
htmlEntities.put("â", "â");
htmlEntities.put("ä", "ä");
htmlEntities.put("Ä", "Ä");
htmlEntities.put("Â", "Â");
htmlEntities.put("Ã", "Ã");
htmlEntities.put("ã", "ã");
htmlEntities.put("å", "å");
htmlEntities.put("Å", "Å");
htmlEntities.put("æ", "æ");
htmlEntities.put("Æ", "Æ");
htmlEntities.put("ç", "ç");
htmlEntities.put("Ç", "Ç");
htmlEntities.put("é", "é");
htmlEntities.put("É", "É");
htmlEntities.put("è", "è");
htmlEntities.put("È", "È");
htmlEntities.put("ê", "ê");
htmlEntities.put("Ê", "Ê");
htmlEntities.put("ë", "ë");
htmlEntities.put("Ë", "Ë");
htmlEntities.put("ï", "ï");
htmlEntities.put("Ï", "�?");
htmlEntities.put("ô", "ô");
htmlEntities.put("Ô", "Ô");
htmlEntities.put("ö", "ö");
htmlEntities.put("Ö", "Ö");
htmlEntities.put("ø", "ø");
htmlEntities.put("Ø", "Ø");
htmlEntities.put("ß", "ß");
htmlEntities.put("ù", "ù");
htmlEntities.put("Ù", "Ù");
htmlEntities.put("û", "û");
htmlEntities.put("Û", "Û");
htmlEntities.put("ü", "ü");
htmlEntities.put("Ü", "Ü");
htmlEntities.put(" ", " ");
htmlEntities.put("©", "\u00a9");
htmlEntities.put("®", "\u00ae");
htmlEntities.put("€", "\u20a0");
htmlEntities.put("¡", "¡");
}
/*
* Here the original recursive version. It is fine unless you pass a big string then a Stack
* Overflow is possible :-(
*
*
* public static final String unescapeHTML(String source, int start){ int i,j;
*
* i = source.indexOf("&", start); if (i > -1) { j = source.indexOf(";" ,i); if (j > i) { String
* entityToLookFor = source.substring(i , j + 1); String value =
* (String)htmlEntities.get(entityToLookFor); if (value != null) { source = new
* StringBuffer().append(source.substring(0 , i)) .append(value) .append(source.substring(j + 1))
* .toString(); return unescapeHTML(source, i + 1); // recursive call } } } return source; }
*
* M. McNeely Jr. has sent a version with do...while()loop which is more robust. Thanks to him!
*/
public static final String unescapeHTML(String source) {
int i, j;
boolean continueLoop;
int skip = 0;
do {
continueLoop = false;
i = source.indexOf("&", skip);
if (i > -1) {
j = source.indexOf(";", i);
if (j > i) {
String entityToLookFor = source.substring(i, j + 1);
String value = htmlEntities.get(entityToLookFor);
if (value != null) {
source = source.substring(0, i) + value + source.substring(j + 1);
continueLoop = true;
} else {
skip = i + 1;
continueLoop = true;
}
}
}
} while (continueLoop);
return source;
}
}