- update to r240 of google-code-prettify (issue 180 : MUMPS mode courtesy Chris Harris)
diff --git a/src/prettify/lang/LangMumps.java b/src/prettify/lang/LangMumps.java
new file mode 100644
index 0000000..ceeee64
--- /dev/null
+++ b/src/prettify/lang/LangMumps.java
@@ -0,0 +1,148 @@
+// Copyright (C) 2011 Kitware Inc.
+//
+// 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;
+
+/**
+ * This is similar to the lang-mumps.js in JavaScript Prettify.
+ * <p/>
+ * All comments are adapted from the JavaScript Prettify.
+ * <p/>
+ * <p/>
+ * 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-mumps">(my SQL code)</pre>
+ * <p/>
+ * Commands, intrinsic functions and variables taken from ISO/IEC 11756:1999(E)
+ *
+ * @author chris.harris@kitware.com
+ *         <p/>
+ *         Known issues:
+ *         <p/>
+ *         - Currently can't distinguish between keywords and local or global variables having the same name
+ *         for exampe SET IF="IF?"
+ *         - m file are already used for MatLab hence using mumps.
+ */
+public class LangMumps extends Lang {
+
+    public LangMumps() {
+        List<List<Object>> _shortcutStylePatterns = new ArrayList<List<Object>>();
+        List<List<Object>> _fallthroughStylePatterns = new ArrayList<List<Object>>();
+
+        final String commands = "B|BREAK|" +
+                "C|CLOSE|" +
+                "D|DO|" +
+                "E|ELSE|" +
+                "F|FOR|" +
+                "G|GOTO|" +
+                "H|HALT|" +
+                "H|HANG|" +
+                "I|IF|" +
+                "J|JOB|" +
+                "K|KILL|" +
+                "L|LOCK|" +
+                "M|MERGE|" +
+                "N|NEW|" +
+                "O|OPEN|" +
+                "Q|QUIT|" +
+                "R|READ|" +
+                "S|SET|" +
+                "TC|TCOMMIT|" +
+                "TRE|TRESTART|" +
+                "TRO|TROLLBACK|" +
+                "TS|TSTART|" +
+                "U|USE|" +
+                "V|VIEW|" +
+                "W|WRITE|" +
+                "X|XECUTE";
+
+        final String intrinsicVariables = "D|DEVICE|" +
+                "EC|ECODE|" +
+                "ES|ESTACK|" +
+                "ET|ETRAP|" +
+                "H|HOROLOG|" +
+                "I|IO|" +
+                "J|JOB|" +
+                "K|KEY|" +
+                "P|PRINCIPAL|" +
+                "Q|QUIT|" +
+                "ST|STACK|" +
+                "S|STORAGE|" +
+                "SY|SYSTEM|" +
+                "T|TEST|" +
+                "TL|TLEVEL|" +
+                "TR|TRESTART|" +
+                "X|" +
+                "Y|" +
+                "Z[A-Z]*|";
+
+        final String intrinsicFunctions = "A|ASCII|" +
+                "C|CHAR|" +
+                "D|DATA|" +
+                "E|EXTRACT|" +
+                "F|FIND|" +
+                "FN|FNUMBER|" +
+                "G|GET|" +
+                "J|JUSTIFY|" +
+                "L|LENGTH|" +
+                "NA|NAME|" +
+                "O|ORDER|" +
+                "P|PIECE|" +
+                "QL|QLENGTH|" +
+                "QS|QSUBSCRIPT|" +
+                "Q|QUERY|" +
+                "R|RANDOM|" +
+                "RE|REVERSE|" +
+                "S|SELECT|" +
+                "ST|STACK|" +
+                "T|TEXT|" +
+                "TR|TRANSLATE|" +
+                "V|VIEW|" +
+                "Z[A-Z]*|";
+
+        final String intrinsic = intrinsicVariables + intrinsicFunctions;
+
+        // 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 or single quoted, possibly multi-line, string.
+        _shortcutStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_STRING, Pattern.compile("^(?:\"(?:[^\"]|\\\\.)*\")"), null, "\""}));
+
+        // A line comment that starts with ;
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_COMMENT, Pattern.compile("^;[^\\r\\n]*"), null, ";"}));
+        // Add intrinsic variables and functions as declarations, there not really but it mean
+        // they will hilighted differently from commands.
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_DECLARATION, Pattern.compile("^(?:\\$(?:" + intrinsic + "))\\b", Pattern.CASE_INSENSITIVE), null}));
+        // Add commands as keywords
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_KEYWORD, Pattern.compile("^(?:[^\\$]" + commands + ")\\b", Pattern.CASE_INSENSITIVE), null}));
+        // A number is a decimal real literal or in scientific notation.
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_LITERAL, Pattern.compile("^[+-]?(?:(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:E[+\\-]?\\d+)?)", Pattern.CASE_INSENSITIVE)}));
+        // An identifier
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PLAIN, Pattern.compile("^[a-z][a-zA-Z0-9]*", Pattern.CASE_INSENSITIVE)}));
+        // Exclude $ % and ^
+        _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[]{"mumps"});
+    }
+}
diff --git a/test/prettify/PrettifyTest.java b/test/prettify/PrettifyTest.java
index 63c34d6..6253447 100644
--- a/test/prettify/PrettifyTest.java
+++ b/test/prettify/PrettifyTest.java
@@ -169,6 +169,7 @@
     test("tcl", "tcl_lang", false);
     test("r", "r_lang", false);
     test("erlang", "erlang", false);
+    test("mumps", "mumps", false);
   }
 
   /**
diff --git a/test/prettify/PrettifyTest/result/mumps.txt b/test/prettify/PrettifyTest/result/mumps.txt
new file mode 100644
index 0000000..a83dcf1
--- /dev/null
+++ b/test/prettify/PrettifyTest/result/mumps.txt
@@ -0,0 +1,15 @@
+`PLNHDR `END`COM; -- prt/display header`END`PLN
+ `END`KWDN`END`PLN `END`KWDX`END`PUN,`END`KWDI`END`PLN
+ `END`KWDI`END`PLN `END`PUN'`END`DEC$D`END`PUN(`END`PLNVALMHDR`END`PUN)`END`PLN `END`KWDX`END`PUN:`END`DEC$G`END`PUN(`END`PLNVALM`END`PUN(`END`STR"HDR"`END`PUN))]`END`STR""`END`PLN VALM`END`PUN(`END`STR"HDR"`END`PUN)`END`PLN
+ `END`COM; -- prt hdr line`END`PLN
+ `END`KWDW`END`PUN:'`END`DEC$D`END`PUN(`END`PLNVALMPG1`END`PUN)`END`PLN `END`PUN@`END`PLNIOF `END`KWDK`END`PLN VALMPG1
+ `END`KWDW`END`PUN:`END`PLNVALMCC `END`DEC$C`END`PUN(`END`LIT13`END`PUN)_`END`PLNIOUON`END`PUN_`END`DEC$C`END`PUN(`END`LIT13`END`PUN)_`END`PLNIOINHI`END`PUN_`END`DEC$C`END`PUN(`END`LIT13`END`PUN)`END`PLN       `END`COM; -- turn on undln/hi`END`PLN
+ `END`KWDI`END`PLN `END`DEC$E`END`PUN(`END`PLNIOST`END`PUN,`END`LIT1`END`PUN,`END`LIT2`END`PUN)=`END`STR"C-"`END`PLN `END`KWDD`END`PLN IOXY^VALM4`END`PUN(`END`LIT0`END`PUN,`END`LIT0`END`PUN)`END`PLN            `END`COM; -- position cursor`END`PLN
+ `END`KWDW`END`PLN `END`DEC$E`END`PUN(`END`PLNVALM`END`PUN(`END`STR"TITLE"`END`PUN),`END`LIT1`END`PUN,`END`LIT30`END`PUN)`END`PLN                         `END`COM; -- prt title`END`PLN
+ `END`KWDW`END`PUN:`END`PLNVALMCC IOINORM`END`PUN,`END`PLNIOUON                           `END`COM; -- turn off hi`END`PLN
+ `END`KWDW`END`PLN `END`DEC$J`END`PUN(`END`STR""`END`PUN,`END`LIT30`END`PUN-`END`DEC$L`END`PUN(`END`PLNVALM`END`PUN(`END`STR"TITLE"`END`PUN)))`END`PLN                    `END`COM; -- fill in w/blanks`END`PLN
+ `END`KWDI`END`PLN `END`DEC$E`END`PUN(`END`PLNIOST`END`PUN,`END`LIT1`END`PUN,`END`LIT2`END`PUN)=`END`STR"C-"`END`PLN `END`KWDW`END`PLN `END`DEC$C`END`PUN(`END`LIT13`END`PUN)`END`PLN `END`KWDD`END`PLN IOXY^VALM4`END`PUN(`END`LIT30`END`PUN,`END`LIT0`END`PUN)`END`PLN  `END`COM; -- position cursor`END`PLN
+ `END`KWDW`END`PLN `END`DEC$J`END`PUN(`END`STR""`END`PUN,((`END`PLNVALMWD`END`LIT-80`END`PUN)/`END`LIT2`END`PUN)),`END`PLN$$HTE^XLFDT`END`PUN(`END`DEC$H`END`PUN,`END`LIT1`END`PUN),`END`DEC$J`END`PUN(`END`STR""`END`PUN,`END`LIT10`END`PUN+((`END`PLNVALMWD`END`LIT-80`END`PUN)/`END`LIT2`END`PUN)),`END`STR"Page: "`END`PUN,`END`DEC$J`END`PUN(`END`PLNVALMPGE`END`PUN,`END`LIT4`END`PUN),`END`STR" of "`END`PUN,`END`DEC$J`END`PUN(`END`PLN$$PAGE^VALM4`END`PUN(`END`PLNVALMCNT`END`PUN,`END`PLNVALM`END`PUN(`END`STR"LINES"`END`PUN)),`END`LIT4`END`PUN)_`END`DEC$S`END`PUN(`END`DEC$D`END`PUN(`END`PLNVALMORE`END`PUN):`END`STR"+"`END`PUN,`END`LIT1`END`PUN:`END`STR" "`END`PUN)`END`PLN `END`COM; -- prt rest of hdr`END`PLN
+ `END`KWDW`END`PUN:`END`PLNVALMCC IOUOFF `END`KWDI`END`PLN `END`DEC$E`END`PUN(`END`PLNIOST`END`PUN,`END`LIT1`END`PUN,`END`LIT2`END`PUN)=`END`STR"C-"`END`PLN `END`KWDD`END`PLN IOXY^VALM4`END`PUN(`END`LIT0`END`PUN,`END`LIT0`END`PUN)`END`PLN `END`COM; -- turn off undln`END`PLN
+ `END`KWDF`END`PLN `END`KWDI`END`PUN=`END`LIT1`END`PUN:`END`LIT1`END`PUN:`END`PLNVALM`END`PUN(`END`STR"TM"`END`PUN)`END`LIT-3`END`PLN `END`KWDW`END`PLN `END`PUN!,`END`DEC$S`END`PUN('`END`DEC$D`END`PUN(`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN)):`END`STR""`END`PUN,`END`DEC$L`END`PUN(`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN))&gt;(`END`PLNVALMWD`END`LIT-1`END`PUN):`END`PLN$`END`DEC$EXTRACT`END`PLN^VALM4`END`PUN(`END`DEC$G`END`PUN(`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN))),`END`LIT1`END`PUN:`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN))`END`PLN `END`COM; -- prt hdr`END`PLN
+ `END`KWDQ`END'
diff --git a/test/prettify/PrettifyTest/source/mumps.txt b/test/prettify/PrettifyTest/source/mumps.txt
new file mode 100644
index 0000000..25aa0f4
--- /dev/null
+++ b/test/prettify/PrettifyTest/source/mumps.txt
@@ -0,0 +1,15 @@
+HDR ; -- prt/display header
+ N X,I
+ I '$D(VALMHDR) X:$G(VALM("HDR"))]"" VALM("HDR")
+ ; -- prt hdr line
+ W:'$D(VALMPG1) @IOF K VALMPG1
+ W:VALMCC $C(13)_IOUON_$C(13)_IOINHI_$C(13)       ; -- turn on undln/hi
+ I $E(IOST,1,2)="C-" D IOXY^VALM4(0,0)            ; -- position cursor
+ W $E(VALM("TITLE"),1,30)                         ; -- prt title
+ W:VALMCC IOINORM,IOUON                           ; -- turn off hi
+ W $J("",30-$L(VALM("TITLE")))                    ; -- fill in w/blanks
+ I $E(IOST,1,2)="C-" W $C(13) D IOXY^VALM4(30,0)  ; -- position cursor
+ W $J("",((VALMWD-80)/2)),$$HTE^XLFDT($H,1),$J("",10+((VALMWD-80)/2)),"Page: ",$J(VALMPGE,4)," of ",$J($$PAGE^VALM4(VALMCNT,VALM("LINES")),4)_$S($D(VALMORE):"+",1:" ") ; -- prt rest of hdr
+ W:VALMCC IOUOFF I $E(IOST,1,2)="C-" D IOXY^VALM4(0,0) ; -- turn off undln
+ F I=1:1:VALM("TM")-3 W !,$S('$D(VALMHDR(I)):"",$L(VALMHDR(I))>(VALMWD-1):$$EXTRACT^VALM4($G(VALMHDR(I))),1:VALMHDR(I)) ; -- prt hdr
+ Q
\ No newline at end of file