- update to r226 of google-code-prettify (added language handler for TCL from patch in issue 256)
diff --git a/src/prettify/lang/LangTcl.java b/src/prettify/lang/LangTcl.java
new file mode 100644
index 0000000..259e7b6
--- /dev/null
+++ b/src/prettify/lang/LangTcl.java
@@ -0,0 +1,72 @@
+// Copyright (C) 2012 Pyrios.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package prettify.lang;
+
+import prettify.parser.Prettify;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Registers a language handler for TCL
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-tcl">proc foo {} {puts bar}</pre>
+ *
+ * I copy-pasted lang-lisp.js, so this is probably not 100% accurate.
+ * I used http://wiki.tcl.tk/1019 for the keywords, but tried to only
+ * include as keywords that had more impact on the program flow
+ * rather than providing convenience. For example, I included 'if'
+ * since that provides branching, but left off 'open' since that is more
+ * like a proc. Add more if it makes sense.
+ *
+ * @author pyrios@gmail.com
+ */
+public class LangTcl extends Lang {
+
+    public LangTcl() {
+        List<List<Object>> _shortcutStylePatterns = new ArrayList<List<Object>>();
+        List<List<Object>> _fallthroughStylePatterns = new ArrayList<List<Object>>();
+
+        _shortcutStylePatterns.add(Arrays.asList(new Object[]{"opn", Pattern.compile("^\\{+"), null, "{"}));
+        _shortcutStylePatterns.add(Arrays.asList(new Object[]{"clo", Pattern.compile("^\\}+"), null, "}"}));
+        // A line comment that starts with ;
+        _shortcutStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_COMMENT, Pattern.compile("^#[^\\r\\n]*"), null, "#"}));
+        // Whitespace
+        _shortcutStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PLAIN, Pattern.compile("^[\\t\\n\\r \\xA0]+"), null, "\t\n\r " + Character.toString((char) 0xA0)}));
+        // A double quoted, possibly multi-line, string.
+        _shortcutStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_STRING, Pattern.compile("^\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)"), null, "\""}));
+
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_KEYWORD, Pattern.compile("^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\\b"), null}));
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_LITERAL, Pattern.compile("^[+\\-]?(?:[0#]x[0-9a-f]+|\\d+\\/\\d+|(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:[ed][+\\-]?\\d+)?)", Pattern.CASE_INSENSITIVE)}));
+        // A single quote possibly followed by a word that optionally ends with
+        // = ! or ?.
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_LITERAL, Pattern.compile("^\\'(?:-*(?:\\w|\\\\[\\x21-\\x7e])(?:[\\w-]*|\\\\[\\x21-\\x7e])[=!?]?)?")}));
+        // A word that optionally ends with = ! or ?.
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PLAIN, Pattern.compile("^-*(?:[a-z_]|\\\\[\\x21-\\x7e])(?:[\\w-]*|\\\\[\\x21-\\x7e])[=!?]?")}));
+        // A printable non-space non-special character
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PUNCTUATION, Pattern.compile("^[^\\w\\t\\n\\r \\xA0()\\\"\\\\\\';]+")}));
+
+        setShortcutStylePatterns(_shortcutStylePatterns);
+        setFallthroughStylePatterns(_fallthroughStylePatterns);
+    }
+
+    public static List<String> getFileExtensions() {
+        return Arrays.asList(new String[]{"tcl"});
+    }
+}
diff --git a/src/prettify/parser/Prettify.java b/src/prettify/parser/Prettify.java
index 7639395..807d46c 100644
--- a/src/prettify/parser/Prettify.java
+++ b/src/prettify/parser/Prettify.java
@@ -35,6 +35,7 @@
 import prettify.lang.LangN;
 import prettify.lang.LangScala;
 import prettify.lang.LangSql;
+import prettify.lang.LangTcl;
 import prettify.lang.LangTex;
 import prettify.lang.LangVb;
 import prettify.lang.LangVhdl;
@@ -362,6 +363,7 @@
       register(LangTex.class);
       register(LangVb.class);
       register(LangVhdl.class);
+      register(LangTcl.class);
       register(LangWiki.class);
       register(LangXq.class);
       register(LangYaml.class);
diff --git a/test/prettify/PrettifyTest.java b/test/prettify/PrettifyTest.java
index 442fa3d..7a360cb 100644
--- a/test/prettify/PrettifyTest.java
+++ b/test/prettify/PrettifyTest.java
@@ -161,6 +161,7 @@
     test(null, "xsl", false);
     test("yaml", "yaml1", false);
     test("yaml", "yaml2", false);
+    test("tcl", "tcl_lang", false);
   }
 
   /**
diff --git a/test/prettify/PrettifyTest/result/tcl_lang.txt b/test/prettify/PrettifyTest/result/tcl_lang.txt
new file mode 100644
index 0000000..0c6eaf9
--- /dev/null
+++ b/test/prettify/PrettifyTest/result/tcl_lang.txt
@@ -0,0 +1,12 @@
+`COM#!/bin/tclsh`END`PLN
+`END`KWDproc`END`PLN fib `END`OPN{`END`PLNn`END`CLO}`END`PLN `END`OPN{`END`PLN
+    `END`KWDset`END`PLN a `END`LIT0`END`PLN
+    `END`KWDset`END`PLN b `END`LIT1`END`PLN
+    `END`KWDwhile`END`PLN `END`OPN{`END`PUN$`END`PLNn `END`PUN&gt;`END`PLN `END`LIT0`END`CLO}`END`PLN `END`OPN{`END`PLN
+        `END`KWDset`END`PLN tmp `END`PUN$`END`PLNa
+        `END`KWDset`END`PLN a `END`PUN[`END`KWDexpr`END`PLN `END`PUN$`END`PLNa `END`PUN+`END`PLN `END`PUN$`END`PLNb`END`PUN]`END`PLN
+        `END`KWDset`END`PLN b `END`PUN$`END`PLNtmp
+        `END`KWDincr`END`PLN n `END`LIT-1`END`PLN
+    `END`CLO}`END`PLN
+    `END`KWDreturn`END`PLN `END`PUN$`END`PLNa
+`END`CLO}`END
diff --git a/test/prettify/PrettifyTest/source/tcl_lang.txt b/test/prettify/PrettifyTest/source/tcl_lang.txt
new file mode 100644
index 0000000..162f582
--- /dev/null
+++ b/test/prettify/PrettifyTest/source/tcl_lang.txt
@@ -0,0 +1,12 @@
+#!/bin/tclsh
+proc fib {n} {
+    set a 0
+    set b 1
+    while {$n > 0} {
+        set tmp $a
+        set a [expr $a + $b]
+        set b $tmp
+        incr n -1
+    }
+    return $a
+}
\ No newline at end of file