package org.andengine.util.escape; import org.andengine.util.adt.map.IIntLookupMap; import android.text.TextUtils; /** * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich <ngramlich@zynga.com> * @since 15:20:25 - 26.04.2012 */ public final class Unescaper { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== // =========================================================== // Constructors // =========================================================== private Unescaper() { } // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== /** * <p>Unescapes the entities in a {@link String}.</p> * * <p>For example, if you have called addEntity("foo", 0xA1), * unescape("&foo;") will return "\u00A1"</p> * * @param pString The {@link String} to escape. * @param pIntLookupMap the {@link IIntLookupMap} to look up entities. * @return A new escaped {@link String}. */ public static String unescape(final CharSequence pCharSequence, final IIntLookupMap<CharSequence> pIntLookupMap) { final int stringLength = pCharSequence.length(); final StringBuilder stringBuilder = new StringBuilder(stringLength); int i; for (i = 0; i < stringLength; ++i) { final char ch = pCharSequence.charAt(i); if (ch == '&') { final int semi = TextUtils.indexOf(pCharSequence, ';', i + 1); if (semi == -1) { stringBuilder.append(ch); continue; } final CharSequence entityName = pCharSequence.subSequence(i + 1, semi); int entityValue; if (entityName.charAt(0) == '#') { final char charAt1 = entityName.charAt(1); if ((charAt1 == 'x') || (charAt1 == 'X')) { entityValue = Integer.valueOf(entityName.subSequence(2, entityName.length()).toString(), 16).intValue(); } else { entityValue = Integer.parseInt(entityName.subSequence(1, entityName.length()).toString()); } } else { entityValue = pIntLookupMap.value(entityName); } if (entityValue == -1) { stringBuilder.append('&'); stringBuilder.append(entityName); stringBuilder.append(';'); } else { stringBuilder.append((char) (entityValue)); } i = semi; } else { stringBuilder.append(ch); } } return stringBuilder.toString(); } // =========================================================== // Inner and Anonymous Classes // =========================================================== }