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