/** * Copyright (c) 2009 - 2010 AppWork UG(haftungsbeschränkt) <e-mail@appwork.org> * * This file is part of org.appwork.utils.encoding * * This software is licensed under the Artistic License 2.0, * see the LICENSE file or http://www.opensource.org/licenses/artistic-license-2.0.php * for details */ package org.appwork.utils.encoding; import java.text.CharacterIterator; import java.text.StringCharacterIterator; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; /** * @author thomas * */ public class HTMLTranscoder { private static final HashMap<Character, String> MAP = new HashMap<Character, String>(); private static final HashMap<Character, String> MAP_SIMPLE = new HashMap<Character, String>(); private static final HashMap<String, Character> MAP_REVERSE = new HashMap<String, Character>(); static { HTMLTranscoder.MAP_SIMPLE.put('<', "<"); HTMLTranscoder.MAP_SIMPLE.put('>', ">"); HTMLTranscoder.MAP_SIMPLE.put('&', "&"); HTMLTranscoder.MAP_SIMPLE.put('"', """); HTMLTranscoder.MAP_SIMPLE.put('\n', "<br>"); HTMLTranscoder.MAP_SIMPLE.put('\r', "<br>"); HTMLTranscoder.MAP.put('\n', "<br>"); HTMLTranscoder.MAP.put('\r', "<br>"); HTMLTranscoder.MAP.put('<', "<"); HTMLTranscoder.MAP.put('>', ">"); HTMLTranscoder.MAP.put('&', "&"); HTMLTranscoder.MAP.put('"', """); HTMLTranscoder.MAP.put('\t', " "); HTMLTranscoder.MAP.put('!', "!"); HTMLTranscoder.MAP.put('#', "#"); HTMLTranscoder.MAP.put('$', "$"); HTMLTranscoder.MAP.put('%', "%"); HTMLTranscoder.MAP.put('\'', "'"); HTMLTranscoder.MAP.put('(', "("); HTMLTranscoder.MAP.put(')', ")"); HTMLTranscoder.MAP.put('*', "*"); HTMLTranscoder.MAP.put('+', "+"); HTMLTranscoder.MAP.put(',', ","); HTMLTranscoder.MAP.put('-', "-"); HTMLTranscoder.MAP.put('.', "."); HTMLTranscoder.MAP.put('/', "/"); HTMLTranscoder.MAP.put(':', ":"); HTMLTranscoder.MAP.put(';', ";"); HTMLTranscoder.MAP.put('=', "="); HTMLTranscoder.MAP.put('?', "?"); HTMLTranscoder.MAP.put('@', "@"); HTMLTranscoder.MAP.put('[', "["); HTMLTranscoder.MAP.put('\\', "\"); HTMLTranscoder.MAP.put(']', "]"); HTMLTranscoder.MAP.put('^', "^"); HTMLTranscoder.MAP.put('_', "_"); HTMLTranscoder.MAP.put('`', "`"); HTMLTranscoder.MAP.put('{', "{"); HTMLTranscoder.MAP.put('|', "|"); HTMLTranscoder.MAP.put('}', "}"); HTMLTranscoder.MAP.put('~', "~"); // reverse map for decode Entry<Character, String> next; for (final Iterator<Entry<Character, String>> it = HTMLTranscoder.MAP.entrySet().iterator(); it.hasNext();) { next = it.next(); HTMLTranscoder.MAP_REVERSE.put(next.getValue(), next.getKey()); } } /** * @param text * @return */ public static String encode(final String text) { final StringBuilder result = new StringBuilder(); final StringCharacterIterator iterator = new StringCharacterIterator(text); char character = iterator.current(); String rep = null; while (character != CharacterIterator.DONE) { rep = HTMLTranscoder.MAP.get(character); if (rep == null) { result.append(character); } else { result.append(rep); } character = iterator.next(); } return result.toString(); } /** * * encodes only newline, <>" and & * * @param text * * @return */ public static String encodeSimple(final String text) { final StringBuilder result = new StringBuilder(); final StringCharacterIterator iterator = new StringCharacterIterator(text); char character = iterator.current(); char lastC = 0; String rep = null; while (character != CharacterIterator.DONE) { if (character == '\n' && lastC == '\r') { lastC = character; character = iterator.next(); } rep = HTMLTranscoder.MAP_SIMPLE.get(character); if (rep == null) { result.append(character); } else { result.append(rep); } lastC = character; character = iterator.next(); } return result.toString(); } public static void main(final String[] args) { final String text = "<b>I'm a fat & htmled test</b>"; final String encoded = HTMLTranscoder.encode(text); System.out.println(encoded); // final String decoded = HTMLTranscoder.decode(encoded); // System.out.println(decoded); // System.out.println(decoded.equals(text)); } }