diff --git a/test/prettify/PrettifyTest.java b/test/prettify/PrettifyTest.java
index 11b5e60..d68e198 100644
--- a/test/prettify/PrettifyTest.java
+++ b/test/prettify/PrettifyTest.java
@@ -36,234 +36,248 @@
  */
 public class PrettifyTest {
 
-    static {
-        // set debug mode
-        System.setProperty("PrettifyDebugMode", "true");
-    }
-    protected final String packagePath = "test/" + this.getClass().getCanonicalName().replace('.', '/') + "/";
-    protected Prettify prettify;
+  static {
+    // set debug mode
+    System.setProperty("PrettifyDebugMode", "true");
+  }
+  protected final String packagePath = "test/" + this.getClass().getCanonicalName().replace('.', '/') + "/";
+  protected Prettify prettify;
 
-    public PrettifyTest() {
-    }
+  public PrettifyTest() {
+  }
 
-    protected static String getClassName() {
-        return new Object() {
-        }.getClass().getEnclosingClass().getName();
-    }
+  protected static String getClassName() {
+    return new Object() {
+    }.getClass().getEnclosingClass().getName();
+  }
 
-    @BeforeClass
-    public static void setUpClass() throws Exception {
-        System.out.println("***** " + getClassName() + " *****");
-    }
+  @BeforeClass
+  public static void setUpClass() throws Exception {
+    System.out.println("***** " + getClassName() + " *****");
+  }
 
-    @AfterClass
-    public static void tearDownClass() throws Exception {
-        System.out.println("******************************\r\n");
-    }
+  @AfterClass
+  public static void tearDownClass() throws Exception {
+    System.out.println("******************************\r\n");
+  }
 
-    @Before
-    public void setUp() {
-        prettify = new Prettify();
-    }
+  @Before
+  public void setUp() {
+    prettify = new Prettify();
+  }
 
-    @After
-    public void tearDown() {
-    }
+  @After
+  public void tearDown() {
+  }
 
-    /**
-     * Do test. The Java Prettify line numbering is different from JavaScript Prettify. If the result is adapted 
-     * from JavaScript Prettify tests and that {@code resultText} have line numbering, set {@code removeNewLines} 
-     * to true.
-     * @param extension the file name of the source file
-     * @param code the source code
-     * @param removeJSLineNumbering true to remove new line and combine identical adjacent tag
-     * @throws IOException error occurred when reading source or result file
-     */
-    public void test(String extension, String code, boolean removeJSLineNumbering) throws IOException {
-        String source = new String(readFile(new File(packagePath + "source/" + code + ".txt")), "UTF-8");
-        Job job = new Job(0, source);
-        prettify.langHandlerForExtension(extension, source).decorate(job);
-        List<Object> decorations = removeJSLineNumbering ? removeNewLines(job.getDecorations(), source) : job.getDecorations();
-        List<Object> compare = readResult(new String(readFile(new File(packagePath + "result/" + code + ".txt")), "UTF-8").replace("&lt;", "<").replace("&gt;", ">").replace("&nbsp;", " ").replace("&amp;", "&"), removeJSLineNumbering);
+  /**
+   * Do test. The Java Prettify line numbering is different from JavaScript 
+   * Prettify. If the result is adapted from JavaScript Prettify tests and 
+   * that {@code resultText} have line numbering, set {@code removeNewLines} 
+   * to true.
+   * 
+   * @param extension the file name of the source file
+   * @param code the source code
+   * @param removeJSLineNumbering true to remove new line and combine 
+   * identical adjacent tag
+   * 
+   * @throws IOException error occurred when reading source or result file
+   */
+  public void test(String extension, String code, boolean removeJSLineNumbering) throws IOException {
+    String source = new String(readFile(new File(packagePath + "source/" + code + ".txt")), "UTF-8");
+    Job job = new Job(0, source);
+    prettify.langHandlerForExtension(extension, source).decorate(job);
+    List<Object> decorations = removeJSLineNumbering ? removeNewLines(job.getDecorations(), source) : job.getDecorations();
+    List<Object> compare = readResult(new String(readFile(new File(packagePath + "result/" + code + ".txt")), "UTF-8").replace("&lt;", "<").replace("&gt;", ">").replace("&nbsp;", " ").replace("&amp;", "&"), removeJSLineNumbering);
 //        assertArrayEquals(code + "\n" + compare + "\n" + decorations, compare.toArray(), decorations.toArray()); // for debug
-        assertArrayEquals(code, compare.toArray(), decorations.toArray());
+    assertArrayEquals(code, compare.toArray(), decorations.toArray());
+  }
+
+  @Test
+  public void testBatch() throws IOException {
+    System.out.println("+++++ testBatch +++++");
+
+    test(null, "bash", false);
+    test("sh", "bash_lang", true);
+    test(null, "java", false);
+    test("java", "java_lang", true);
+    test(null, "C", false);
+    test("c", "C_lang", false);
+    test(null, "Cpp", false);
+    test("cpp", "Cpp_lang", false);
+    test(null, "javascript", false);
+    test(null, "perl", false);
+    test(null, "python", false);
+    test("py", "python_lang", false);
+    test(null, "PHP", false);
+    test("coffee", "coffee", false);
+    test("css", "css", false);
+    test("go", "go", false);
+    test(null, "html", false);
+    test(null, "htmlXmp", false);
+    test("html", "html_lang", false);
+    test(null, "issue12", false);
+    test("js", "issue12_lang", false);
+    test(null, "issue14a", false);
+    test(null, "issue14b", false);
+    test(null, "issue20", false);
+    test(null, "issue21", false);
+    test("lua", "issue24", false);
+    test("vb", "issue27", false);
+    test("hs", "issue30", false);
+    test("ml", "issue33", false);
+    test(null, "issue4", false);
+    test("el", "issue42", false);
+    test(null, "issue45", false);
+    test(null, "issue79", false);
+    test(null, "issue8", false);
+    test("java", "issue84", false);
+    test(null, "issue92", false);
+    test("cs", "issue93", false);
+    test(null, "misc1", false);
+    test("proto", "proto", false);
+    test("scala", "scala", false);
+    test("vhdl", "vhdl", false);
+    test("wiki", "wiki", false);
+    test(null, "xhtml", false);
+    test(null, "xml", false);
+    test(null, "xsl", false);
+    test("yaml", "yaml1", false);
+    test("yaml", "yaml2", false);
+  }
+
+  /**
+   * Read the whole file and return the content in byte array.
+   * @param file the file to read
+   * @return the content of the file in byte array
+   * @throws IOException error occurred when reading the content from the 
+   * file
+   */
+  public static byte[] readFile(File file) throws IOException {
+    if (file == null) {
+      throw new NullPointerException("argument 'file' cannot be null");
     }
 
-    @Test
-    public void testBatch() throws IOException {
-        System.out.println("+++++ testBatch +++++");
+    long fileLength = file.length();
+    byte[] content = new byte[(int) fileLength];
 
-        test(null, "bash", false);
-        test("sh", "bash_lang", true);
-        test(null, "java", false);
-        test("java", "java_lang", true);
-        test(null, "C", false);
-        test("c", "C_lang", false);
-        test(null, "Cpp", false);
-        test("cpp", "Cpp_lang", false);
-        test(null, "javascript", false);
-        test(null, "perl", false);
-        test(null, "python", false);
-        test("py", "python_lang", false);
-        test(null, "PHP", false);
-        test("coffee", "coffee", false);
-        test("css", "css", false);
-        test("go", "go", false);
-        test(null, "html", false);
-        test(null, "htmlXmp", false);
-        test("html", "html_lang", false);
-        test(null, "issue12", false);
-        test("js", "issue12_lang", false);
-        test(null, "issue14a", false);
-        test(null, "issue14b", false);
-        test(null, "issue20", false);
-        test(null, "issue21", false);
-        test("lua", "issue24", false);
-        test("vb", "issue27", false);
-        test("hs", "issue30", false);
-        test("ml", "issue33", false);
-        test(null, "issue4", false);
-        test("el", "issue42", false);
-        test(null, "issue45", false);
-        test(null, "issue79", false);
-        test(null, "issue8", false);
-        test("java", "issue84", false);
-        test(null, "issue92", false);
-        test("cs", "issue93", false);
-        test(null, "misc1", false);
-        test("proto", "proto", false);
-        test("scala", "scala", false);
-        test("vhdl", "vhdl", false);
-        test("wiki", "wiki", false);
-        test(null, "xhtml", false);
-        test(null, "xml", false);
-        test(null, "xsl", false);
-        test("yaml", "yaml1", false);
-        test("yaml", "yaml2", false);
-    }
+    FileInputStream fin = null;
+    try {
+      fin = new FileInputStream(file);
 
-    /**
-     * Read the whole file and return the content in byte array.
-     * @param file the file to read
-     * @return the content of the file in byte array
-     * @throws IOException error occurred when reading the content from the file
-     */
-    public static byte[] readFile(File file) throws IOException {
-        if (file == null) {
-            throw new NullPointerException("argument 'file' cannot be null");
+      int byteRead = 0, cumulateByteRead = 0;
+      while ((byteRead = fin.read(content, cumulateByteRead, content.length - cumulateByteRead)) != -1) {
+        cumulateByteRead += byteRead;
+        if (cumulateByteRead >= fileLength) {
+          break;
         }
+      }
 
-        long fileLength = file.length();
-        byte[] content = new byte[(int) fileLength];
-
-        FileInputStream fin = null;
+      if (cumulateByteRead != fileLength) {
+        throw new IOException("The total number of bytes read does not match the file size. Actual file size: " + fileLength + ", bytes read: " + cumulateByteRead + ", path: " + file.getAbsolutePath());
+      }
+    } finally {
+      if (fin != null) {
         try {
-            fin = new FileInputStream(file);
-
-            int byteRead = 0, cumulateByteRead = 0;
-            while ((byteRead = fin.read(content, cumulateByteRead, content.length - cumulateByteRead)) != -1) {
-                cumulateByteRead += byteRead;
-                if (cumulateByteRead >= fileLength) {
-                    break;
-                }
-            }
-
-            if (cumulateByteRead != fileLength) {
-                throw new IOException("The total number of bytes read does not match the file size. Actual file size: " + fileLength + ", bytes read: " + cumulateByteRead + ", path: " + file.getAbsolutePath());
-            }
-        } finally {
-            if (fin != null) {
-                try {
-                    fin.close();
-                } catch (IOException ex) {
-                }
-            }
+          fin.close();
+        } catch (IOException ex) {
         }
-
-        return content;
+      }
     }
 
-    /**
-     * Determine the positions of new line characters in {@code source} and adjust the position 
-     * value in {@code decorations}. Finally, it will combine adjacent identical tags.
-     * @param decorations see {@link prettify.Job#decorations}
-     * @param source the source code in string
-     * @return the adjusted list of {@code decorations}
-     */
-    public static List<Object> removeNewLines(List<Object> decorations, String source) {
-        if (decorations == null) {
-            throw new NullPointerException("argument 'decorations' cannot be null");
-        }
-        if (source == null) {
-            throw new NullPointerException("argument 'source' cannot be null");
-        }
+    return content;
+  }
 
-        List<Object> _decorations = new ArrayList<Object>(decorations);
+  /**
+   * Determine the positions of new line characters in {@code source} and 
+   * adjust the position value in {@code decorations}. Finally, it will 
+   * combine adjacent identical tags.
+   * 
+   * @param decorations see {@link prettify.Job#decorations}
+   * @param source the source code in string
+   * 
+   * @return the adjusted list of {@code decorations}
+   */
+  public static List<Object> removeNewLines(List<Object> decorations, String source) {
+    if (decorations == null) {
+      throw new NullPointerException("argument 'decorations' cannot be null");
+    }
+    if (source == null) {
+      throw new NullPointerException("argument 'source' cannot be null");
+    }
 
-        StringBuffer sb = new StringBuffer();
-        Pattern pattern = Pattern.compile("[\r\n]");
-        Matcher matcher = pattern.matcher(source);
-        while (matcher.find()) {
-            matcher.appendReplacement(sb, "");
+    List<Object> _decorations = new ArrayList<Object>(decorations);
 
-            int posStart = sb.length();
-            ListIterator<Object> iterator = _decorations.listIterator();
-            while (iterator.hasNext()) {
-                Integer pos = (Integer) iterator.next();
-                if (pos > posStart) {
-                    iterator.set(pos - 1);
-                }
-                iterator.next();
-            }
+    StringBuffer sb = new StringBuffer();
+    Pattern pattern = Pattern.compile("[\r\n]");
+    Matcher matcher = pattern.matcher(source);
+    while (matcher.find()) {
+      matcher.appendReplacement(sb, "");
+
+      int posStart = sb.length();
+      ListIterator<Object> iterator = _decorations.listIterator();
+      while (iterator.hasNext()) {
+        Integer pos = (Integer) iterator.next();
+        if (pos > posStart) {
+          iterator.set(pos - 1);
         }
+        iterator.next();
+      }
+    }
 //        matcher.appendTail(sb);
 
-        return Util.removeDuplicates(_decorations, source);
+    return Util.removeDuplicates(_decorations, source);
+  }
+
+  /**
+   * Parse the {@code resultText}. The Java Prettify line numbering is 
+   * different from JavaScript Prettify. If the result is adapted from 
+   * JavaScript Prettify tests and that {@code resultText} have line 
+   * numbering, set {@code removeNewLines} to true. Also, the 
+   * {@code resultText} should not escape html special characters
+   * 
+   * @param resultText the result in string
+   * @param removeJSLineNumbering true to remove new line and combine identical 
+   * adjacent tag
+   * 
+   * @return the parsed result with format similar to 
+   * {@link prettify.Job#decorations}
+   */
+  public static List<Object> readResult(String resultText, boolean removeJSLineNumbering) {
+    if (resultText == null) {
+      throw new NullPointerException("argument 'resultText' cannot be null");
+    }
+    String _resultText = resultText;
+
+    List<Object> returnList = new ArrayList<Object>();
+
+    if (removeJSLineNumbering) {
+      _resultText = _resultText.replaceAll("[\r\n]", "");
+
+      StringBuffer sb = new StringBuffer();
+      Pattern pattern = Pattern.compile("(`[A-Z]{3})([^`]+?)`END\\1([^`]+?)`END", Pattern.MULTILINE | Pattern.DOTALL);
+      Matcher matcher = pattern.matcher(_resultText);
+      while (matcher.find()) {
+        matcher.appendReplacement(sb, "");
+        sb.append(matcher.group(1)).append(matcher.group(2)).append(matcher.group(3)).append("`END");
+      }
+      matcher.appendTail(sb);
+
+      _resultText = sb.toString();
     }
 
-    /**
-     * Parse the {@code resultText}. The Java Prettify line numbering is different from JavaScript Prettify.
-     * If the result is adapted from JavaScript Prettify tests and that {@code resultText} have line numbering,
-     * set {@code removeNewLines} to true. Also, the {@code resultText} should not escape html special
-     * characters.
-     * @param resultText the result in string
-     * @param removeJSLineNumbering true to remove new line and combine identical adjacent tag
-     * @return the parsed result with format similar to {@link prettify.Job#decorations}
-     */
-    public static List<Object> readResult(String resultText, boolean removeJSLineNumbering) {
-        if (resultText == null) {
-            throw new NullPointerException("argument 'resultText' cannot be null");
-        }
+    int count = 0;
+    Pattern pattern = Pattern.compile("`([A-Z]{3})(.+?)`END", Pattern.MULTILINE | Pattern.DOTALL);
+    Matcher matcher = pattern.matcher(_resultText);
+    while (matcher.find()) {
+      returnList.add(count);
+      returnList.add(matcher.group(1).toLowerCase());
+      count += matcher.group(2).length();
+    }
 
-        List<Object> returnList = new ArrayList<Object>();
+    returnList = Util.removeDuplicates(returnList, _resultText);
 
-        if (removeJSLineNumbering) {
-            resultText = resultText.replaceAll("[\r\n]", "");
-
-            StringBuffer sb = new StringBuffer();
-            Pattern pattern = Pattern.compile("(`[A-Z]{3})([^`]+?)`END\\1([^`]+?)`END", Pattern.MULTILINE | Pattern.DOTALL);
-            Matcher matcher = pattern.matcher(resultText);
-            while (matcher.find()) {
-                matcher.appendReplacement(sb, "");
-                sb.append(matcher.group(1)).append(matcher.group(2)).append(matcher.group(3)).append("`END");
-            }
-            matcher.appendTail(sb);
-
-            resultText = sb.toString();
-        }
-
-        int count = 0;
-        Pattern pattern = Pattern.compile("`([A-Z]{3})(.+?)`END", Pattern.MULTILINE | Pattern.DOTALL);
-        Matcher matcher = pattern.matcher(resultText);
-        while (matcher.find()) {
-            returnList.add(count);
-            returnList.add(matcher.group(1).toLowerCase());
-            count += matcher.group(2).length();
-        }
-
-        returnList = Util.removeDuplicates(returnList, resultText);
-
-        // for debug
+    // for debug
 //        StringBuffer sb = new StringBuffer();
 //        matcher = pattern.matcher(resultText);
 //        while (matcher.find()) {
@@ -280,6 +294,6 @@
 //            System.out.println(returnList.get(i) + ": " + returnList.get(i + 1) + ": " + plainCode.substring((Integer) returnList.get(i), end));
 //        }
 
-        return returnList;
-    }
+    return returnList;
+  }
 }
