JavascriptEscape.java

package emissary.transform.decode;

import emissary.util.shell.Executrix;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

@Deprecated
public class JavascriptEscape {

    /**
     * Unescape javascript unicode characters in the form backslash-u-nnnn. Browser tests show that only lowercase "u" and
     * only four digits work. Javascript also has normal unix escapes like \n and \r.
     */
    public static byte[] unescape(byte[] data) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        for (int i = 0; i < data.length; i++) {
            if (data[i] == '\\' && (i + 5) < data.length && data[i + 1] == 'u') {
                // process unicode escape
                try {
                    String s = new String(data, i + 2, 4);
                    char[] c = HtmlEscape.unescapeHtmlChar(s, true);
                    if (c != null && c.length > 0) {
                        out.write(new String(c).getBytes());
                        // logger.debug("Unicode '{}' ==> '{}'", s, new String(c));
                        i += 5;
                    } else {
                        out.write(data[i]);
                    }
                } catch (IOException iox) {
                    out.write(data[i]);
                }
            } else if (data[i] == '\\' && (i + 1) < data.length && (data[i + 1] == 'n' || data[i + 1] == 'r')) {
                out.write('\n');
            } else {
                out.write(data[i]);
            }
        }

        return out.toByteArray();
    }

    /** This class is not meant to be instantiated. */
    private JavascriptEscape() {}

    @SuppressWarnings("SystemOut")
    public static void main(String[] args) {
        int i = 0;

        for (; i < args.length; i++) {
            byte[] content = Executrix.readDataFromFile(args[i]);
            if (content == null) {
                System.out.println(args[i] + ": Unreadable");
                continue;
            }

            System.out.println(args[i]);
            byte[] escaped = JavascriptEscape.unescape(content);
            System.out.write(escaped, 0, escaped.length);
            System.out.println();
        }
    }
}