- 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>`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