Add txt language

Test: bazelisk build //:gitiles && tools/run_dev.sh
Bug: NA
Change-Id: I5ae500fabb68a9dacc2cad7287c86babb69d6e28
diff --git a/BUILD b/BUILD
index 848e651..3879c4a 100644
--- a/BUILD
+++ b/BUILD
@@ -3,6 +3,7 @@
     srcs = glob(["src/**/*.java"]),
     resources = [
         "src/prettify/example/example.html",
+        "src/prettify/example/text.txt",
     ],
     visibility = ["//visibility:public"],
 )
diff --git a/src/prettify/PrettifyParser.java b/src/prettify/PrettifyParser.java
index c02bc71..0cae2e2 100644
--- a/src/prettify/PrettifyParser.java
+++ b/src/prettify/PrettifyParser.java
@@ -26,6 +26,7 @@
     prettify = new Prettify();
   }
 
+  // Note to gitiles developers: This is gitiles entry point into java-prettifier lib.
   @Override
   public List<ParseResult> parse(String fileExtension, String content) {
     Job job = new Job(0, content);
diff --git a/src/prettify/example/Example.java b/src/prettify/example/Example.java
index 45d4e93..579077b 100644
--- a/src/prettify/example/Example.java
+++ b/src/prettify/example/Example.java
@@ -16,6 +16,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -99,9 +100,17 @@
         highlighter.setFirstLine(10);
         // set to highlight line 13, 27, 28, 38, 42, 43 and 53
         highlighter.setHighlightedLineList(Arrays.asList(13, 27, 28, 38, 42, 43, 53));
+
+        String resourcePath = "/prettify/example/example.html";
+        if (args.length > 0 && args[0].equals("txt")) {
+          resourcePath = "/prettify/example/text.txt";
+          highlighter.setFirstLine(0);
+          highlighter.setHighlightedLineList(new ArrayList<>());
+        }
+
         try {
           // set the content of the script, the example.html is located in the jar: /prettify/example/example.html
-          highlighter.setContent(new String(readResourceFile("/prettify/example/example.html")));
+          highlighter.setContent(new String(readResourceFile(resourcePath)), resourcePath);
         } catch (IOException ex) {
           LOG.log(Level.SEVERE, null, ex);
         }
diff --git a/src/prettify/example/text.txt b/src/prettify/example/text.txt
new file mode 100644
index 0000000..36c50a6
--- /dev/null
+++ b/src/prettify/example/text.txt
@@ -0,0 +1,11 @@
+noindentation
+ oneindentation
+  twoindentation
+   threeidentation
+  TABindentation
+1start_with_a_number
+A line with a ' unclosed character, like an apostrophe.
+A line with 1 as a number.
+A line with a ' which is closed here'.
+A line with a " which is unclosed.
+A line with a " which is closed here".
diff --git a/src/prettify/lang/LangText.java b/src/prettify/lang/LangText.java
new file mode 100644
index 0000000..a60f02a
--- /dev/null
+++ b/src/prettify/lang/LangText.java
@@ -0,0 +1,25 @@
+package prettify.lang;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Pattern;
+import prettify.parser.Prettify;
+
+public class LangText extends Lang {
+
+  public LangText() {
+    List<List<Object>> _shortcutStylePatterns = new ArrayList<List<Object>>();
+    List<List<Object>> _fallthroughStylePatterns = new ArrayList<List<Object>>();
+
+    _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PLAIN, Pattern.compile(".", Pattern.CASE_INSENSITIVE)}));
+
+    setShortcutStylePatterns(_shortcutStylePatterns);
+    setFallthroughStylePatterns(_fallthroughStylePatterns);
+  }
+
+  public static List<String> getFileExtensions() {
+    return Arrays.asList(new String[]{"txt", "TXT"});
+  }
+
+}
diff --git a/src/prettify/parser/Prettify.java b/src/prettify/parser/Prettify.java
index 95c1e08..82b02a6 100644
--- a/src/prettify/parser/Prettify.java
+++ b/src/prettify/parser/Prettify.java
@@ -45,6 +45,7 @@
 import prettify.lang.LangSql;
 import prettify.lang.LangTcl;
 import prettify.lang.LangTex;
+import prettify.lang.LangText;
 import prettify.lang.LangVb;
 import prettify.lang.LangVhdl;
 import prettify.lang.LangWiki;
@@ -392,6 +393,7 @@
       register(LangWiki.class);
       register(LangXq.class);
       register(LangYaml.class);
+      register(LangText.class);
     } catch (Exception ex) {
       LOG.log(Level.SEVERE, null, ex);
     }
diff --git a/src/syntaxhighlight/SyntaxHighlighter.java b/src/syntaxhighlight/SyntaxHighlighter.java
index e948acc..0f651c6 100644
--- a/src/syntaxhighlight/SyntaxHighlighter.java
+++ b/src/syntaxhighlight/SyntaxHighlighter.java
@@ -57,6 +57,13 @@
   protected String content;
 
   /**
+   * The type of this.content, empty string if unknown.
+   */
+  private String extension;
+
+  private static final String UNKNOWN_EXTENSION = "";
+
+  /**
    * Constructor.
    * @param parser the parser to use
    * @param theme the theme for the syntax highlighter
@@ -105,7 +112,7 @@
     if (content != null) {
       // stop the change listener on the row header to speed up rendering
       highlighterRowHeader.setListenToDocumentUpdate(false);
-      highlighter.setStyle(parser.parse(null, content));
+      highlighter.setStyle(parser.parse(extension, content));
       // resume the change listener on the row header
       highlighterRowHeader.setListenToDocumentUpdate(true);
       // notify the row header to update its information related to the SyntaxHighlighterPane
@@ -246,7 +253,11 @@
    * @throws IOException error occurred when reading the file
    */
   public void setContent(File file) throws IOException {
-    setContent(readFile(file));
+    setContent(readFile(file), getExtension(file.getAbsolutePath()));
+  }
+
+  public void setContent(String content) {
+    setContent(content, UNKNOWN_EXTENSION);
   }
 
   /**
@@ -254,12 +265,21 @@
    * settings first and set this the last.
    * @param content the content to set, null means no content
    */
-  public void setContent(String content) {
+  public void setContent(String content, String filename) {
     this.content = content;
+    this.extension = getExtension(filename);
     highlighter.setContent(content);
     render();
   }
 
+  private static String getExtension(String path) {
+    int extensionIndex = path.lastIndexOf(".");
+    if (extensionIndex != -1) {
+      return path.substring(extensionIndex + 1);
+    }
+    return "";
+  }
+
   /**
    * Get the string content of a file.
    * @param file the file to retrieve the content from