/** * 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; } }