/**
* Este arquivo é parte do Biblivre3.
*
* Biblivre3 é um software livre; você pode redistribuí-lo e/ou
* modificá-lo dentro dos termos da Licença Pública Geral GNU como
* publicada pela Fundação do Software Livre (FSF); na versão 3 da
* Licença, ou (caso queira) qualquer versão posterior.
*
* Este programa é distribuído na esperança de que possa ser útil,
* mas SEM NENHUMA GARANTIA; nem mesmo a garantia implícita de
* MERCANTIBILIDADE OU ADEQUAÇÃO PARA UM FIM PARTICULAR. Veja a
* Licença Pública Geral GNU para maiores detalhes.
*
* Você deve ter recebido uma cópia da Licença Pública Geral GNU junto
* com este programa, Se não, veja em <http://www.gnu.org/licenses/>.
*
* @author Alberto Wagner <alberto@biblivre.org.br>
* @author Danniel Willian <danniel@biblivre.org.br>
*
*/
package biblivre3.utils;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.regex.Pattern;
/**
* Classe que contém métodos utilitários para limpar
* o registro de elementos HTML que sejam diacríticos,
* combinando letras para o código UTF-8 referente.
*
* A Classe se baseia na seguinte tabela para realizar
* a conversão:
*
* 192 (À) "À"
* 193 (Á) "Á"
* 194 (Â) "Â"
* 195 (Ã) "Ã"
* 196 (Ä) "Ä"
* 197 (Å) "Å"
* 199 (Ç) "C¸"
* 200 (È) "È"
* 201 (É) "É"
* 202 (Ê) "Ê"
* 203 (Ë) "Ë"
* 204 (Ì) "Ì"
* 205 (Í) "Í"
* 206 (Î) "Î"
* 207 (Ï) "Ï"
* 209 (Ñ) "Ñ"
* 210 (Ò) "Ò"
* 211 (Ó) "Ó"
* 212 (Ô) "Ô"
* 213 (Õ) "Õ"
* 214 (Ö) "Ö"
* 217 (Ù) "Ù"
* 218 (Ú) "Ú"
* 219 (Û) "Û"
* 220 (Ü) "Ü"
* 221 (Ý) "Ý"
* 224 (à) "à"
* 225 (á) "á"
* 226 (â) "â"
* 227 (ã) "ã"
* 228 (ä) "ä"
* 229 (å) "å"
* 231 (ç) "c¸"
* 232 (è) "è"
* 233 (é) "é"
* 234 (ê) "ê"
* 235 (ë) "ë"
* 236 (ì) "ì"
* 237 (í) "í"
* 238 (î) "î"
* 239 (ï) "ï"
* 241 (ñ) "ñ"
* 242 (ò) "ò"
* 243 (ó) "ó"
* 244 (ô) "ô"
* 245 (õ) "õ"
* 246 (ö) "ö"
* 249 (ù) "ù"
* 250 (ú) "ú"
* 251 (û) "û"
* 252 (ü) "ü"
* 253 (ý) "ý"
* 255 (ÿ) "ÿ"
*
* @author Danniel Nascimento
* @version 1.0
* @since 26/08/2008
*/
public class HtmlEntityEscaper {
private static final Pattern HTML_ENTITY_PATTERN = Pattern.compile("\\d*;");
private static final TreeMap<String, Integer> entityMap;
static {
entityMap = new TreeMap<String, Integer>();
entityMap.put("A&(amp;)?#768;", 192);
entityMap.put("A&(amp;)?#769;", 193);
entityMap.put("A&(amp;)?#770;", 194);
entityMap.put("A&(amp;)?#771;", 195);
entityMap.put("A&(amp;)?#776;", 196);
entityMap.put("A&(amp;)?#778;", 197);
entityMap.put("C&(amp;)?#184;", 199);
entityMap.put("C&(amp;)?#807;", 199);
entityMap.put("E&(amp;)?#768;", 200);
entityMap.put("E&(amp;)?#769;", 201);
entityMap.put("E&(amp;)?#770;", 202);
entityMap.put("E&(amp;)?#776;", 203);
entityMap.put("I&(amp;)?#768;", 204);
entityMap.put("I&(amp;)?#769;", 205);
entityMap.put("I&(amp;)?#770;", 206);
entityMap.put("I&(amp;)?#776;", 207);
entityMap.put("N&(amp;)?#771;", 209);
entityMap.put("O&(amp;)?#768;", 210);
entityMap.put("O&(amp;)?#769;", 211);
entityMap.put("O&(amp;)?#770;", 212);
entityMap.put("O&(amp;)?#771;", 213);
entityMap.put("O&(amp;)?#776;", 214);
entityMap.put("U&(amp;)?#768;", 217);
entityMap.put("U&(amp;)?#769;", 218);
entityMap.put("U&(amp;)?#770;", 219);
entityMap.put("U&(amp;)?#776;", 220);
entityMap.put("Y&(amp;)?#769;", 221);
entityMap.put("a&(amp;)?#768;", 224);
entityMap.put("a&(amp;)?#769;", 225);
entityMap.put("a&(amp;)?#770;", 226);
entityMap.put("a&(amp;)?#771;", 227);
entityMap.put("a&(amp;)?#776;", 228);
entityMap.put("a&(amp;)?#778;", 229);
entityMap.put("c&(amp;)?#184;", 231);
entityMap.put("c&(amp;)?#807;", 231);
entityMap.put("e&(amp;)?#768;", 232);
entityMap.put("e&(amp;)?#769;", 233);
entityMap.put("e&(amp;)?#770;", 234);
entityMap.put("e&(amp;)?#776;", 235);
entityMap.put("i&(amp;)?#768;", 236);
entityMap.put("i&(amp;)?#769;", 237);
entityMap.put("i&(amp;)?#770;", 238);
entityMap.put("i&(amp;)?#776;", 239);
entityMap.put("n&(amp;)?#771;", 241);
entityMap.put("o&(amp;)?#768;", 242);
entityMap.put("o&(amp;)?#769;", 243);
entityMap.put("o&(amp;)?#770;", 244);
entityMap.put("o&(amp;)?#771;", 245);
entityMap.put("o&(amp;)?#776;", 246);
entityMap.put("u&(amp;)?#768;", 249);
entityMap.put("u&(amp;)?#769;", 250);
entityMap.put("u&(amp;)?#770;", 251);
entityMap.put("u&(amp;)?#776;", 252);
entityMap.put("y&(amp;)?#769;", 253);
entityMap.put("y&(amp;)?#776;", 255);
}
public static String unescapeHtmlEntities(String html) {
String unescapedHtml = html;
Scanner scanner = new Scanner(html);
String match = scanner.findWithinHorizon(HTML_ENTITY_PATTERN, 0);
if (match != null) {
String charCodeString = match.replace("", "").replace(";", "");
char charCode = (char) Integer.parseInt(charCodeString);
unescapedHtml = html.replaceAll(match, String.valueOf(charCode));
unescapedHtml = HtmlEntityEscaper.unescapeHtmlEntities(unescapedHtml);
}
return unescapedHtml;
}
public static String replaceHtmlEntities(String html) {
for (String entity : entityMap.keySet()) {
Integer replacement = entityMap.get(entity);
html = html.replaceAll(entity, String.valueOf((char) replacement.intValue()));
}
return html;
}
}