- update to r244 of google-code-prettify (better basic and pascal support courtesy Peter Kopfler in issue 137)
diff --git a/src/prettify/lang/LangBasic.java b/src/prettify/lang/LangBasic.java
new file mode 100644
index 0000000..585ee86
--- /dev/null
+++ b/src/prettify/lang/LangBasic.java
@@ -0,0 +1,46 @@
+// Contributed by peter dot kofler at code minus cop dot org
+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-basic.js in JavaScript Prettify.
+ * <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-basic">(my BASIC code)</pre>
+ *
+ * @author peter dot kofler at code minus cop dot org
+ */
+public class LangBasic extends Lang {
+
+    public LangBasic() {
+        List<List<Object>> _shortcutStylePatterns = new ArrayList<List<Object>>();
+        List<List<Object>> _fallthroughStylePatterns = new ArrayList<List<Object>>();
+
+        // "single-line-string"
+        _shortcutStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_STRING, Pattern.compile("^(?:\"(?:[^\\\\\"\\r\\n]|\\\\.)*(?:\"|$))"), null, "\""}));
+        // Whitespace
+        _shortcutStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PLAIN, Pattern.compile("^\\s+"), null, "\t\n\r " + Character.toString((char) 0xA0)}));
+
+        // A line comment that starts with REM
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_COMMENT, Pattern.compile("^REM[^\\r\\n]*"), null}));
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_KEYWORD, Pattern.compile("^\\b(?:AND|CLOSE|CLR|CMD|CONT|DATA|DEF ?FN|DIM|END|FOR|GET|GOSUB|GOTO|IF|INPUT|LET|LIST|LOAD|NEW|NEXT|NOT|ON|OPEN|OR|POKE|PRINT|READ|RESTORE|RETURN|RUN|SAVE|STEP|STOP|SYS|THEN|TO|VERIFY|WAIT)\\b"), null}));
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PLAIN, Pattern.compile("^[A-Z][A-Z0-9]?(?:\\$|%)?", Pattern.CASE_INSENSITIVE), null}));
+        // Literals .0, 0, 0.0 0E13
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_LITERAL, Pattern.compile("^(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+\\-]?\\d+)?", Pattern.CASE_INSENSITIVE), null, "0123456789"}));
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PUNCTUATION, Pattern.compile("^.[^\\s\\w\\.$%\"]*"), null}));
+
+        setShortcutStylePatterns(_shortcutStylePatterns);
+        setFallthroughStylePatterns(_fallthroughStylePatterns);
+    }
+
+    public static List<String> getFileExtensions() {
+        return Arrays.asList(new String[]{"basic", "cbm"});
+    }
+}
diff --git a/src/prettify/lang/LangPascal.java b/src/prettify/lang/LangPascal.java
new file mode 100644
index 0000000..2225139
--- /dev/null
+++ b/src/prettify/lang/LangPascal.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2009 Onno Hommes.
+//
+// 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-appollo.js in JavaScript Prettify.
+ * <p/>
+ * All comments are adapted from the JavaScript Prettify.
+ * <p/>
+ * <p/>
+ * Registers a language handler for the AGC/AEA Assembly Language as described
+ * at http://virtualagc.googlecode.com
+ * <p/>
+ * This file could be used by goodle code to allow syntax highlight for
+ * Virtual AGC SVN repository or if you don't want to commonize
+ * the header for the agc/aea html assembly listing.
+ *
+ * @author ohommes@alumni.cmu.edu
+ */
+public class LangPascal extends Lang {
+
+    public LangPascal() {
+        List<List<Object>> _shortcutStylePatterns = new ArrayList<List<Object>>();
+        List<List<Object>> _fallthroughStylePatterns = new ArrayList<List<Object>>();
+
+        // 'single-line-string'
+        _shortcutStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_STRING, Pattern.compile("^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$))"), null, "'"}));
+        // Whitespace
+        _shortcutStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PLAIN, Pattern.compile("^\\s+"), null, " \r\n\t" + Character.toString((char) 0xA0)}));
+
+        // A cStyleComments comment (* *) or {}
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_COMMENT, Pattern.compile("^\\(\\*[\\s\\S]*?(?:\\*\\)|$)|^\\{[\\s\\S]*?(?:\\}|$)"), null}));
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_KEYWORD, Pattern.compile("^(?:ABSOLUTE|AND|ARRAY|ASM|ASSEMBLER|BEGIN|CASE|CONST|CONSTRUCTOR|DESTRUCTOR|DIV|DO|DOWNTO|ELSE|END|EXTERNAL|FOR|FORWARD|FUNCTION|GOTO|IF|IMPLEMENTATION|IN|INLINE|INTERFACE|INTERRUPT|LABEL|MOD|NOT|OBJECT|OF|OR|PACKED|PROCEDURE|PROGRAM|RECORD|REPEAT|SET|SHL|SHR|THEN|TO|TYPE|UNIT|UNTIL|USES|VAR|VIRTUAL|WHILE|WITH|XOR)\\b", Pattern.CASE_INSENSITIVE), null}));
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_LITERAL, Pattern.compile("^(?:true|false|self|nil)", Pattern.CASE_INSENSITIVE), null}));
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PLAIN, Pattern.compile("^[a-z][a-z0-9]*", Pattern.CASE_INSENSITIVE), null}));
+        // Literals .0, 0, 0.0 0E13
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_LITERAL, Pattern.compile("^(?:\\$[a-f0-9]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+\\-]?\\d+)?)", Pattern.CASE_INSENSITIVE), null, "0123456789"}));
+        _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PUNCTUATION, Pattern.compile("^.[^\\s\\w\\.$@\\'\\/]*"), null}));
+
+        setShortcutStylePatterns(_shortcutStylePatterns);
+        setFallthroughStylePatterns(_fallthroughStylePatterns);
+    }
+
+    public static List<String> getFileExtensions() {
+        return Arrays.asList(new String[]{"pascal"});
+    }
+}
diff --git a/src/prettify/lang/LangVb.java b/src/prettify/lang/LangVb.java
index 4e42df5..b7c9ed6 100644
--- a/src/prettify/lang/LangVb.java
+++ b/src/prettify/lang/LangVb.java
@@ -59,8 +59,10 @@
     _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_COMMENT, Pattern.compile("^REM\\b[^\\r\\n\\u2028\\u2029]*", Pattern.CASE_INSENSITIVE)}));
     // A boolean, numeric, or date literal.
     _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_LITERAL, Pattern.compile("^(?:True\\b|False\\b|Nothing\\b|\\d+(?:E[+\\-]?\\d+[FRD]?|[FRDSIL])?|(?:&H[0-9A-F]+|&O[0-7]+)[SIL]?|\\d*\\.\\d+(?:E[+\\-]?\\d+)?[FRD]?|#\\s+(?:\\d+[\\-\\/]\\d+[\\-\\/]\\d+(?:\\s+\\d+:\\d+(?::\\d+)?(\\s*(?:AM|PM))?)?|\\d+:\\d+(?::\\d+)?(\\s*(?:AM|PM))?)\\s+#)", Pattern.CASE_INSENSITIVE)}));
-    // An identifier?
-    _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PLAIN, Pattern.compile("^(?:(?:[a-z]|_\\w)\\w*|\\[(?:[a-z]|_\\w)\\w*\\])", Pattern.CASE_INSENSITIVE)}));
+    // An identifier.  Keywords can be turned into identifers
+    // with square brackets, and there may be optional type
+    // characters after a normal identifier in square brackets.
+    _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PLAIN, Pattern.compile("^(?:(?:[a-z]|_\\w)\\w*(?:\\[[%&@!#]+\\])?|\\[(?:[a-z]|_\\w)\\w*\\])", Pattern.CASE_INSENSITIVE)}));
     // A run of punctuation
     _fallthroughStylePatterns.add(Arrays.asList(new Object[]{Prettify.PR_PUNCTUATION, Pattern.compile("^[^\\w\\t\\n\\r \\\"\\'\\[\\]\\xA0\\u2018\\u2019\\u201C\\u201D\\u2028\\u2029]+")}));
     // Square brackets
diff --git a/src/prettify/parser/Prettify.java b/src/prettify/parser/Prettify.java
index 4a33875..bc6e655 100644
--- a/src/prettify/parser/Prettify.java
+++ b/src/prettify/parser/Prettify.java
@@ -24,6 +24,7 @@
 import java.util.logging.Logger;
 import java.util.regex.Pattern;
 import prettify.lang.LangAppollo;
+import prettify.lang.LangBasic;
 import prettify.lang.LangClj;
 import prettify.lang.LangCss;
 import prettify.lang.LangDart;
@@ -35,6 +36,7 @@
 import prettify.lang.LangMl;
 import prettify.lang.LangMumps;
 import prettify.lang.LangN;
+import prettify.lang.LangPascal;
 import prettify.lang.LangR;
 import prettify.lang.LangRd;
 import prettify.lang.LangScala;
@@ -353,6 +355,7 @@
       registerLangHandler(sourceDecorator(decorateSourceMap), Arrays.asList(new String[]{"proto"}));
 
       register(LangAppollo.class);
+      register(LangBasic.class);
       register(LangClj.class);
       register(LangCss.class);
       register(LangDart.class);
@@ -364,6 +367,7 @@
       register(LangMl.class);
       register(LangMumps.class);
       register(LangN.class);
+      register(LangPascal.class);
       register(LangR.class);
       register(LangRd.class);
       register(LangScala.class);
diff --git a/test/prettify/PrettifyTest.java b/test/prettify/PrettifyTest.java
index 6253447..5571f09 100644
--- a/test/prettify/PrettifyTest.java
+++ b/test/prettify/PrettifyTest.java
@@ -170,6 +170,8 @@
     test("r", "r_lang", false);
     test("erlang", "erlang", false);
     test("mumps", "mumps", false);
+    test("pascal", "pascal_lang", false);
+    test("basic", "basic_lang", false);
   }
 
   /**
diff --git a/test/prettify/PrettifyTest/result/basic_lang.txt b/test/prettify/PrettifyTest/result/basic_lang.txt
new file mode 100644
index 0000000..1a6ad6f
--- /dev/null
+++ b/test/prettify/PrettifyTest/result/basic_lang.txt
@@ -0,0 +1,9 @@
+`LIT200`END`PLN `END`COMREM ----- method teardown`END`PLN
+`END`LIT210`END`PLN `END`KWDPRINT`END`PLN `END`STR"green"`END`PLN
+`END`LIT220`END`PLN `END`KWDRETURN`END`PLN
+`END`LIT470`END`PLN `END`KWDIF`END`PLN af`END`PUN=`END`LIT0`END`PLN `END`KWDTHEN`END`PLN `END`KWDGOTO`END`PLN `END`LIT520`END`PLN
+`END`LIT480`END`PLN `END`KWDFOR`END`PLN j`END`PUN=`END`LIT1`END`PLN `END`KWDTO`END`PLN af
+`END`LIT500`END`PLN ac`END`PUN=`END`PLNpf`END`PUN(`END`PLNj`END`PUN)`END`PLN `END`PUN:`END`PLN me$`END`PUN=`END`PLNSTR$`END`PUN(`END`PLNj`END`PUN)+`END`STR". factor"`END`PLN `END`PUN:`END`PLN `END`KWDGOSUB`END`PLN `END`LIT100`END`PLN
+`END`LIT510`END`PLN `END`KWDNEXT`END`PLN
+`END`LIT530`END`PLN `END`KWDRETURN`END`PLN
+`END`LIT1000`END`PLN `END`KWDDATA`END`PLN `END`STR"one"`END`PUN,`END`PLN `END`LIT1`END`PUN,`END`PLN `END`LIT0`END'
diff --git a/test/prettify/PrettifyTest/result/pascal_lang.txt b/test/prettify/PrettifyTest/result/pascal_lang.txt
new file mode 100644
index 0000000..ed5b550
--- /dev/null
+++ b/test/prettify/PrettifyTest/result/pascal_lang.txt
@@ -0,0 +1,21 @@
+`COM(* some comment here *)`END`PLN
+`END`KWDPROCEDURE`END`PLN TestCase`END`PUN.`END`PLNAssertEquals`END`PUN(`END`PLNmsg`END`PUN:`END`PLNString`END`PUN;`END`PLN expect`END`PUN,`END`PLN act`END`PUN:`END`PLNLongint`END`PUN);`END`PLN
+`END`KWDVAR`END`PLN ex`END`PUN,`END`PLN ac`END`PUN:`END`PLNString`END`PUN;`END`PLN
+`END`KWDBEGIN`END`PLN
+  `END`KWDIF`END`PLN expect `END`PUN&lt;&gt;`END`PLN act `END`KWDTHEN`END`PLN
+  `END`KWDBEGIN`END`PLN
+    Str`END`PUN(`END`PLNexpect`END`PUN,`END`PLN ex`END`PUN);`END`PLN
+    Fail`END`PUN(`END`PLNConcat`END`PUN(`END`PLNmsg`END`PUN,`END`STR' expected '`END`PUN,`END`PLNex`END`PUN,`END`STR' but was '`END`PUN,`END`PLNac`END`PUN));`END`PLN
+  `END`KWDEND`END`PUN;`END`PLN
+
+  factors `END`PUN:=`END`PLN new`END`PUN(`END`PLNArrayListPtr`END`PUN,`END`PLN Init`END`PUN);`END`PLN
+
+  `END`KWDFOR`END`PLN candidate `END`PUN:=`END`PLN `END`LIT2`END`PLN `END`KWDTO`END`PLN i `END`KWDDO`END`PLN
+  `END`KWDBEGIN`END`PLN
+    `END`KWDWHILE`END`PLN i `END`KWDMOD`END`PLN candidate `END`PUN=`END`PLN `END`LIT0`END`PLN `END`KWDDO`END`PLN
+    `END`KWDBEGIN`END`PLN
+      factors`END`PUN^.`END`PLNAdd`END`PUN(`END`PLNcandidate`END`PUN);`END`PLN
+      i `END`PUN:=`END`PLN i `END`KWDDIV`END`PLN candidate`END`PUN;`END`PLN
+    `END`KWDEND`END`PUN;`END`PLN
+  `END`KWDEND`END`PUN;`END`PLN
+`END`KWDEND`END`PUN;`END'
diff --git a/test/prettify/PrettifyTest/source/basic_lang.txt b/test/prettify/PrettifyTest/source/basic_lang.txt
new file mode 100644
index 0000000..cfe52c6
--- /dev/null
+++ b/test/prettify/PrettifyTest/source/basic_lang.txt
@@ -0,0 +1,9 @@
+200 REM ----- method teardown
+210 PRINT "green"
+220 RETURN
+470 IF af=0 THEN GOTO 520
+480 FOR j=1 TO af
+500 ac=pf(j) : me$=STR$(j)+". factor" : GOSUB 100
+510 NEXT
+530 RETURN
+1000 DATA "one", 1, 0
\ No newline at end of file
diff --git a/test/prettify/PrettifyTest/source/pascal_lang.txt b/test/prettify/PrettifyTest/source/pascal_lang.txt
new file mode 100644
index 0000000..2132a35
--- /dev/null
+++ b/test/prettify/PrettifyTest/source/pascal_lang.txt
@@ -0,0 +1,21 @@
+(* some comment here *)
+PROCEDURE TestCase.AssertEquals(msg:String; expect, act:Longint);
+VAR ex, ac:String;
+BEGIN
+  IF expect <> act THEN
+  BEGIN
+    Str(expect, ex);
+    Fail(Concat(msg,' expected ',ex,' but was ',ac));
+  END;
+
+  factors := new(ArrayListPtr, Init);
+
+  FOR candidate := 2 TO i DO
+  BEGIN
+    WHILE i MOD candidate = 0 DO
+    BEGIN
+      factors^.Add(candidate);
+      i := i DIV candidate;
+    END;
+  END;
+END;
\ No newline at end of file