Syntax highlighting for PL/SQL, PL/PgSQL, PL/PHP, PL/Ruby, PL/Java, PL/J, PL/Python...
authorchriskl <chriskl>
Wed, 25 Aug 2004 07:47:30 +0000 (07:47 +0000)
committerchriskl <chriskl>
Wed, 25 Aug 2004 07:47:30 +0000 (07:47 +0000)
CREDITS
HISTORY
classes/Misc.php
classes/database/Postgres.php
functions.php
libraries/highlight.php [new file with mode: 0644]
themes/default/global.css

diff --git a/CREDITS b/CREDITS
index 3b33ef359b7b18bf18fe8b272a40ac16bdd2ffbf..a3bf90caa9a281be9e89528714bb932f8b1f57d7 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -48,3 +48,7 @@ Contributors
 - Bryan Encina (SQL window improvements, bug fixes, admin)
 - Dan Boren (Object comments)
 
+Third Party Libraries
+
+- Highlight.php (Jacob D. Cohen of rafb.net)
+
diff --git a/HISTORY b/HISTORY
index 0c7f719212c9e233ef05aa0c826e3551c014f7dd..d51e4e5b28df0d7b6edaf3a12f4f15b8b5421360 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -23,6 +23,9 @@ Features
 * pg_dumpall integration.  Now you can download the entire cluster via
   phpPgAdmin.
 * Show line numbers when viewing functions
+* Syntax highlighting for PL/SQL, PL/PgSQL, PL/PHP, PL/Ruby, PL/Java, 
+  PL/J, PL/Python and PL/Perl functions, thanks to Jacob D. Cohen's
+  BSD-licensed highlighting code on rafb.net
 
 Translations
 * Arabic from Zaki
index b0ee311621309f699f19d12e42cb084fddeba4f4..6ace37da6520e347a712a1bc6ad08f75949eee1b 100644 (file)
@@ -2,7 +2,7 @@
        /**
         * Class to hold various commonly used functions
         *
-        * $Id: Misc.php,v 1.85 2004/08/24 08:59:51 chriskl Exp $
+        * $Id: Misc.php,v 1.86 2004/08/25 07:47:34 chriskl Exp $
         */
         
        class Misc {
                                        $tag = 'pre';
                                        $out = htmlspecialchars($str);
                                        break;
+                               case 'prenoescape':
+                                       $tag = 'pre';
+                                       $out = $str;
+                                       break;
                                case 'nbsp':
                                        $out = nl2br(str_replace(' ', '&nbsp;', htmlspecialchars($str)));
                                        break;
index 7717d3e7908942e9bad2debe50fd1fa329d9e431..47388c5de71aed606ed6d77058d2244f2c174fd5 100755 (executable)
@@ -4,7 +4,7 @@
  * A class that implements the DB interface for Postgres
  * Note: This class uses ADODB and returns RecordSets.
  *
- * $Id: Postgres.php,v 1.243 2004/08/03 16:16:01 soranzo Exp $
+ * $Id: Postgres.php,v 1.244 2004/08/25 07:47:34 chriskl Exp $
  */
 
 // @@@ THOUGHT: What about inherits? ie. use of ONLY???
@@ -83,6 +83,34 @@ class Postgres extends ADODB_base {
                'WIN1256' => 'CP1256'
        );
        
+       // Map of internal language name to syntax highlighting name
+       var $langmap = array(
+               'sql' => 'SQL',
+               'plpgsql' => 'SQL',
+               'php' => 'PHP',
+               'phpu' => 'PHP',
+               'plphp' => 'PHP',
+               'plphpu' => 'PHP',
+               'perl' => 'Perl',
+               'perlu' => 'Perl',
+               'plperl' => 'Perl',
+               'plperlu' => 'Perl',
+               'java' => 'Java',
+               'javau' => 'Java',
+               'pljava' => 'Java',
+               'pljavau' => 'Java',
+               'plj' => 'Java',
+               'plju' => 'Java',
+               'python' => 'Python',
+               'pythonu' => 'Python',
+               'plpython' => 'Python',
+               'plpythonu' => 'Python',
+               'ruby' => 'Ruby',
+               'rubyu' => 'Ruby',
+               'plruby' => 'Ruby',
+               'plrubyu' => 'Ruby'
+       );
+       
        // List of all legal privileges that can be applied to different types
        // of objects.
        var $privlist = array(
index f0fcb002002e1cfa4977ee5a325832b64b89ca8a..471636c5b0327ef001cf40a1b5a145854430f905 100644 (file)
@@ -3,7 +3,7 @@
        /**
         * Manage functions in a database
         *
-        * $Id: functions.php,v 1.41 2004/08/24 08:59:51 chriskl Exp $
+        * $Id: functions.php,v 1.42 2004/08/25 07:47:34 chriskl Exp $
         */
 
        // Include application functions
                                $i = 0;
                                for ($i = 0; $i < sizeof($args_arr); $i++) {
                                        if ($i != 0) $args .= ', ';
-                                       $data->fieldClean($names_arr[$i]);                                      
-                                       $args .= '"' . $names_arr[$i] . '" ' . $args_arr[$i];
+                                       if (isset($names_arr[$i]) && $names_arr[$i] != '') {
+                                               $data->fieldClean($names_arr[$i]);                                      
+                                               $args .= '"' . $names_arr[$i] . '" ';
+                                       }
+                                       $args .= $args_arr[$i];
                                }
                        }
                        else {
                                $i = 0;
                                for ($i = 0; $i < sizeof($args_arr); $i++) {
                                        if ($i != 0) $args .= ', ';
-                                       $data->fieldClean($names_arr[$i]);                                      
-                                       $args .= '"' . $names_arr[$i] . '" ' . $args_arr[$i];
+                                       if (isset($names_arr[$i]) && $names_arr[$i] != '') {
+                                               $data->fieldClean($names_arr[$i]);                                      
+                                               $args .= '"' . $names_arr[$i] . '" ';
+                                       }
+                                       $args .= $args_arr[$i];
                                }
                        }
                        else {
                                echo "<tr><th class=\"data\" colspan=\"4\">{$lang['strlinksymbol']}</th></tr>\n";
                                echo "<tr><td class=\"data1\" colspan=\"4\">", $misc->printVal($funcdata->f['prosrc']), "</td></tr>\n";
                        } else {
+                               include_once('./libraries/highlight.php');              
                                echo "<tr><th class=\"data\" colspan=\"4\">{$lang['strdefinition']}</th></tr>\n";
-                               echo "<tr><td class=\"data1\" colspan=\"4\">", $misc->printVal($funcdata->f['prosrc'], 'pre', array('lineno' => true, 'class' => 'data1')), "</td></tr>\n";
+                               // Check to see if we have syntax highlighting for this language
+                               if (isset($data->langmap[$funcdata->f['prolanguage']])) {
+                                       $temp = syntax_highlight(htmlspecialchars($funcdata->f['prosrc']), $data->langmap[$funcdata->f['prolanguage']]);
+                                       $tag = 'prenoescape';
+                               }
+                               else {
+                                       $temp = &$funcdata->f['prosrc'];
+                                       $tag = 'pre';
+                               }
+                               echo "<tr><td class=\"data1\" colspan=\"4\">", $misc->printVal($temp, $tag, array('lineno' => true, 'class' => 'data1')), "</td></tr>\n";
                        }
                        
                        // Show flags
diff --git a/libraries/highlight.php b/libraries/highlight.php
new file mode 100644 (file)
index 0000000..def328e
--- /dev/null
@@ -0,0 +1,1114 @@
+<?
+/* This software is licensed through a BSD-style License.
+ * http://www.opensource.org/licenses/bsd-license.php
+
+Copyright (c) 2003, 2004, Jacob D. Cohen
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+Neither the name of Jacob D. Cohen nor the names of his contributors
+may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+function keyword_replace($keywords, $text, $ncs = false)
+{
+    $cm = ($ncs)? "i" : "";
+    foreach ($keywords as $keyword)
+    {
+        $search[]  = "/(\\b$keyword\\b)/" . $cm;
+        $replace[] = '<span class="keyword">\\0</span>';
+    }
+
+    $search[]  = "/(\\bclass\s)/";
+    $replace[] = '<span class="keyword">\\0</span>';
+
+    return preg_replace($search, $replace, $text);
+}
+
+
+function preproc_replace($preproc, $text)
+{
+    foreach ($preproc as $proc)
+    {
+        $search[] = "/(\\s*#\s*$proc\\b)/";
+        $replace[] = '<span class="keyword">\\0</span>';
+    }
+
+    return preg_replace($search, $replace, $text);
+}
+
+
+function sch_syntax_helper($text)
+{
+    return $text;
+}
+
+
+function syntax_highlight_helper($text, $language)
+{
+    $preproc = array();
+    $preproc["C++"] = array(
+    "if",    "ifdef",   "ifndef", "elif",  "else",
+    "endif", "include", "define", "undef", "line",
+    "error", "pragma");
+    $preproc["C89"] = & $preproc["C++"];
+    $preproc["C"] = & $preproc["C89"];
+
+    $keywords = array(
+    "C++" => array(
+    "asm",          "auto",      "bool",     "break",            "case",
+    "catch",        "char",      /*class*/   "const",            "const_cast",
+    "continue",     "default",   "delete",   "do",               "double",
+    "dynamic_cast", "else",      "enum",     "explicit",         "export",
+    "extern",       "false",     "float",    "for",              "friend",
+    "goto",         "if",        "inline",   "int",              "long",
+    "mutable",      "namespace", "new",      "operator",         "private",
+    "protected",    "public",    "register", "reinterpret_cast", "return",
+    "short",        "signed",    "sizeof",   "static",           "static_cast",
+    "struct",       "switch",    "template", "this",             "throw", 
+    "true",         "try",       "typedef",  "typeid",           "typename",
+    "union",        "unsigned",  "using",    "virtual",          "void",
+    "volatile",     "wchar_t",   "while"),
+
+    "C89" => array(
+    "auto",     "break",    "case",     "char",     "const",
+    "continue", "default",  "do",       "double",   "else",
+    "enum",     "extern",   "float",    "for",      "goto",
+    "if",       "int",      "long",     "register", "return",
+    "short",    "signed",   "sizeof",   "static",   "struct",
+    "switch",   "typedef",  "union",    "unsigned", "void",
+    "volatile", "while"),
+
+    "C" => array(
+    "auto",     "break",    "case",     "char",     "const",
+    "continue", "default",  "do",       "double",   "else",
+    "enum",     "extern",   "float",    "for",      "goto",
+    "if",       "int",      "long",     "register", "return",
+    "short",    "signed",   "sizeof",   "static",   "struct",
+    "switch",   "typedef",  "union",    "unsigned", "void",
+    "volatile", "while",    "__restrict","_Bool"),
+
+    "PHP" => array(
+    "and",          "or",           "xor",      "__FILE__",     "__LINE__",
+    "array",        "as",           "break",    "case",         "cfunction",
+    /*class*/       "const",        "continue", "declare",      "default",
+    "die",          "do",           "echo",     "else",         "elseif",
+    "empty",        "enddeclare",   "endfor",   "endforeach",   "endif",
+    "endswitch",    "endwhile",     "eval",     "exit",         "extends",
+    "for",          "foreach",      "function", "global",       "if",
+    "include",      "include_once", "isset",    "list",         "new",
+    "old_function", "print",        "require",  "require_once", "return",
+    "static",       "switch",       "unset",    "use",          "var",
+    "while",        "__FUNCTION__", "__CLASS__"),
+
+    "Perl" => array(
+    "-A",           "-B",           "-C",       "-M",           "-O",
+    "-R",           "-S",           "-T",       "-W",           "-X",
+    "-b",           "-c",           "-d",       "-e",           "-f",
+    "-g",           "-k",           "-l",       "-o",           "-p",
+    "-r",           "-s",           "-t",       "-u",           "-w",
+    "-x",           "-z",           "ARGV",     "DATA",         "ENV",
+    "SIG",          "STDERR",       "STDIN",    "STDOUT",       "atan2",
+    "bind",         "binmode",      "bless",    "caller",       "chdir",
+    "chmod",        "chomp",        "chop",     "chown",        "chr",
+    "chroot",       "close",        "closedir", "cmp",          "connect",
+    "continue",     "cos",          "crypt",    "dbmclose",     "dbmopen",
+    "defined",      "delete",       "die",      "do",           "dump",
+    "each",         "else",         "elsif",    "endgrent",     "endhostent",
+    "endnetent",    "endprotent",   "endpwent", "endservent",   "eof",
+    "eq",           "eval",         "exec",     "exists",       "exit",
+    "exp",          "fcntl",        "fileno",   "flock",        "for",
+    "foreach",      "fork",         "format",   "formline",     "ge",
+    "getc",         "getgrent",     "getgrid",  "getgrnam",     "gethostbyaddr",
+    "gethostbyname","gethostent",   "getlogin", "getnetbyaddr", "getnetbyname",
+    "getnetent",    "getpeername",  "getpgrp",  "getppid",      "getpriority",
+    "getprotobyname","getprotobynumber","getprotoent","getpwent","getpwnam",
+    "getpwuid",     "getservbyname","getservbyport","getservent","getsockname",
+    "getsockopt",   "glob",         "gmtime",   "goto",         "grep",
+    /*gt*/          "hex",          "if",       "import",       "index",
+    "int",          "ioctl",        "join",     "keys",         "kill",
+    "last",         "lc",           "lcfirst",  "le",           "length",
+    "link",         "listen",       "local",    "localtime",    "log",
+    "lstat",        /*lt*/          "m",        "map",          "mkdir",
+    "msgctl",       "msgget",       "msgrcv",   "msgsnd",       "my",
+    "ne",           "next",         "no",       "oct",          "open",
+    "opendir",      "ord",          "pack",     "package",      "pipe",
+    "pop",          "pos",          "print",    "printf",       "push",
+    "q",            "qq",           "quotemeta","qw",           "qx",
+    "rand",         "read",         "readdir",  "readlink",     "recv",
+    "redo",         "ref",          "refname",  "require",      "reset",
+    "return",       "reverse",      "rewinddir","rindex",       "rmdir",
+    "s",            "scalar",       "seek",     "seekdir",      "select",
+    "semctl",       "semget",       "semop",    "send",         "setgrent",
+    "sethostent",   "setnetent",    "setpgrp",  "setpriority",  "setprotoent",
+    "setpwent",     "setservent",   "setsockopt","shift",       "shmctl",
+    "shmget",       "shmread",      "shmwrite", "shutdown",     "sin",
+    "sleep",        "socket",       "socketpair","sort",        "splice",
+    "split",        "sprintf",      "sqrt",     "srand",        "stat",
+    "study",        "sub",          "substr",   "symlink",      "syscall",
+    "sysopen",      "sysread",      "system",   "syswrite",     "tell",
+    "telldir",      "tie",          "tied",     "time",         "times",
+    "tr",           "truncate",     "uc",       "ucfirst",      "umask",
+    "undef",        "unless",       "unlink",   "unpack",       "unshift",
+    "untie",        "until",        "use",      "utime",        "values",
+    "vec",          "wait",         "waitpid",  "wantarray",    "warn", 
+    "while",        "write",        "y",        "or",           "and",
+    "not"),
+
+    "Java" => array(
+    "abstract",     "boolean",      "break",    "byte",         "case",
+    "catch",        "char",         /*class*/   "const",        "continue",
+    "default",      "do",           "double",   "else",         "extends",
+    "final",        "finally",      "float",    "for",          "goto",
+    "if",           "implements",   "import",   "instanceof",   "int",
+    "interface",    "long",         "native",   "new",          "package",
+    "private",      "protected",    "public",   "return",       "short",
+    "static",       "strictfp",     "super",    "switch",       "synchronized",
+    "this",         "throw",        "throws",   "transient",    "try",
+    "void",         "volatile",     "while"),
+
+    "VB" => array(
+    "AddressOf",    "Alias",        "And",      "Any",          "As",
+    "Binary",       "Boolean",      "ByRef",    "Byte",         "ByVal",
+    "Call",         "Case",         "CBool",    "CByte",        "CCur",
+    "CDate",        "CDbl",         "CInt",     "CLng",         "Close",
+    "Const",        "CSng",         "CStr",     "Currency",     "CVar",
+    "CVErr",        "Date",         "Debug",    "Declare",      "DefBool",
+    "DefByte",      "DefCur",       "DefDate",  "DefDbl",       "DefInt",
+    "DefLng",       "DefObj",       "DefSng",   "DefStr",       "DefVar",
+    "Dim",          "Do",           "Double",   "Each",         "Else",
+    "End",          "Enum",         "Eqv",      "Erase",        "Error",
+    "Event",        "Exit",         "For",      "Friend",       "Function",
+    "Get",          "Get",          "Global",   "GoSub",        "GoTo",
+    "If",           "Imp",          "Implements","In",          "Input",
+    "Integer",      "Is",           "LBound",   "Len",          "Let",
+    "Lib",          "Like",         "Line",     "Lock",         "Long",
+    "Loop",         "LSet",         "Mod",      "Name",         "Next",
+    "Not",          "Nothing",      "Null",     "Object",       "On",
+    "Open",         "Option Base 1","Option Compare Binary",
+    "Option Compare Database", "Option Compare Text", "Option Explicit",
+    "Option Private Module", "Optional",        "Or",           "Output",
+    "ParamArray",   "Preserve",     "Print",    "Private",      "Property",
+    "Public",       "Put",          "RaiseEvent","Random",      "Read",
+    "ReDim",        "Resume",       "Return",   "RSet",         "Seek",
+    "Select",       "Set",          "Single",   "Spc",          "Static",
+    "Step",         "Stop",         "String",   "Sub",          "Tab",
+    "Then",         "To",           "Type",     "UBound",       "Unlock",
+    "Variant",      "Wend",         "While",    "With",         "WithEvents",
+    "Write",        "Xor"),
+
+    "C#" => array(
+    "abstract",     "as",           "base",     "bool",         "break",
+    "byte",         "case",         "catch",    "char",         "checked",
+    /*class*/       "const",        "continue", "decimal",      "default",
+    "delegate",     "do",           "double",   "else",         "enum",
+    "event",        "explicit",     "extern",   "false",        "finally",
+    "fixed",        "float",        "for",      "foreach",      "goto",
+    "if",           "implicit",     "in",       "int",          "interface",
+    "internal",     "is",           "lock",     "long",         "namespace",
+    "new",          "null",         "object",   "operator",     "out",
+    "override",     "params",       "private",  "protected",    "public",
+    "readonly",     "ref",          "return",   "sbyte",        "sealed",
+    "short",        "sizeof",       "stackalloc","static",      "string",
+    "struct",       "switch",       "this",     "throw",        "true",
+    "try",          "typeof",       "uint",     "ulong",        "unchecked",
+    "unsafe",       "ushort",       "using",    "virtual",      "volatile",
+    "void",         "while"),
+    
+    "Ruby" => array(
+    "alias",        "and",          "begin",    "break",        "case",
+    /*class*/       "def",          "defined",  "do",           "else",
+    "elsif",        "end",          "ensure",   "false",        "for",
+    "if",           "in",           "module",   "next",         "module",
+    "next",         "nil",          "not",      "or",           "redo",
+    "rescue",       "retry",        "return",   "self",         "super",
+    "then",         "true",         "undef",    "unless",       "until",
+    "when",         "while",        "yield"),
+
+    "Python" => array(
+    "and",          "assert",       "break",    /*"class",*/    "continue",
+    "def",          "del",          "elif",     "else",         "except",
+    "exec",         "finally",      "for",      "from",         "global",
+    "if",           "import",       "in",       "is",           "lambda",
+    "not",          "or",           "pass",     "print",        "raise",
+    "return",       "try",          "while",    "yield"),
+
+    "Pascal" => array(
+    "Absolute",     "Abstract",     "All",      "And",          "And_then",
+    "Array",        "Asm",          "Begin",    "Bindable",     "Case",
+    /*"Class",*/    "Const",        "Constructor","Destructor", "Div",
+    "Do",           "Downto",       "Else",     "End",          "Export",
+    "File",         "For",          "Function", "Goto",         "If",
+    "Import",       "Implementation","Inherited","In",          "Inline",
+    "Interface",    "Is",           "Label",    "Mod",          "Module",
+    "Nil",          "Not",          "Object",   "Of",           "Only",
+    "Operator",     "Or",           "Or_else",  "Otherwise",    "Packed",
+    "Pow",          "Procedure",    "Program",  "Property",     "Protected",
+    "Qualified",    "Record",       "Repeat",   "Restricted",   "Set",
+    "Shl",          "Shr",          "Then",     "To",           "Type",
+    "Unit",         "Until",        "Uses",     "Value",        "Var",
+    "View",         "Virtual",      "While",    "With",         "Xor"),
+
+    "mIRC" => array(
+        ),
+
+    "PL/I" => array(
+    "A",            "ABS",            "ACOS",        "%ACTIVATE",    "ACTUALCOUNT", 
+    "ADD",            "ADDR",            "ADDREL",    "ALIGNED",        "ALLOCATE", 
+    "ALLOC",        "ALLOCATION",    "ALLOCN",    "ANY",            "ANYCONDITION", 
+    "APPEND",        "AREA",            "ASIN",        "ATAN",            "ATAND", 
+    "ATANH",        "AUTOMATIC",    "AUTO",        "B",            "B1", 
+    "B2",            "B3",            "B4",        "BACKUP_DATE",    "BASED", 
+    "BATCH",        "BEGIN",        "BINARY",    "BIN",            "BIT",
+    "BLOCK_BOUNDARY_FORMAT",        "BLOCK_IO",    "BLOCK_SIZE",    "BOOL",
+    "BUCKET_SIZE",    "BUILTIN",        "BY",        "BYTE",            "BYTESIZE",
+    "CALL",            "CANCEL_CONTROL_O",            "CARRIAGE_RETURN_FORMAT",
+    "CEIL",            "CHAR", "CHARACTER",    "CLOSE",    "COLLATE",        "COLUMN",
+    "CONDITION",    "CONTIGUOUS",    "CONTIGUOUS_BEST_TRY",        "CONTROLLED",
+    "CONVERSION",    "COPY",            "COS",        "COSD",            "COSH",
+    "CREATION_DATE",                "CURRENT_POSITION",            "DATE",
+    "DATETIME",        "%DEACTIVATE",    "DECIMAL",    "DEC",            "%DECLARE",
+    "%DCL",            "DECLARE",        "DCL",        "DECODE",        "DEFAULT_FILE_NAME",
+    "DEFERRED_WRITE",                "DEFINED",    "DEF",            "DELETE",
+    "DESCRIPTOR",    "%DICTIONARY",    "DIMENSION","DIM",           "DIRECT",
+    "DISPLAY",        "DIVIDE",        "%DO",        "DO",            "E",
+    "EDIT",            "%ELSE",        "ELSE",        "EMPTY",        "ENCODE",
+    "%END",            "END",            "ENDFILE",    "ENDPAGE",        "ENTRY",
+    "ENVIRONMENT",    "ENV",            "%ERROR",    "ERROR",        "EVERY",
+    "EXP",            "EXPIRATION_DATE",            "EXTEND",        "EXTENSION_SIZE",
+    "EXTERNAL",        "EXT",            "F",        "FAST_DELETE",    "%FATAL",
+    "FILE",            "FILE_ID",        "FILE_ID_TO",                "FILE_SIZE",
+    "FINISH",        "FIXED",        "FIXEDOVERFLOW",            "FOFL",
+    "FIXED_CONTROL_FROM",            "FIXED_CONTROL_SIZE",        "FIXED_CONTROL_SIZE_TO",
+    "FIXED_CONTROL_TO",                "FIXED_LENGTH_RECORDS",        "FLOAT",
+    "FLOOR",        "FLUSH",        "FORMAT",    "FREE",            "FROM",
+    "GET",            "GLOBALDEF",    "GLOBALREF",                "%GOTO",
+    "GOTO",            "GO", "TO",        "GROUP_PROTETION",            "HBOUND",
+    "HIGH",            "INDENT",        "%IF",        "IF",            "IGNORE_LINE_MARKS",
+    "IN",            "%INCLUDE",        "INDEX",    "INDEXED",        "INDEX_NUMBER",
+    "%INFORM",        "INFORM",        "INITIAL",    "INIT",            "INITIAL_FILL",
+    "INPUT",        "INT",            "INTERNAL",    "INTO",            "KEY",
+    "KEYED",        "KEYFROM",        "KEYTO",    "LABEL",        "LBOUND",
+    "LEAVE",        "LENGTH",        "LIKE",        "LINE",            "LINENO",
+    "LINESIZE",        "%LIST",        "LIST",        "LOCK_ON_READ",    "LOCK_ON_WRITE",
+    "LOG",            "LOG10",        "LOG2",        "LOW",            "LTRIM",
+    "MAIN",            "MANUAL_UNLOCKING",            "MATCH_GREATER",
+    "MATCH_GREATER_EQUAL",            "MATCH_NEXT",                "MATCH_NEXT_EQUAL",
+    "MAX",            "MAXIMUM_RECORD_NUMBER",    "MAXIMUM_RECORD_SIZE",
+    "MAXLENGTH",    "MEMBER",        "MIN",        "MOD",            "MULTIBLOCK_COUNT",
+    "MULTIBUFFER_COUNT",            "MULTIPLY",    "NEXT_VOLUME",    "%NOLIST",
+    "NOLOCK",        "NONEXISTENT_RECORD",        "NONRECURSIVE",    "NONVARYING",
+    "NONVAR",        "NORESCAN",        "NO_ECHO",    "NO_FILTER",    "NO_SHARE",
+    "NULL",            "OFFSET",        "ON",        "ONARGSLIST",    "ONCHAR",
+    "ONCODE",        "ONFILE",        "ONKEY",    "ONSOURCE",        "OPEN",
+    "OPTIONAL",        "OPTIONS",        "OTHERWISE","OTHER",        "OUTPUT",
+    "OVERFLOW",        "OFL",            "OWNER_GROUP",                "OWNER_ID",
+    "OWNER_MEMBER",    "OWNER_PROTECTION",            "P",            "%PAGE",
+    "PAGE",            "PAGENO",        "PAGESIZE",    "PARAMETER",    "PARM",
+    "PICTURE",        "PIC",            "POINTER",    "PTR",            "POSINT",
+    "POSITION",        "POS",            "PRECISION","PREC",            "PRESENT",
+    "PRINT",        "PRINTER_FORMAT",            "%PROCEDURE",    "%PROC",
+    "PROCEDURE",    "PROC",            "PROD",        "PROMPT",        "PURGE_TYPE_AHEAD",
+    "PUT",            "R",            "RANK",        "READ",            "READONLY",
+    "READ_AHEAD",    "READ_CHECK",    "READ_REGARDLESS",            "RECORD",
+    "RECORD_ID",    "RECORD_ID_ACCESS",            "RECORD_ID_TO",    "RECURSIVE",
+    "REFER",        "REFERENCE",    "RELEASE",    "REPEAT",        "%REPLACE",
+    "RESCAN",        "RESIGNAL",        "RETRIEVAL_POINTERS",        "%RETURN",
+    "RETURN",        "RETURNS",        "REVERSE",    "REVERT",        "REVISION_DATE",
+    "REWIND",        "REWIND_ON_CLOSE",            "REWIND_ON_OPEN",
+    "REWRITE",        "ROUND",        "RTRIM",    "%SBTTL",        "SCALARVARYING",
+    "SEARCH",        "SELECT",        "SEQUENTIAL",                "SEQL",
+    "SET",            "SHARED_READ",    "SHARED_WRITE",                "SIGN",
+    "SIGNAL",        "SIN",            "SIND",        "SINH",            "SIZE",
+    "SKIP",            "SNAP",            "SOME",        "SPACEBLOCK",    "SPOOL",
+    "SQRT",            "STATEMENT",    "STATIC",    "STOP",            "STORAGE",
+    "STREAM",        "STRING",        "STRINGRANGE",                "STRG",
+    "STRUCTURE",    "SUBSCRIPTRANGE",            "SUBRG",        "SUBSTR",
+    "SUBTRACT",        "SUM",            "SUPERCEDE","SYSIN",        "SYSPRINT",
+    "SYSTEM",        "SYSTEM_PROTECTION",        "TAB",            "TAN",
+    "TAND",            "TANH",            "TEMPORARY","%THEN",        "THEN",
+    "TIME",            "TIMEOUT_PERIOD",            "%TITLE",        "TITLE",
+    "TO",            "TRANSLATE",    "TRIM",        "TRUNC",        "TRUNCATE",
+    "UNALIGNED",    "UNAL",            "UNDEFINED","UNDF",            "UNDERFLOW",
+    "UFL",            "UNION",        "UNSPEC",    "UNTIL",        "UPDATE",
+    "USER_OPEN",    "VALID",        "VALUE",    "VAL",            "VARIABLE",
+    "VARIANT",        "VARYING",        "VAR",        "VAXCONDITION",    "VERIFY",
+    "WAIT_FOR_RECORD",                "%WARN",    "WARN",            "WHEN",    
+    "WHILE",        "WORLD_PROTECTION",            "WRITE",        "WRITE_BEHIND",
+    "WRITE_CHECK",    "X",            "ZERODIVIDE"),
+
+    "SQL" => array(
+    "abort", "abs", "absolute", "access",
+    "action", "ada", "add", "admin",
+    "after", "aggregate", "alias", "all",
+    "allocate", "alter", "analyse", "analyze",
+    "and", "any", "are", "array",
+    "as", "asc", "asensitive", "assertion",
+    "assignment", "asymmetric", "at", "atomic",
+    "authorization", "avg", "backward", "before",
+    "begin", "between", "bigint", "binary",
+    "bit", "bitvar", "bit_length", "blob",
+    "boolean", "both", "breadth", "by",
+    "c", "cache", "call", "called",
+    "cardinality", "cascade", "cascaded", "case",
+    "cast", "catalog", "catalog_name", "chain",
+    "char", "character", "characteristics", "character_length",
+    "character_set_catalog", "character_set_name", "character_set_schema", "char_length",
+    "check", "checked", "checkpoint", /* "class", */
+    "class_origin", "clob", "close", "cluster",
+    "coalesce", "cobol", "collate", "collation",
+    "collation_catalog", "collation_name", "collation_schema", "column",
+    "column_name", "command_function", "command_function_code", "comment",
+    "commit", "committed", "completion", "condition_number",
+    "connect", "connection", "connection_name", "constraint",
+    "constraints", "constraint_catalog", "constraint_name", "constraint_schema",
+    "constructor", "contains", "continue", "conversion",
+    "convert", "copy", "corresponding", "count",
+    "create", "createdb", "createuser", "cross",
+    "cube", "current", "current_date", "current_path",
+    "current_role", "current_time", "current_timestamp", "current_user",
+    "cursor", "cursor_name", "cycle", "data",
+    "database", "date", "datetime_interval_code", "datetime_interval_precision",
+    "day", "deallocate", "dec", "decimal",
+    "declare", "default", "defaults", "deferrable",
+    "deferred", "defined", "definer", "delete",
+    "delimiter", "delimiters", "depth", "deref",
+    "desc", "describe", "descriptor", "destroy",
+    "destructor", "deterministic", "diagnostics", "dictionary",
+    "disconnect", "dispatch", "distinct", "do",
+    "domain", "double", "drop", "dynamic",
+    "dynamic_function", "dynamic_function_code", "each", "else",
+    "encoding", "encrypted", "end", "end-exec",
+    "equals", "escape", "every", "except",
+    "exception", "excluding", "exclusive", "exec",
+    "execute", "existing", "exists", "explain",
+    "external", "extract", "false", "fetch",
+    "final", "first", "float", "for",
+    "force", "foreign", "fortran", "forward",
+    "found", "free", "freeze", "from",
+    "full", "function", "g", "general",
+    "generated", "get", "global", "go",
+    "goto", "grant", "granted", "group",
+    "grouping", "handler", "having", "hierarchy",
+    "hold", "host", "hour", "identity",
+    "ignore", "ilike", "immediate", "immutable",
+    "implementation", "implicit", "in", "including",
+    "increment", "index", "indicator", "infix",
+    "inherits", "initialize", "initially", "inner",
+    "inout", "input", "insensitive", "insert",
+    "instance", "instantiable", "instead", "int",
+    "integer", "intersect", "interval", "into",
+    "invoker", "is", "isnull", "isolation",
+    "iterate", "join", "k", "key",
+    "key_member", "key_type", "lancompiler", "language",
+    "large", "last", "lateral", "leading",
+    "left", "length", "less", "level",
+    "like", "limit", "listen", "load",
+    "local", "localtime", "localtimestamp", "location",
+    "locator", "lock", "lower", "m",
+    "map", "match", "max", "maxvalue",
+    "message_length", "message_octet_length", "message_text", "method",
+    "min", "minute", "minvalue", "mod",
+    "mode", "modifies", "modify", "module",
+    "month", "more", "move", "mumps",
+    "name", "names", "national", "natural",
+    "nchar", "nclob", "new", "next",
+    "no", "nocreatedb", "nocreateuser", "none",
+    "not", "nothing", "notify", "notnull",
+    "null", "nullable", "nullif", "number",
+    "numeric", "object", "octet_length", "of",
+    "off", "offset", "oids", "old",
+    "on", "only", "open", "operation",
+    "operator", "option", "options", "or",
+    "order", "ordinality", "out", "outer",
+    "output", "overlaps", "overlay", "overriding",
+    "owner", "pad", "parameter", "parameters",
+    "parameter_mode", "parameter_name", "parameter_ordinal_position", "parameter_specific_catalog",
+    "parameter_specific_name", "parameter_specific_schema", "partial", "pascal",
+    "password", "path", "pendant", "placing",
+    "pli", "position", "postfix", "precision",
+    "prefix", "preorder", "prepare", "preserve",
+    "primary", "prior", "privileges", "procedural",
+    "procedure", "public", "read", "reads",
+    "real", "recheck", "recursive", "ref",
+    "references", "referencing", "reindex", "relative",
+    "rename", "repeatable", "replace", "reset",
+    "restart", "restrict", "result", "return",
+    "returned_length", "returned_octet_length", "returned_sqlstate", "returns",
+    "revoke", "right", "role", "rollback",
+    "rollup", "routine", "routine_catalog", "routine_name",
+    "routine_schema", "row", "rows", "row_count",
+    "rule", "savepoint", "scale", "schema",
+    "schema_name", "scope", "scroll", "search",
+    "second", "section", "security", "select",
+    "self", "sensitive", "sequence", "serializable",
+    "server_name", "session", "session_user", "set",
+    "setof", "sets", "share", "show",
+    "similar", "simple", "size", "smallint",
+    "some", "source", "space", "specific",
+    "specifictype", "specific_name", "sql", "sqlcode",
+    "sqlerror", "sqlexception", "sqlstate", "sqlwarning",
+    "stable", "start", "state", "statement",
+    "static", "statistics", "stdin", "stdout",
+    "storage", "strict", "structure", "style",
+    "subclass_origin", "sublist", "substring", "sum",
+    "symmetric", "sysid", "system", "system_user",
+    "table", "table_name", "temp", "template",
+    "temporary", "terminate", "text", "than", "then",
+    "time", "timestamp", "timezone_hour", "timezone_minute",
+    "to", "toast", "trailing", "transaction",
+    "transactions_committed", "transactions_rolled_back", "transaction_active", "transform",
+    "transforms", "translate", "translation", "treat",
+    "trigger", "trigger_catalog", "trigger_name", "trigger_schema",
+    "trim", "true", "truncate", "trusted",
+    "type", "uncommitted", "under", "unencrypted",
+    "union", "unique", "unknown", "unlisten",
+    "unnamed", "unnest", "until", "update",
+    "upper", "usage", "user", "user_defined_type_catalog",
+    "user_defined_type_name", "user_defined_type_schema", "using", "vacuum",
+    "valid", "validator", "value", "values",
+    "varchar", "variable", "varying", "verbose",
+    "version", "view", "volatile", "when",
+    "whenever", "where", "with", "without",
+    "work", "write", "year", "zone")
+
+    );
+
+    $case_insensitive = array(
+        "VB" => true,
+        "Pascal" => true,
+        "PL/I"   => true,
+        "SQL"    => true
+    );
+    $ncs = false;
+    if (array_key_exists($language, $case_insensitive))
+        $ncs = true;
+
+    $text = (array_key_exists($language, $preproc))?
+        preproc_replace($preproc[$language], $text) :
+        $text;
+    $text = (array_key_exists($language, $keywords))?
+        keyword_replace($keywords[$language], $text, $ncs) :
+        $text;
+
+    return $text;
+}
+
+
+function rtrim1($span, $lang, $ch)
+{
+    return syntax_highlight_helper(substr($span, 0, -1), $lang);
+}
+
+
+function rtrim1_htmlesc($span, $lang, $ch)
+{
+    return htmlspecialchars(substr($span, 0, -1));
+}
+
+
+function sch_rtrim1($span, $lang, $ch)
+{
+    return sch_syntax_helper(substr($span, 0, -1));
+}
+
+
+function rtrim2($span, $lang, $ch)
+{
+    return substr($span, 0, -2);
+}
+
+
+function syn_proc($span, $lang, $ch)
+{
+    return syntax_highlight_helper($span, $lang);
+}
+
+function dash_putback($span, $lang, $ch)
+{
+    return syntax_highlight_helper('-' . $span, $lang);
+}
+
+function slash_putback($span, $lang, $ch)
+{
+    return syntax_highlight_helper('/' . $span, $lang);
+}
+
+function slash_putback_rtrim1($span, $lang, $ch)
+{
+    return rtrim1('/' . $span, $lang, $ch);
+}
+
+function lparen_putback($span, $lang, $ch)
+{
+    return syntax_highlight_helper('(' . $span, $lang);
+}
+
+function lparen_putback_rtrim1($span, $lang, $ch)
+{
+    return rtrim1('(' . $span, $lang, $ch);
+}
+
+function prepend_xml_opentag($span, $lang, $ch) 
+{                                               
+    return '<span class="xml_tag">&lt;' . $span;
+}                                               
+
+function proc_void($span, $lang, $ch)
+{
+    return $span;
+}
+
+
+/**
+ * Syntax highlight function
+ * Does the bulk of the syntax highlighting by lexing the input
+ * string, then calling the helper function to highlight keywords.
+ */
+function syntax_highlight($text, $language)
+{
+    if ($language == "Plain Text") return $text;
+
+    define("normal_text",   1, true);
+    define("dq_literal",    2, true);
+    define("dq_escape",     3, true);
+    define("sq_literal",    4, true);
+    define("sq_escape",     5, true);
+    define("slash_begin",   6, true);
+    define("star_comment",  7, true);
+    define("star_end",      8, true);
+    define("line_comment",  9, true);
+    define("html_entity",  10, true);
+    define("lc_escape",    11, true);
+    define("block_comment",12, true);
+    define("paren_begin",  13, true);
+    define("dash_begin",   14, true);
+    define("bt_literal",   15, true);
+    define("bt_escape",    16, true);
+    define("xml_tag_begin",17, true);
+    define("xml_tag",      18, true);
+    define("xml_pi",       19, true);
+    define("sch_normal",   20, true);
+    define("sch_stresc",    21, true);
+    define("sch_idexpr",   22, true);
+    define("sch_numlit",   23, true);
+    define("sch_chrlit",   24, true);
+    define("sch_strlit",   25, true);
+
+    $initial_state["Scheme"] = sch_normal;
+
+    $sch[sch_normal][0]     = sch_normal;
+    $sch[sch_normal]['"']   = sch_strlit;
+    $sch[sch_normal]["#"]   = sch_chrlit;
+    $sch[sch_normal]["0"]   = sch_numlit;
+    $sch[sch_normal]["1"]   = sch_numlit;
+    $sch[sch_normal]["2"]   = sch_numlit;
+    $sch[sch_normal]["3"]   = sch_numlit;
+    $sch[sch_normal]["4"]   = sch_numlit;
+    $sch[sch_normal]["5"]   = sch_numlit;
+    $sch[sch_normal]["6"]   = sch_numlit;
+    $sch[sch_normal]["7"]   = sch_numlit;
+    $sch[sch_normal]["8"]   = sch_numlit;
+    $sch[sch_normal]["9"]   = sch_numlit;
+
+    $sch[sch_strlit]['"']   = sch_normal;
+    $sch[sch_strlit]["\n"]  = sch_normal;
+    $sch[sch_strlit]["\\"]  = sch_stresc;
+    $sch[sch_strlit][0]     = sch_strlit;
+
+    $sch[sch_chrlit][" "]   = sch_normal;
+    $sch[sch_chrlit]["\t"]  = sch_normal;
+    $sch[sch_chrlit]["\n"]  = sch_normal;
+    $sch[sch_chrlit]["\r"]  = sch_normal;
+    $sch[sch_chrlit][0]     = sch_chrlit;
+
+    $sch[sch_numlit][" "]   = sch_normal;
+    $sch[sch_numlit]["\t"]  = sch_normal;
+    $sch[sch_numlit]["\n"]  = sch_normal;
+    $sch[sch_numlit]["\r"]  = sch_normal;
+    $sch[sch_numlit][0]     = sch_numlit;
+
+    //
+    // State transitions for C
+    //
+    $c89[normal_text]["\""] = dq_literal;
+    $c89[normal_text]["'"]  = sq_literal;
+    $c89[normal_text]["/"]  = slash_begin;
+    $c89[normal_text][0]    = normal_text;
+
+    $c89[dq_literal]["\""]  = normal_text;
+    $c89[dq_literal]["\n"]  = normal_text;
+    $c89[dq_literal]["\\"]  = dq_escape;
+    $c89[dq_literal][0]     = dq_literal;
+
+    $c89[dq_escape][0]      = dq_literal;
+
+    $c89[sq_literal]["'"]   = normal_text;
+    $c89[sq_literal]["\n"]  = normal_text;
+    $c89[sq_literal]["\\"]  = sq_escape;
+    $c89[sq_literal][0]     = sq_literal;
+
+    $c89[sq_escape][0]      = sq_literal;
+
+    $c89[slash_begin]["*"]  = star_comment;
+    $c89[slash_begin][0]    = normal_text;
+
+    $c89[star_comment]["*"] = star_end;
+    $c89[star_comment][0]   = star_comment;
+
+    $c89[star_end]["/"]     = normal_text;
+    $c89[star_end]["*"]     = star_end;
+    $c89[star_end][0]       = star_comment;
+
+    //
+    // State transitions for C++
+    // Inherit transitions from C, and add line comment support
+    //
+    $cpp = $c89;
+    $cpp[slash_begin]["/"]   = line_comment;
+    $cpp[line_comment]["\n"] = normal_text;
+    $cpp[line_comment]["\\"] = lc_escape;
+    $cpp[line_comment][0]    = line_comment;
+
+    $cpp[lc_escape]["\r"]    = lc_escape;
+    $cpp[lc_escape][0]       = line_comment;
+
+    //
+    // State transitions for C99.
+    // C99 supports line comments like C++
+    //
+    $c99 = $cpp;
+
+    // State transitions for PL/I
+    // Kinda like C
+    $pli = $c89;
+
+    //
+    // State transitions for PHP
+    // Inherit transitions from C++, and add perl-style line comment support
+    $php = $cpp;
+    $php[normal_text]["#"]   = line_comment;
+    $php[sq_literal]["\n"]   = sq_literal;
+    $php[dq_literal]["\n"]   = dq_literal;
+
+    //
+    // State transitions for Perl
+    $perl[normal_text]["#"]  = line_comment;
+    $perl[normal_text]["\""] = dq_literal;
+    $perl[normal_text]["'"]  = sq_literal;
+    $perl[normal_text][0]    = normal_text;
+
+    $perl[dq_literal]["\""]  = normal_text;
+    $perl[dq_literal]["\\"]  = dq_escape;
+    $perl[dq_literal][0]     = dq_literal;
+
+    $perl[dq_escape][0]      = dq_literal;
+
+    $perl[sq_literal]["'"]   = normal_text;
+    $perl[sq_literal]["\\"]  = sq_escape;
+    $perl[sq_literal][0]     = sq_literal;
+
+    $perl[sq_escape][0]      = sq_literal;
+
+    $perl[line_comment]["\n"] = normal_text;
+    $perl[line_comment][0]    = line_comment;
+
+    $mirc[normal_text]["\""] = dq_literal;
+    $mirc[normal_text][";"]  = line_comment;
+    $mirc[normal_text][0]    = normal_text;
+
+    $mirc[dq_literal]["\""]  = normal_text;
+    $mirc[dq_literal]["\\"]  = dq_escape;
+    $mirc[dq_literal][0]     = dq_literal;
+
+    $mirc[dq_escape][0]      = dq_literal;
+
+    $mirc[line_comment]["\n"] = normal_text;
+    $mirc[line_comment][0]   = line_comment;
+
+    $ruby = $perl;
+
+    $python = $perl;
+
+    $java = $cpp;
+
+    $vb = $perl;
+    $vb[normal_text]["#"] = normal_text;
+    $vb[normal_text]["'"] = line_comment;
+
+    $cs = $java;
+
+    $pascal = $c89;
+    $pascal[normal_text]["("]  = paren_begin;
+    $pascal[normal_text]["/"]  = slash_begin;
+    $pascal[normal_text]["{"]  = block_comment;
+
+    $pascal[paren_begin]["*"]  = star_comment;
+    $pascal[paren_begin]["'"]  = sq_literal;
+    $pascal[paren_begin]['"']  = dq_literal;
+    $pascal[paren_begin][0]    = normal_text;
+
+    $pascal[slash_begin]["'"]  = sq_literal;
+    $pascal[slash_begin]['"']  = dq_literal;
+    $pascal[slash_begin]['/']  = line_comment;
+    $pascal[slash_begin][0]    = normal_text;
+
+    $pascal[star_comment]["*"] = star_end;
+    $pascal[star_comment][0]   = star_comment;
+
+    $pascal[block_comment]["}"] = normal_text;
+    $pascal[block_comment][0]   = block_comment;
+
+    $pascal[line_comment]["\n"] = normal_text;
+    $pascal[line_comment][0]    = line_comment;
+
+    $pascal[star_end][")"]     = normal_text;
+    $pascal[star_end]["*"]     = star_end;
+    $pascal[star_end][0]       = star_comment;
+
+    $sql[normal_text]['"']     = dq_literal;
+    $sql[normal_text]["'"]     = sq_literal;
+    $sql[normal_text]['`']     = bt_literal;
+    $sql[normal_text]['-']     = dash_begin;
+    $sql[normal_text][0]       = normal_text;
+
+    $sql[dq_literal]['"']      = normal_text;
+    $sql[dq_literal]['\\']     = dq_escape;
+    $sql[dq_literal][0]        = dq_literal;
+
+    $sql[sq_literal]["'"]      = normal_text;
+    $sql[sq_literal]['\\']     = sq_escape;
+    $sql[sq_literal][0]        = sq_literal;
+
+    $sql[bt_literal]['`']      = normal_text;
+    $sql[bt_literal]['\\']     = bt_escape;
+    $sql[bt_literal][0]        = bt_literal;
+
+    $sql[dq_escape][0]         = dq_literal;
+    $sql[sq_escape][0]         = sq_literal;
+    $sql[bt_escape][0]         = bt_literal;
+
+    $sql[dash_begin]["-"]      = line_comment;
+    $sql[dash_begin][0]        = normal_text;
+
+    $sql[line_comment]["\n"]   = normal_text;
+    $sql[line_comment]["\\"]   = lc_escape;
+    $sql[line_comment][0]      = line_comment;
+
+    $sql[lc_escape]["\r"]      = lc_escape;
+    $sql[lc_escape][0]         = line_comment;
+
+    $xml[normal_text]["<"]     = xml_tag_begin;               
+    $xml[normal_text]["&"]     = html_entity;                 
+    $xml[normal_text][0]       = normal_text;                 
+    $xml[html_entity][";"]     = normal_text;                 
+    $xml[html_entity]["<"]     = xml_tag_begin;
+    $xml[html_entity][0]       = html_entity;                 
+    $xml[xml_tag_begin]["?"]   = xml_pi;                      
+    $xml[xml_tag_begin]["!"]   = line_comment;                
+    $xml[xml_tag_begin][0]     = xml_tag;                     
+    $xml[xml_tag][">"]         = normal_text;                 
+    $xml[xml_tag]["\""]        = dq_literal;           
+    $xml[xml_tag]["'"]         = sq_literal;                   
+    $xml[xml_tag][0]           = xml_tag;                     
+    $xml[xml_pi][">"]          = normal_text;                 
+    $xml[xml_pi][0]            = xml_tag;                     
+    $xml[line_comment][">"]    = normal_text;                 
+    $xml[line_comment][0]      = line_comment;                
+    $xml[dq_literal]["\""]     = xml_tag;                     
+    $xml[dq_literal]["&"]      = dq_escape;                   
+    $xml[dq_literal][0]        = dq_literal;                  
+    $xml[sq_literal]["'"]      = xml_tag;                     
+    $xml[sq_literal]["&"]      = sq_escape;                   
+    $xml[sq_literal][0]        = sq_literal;                  
+    $xml[dq_escape][";"]       = dq_literal;                  
+    $xml[dq_escape][0]         = dq_escape;                   
+    
+    //
+    // Main state transition table
+    //
+    $states = array(
+        "C89"   => $c89,
+        "C" => $c99,
+        "C++" => $cpp,
+        "PHP" => $php,
+        "Perl" => $perl,
+        "Java" => $java,
+        "VB" => $vb,
+        "C#" => $cs,
+        "Ruby" => $ruby,
+        "Python" => $python,
+        "Pascal" => $pascal,
+        "mIRC" => $mirc,
+        "PL/I" => $pli,
+        "SQL"  => $sql,
+        "XML"  => $xml,
+        "Scheme" => $sch
+    );
+
+
+    //
+    // Process functions
+    //
+    $process["C89"][normal_text][sq_literal] = "rtrim1";
+    $process["C89"][normal_text][dq_literal] = "rtrim1";
+    $process["C89"][normal_text][slash_begin] = "rtrim1";
+    $process["C89"][normal_text][0] = "syn_proc";
+
+    $process["C89"][slash_begin][star_comment] = "rtrim1";
+    $process["C89"][slash_begin][0] = "slash_putback";
+
+    $process["Scheme"][sch_normal][sch_strlit] = "sch_rtrim1";
+    $process["Scheme"][sch_normal][sch_chrlit] = "sch_rtrim1";
+    $process["Scheme"][sch_normal][sch_numlit] = "sch_rtrim1";
+
+    $process["SQL"][normal_text][sq_literal] = "rtrim1";
+    $process["SQL"][normal_text][dq_literal] = "rtrim1";
+    $process["SQL"][normal_text][bt_literal] = "rtrim1";
+    $process["SQL"][normal_text][dash_begin] = "rtrim1";
+    $process["SQL"][normal_text][0] = "syn_proc";
+
+    $process["SQL"][dash_begin][line_comment] = "rtrim1";
+    $process["SQL"][dash_begin][0] = "dash_putback";
+
+    $process["PL/I"] = $process["C89"];
+
+    $process["C++"] = $process["C89"];
+    $process["C++"][slash_begin][line_comment] = "rtrim1";
+
+    $process["C"] = $process["C++"];
+
+    $process["PHP"] = $process["C++"];
+    $process["PHP"][normal_text][line_comment] = "rtrim1";
+
+    $process["Perl"][normal_text][sq_literal] = "rtrim1";
+    $process["Perl"][normal_text][dq_literal] = "rtrim1";
+    $process["Perl"][normal_text][line_comment] = "rtrim1";
+    $process["Perl"][normal_text][0] = "syn_proc";
+
+    $process["Ruby"] = $process["Perl"];
+    $process["Python"] = $process["Perl"];
+
+    $process["mIRC"][normal_text][dq_literal] = "rtrim1";
+    $process["mIRC"][normal_text][line_comment] = "rtrim1";
+    $process["mIRC"][normal_text][0] = "syn_proc";
+
+    $process["VB"] = $process["Perl"];
+
+    $process["Java"] = $process["C++"];
+
+    $process["C#"] = $process["Java"];
+
+    $process["Pascal"] = $process["C++"];
+    $process["Pascal"][normal_text][line_comment] = "rtrim1";
+    $process["Pascal"][normal_text][block_comment] = "rtrim1";
+    $process["Pascal"][normal_text][paren_begin] = "rtrim1";
+    $process["Pascal"][slash_begin][sq_literal] = "slash_putback_rtrim1";
+    $process["Pascal"][slash_begin][dq_literal] = "slash_putback_rtrim1";
+    $process["Pascal"][slash_begin][0] = "slash_putback";
+    $process["Pascal"][paren_begin][sq_literal] = "lparen_putback_rtrim1";
+    $process["Pascal"][paren_begin][dq_literal] = "lparen_putback_rtrim1";
+    $process["Pascal"][paren_begin][star_comment] = "rtrim1";
+    $process["Pascal"][paren_begin][0] = "lparen_putback";
+
+    $process["XML"][normal_text][xml_tag_begin] = "rtrim1";
+    $process["XML"][normal_text][html_entity] = "rtrim1";
+    $process["XML"][html_entity][xml_tag_begin] = "rtrim1";
+    $process["XML"][html_entity][0] = "proc_void";
+    $process["XML"][xml_tag_begin][xml_tag] = "prepend_xml_opentag";
+    $process["XML"][xml_tag_begin][xml_pi] = "rtrim1";
+    $process["XML"][xml_tag_begin][line_comment] = "rtrim1";
+    $process["XML"][line_comment][normal_text] = "rtrim1_htmlesc";
+    $process["XML"][xml_tag][normal_text] = "rtrim1";
+    $process["XML"][xml_tag][dq_literal] = "rtrim1";
+    $process["XML"][dq_literal][xml_tag] = "rtrim1";
+    $process["XML"][dq_literal][dq_escape] = "rtrim1";
+
+    $process_end["C89"] = "syntax_highlight_helper";
+    $process_end["C++"] = $process_end["C89"];
+    $process_end["C"] = $process_end["C89"];
+    $process_end["PHP"] = $process_end["C89"];
+    $process_end["Perl"] = $process_end["C89"];
+    $process_end["Java"] = $process_end["C89"];
+    $process_end["VB"] = $process_end["C89"];
+    $process_end["C#"] = $process_end["C89"];
+    $process_end["Ruby"] = $process_end["C89"];
+    $process_end["Python"] = $process_end["C89"];
+    $process_end["Pascal"] = $process_end["C89"];
+    $process_end["mIRC"] = $process_end["C89"];
+    $process_end["PL/I"] = $process_end["C89"];
+    $process_end["SQL"] = $process_end["C89"];
+    $process_end["Scheme"] = "sch_syntax_helper";
+
+
+    $edges["C89"][normal_text .",". dq_literal]   = '<span class="literal">"';
+    $edges["C89"][normal_text .",". sq_literal]   = '<span class="literal">\'';
+    $edges["C89"][slash_begin .",". star_comment] = '<span class="comment">/*';
+    $edges["C89"][dq_literal .",". normal_text]   = '</span>';
+    $edges["C89"][sq_literal .",". normal_text]   = '</span>';
+    $edges["C89"][star_end .",". normal_text]     = '</span>';
+
+    $edges["Scheme"][sch_normal .",". sch_strlit] = '<span class="sch_str">"';
+    $edges["Scheme"][sch_normal .",". sch_numlit] = '<span class="sch_num">';
+    $edges["Scheme"][sch_normal .",". sch_chrlit] = '<span class="sch_chr">#';
+    $edges["Scheme"][sch_strlit .",". sch_normal] = '</span>';
+    $edges["Scheme"][sch_numlit .",". sch_normal] = '</span>';
+    $edges["Scheme"][sch_chrlit .",". sch_normal] = '</span>';
+
+    $edges["SQL"][normal_text .",". dq_literal]   = '<span class="literal">"';
+    $edges["SQL"][normal_text .",". sq_literal]   = '<span class="literal">\'';
+    $edges["SQL"][dash_begin .",". line_comment] = '<span class="comment">--';
+    $edges["SQL"][normal_text .",". bt_literal]   = '`';
+    $edges["SQL"][dq_literal .",". normal_text]   = '</span>';
+    $edges["SQL"][sq_literal .",". normal_text]   = '</span>';
+    $edges["SQL"][line_comment .",". normal_text] = '</span>';
+
+    $edges["PL/I"] = $edges["C89"];
+
+    $edges["C++"] = $edges["C89"];
+    $edges["C++"][slash_begin .",". line_comment] = '<span class="comment">//';
+    $edges["C++"][line_comment .",". normal_text] = '</span>';
+
+    $edges["C"] = $edges["C++"];
+
+    $edges["PHP"] = $edges["C++"];
+    $edges["PHP"][normal_text .",". line_comment] = '<span class="comment">#';
+
+    $edges["Perl"][normal_text .",". dq_literal]   = '<span class="literal">"';
+    $edges["Perl"][normal_text .",". sq_literal]   = '<span class="literal">\'';
+    $edges["Perl"][dq_literal .",". normal_text]   = '</span>';
+    $edges["Perl"][sq_literal .",". normal_text]   = '</span>';
+    $edges["Perl"][normal_text .",". line_comment] = '<span class="comment">#';
+    $edges["Perl"][line_comment .",". normal_text] = '</span>';
+
+    $edges["Ruby"] = $edges["Perl"];
+
+    $edges["Python"] = $edges["Perl"];
+
+    $edges["mIRC"][normal_text .",". dq_literal] = '<span class="literal">"';
+    $edges["mIRC"][normal_text .",". line_comment] = '<span class="comment">;';
+    $edges["mIRC"][dq_literal .",". normal_text] = '</span>';
+    $edges["mIRC"][line_comment .",". normal_text] = '</span>';
+
+    $edges["VB"] = $edges["Perl"];
+    $edges["VB"][normal_text .",". line_comment] = '<span class="comment">\'';
+
+    $edges["Java"] = $edges["C++"];
+
+    $edges["C#"] = $edges["Java"];
+
+    $edges["Pascal"] = $edges["C89"];
+    $edges["Pascal"][paren_begin .",". star_comment] = '<span class="comment">(*';
+    $edges["Pascal"][paren_begin .",". dq_literal]   = '<span class="literal">"';
+    $edges["Pascal"][paren_begin .",". sq_literal]   = '<span class="literal">\'';
+    $edges["Pascal"][slash_begin .",". dq_literal]   = '<span class="literal">"';
+    $edges["Pascal"][slash_begin .",". sq_literal]   = '<span class="literal">\'';
+    $edges["Pascal"][slash_begin .",". line_comment] = '<span class="comment">//';
+    $edges["Pascal"][normal_text . "," . block_comment] = '<span class="comment">{';
+    $edges["Pascal"][line_comment . "," . normal_text] = '</span>';
+    $edges["Pascal"][block_comment . "," . normal_text] = '</span>';
+
+    $edges["XML"][normal_text . "," . html_entity] = '<span class="html_entity">&amp;';
+    $edges["XML"][html_entity . "," . normal_text] = '</span>';
+    $edges["XML"][html_entity . "," . xml_tag_begin] = '</span>';
+    $edges["XML"][xml_tag . "," . normal_text] = '&gt;</span>';
+    $edges["XML"][xml_tag_begin . "," . xml_pi] = '<span class="xml_pi">&lt;?';
+    $edges["XML"][xml_tag_begin . "," . line_comment] = '<span class="comment">&lt;!';
+    $edges["XML"][line_comment . "," . normal_text] = '&gt;</span>'; 
+    $edges["XML"][xml_tag .",". dq_literal]   = '<span class="literal">"';
+    $edges["XML"][dq_literal . "," . xml_tag] = '"</span>';
+    $edges["XML"][dq_literal . "," . dq_escape] = '<span class="html_entity">&amp;';
+    $edges["XML"][dq_escape . "," . dq_literal] = '</span>';
+    $edges["XML"][xml_tag .",". sq_literal]   = '<span class="literal">\'';
+    $edges["XML"][sq_literal . "," . xml_tag] = '\'</span>';
+    $edges["XML"][sq_literal . "," . sq_escape] = '<span class="html_entity">&amp;'; 
+    $edges["XML"][sq_escape . "," . sq_literal] = '</span>'; 
+
+    //
+    // The State Machine
+    //
+    if (array_key_exists($language, $initial_state))
+        $state = $initial_state[$language];
+    else
+        $state = normal_text;
+    $output = "";
+    $span = "";
+    while (strlen($text) > 0)
+    {
+        $ch = substr($text, 0, 1);
+        $text = substr($text, 1);
+
+        $oldstate = $state;
+        $state = (array_key_exists($ch, $states[$language][$state]))?
+            $states[$language][$state][$ch] :
+            $states[$language][$state][0];
+
+        $span .= $ch;
+
+        if ($oldstate != $state)
+        {
+            if (array_key_exists($language, $process) &&
+                array_key_exists($oldstate, $process[$language]))
+            {
+                if (array_key_exists($state, $process[$language][$oldstate]))
+                {
+                    $pf = $process[$language][$oldstate][$state];
+                    $output .= $pf($span, $language, $ch);
+                }
+                else
+                {
+                    $pf = $process[$language][$oldstate][0];
+                    $output .= $pf($span, $language, $ch);
+                }
+            }
+            else
+            {
+                $output .= $span;
+            }
+
+            if (array_key_exists($language, $edges) &&
+                array_key_exists("$oldstate,$state", $edges[$language]))
+                $output .= $edges[$language]["$oldstate,$state"];
+
+            $span = "";
+        }
+    }
+
+    if (array_key_exists($language, $process_end) && $state == normal_text)
+        $output .= $process_end[$language]($span, $language);
+    else
+        $output .= $span;
+
+    if ($state != normal_text)
+    {
+        if (array_key_exists($language, $edges) &&
+            array_key_exists("$state," . normal_text, $edges[$language]))
+            $output .= $edges[$language]["$state," . normal_text];
+    }
+                
+    return $output;
+}
+
+?>
index 3cb0844a208e8462c09703e92446cb7af2d51598..e441059ec2fc9a616fc2cf1f42df3eabf65e22a8 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * Default style sheet
  *
- * $Id: global.css,v 1.25 2004/07/22 08:51:34 jollytoad Exp $
+ * $Id: global.css,v 1.26 2004/08/25 07:47:35 chriskl Exp $
  */
 
 /** ELEMENTS */
@@ -289,3 +289,9 @@ pre.data
        font-family: arial, tahoma, verdana, helvetica, sans-serif, serif;
        font-size: 100%;
 }
+
+// Syntax highlighting
+.comment {color: #008080}
+.keyword {color: #FF8000}
+.literal {color: #808080}
+