
              CHANGES - Changelog for GeSHi (geshi.php only)

Changes to the code are listed under the version they occured in, with who suggested
it by each one (if there's nobody listed as suggesting it I dreamed it up :)). Users
who suggested an idea often also provided the code that was used as a basis for the
changes - thanks to all who suggested these ideas and gave me the code to show me how!

Language files listed under each version were made by the author beside them, and then
modified by me for consistency/bug fixing.

Please send any bug reports to BenBE@omorphia.de, or use the bug report tracker
at sourceforge (http://sourceforge.net/tracker/?group_id=114997&atid=670231)

Version 1.0.8.3
  -  Added language files
     * DCS (Stelio Passaris)
     * Locomotive Basic (Nacho Cabanes)
     * LSL2 (Linden Scripting Language) (William Fry)
     * Modula-3 (Martin Bishop)
     * Oberon-2 (Mike Mol)
     * Rebol (Lecanu Guillaume)
  -  Fixed a problem where HardEscapes weren't working when no escape char was given (BenBE)
  -  Added a PARSER_CONTROL setting to treat whitespace inside of keywords in
     the language file as "any whitespace" in the source (i.e. "CREATE TABLE"
     in SQL will match "CREATE\s+TABLE" instead of literally matching) (BenBE)
  -  Added a possibility to allow setting the style for escape characters (BenBE)
  -  Improvements to language files (BenBE)
     * Added some missing Perl keywords and obscure default variables (BenBE)
     * Allow for escaped colons to appear in CSS names (BenBE, simon)
     * Added multiline continuation suppoert of preprocessor defines for
       C, C for Mac, C++ and CC++ with Qt support (BenBE)
     * keywords for C-based languages are case-sensitive (BenBE)
     * Broken AutoIt highlighting (BenBE)
     * Problem with escaped backslash in PHP and D (BenBE)
     * Added some more functions for PHP (BenBE)
     * Some changes for AppleScript (Stefan Klieme)
     * Forbid highlighting keywords followed by / in bash (BenBE)
     * Updated the LaTeX file to link some keywords (BenBE)
     * Additional text rendered when matching special variables for PowerShell (BenBE)
     * Added some more keywords for ABAP (BenBE, Sandra Rossi, Jacob Laursen)
Version 1.0.8.2
  -  Added language files
     * Brainfuck \ Brainfork (Benny Baumann)
     * HQ9+ (Benny Baumann)
     * INTERCAL (Benny Baumann)
     * LOLcode (Benny Baumann)
     * LScript (Beau McGuigan)
     * Pixel Bender (Richard Olsson)
     * ProvideX (Jeff Wilder)
     * VIM Script (Swaroop C H)
     * Visual Prolog (Thomas Linder Puls)
     * Whitespace (Benny Baumann)
  -  Changed priority for COMMENT_REGEXP compared to String highlighting (BenBE)
  -  Fixed correct escaping of spaces inside of URLs (BenBE)
  -  Updated the list of common file extensions (BenBE)
  -  Updated the language file check script in contrib/ (BenBE)
  -  Fixed a problem with link targets resulting in unclickable links (SF#2379120, BenBE)
  -  Fixed an undefined variable issue in langcheck.php (BenBE)
  -  Improvements to language files (BenBE)
     * eMail Header highlighting now uses the correct delimiters for keywords (BenBE)
     * eMail (RFC822\mbox) highlighting now highlights IPs, MIME types and
       subfield assignments correctly (BenBE)
     * Minor style changes in COBOL to improve loading performance (BenBE)
     * Added some missing keywords for D (BenBE)
     * Removed duplicate keywords from Progres, SAS and TSQL (BenBE)
     * Fixed Heredoc Syntax for Bash (SF#2185319, BenBE)
     * Moved symbol-lookalike sequences from keyword groups to separate symbol group
       for languages asp, klonec, klonecpp, php, php-brief (BenBE)
     * Fixed a lot of duplicate keyword warnings (BenBE)
     * Added missing keywords to the Python language file,
       introducing support for Python 3.0. (SF#2441839, milian)
     * Updated documentation links for TypoScript (SF#2014276, BenBE)
     * Fixed a problem with tag and attribute names in XML highlighting (SF#2276119, BenBE)
     * Improved MySQL language file (BenBE, JavaWoman)
     * Some commentss accidentially mistaken for DocComments (SF#2454897, BenBE)
     * Added improved Escape Char handling for c, c_mac, cpp and cpp_qt (SF#2458743, BenBE)
Version 1.0.8.1
  -  Added language files
     * AviSynth (Ryan Jones)
     * eMail \ mbox (Benny Baumann)
     * GNU Make (Neil Bird)
     * Oracle 11i support (Simon Redhead)
     * Prolog (Benny Baumann)
     * SciLab (Christophe David)
     * TeraTerm macro language (Boris Maisuradze)
  -  Added support for Escape Regular Expressions (BenBE)
     * Implemented C-style Escapes in PHP (BenBE)
     * Introduced support for \xAB and \007 style Char Escapes in PHP (BenBE)
     * Implemented Variable Highlighting in PHP (BenBE)
     * Implemented Variable Highlighting in Bash (milian)
  -  Fixed a problem with PCRE patterns for Keyword matching sometimes producing
     very large strings, that could not be handled by some versions of PCRE lib,
     causing broken highlighting an Regexp Compile errors (BenBE, milian)
  -  Fixed broken highlighting of bash commands like `dbus-send --dest=org.....`,
     i.e. the dest was highlighted as variable declaration (milian)
  -  Fixed broken highlighting of some symbols in their escaped form (BenBE)
     (<SEMI> and <PIPE> were accidentially filtered even though they are valid)
  -  Fixed a "memory leak" in the *_regexp_caches (milian)
  -  Fixed broken Escape chars if classes were disabled
  -  start_line_numbers_at() was ignored when GESHI_HEADER_PRE_TABLE was set (revulo)
  -  Fixed a problem allowing Remote Code Inclusion under certain circumstances (BenBE)
  -  Changes to default CSS in order to make the GESHI_HEADER_PRE_TABLE align properly,
     even on Windows / Mac systems with strange fonts (milian, revulo, ^RT)
  -  Minor style changes to the following languages:
     * cpp-qt (milian)
     * MySQL (BenBE)
     * PHP (BenBE)
  -  Improvements to language files (BenBE, milian)
     * Added MinSpareThread\MaxSpareThreads to Apache highlighter (BenBE)
     * Added new Keyword group for APT sources.list highlighter (BenBE)
     * Fixed highlighting in LaTeX for \begin{} and \end{}, i.e. the stuff inside
       the curly braces. (milian, thanks for the report go to Matthias Pospiech)
     * Improved String support for D (BenBE)
     * MySQL was seriously broken (BenBE)
     * Reworked Keyword groups for MySQL to allow for more configuration (BenBE)
     * Improved Mirc script language file (milian)
     * Improved C++ Qt language file (milian)
     * Minor bug with Transpose Operator in Matlab (BenBE, Daniele de Rigo)
     * Highlighting of Batch Files for Windows (BenBE)
     * Updated AutoIt to include latest changes for AutoIt v3.2.12.1 (BenBE, Thierry)
     * Fixed duplicate keyword warnings for Perl, Tcl and Typoscript (BenBE)
     * Fixed Doc-URL getting reparsed by highlighted keywords of other groups (BenBE, Jordi Boggiano)
Version 1.0.8
  -  Added language files
     * APT sources.list (milian)
     * Boo (Marcus Griep)
     * CIL (Common Intermediate Language, .NET Assembly) (Marcus Griep)
     * COBOL (Benny Baumann)
     * Gnuplot (milian)
     * KLoneC (Mickael Auger)
     * KLoneC++ (Mickael Auger)
     * PIC16xxx assembler (Phil Mattison)
     * POV-Ray (Carl Fürstenberg)
     * PowerShell (Frode Aarebrot)
     * Progress (Marco Aurelio de Pasqual)
     * TypoScript (Jan-Philipp Halle)
     * Xorg configuration (milian)
  -  Make GeSHi's constructor arguments optional, so something like `$foo = new GeSHi;` is possible. (milian)
  -  Added an optimizer for lists to regular expressions. Using these cached lists results in a speedup of approx. 50%.
     The slightly increased memory consumption (~150KB for PHP language file) is more than worth it! (milian)
  -  Some more memory & speed optimizations all over GeSHi (milian)
     * Reduced memory overhead when highlighting keywords (BenBE)
     * Keyword Linking now uses considerably less strtolower calls (milian)
     * Cache Symbol Search Regexp and make Symbol Highlighting faster (milian)
     * Use more native functions like substr_replace and strcasecmp to speed things up (milian)
     * Use considerably less strlen() calls on various points by caching the results (milian)
     * Properly set comments to be case insensitive where appropriate to increase performance (milian)
     * Improve the performance of the strict mode tokenizer, making highlighting of languages like
       HTML, ColdFusion or XML faster (milian)
     * Setup caches for parsing on demand to make stylesheet generators fast (milian)
  -  Various improvements to Strict Block Handling (BenBE, milian)
     * Added support for RegExp-based Strict Blocks (BenBE)
     * Fixed highlighting incorrectly stopping at ?> in PHP (SF#1330968, BenBE)
     * Languages with STRICT_MODE_APPLIES = GESHI_MAYBE default to strict mode now. When no highlightable
       code is found in this mode, we fallback to the same setting as if GESHI_NEVER was set. That way it
       should not be needed to call enable_strictmode() manually. (milian)
  -  Added new GESHI_HEADER_PRE_VALID type which uses the following markup: (milian)
     * With line numbers:     <div>header<ol><li><pre>...</pre></li>...</ol></div>
     * Without line numbers:  <pre>header...CODE...</pre>
     => valid HTML and no need for &nbsp; indentation
  -  Added new GESHI_HEADER_PRE_TABLE type which can be used to prevent linenumber-selection in Firefox
     on copy'n'paste. (milian)
  -  set_language will not reset any language settings by default anymore.
     * Added $force_reset param for to force full reload of a language. (milian)
     * Make sure strict_mode is set properly when doing repeated set_language calls (milian)
  -  Fixed some problems with old PHP versions (SF#1975625, milian, BenBE)
  -  Fixed broken use with Suhosin Patch when /e modifier was disabled (SF#2021800, BenBE)
  -  Added support for external style information files to override language defaults without modifying language files (BenBE)
  -  The overall_class is now up to the user, and the language-code is _always_ added as a class (milian)
  -  Fixed Economy Mode for GeSHi::get_stylesheet() - now it just makes so much more sense! (milian)
  -  Fixed Economy Mode when COMMENT_REGEXP are used (BenBE)
  -  Changed the default encoding to use UTF-8, due to SF#2037598, BenBE)
  -  Improved overall string support:
     * Added support for multichar string delimiters (SF#1932083, BenBE)
     * Fixed problems of unfinished strings and comments producing invalid XHTML (SF#1996353, BenBE)
     * Multichar Quotemarks sometimes had inconsistent behaviour (BenBE)
     * Support for multiple styles of strings depending on the starter (BenBE)
     * Properly handle escapes in strings, i.e. '\\' was not working properly before (milian)
     * Fixed escape char support when an escape char is followed by multi-byte chars (SF#2037598, BenBE)
  -  Improved flexibility in language files (BenBE, milian)
     * Added PARSER_CONTROL for OOLANG method highlighting (SF#1923060, BenBE)
     * Added possibility to define strict blocks using an Regexp (BenBE)
     * Removed explicit escaping of / in Regular Expressions (BenBE)
     * Ignoring empty keyword groups when highlighting (milian)
     * Make language_permissions configurable in language files via ['PARSER_CONTROL']['ENABLE_FLAGS']
       this makes is_a calls unneeded and thus prevents PHP notices in PHP 5.x (milian)
     * Extended support for number formats now covering the most common formats (SF#1923058, BenBE)
     * Lifted a limitation that keywords had to have at least 2 subsequent letters (BenBE)
     * Changed behaviour of PARSER_CONTROL now allowing to provide the full Lookahead and Lookbehind
       expressions used as delimiters inside keywords instead of a simple char group (BenBE)
     * Fixed improper handling of newlines in REGEXPS so this does not produce invalid html anylonger (milian)
  -  Some typos and mistakes in the documentation (BenBE)
  -  Added a script to contrib/ to verify language files are correct (BenBE)
  -  Fixed loads of compliancy warnings detected with that automated compliance testing script (BenBE)
  -  Many other improvements to various language files (BenBE, milian)
     * Reduce strict errors & notices for language files (milian)
     * Fixed symbol highlighting with C++ sometimes missing keywords after ; and comments (BenBE)
     * Improved comment handling with TCL (Lars Hellström, BenBE)
     * Fixed broken handling with XML comments (BenBE, SF#1849233)
     * Fixed HTML comments spawning multiple lines producing invalid XHTML output (SF#1738173, BenBE)
     * Added support for parameters beginning with dash in BASH language (BenBE)
     * Support Apache's configuration sections, see http://httpd.apache.org/docs/2.2/sections.html (milian)
     * Minor issue with PHP Heredoc and Nowdoc syntax sometimes not getting highlighted (BenBE)
     * Updated Objective-C language file (SF#2013961, Quinn Taylor, BenBE)
     * Added some keywords for VHDL (beshig, BenBE)
     * Fixed severly broken ColdFusion language file (milian)
     * Fixed some incorrectly highlighted things with the CSS language file (milian, BenBE)
     * Improved Smarty language file (milian)
     * Improved CSS language file (milian)
     * Improved Pascal language file (milian)
     * Improved LaTeX language file (Андрей Парамонов, BenBE)
     * Fixed a regular expression in mIRC language file that caused a warning message to be issued (BenBE)
     * Removed <, > and / from HTML names, now only containing the real tag names (BenBE)
     * Use spaces instead of tabs for indendation in language files to have a consistent
       coding standard accross geshi files (milian)
     * Added some comment styles, keywords and added index highlighting (Chusslove Illich, Часлав Илић)
  -  Removed some private methods which were only called at exactly one place (milian)
     * format_header_content
     * format_footer_content
     * get_attributes
  -  Second part of default style changes. Affected in this release:
     * C++
     * C++ (QT)
     * CSS
     * VHDL
Version 1.0.7.22
  -  Added language files
     * glSlang (BenBE)
     * KiXtart (Riley McArdle)
     * Lotus Notes @Formulas (Richard Civil)
     * LotusScript (Richard Civil)
     * MXML (David Spurr)
     * Scala (Franco Lombardo)
     * ActionScript 3 (Jordi Boggiano)
     * GNU Gettext .po/.pot (Milian Wolff)
     * Verilog (Günter Dannoritzer)
  -  Fixed a problem not yet addressed in 1.0.7.21 regarding highlighting of
     symbols that caused some extra characters to be added in the output or
     broke highlighting and standard compliance due to missing escaping of
     internally used characters (SF#192320 and SF#1926259, BenBE)
  -  Fixed missing style information for ocaml language file (The_PHP_Jedi)
  -  Fixed a bug causing masses of warnings in rendered output if language file
     miss style information (The_PHP_Jedi, BenBE)
  -  Missing tab width information could lead to warnings (BenBE)
  -  Missing symbol information for ASP (SF#1952038, nfsupport, BenBE)
  -  Empty delimiter message with OOoBasic (BenBE, Ccornell)
  -  Escaping of comments in LaTeX ignored (SF#1749806, BenBE)
  -  Modified Math environment $$ in LaTeX to be non-greedy (BenBE)
  -  Added possibility to match a regexp as comment (SF#1914640, SF#1945301, SF#1934832, BenBE)
  -  Introduced C-Style multiline continuation comments (SF#1914640, SF#1945301, BenBE)
  -  Introduced Fortran Comments (SF#1914640, SF#1934832, BenBE)
  -  Implemented Heredoc and Nowdoc Syntax for PHP and Perl (SF#1914640, BenBE)
  -  Implemented Compiler Directives for Delphi (SF#1914640, BenBE)
  -  Implemented minimalistic support for JavaScript \ Perl Regular Expressions (SF#1786665, SF#1754333, SF#1956631, BenBE)
  -  Fixed Strings in Matlab to be handled as comments instead of regexps, to prevent keywords being linked (BenBE)
  -  Applied PARSER_CONTROL fix of CPP for CPP-QT-Derivative (BenBE)
  -  Fixed incorrect treatment of unequally long multiline comment separators (related to SF #1891630, BenBE)
  -  Added PARSER_CONTROL settings for keywords in ASM language file (SF#1835148, BenBE)
  -  Fixed missing CASSE_SENSITIVE entry for DOS language file (SF#1956314, BenBE)
  -  Fixed accidential highlighting of keywords in argument names (SF#1956456, Milian Wolff, BenBE)
  -  Fixed yet again some #-related bash problem (SF#1956459, Milian Wolff, BenBE)
  -  Added backticks as symbols (Milian Wolff)
  -  Example script remembers selections and source submitted (Milian Wolff)
  -  Example script allows remembered source and preselected language to be cleared (Milian Wolff)
  -  Example script now properly includes geshi and doesn't suppress error messages anylonger. (Milian Wolff)
  -  Code cleanup by using direct string indexing instead of substr with length 1 (Milian Wolff)
  -  Optimized generation of code parts in strict mode (Milian Wolff)
  -  Optimized COMMENT_REGEXP by using an incremental regexp cache (Milian Wolff, BenBE)
  -  Fixed a problem that rarely skipped highlighting of escaped chars which usually should have gotten highlighted (BenBE)
  -  Optimized generation of highlighted strings to use fast skip forward while highlighting them (Milian Wolff, BenBE)
  -  Optimization using basic rework of indent function improving tab expansion performance (BenBE)
  -  Lots of other minor optimizations based on coding style improvements (Milian Wolff)
  -  Implemented setting to force spans to be closed before newlines, see SF#1727398 (Milian Wolff)
  -  Added missing credits for D language file to THANKS file (SF#1720899, BenBE)
  -  Optimization to prevent loading the current language file twice (Milian Wolff)
  -  Optimization: Use file_get_contents() to load sourcecode from files.
     Even if GeSHi worked with PHP 4.1 before, it doesn't now. (Milian Wolff)
  -  Added description of extra language features (SF#1970248, BenBE)
  -  Added support for highlighting the C# using and namespace directives (SF #1395677, BenBE)
  -  Added support for highlighting the Java import and package directives (SF #1395677, BenBE)
  -  Fixed minor problem in Haskell cuasing accidential start of comment (SF#1987221, BenBE)
  -  Fixed minor issue causing loads of warnings if a language files defines no symbols (BenBE)
  -  Updated some aspects of the documentation and included further hints (BenBE)
  -  First of series of color scheme changes. Affected languages (sofar):
     * Assembler (x86)
     * Bash
     * C
     * C#
     * Delphi
     * Fortran77
     * glSlang
     * Java & Java 5
     * JavaScript
     * OCaml
     * OpenOffice.org Basic
     * Pascal
     * Perl
     * PHP and PHP-Brief
Version 1.0.7.21
  -  Added language files
     * Basic4GL (Matthew Webb)
  -  Fixed problem with mIRC language highlighting spaces only (BenBE)
  -  Language files can now specify a function to be called to decide the
     colour of a regular expression match
  -  Added single quote to Lua (Darrin Roenfanz)
  -  Compare comments case insensitively (fixes AutoIT comments somewhat)
     (Daniel Gordon)
  -  Fixed symbols not being highlighted at all (SF #1767953, BenBE)
  -  Fixed brackets not correctly managed (SF #1767954, BenBE)
  -  Changed default languages for some extensions
  -  Included color and character information for symbol highlighting in some languages (BenBE)
  -  Fixed a problem with extension detection if default was used (BenBE)
  -  Fixed a highlighting problem with the LaTeX language (SF #1776182, BenBE)
  -  Added a new parameter for enable_highlighting to reduce source duplication (SF #1786104, BenBE)
  -  Updated doxygen documentation to include since tags and some missing parameters
  -  Disabled symbol highlighting by default (doesn't affect brackets, cf. documentation) (BenBE)
  -  Added a check for set_case_keywords for the given param to be supported (BenBE)
  -  Minor rework of the HTML documentation layout \ W3C compliance (BenBE)
  -  Fixed highlighting error in bash language avoiding keywords in comments (SF #1786314, SF #1564839, BenBE)
  -  Fixed template params for C++ and C# not being highlighted (SF #1772919, BenBE)
  -  Fixed more reported problems about mirc highlighting
  -  Added some missing keywords for VB.NET
  -  Fixed some warnings in DOS language file (Florian Angehrn)
  -  Add possibility to handle more than one extra line style (SF #1698255, German Rumm, BenBE)
  -  Fixed handling of URLs when output case differs from URL case (SF #1815504, Tom Samstag, BenBE)
  -  Fixed POD (Plain Old Documentation) format problems breaking highlighting of Perl (SF #1891630, Shannon Wynter, BenBE)
  -  Fixed a problem with mIRC when & was used for identifiers (SF #1875552, BenBE)
Version 1.0.7.20
  -  Added language files
     * Genero (logic) and Per (forms) (FOURJ's Genero 4GL) (Lars Gersmann)
     * Haskell (Dagit)
     * ABAP (Andres Picazo)
     * Motorola 68k Assembler (for MC68HC908GP32 Microcontroller) (BenBE)
     * Dot (Adrien Friggeri)
  -  Fixed java documentation search for keywords to actually go to the
     documentation (spaze)
  -  Applied fix for bug 1688864 (bad regexes) (Tim Starling)
  -  Fixed comment CSS rule in visualfoxpro
  -  ThinBASIC language update (Eros Olmi)
  -  mIRC language update (BenBE)
  -  Fixed outdated documentation URL of Perl language file (RuralMoon by BenBE)
  -  Fixed tab replacement code not generating the correct number of spaces in
     some cases (Guillermo Calvo)
  -  Fixed two typos in Z80 language file
  -  Applied fix for bug 1730168 (Daniel Naber)
  -  Applied fix for bug 1705482 (Jason Frame)
     * Configurable line endings (Replace \n by custom string)
     * per-language tab-widths (Adjustable for width>=1)
     * Included defaults for ASM (x86, m68k, z80), C, C (Mac), C++, C++ (QT), C#,
       Delphi, CSS,, HTML, PHP, PHP (Brief), QBasic, Ruby, XML
  -  Added a possibility to force generation of a surrounding tag around
     the highlighted source
  -  Applied fix for additional keywords for the bash language
     (cf. http://bash.thefreebizhost.com/bash_geshi.php, BenBE / Jan G)
  -  Fix bad colour definition in GML language (Andreas Gohr)
  -  Fixed phpdoc comments not being indented one space if they should be (Andy
     Hassall)
Version 1.0.7.19
  -  Added language files
     * X++ (Simon Butcher)
     * Rails (Moises Deniz)
  -  Fixed invalid HTML being generated and doctypes not being highlighted over
     multiple lines properly when line numbers are on (Validome)
  -  Improved the ruby syntax highlighting by basing it off the Rails file
  -  Changed some regular expressions to possibly help with badly performing
     regex support in PHP (Tim Starling)
  -  Allow {TIME}, {LANGUAGE} and {VERSION} to be used in the header as well as
     the normal <TIME>/<LANGUAGE>/<VERSION> (AthanD)
  -  Changed comment regex in bash to prevent malformed XHTML (rv1971)
Version 1.0.7.18
  -  Added language files
     * ZiLOG Z80 Assembly (BenBE)
  -  Fixed incorrect highlighting when the starter of a multiline comment is
     longer than the ender (Robert Anthony).
  -  Fixed "</span" generated if a multiline comment is the last thing in the
     source (related to the above).
  -  Added #cs => #ce comment markers to AutoIT (Robert Anthony)
  -  Fixed spelling mistake for keyword in Python (wd3)
  -  Added a method to enable/disable keyword linking (Ian McKellar)
  -  Improved empty line detection for HTML output (BenBE)
  -  Changed code style of geshi.php, and removed tabs
Version 1.0.7.17
  -  Fixed up ends of files having too many newlines (binarygroop)
  -  Removed background colour on keyword group in eiffel (Julian Tschannen)
  -  Removed GESHI_DIR_SEPARATOR constant usage, it's unnecessary (Aleksey Zapparov)
  -  Added /* ... */ comments to coldfusion (Jeff Howden)
Version 1.0.7.16
  -  Added language files
     * ActionScript (Steffen Krause)
     * C++/QT (Iulian M)
     * PL/SQL (Victor Engmark)
  -  Fixed up my e-mail address everywhere
  -  Fixed notice with "error" property (IZIU Zielona Góra)
  -  Added some entries to the get_language_name_from_extension table
     (Stebastian Schuberth)
Version 1.0.7.15
  - Added language files
     * BNF (Rowan Rodrik van der Molen)
     * IO (me, thanks to Johnathan Wright)
     * mIRC (Alberto de Areba Sánchez)
  -  Fixed use of colon in XML (Grigory Rubtsov)
  -  Fixed notices in text.php, reg.php and latex.php when $this is not
     available (Clemens Weiß)
  -  Made third parameter of geshi_highlight optional (Gaetano Giunta)
  -  Fix incorrect highlighting of the $# variable in bash (Michael Knight)
  -  Fixed single line comment mistake in thinbasic.php (Eros Olmi)
Version 1.0.7.14
  -  Added language files
     * thinBasic (Eros Olmi)
     * LaTeX (Matthais Pospiech)
  -  Removed extra newlines at the end of some files
  -  Fixed SF bug 1556404 - check before using $this in language files
     (Clemens Weiß)
Version 1.0.7.13
  -  Added language files
     * Uno IDL (Cedric Bosdonnat)
  -  Fixed add_ids causing odd XHTML (RyanJ)
  -  Fixed extra newline being added to end of result (Andreas Gohr)
Version 1.0.7.12
  -  Fixed lines being collapsed when they contain just a space (artlover)
  -  Allowed matching for regexes using start/end matchers at the start/end
     of the code (Sheri)
  -  Added (dubious) fix for google "I'm feeling lucky" search for java keywords
     (dubious in that it doesn't work for me)
  -  mysql - Made the symbols into their own keyword group as the symbol group
     isn't used. Added a style for multiline comments.
  -  Added a couple of php5 keywords to the php language files.
  -  Allow XML tags to have dashes.
  -  Changed LANG_NAME for many languages to be more sensible/correct case
     (Matthias Mohr)
  -  Added case-sensitivity indices to python
Version 1.0.7.11
  -  Added language files
     * Smalltalk (Bananeweizen)
  -  Minor style improvements to matlab
  -  Moved a couple of functions to the correct group in smarty (arwan)
Version 1.0.7.10
  -  Added language files
     * TCL (Reid van Melle)
     * Winbatch (Craig Storey)
     * Groovy (Ivan F. Villanueva B.)
     * Text (SmokingRope)
     * Reg (SmokingRope)
  -  Removed \ as an escape character in T-SQL (Dave Jackson)
  -  Reset extra lines to highlight if source is changed (Diogo Resende)
  -  Allow setting of lexic permissions in language files (SmokingRope)
  -  Allow regexes to set a CSS class name (SmokingRope)
  -  Added URL support to DOS language (mastrboy)
Version 1.0.7.9
  -  Added language files
     * Fortran (Cedric Arrabie)
     * SAS (Galen Johnson)
     * CFDG (John Horigan)
  -  Fixed & in URL in java5 (Clemens Weiß)
  -  Added MD5 and SHA1 to mysql keywords (polarina)
  -  Fixes for highlight_lines_extra with line numbers (ithcy)
  -  Fixed backslash characters being removed (ArTourter)
Version 1.0.7.8
  -  Fixed blank at start of MySQL file (W. Tasin)
  -  Fixed smarty functions being broken (ultrabob)
  -  Changed keyword and regexp detection and parsing
     slightly to allow more "meta characters" (like #) in
     keywords
  -  Minor fixes for XML and GML
Version 1.0.7.7
  -  Added language files
     * T-SQL (Duncan Lock)
     * Robots.txt (Christian Lescuyer)
     * AutoIT (mastrboy)
     * Java 5 (Clemens Bruckmann)
     * ColdFusion (Diego)
  -  A few keyword changes in java, removed :: object splitter (amphi)
  -  Now using a simpler regular expression for numbers (Brice Bernard)
  -  Fixed ah, bh etc. regs being highlighted as numbers (Unknown)
Version 1.0.7.6
  -  Fix backtick-string highlighting in ruby (Juan J. Martínez)
  -  Add =begin multiline comments in ruby (Juan J. Martínez)
  -  Added support for :keywords and ::access in lisp (Denis Mashkevich)
  -  Prevented number highlighting if they are just after underscores (Joce)
  -  Removed escape characters for strings in XML and HTML (floele)
  -  Added instanceof keyword to java (jgottschling)
  -  Fixed comments in ASP (SBD)
  -  Removed unnecessary keyword style index from ini
  -  Added support for " strings in ini
  -  Removed unnecessary regex style index from blitzbasic
  -  Keyword case of URL-ed keywords should be defined by language file (Benny Baumann)
  -  Added "Hardquote" feature, provides more accurate string highlighting (Cliff Stanford)
  -  Used hardquote support for @"..." strings in C# (Cliff Stanford)
  -  Used hardquote support for ' strings in perl (Cliff Stanford)
  -  Fixed setting of language path (Cliff Stanford)
  -  Display source correctly formatted with line numbers (if requested) if an error
     has occured (several people)
  -  Having no source to highlight is not an error condition anymore
  -  Delphi language updated to include more keywords and types (BenBE)
  -  Updated NSIS to version 2.11 (deguix)
Version 1.0.7.5
  -  Fix for using escape characters to escape newlines breaking XHTML compliance (Yves Goergen)
  -  Fixed method highlighting in VB (Matt Beale)
  -  Fixed multiline comment highlighting in SQL (MrBaseball34)
  -  Fixed two ">" symbols being outputted when using a footer but not CSS classes (MrBaseball34)
  -  Marked important block stuff as deprecated
  -  Some documentation tidyup
  -  Updated GML language file (Jos? Jorge Enr?quez Rodr?guez)
  -  THANKS file tidied up
  -  Fixed double </a> for elements in HTML (Yves Goergen)
  -  Added some keywords for ASM (Dreuzzo)
Version 1.0.7.4
  -  Added language files
     * MySQL (Carl Fürstenberg)
     * BlitzBasic (Pàdraig O`Connel)
  -  Fixed up geshi_highlight function: it now correctly uses <code> instead of <div> (Remi Faure)
  -  When using GESHI_HEADER_NONE, remove the <ol> if line numbering is not enabled
  -  Commented example.php so people can use it as a guide better
  -  Fixed extra newline being generated if a comment is at the end
     of the source (many people, including Yves Goergen)
  -  Fixed up some documentation issues
  -  Some minor language file fixes (C++, Lua) (Lua fixes by chromix)
  -  Fixed up no </span> in XML and other strict languages (regression from 1.0.7.3 fix: removed
  	 unnecessary </span> when using strict mode) (Daniel Ecer, drskrud),
Version 1.0.7.3
  -  Added language files
     * Scheme (Jon Raphaelson)
     * Ocaml and Ocaml-brief (Flaie)
     * Ruby (Amit Gupta)
  -  Make urls generated for java highlighting XHTML compliant (Tim Van Wassenhove)
  -  Removed unnecessary </span> when using strict mode (Tim Van Wassenhove)
  -  Fixed warning in dos.php about undefined constant (Tim Van Wassenhove)
  -  Fixed security hole in contrib/example.php - able to view any file if source
     not set and language is set to wierd value (Maksymilian Arciemowicz)
Version 1.0.7.2
  -  Added language files
     * Inno (Thomas Klinger)
     * Ini (Deguix)
     * DOS (Batchfile) (Alessandro Staltali)
     * Applescript (Stephan Klimek)
     * Freebasic (Roberto Rossi)
     * SDLBasic (Roberto Rossi)
     * ActionScript (links to French documentation) (NikO)
  -  NSIS language file updated (deguix)
  -  Lua language file updated (Roberto Rossi)
  -  Bugfix: Styles incorrectly overriding default styles instead of being merged
     in set_*_styles methods (Stebastian Werner)
  -  Added GESHI_HEADER_NONE as valid header type. This still allows header content.
Version 1.0.7.1
  -  Added language files:
     * Div (Gabriel Lorenzo)
     * GML (José Jorge Enríquez Rodríguez)
     * Eiffel (Zoran Simic)
  -  Minor change to rules regarding when keywords can appear - now dots (.) are
     allowed before keywords. (NikO)
  -  Bugfix: the line style for non-fancy lines when fancy highlighting is enabled
     is now applied (Amit Gupta)
Version 1.0.7
  -  Added language files:
     * Diff (Conny Brunnkvist)
     * VHDL (Alexander Krause)
     * D (Thomas Kuehne)
     * Matlab (Florian Knorn)
  -  Python highlighting improved (thither, Federico Quagliata)
  -  Changed file comments to use phpdoc syntax, and changed code style to be more
  	 like PEAR
  -  Fixed bug in set_code_style: Second parameter is now optional
  -  The $_GESHI_ERRORS array is gone, error messages are internal to the GeSHi class
  -  Changed name of XML language to XML from HTML
  -  Removed min and max tab width checks
  -  Backported GeSHi 1.1.X's automatic language file path detection so you no longer
     need to use the third parameter of the constructor or set_language_path except for
     special circumstances.
  -  Source is checked to make sure it is not empty else an error occurs
  -  Removed excess characters after ?> in ada.php, apache.php and cpp.php that caused
     http headers to be sent (psichron)
  -  Removed second "foreach" keyword for smarty language file that was causing
     duplication (Iss)
  -  Added underscore to allowed characters in match for XML tags (anonymous)
  -  Added some missing java keywords like "abstract" and "transient"
  -  Added "list" and "continue" PHP keywords
  -  set_language resets error status and strict mode (Andrew Black)
  -  Removed margin:0 declaration from cssgen.php (Andrzej Kubaszek)
  -  Fixed multiline comment selector in cssgen.php (Andrzej Kubaszek)
Version 1.0.6
  -  Added support for smart tabs - tabs that behave just like normal tabs when in
     GESHI_HEADER_DIV mode.
  -  Partial patch for UTF-8 encoding applied (doesn't quite work however...)
Version 1.0.5
  -  Added language files:
     * MPASM (Bakalex)
     * Oracle 8 (Guy Wicks)
  -  Fixed bug where not using an encoding type would sometime result in warnings (although
     there still seems to be issues with encoding in general that I'm trying to gather more
     data on) (Alexander Spennemann)
  -  Removed "margin: 0" from <ol> in an attempt to make line numbers visible in IE again
     by default (untested, but I don't really care if it works... get firefox! ;))
  -  Added note on php5 support (Karim Scheik)
  -  Added two new methods: load_from_file and get_language_name_from_extension, that can
     help automate file highlighting (though the extension array at this time is quite bare)
     (David Gartner, Brian Cheesman)
Version 1.0.4
  -  Fixed many version-reporting bugs (Jack Lloyd)
  -  Fixed bug where methods were not having the correct CSS generated for them
     by get_stylesheet() (Jack Lloyd)
  -  Added new keywords to C and C++ files (Jack Lloyd)
  -  Added section on case sensitivity to documentation that wasn't in the other versions
Version 1.0.3
  -  Added language files:
     * Smarty (Alan Juden)
     * C# (Alan Juden)
     * VB.NET (Alan Juden)
     * C for Macs (M. Uli Kusterer)
     * Objective C (M. Uli Kusterer)
  -  Links can have a target attribute (Andreas Gohr)
  -  Fixed multiline string bug if not using classes
  -  Added method set_encoding that allows you to set the character
     set used by calls to htmlentities() in GeSHi
  -  You can now specify an array of object splitters, and each
     type of method separated by each object splitter can be highlighted
     differently
  -  If a language uses a case sensitive keyword group and that group
     has a URL associated with it, the keyword will not be lowercased
     in the URL (M. Uli Kusterer)
Version 1.0.2
  -  Added language files:
     * Actionscript (Steffen Krause)
     * ASP (Amit Gupta)
     * Bash (Andreas Gohr)
     * CADDCL (Roberto Rossi)
     * CadLisp (Roberto Rossi)
     * C++ (Dennis Bayer)
     * Delphi (Járja Norbert)
     * Javascript (Ben Keen)
     * Lisp (Roberto Rossi)
     * OpenOffice.org BASIC (Roberto Rossi)
     * Perl (Andreas Gohr and Ben Keen)
     * Python (Roberto Rossi)
     * VisualFoxPro (Roberto Armellin)
     * XML (Nigel McNie, from an idea/file by Christian Weiske)
  -  Added contrib/ directory with script to create one external stylesheet
     from many languages(base script by Andreas Gohr, modified by Nigel McNie),
     and an example script (needs lotsa work...)
  -  Code lines can have their own unique ID (for use with javascript)
     (suggested by Andreas von Oettingen)
  -  Certain rows can be specified to be highlighted differently (suggested by
     Andreas von Oettingen)
  -  Getter available for human-readable language name (suggested by Simon Patterson)
  -  Line numbers aren't highlighted when a user selects the code
  -  Contextual highlighting with <BEGIN GeSHi> ... <END GeSHi> in the code (which
     can be disabled)
  -  Functions can be made into URLs to appropriate documentation (suggested
     by cybot_tm). Also thanks to Marcin Gryszkalis for the links for C, Java
     and Perl.
  -  Code can have a header and footer
  -  Time taken to parse the code is recorded and made available with the get_time()
     method
  -  error() now returns a human-readable error message
  -  Function geshi_highlight added to make it even easier to highlight on the fly
  -  Advanced regular expression handling
  -  Bug fixes to lexic_permission handling
Version 1.0.1
  -  Added methods set_symbols_style() and set_symbols_highlighting(). These should be used
     instead of set_brackets_style and set_brackets_highlighting respectively.
  -  Added a new field - language_path - that can be set either when the constructor is
     called, or by the new method set_language_path(), that specifies a path to the directory
     containing the language files (bug reported by bbspliff)
  -  Added a new method set_case_keywords(), that allows the auto-casing feature to be
     changed on the fly instead of simply being specified in the language file
  -  If there is an error the source that is outputted is now handled much better
  -  Lines are broken in the source only by \n now, not by \r\n (to save on output source)
  -  Indentation moved into its own method
  -  Method header() modified to allow the user to choose whether the code is surrounded in
     a <div> or a <pre> (see documentation for benefits of both). Method footer() likewise
     modified.
  -  Method get_stylesheet() modified so that a smaller comment is outputted in economy mode,
     and bugs with when line number classes are outputted in economy mode have been fixed
  -  Bug where spans had two quotes at the end of the attributes fixed (ie. <span style=".."">)
  -  Added language files:
     * Ada (Tux)
     * Apache log file (Tux)
     * ASM (Tux)
     * NSIS (Tux)
     * Pascal (Tux)
Version 1.0.0
  -  Initial Release