[xslthl] 01/03: Add upstream source

Eugene Zhukov eugene at moszumanska.debian.org
Thu Feb 16 11:47:01 UTC 2017


This is an automated email from the git hooks/post-receive script.

eugene pushed a commit to branch properone
in repository xslthl.

commit a34dfeab0fca77051bb1d26bc2da5f0e99796e06
Author: Eugene Zhukov <eugene at debian.org>
Date:   Wed Feb 15 11:36:47 2017 +0000

    Add upstream source
---
 CHANGES.txt                                        |  44 ++
 LICENSE.txt                                        |  23 +
 highlighters/bourne-hl.xml                         |  95 ++++
 highlighters/c-hl.xml                              | 117 +++++
 highlighters/cmake-hl.xml                          | 187 +++++++
 highlighters/cpp-hl.xml                            | 151 ++++++
 highlighters/csharp-hl.xml                         | 194 +++++++
 highlighters/css21-hl.xml                          | 176 +++++++
 highlighters/delphi-hl.xml                         | 220 ++++++++
 highlighters/ini-hl.xml                            |  45 ++
 highlighters/java-hl.xml                           | 117 +++++
 highlighters/javascript-hl.xml                     | 147 ++++++
 highlighters/lua-hl.xml                            | 140 +++++
 highlighters/m2-hl.xml                             |  90 ++++
 highlighters/myxml-hl.xml                          | 116 +++++
 highlighters/perl-hl.xml                           | 120 +++++
 highlighters/php-hl.xml                            | 154 ++++++
 highlighters/python-hl.xml                         | 100 ++++
 highlighters/ruby-hl.xml                           | 109 ++++
 highlighters/sql1999-hl.xml                        | 496 ++++++++++++++++++
 highlighters/sql2003-hl.xml                        | 565 +++++++++++++++++++++
 highlighters/sql92-hl.xml                          | 339 +++++++++++++
 highlighters/tcl-hl.xml                            | 180 +++++++
 highlighters/upc-hl.xml                            | 133 +++++
 highlighters/xslthl-config.xml                     |  57 +++
 maven/deploy.bat                                   |   5 +
 pom.xml                                            | 278 ++++++++++
 src/main/assembly/dist.xml                         |  33 ++
 src/main/java/net/sf/xslthl/Block.java             |  85 ++++
 src/main/java/net/sf/xslthl/CharIter.java          | 314 ++++++++++++
 src/main/java/net/sf/xslthl/Config.java            | 487 ++++++++++++++++++
 src/main/java/net/sf/xslthl/ConnectorSaxon6.java   | 168 ++++++
 src/main/java/net/sf/xslthl/ConnectorSaxonB.java   | 145 ++++++
 src/main/java/net/sf/xslthl/ConnectorSaxonEE.java  | 195 +++++++
 src/main/java/net/sf/xslthl/ConnectorXalan.java    | 137 +++++
 .../net/sf/xslthl/FilteredElementIterator.java     | 211 ++++++++
 src/main/java/net/sf/xslthl/Highlighter.java       | 128 +++++
 .../xslthl/HighlighterConfigurationException.java  |  28 +
 src/main/java/net/sf/xslthl/MainHighlighter.java   | 164 ++++++
 src/main/java/net/sf/xslthl/Params.java            | 165 ++++++
 src/main/java/net/sf/xslthl/StyledBlock.java       | 100 ++++
 src/main/java/net/sf/xslthl/Version.java           |  75 +++
 src/main/java/net/sf/xslthl/WholeHighlighter.java  |  75 +++
 .../xslthl/highlighters/AnnotationHighlighter.java | 107 ++++
 .../sf/xslthl/highlighters/HTMLHighlighter.java    | 372 ++++++++++++++
 .../sf/xslthl/highlighters/HeredocHighlighter.java | 172 +++++++
 .../highlighters/HexaDecimalHighlighter.java       |  20 +
 .../xslthl/highlighters/KeywordsHighlighter.java   | 172 +++++++
 .../highlighters/MultilineCommentHighlighter.java  | 109 ++++
 .../NestedMultilineCommentHighlighter.java         |  78 +++
 .../sf/xslthl/highlighters/NumberHighlighter.java  | 210 ++++++++
 .../highlighters/OnelineCommentHighlighter.java    | 147 ++++++
 .../sf/xslthl/highlighters/RegexHighlighterEx.java | 142 ++++++
 .../sf/xslthl/highlighters/StringHighlighter.java  | 145 ++++++
 .../sf/xslthl/highlighters/WordHighlighter.java    |  96 ++++
 .../net/sf/xslthl/highlighters/XMLHighlighter.java | 376 ++++++++++++++
 .../sf/xslthl/highlighters/xml/ElementPrefix.java  |  66 +++
 .../net/sf/xslthl/highlighters/xml/ElementSet.java |  56 ++
 .../sf/xslthl/highlighters/xml/RealElementSet.java |  66 +++
 src/site/apt/index.apt                             |  29 ++
 src/site/site.xml                                  |  12 +
 src/test/java/net/sf/xslthl/BlockTest.java         | 106 ++++
 src/test/java/net/sf/xslthl/StyledBlockTest.java   | 167 ++++++
 63 files changed, 9556 insertions(+)

diff --git a/CHANGES.txt b/CHANGES.txt
new file mode 100644
index 0000000..6445ba9
--- /dev/null
+++ b/CHANGES.txt
@@ -0,0 +1,44 @@
+2.1.3
+
+* Added support for Saxon 9.6
+* Restored Wiki documentation
+
+2.1.0
+
+* Bug fixes (NPE, IOB)
+* Added support for SaxonEE connector
+* Added new syntax highlighter for HTML
+  Basicaly same as for XML, but handles better some edge cases
+* New syntax configurations for:
+  - bourne (Bourne shell)
+  - css21/css (Cascading Stylesheets version 2.1)
+  - cmake
+  - upc (Unified Parallel C)
+  - lua
+  - sql92
+  - sql1999 (SQL:1999)
+  - sql2003/sql (SQL:2003)
+* New option for the Number highlighter: letterNoFollow
+  If set, numbers may not contain a letter at the end. For example: 123kg will 
+  not be seen as a number. This was the default before version 2.1
+* New option for the Heredoc highlighter: flag
+  Flags that can be put after the start. This parameter can be used more than 
+  once. For example in the Bourne shell the following is valid start of a 
+  heredoc section: <<-FOO. In this case '-' would be a flag.
+* New options for the Keyword highlighter:
+  - beginChars: a string of characters which should also be considered as 
+    beginning part of an identifier. Together with partChars this will allow 
+    you to extend the range of characters which make up an identifier in the 
+    language. By default the Java functions Character.isJavaIdentifierStart
+    and Character.isJavaIdentifierPart are used to find identifiers.
+  - partChars: a string of characters which should also be considered as 
+    part of an identifier.
+  - exclusiveChars: this is a switch, if present only the characters defined 
+    by beginChars and partChars will be considered as part of the identifiers. 
+* Updated keywords for PHP 5.3 
+* Added LINQ keywords to C# configuration
+* Additional keywords added to Delphi configuration
+* Basic plugin support to load additional highlighter implementations in Java.
+  See the following wiki page for some additional info:
+  https://sourceforge.net/apps/mediawiki/xslthl/index.php?title=Syntax_Highlighters#Plugin_highlighter 
+    
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..c460981
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,23 @@
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2012 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
diff --git a/highlighters/bourne-hl.xml b/highlighters/bourne-hl.xml
new file mode 100644
index 0000000..e2cd98d
--- /dev/null
+++ b/highlighters/bourne-hl.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Syntax highlighting definition for SH
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2010 Mathieu Malaterre
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+-->
+<highlighters>
+	<highlighter type="oneline-comment">#</highlighter>
+	<highlighter type="heredoc">
+		<start><<</start>
+		<quote>'</quote>
+		<quote>"</quote>
+		<flag>-</flag>
+		<noWhiteSpace />
+		<looseTerminator />
+	</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+		<spanNewLines />
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<pointStarts />
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<!-- reserved words -->
+		<keyword>if</keyword>
+		<keyword>then</keyword>
+		<keyword>else</keyword>
+		<keyword>elif</keyword>
+		<keyword>fi</keyword>
+		<keyword>case</keyword>
+		<keyword>esac</keyword>
+		<keyword>for</keyword>
+		<keyword>while</keyword>
+		<keyword>until</keyword>
+		<keyword>do</keyword>
+		<keyword>done</keyword>
+		<!-- built-ins -->
+		<keyword>exec</keyword>
+		<keyword>shift</keyword>
+		<keyword>exit</keyword>
+		<keyword>times</keyword>
+		<keyword>break</keyword>
+		<keyword>export</keyword>
+		<keyword>trap</keyword>
+		<keyword>continue</keyword>
+		<keyword>readonly</keyword>
+		<keyword>wait</keyword>
+		<keyword>eval</keyword>
+		<keyword>return</keyword>
+		<!-- other commands -->
+		<keyword>cd</keyword>
+		<keyword>echo</keyword>
+		<keyword>hash</keyword>
+		<keyword>pwd</keyword>
+		<keyword>read</keyword>
+		<keyword>set</keyword>
+		<keyword>test</keyword>
+		<keyword>type</keyword>
+		<keyword>ulimit</keyword>
+		<keyword>umask</keyword>
+		<keyword>unset</keyword>
+	</highlighter>
+</highlighters>
diff --git a/highlighters/c-hl.xml b/highlighters/c-hl.xml
new file mode 100644
index 0000000..81077ac
--- /dev/null
+++ b/highlighters/c-hl.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+Syntax highlighting definition for C
+	
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+-->
+<highlighters>
+	<highlighter type="multiline-comment">
+		<start>/**</start>
+		<end>*/</end>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="oneline-comment">
+		<start><![CDATA[/// ]]></start>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="multiline-comment">
+		<start>/*</start>
+		<end>*/</end>
+	</highlighter>
+	<highlighter type="oneline-comment">//</highlighter>
+	<highlighter type="oneline-comment">
+		<!-- use the online-comment highlighter to detect directives -->
+		<start>#</start>
+		<lineBreakEscape>\</lineBreakEscape>
+		<style>directive</style>
+		<solitary />
+	</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<suffix>ul</suffix>
+		<suffix>lu</suffix>
+		<suffix>u</suffix>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<pointStarts />
+		<exponent>e</exponent>
+		<suffix>ul</suffix>
+		<suffix>lu</suffix>
+		<suffix>u</suffix>
+		<suffix>f</suffix>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>auto</keyword>
+		<keyword>_Bool</keyword>
+		<keyword>break</keyword>
+		<keyword>case</keyword>
+		<keyword>char</keyword>
+		<keyword>_Complex</keyword>
+		<keyword>const</keyword>
+		<keyword>continue</keyword>
+		<keyword>default</keyword>
+		<keyword>do</keyword>
+		<keyword>double</keyword>
+		<keyword>else</keyword>
+		<keyword>enum</keyword>
+		<keyword>extern</keyword>
+		<keyword>float</keyword>
+		<keyword>for</keyword>
+		<keyword>goto</keyword>
+		<keyword>if</keyword>
+		<keyword>_Imaginary</keyword>
+		<keyword>inline</keyword>
+		<keyword>int</keyword>
+		<keyword>long</keyword>
+		<keyword>register</keyword>
+		<keyword>restrict</keyword>
+		<keyword>return</keyword>
+		<keyword>short</keyword>
+		<keyword>signed</keyword>
+		<keyword>sizeof</keyword>
+		<keyword>static</keyword>
+		<keyword>struct</keyword>
+		<keyword>switch</keyword>
+		<keyword>typedef</keyword>
+		<keyword>union</keyword>
+		<keyword>unsigned</keyword>
+		<keyword>void</keyword>
+		<keyword>volatile</keyword>
+		<keyword>while</keyword>
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/cmake-hl.xml b/highlighters/cmake-hl.xml
new file mode 100644
index 0000000..22921f4
--- /dev/null
+++ b/highlighters/cmake-hl.xml
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for CMake
+Copyright (c) 2010 Mathieu Malaterre
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+claim that you wrote the original software. If you use this software
+in a product, an acknowledgment in the product documentation would be
+appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+-->
+<highlighters>
+	<highlighter type="oneline-comment">#</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<endString>"</endString>
+		<spanNewLines />
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<suffix>l</suffix>
+		<ignoreCase />
+		<style>string</style>
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<ignoreCase />
+		<style>string</style>
+	</highlighter>
+	<highlighter type="keywords">
+		<!-- system variable -->
+		<keyword>WIN32</keyword>
+		<keyword>UNIX</keyword>
+		<keyword>APPLE</keyword>
+		<keyword>CYGWIN</keyword>
+		<keyword>BORLAND</keyword>
+		<keyword>MINGW</keyword>
+		<keyword>MSVC</keyword>
+		<keyword>MSVC_IDE</keyword>
+		<keyword>MSVC60</keyword>
+		<keyword>MSVC70</keyword>
+		<keyword>MSVC71</keyword>
+		<keyword>MSVC80</keyword>
+		<style>attribute</style>
+	</highlighter>
+	<highlighter type="keywords">
+		<!-- operators -->
+		<keyword>AND</keyword>
+		<keyword>BOOL</keyword>
+		<keyword>CACHE</keyword>
+		<keyword>COMMAND</keyword>
+		<keyword>DEFINED</keyword>
+		<keyword>DOC</keyword>
+		<keyword>EQUAL</keyword>
+		<keyword>EXISTS</keyword>
+		<keyword>FALSE</keyword>
+		<keyword>GREATER</keyword>
+		<keyword>INTERNAL</keyword>
+		<keyword>LESS</keyword>
+		<keyword>MATCHES</keyword>
+		<keyword>NAME</keyword>
+		<keyword>NAMES</keyword>
+		<keyword>NAME_WE</keyword>
+		<keyword>NOT</keyword>
+		<keyword>OFF</keyword>
+		<keyword>ON</keyword>
+		<keyword>OR</keyword>
+		<keyword>PATH</keyword>
+		<keyword>PATHS</keyword>
+		<keyword>PROGRAM</keyword>
+		<keyword>STREQUAL</keyword>
+		<keyword>STRGREATER</keyword>
+		<keyword>STRING</keyword>
+		<keyword>STRLESS</keyword>
+		<keyword>TRUE</keyword>
+		<!-- color in blue -->
+		<!--style>doccomment</style> -->
+		<style>keyword</style>
+	</highlighter>
+	<highlighter type="keywords">
+		<!-- statement -->
+		<keyword>ADD_CUSTOM_COMMAND</keyword>
+		<keyword>ADD_CUSTOM_TARGET</keyword>
+		<keyword>ADD_DEFINITIONS</keyword>
+		<keyword>ADD_DEPENDENCIES</keyword>
+		<keyword>ADD_EXECUTABLE</keyword>
+		<keyword>ADD_LIBRARY</keyword>
+		<keyword>ADD_SUBDIRECTORY</keyword>
+		<keyword>ADD_TEST</keyword>
+		<keyword>AUX_SOURCE_DIRECTORY</keyword>
+		<keyword>BUILD_COMMAND</keyword>
+		<keyword>BUILD_NAME</keyword>
+		<keyword>CMAKE_MINIMUM_REQUIRED</keyword>
+		<keyword>CONFIGURE_FILE</keyword>
+		<keyword>CREATE_TEST_SOURCELIST</keyword>
+		<keyword>ELSE</keyword>
+		<keyword>ELSEIF</keyword>
+		<keyword>ENABLE_LANGUAGE</keyword>
+		<keyword>ENABLE_TESTING</keyword>
+		<keyword>ENDFOREACH</keyword>
+		<keyword>ENDIF</keyword>
+		<keyword>ENDWHILE</keyword>
+		<keyword>EXEC_PROGRAM</keyword>
+		<keyword>EXECUTE_PROCESS</keyword>
+		<keyword>EXPORT_LIBRARY_DEPENDENCIES</keyword>
+		<keyword>FILE</keyword>
+		<keyword>FIND_FILE</keyword>
+		<keyword>FIND_LIBRARY</keyword>
+		<keyword>FIND_PACKAGE</keyword>
+		<keyword>FIND_PATH</keyword>
+		<keyword>FIND_PROGRAM</keyword>
+		<keyword>FLTK_WRAP_UI</keyword>
+		<keyword>FOREACH</keyword>
+		<keyword>GET_CMAKE_PROPERTY</keyword>
+		<keyword>GET_DIRECTORY_PROPERTY</keyword>
+		<keyword>GET_FILENAME_COMPONENT</keyword>
+		<keyword>GET_SOURCE_FILE_PROPERTY</keyword>
+		<keyword>GET_TARGET_PROPERTY</keyword>
+		<keyword>GET_TEST_PROPERTY</keyword>
+		<keyword>IF</keyword>
+		<keyword>INCLUDE</keyword>
+		<keyword>INCLUDE_DIRECTORIES</keyword>
+		<keyword>INCLUDE_EXTERNAL_MSPROJECT</keyword>
+		<keyword>INCLUDE_REGULAR_EXPRESSION</keyword>
+		<keyword>INSTALL</keyword>
+		<keyword>INSTALL_FILES</keyword>
+		<keyword>INSTALL_PROGRAMS</keyword>
+		<keyword>INSTALL_TARGETS</keyword>
+		<keyword>LINK_DIRECTORIES</keyword>
+		<keyword>LINK_LIBRARIES</keyword>
+		<keyword>LIST</keyword>
+		<keyword>LOAD_CACHE</keyword>
+		<keyword>LOAD_COMMAND</keyword>
+		<keyword>MACRO</keyword>
+		<keyword>MAKE_DIRECTORY</keyword>
+		<keyword>MARK_AS_ADVANCED</keyword>
+		<keyword>MATH</keyword>
+		<keyword>MESSAGE</keyword>
+		<keyword>OPTION</keyword>
+		<keyword>OUTPUT_REQUIRED_FILES</keyword>
+		<keyword>PROJECT</keyword>
+		<keyword>QT_WRAP_CPP</keyword>
+		<keyword>QT_WRAP_UI</keyword>
+		<keyword>REMOVE</keyword>
+		<keyword>REMOVE_DEFINITIONS</keyword>
+		<keyword>SEPARATE_ARGUMENTS</keyword>
+		<keyword>SET</keyword>
+		<keyword>SET_DIRECTORY_PROPERTIES</keyword>
+		<keyword>SET_SOURCE_FILES_PROPERTIES</keyword>
+		<keyword>SET_TARGET_PROPERTIES</keyword>
+		<keyword>SET_TESTS_PROPERTIES</keyword>
+		<keyword>SITE_NAME</keyword>
+		<keyword>SOURCE_GROUP</keyword>
+		<keyword>STRING</keyword>
+		<keyword>SUBDIR_DEPENDS</keyword>
+		<keyword>SUBDIRS</keyword>
+		<keyword>TARGET_LINK_LIBRARIES</keyword>
+		<keyword>TRY_COMPILE</keyword>
+		<keyword>TRY_RUN</keyword>
+		<keyword>USE_MANGLED_MESA</keyword>
+		<keyword>UTILITY_SOURCE</keyword>
+		<keyword>VARIABLE_REQUIRES</keyword>
+		<keyword>VTK_MAKE_INSTANTIATOR</keyword>
+		<keyword>VTK_WRAP_JAVA</keyword>
+		<keyword>VTK_WRAP_PYTHON</keyword>
+		<keyword>VTK_WRAP_TCL</keyword>
+		<keyword>WHILE</keyword>
+		<keyword>WRITE_FILE</keyword>
+		<keyword>ENDMACRO</keyword>
+		<ignoreCase />
+		<beginChars>()</beginChars>
+		<partChars>()</partChars>
+		<style>directive</style>
+	</highlighter>
+</highlighters>
diff --git a/highlighters/cpp-hl.xml b/highlighters/cpp-hl.xml
new file mode 100644
index 0000000..347eb72
--- /dev/null
+++ b/highlighters/cpp-hl.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for C++
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+	<highlighter type="multiline-comment">
+		<start>/**</start>
+		<end>*/</end>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="oneline-comment">
+		<start><![CDATA[/// ]]></start>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="multiline-comment">
+		<start>/*</start>
+		<end>*/</end>
+	</highlighter>
+	<highlighter type="oneline-comment">//</highlighter>
+	<highlighter type="oneline-comment">
+		<!-- use the online-comment highlighter to detect directives -->
+		<start>#</start>
+		<lineBreakEscape>\</lineBreakEscape>
+		<style>directive</style>
+		<solitary/>
+	</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<suffix>ul</suffix>
+		<suffix>lu</suffix>
+		<suffix>u</suffix>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<pointStarts />
+		<exponent>e</exponent>
+		<suffix>ul</suffix>
+		<suffix>lu</suffix>
+		<suffix>u</suffix>
+		<suffix>f</suffix>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<!-- C keywords -->
+		<keyword>auto</keyword>
+		<keyword>_Bool</keyword>
+		<keyword>break</keyword>
+		<keyword>case</keyword>
+		<keyword>char</keyword>
+		<keyword>_Complex</keyword>
+		<keyword>const</keyword>
+		<keyword>continue</keyword>
+		<keyword>default</keyword>
+		<keyword>do</keyword>
+		<keyword>double</keyword>
+		<keyword>else</keyword>
+		<keyword>enum</keyword>
+		<keyword>extern</keyword>
+		<keyword>float</keyword>
+		<keyword>for</keyword>
+		<keyword>goto</keyword>
+		<keyword>if</keyword>
+		<keyword>_Imaginary</keyword>
+		<keyword>inline</keyword>
+		<keyword>int</keyword>
+		<keyword>long</keyword>
+		<keyword>register</keyword>
+		<keyword>restrict</keyword>
+		<keyword>return</keyword>
+		<keyword>short</keyword>
+		<keyword>signed</keyword>
+		<keyword>sizeof</keyword>
+		<keyword>static</keyword>
+		<keyword>struct</keyword>
+		<keyword>switch</keyword>
+		<keyword>typedef</keyword>
+		<keyword>union</keyword>
+		<keyword>unsigned</keyword>
+		<keyword>void</keyword>
+		<keyword>volatile</keyword>
+		<keyword>while</keyword>
+		<!-- C++ keywords -->
+		<keyword>asm</keyword>
+		<keyword>dynamic_cast</keyword>
+		<keyword>namespace</keyword>
+		<keyword>reinterpret_cast</keyword>
+		<keyword>try</keyword>
+		<keyword>bool</keyword>
+		<keyword>explicit</keyword>
+		<keyword>new</keyword>
+		<keyword>static_cast</keyword>
+		<keyword>typeid</keyword>
+		<keyword>catch</keyword>
+		<keyword>false</keyword>
+		<keyword>operator</keyword>
+		<keyword>template</keyword>
+		<keyword>typename</keyword>
+		<keyword>class</keyword>
+		<keyword>friend</keyword>
+		<keyword>private</keyword>
+		<keyword>this</keyword>
+		<keyword>using</keyword>
+		<keyword>const_cast</keyword>
+		<keyword>inline</keyword>
+		<keyword>public</keyword>
+		<keyword>throw</keyword>
+		<keyword>virtual</keyword>
+		<keyword>delete</keyword>
+		<keyword>mutable</keyword>
+		<keyword>protected</keyword>
+		<keyword>true</keyword>
+		<keyword>wchar_t</keyword>
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/csharp-hl.xml b/highlighters/csharp-hl.xml
new file mode 100644
index 0000000..f352ead
--- /dev/null
+++ b/highlighters/csharp-hl.xml
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for C#
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+	<highlighter type="multiline-comment">
+		<start>/**</start>
+		<end>*/</end>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="oneline-comment">
+		<start>///</start>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="multiline-comment">
+		<start>/*</start>
+		<end>*/</end>
+	</highlighter>
+	<highlighter type="oneline-comment">//</highlighter>
+	<highlighter type="annotation">
+		<!-- annotations are called (custom) "attributes" in .NET -->
+		<start>[</start>
+		<end>]</end>
+		<valueStart>(</valueStart>
+		<valueEnd>)</valueEnd>
+	</highlighter>
+	<highlighter type="oneline-comment">
+		<!-- C# supports a couple of directives -->
+		<start>#</start>
+		<lineBreakEscape>\</lineBreakEscape>
+		<style>directive</style>
+		<solitary/>
+	</highlighter>
+	<highlighter type="string">
+		<!-- strings starting with an "@" can span multiple lines -->
+		<string>@"</string>
+		<endString>"</endString>
+		<escape>\</escape>
+		<spanNewLines />
+	</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<suffix>ul</suffix>
+		<suffix>lu</suffix>
+		<suffix>u</suffix>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<pointStarts />
+		<exponent>e</exponent>
+		<suffix>ul</suffix>
+		<suffix>lu</suffix>
+		<suffix>u</suffix>
+		<suffix>f</suffix>
+		<suffix>d</suffix>
+		<suffix>m</suffix>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>abstract</keyword>
+		<keyword>as</keyword>
+		<keyword>base</keyword>
+		<keyword>bool</keyword>
+		<keyword>break</keyword>
+		<keyword>byte</keyword>
+		<keyword>case</keyword>
+		<keyword>catch</keyword>
+		<keyword>char</keyword>
+		<keyword>checked</keyword>
+		<keyword>class</keyword>
+		<keyword>const</keyword>
+		<keyword>continue</keyword>
+		<keyword>decimal</keyword>
+		<keyword>default</keyword>
+		<keyword>delegate</keyword>
+		<keyword>do</keyword>
+		<keyword>double</keyword>
+		<keyword>else</keyword>
+		<keyword>enum</keyword>
+		<keyword>event</keyword>
+		<keyword>explicit</keyword>
+		<keyword>extern</keyword>
+		<keyword>false</keyword>
+		<keyword>finally</keyword>
+		<keyword>fixed</keyword>
+		<keyword>float</keyword>
+		<keyword>for</keyword>
+		<keyword>foreach</keyword>
+		<keyword>goto</keyword>
+		<keyword>if</keyword>
+		<keyword>implicit</keyword>
+		<keyword>in</keyword>
+		<keyword>int</keyword>
+		<keyword>interface</keyword>
+		<keyword>internal</keyword>
+		<keyword>is</keyword>
+		<keyword>lock</keyword>
+		<keyword>long</keyword>
+		<keyword>namespace</keyword>
+		<keyword>new</keyword>
+		<keyword>null</keyword>
+		<keyword>object</keyword>
+		<keyword>operator</keyword>
+		<keyword>out</keyword>
+		<keyword>override</keyword>
+		<keyword>params</keyword>
+		<keyword>private</keyword>
+		<keyword>protected</keyword>
+		<keyword>public</keyword>
+		<keyword>readonly</keyword>
+		<keyword>ref</keyword>
+		<keyword>return</keyword>
+		<keyword>sbyte</keyword>
+		<keyword>sealed</keyword>
+		<keyword>short</keyword>
+		<keyword>sizeof</keyword>
+		<keyword>stackalloc</keyword>
+		<keyword>static</keyword>
+		<keyword>string</keyword>
+		<keyword>struct</keyword>
+		<keyword>switch</keyword>
+		<keyword>this</keyword>
+		<keyword>throw</keyword>
+		<keyword>true</keyword>
+		<keyword>try</keyword>
+		<keyword>typeof</keyword>
+		<keyword>uint</keyword>
+		<keyword>ulong</keyword>
+		<keyword>unchecked</keyword>
+		<keyword>unsafe</keyword>
+		<keyword>ushort</keyword>
+		<keyword>using</keyword>
+		<keyword>virtual</keyword>
+		<keyword>void</keyword>
+		<keyword>volatile</keyword>
+		<keyword>while</keyword>
+	</highlighter>
+	<highlighter type="keywords">
+		<!-- special words, not really keywords -->
+		<keyword>add</keyword>
+		<keyword>alias</keyword>
+		<keyword>from</keyword>
+		<keyword>get</keyword>
+		<keyword>global</keyword>
+		<keyword>group</keyword>
+		<keyword>into</keyword>
+		<keyword>join</keyword>
+		<keyword>orderby</keyword>
+		<keyword>partial</keyword>
+		<keyword>remove</keyword>
+		<keyword>select</keyword>
+		<keyword>set</keyword>
+		<keyword>value</keyword>
+		<keyword>where</keyword>
+		<keyword>yield</keyword>
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/css21-hl.xml b/highlighters/css21-hl.xml
new file mode 100644
index 0000000..2a42b7c
--- /dev/null
+++ b/highlighters/css21-hl.xml
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for CSS files
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2011-2012 Martin Hujer, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Martin Hujer <mhujer at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+Reference: http://www.w3.org/TR/CSS21/propidx.html
+
+-->
+<highlighters>
+    <highlighter type="multiline-comment">
+        <start>/*</start>
+        <end>*/</end>
+    </highlighter>
+    <highlighter type="string">
+		<string>"</string>
+        <escape>\</escape>
+        <spanNewLines/>        
+    </highlighter>
+    <highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+        <spanNewLines/>
+    </highlighter>
+    <highlighter type="number">
+        <point>.</point>
+        <pointStarts />
+    </highlighter>
+    <highlighter type="word">
+    	<word>@charset</word>
+    	<word>@import</word>
+    	<word>@media</word>
+    	<word>@page</word>
+    	<style>directive</style>
+    </highlighter>
+    <highlighter type="keywords">
+        <partChars>-</partChars>
+        <keyword>azimuth</keyword>
+        <keyword>background-attachment</keyword>
+        <keyword>background-color</keyword>
+        <keyword>background-image</keyword>
+        <keyword>background-position</keyword>
+        <keyword>background-repeat</keyword>
+        <keyword>background</keyword>
+        <keyword>border-collapse</keyword>
+        <keyword>border-color</keyword>
+        <keyword>border-spacing</keyword>
+        <keyword>border-style</keyword>
+        <keyword>border-top</keyword>
+        <keyword>border-right</keyword>
+        <keyword>border-bottom</keyword>
+        <keyword>border-left</keyword>
+        <keyword>border-top-color</keyword>
+        <keyword>border-right-color</keyword>
+        <keyword>border-bottom-color</keyword>
+        <keyword>border-left-color</keyword>
+        <keyword>border-top-style</keyword>
+        <keyword>border-right-style</keyword>
+        <keyword>border-bottom-style</keyword>
+        <keyword>border-left-style</keyword>
+        <keyword>border-top-width</keyword>
+        <keyword>border-right-width</keyword>
+        <keyword>border-bottom-width</keyword>
+        <keyword>border-left-width</keyword>
+        <keyword>border-width</keyword>
+        <keyword>border</keyword>
+        <keyword>bottom</keyword>
+        <keyword>caption-side</keyword>
+        <keyword>clear</keyword>
+        <keyword>clip</keyword>
+        <keyword>color</keyword>
+        <keyword>content</keyword>
+        <keyword>counter-increment</keyword>
+        <keyword>counter-reset</keyword>
+        <keyword>cue-after</keyword>
+        <keyword>cue-before</keyword>
+        <keyword>cue</keyword>
+        <keyword>cursor</keyword>
+        <keyword>direction</keyword>
+        <keyword>display</keyword>
+        <keyword>elevation</keyword>
+        <keyword>empty-cells</keyword>
+        <keyword>float</keyword>
+        <keyword>font-family</keyword>
+        <keyword>font-size</keyword>
+        <keyword>font-style</keyword>
+        <keyword>font-variant</keyword>
+        <keyword>font-weight</keyword>
+        <keyword>font</keyword>
+        <keyword>height</keyword>
+        <keyword>left</keyword>
+        <keyword>letter-spacing</keyword>
+        <keyword>line-height</keyword>
+        <keyword>list-style-image</keyword>
+        <keyword>list-style-position</keyword>
+        <keyword>list-style-type</keyword>
+        <keyword>list-style</keyword>
+        <keyword>margin-right</keyword>
+        <keyword>margin-left</keyword>
+        <keyword>margin-top</keyword>
+        <keyword>margin-bottom</keyword>
+        <keyword>margin</keyword>
+        <keyword>max-height</keyword>
+        <keyword>max-width</keyword>
+        <keyword>min-height</keyword>
+        <keyword>min-width</keyword>
+        <keyword>orphans</keyword>
+        <keyword>outline-color</keyword>
+        <keyword>outline-style</keyword>
+        <keyword>outline-width</keyword>
+        <keyword>outline</keyword>
+        <keyword>overflow</keyword>
+        <keyword>padding-top</keyword>
+        <keyword>padding-right</keyword>
+        <keyword>padding-bottom</keyword>
+        <keyword>padding-left</keyword>
+        <keyword>padding</keyword>
+        <keyword>page-break-after</keyword>
+        <keyword>page-break-before</keyword>
+        <keyword>page-break-inside</keyword>
+        <keyword>pause-after</keyword>
+        <keyword>pause-before</keyword>
+        <keyword>pause</keyword>
+        <keyword>pitch-range</keyword>
+        <keyword>pitch</keyword>
+        <keyword>play-during</keyword>
+        <keyword>position</keyword>
+        <keyword>quotes</keyword>
+        <keyword>richness</keyword>
+        <keyword>right</keyword>
+        <keyword>speak-header</keyword>
+        <keyword>speak-numeral</keyword>
+        <keyword>speak-punctuation</keyword>
+        <keyword>speak</keyword>
+        <keyword>speech-rate</keyword>
+        <keyword>stress</keyword>
+        <keyword>table-layout</keyword>
+        <keyword>text-align</keyword>
+        <keyword>text-decoration</keyword>
+        <keyword>text-indent</keyword>
+        <keyword>text-transform</keyword>
+        <keyword>top</keyword>
+        <keyword>unicode-bidi</keyword>
+        <keyword>vertical-align</keyword>
+        <keyword>visibility</keyword>
+        <keyword>voice-family</keyword>
+        <keyword>volume</keyword>
+        <keyword>white-space</keyword>
+        <keyword>widows</keyword>
+        <keyword>width</keyword>
+        <keyword>word-spacing</keyword>
+        <keyword>z-index</keyword>
+    </highlighter>
+</highlighters>
diff --git a/highlighters/delphi-hl.xml b/highlighters/delphi-hl.xml
new file mode 100644
index 0000000..6cf8c4e
--- /dev/null
+++ b/highlighters/delphi-hl.xml
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Delphi (also suitable for Pascal)
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+        <highlighter type="multiline-comment">
+                <!-- multiline comments starting with an $ are directives -->
+                <start>{$</start>
+                <end>}</end>
+                <style>directive</style>
+        </highlighter>
+        <highlighter type="multiline-comment">
+                <!-- multiline comments starting with an $ are directives -->
+                <start>(*$</start>
+                <end>)</end>
+                <style>directive</style>
+        </highlighter>
+        <highlighter type="multiline-comment">
+                <start>{</start>
+                <end>}</end>
+        </highlighter>
+        <highlighter type="multiline-comment">
+                <start>(*</start>
+                <end>*)</end>
+        </highlighter>
+        <highlighter type="oneline-comment">//</highlighter>
+        <highlighter type="string">
+                <string>'</string>
+                <doubleEscapes />
+        </highlighter>
+        <highlighter type="hexnumber">
+                <prefix>#$</prefix>
+                <ignoreCase />
+                <style>string</style>           
+        </highlighter>
+        <highlighter type="number">
+                <prefix>#</prefix>
+                <ignoreCase />
+                <style>string</style>           
+        </highlighter>
+        <highlighter type="hexnumber">
+                <prefix>$</prefix>
+                <ignoreCase />
+        </highlighter>
+        <highlighter type="number">
+                <point>.</point>
+                <exponent>e</exponent>
+                <ignoreCase />
+        </highlighter>
+        <highlighter type="keywords">
+                <!-- Reserved words -->
+                <keyword>and</keyword>
+                <keyword>else</keyword>
+                <keyword>inherited</keyword>
+                <keyword>packed</keyword>
+                <keyword>then</keyword>
+                <keyword>array</keyword>
+                <keyword>end</keyword>
+                <keyword>initialization</keyword>
+                <keyword>procedure</keyword>
+                <keyword>threadvar</keyword>
+                <keyword>as</keyword>
+                <keyword>except</keyword>
+                <keyword>inline</keyword>
+                <keyword>program</keyword>
+                <keyword>to</keyword>
+                <keyword>asm</keyword>
+                <keyword>exports</keyword>
+                <keyword>interface</keyword>
+                <keyword>property</keyword>
+                <keyword>try</keyword>
+                <keyword>begin</keyword>
+                <keyword>file</keyword>
+                <keyword>is</keyword>
+                <keyword>raise</keyword>
+                <keyword>type</keyword>
+                <keyword>case</keyword>
+                <keyword>final</keyword>
+                <keyword>label</keyword>
+                <keyword>record</keyword>
+                <keyword>unit</keyword>
+                <keyword>class</keyword>
+                <keyword>finalization</keyword>
+                <keyword>library</keyword>
+                <keyword>repeat</keyword>
+                <keyword>unsafe</keyword>
+                <keyword>const</keyword>
+                <keyword>finally</keyword>
+                <keyword>mod</keyword>
+                <keyword>resourcestring</keyword>
+                <keyword>until</keyword>
+                <keyword>constructor</keyword>
+                <keyword>for</keyword>
+                <keyword>nil</keyword>
+                <keyword>sealed</keyword>
+                <keyword>uses</keyword>
+                <keyword>destructor</keyword>
+                <keyword>function</keyword>
+                <keyword>not</keyword>
+                <keyword>set</keyword>
+                <keyword>var</keyword>
+                <keyword>dispinterface</keyword>
+                <keyword>goto</keyword>
+                <keyword>object</keyword>
+                <keyword>shl</keyword>
+                <keyword>while</keyword>
+                <keyword>div</keyword>
+                <keyword>if</keyword>
+                <keyword>of</keyword>
+                <keyword>shr</keyword>
+                <keyword>with</keyword>
+                <keyword>do</keyword>
+                <keyword>implementation</keyword>
+                <keyword>or</keyword>
+                <keyword>static</keyword>
+                <keyword>xor</keyword>
+                <keyword>downto</keyword>
+                <keyword>in</keyword>
+                <keyword>out</keyword>
+                <keyword>string</keyword>
+                <keyword>exit</keyword> 
+                <keyword>break</keyword>
+                <keyword>continue</keyword>
+
+                <!-- Special meaning -->
+                <keyword>at</keyword>
+                <keyword>on</keyword>
+  
+                <!-- Directives -->
+                <keyword>absolute</keyword>
+                <keyword>dynamic</keyword>
+                <keyword>local</keyword>
+                <keyword>platform</keyword>
+                <keyword>requires</keyword>
+                <keyword>abstract</keyword>
+                <keyword>export</keyword>
+                <keyword>message</keyword>
+                <keyword>private</keyword>
+                <keyword>resident</keyword>
+                <keyword>assembler</keyword>
+                <keyword>external</keyword>
+                <keyword>name</keyword>
+                <keyword>protected</keyword>
+                <keyword>safecall</keyword>
+                <keyword>automated</keyword>
+                <keyword>far</keyword>
+                <keyword>near</keyword>
+                <keyword>public</keyword>
+                <keyword>stdcall</keyword>
+                <keyword>cdecl</keyword>
+                <keyword>forward</keyword>
+                <keyword>nodefault</keyword>
+                <keyword>published</keyword>
+                <keyword>stored</keyword>
+                <keyword>contains</keyword>
+                <keyword>implements</keyword>
+                <keyword>overload</keyword>
+                <keyword>read</keyword>
+                <keyword>varargs</keyword>
+                <keyword>default</keyword>
+                <keyword>index</keyword>
+                <keyword>override</keyword>
+                <keyword>readonly</keyword>
+                <keyword>virtual</keyword>
+                <keyword>deprecated</keyword>
+                <keyword>inline</keyword>
+                <keyword>package</keyword>
+                <keyword>register</keyword>
+                <keyword>write</keyword>
+                <keyword>dispid</keyword>
+                <keyword>library</keyword>
+                <keyword>pascal</keyword>
+                <keyword>reintroduce</keyword>
+                <keyword>writeonly</keyword>
+
+                <!-- Native pascal types of data  -->
+                <keyword>byte</keyword>
+                <keyword>shortint</keyword>
+                <keyword>word</keyword>
+                <keyword>smallint</keyword>
+                <keyword>longint</keyword>
+                <keyword>integer</keyword>
+                <keyword>cardinal</keyword>
+                <keyword>char</keyword>
+                <keyword>real</keyword>
+                <keyword>double</keyword>
+                <keyword>single</keyword>
+                <keyword>extended</keyword>
+                <keyword>comp</keyword>
+                <keyword>boolean</keyword>
+
+                <ignoreCase />
+        </highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/ini-hl.xml b/highlighters/ini-hl.xml
new file mode 100644
index 0000000..84be9c6
--- /dev/null
+++ b/highlighters/ini-hl.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for ini files
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+	<highlighter type="oneline-comment">;</highlighter>
+	<highlighter type="regex">	
+		<!-- ini sections -->
+		<pattern>^(\[.+\]\s*)$</pattern>
+		<style>keyword</style>
+		<flags>MULTILINE</flags>
+	</highlighter>
+	<highlighter type="regex">
+		<!-- the keys in an ini section -->
+		<pattern>^(.+)(?==)</pattern>
+		<style>attribute</style>
+		<flags>MULTILINE</flags>
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/java-hl.xml b/highlighters/java-hl.xml
new file mode 100644
index 0000000..d499d83
--- /dev/null
+++ b/highlighters/java-hl.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Java
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+	<highlighter type="multiline-comment">
+		<start>/**</start>
+		<end>*/</end>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="multiline-comment">
+		<start>/*</start>
+		<end>*/</end>
+	</highlighter>
+	<highlighter type="oneline-comment">//</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="annotation">
+		<start>@</start>
+		<valueStart>(</valueStart>
+		<valueEnd>)</valueEnd>
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<exponent>e</exponent>
+		<suffix>f</suffix>
+		<suffix>d</suffix>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>abstract</keyword>
+		<keyword>boolean</keyword>
+		<keyword>break</keyword>
+		<keyword>byte</keyword>
+		<keyword>case</keyword>
+		<keyword>catch</keyword>
+		<keyword>char</keyword>
+		<keyword>class</keyword>
+		<keyword>const</keyword>
+		<keyword>continue</keyword>
+		<keyword>default</keyword>
+		<keyword>do</keyword>
+		<keyword>double</keyword>
+		<keyword>else</keyword>
+		<keyword>extends</keyword>
+		<keyword>final</keyword>
+		<keyword>finally</keyword>
+		<keyword>float</keyword>
+		<keyword>for</keyword>
+		<keyword>goto</keyword>
+		<keyword>if</keyword>
+		<keyword>implements</keyword>
+		<keyword>import</keyword>
+		<keyword>instanceof</keyword>
+		<keyword>int</keyword>
+		<keyword>interface</keyword>
+		<keyword>long</keyword>
+		<keyword>native</keyword>
+		<keyword>new</keyword>
+		<keyword>package</keyword>
+		<keyword>private</keyword>
+		<keyword>protected</keyword>
+		<keyword>public</keyword>
+		<keyword>return</keyword>
+		<keyword>short</keyword>
+		<keyword>static</keyword>
+		<keyword>strictfp</keyword>
+		<keyword>super</keyword>
+		<keyword>switch</keyword>
+		<keyword>synchronized</keyword>
+		<keyword>this</keyword>
+		<keyword>throw</keyword>
+		<keyword>throws</keyword>
+		<keyword>transient</keyword>
+		<keyword>try</keyword>
+		<keyword>void</keyword>
+		<keyword>volatile</keyword>
+		<keyword>while</keyword>
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/javascript-hl.xml b/highlighters/javascript-hl.xml
new file mode 100644
index 0000000..08c90ba
--- /dev/null
+++ b/highlighters/javascript-hl.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for JavaScript
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+	<highlighter type="multiline-comment">
+		<start>/*</start>
+		<end>*/</end>
+	</highlighter>
+	<highlighter type="oneline-comment">//</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<exponent>e</exponent>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>break</keyword>
+		<keyword>case</keyword>
+		<keyword>catch</keyword>
+		<keyword>continue</keyword>
+		<keyword>default</keyword>
+		<keyword>delete</keyword>
+		<keyword>do</keyword>
+		<keyword>else</keyword>
+		<keyword>finally</keyword>
+		<keyword>for</keyword>
+		<keyword>function</keyword>
+		<keyword>if</keyword>
+		<keyword>in</keyword>
+		<keyword>instanceof</keyword>
+		<keyword>new</keyword>
+		<keyword>return</keyword>
+		<keyword>switch</keyword>
+		<keyword>this</keyword>
+		<keyword>throw</keyword>
+		<keyword>try</keyword>
+		<keyword>typeof</keyword>
+		<keyword>var</keyword>
+		<keyword>void</keyword>
+		<keyword>while</keyword>
+		<keyword>with</keyword>
+		<!-- future keywords -->
+		<keyword>abstract</keyword>
+		<keyword>boolean</keyword>
+		<keyword>byte</keyword>
+		<keyword>char</keyword>
+		<keyword>class</keyword>
+		<keyword>const</keyword>
+		<keyword>debugger</keyword>
+		<keyword>double</keyword>
+		<keyword>enum</keyword>
+		<keyword>export</keyword>
+		<keyword>extends</keyword>
+		<keyword>final</keyword>
+		<keyword>float</keyword>
+		<keyword>goto</keyword>
+		<keyword>implements</keyword>
+		<keyword>import</keyword>
+		<keyword>int</keyword>
+		<keyword>interface</keyword>
+		<keyword>long</keyword>
+		<keyword>native</keyword>
+		<keyword>package</keyword>
+		<keyword>private</keyword>
+		<keyword>protected</keyword>
+		<keyword>public</keyword>
+		<keyword>short</keyword>
+		<keyword>static</keyword>
+		<keyword>super</keyword>
+		<keyword>synchronized</keyword>
+		<keyword>throws</keyword>
+		<keyword>transient</keyword>
+		<keyword>volatile</keyword>
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>prototype</keyword>
+		<!-- Global Objects -->
+		<keyword>Array</keyword>
+		<keyword>Boolean</keyword>
+		<keyword>Date</keyword>
+		<keyword>Error</keyword>
+		<keyword>EvalError</keyword>
+		<keyword>Function</keyword>
+		<keyword>Math</keyword>
+		<keyword>Number</keyword>
+		<keyword>Object</keyword>
+		<keyword>RangeError</keyword>
+		<keyword>ReferenceError</keyword>
+		<keyword>RegExp</keyword>
+		<keyword>String</keyword>
+		<keyword>SyntaxError</keyword>
+		<keyword>TypeError</keyword>
+		<keyword>URIError</keyword>
+		<!-- Global functions -->
+		<keyword>decodeURI</keyword>
+		<keyword>decodeURIComponent</keyword>
+		<keyword>encodeURI</keyword>
+		<keyword>encodeURIComponent</keyword>
+		<keyword>eval</keyword>
+		<keyword>isFinite</keyword>
+		<keyword>isNaN</keyword>
+		<keyword>parseFloat</keyword>
+		<keyword>parseInt</keyword>
+		<!-- Global properties -->
+		<keyword>Infinity</keyword>
+		<keyword>NaN</keyword>
+		<keyword>undefined</keyword>
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/lua-hl.xml b/highlighters/lua-hl.xml
new file mode 100644
index 0000000..525fba9
--- /dev/null
+++ b/highlighters/lua-hl.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Lua 5.1 and 5.2
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2012 Patrick Rapin
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+ If you want to send an e-mail to Patrick Rapin, please execute the 
+ following decrypting script in Lua 5.1 or 5.2:
+    print(('oc mia.l at kmgrtci.naparip'):gsub('(..)(..)','%2%1'):reverse())
+-->
+
+<highlighters>
+  <highlighter type="keywords">
+    <keyword>and</keyword>
+    <keyword>break</keyword>
+    <keyword>do</keyword>
+    <keyword>else</keyword>
+    <keyword>elseif</keyword>
+    <keyword>end</keyword>
+    <keyword>false</keyword>
+    <keyword>for</keyword>
+    <keyword>function</keyword>
+    <keyword>goto</keyword>
+    <keyword>if</keyword>
+    <keyword>in</keyword>
+    <keyword>local</keyword>
+    <keyword>nil</keyword>
+    <keyword>not</keyword>
+    <keyword>or</keyword>
+    <keyword>repeat</keyword>
+    <keyword>return</keyword>
+    <keyword>then</keyword>
+    <keyword>true</keyword>
+    <keyword>until</keyword>
+    <keyword>while</keyword>
+  </highlighter>
+  
+  <!-- Multiline comments can have any number of equal signs 
+    between brackets. Let's support up to 4 -->
+  <highlighter type="multiline-comment">
+    <start>--[[</start>
+    <end>]]</end>
+  </highlighter>
+  <highlighter type="multiline-comment">
+    <start>--[=[</start>
+    <end>]=]</end>
+  </highlighter>
+  <highlighter type="multiline-comment">
+    <start>--[==[</start>
+    <end>]==]</end>
+  </highlighter>
+  <highlighter type="multiline-comment">
+    <start>--[===[</start>
+    <end>]===]</end>
+  </highlighter>
+  <highlighter type="multiline-comment">
+    <start>--[====[</start>
+    <end>]====]</end>
+  </highlighter>
+
+  <highlighter type="oneline-comment">
+    --
+  </highlighter>
+  
+  <highlighter type="string">
+    <string>"</string>
+    <endString>"</endString>
+    <escape>\</escape>
+    <spanNewLines/>
+  </highlighter>
+  
+  <highlighter type="string">
+    <string>'</string>
+    <endString>'</endString>
+    <escape>\</escape>
+    <spanNewLines/>
+  </highlighter>
+
+  <!-- Long strings can also have any number of equal signs. -->
+  <highlighter type="string">
+    <string>[[</string>
+    <endString>]]</endString>
+    <spanNewLines/>
+  </highlighter>
+  <highlighter type="string">
+    <string>[=[</string>
+    <endString>]=]</endString>
+    <spanNewLines/>
+  </highlighter>
+  <highlighter type="string">
+    <string>[==[</string>
+    <endString>]==]</endString>
+    <spanNewLines/>
+  </highlighter>
+  <highlighter type="string">
+    <string>[===[</string>
+    <endString>]===]</endString>
+    <spanNewLines/>
+  </highlighter>
+  <highlighter type="string">
+    <string>[====[</string>
+    <endString>]====]</endString>
+    <spanNewLines/>
+  </highlighter>
+
+  <highlighter type="number">
+    <point>.</point>
+    <pointStarts />
+    <exponent>e</exponent>
+    <ignoreCase />
+  </highlighter>
+
+  <highlighter type="hexnumber">
+    <prefix>0x</prefix>
+    <point>.</point>
+    <pointStarts />
+    <exponent>p</exponent>
+    <ignoreCase />
+  </highlighter>
+  
+</highlighters>
diff --git a/highlighters/m2-hl.xml b/highlighters/m2-hl.xml
new file mode 100644
index 0000000..a3ef314
--- /dev/null
+++ b/highlighters/m2-hl.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Modulo-2
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+	<highlighter type="nested-multiline-comment">
+		<start>(*</start>
+		<end>*)</end>
+	</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<exponent>e</exponent>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>and</keyword>
+		<keyword>array</keyword>
+		<keyword>begin</keyword>
+		<keyword>by</keyword>
+		<keyword>case</keyword>
+		<keyword>const</keyword>
+		<keyword>definition</keyword>
+		<keyword>div</keyword>
+		<keyword>do</keyword>
+		<keyword>else</keyword>
+		<keyword>elsif</keyword>
+		<keyword>end</keyword>
+		<keyword>exit</keyword>
+		<keyword>export</keyword>
+		<keyword>for</keyword>
+		<keyword>from</keyword>
+		<keyword>if</keyword>
+		<keyword>implementation</keyword>
+		<keyword>import</keyword>
+		<keyword>in</keyword>
+		<keyword>loop</keyword>
+		<keyword>mod</keyword>
+		<keyword>module</keyword>
+		<keyword>not</keyword>
+		<keyword>of</keyword>
+		<keyword>or</keyword>
+		<keyword>pointer</keyword>
+		<keyword>procedure</keyword>
+		<keyword>qualified</keyword>
+		<keyword>record</keyword>
+		<keyword>repeat</keyword>
+		<keyword>return</keyword>
+		<keyword>set</keyword>
+		<keyword>then</keyword>
+		<keyword>to</keyword>
+		<keyword>type</keyword>
+		<keyword>until</keyword>
+		<keyword>var</keyword>
+		<keyword>while</keyword>
+		<keyword>with</keyword>
+		<ignoreCase />
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/myxml-hl.xml b/highlighters/myxml-hl.xml
new file mode 100644
index 0000000..efa90d7
--- /dev/null
+++ b/highlighters/myxml-hl.xml
@@ -0,0 +1,116 @@
+<?xml version='1.0'?>
+<!--
+
+  Bakalarska prace: Zvyraznovani syntaxe v XSLT
+  Michal Molhanec 2005
+
+  myxml-hl.xml - konfigurace zvyraznovace XML, ktera zvlast zvyrazni
+                 HTML elementy a XSL elementy
+
+-->
+<highlighters>
+
+<wholehighlighter type='xml'>
+  <elementSet>
+    <style>html</style>
+    <element>A</element>
+    <element>ABBR</element>
+    <element>ACRONYM</element>
+    <element>ADDRESS</element>
+    <element>APPLET</element>
+    <element>AREA</element>
+    <element>B</element>
+    <element>BASE</element>
+    <element>BASEFONT</element>
+    <element>BDO</element>
+    <element>BIG</element>
+    <element>BLOCKQUOTE</element>
+    <element>BODY</element>
+    <element>BR</element>
+    <element>BUTTON</element>
+    <element>CAPTION</element>
+    <element>CENTER</element>
+    <element>CITE</element>
+    <element>CODE</element>
+    <element>COL</element>
+    <element>COLGROUP</element>
+    <element>DD</element>
+    <element>DEL</element>
+    <element>DFN</element>
+    <element>DIR</element>
+    <element>DIV</element>
+    <element>DL</element>
+    <element>DT</element>
+    <element>EM</element>
+    <element>FIELDSET</element>
+    <element>FONT</element>
+    <element>FORM</element>
+    <element>FRAME</element>
+    <element>FRAMESET</element>
+    <element>H1</element>
+    <element>H2</element>
+    <element>H3</element>
+    <element>H4</element>
+    <element>H5</element>
+    <element>H6</element>
+    <element>HEAD</element>
+    <element>HR</element>
+    <element>HTML</element>
+    <element>I</element>
+    <element>IFRAME</element>
+    <element>IMG</element>
+    <element>INPUT</element>
+    <element>INS</element>
+    <element>ISINDEX</element>
+    <element>KBD</element>
+    <element>LABEL</element>
+    <element>LEGEND</element>
+    <element>LI</element>
+    <element>LINK</element>
+    <element>MAP</element>
+    <element>MENU</element>
+    <element>META</element>
+    <element>NOFRAMES</element>
+    <element>NOSCRIPT</element>
+    <element>OBJECT</element>
+    <element>OL</element>
+    <element>OPTGROUP</element>
+    <element>OPTION</element>
+    <element>P</element>
+    <element>PARAM</element>
+    <element>PRE</element>
+    <element>Q</element>
+    <element>S</element>
+    <element>SAMP</element>
+    <element>SCRIPT</element>
+    <element>SELECT</element>
+    <element>SMALL</element>
+    <element>SPAN</element>
+    <element>STRIKE</element>
+    <element>STRONG</element>
+    <element>STYLE</element>
+    <element>SUB</element>
+    <element>SUP</element>
+    <element>TABLE</element>
+    <element>TBODY</element>
+    <element>TD</element>
+    <element>TEXTAREA</element>
+    <element>TFOOT</element>
+    <element>TH</element>
+    <element>THEAD</element>
+    <element>TITLE</element>
+    <element>TR</element>
+    <element>TT</element>
+    <element>U</element>
+    <element>UL</element>
+    <element>VAR</element>
+    <element>XMP</element>
+    <ignoreCase/>
+  </elementSet>
+  <elementPrefix>
+    <style>xslt</style>
+    <prefix>xsl:</prefix>
+  </elementPrefix>
+</wholehighlighter>
+
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/perl-hl.xml b/highlighters/perl-hl.xml
new file mode 100644
index 0000000..da1924a
--- /dev/null
+++ b/highlighters/perl-hl.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Perl
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+	<highlighter type="oneline-comment">#</highlighter>
+	<highlighter type="heredoc">
+		<start><<</start>
+		<quote>'</quote>
+		<quote>"</quote>
+		<noWhiteSpace/>
+	</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+		<spanNewLines/>
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<pointStarts />
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>if</keyword>
+		<keyword>unless</keyword>
+		<keyword>while</keyword>
+		<keyword>until</keyword>
+		<keyword>foreach</keyword>
+		<keyword>else</keyword>
+		<keyword>elsif</keyword>
+		<keyword>for</keyword>
+		<keyword>when</keyword>
+		<keyword>default</keyword>
+		<keyword>given</keyword>
+		<!-- Keywords related to the control flow of your perl program  -->
+		<keyword>caller</keyword>
+		<keyword>continue</keyword> 
+		<keyword>die</keyword>
+		<keyword>do</keyword>
+		<keyword>dump</keyword>
+		<keyword>eval</keyword>
+		<keyword>exit</keyword>
+		<keyword>goto</keyword>
+		<keyword>last</keyword>
+		<keyword>next</keyword>
+		<keyword>redo</keyword>
+		<keyword>return</keyword>
+		<keyword>sub</keyword>
+		<keyword>wantarray</keyword>
+		<!-- Keywords related to scoping  -->
+		<keyword>caller</keyword>
+		<keyword>import</keyword>
+		<keyword>local</keyword>
+		<keyword>my</keyword>
+		<keyword>package</keyword>
+		<keyword>use</keyword>
+		<!-- Keywords related to perl modules  -->
+		<keyword>do</keyword>
+		<keyword>import</keyword>
+		<keyword>no</keyword>
+		<keyword>package</keyword>
+		<keyword>require</keyword>
+		<keyword>use</keyword>
+		<!-- Keywords related to classes and object-orientedness  -->
+		<keyword>bless</keyword>
+		<keyword>dbmclose</keyword>
+		<keyword>dbmopen</keyword>
+		<keyword>package</keyword>
+		<keyword>ref</keyword>
+		<keyword>tie</keyword>
+		<keyword>tied</keyword>
+		<keyword>untie</keyword>
+		<keyword>use</keyword>
+		<!-- operators -->
+		<keyword>and</keyword>
+		<keyword>or</keyword>
+		<keyword>not</keyword>
+		<keyword>eq</keyword>
+		<keyword>ne</keyword>
+		<keyword>lt</keyword>
+		<keyword>gt</keyword>
+		<keyword>le</keyword>
+		<keyword>ge</keyword>
+		<keyword>cmp</keyword>
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/php-hl.xml b/highlighters/php-hl.xml
new file mode 100644
index 0000000..a0b1df8
--- /dev/null
+++ b/highlighters/php-hl.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for PHP
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+	<highlighter type="multiline-comment">
+		<start>/**</start>
+		<end>*/</end>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="oneline-comment">
+		<start><![CDATA[/// ]]></start>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="multiline-comment">
+		<start>/*</start>
+		<end>*/</end>
+	</highlighter>
+	<highlighter type="oneline-comment">//</highlighter>
+	<highlighter type="oneline-comment">#</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+		<spanNewLines />
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+		<spanNewLines />
+	</highlighter>
+	<highlighter type="heredoc">
+		<start><<<</start>
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<exponent>e</exponent>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>and</keyword>
+		<keyword>or</keyword>
+		<keyword>xor</keyword>
+		<keyword>__FILE__</keyword>
+		<keyword>exception</keyword>
+		<keyword>__LINE__</keyword>
+		<keyword>array</keyword>
+		<keyword>as</keyword>
+		<keyword>break</keyword>
+		<keyword>case</keyword>
+		<keyword>class</keyword>
+		<keyword>const</keyword>
+		<keyword>continue</keyword>
+		<keyword>declare</keyword>
+		<keyword>default</keyword>
+		<keyword>die</keyword>
+		<keyword>do</keyword>
+		<keyword>echo</keyword>
+		<keyword>else</keyword>
+		<keyword>elseif</keyword>
+		<keyword>empty</keyword>
+		<keyword>enddeclare</keyword>
+		<keyword>endfor</keyword>
+		<keyword>endforeach</keyword>
+		<keyword>endif</keyword>
+		<keyword>endswitch</keyword>
+		<keyword>endwhile</keyword>
+		<keyword>eval</keyword>
+		<keyword>exit</keyword>
+		<keyword>extends</keyword>
+		<keyword>for</keyword>
+		<keyword>foreach</keyword>
+		<keyword>function</keyword>
+		<keyword>global</keyword>
+		<keyword>if</keyword>
+		<keyword>include</keyword>
+		<keyword>include_once</keyword>
+		<keyword>isset</keyword>
+		<keyword>list</keyword>
+		<keyword>new</keyword>
+		<keyword>print</keyword>
+		<keyword>require</keyword>
+		<keyword>require_once</keyword>
+		<keyword>return</keyword>
+		<keyword>static</keyword>
+		<keyword>switch</keyword>
+		<keyword>unset</keyword>
+		<keyword>use</keyword>
+		<keyword>var</keyword>
+		<keyword>while</keyword>
+		<keyword>__FUNCTION__</keyword>
+		<keyword>__CLASS__</keyword>
+		<keyword>__METHOD__</keyword>
+		<keyword>final</keyword>
+		<keyword>php_user_filter</keyword>
+		<keyword>interface</keyword>
+		<keyword>implements</keyword>
+		<keyword>extends</keyword>
+		<keyword>public</keyword>
+		<keyword>private</keyword>
+		<keyword>protected</keyword>
+		<keyword>abstract</keyword>
+		<keyword>clone</keyword>
+		<keyword>try</keyword>
+		<keyword>catch</keyword>
+		<keyword>throw</keyword>
+		<keyword>cfunction</keyword>
+		<keyword>old_function</keyword>
+		<keyword>true</keyword>
+		<keyword>false</keyword>
+		<!-- PHP 5.3 -->
+		<keyword>namespace</keyword>
+		<keyword>__NAMESPACE__</keyword>
+		<keyword>goto</keyword>
+		<keyword>__DIR__</keyword>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="word">
+		<!-- highlight the php open and close tags as directives -->
+		<word>?></word>
+		<word><?php</word>
+		<word><?=</word>
+		<style>directive</style>
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/python-hl.xml b/highlighters/python-hl.xml
new file mode 100644
index 0000000..791bc7a
--- /dev/null
+++ b/highlighters/python-hl.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Python
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+	<highlighter type="annotation">
+		<!-- these are actually called decorators -->
+		<start>@</start>
+		<valueStart>(</valueStart>
+		<valueEnd>)</valueEnd>
+	</highlighter>
+	<highlighter type="oneline-comment">#</highlighter>
+	<highlighter type="string">
+		<string>"""</string>
+		<spanNewLines />
+	</highlighter>
+	<highlighter type="string">
+		<string>'''</string>
+		<spanNewLines />
+	</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<pointStarts />
+		<exponent>e</exponent>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>and</keyword>
+		<keyword>del</keyword>
+		<keyword>from</keyword>
+		<keyword>not</keyword>
+		<keyword>while</keyword>
+		<keyword>as</keyword>
+		<keyword>elif</keyword>
+		<keyword>global</keyword>
+		<keyword>or</keyword>
+		<keyword>with</keyword>
+		<keyword>assert</keyword>
+		<keyword>else</keyword>
+		<keyword>if</keyword>
+		<keyword>pass</keyword>
+		<keyword>yield</keyword>
+		<keyword>break</keyword>
+		<keyword>except</keyword>
+		<keyword>import</keyword>
+		<keyword>print</keyword>
+		<keyword>class</keyword>
+		<keyword>exec</keyword>
+		<keyword>in</keyword>
+		<keyword>raise</keyword>
+		<keyword>continue</keyword>
+		<keyword>finally</keyword>
+		<keyword>is</keyword>
+		<keyword>return</keyword>
+		<keyword>def</keyword>
+		<keyword>for</keyword>
+		<keyword>lambda</keyword>
+		<keyword>try</keyword>
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/ruby-hl.xml b/highlighters/ruby-hl.xml
new file mode 100644
index 0000000..78189b0
--- /dev/null
+++ b/highlighters/ruby-hl.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Ruby
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+	<highlighter type="oneline-comment">#</highlighter>
+	<highlighter type="heredoc">
+		<start><<</start>
+		<noWhiteSpace/>
+	</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>%Q{</string>
+		<endString>}</endString>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>%/</string>
+		<endString>/</endString>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>%q{</string>
+		<endString>}</endString>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<exponent>e</exponent>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>alias</keyword>
+		<keyword>and</keyword>
+		<keyword>BEGIN</keyword>
+		<keyword>begin</keyword>
+		<keyword>break</keyword>
+		<keyword>case</keyword>
+		<keyword>class</keyword>
+		<keyword>def</keyword>
+		<keyword>defined</keyword>
+		<keyword>do</keyword>
+		<keyword>else</keyword>
+		<keyword>elsif</keyword>
+		<keyword>END</keyword>
+		<keyword>end</keyword>
+		<keyword>ensure</keyword>
+		<keyword>false</keyword>
+		<keyword>for</keyword>
+		<keyword>if</keyword>
+		<keyword>in</keyword>
+		<keyword>module</keyword>
+		<keyword>next</keyword>
+		<keyword>nil</keyword>
+		<keyword>not</keyword>
+		<keyword>or</keyword>
+		<keyword>redo</keyword>
+		<keyword>rescue</keyword>
+		<keyword>retry</keyword>
+		<keyword>return</keyword>
+		<keyword>self</keyword>
+		<keyword>super</keyword>
+		<keyword>then</keyword>
+		<keyword>true</keyword>
+		<keyword>undef</keyword>
+		<keyword>unless</keyword>
+		<keyword>until</keyword>
+		<keyword>when</keyword>
+		<keyword>while</keyword>
+		<keyword>yield</keyword>
+	</highlighter>
+</highlighters>
\ No newline at end of file
diff --git a/highlighters/sql1999-hl.xml b/highlighters/sql1999-hl.xml
new file mode 100644
index 0000000..61b2411
--- /dev/null
+++ b/highlighters/sql1999-hl.xml
@@ -0,0 +1,496 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Syntax highlighting definition for SQL:1999
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2012 Michiel Hendriks, Martin Hujer, k42b3
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+-->
+<highlighters>
+	<highlighter type="oneline-comment">--</highlighter>
+	<highlighter type="multiline-comment">
+		<start>/*</start>
+		<end>*/</end>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="string">
+		<string>B'</string>
+		<endString>'</endString>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="string">
+		<string>N'</string>
+		<endString>'</endString>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="string">
+		<string>X'</string>
+		<endString>'</endString>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<pointStarts />
+		<exponent>e</exponent>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<ignoreCase />
+		<!-- reserved -->
+		<keyword>ABSOLUTE</keyword>
+		<keyword>ACTION</keyword>
+		<keyword>ADD</keyword>
+		<keyword>AFTER</keyword>
+		<keyword>ALL</keyword>
+		<keyword>ALLOCATE</keyword>
+		<keyword>ALTER</keyword>
+		<keyword>AND</keyword>
+		<keyword>ANY</keyword>
+		<keyword>ARE</keyword>
+		<keyword>ARRAY</keyword>
+		<keyword>AS</keyword>
+		<keyword>ASC</keyword>
+		<keyword>ASSERTION</keyword>
+		<keyword>AT</keyword>
+		<keyword>AUTHORIZATION</keyword>
+		<keyword>BEFORE</keyword>
+		<keyword>BEGIN</keyword>
+		<keyword>BETWEEN</keyword>
+		<keyword>BINARY</keyword>
+		<keyword>BIT</keyword>
+		<keyword>BLOB</keyword>
+		<keyword>BOOLEAN</keyword>
+		<keyword>BOTH</keyword>
+		<keyword>BREADTH</keyword>
+		<keyword>BY</keyword>
+		<keyword>CALL</keyword>
+		<keyword>CASCADE</keyword>
+		<keyword>CASCADED</keyword>
+		<keyword>CASE</keyword>
+		<keyword>CAST</keyword>
+		<keyword>CATALOG</keyword>
+		<keyword>CHAR</keyword>
+		<keyword>CHARACTER</keyword>
+		<keyword>CHECK</keyword>
+		<keyword>CLOB</keyword>
+		<keyword>CLOSE</keyword>
+		<keyword>COLLATE</keyword>
+		<keyword>COLLATION</keyword>
+		<keyword>COLUMN</keyword>
+		<keyword>COMMIT</keyword>
+		<keyword>CONDITION</keyword>
+		<keyword>CONNECT</keyword>
+		<keyword>CONNECTION</keyword>
+		<keyword>CONSTRAINT</keyword>
+		<keyword>CONSTRAINTS</keyword>
+		<keyword>CONSTRUCTOR</keyword>
+		<keyword>CONTINUE</keyword>
+		<keyword>CORRESPONDING</keyword>
+		<keyword>CREATE</keyword>
+		<keyword>CROSS</keyword>
+		<keyword>CUBE</keyword>
+		<keyword>CURRENT</keyword>
+		<keyword>CURRENT_DATE</keyword>
+		<keyword>CURRENT_DEFAULT_TRANSFORM_GROUP</keyword>
+		<keyword>CURRENT_TRANSFORM_GROUP_FOR_TYPE</keyword>
+		<keyword>CURRENT_PATH</keyword>
+		<keyword>CURRENT_ROLE</keyword>
+		<keyword>CURRENT_TIME</keyword>
+		<keyword>CURRENT_TIMESTAMP</keyword>
+		<keyword>CURRENT_USER</keyword>
+		<keyword>CURSOR</keyword>
+		<keyword>CYCLE</keyword>
+		<keyword>DATA</keyword>
+		<keyword>DATE</keyword>
+		<keyword>DAY</keyword>
+		<keyword>DEALLOCATE</keyword>
+		<keyword>DEC</keyword>
+		<keyword>DECIMAL</keyword>
+		<keyword>DECLARE</keyword>
+		<keyword>DEFAULT</keyword>
+		<keyword>DEFERRABLE</keyword>
+		<keyword>DEFERRED</keyword>
+		<keyword>DELETE</keyword>
+		<keyword>DEPTH</keyword>
+		<keyword>DEREF</keyword>
+		<keyword>DESC</keyword>
+		<keyword>DESCRIBE</keyword>
+		<keyword>DESCRIPTOR</keyword>
+		<keyword>DETERMINISTIC</keyword>
+		<keyword>DIAGNOSTICS</keyword>
+		<keyword>DISCONNECT</keyword>
+		<keyword>DISTINCT</keyword>
+		<keyword>DO</keyword>
+		<keyword>DOMAIN</keyword>
+		<keyword>DOUBLE</keyword>
+		<keyword>DROP</keyword>
+		<keyword>DYNAMIC</keyword>
+		<keyword>EACH</keyword>
+		<keyword>ELSE</keyword>
+		<keyword>ELSEIF</keyword>
+		<keyword>END</keyword>
+		<keyword>END-EXEC</keyword>
+		<keyword>EQUALS</keyword>
+		<keyword>ESCAPE</keyword>
+		<keyword>EXCEPT</keyword>
+		<keyword>EXCEPTION</keyword>
+		<keyword>EXEC</keyword>
+		<keyword>EXECUTE</keyword>
+		<keyword>EXISTS</keyword>
+		<keyword>EXIT</keyword>
+		<keyword>EXTERNAL</keyword>
+		<keyword>FALSE</keyword>
+		<keyword>FETCH</keyword>
+		<keyword>FIRST</keyword>
+		<keyword>FLOAT</keyword>
+		<keyword>FOR</keyword>
+		<keyword>FOREIGN</keyword>
+		<keyword>FOUND</keyword>
+		<keyword>FROM</keyword>
+		<keyword>FREE</keyword>
+		<keyword>FULL</keyword>
+		<keyword>FUNCTION</keyword>
+		<keyword>GENERAL</keyword>
+		<keyword>GET</keyword>
+		<keyword>GLOBAL</keyword>
+		<keyword>GO</keyword>
+		<keyword>GOTO</keyword>
+		<keyword>GRANT</keyword>
+		<keyword>GROUP</keyword>
+		<keyword>GROUPING</keyword>
+		<keyword>HANDLE</keyword>
+		<keyword>HAVING</keyword>
+		<keyword>HOLD</keyword>
+		<keyword>HOUR</keyword>
+		<keyword>IDENTITY</keyword>
+		<keyword>IF</keyword>
+		<keyword>IMMEDIATE</keyword>
+		<keyword>IN</keyword>
+		<keyword>INDICATOR</keyword>
+		<keyword>INITIALLY</keyword>
+		<keyword>INNER</keyword>
+		<keyword>INOUT</keyword>
+		<keyword>INPUT</keyword>
+		<keyword>INSERT</keyword>
+		<keyword>INT</keyword>
+		<keyword>INTEGER</keyword>
+		<keyword>INTERSECT</keyword>
+		<keyword>INTERVAL</keyword>
+		<keyword>INTO</keyword>
+		<keyword>IS</keyword>
+		<keyword>ISOLATION</keyword>
+		<keyword>JOIN</keyword>
+		<keyword>KEY</keyword>
+		<keyword>LANGUAGE</keyword>
+		<keyword>LARGE</keyword>
+		<keyword>LAST</keyword>
+		<keyword>LATERAL</keyword>
+		<keyword>LEADING</keyword>
+		<keyword>LEAVE</keyword>
+		<keyword>LEFT</keyword>
+		<keyword>LEVEL</keyword>
+		<keyword>LIKE</keyword>
+		<keyword>LOCAL</keyword>
+		<keyword>LOCALTIME</keyword>
+		<keyword>LOCALTIMESTAMP</keyword>
+		<keyword>LOCATOR</keyword>
+		<keyword>LOOP</keyword>
+		<keyword>MAP</keyword>
+		<keyword>MATCH</keyword>
+		<keyword>METHOD</keyword>
+		<keyword>MINUTE</keyword>
+		<keyword>MODIFIES</keyword>
+		<keyword>MODULE</keyword>
+		<keyword>MONTH</keyword>
+		<keyword>NAMES</keyword>
+		<keyword>NATIONAL</keyword>
+		<keyword>NATURAL</keyword>
+		<keyword>NCHAR</keyword>
+		<keyword>NCLOB</keyword>
+		<keyword>NESTING</keyword>
+		<keyword>NEW</keyword>
+		<keyword>NEXT</keyword>
+		<keyword>NO</keyword>
+		<keyword>NONE</keyword>
+		<keyword>NOT</keyword>
+		<keyword>NULL</keyword>
+		<keyword>NUMERIC</keyword>
+		<keyword>OBJECT</keyword>
+		<keyword>OF</keyword>
+		<keyword>OLD</keyword>
+		<keyword>ON</keyword>
+		<keyword>ONLY</keyword>
+		<keyword>OPEN</keyword>
+		<keyword>OPTION</keyword>
+		<keyword>OR</keyword>
+		<keyword>ORDER</keyword>
+		<keyword>ORDINALITY</keyword>
+		<keyword>OUT</keyword>
+		<keyword>OUTER</keyword>
+		<keyword>OUTPUT</keyword>
+		<keyword>OVERLAPS</keyword>
+		<keyword>PAD</keyword>
+		<keyword>PARAMETER</keyword>
+		<keyword>PARTIAL</keyword>
+		<keyword>PATH</keyword>
+		<keyword>PRECISION</keyword>
+		<keyword>PREPARE</keyword>
+		<keyword>PRESERVE</keyword>
+		<keyword>PRIMARY</keyword>
+		<keyword>PRIOR</keyword>
+		<keyword>PRIVILEGES</keyword>
+		<keyword>PROCEDURE</keyword>
+		<keyword>PUBLIC</keyword>
+		<keyword>READ</keyword>
+		<keyword>READS</keyword>
+		<keyword>REAL</keyword>
+		<keyword>RECURSIVE</keyword>
+		<keyword>REDO</keyword>
+		<keyword>REF</keyword>
+		<keyword>REFERENCES</keyword>
+		<keyword>REFERENCING</keyword>
+		<keyword>RELATIVE</keyword>
+		<keyword>RELEASE</keyword>
+		<keyword>REPEAT</keyword>
+		<keyword>RESIGNAL</keyword>
+		<keyword>RESTRICT</keyword>
+		<keyword>RESULT</keyword>
+		<keyword>RETURN</keyword>
+		<keyword>RETURNS</keyword>
+		<keyword>REVOKE</keyword>
+		<keyword>RIGHT</keyword>
+		<keyword>ROLE</keyword>
+		<keyword>ROLLBACK</keyword>
+		<keyword>ROLLUP</keyword>
+		<keyword>ROUTINE</keyword>
+		<keyword>ROW</keyword>
+		<keyword>ROWS</keyword>
+		<keyword>SAVEPOINT</keyword>
+		<keyword>SCHEMA</keyword>
+		<keyword>SCROLL</keyword>
+		<keyword>SEARCH</keyword>
+		<keyword>SECOND</keyword>
+		<keyword>SECTION</keyword>
+		<keyword>SELECT</keyword>
+		<keyword>SESSION</keyword>
+		<keyword>SESSION_USER</keyword>
+		<keyword>SET</keyword>
+		<keyword>SETS</keyword>
+		<keyword>SIGNAL</keyword>
+		<keyword>SIMILAR</keyword>
+		<keyword>SIZE</keyword>
+		<keyword>SMALLINT</keyword>
+		<keyword>SOME</keyword>
+		<keyword>SPACE</keyword>
+		<keyword>SPECIFIC</keyword>
+		<keyword>SPECIFICTYPE</keyword>
+		<keyword>SQL</keyword>
+		<keyword>SQLEXCEPTION</keyword>
+		<keyword>SQLSTATE</keyword>
+		<keyword>SQLWARNING</keyword>
+		<keyword>START</keyword>
+		<keyword>STATE</keyword>
+		<keyword>STATIC</keyword>
+		<keyword>SYSTEM_USER</keyword>
+		<keyword>TABLE</keyword>
+		<keyword>TEMPORARY</keyword>
+		<keyword>THEN</keyword>
+		<keyword>TIME</keyword>
+		<keyword>TIMESTAMP</keyword>
+		<keyword>TIMEZONE_HOUR</keyword>
+		<keyword>TIMEZONE_MINUTE</keyword>
+		<keyword>TO</keyword>
+		<keyword>TRAILING</keyword>
+		<keyword>TRANSACTION</keyword>
+		<keyword>TRANSLATION</keyword>
+		<keyword>TREAT</keyword>
+		<keyword>TRIGGER</keyword>
+		<keyword>TRUE</keyword>
+		<keyword>UNDER</keyword>
+		<keyword>UNDO</keyword>
+		<keyword>UNION</keyword>
+		<keyword>UNIQUE</keyword>
+		<keyword>UNKNOWN</keyword>
+		<keyword>UNNEST</keyword>
+		<keyword>UNTIL</keyword>
+		<keyword>UPDATE</keyword>
+		<keyword>USAGE</keyword>
+		<keyword>USER</keyword>
+		<keyword>USING</keyword>
+		<keyword>VALUE</keyword>
+		<keyword>VALUES</keyword>
+		<keyword>VARCHAR</keyword>
+		<keyword>VARYING</keyword>
+		<keyword>VIEW</keyword>
+		<keyword>WHEN</keyword>
+		<keyword>WHENEVER</keyword>
+		<keyword>WHERE</keyword>
+		<keyword>WHILE</keyword>
+		<keyword>WITH</keyword>
+		<keyword>WITHOUT</keyword>
+		<keyword>WORK</keyword>
+		<keyword>WRITE</keyword>
+		<keyword>YEAR</keyword>
+		<keyword>ZONE</keyword>
+		<!-- non reserved -->
+		<keyword>ABS</keyword>
+		<keyword>ADA</keyword>
+		<keyword>ADMIN</keyword>
+		<keyword>ASENSITIVE</keyword>
+		<keyword>ASSIGNMENT</keyword>
+		<keyword>ASYMMETRIC</keyword>
+		<keyword>ATOMIC</keyword>
+		<keyword>ATTRIBUTE</keyword>
+		<keyword>AVG</keyword>
+		<keyword>BIT_LENGTH</keyword>
+		<keyword>C</keyword>
+		<keyword>CALLED</keyword>
+		<keyword>CARDINALITY</keyword>
+		<keyword>CATALOG_NAME</keyword>
+		<keyword>CHAIN</keyword>
+		<keyword>CHAR_LENGTH</keyword>
+		<keyword>CHARACTERISTICS</keyword>
+		<keyword>CHARACTER_LENGTH</keyword>
+		<keyword>CHARACTER_SET_CATALOG</keyword>
+		<keyword>CHARACTER_SET_NAME</keyword>
+		<keyword>CHARACTER_SET_SCHEMA</keyword>
+		<keyword>CHECKED</keyword>
+		<keyword>CLASS_ORIGIN</keyword>
+		<keyword>COALESCE</keyword>
+		<keyword>COBOL</keyword>
+		<keyword>COLLATION_CATALOG</keyword>
+		<keyword>COLLATION_NAME</keyword>
+		<keyword>COLLATION_SCHEMA</keyword>
+		<keyword>COLUMN_NAME</keyword>
+		<keyword>COMMAND_FUNCTION</keyword>
+		<keyword>COMMAND_FUNCTION_CODE</keyword>
+		<keyword>COMMITTED</keyword>
+		<keyword>CONDITION_IDENTIFIER</keyword>
+		<keyword>CONDITION_NUMBER</keyword>
+		<keyword>CONNECTION_NAME</keyword>
+		<keyword>CONSTRAINT_CATALOG</keyword>
+		<keyword>CONSTRAINT_NAME</keyword>
+		<keyword>CONSTRAINT_SCHEMA</keyword>
+		<keyword>CONTAINS</keyword>
+		<keyword>CONVERT</keyword>
+		<keyword>COUNT</keyword>
+		<keyword>CURSOR_NAME</keyword>
+		<keyword>DATETIME_INTERVAL_CODE</keyword>
+		<keyword>DATETIME_INTERVAL_PRECISION</keyword>
+		<keyword>DEFINED</keyword>
+		<keyword>DEFINER</keyword>
+		<keyword>DEGREE</keyword>
+		<keyword>DERIVED</keyword>
+		<keyword>DISPATCH</keyword>
+		<keyword>EVERY</keyword>
+		<keyword>EXTRACT</keyword>
+		<keyword>FINAL</keyword>
+		<keyword>FORTRAN</keyword>
+		<keyword>G</keyword>
+		<keyword>GENERATED</keyword>
+		<keyword>GRANTED</keyword>
+		<keyword>HIERARCHY</keyword>
+		<keyword>IMPLEMENTATION</keyword>
+		<keyword>INSENSITIVE</keyword>
+		<keyword>INSTANCE</keyword>
+		<keyword>INSTANTIABLE</keyword>
+		<keyword>INVOKER</keyword>
+		<keyword>K</keyword>
+		<keyword>KEY_MEMBER</keyword>
+		<keyword>KEY_TYPE</keyword>
+		<keyword>LENGTH</keyword>
+		<keyword>LOWER</keyword>
+		<keyword>M</keyword>
+		<keyword>MAX</keyword>
+		<keyword>MIN</keyword>
+		<keyword>MESSAGE_LENGTH</keyword>
+		<keyword>MESSAGE_OCTET_LENGTH</keyword>
+		<keyword>MESSAGE_TEXT</keyword>
+		<keyword>MOD</keyword>
+		<keyword>MORE</keyword>
+		<keyword>MUMPS</keyword>
+		<keyword>NAME</keyword>
+		<keyword>NULLABLE</keyword>
+		<keyword>NUMBER</keyword>
+		<keyword>NULLIF</keyword>
+		<keyword>OCTET_LENGTH</keyword>
+		<keyword>ORDERING</keyword>
+		<keyword>OPTIONS</keyword>
+		<keyword>OVERLAY</keyword>
+		<keyword>OVERRIDING</keyword>
+		<keyword>PASCAL</keyword>
+		<keyword>PARAMETER_MODE</keyword>
+		<keyword>PARAMETER_NAME</keyword>
+		<keyword>PARAMETER_ORDINAL_POSITION</keyword>
+		<keyword>PARAMETER_SPECIFIC_CATALOG</keyword>
+		<keyword>PARAMETER_SPECIFIC_NAME</keyword>
+		<keyword>PARAMETER_SPECIFIC_SCHEMA</keyword>
+		<keyword>PLI</keyword>
+		<keyword>POSITION</keyword>
+		<keyword>REPEATABLE</keyword>
+		<keyword>RETURNED_CARDINALITY</keyword>
+		<keyword>RETURNED_LENGTH</keyword>
+		<keyword>RETURNED_OCTET_LENGTH</keyword>
+		<keyword>RETURNED_SQLSTATE</keyword>
+		<keyword>ROUTINE_CATALOG</keyword>
+		<keyword>ROUTINE_NAME</keyword>
+		<keyword>ROUTINE_SCHEMA</keyword>
+		<keyword>ROW_COUNT</keyword>
+		<keyword>SCALE</keyword>
+		<keyword>SCHEMA_NAME</keyword>
+		<keyword>SCOPE</keyword>
+		<keyword>SECURITY</keyword>
+		<keyword>SELF</keyword>
+		<keyword>SENSITIVE</keyword>
+		<keyword>SERIALIZABLE</keyword>
+		<keyword>SERVER_NAME</keyword>
+		<keyword>SIMPLE</keyword>
+		<keyword>SOURCE</keyword>
+		<keyword>SPECIFIC_NAME</keyword>
+		<keyword>STATEMENT</keyword>
+		<keyword>STRUCTURE</keyword>
+		<keyword>STYLE</keyword>
+		<keyword>SUBCLASS_ORIGIN</keyword>
+		<keyword>SUBSTRING</keyword>
+		<keyword>SUM</keyword>
+		<keyword>SYMMETRIC</keyword>
+		<keyword>SYSTEM</keyword>
+		<keyword>TABLE_NAME</keyword>
+		<keyword>TOP_LEVEL_COUNT</keyword>
+		<keyword>TRANSACTIONS_COMMITTED</keyword>
+		<keyword>TRANSACTIONS_ROLLED_BACK</keyword>
+		<keyword>TRANSACTION_ACTIVE</keyword>
+		<keyword>TRANSFORM</keyword>
+		<keyword>TRANSFORMS</keyword>
+		<keyword>TRANSLATE</keyword>
+		<keyword>TRIGGER_CATALOG</keyword>
+		<keyword>TRIGGER_SCHEMA</keyword>
+		<keyword>TRIGGER_NAME</keyword>
+		<keyword>TRIM</keyword>
+		<keyword>TYPE</keyword>
+		<keyword>UNCOMMITTED</keyword>
+		<keyword>UNNAMED</keyword>
+		<keyword>UPPER</keyword>
+	</highlighter>
+</highlighters>
diff --git a/highlighters/sql2003-hl.xml b/highlighters/sql2003-hl.xml
new file mode 100644
index 0000000..ac1d5d0
--- /dev/null
+++ b/highlighters/sql2003-hl.xml
@@ -0,0 +1,565 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Syntax highlighting definition for SQL:1999
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2012 Michiel Hendriks, Martin Hujer, k42b3
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+-->
+<highlighters>
+	<highlighter type="oneline-comment">--</highlighter>
+	<highlighter type="multiline-comment">
+		<start>/*</start>
+		<end>*/</end>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="string">
+		<string>U'</string>
+		<endString>'</endString>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="string">
+		<string>B'</string>
+		<endString>'</endString>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="string">
+		<string>N'</string>
+		<endString>'</endString>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="string">
+		<string>X'</string>
+		<endString>'</endString>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<pointStarts />
+		<exponent>e</exponent>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<ignoreCase />
+		<!-- reserved -->
+		<keyword>A</keyword>
+		<keyword>ABS</keyword>
+		<keyword>ABSOLUTE</keyword>
+		<keyword>ACTION</keyword>
+		<keyword>ADA</keyword>
+		<keyword>ADMIN</keyword>
+		<keyword>AFTER</keyword>
+		<keyword>ALWAYS</keyword>
+		<keyword>ASC</keyword>
+		<keyword>ASSERTION</keyword>
+		<keyword>ASSIGNMENT</keyword>
+		<keyword>ATTRIBUTE</keyword>
+		<keyword>ATTRIBUTES</keyword>
+		<keyword>AVG</keyword>
+		<keyword>BEFORE</keyword>
+		<keyword>BERNOULLI</keyword>
+		<keyword>BREADTH</keyword>
+		<keyword>C</keyword>
+		<keyword>CARDINALITY</keyword>
+		<keyword>CASCADE</keyword>
+		<keyword>CATALOG_NAME</keyword>
+		<keyword>CATALOG</keyword>
+		<keyword>CEIL</keyword>
+		<keyword>CEILING</keyword>
+		<keyword>CHAIN</keyword>
+		<keyword>CHAR_LENGTH</keyword>
+		<keyword>CHARACTER_LENGTH</keyword>
+		<keyword>CHARACTER_SET_CATALOG</keyword>
+		<keyword>CHARACTER_SET_NAME</keyword>
+		<keyword>CHARACTER_SET_SCHEMA</keyword>
+		<keyword>CHARACTERISTICS</keyword>
+		<keyword>CHARACTERS</keyword>
+		<keyword>CHECKED</keyword>
+		<keyword>CLASS_ORIGIN</keyword>
+		<keyword>COALESCE</keyword>
+		<keyword>COBOL</keyword>
+		<keyword>CODE_UNITS</keyword>
+		<keyword>COLLATION_CATALOG</keyword>
+		<keyword>COLLATION_NAME</keyword>
+		<keyword>COLLATION_SCHEMA</keyword>
+		<keyword>COLLATION</keyword>
+		<keyword>COLLECT</keyword>
+		<keyword>COLUMN_NAME</keyword>
+		<keyword>COMMAND_FUNCTION_CODE</keyword>
+		<keyword>COMMAND_FUNCTION</keyword>
+		<keyword>COMMITTED</keyword>
+		<keyword>CONDITION_NUMBER</keyword>
+		<keyword>CONDITION</keyword>
+		<keyword>CONNECTION_NAME</keyword>
+		<keyword>CONSTRAINT_CATALOG</keyword>
+		<keyword>CONSTRAINT_NAME</keyword>
+		<keyword>CONSTRAINT_SCHEMA</keyword>
+		<keyword>CONSTRAINTS</keyword>
+		<keyword>CONSTRUCTORS</keyword>
+		<keyword>CONTAINS</keyword>
+		<keyword>CONVERT</keyword>
+		<keyword>CORR</keyword>
+		<keyword>COUNT</keyword>
+		<keyword>COVAR_POP</keyword>
+		<keyword>COVAR_SAMP</keyword>
+		<keyword>CUME_DIST</keyword>
+		<keyword>CURRENT_COLLATION</keyword>
+		<keyword>CURSOR_NAME</keyword>
+		<keyword>DATA</keyword>
+		<keyword>DATETIME_INTERVAL_CODE</keyword>
+		<keyword>DATETIME_INTERVAL_PRECISION</keyword>
+		<keyword>DEFAULTS</keyword>
+		<keyword>DEFERRABLE</keyword>
+		<keyword>DEFERRED</keyword>
+		<keyword>DEFINED</keyword>
+		<keyword>DEFINER</keyword>
+		<keyword>DEGREE</keyword>
+		<keyword>DENSE_RANK</keyword>
+		<keyword>DEPTH</keyword>
+		<keyword>DERIVED</keyword>
+		<keyword>DESC</keyword>
+		<keyword>DESCRIPTOR</keyword>
+		<keyword>DIAGNOSTICS</keyword>
+		<keyword>DISPATCH</keyword>
+		<keyword>DOMAIN</keyword>
+		<keyword>DYNAMIC_FUNCTION_CODE</keyword>
+		<keyword>DYNAMIC_FUNCTION</keyword>
+		<keyword>EQUALS</keyword>
+		<keyword>EVERY</keyword>
+		<keyword>EXCEPTION</keyword>
+		<keyword>EXCLUDE</keyword>
+		<keyword>EXCLUDING</keyword>
+		<keyword>EXP</keyword>
+		<keyword>EXTRACT</keyword>
+		<keyword>FINAL</keyword>
+		<keyword>FIRST</keyword>
+		<keyword>FLOOR</keyword>
+		<keyword>FOLLOWING</keyword>
+		<keyword>FORTRAN</keyword>
+		<keyword>FOUND</keyword>
+		<keyword>FUSION</keyword>
+		<keyword>G</keyword>
+		<keyword>GENERAL</keyword>
+		<keyword>GO</keyword>
+		<keyword>GOTO</keyword>
+		<keyword>GRANTED</keyword>
+		<keyword>HIERARCHY</keyword>
+		<keyword>IMPLEMENTATION</keyword>
+		<keyword>INCLUDING</keyword>
+		<keyword>INCREMENT</keyword>
+		<keyword>INITIALLY</keyword>
+		<keyword>INSTANCE</keyword>
+		<keyword>INSTANTIABLE</keyword>
+		<keyword>INTERSECTION</keyword>
+		<keyword>INVOKER</keyword>
+		<keyword>ISOLATION</keyword>
+		<keyword>K</keyword>
+		<keyword>KEY_MEMBER</keyword>
+		<keyword>KEY_TYPE</keyword>
+		<keyword>KEY</keyword>
+		<keyword>LAST</keyword>
+		<keyword>LENGTH</keyword>
+		<keyword>LEVEL</keyword>
+		<keyword>LN</keyword>
+		<keyword>LOCATOR</keyword>
+		<keyword>LOWER</keyword>
+		<keyword>M</keyword>
+		<keyword>MAP</keyword>
+		<keyword>MATCHED</keyword>
+		<keyword>MAX</keyword>
+		<keyword>MAXVALUE</keyword>
+		<keyword>MESSAGE_LENGTH</keyword>
+		<keyword>MESSAGE_OCTET_LENGTH</keyword>
+		<keyword>MESSAGE_TEXT</keyword>
+		<keyword>MIN</keyword>
+		<keyword>MINVALUE</keyword>
+		<keyword>MOD</keyword>
+		<keyword>MORE</keyword>
+		<keyword>MUMPS</keyword>
+		<keyword>NAME</keyword>
+		<keyword>NAMES</keyword>
+		<keyword>NESTING</keyword>
+		<keyword>NEXT</keyword>
+		<keyword>NORMALIZE</keyword>
+		<keyword>NORMALIZED</keyword>
+		<keyword>NULLABLE</keyword>
+		<keyword>NULLIF</keyword>
+		<keyword>NULLS</keyword>
+		<keyword>NUMBER</keyword>
+		<keyword>OBJECT</keyword>
+		<keyword>OCTET_LENGTH</keyword>
+		<keyword>OCTETS</keyword>
+		<keyword>OPTION</keyword>
+		<keyword>OPTIONS</keyword>
+		<keyword>ORDERING</keyword>
+		<keyword>ORDINALITY</keyword>
+		<keyword>OTHERS</keyword>
+		<keyword>OVERLAY</keyword>
+		<keyword>OVERRIDING</keyword>
+		<keyword>PAD</keyword>
+		<keyword>PARAMETER_MODE</keyword>
+		<keyword>PARAMETER_NAME</keyword>
+		<keyword>PARAMETER_ORDINAL_POSITION</keyword>
+		<keyword>PARAMETER_SPECIFIC_CATALOG</keyword>
+		<keyword>PARAMETER_SPECIFIC_NAME</keyword>
+		<keyword>PARAMETER_SPECIFIC_SCHEMA</keyword>
+		<keyword>PARTIAL</keyword>
+		<keyword>PASCAL</keyword>
+		<keyword>PATH</keyword>
+		<keyword>PERCENT_RANK</keyword>
+		<keyword>PERCENTILE_CONT</keyword>
+		<keyword>PERCENTILE_DISC</keyword>
+		<keyword>PLACING</keyword>
+		<keyword>PLI</keyword>
+		<keyword>POSITION</keyword>
+		<keyword>POWER</keyword>
+		<keyword>PRECEDING</keyword>
+		<keyword>PRESERVE</keyword>
+		<keyword>PRIOR</keyword>
+		<keyword>PRIVILEGES</keyword>
+		<keyword>PUBLIC</keyword>
+		<keyword>RANK</keyword>
+		<keyword>READ</keyword>
+		<keyword>RELATIVE</keyword>
+		<keyword>REPEATABLE</keyword>
+		<keyword>RESTART</keyword>
+		<keyword>RETURNED_CARDINALITY</keyword>
+		<keyword>RETURNED_LENGTH</keyword>
+		<keyword>RETURNED_OCTET_LENGTH</keyword>
+		<keyword>RETURNED_SQLSTATE</keyword>
+		<keyword>ROLE</keyword>
+		<keyword>ROUTINE_CATALOG</keyword>
+		<keyword>ROUTINE_NAME</keyword>
+		<keyword>ROUTINE_SCHEMA</keyword>
+		<keyword>ROUTINE</keyword>
+		<keyword>ROW_COUNT</keyword>
+		<keyword>ROW_NUMBER</keyword>
+		<keyword>SCALE</keyword>
+		<keyword>SCHEMA_NAME</keyword>
+		<keyword>SCHEMA</keyword>
+		<keyword>SCOPE_CATALOG</keyword>
+		<keyword>SCOPE_NAME</keyword>
+		<keyword>SCOPE_SCHEMA</keyword>
+		<keyword>SECTION</keyword>
+		<keyword>SECURITY</keyword>
+		<keyword>SELF</keyword>
+		<keyword>SEQUENCE</keyword>
+		<keyword>SERIALIZABLE</keyword>
+		<keyword>SERVER_NAME</keyword>
+		<keyword>SESSION</keyword>
+		<keyword>SETS</keyword>
+		<keyword>SIMPLE</keyword>
+		<keyword>SIZE</keyword>
+		<keyword>SOURCE</keyword>
+		<keyword>SPACE</keyword>
+		<keyword>SPECIFIC_NAME</keyword>
+		<keyword>SQRT</keyword>
+		<keyword>STATE</keyword>
+		<keyword>STATEMENT</keyword>
+		<keyword>STDDEV_POP</keyword>
+		<keyword>STDDEV_SAMP</keyword>
+		<keyword>STRUCTURE</keyword>
+		<keyword>STYLE</keyword>
+		<keyword>SUBCLASS_ORIGIN</keyword>
+		<keyword>SUBSTRING</keyword>
+		<keyword>SUM</keyword>
+		<keyword>TABLE_NAME</keyword>
+		<keyword>TABLESAMPLE</keyword>
+		<keyword>TEMPORARY</keyword>
+		<keyword>TIES</keyword>
+		<keyword>TOP_LEVEL_COUNT</keyword>
+		<keyword>TRANSACTION_ACTIVE</keyword>
+		<keyword>TRANSACTION</keyword>
+		<keyword>TRANSACTIONS_COMMITTED</keyword>
+		<keyword>TRANSACTIONS_ROLLED_BACK</keyword>
+		<keyword>TRANSFORM</keyword>
+		<keyword>TRANSFORMS</keyword>
+		<keyword>TRANSLATE</keyword>
+		<keyword>TRIGGER_CATALOG</keyword>
+		<keyword>TRIGGER_NAME</keyword>
+		<keyword>TRIGGER_SCHEMA</keyword>
+		<keyword>TRIM</keyword>
+		<keyword>TYPE</keyword>
+		<keyword>UNBOUNDED</keyword>
+		<keyword>UNCOMMITTED</keyword>
+		<keyword>UNDER</keyword>
+		<keyword>UNNAMED</keyword>
+		<keyword>USAGE</keyword>
+		<keyword>USER_DEFINED_TYPE_CATALOG</keyword>
+		<keyword>USER_DEFINED_TYPE_CODE</keyword>
+		<keyword>USER_DEFINED_TYPE_NAME</keyword>
+		<keyword>USER_DEFINED_TYPE_SCHEMA</keyword>
+		<keyword>VIEW</keyword>
+		<keyword>WORK</keyword>
+		<keyword>WRITE</keyword>
+		<keyword>ZONE</keyword>
+		<!-- non reserved -->
+		<keyword>ADD</keyword>
+		<keyword>ALL</keyword>
+		<keyword>ALLOCATE</keyword>
+		<keyword>ALTER</keyword>
+		<keyword>AND</keyword>
+		<keyword>ANY</keyword>
+		<keyword>ARE</keyword>
+		<keyword>ARRAY</keyword>
+		<keyword>AS</keyword>
+		<keyword>ASENSITIVE</keyword>
+		<keyword>ASYMMETRIC</keyword>
+		<keyword>AT</keyword>
+		<keyword>ATOMIC</keyword>
+		<keyword>AUTHORIZATION</keyword>
+		<keyword>BEGIN</keyword>
+		<keyword>BETWEEN</keyword>
+		<keyword>BIGINT</keyword>
+		<keyword>BINARY</keyword>
+		<keyword>BLOB</keyword>
+		<keyword>BOOLEAN</keyword>
+		<keyword>BOTH</keyword>
+		<keyword>BY</keyword>
+		<keyword>CALL</keyword>
+		<keyword>CALLED</keyword>
+		<keyword>CASCADED</keyword>
+		<keyword>CASE</keyword>
+		<keyword>CAST</keyword>
+		<keyword>CHAR</keyword>
+		<keyword>CHARACTER</keyword>
+		<keyword>CHECK</keyword>
+		<keyword>CLOB</keyword>
+		<keyword>CLOSE</keyword>
+		<keyword>COLLATE</keyword>
+		<keyword>COLUMN</keyword>
+		<keyword>COMMIT</keyword>
+		<keyword>CONNECT</keyword>
+		<keyword>CONSTRAINT</keyword>
+		<keyword>CONTINUE</keyword>
+		<keyword>CORRESPONDING</keyword>
+		<keyword>CREATE</keyword>
+		<keyword>CROSS</keyword>
+		<keyword>CUBE</keyword>
+		<keyword>CURRENT_DATE</keyword>
+		<keyword>CURRENT_DEFAULT_TRANSFORM_GROUP</keyword>
+		<keyword>CURRENT_PATH</keyword>
+		<keyword>CURRENT_ROLE</keyword>
+		<keyword>CURRENT_TIME</keyword>
+		<keyword>CURRENT_TIMESTAMP</keyword>
+		<keyword>CURRENT_TRANSFORM_GROUP_FOR_TYPE</keyword>
+		<keyword>CURRENT_USER</keyword>
+		<keyword>CURRENT</keyword>
+		<keyword>CURSOR</keyword>
+		<keyword>CYCLE</keyword>
+		<keyword>DATE</keyword>
+		<keyword>DAY</keyword>
+		<keyword>DEALLOCATE</keyword>
+		<keyword>DEC</keyword>
+		<keyword>DECIMAL</keyword>
+		<keyword>DECLARE</keyword>
+		<keyword>DEFAULT</keyword>
+		<keyword>DELETE</keyword>
+		<keyword>DEREF</keyword>
+		<keyword>DESCRIBE</keyword>
+		<keyword>DETERMINISTIC</keyword>
+		<keyword>DISCONNECT</keyword>
+		<keyword>DISTINCT</keyword>
+		<keyword>DOUBLE</keyword>
+		<keyword>DROP</keyword>
+		<keyword>DYNAMIC</keyword>
+		<keyword>EACH</keyword>
+		<keyword>ELEMENT</keyword>
+		<keyword>ELSE</keyword>
+		<keyword>END</keyword>
+		<keyword>END-EXEC</keyword>
+		<keyword>ESCAPE</keyword>
+		<keyword>EXCEPT</keyword>
+		<keyword>EXEC</keyword>
+		<keyword>EXECUTE</keyword>
+		<keyword>EXISTS</keyword>
+		<keyword>EXTERNAL</keyword>
+		<keyword>FALSE</keyword>
+		<keyword>FETCH</keyword>
+		<keyword>FILTER</keyword>
+		<keyword>FLOAT</keyword>
+		<keyword>FOR</keyword>
+		<keyword>FOREIGN</keyword>
+		<keyword>FREE</keyword>
+		<keyword>FROM</keyword>
+		<keyword>FULL</keyword>
+		<keyword>FUNCTION</keyword>
+		<keyword>GET</keyword>
+		<keyword>GLOBAL</keyword>
+		<keyword>GRANT</keyword>
+		<keyword>GROUP</keyword>
+		<keyword>GROUPING</keyword>
+		<keyword>HAVING</keyword>
+		<keyword>HOLD</keyword>
+		<keyword>HOUR</keyword>
+		<keyword>IDENTITY</keyword>
+		<keyword>IMMEDIATE</keyword>
+		<keyword>IN</keyword>
+		<keyword>INDICATOR</keyword>
+		<keyword>INNER</keyword>
+		<keyword>INOUT</keyword>
+		<keyword>INPUT</keyword>
+		<keyword>INSENSITIVE</keyword>
+		<keyword>INSERT</keyword>
+		<keyword>INT</keyword>
+		<keyword>INTEGER</keyword>
+		<keyword>INTERSECT</keyword>
+		<keyword>INTERVAL</keyword>
+		<keyword>INTO</keyword>
+		<keyword>IS</keyword>
+		<keyword>ISOLATION</keyword>
+		<keyword>JOIN</keyword>
+		<keyword>LANGUAGE</keyword>
+		<keyword>LARGE</keyword>
+		<keyword>LATERAL</keyword>
+		<keyword>LEADING</keyword>
+		<keyword>LEFT</keyword>
+		<keyword>LIKE</keyword>
+		<keyword>LOCAL</keyword>
+		<keyword>LOCALTIME</keyword>
+		<keyword>LOCALTIMESTAMP</keyword>
+		<keyword>MATCH</keyword>
+		<keyword>MEMBER</keyword>
+		<keyword>MERGE</keyword>
+		<keyword>METHOD</keyword>
+		<keyword>MINUTE</keyword>
+		<keyword>MODIFIES</keyword>
+		<keyword>MODULE</keyword>
+		<keyword>MONTH</keyword>
+		<keyword>MULTISET</keyword>
+		<keyword>NATIONAL</keyword>
+		<keyword>NATURAL</keyword>
+		<keyword>NCHAR</keyword>
+		<keyword>NCLOB</keyword>
+		<keyword>NEW</keyword>
+		<keyword>NO</keyword>
+		<keyword>NONE</keyword>
+		<keyword>NOT</keyword>
+		<keyword>NULL</keyword>
+		<keyword>NUMERIC</keyword>
+		<keyword>OF</keyword>
+		<keyword>OLD</keyword>
+		<keyword>ON</keyword>
+		<keyword>ONLY</keyword>
+		<keyword>OPEN</keyword>
+		<keyword>OR</keyword>
+		<keyword>ORDER</keyword>
+		<keyword>OUT</keyword>
+		<keyword>OUTER</keyword>
+		<keyword>OUTPUT</keyword>
+		<keyword>OVER</keyword>
+		<keyword>OVERLAPS</keyword>
+		<keyword>PARAMETER</keyword>
+		<keyword>PARTITION</keyword>
+		<keyword>PRECISION</keyword>
+		<keyword>PREPARE</keyword>
+		<keyword>PRIMARY</keyword>
+		<keyword>PROCEDURE</keyword>
+		<keyword>RANGE</keyword>
+		<keyword>READS</keyword>
+		<keyword>REAL</keyword>
+		<keyword>RECURSIVE</keyword>
+		<keyword>REF</keyword>
+		<keyword>REFERENCES</keyword>
+		<keyword>REFERENCING</keyword>
+		<keyword>REGR_AVGX</keyword>
+		<keyword>REGR_AVGY</keyword>
+		<keyword>REGR_COUNT</keyword>
+		<keyword>REGR_INTERCEPT</keyword>
+		<keyword>REGR_R2</keyword>
+		<keyword>REGR_SLOPE</keyword>
+		<keyword>REGR_SXX</keyword>
+		<keyword>REGR_SXY</keyword>
+		<keyword>REGR_SYY</keyword>
+		<keyword>RELEASE</keyword>
+		<keyword>RESULT</keyword>
+		<keyword>RETURN</keyword>
+		<keyword>RETURNS</keyword>
+		<keyword>REVOKE</keyword>
+		<keyword>RIGHT</keyword>
+		<keyword>ROLLBACK</keyword>
+		<keyword>ROLLUP</keyword>
+		<keyword>ROW</keyword>
+		<keyword>ROWS</keyword>
+		<keyword>SAVEPOINT</keyword>
+		<keyword>SCROLL</keyword>
+		<keyword>SEARCH</keyword>
+		<keyword>SECOND</keyword>
+		<keyword>SELECT</keyword>
+		<keyword>SENSITIVE</keyword>
+		<keyword>SESSION_USER</keyword>
+		<keyword>SET</keyword>
+		<keyword>SIMILAR</keyword>
+		<keyword>SMALLINT</keyword>
+		<keyword>SOME</keyword>
+		<keyword>SPECIFIC</keyword>
+		<keyword>SPECIFICTYPE</keyword>
+		<keyword>SQL</keyword>
+		<keyword>SQLEXCEPTION</keyword>
+		<keyword>SQLSTATE</keyword>
+		<keyword>SQLWARNING</keyword>
+		<keyword>START</keyword>
+		<keyword>STATIC</keyword>
+		<keyword>SUBMULTISET</keyword>
+		<keyword>SYMMETRIC</keyword>
+		<keyword>SYSTEM_USER</keyword>
+		<keyword>SYSTEM</keyword>
+		<keyword>TABLE</keyword>
+		<keyword>THEN</keyword>
+		<keyword>TIME</keyword>
+		<keyword>TIMESTAMP</keyword>
+		<keyword>TIMEZONE_HOUR</keyword>
+		<keyword>TIMEZONE_MINUTE</keyword>
+		<keyword>TO</keyword>
+		<keyword>TRAILING</keyword>
+		<keyword>TRANSLATION</keyword>
+		<keyword>TREAT</keyword>
+		<keyword>TRIGGER</keyword>
+		<keyword>TRUE</keyword>
+		<keyword>UESCAPE</keyword>
+		<keyword>UNION</keyword>
+		<keyword>UNIQUE</keyword>
+		<keyword>UNKNOWN</keyword>
+		<keyword>UNNEST</keyword>
+		<keyword>UPDATE</keyword>
+		<keyword>UPPER</keyword>
+		<keyword>USER</keyword>
+		<keyword>USING</keyword>
+		<keyword>VALUE</keyword>
+		<keyword>VALUES</keyword>
+		<keyword>VAR_POP</keyword>
+		<keyword>VAR_SAMP</keyword>
+		<keyword>VARCHAR</keyword>
+		<keyword>VARYING</keyword>
+		<keyword>WHEN</keyword>
+		<keyword>WHENEVER</keyword>
+		<keyword>WHERE</keyword>
+		<keyword>WIDTH_BUCKET</keyword>
+		<keyword>WINDOW</keyword>
+		<keyword>WITH</keyword>
+		<keyword>WITHIN</keyword>
+		<keyword>WITHOUT</keyword>
+		<keyword>YEAR</keyword>
+	</highlighter>
+</highlighters>
diff --git a/highlighters/sql92-hl.xml b/highlighters/sql92-hl.xml
new file mode 100644
index 0000000..111c519
--- /dev/null
+++ b/highlighters/sql92-hl.xml
@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Syntax highlighting definition for SQL-92
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2012 Michiel Hendriks, Martin Hujer, k42b3
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+-->
+<highlighters>
+	<highlighter type="oneline-comment">--</highlighter>
+	<highlighter type="multiline-comment">
+		<start>/*</start>
+		<end>*/</end>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="string">
+		<string>B'</string>
+		<endString>'</endString>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="string">
+		<string>N'</string>
+		<endString>'</endString>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="string">
+		<string>X'</string>
+		<endString>'</endString>
+		<doubleEscapes />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<pointStarts />
+		<exponent>e</exponent>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<ignoreCase />
+		<!-- reserved -->
+		<keyword>ABSOLUTE</keyword>
+		<keyword>ACTION</keyword>
+		<keyword>ADD</keyword>
+		<keyword>ALL</keyword>
+		<keyword>ALLOCATE</keyword>
+		<keyword>ALTER</keyword>
+		<keyword>AND</keyword>
+		<keyword>ANY</keyword>
+		<keyword>ARE</keyword>
+		<keyword>AS</keyword>
+		<keyword>ASC</keyword>
+		<keyword>ASSERTION</keyword>
+		<keyword>AT</keyword>
+		<keyword>AUTHORIZATION</keyword>
+		<keyword>AVG</keyword>
+		<keyword>BEGIN</keyword>
+		<keyword>BETWEEN</keyword>
+		<keyword>BIT_LENGTH</keyword>
+		<keyword>BIT</keyword>
+		<keyword>BOTH</keyword>
+		<keyword>BY</keyword>
+		<keyword>CASCADE</keyword>
+		<keyword>CASCADED</keyword>
+		<keyword>CASE</keyword>
+		<keyword>CAST</keyword>
+		<keyword>CATALOG</keyword>
+		<keyword>CHAR_LENGTH</keyword>
+		<keyword>CHAR</keyword>
+		<keyword>CHARACTER_LENGTH</keyword>
+		<keyword>CHARACTER</keyword>
+		<keyword>CHECK</keyword>
+		<keyword>CLOSE</keyword>
+		<keyword>COALESCE</keyword>
+		<keyword>COLLATE</keyword>
+		<keyword>COLLATION</keyword>
+		<keyword>COLUMN</keyword>
+		<keyword>COMMIT</keyword>
+		<keyword>CONNECT</keyword>
+		<keyword>CONNECTION</keyword>
+		<keyword>CONSTRAINT</keyword>
+		<keyword>CONSTRAINTS</keyword>
+		<keyword>CONTINUE</keyword>
+		<keyword>CONVERT</keyword>
+		<keyword>CORRESPONDING</keyword>
+		<keyword>CREATE</keyword>
+		<keyword>CROSS</keyword>
+		<keyword>CURRENT_DATE</keyword>
+		<keyword>CURRENT_TIME</keyword>
+		<keyword>CURRENT_TIMESTAMP</keyword>
+		<keyword>CURRENT_USER</keyword>
+		<keyword>CURRENT</keyword>
+		<keyword>CURSOR</keyword>
+		<keyword>DATE</keyword>
+		<keyword>DAY</keyword>
+		<keyword>DEALLOCATE</keyword>
+		<keyword>DEC</keyword>
+		<keyword>DECIMAL</keyword>
+		<keyword>DECLARE</keyword>
+		<keyword>DEFAULT</keyword>
+		<keyword>DEFERRABLE</keyword>
+		<keyword>DEFERRED</keyword>
+		<keyword>DELETE</keyword>
+		<keyword>DESC</keyword>
+		<keyword>DESCRIBE</keyword>
+		<keyword>DESCRIPTOR</keyword>
+		<keyword>DIAGNOSTICS</keyword>
+		<keyword>DISCONNECT</keyword>
+		<keyword>DISTINCT</keyword>
+		<keyword>DOMAIN</keyword>
+		<keyword>DOUBLE</keyword>
+		<keyword>DROP</keyword>
+		<keyword>ELSE</keyword>
+		<keyword>END</keyword>
+		<keyword>END-EXEC</keyword>
+		<keyword>ESCAPE</keyword>
+		<keyword>EXCEPT</keyword>
+		<keyword>EXCEPTION</keyword>
+		<keyword>EXEC</keyword>
+		<keyword>EXECUTE</keyword>
+		<keyword>EXISTS</keyword>
+		<keyword>EXTERNAL</keyword>
+		<keyword>EXTRACT</keyword>
+		<keyword>FALSE</keyword>
+		<keyword>FETCH</keyword>
+		<keyword>FIRST</keyword>
+		<keyword>FLOAT</keyword>
+		<keyword>FOR</keyword>
+		<keyword>FOREIGN</keyword>
+		<keyword>FOUND</keyword>
+		<keyword>FROM</keyword>
+		<keyword>FULL</keyword>
+		<keyword>GET</keyword>
+		<keyword>GLOBAL</keyword>
+		<keyword>GO</keyword>
+		<keyword>GOTO</keyword>
+		<keyword>GRANT</keyword>
+		<keyword>GROUP</keyword>
+		<keyword>HAVING</keyword>
+		<keyword>HOUR</keyword>
+		<keyword>IDENTITY</keyword>
+		<keyword>IMMEDIATE</keyword>
+		<keyword>IN</keyword>
+		<keyword>INDICATOR</keyword>
+		<keyword>INITIALLY</keyword>
+		<keyword>INNER</keyword>
+		<keyword>INPUT</keyword>
+		<keyword>INSENSITIVE</keyword>
+		<keyword>INSERT</keyword>
+		<keyword>INT</keyword>
+		<keyword>INTEGER</keyword>
+		<keyword>INTERSECT</keyword>
+		<keyword>INTERVAL</keyword>
+		<keyword>INTO</keyword>
+		<keyword>IS</keyword>
+		<keyword>ISOLATION</keyword>
+		<keyword>JOIN</keyword>
+		<keyword>KEY</keyword>
+		<keyword>LANGUAGE</keyword>
+		<keyword>LAST</keyword>
+		<keyword>LEADING</keyword>
+		<keyword>LEFT</keyword>
+		<keyword>LEVEL</keyword>
+		<keyword>LIKE</keyword>
+		<keyword>LOCAL</keyword>
+		<keyword>LOWER</keyword>
+		<keyword>MATCH</keyword>
+		<keyword>MAX</keyword>
+		<keyword>MIN</keyword>
+		<keyword>MINUTE</keyword>
+		<keyword>MODULE</keyword>
+		<keyword>MONTH</keyword>
+		<keyword>NAMES</keyword>
+		<keyword>NATIONAL</keyword>
+		<keyword>NATURAL</keyword>
+		<keyword>NCHAR</keyword>
+		<keyword>NEXT</keyword>
+		<keyword>NO</keyword>
+		<keyword>NOT</keyword>
+		<keyword>NULL</keyword>
+		<keyword>NULLIF</keyword>
+		<keyword>NUMERIC</keyword>
+		<keyword>OCTET_LENGTH</keyword>
+		<keyword>OF</keyword>
+		<keyword>ON</keyword>
+		<keyword>ONLY</keyword>
+		<keyword>OPEN</keyword>
+		<keyword>OPTION</keyword>
+		<keyword>OR</keyword>
+		<keyword>ORDER</keyword>
+		<keyword>OUTER</keyword>
+		<keyword>OUTPUT</keyword>
+		<keyword>OVERLAPS</keyword>
+		<keyword>PAD</keyword>
+		<keyword>PARTIAL</keyword>
+		<keyword>POSITION</keyword>
+		<keyword>PRECISION</keyword>
+		<keyword>PREPARE</keyword>
+		<keyword>PRESERVE</keyword>
+		<keyword>PRIMARY</keyword>
+		<keyword>PRIOR</keyword>
+		<keyword>PRIVILEGES</keyword>
+		<keyword>PROCEDURE</keyword>
+		<keyword>PUBLIC</keyword>
+		<keyword>READ</keyword>
+		<keyword>REAL</keyword>
+		<keyword>REFERENCES</keyword>
+		<keyword>RELATIVE</keyword>
+		<keyword>RESTRICT</keyword>
+		<keyword>REVOKE</keyword>
+		<keyword>RIGHT</keyword>
+		<keyword>ROLLBACK</keyword>
+		<keyword>ROWS</keyword>
+		<keyword>SCHEMA</keyword>
+		<keyword>SCROLL</keyword>
+		<keyword>SECOND</keyword>
+		<keyword>SECTION</keyword>
+		<keyword>SELECT</keyword>
+		<keyword>SESSION_USER</keyword>
+		<keyword>SESSION</keyword>
+		<keyword>SET</keyword>
+		<keyword>SIZE</keyword>
+		<keyword>SMALLINT</keyword>
+		<keyword>SOME</keyword>
+		<keyword>SPACE</keyword>
+		<keyword>SQL</keyword>
+		<keyword>SQLCODE</keyword>
+		<keyword>SQLERROR</keyword>
+		<keyword>SQLSTATE</keyword>
+		<keyword>SUBSTRING</keyword>
+		<keyword>SUM</keyword>
+		<keyword>SYSTEM_USER</keyword>
+		<keyword>TABLE</keyword>
+		<keyword>TEMPORARY</keyword>
+		<keyword>THEN</keyword>
+		<keyword>TIME</keyword>
+		<keyword>TIMESTAMP</keyword>
+		<keyword>TIMEZONE_HOUR</keyword>
+		<keyword>TIMEZONE_MINUTE</keyword>
+		<keyword>TO</keyword>
+		<keyword>TRAILING</keyword>
+		<keyword>TRANSACTION</keyword>
+		<keyword>TRANSLATE</keyword>
+		<keyword>TRANSLATION</keyword>
+		<keyword>TRIM</keyword>
+		<keyword>TRUE</keyword>
+		<keyword>UNION</keyword>
+		<keyword>UNIQUE</keyword>
+		<keyword>UNKNOWN</keyword>
+		<keyword>UPDATE</keyword>
+		<keyword>UPPER</keyword>
+		<keyword>USAGE</keyword>
+		<keyword>USER</keyword>
+		<keyword>USING</keyword>
+		<keyword>VALUE</keyword>
+		<keyword>VALUES</keyword>
+		<keyword>VARCHAR</keyword>
+		<keyword>VARYING</keyword>
+		<keyword>VIEW</keyword>
+		<keyword>WHEN</keyword>
+		<keyword>WHENEVER</keyword>
+		<keyword>WHERE</keyword>
+		<keyword>WITH</keyword>
+		<keyword>WORK</keyword>
+		<keyword>WRITE</keyword>
+		<keyword>YEAR</keyword>
+		<keyword>ZONE</keyword>
+		<!-- non reserved keywords -->
+		<keyword>ADA</keyword>
+		<keyword>C</keyword>
+		<keyword>CATALOG_NAME</keyword>
+		<keyword>CHARACTER_SET_CATALOG</keyword>
+		<keyword>CHARACTER_SET_NAME</keyword>
+		<keyword>CHARACTER_SET_SCHEMA</keyword>
+		<keyword>CLASS_ORIGIN</keyword>
+		<keyword>COBOL</keyword>
+		<keyword>COLLATION_CATALOG</keyword>
+		<keyword>COLLATION_NAME</keyword>
+		<keyword>COLLATION_SCHEMA</keyword>
+		<keyword>COLUMN_NAME</keyword>
+		<keyword>COMMAND_FUNCTION</keyword>
+		<keyword>COMMITTED</keyword>
+		<keyword>CONDITION_NUMBER</keyword>
+		<keyword>CONNECTION_NAME</keyword>
+		<keyword>CONSTRAINT_CATALOG</keyword>
+		<keyword>CONSTRAINT_NAME</keyword>
+		<keyword>CONSTRAINT_SCHEMA</keyword>
+		<keyword>CURSOR_NAME</keyword>
+		<keyword>DATA</keyword>
+		<keyword>DATETIME_INTERVAL_CODE</keyword>
+		<keyword>DATETIME_INTERVAL_PRECISION</keyword>
+		<keyword>DYNAMIC_FUNCTION</keyword>
+		<keyword>FORTRAN</keyword>
+		<keyword>LENGTH</keyword>
+		<keyword>MESSAGE_LENGTH</keyword>
+		<keyword>MESSAGE_OCTET_LENGTH</keyword>
+		<keyword>MESSAGE_TEXT</keyword>
+		<keyword>MORE</keyword>
+		<keyword>MUMPS</keyword>
+		<keyword>NAME</keyword>
+		<keyword>NULLABLE</keyword>
+		<keyword>NUMBER</keyword>
+		<keyword>PASCAL</keyword>
+		<keyword>PLI</keyword>
+		<keyword>REPEATABLE</keyword>
+		<keyword>RETURNED_LENGTH</keyword>
+		<keyword>RETURNED_OCTET_LENGTH</keyword>
+		<keyword>RETURNED_SQLSTATE</keyword>
+		<keyword>ROW_COUNT</keyword>
+		<keyword>SCALE</keyword>
+		<keyword>SCHEMA_NAME</keyword>
+		<keyword>SERIALIZABLE</keyword>
+		<keyword>SERVER_NAME</keyword>
+		<keyword>SUBCLASS_ORIGIN</keyword>
+		<keyword>TABLE_NAME</keyword>
+		<keyword>TYPE</keyword>
+		<keyword>UNCOMMITTED</keyword>
+		<keyword>UNNAMED</keyword>
+	</highlighter>
+</highlighters>
diff --git a/highlighters/tcl-hl.xml b/highlighters/tcl-hl.xml
new file mode 100644
index 0000000..7a8fa9f
--- /dev/null
+++ b/highlighters/tcl-hl.xml
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+xslthl highlighter definition fof Tcl/Tk.
+written by Arndt Roger Schneider
+
+Copyright 2008 Arndt Roger Schneider
+License: xlib/libpng
+
+This software is provided "as-is", without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+   not claim that you wrote the original software. If you use this
+   software in a product, an acknowledgment in the product
+   documentation would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must
+   not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+   distribution.
+   
+-->
+<highlighters>
+	<highlighter type="oneline-comment">#</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="regex">
+		<pattern>-[\p{javaJavaIdentifierStart}][\p{javaJavaIdentifierPart}]+
+		</pattern>
+		<style>none</style>
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<!-- Tcl and itcl / structural -->
+		<keyword>if</keyword>
+		<keyword>then</keyword>
+		<keyword>else</keyword>
+		<keyword>elseif</keyword>
+		<keyword>for</keyword>
+		<keyword>foreach</keyword>
+		<keyword>break</keyword>
+		<keyword>continue</keyword>
+		<keyword>while</keyword>
+		<keyword>eval</keyword>
+		<keyword>case</keyword>
+		<keyword>in</keyword>
+		<keyword>switch</keyword>
+		<keyword>default</keyword>
+		<keyword>exit</keyword>
+		<keyword>error</keyword>
+		<keyword>proc</keyword>
+		<keyword>rename</keyword>
+		<keyword>exec</keyword>
+		<keyword>return</keyword>
+		<keyword>uplevel</keyword>
+		<keyword>upvar</keyword>
+		<keyword>constructor</keyword>
+		<keyword>destructor</keyword>
+		<keyword>itcl_class</keyword>
+		<keyword>loop</keyword>
+		<keyword>for_array_keys</keyword>
+		<keyword>for_recursive_glob</keyword>
+		<keyword>for_file</keyword>
+		<keyword>method</keyword>
+		<keyword>body</keyword>
+		<keyword>configbody</keyword>
+		<keyword>catch</keyword>
+		<keyword>namespace</keyword>
+		<keyword>class</keyword>
+		<keyword>array</keyword>
+		<keyword>set</keyword>
+		<keyword>unset</keyword>
+		<keyword>package</keyword>
+		<keyword>source</keyword>
+
+    <!-- Additional commands -->
+		<keyword>subst</keyword>
+		<keyword>list</keyword>
+		<keyword>format</keyword>
+		<keyword>lappend</keyword>
+		<keyword>option</keyword>
+		<keyword>expr</keyword>
+		<keyword>puts</keyword>
+		<keyword>winfo</keyword>
+		<keyword>lindex</keyword>
+		<keyword>string</keyword>
+
+
+    <!-- Runtime Library / structural -->
+		<keyword>verified</keyword>
+		<keyword>seteach</keyword>
+		<keyword>fixme</keyword>
+		<keyword>debug</keyword>
+		<keyword>rtl::debug</keyword>
+		<keyword>rtl::verified</keyword>
+		<keyword>rtl::template</keyword>
+		<keyword>rtl::seteach</keyword>
+
+    <!-- Runtime Library / Additional -->
+		<keyword>mkProc</keyword>
+		<keyword>getCreator</keyword>
+		<keyword>properties</keyword>
+		<keyword>lappendunique</keyword>
+		<keyword>rtl::lappendunique</keyword>
+
+    <!-- geometry managers from Tk -->
+		<keyword>place</keyword>
+		<keyword>pack</keyword>
+		<keyword>grid</keyword>
+
+
+    <!-- Additional Tk stuff -->
+		<keyword>image</keyword>
+		<keyword>font</keyword>
+		<keyword>focus</keyword>
+		<keyword>tk</keyword>
+		<keyword>bind</keyword>
+		<keyword>after</keyword>
+
+    <!-- Window classes from Tk, ... -->
+		<keyword>toplevel</keyword>
+		<keyword>frame</keyword>
+		<keyword>entry</keyword>
+		<keyword>listbox</keyword>
+		<keyword>button</keyword>
+		<keyword>radiobutton</keyword>
+		<keyword>checkbutton</keyword>
+		<keyword>canvas</keyword>
+		<keyword>menu</keyword>
+		<keyword>menubutton</keyword>
+		<keyword>text</keyword>
+		<keyword>label</keyword>
+		<keyword>message</keyword>
+		<!--
+			The rest of Tk's windows is omitted: scrollbar, scale, panedwindow, labelframe, spinbox ...
+		-->
+
+    <!-- ... from tkZinc, ... -->
+		<keyword>zinc</keyword>
+  
+    <!-- ... from tkpath, ... -->
+		<keyword>tkpath::gradient</keyword>
+
+    <!-- ... from Runtime Library, ... -->
+		<keyword>rtl_combobox</keyword>
+		<keyword>rtl_tree</keyword>
+		<keyword>rtl_tabset</keyword>
+		<keyword>rtl_mlistbox</keyword>
+		<keyword>rtl_gridwin</keyword>
+		<keyword>rtlysizer</keyword>
+		<keyword>rtlxsizer</keyword>
+		<!--
+			The rest of RTL's windows is omitted: spinbox, decoratedframe, symbolbar, symbolbarcustomize, question ...
+		-->
+
+    <!-- ... from GEI, ... -->
+		<keyword>goolbar</keyword>
+		<keyword>gstripes</keyword>
+		<keyword>zoolbar</keyword>
+		<keyword>gistbox</keyword>
+		<keyword>gooleditor</keyword>
+		<keyword>galette</keyword>
+	</highlighter>
+</highlighters>
+	<!--
+		Local Variables: mode: sgml coding: utf-8-unix sgml-indent-step: 2 sgml-indent-data: t sgml-set-face: t
+		sgml-insert-missing-element-comment: nil End:
+	-->
\ No newline at end of file
diff --git a/highlighters/upc-hl.xml b/highlighters/upc-hl.xml
new file mode 100644
index 0000000..a6b9688
--- /dev/null
+++ b/highlighters/upc-hl.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+Syntax highlighting definition for Unified Parallel C
+	
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks, 
+	Viraj Sinha
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+-->
+<!-- This file is a modified version of c-hl.xml adapted for UPC compatability 
+	by , who in no way takes credit for the original creation of this 
+	file or the rest of xslthl. -->
+<highlighters>
+	<highlighter type="multiline-comment">
+		<start>/**</start>
+		<end>*/</end>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="oneline-comment">
+		<start><![CDATA[/// ]]></start>
+		<style>doccomment</style>
+	</highlighter>
+	<highlighter type="multiline-comment">
+		<start>/*</start>
+		<end>*/</end>
+	</highlighter>
+	<highlighter type="oneline-comment">//</highlighter>
+	<highlighter type="oneline-comment">
+		<!-- use the online-comment highlighter to detect directives -->
+		<start>#</start>
+		<lineBreakEscape>\</lineBreakEscape>
+		<style>directive</style>
+		<solitary />
+	</highlighter>
+	<highlighter type="string">
+		<string>"</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="string">
+		<string>'</string>
+		<escape>\</escape>
+	</highlighter>
+	<highlighter type="hexnumber">
+		<prefix>0x</prefix>
+		<suffix>ul</suffix>
+		<suffix>lu</suffix>
+		<suffix>u</suffix>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="number">
+		<point>.</point>
+		<pointStarts />
+		<exponent>e</exponent>
+		<suffix>ul</suffix>
+		<suffix>lu</suffix>
+		<suffix>u</suffix>
+		<suffix>f</suffix>
+		<suffix>l</suffix>
+		<ignoreCase />
+	</highlighter>
+	<highlighter type="keywords">
+		<keyword>auto</keyword>
+		<keyword>_Bool</keyword>
+		<keyword>break</keyword>
+		<keyword>case</keyword>
+		<keyword>char</keyword>
+		<keyword>_Complex</keyword>
+		<keyword>const</keyword>
+		<keyword>continue</keyword>
+		<keyword>default</keyword>
+		<keyword>do</keyword>
+		<keyword>double</keyword>
+		<keyword>else</keyword>
+		<keyword>enum</keyword>
+		<keyword>extern</keyword>
+		<keyword>float</keyword>
+		<keyword>for</keyword>
+		<keyword>goto</keyword>
+		<keyword>if</keyword>
+		<keyword>_Imaginary</keyword>
+		<keyword>inline</keyword>
+		<keyword>int</keyword>
+		<keyword>long</keyword>
+		<keyword>register</keyword>
+		<keyword>relaxed</keyword>
+		<keyword>restrict</keyword>
+		<keyword>return</keyword>
+		<keyword>shared</keyword>
+		<keyword>strict</keyword>
+		<keyword>short</keyword>
+		<keyword>signed</keyword>
+		<keyword>sizeof</keyword>
+		<keyword>static</keyword>
+		<keyword>struct</keyword>
+		<keyword>switch</keyword>
+		<keyword>typedef</keyword>
+		<keyword>union</keyword>
+		<keyword>unsigned</keyword>
+		<keyword>upc_blocksizeof</keyword>
+		<keyword>upc_elemsizeof</keyword>
+		<keyword>upc_localsizeof</keyword>
+		<keyword>upc_lock_t</keyword>
+		<keyword>upc_forall</keyword>
+		<keyword>upc_barrier</keyword>
+		<keyword>upc_wait</keyword>
+		<keyword>upc_notify</keyword>
+		<keyword>upc_fence</keyword>
+		<keyword>void</keyword>
+		<keyword>volatile</keyword>
+		<keyword>while</keyword>
+	</highlighter>
+</highlighters>
diff --git a/highlighters/xslthl-config.xml b/highlighters/xslthl-config.xml
new file mode 100644
index 0000000..c09953d
--- /dev/null
+++ b/highlighters/xslthl-config.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2012 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<xslthl-config>
+	<highlighter id="java" file="java-hl.xml" />
+	<highlighter id="delphi" file="delphi-hl.xml" />
+	<highlighter id="pascal" file="delphi-hl.xml" />
+	<highlighter id="ini" file="ini-hl.xml" />
+	<highlighter id="php" file="php-hl.xml" />
+	<highlighter id="myxml" file="myxml-hl.xml" />
+	<highlighter id="m2" file="m2-hl.xml" />
+	<highlighter id="tcl" file="tcl-hl.xml" />
+	<highlighter id="c" file="c-hl.xml" />
+	<highlighter id="cpp" file="cpp-hl.xml" />
+	<highlighter id="csharp" file="csharp-hl.xml" />
+	<highlighter id="python" file="python-hl.xml" />
+	<highlighter id="ruby" file="ruby-hl.xml" />
+	<highlighter id="perl" file="perl-hl.xml" />	
+	<highlighter id="javascript" file="javascript-hl.xml" />
+	<highlighter id="bourne" file="bourne-hl.xml" />
+	<highlighter id="sh" file="bourne-hl.xml" />
+	<highlighter id="css" file="css21-hl.xml" />
+	<highlighter id="css21" file="css21-hl.xml" />
+	<highlighter id="cmake" file="cmake-hl.xml" />
+	<highlighter id="upc" file="upc-hl.xml" />
+	<highlighter id="lua" file="lua-hl.xml" />
+	<highlighter id="sql92" file="sql92-hl.xml" />
+	<highlighter id="sql1999" file="sql1999-hl.xml" />
+	<highlighter id="sql2003" file="sql2003-hl.xml" />
+	<highlighter id="sql" file="sql2003-hl.xml" />
+	<namespace prefix="xslthl" uri="http://xslthl.sf.net" />
+</xslthl-config>
\ No newline at end of file
diff --git a/maven/deploy.bat b/maven/deploy.bat
new file mode 100644
index 0000000..88e370c
--- /dev/null
+++ b/maven/deploy.bat
@@ -0,0 +1,5 @@
+set VERSION=2.1.3
+set REPO_URL=sftp://web.sourceforge.net/home/project-web/xslthl/htdocs/maven/repository
+set REPO_ID=xslthl-sourceforge
+
+call c:\maven\bin\mvn -X deploy:deploy-file -Durl=%REPO_URL% -DrepositoryId=%REPO_ID% -DpomFile=pom.xml -Dfile=..\dist\xslthl-%VERSION%.jar
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..acff8a5
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>net.sf.xslthl</groupId>
+	<artifactId>xslthl</artifactId>
+	<version>2.1.3</version>
+	<name>XSLT syntax highlighting</name>
+	<description>This is an implementation of syntax highlighting as an extension module for XSLT processors, so if you have e.g. article about programming written in DocBook, code examples can be automatically syntax highlighted during the XSLT processing phase.
+
+This version of xslthl provides extensions of the Apache Xalan and Saxon XSLT processors.</description>
+	<url>http://xslthl.sourceforge.net</url>
+	<inceptionYear>2005</inceptionYear>
+
+	<packaging>jar</packaging>
+
+	<licenses>
+		<license>
+			<name>zlib License</name>
+			<url>http://www.spdx.org/licenses/Zlib</url>
+		</license>
+	</licenses>
+
+	<!--
+	<parent>
+		<groupId>org.sonatype.oss</groupId>
+		<artifactId>oss-parent</artifactId>
+		<version>7</version>
+	</parent>
+	-->
+
+	<!-- For deploying to SF.net, shell account must be created first as decsribed at: http://maven.apache.org/plugins/maven-site-plugin/examples/site-deploy-to-sourceforge.net.html -->
+	<distributionManagement>
+	  <repository>
+	    <id>sourceforge.net</id>
+	    <url>scpexe://shell.sourceforge.net/home/project-web/xslthl/htdocs/maven/repository</url>
+	  </repository>
+	  <site>
+	    <id>sourceforge.net</id>
+	    <url>scpexe://shell.sourceforge.net/home/project-web/xslthl/htdocs/</url>
+	  </site>
+	</distributionManagement>
+
+	<build>
+		<plugins>
+			<plugin>
+                                <groupId>org.apache.maven.plugins</groupId>
+                                <artifactId>maven-jar-plugin</artifactId>
+                                <configuration>
+                                        <archive>
+                                                <manifest>
+                                                        <addClasspath>true</addClasspath>
+							<classpathLayoutType>custom</classpathLayoutType>
+							<customClasspathLayout>/usr/share/java/$${artifact.artifactId}.$${artifact.extension}</customClasspathLayout>
+                                                </manifest>
+                                        </archive>
+                                </configuration>
+                        </plugin>
+			<plugin>
+                                <groupId>org.apache.maven.plugins</groupId>
+                                <artifactId>maven-compiler-plugin</artifactId>
+                                <configuration>
+                                        <source>1.6</source>
+                                        <target>1.6</target>
+                                </configuration>
+                        </plugin>
+                        <plugin>
+                                <groupId>org.apache.maven.plugins</groupId>
+                                <artifactId>maven-surefire-plugin</artifactId>
+                                <dependencies>
+                                        <dependency>
+                                                <groupId>org.apache.maven.surefire</groupId>
+                                                <artifactId>surefire-junit47</artifactId>
+                                                <version>debian</version>
+                                        </dependency>
+                                </dependencies>
+                        </plugin>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>findbugs-maven-plugin</artifactId>
+				<version>2.5.2</version>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<goals>
+							<goal>check</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<version>1.7</version>
+				<executions>
+					<execution>
+						<phase>site</phase>
+						<configuration>
+							<target>
+								<ant dir="examples" />
+							</target>
+						</configuration>
+						<goals>
+							<goal>run</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.3</version>
+				<configuration>
+					<descriptors>
+						<descriptor>src/main/assembly/dist.xml</descriptor>
+					</descriptors>
+				</configuration>
+				<executions>
+					<execution>
+						<id>make-assembly</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+				<version>2.2</version>
+				<executions>
+					<execution>
+						<id>attach-sources</id>
+						<phase>package</phase>
+						<goals>
+							<goal>jar-no-fork</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.8.1</version>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+		<extensions>
+		  <!-- Enabling the use of FTP -->
+		  <extension>
+		    <groupId>org.apache.maven.wagon</groupId>
+		    <artifactId>wagon-ssh-external</artifactId>
+		    <version>1.0-beta-6</version>
+		  </extension>
+		</extensions>
+	</build>
+
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>findbugs-maven-plugin</artifactId>
+				<version>2.5.2</version>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.8.1</version>
+				<configuration>
+				</configuration>
+			</plugin>
+		</plugins>
+	</reporting>
+
+	<dependencies>
+		<dependency>
+			<groupId>xalan</groupId>
+			<artifactId>xalan</artifactId>
+			<version>[2.7,2.8)</version>
+			<optional>true</optional>
+		</dependency>
+		<dependency>
+		  <groupId>xalan</groupId>
+		  <artifactId>serializer</artifactId>
+		  <version>2.7.2</version>
+		  <optional>true</optional>
+		</dependency>
+		<dependency>
+			<groupId>saxon</groupId>
+			<artifactId>saxon</artifactId>
+			<version>[6.5,7.0]</version>
+			<optional>true</optional>
+		</dependency>
+		<dependency>
+			<groupId>net.sf.saxon</groupId>
+			<artifactId>saxon</artifactId>
+			<version>[8.5,)</version>
+			<optional>true</optional>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>[4.0,5.0)</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<scm>
+		<connection>scm:svn:https://xslthl.svn.sourceforge.net/svnroot/xslthl/trunk/xslthl/</connection>
+		<developerConnection>scm:svn:https://xslthl.svn.sourceforge.net/svnroot/xslthl/trunk/xslthl/</developerConnection>
+		<url>http://xslthl.svn.sourceforge.net/viewvc/xslthl/trunk/xslthl/</url>
+	</scm>
+
+	<issueManagement>
+		<system>sourceforge</system>
+		<url>https://sourceforge.net/tracker/?group_id=153524&atid=788111</url>
+	</issueManagement>
+
+	<developers>
+		<developer>
+			<id>mol1111</id>
+			<name>Michal Molhanec</name>
+			<email>mol1111 at users.sourceforge.net</email>
+		</developer>
+		<developer>
+			<id>kosek</id>
+			<name>Jirka Kosek</name>
+			<email>kosek at users.sourceforge.net</email>
+		</developer>
+		<developer>
+			<id>elmuerte</id>
+			<name>Michiel Hendriks</name>
+			<email>elmuerte at users.sourceforge.net</email>
+		</developer>
+		<developer>
+			<id>raducoravu</id>
+			<name>Radu Coravu</name>
+			<email>raducoravu at users.sourceforge.net</email>
+		</developer>
+	</developers>
+
+	<profiles>
+		<profile>
+			<id>release-sign-artifacts</id>
+			<activation>
+				<property>
+					<name>performRelease</name>
+					<value>true</value>
+				</property>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-gpg-plugin</artifactId>
+						<version>1.1</version>
+						<executions>
+							<execution>
+								<id>sign-artifacts</id>
+								<phase>verify</phase>
+								<goals>
+									<goal>sign</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+
+</project>
diff --git a/src/main/assembly/dist.xml b/src/main/assembly/dist.xml
new file mode 100644
index 0000000..4eba19e
--- /dev/null
+++ b/src/main/assembly/dist.xml
@@ -0,0 +1,33 @@
+<assembly
+	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+	<id>dist</id>
+	<formats>
+		<format>tar.gz</format>
+		<format>zip</format>
+	</formats>
+	<fileSets>
+		<fileSet>
+			<directory>${project.basedir}</directory>
+			<outputDirectory>/</outputDirectory>
+			<includes>
+				<include>README*</include>
+				<include>LICENSE*</include>
+				<include>NOTICE*</include>
+				<include>CHANGES*</include>
+			</includes>
+		</fileSet>
+		<fileSet>
+			<directory>${project.build.directory}</directory>
+			<outputDirectory>/</outputDirectory>
+			<includes>
+				<include>${project.artifactId}-${project.version}.jar</include>
+			</includes>
+		</fileSet>
+		<fileSet>
+			<directory>${project.basedir}/highlighters</directory>
+			<outputDirectory>/highlighters</outputDirectory>
+		</fileSet>
+	</fileSets>
+</assembly>
\ No newline at end of file
diff --git a/src/main/java/net/sf/xslthl/Block.java b/src/main/java/net/sf/xslthl/Block.java
new file mode 100644
index 0000000..21128af
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/Block.java
@@ -0,0 +1,85 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+/**
+ * A block of text
+ */
+public class Block {
+
+	/**
+	 * The content of this block
+	 */
+	protected String text;
+
+	public Block(String text) {
+		this.text = text;
+	}
+
+	/**
+	 * @return the text within this block
+	 */
+	public String getText() {
+		return text;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		return getText();
+	}
+
+	/**
+	 * @return true if this block contains style information
+	 */
+	public boolean isStyled() {
+		return false;
+	}
+
+	/**
+	 * @return true if this block as no content
+	 * @deprecated Use {@link #isEmpty()} instead
+	 */
+	@Deprecated
+	public boolean empty() {
+		return isEmpty();
+	}
+
+	/**
+	 * @return true if this block as no content
+	 */
+	public boolean isEmpty() {
+		if (text == null || text.length() == 0) {
+			return true;
+		}
+		return false;
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/CharIter.java b/src/main/java/net/sf/xslthl/CharIter.java
new file mode 100644
index 0000000..a9b41a0
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/CharIter.java
@@ -0,0 +1,314 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.util.Iterator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * A special character iterator
+ */
+public class CharIter implements Iterable<Character>, Iterator<Character> {
+	private String buffer;
+	private int position = 0;
+	private int length;
+	private int mark = 0;
+	private Matcher matcher;
+
+	public CharIter(String input) {
+		buffer = input;
+		length = input.length();
+	}
+
+	/**
+	 * @return the marked position
+	 */
+	public int getMark() {
+		return mark;
+	}
+
+	/**
+	 * Set the current position as the mark
+	 */
+	public void setMark() {
+		mark = position;
+	}
+
+	/**
+	 * Set the mark to the given location
+	 * 
+	 * @param newMark
+	 */
+	public void setMark(int newMark) {
+		mark = newMark;
+	}
+
+	/**
+	 * @return true if there is a mark set
+	 */
+	public boolean isMarked() {
+		return mark < position;
+	}
+
+	/**
+	 * @return the marked section
+	 */
+	public String getMarked() {
+		if (position > length) {
+			position = length;
+		}
+		return buffer.substring(mark, position);
+	}
+
+	/**
+	 * @return the marked string as a block
+	 */
+	public Block markedToBlock() {
+		Block b = new Block(getMarked());
+		setMark();
+		return b;
+	}
+
+	/**
+	 * Create a style block, unless the stylename is equale to
+	 * {@value StyledBlock#NO_STYLE}
+	 * 
+	 * @param styleName
+	 * @return the marked string as a styled block
+	 */
+	public Block markedToStyledBlock(String styleName) {
+		Block b = new StyledBlock(getMarked(), styleName);
+		setMark();
+		return b;
+	}
+
+	/**
+	 * Increase the pointer
+	 */
+	public void moveNext() {
+		position++;
+	}
+
+	/**
+	 * Increase the point with the given offset
+	 * 
+	 * @param offset
+	 */
+	public void moveNext(int offset) {
+		position += offset;
+	}
+
+	/**
+	 * Increase the pointer and mark the position after it
+	 */
+	public void moveNextAndMark() {
+		moveNext();
+		setMark();
+	}
+
+	/**
+	 * Move to the end of the string
+	 */
+	public void moveToEnd() {
+		position = length;
+	}
+
+	/**
+	 * @return true if the iterator finished
+	 */
+	public boolean finished() {
+		return position >= length;
+	}
+
+	/**
+	 * @return the current character
+	 */
+	public Character current() {
+		return buffer.charAt(position);
+	}
+
+	/**
+	 * @return the next character
+	 */
+	public Character next() {
+		if (position + 1 < length) {
+			return buffer.charAt(position + 1);
+		}
+		return null;
+	}
+
+	/**
+	 * @param offset
+	 * @return the characters at the given offset
+	 */
+	public Character next(int offset) {
+		if (position + offset < length) {
+			return buffer.charAt(position + offset);
+		}
+		return null;
+	}
+
+	/**
+	 * @return the previous character
+	 */
+	public Character prev() {
+		if (position > 0) {
+			return buffer.charAt(position - 1);
+		}
+		return null;
+	}
+
+	/**
+	 * @param offset
+	 * @return the previous character at a given offset
+	 */
+	public Character prev(int offset) {
+		if (position - offset >= 0) {
+			return buffer.charAt(position - offset);
+		}
+		return null;
+	}
+
+	/**
+	 * @param prefix
+	 * @return true if the current position starts with the prefix
+	 */
+	public boolean startsWith(String prefix) {
+		return startsWith(prefix, false);
+	}
+
+	/**
+	 * @param prefix
+	 * @param ignoreCase
+	 * @return true if the current position starts with the prefix
+	 */
+	public boolean startsWith(String prefix, boolean ignoreCase) {
+		return startsWith(prefix, 0, ignoreCase);
+	}
+
+	/**
+	 * @param prefix
+	 * @param diff
+	 * @return true if the current position starts with the prefix at a given
+	 *         offset
+	 */
+	public boolean startsWith(String prefix, int diff) {
+		return startsWith(prefix, diff, false);
+	}
+
+	/**
+	 * @param prefix
+	 * @param diff
+	 * @param ignoreCase
+	 * @return true if the current position starts with the prefix at a given
+	 *         offset
+	 */
+	public boolean startsWith(String prefix, int diff, boolean ignoreCase) {
+		if (ignoreCase) {
+			int end = position + diff + prefix.length();
+			if (end >= length) {
+				end = length - 1;
+			}
+			if (position + diff >= end) {
+			        return false;
+			}
+			return buffer.substring(position + diff, end).equalsIgnoreCase(
+			        prefix);
+		}
+		return buffer.startsWith(prefix, position + diff);
+	}
+
+	/**
+	 * Create a pattern matcher
+	 * 
+	 * @param pattern
+	 */
+	public Matcher createMatcher(Pattern pattern) {
+		matcher = pattern.matcher(buffer);
+		return matcher;
+	}
+
+	/**
+	 * @return
+	 */
+	public int getPosition() {
+		return position;
+	}
+
+	/**
+	 * @return
+	 */
+	public int getLength() {
+		return length;
+	}
+
+	/**
+	 * @return the remaining characters in the buffer
+	 */
+	public int remaining() {
+		if (position < length) {
+			return length - position;
+		}
+		return 0;
+	}
+
+	/**
+	 * @param substr
+	 * @return the index of the given string
+	 */
+	public int indexOf(String substr) {
+		int index = buffer.indexOf(substr, position);
+		return index < 0 ? -1 : index - position;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Iterable#iterator()
+	 */
+	public Iterator<Character> iterator() {
+		return this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.util.Iterator#hasNext()
+	 */
+	public boolean hasNext() {
+		return !finished();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.util.Iterator#remove()
+	 */
+	public void remove() {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/Config.java b/src/main/java/net/sf/xslthl/Config.java
new file mode 100644
index 0000000..ad93a8e
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/Config.java
@@ -0,0 +1,487 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import net.sf.xslthl.highlighters.AnnotationHighlighter;
+import net.sf.xslthl.highlighters.HeredocHighlighter;
+import net.sf.xslthl.highlighters.HexaDecimalHighlighter;
+import net.sf.xslthl.highlighters.KeywordsHighlighter;
+import net.sf.xslthl.highlighters.MultilineCommentHighlighter;
+import net.sf.xslthl.highlighters.NestedMultilineCommentHighlighter;
+import net.sf.xslthl.highlighters.NumberHighlighter;
+import net.sf.xslthl.highlighters.OnelineCommentHighlighter;
+import net.sf.xslthl.highlighters.RegexHighlighterEx;
+import net.sf.xslthl.highlighters.StringHighlighter;
+import net.sf.xslthl.highlighters.WordHighlighter;
+import net.sf.xslthl.highlighters.XMLHighlighter;
+import net.sf.xslthl.highlighters.HTMLHighlighter;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * Contains the Xslthl configuration
+ */
+public class Config {
+
+	/**
+	 * System property that defines the path to the configuration file
+	 */
+	public static final String CONFIG_PROPERTY = "xslthl.config";
+
+	/**
+	 * If set to true be verbose during loading of the configuration
+	 * 
+	 * @deprecated since 2.1 XSLTHL uses the Java logging facility
+	 */
+	@Deprecated
+	public static final String VERBOSE_LOADING_PROPERTY = "xslthl.config.verbose";
+
+	/**
+	 * The log level for the xslthl logger
+	 * 
+	 * @since 2.1
+	 */
+	public static final String LOGLEVEL_PROPERTY = "xslthl.loglevel";
+
+	/**
+	 * Property set to disable external configuration loading
+	 */
+	public static final String NO_EXTERNAL_PROPERTY = "xslthl.noexternal";
+
+	/**
+	 * Instances per config file
+	 */
+	private static final Map<String, Config> instances = new HashMap<String, Config>();
+
+	/**
+	 * Registered highlighter classes
+	 */
+	public static final Map<String, Class<? extends Highlighter>> highlighterClasses = new HashMap<String, Class<? extends Highlighter>>();
+
+	/**
+	 * Prefix used for plug-able highlighters
+	 * 
+	 * @since 2.1
+	 */
+	public static final String PLUGIN_PREFIX = "java:";
+
+	static {
+		// register builtin highlighers
+		highlighterClasses.put("multiline-comment",
+		        MultilineCommentHighlighter.class);
+		highlighterClasses.put("nested-multiline-comment",
+		        NestedMultilineCommentHighlighter.class);
+		highlighterClasses.put("oneline-comment",
+		        OnelineCommentHighlighter.class);
+		highlighterClasses.put("string", StringHighlighter.class);
+		highlighterClasses.put("heredoc", HeredocHighlighter.class);
+		highlighterClasses.put("keywords", KeywordsHighlighter.class);
+		highlighterClasses.put("annotation", AnnotationHighlighter.class);
+		highlighterClasses.put("regex", RegexHighlighterEx.class);
+		highlighterClasses.put("word", WordHighlighter.class);
+		highlighterClasses.put("number", NumberHighlighter.class);
+		highlighterClasses.put("hexnumber", HexaDecimalHighlighter.class);
+		highlighterClasses.put("xml", XMLHighlighter.class);
+		highlighterClasses.put("html", HTMLHighlighter.class);
+	}
+
+	/**
+	 * Prefix to use on created XML elements
+	 */
+	protected String prefix = "http://xslthl.sf.net";
+
+	/**
+	 * The namespace uri
+	 */
+	protected String uri = "xslthl";
+
+	/**
+	 * Registered highlighters
+	 */
+	protected Map<String, MainHighlighter> highlighters = new HashMap<String, MainHighlighter>();
+
+	/**
+	 * The logging facility
+	 */
+	protected Logger logger = Logger.getLogger("net.sf.xslthl");
+
+	@Deprecated
+	protected boolean verbose;
+
+	/**
+	 * Get the default config
+	 * 
+	 * @return
+	 */
+	public static Config getInstance() {
+		return getInstance(null);
+	}
+
+	/**
+	 * Get the config from a given file
+	 * 
+	 * @param filename
+	 * @return
+	 */
+	public static Config getInstance(String filename) {
+		String key = (filename == null) ? "" : filename;
+		if (!instances.containsKey(key)) {
+			Config conf = new Config(filename);
+			instances.put(key, conf);
+		}
+		return instances.get(key);
+	}
+
+	/**
+	 * @return the prefix
+	 */
+	public String getPrefix() {
+		return prefix;
+	}
+
+	/**
+	 * @return the uri
+	 */
+	public String getUri() {
+		return uri;
+	}
+
+	/**
+	 * Get the highlighter for a given language id, URI or filename.
+	 * 
+	 * @param id
+	 * @return A highlighter, or null if no highlighter exists
+	 */
+	public MainHighlighter getMainHighlighter(String id) {
+		if (id != null && id.length() > 0 && !highlighters.containsKey(id)) {
+			if (!Boolean.getBoolean(NO_EXTERNAL_PROPERTY)) {
+				// might be a URI
+				String uri = null;
+				try {
+					URI location = new URI(id);
+					if (location.getScheme() != null) {
+						uri = location.toString();
+					}
+				} catch (URISyntaxException e) {
+				}
+				if (uri == null) {
+					File floc = new File(id);
+					if (floc.getAbsoluteFile().exists()) {
+						uri = floc.getAbsoluteFile().toURI().toString();
+					} else {
+						// no highlighter found, which is not a major problem
+						// (i.e. fail silently)
+						logger.info(String
+						        .format("%s is not an known language id, valid URI, or existing file name",
+						                id));
+					}
+				}
+				if (uri != null) {
+					try {
+						logger.info(String.format(
+						        "Loading external highlighter from %s",
+						        uri.toString()));
+						MainHighlighter hl = loadHl(id, uri);
+						highlighters.put(id, hl);
+						return hl;
+					} catch (Exception e) {
+						logger.log(Level.SEVERE, String.format(
+						        "Unable to load highlighter from %s: %s", id,
+						        e.getMessage()), e);
+					}
+				}
+			}
+		}
+		return highlighters.get(id);
+	}
+
+	/**
+	 * Load a language highlighter configuration
+	 * 
+	 * @param filename
+	 * @return
+	 * @throws Exception
+	 */
+	protected MainHighlighter loadHl(String id, String filename)
+	        throws Exception {
+		MainHighlighter main = new MainHighlighter(id, filename);
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		DocumentBuilder builder = dbf.newDocumentBuilder();
+		Document doc = builder.parse(filename);
+		Set<String> tagNames = new HashSet<String>();
+		tagNames.add("highlighter");
+		tagNames.add("wholehighlighter");
+		createHighlighters(main,
+		        new FilteredElementIterator(doc.getDocumentElement(), tagNames));
+		return main;
+	}
+
+	/**
+	 * Creates the defined highlighters
+	 * 
+	 * @param main
+	 * @param elements
+	 */
+	protected void createHighlighters(MainHighlighter main,
+	        Iterator<Element> elements) {
+		while (elements.hasNext()) {
+			Element hl = elements.next();
+			Params params = new Params(hl);
+			String type = hl.getAttribute("type");
+			try {
+				Class<? extends Highlighter> hlClass = highlighterClasses
+				        .get(type);
+				if (hlClass == null && type.startsWith(PLUGIN_PREFIX)) {
+					hlClass = loadPlugin(main, type,
+					        hl.getAttribute("classpath"));
+				}
+				if (hlClass != null) {
+					Highlighter hlinstance = hlClass.newInstance();
+					hlinstance.init(params);
+					main.add(hlinstance);
+				} else {
+					logger.severe(String
+					        .format("Unknown highlighter: %s", type));
+				}
+			} catch (HighlighterConfigurationException e) {
+				logger.log(Level.SEVERE, String.format(
+				        "Invalid configuration for highlighter %s: %s", type,
+				        e.getMessage()), e);
+			} catch (InstantiationException e) {
+				logger.log(Level.SEVERE, String.format(
+				        "Error constructing highlighter %s: %s", type,
+				        e.getMessage()), e);
+			} catch (IllegalAccessException e) {
+				logger.log(Level.SEVERE, String.format(
+				        "IError constructing highlighter %s: %s", type,
+				        e.getMessage()), e);
+			}
+		}
+	}
+
+	/**
+	 * Load a plugin highlighter
+	 * 
+	 * @param type
+	 * @param classpath
+	 * @return The plugin class
+	 * @since 2.1
+	 */
+	protected Class<? extends Highlighter> loadPlugin(MainHighlighter main,
+	        String type, String classpath) {
+		ClassLoader cl = Config.class.getClassLoader();
+		if (classpath != null && classpath.length() > 0) {
+			String[] paths = classpath.split(";");
+			final List<URL> urls = new ArrayList<URL>();
+			for (String path : paths) {
+				path = path.trim();
+				if (path.length() == 0) {
+					continue;
+				}
+				try {
+					URL url;
+					if (main.getFilename() == null) {
+						url = new URL(path);
+					} else {
+						URL base = new URL(main.getFilename());
+						url = new URL(base, path);
+					}
+					urls.add(url);
+				} catch (MalformedURLException e) {
+					logger.log(Level.WARNING, String.format(
+					        "Invalid classpath entry %s: %s", path,
+					        e.getMessage()), e);
+				}
+			}
+			if (urls.size() > 0) {
+				final ClassLoader parentCl = cl;
+				PrivilegedAction<URLClassLoader> getCl = new PrivilegedAction<URLClassLoader>() {
+					public URLClassLoader run() {
+						return new URLClassLoader(urls.toArray(new URL[urls
+						        .size()]), parentCl);
+					}
+				};
+				try {
+					cl = AccessController.doPrivileged(getCl);
+				} catch (Exception e) {
+					logger.log(Level.SEVERE, String.format(
+					        "Unable to create class loader with urls %s. %s",
+					        urls, e.getMessage()), e);
+					return null;
+				}
+			}
+		}
+		try {
+			String className = type.substring(PLUGIN_PREFIX.length());
+			Class<?> tmp = cl.loadClass(className);
+			if (Highlighter.class.isAssignableFrom(tmp)) {
+				return tmp.asSubclass(Highlighter.class);
+			} else {
+				logger.log(
+				        Level.SEVERE,
+				        String.format("Class %s is not a subclass of %s",
+				                tmp.getName(), Highlighter.class.getName()));
+			}
+		} catch (ClassNotFoundException e) {
+			logger.log(
+			        Level.SEVERE,
+			        String.format("Unable to resolve highlighter class: %s",
+			                e.getMessage()), e);
+		}
+		return null;
+	}
+
+	protected Config() {
+		this(null);
+	}
+
+	protected Config(String configFilename) {
+		Level logLevel = Level.WARNING;
+		try {
+			logLevel = Level.parse(System.getProperty(LOGLEVEL_PROPERTY));
+		} catch (Exception e) {
+		}
+		logger.setLevel(logLevel);
+		logger.info("Initializing xslthl " + Version.getVersion());
+		loadConfiguration(configFilename);
+	}
+
+	/**
+	 * Load the configuration
+	 * 
+	 * @param configFilename
+	 *            When null or empty the default system configuration will be
+	 *            used
+	 * @since 2.1
+	 */
+	protected void loadConfiguration(String configFilename) {
+		try {
+			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+			DocumentBuilder builder = dbf.newDocumentBuilder();
+
+			// Find the configuration filename
+			if (configFilename == null || "".equals(configFilename)) {
+				logger.config("No config file specified, falling back to default behavior");
+				if (System.getProperty(CONFIG_PROPERTY) != null) {
+					configFilename = System.getProperty(CONFIG_PROPERTY);
+				} else if (new File("xslthl-config.xml").isFile()) {
+					configFilename = "xslthl-config.xml";
+				} else {
+                                        configFilename = "/usr/share/xslthl/highlighters/xslthl-config.xml";
+                                }
+			}
+
+			logger.info(String.format("Loading Xslthl configuration from %s",
+			        configFilename));
+			Document doc = builder.parse(configFilename);
+			NodeList hls = doc.getDocumentElement().getElementsByTagName(
+			        "highlighter");
+			Map<String, MainHighlighter> fileMapping = new HashMap<String, MainHighlighter>();
+			for (int i = 0; i < hls.getLength(); i++) {
+				// Process the highlighters
+				Element hl = (Element) hls.item(i);
+				String id = hl.getAttribute("id");
+
+				if (highlighters.containsKey(id)) {
+					logger.warning(String.format(
+					        "Highlighter with id '%s' already exists!", id));
+				}
+
+				String filename = hl.getAttribute("file");
+				String absFilename = new URL(new URL(configFilename), filename)
+				        .toString();
+				if (fileMapping.containsKey(absFilename)) {
+					// no need to load the same file twice.
+					logger.config(String.format(
+					        "Reusing loaded highlighter for %s from %s", id,
+					        absFilename));
+					highlighters.put(id, fileMapping.get(absFilename));
+					continue;
+				}
+				logger.info(String.format("Loading %s highligter from %s", id,
+				        absFilename));
+				try {
+					MainHighlighter mhl = loadHl(id, absFilename);
+					highlighters.put(id, mhl);
+					fileMapping.put(absFilename, mhl);
+				} catch (Exception e) {
+					logger.log(Level.SEVERE, String.format(
+					        "Failed to load highlighter from %s: %s",
+					        absFilename, e.getMessage()), e);
+				}
+			}
+
+			// Process the additional settings
+			NodeList prefixNode = doc.getDocumentElement()
+			        .getElementsByTagName("namespace");
+			if (prefixNode.getLength() == 1) {
+				Element e = (Element) prefixNode.item(0);
+				prefix = e.getAttribute("prefix");
+				uri = e.getAttribute("uri");
+			}
+		} catch (Exception e) {
+			logger.log(Level.SEVERE, String.format(
+			        "Cannot read configuration %s: %s", configFilename,
+			        e.getMessage()), e);
+		}
+
+		if (!highlighters.containsKey("xml")) {
+			// add the built-in XML highlighting if it wasn't overloaded
+			MainHighlighter xml = new MainHighlighter("xml", null);
+			xml.add(new XMLHighlighter());
+			highlighters.put("xml", xml);
+		}
+		if (!highlighters.containsKey("html")) {
+			// add the built-in HTML highlighting if it wasn't overloaded
+			MainHighlighter html = new MainHighlighter("html", null);
+			html.add(new HTMLHighlighter());
+			highlighters.put("html", html);
+		}
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/ConnectorSaxon6.java b/src/main/java/net/sf/xslthl/ConnectorSaxon6.java
new file mode 100644
index 0000000..c1eed6f
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/ConnectorSaxon6.java
@@ -0,0 +1,168 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.icl.saxon.Context;
+import com.icl.saxon.expr.XPathException;
+import com.icl.saxon.om.Axis;
+import com.icl.saxon.om.AxisEnumeration;
+import com.icl.saxon.om.Builder;
+import com.icl.saxon.om.DocumentInfo;
+import com.icl.saxon.om.NamePool;
+import com.icl.saxon.om.NodeEnumeration;
+import com.icl.saxon.om.NodeInfo;
+import com.icl.saxon.pattern.AnyNodeTest;
+import com.icl.saxon.tree.AttributeCollection;
+
+/**
+ * Connector for Saxon 6. For newer saxon versions the ConnectorSaxonB should be
+ * used.
+ */
+public class ConnectorSaxon6 {
+
+	private static void blockToSaxon6Node(Block b, Builder builder,
+	        NamePool pool, Config config) throws Exception {
+		if (b.isStyled()) {
+			AttributeCollection emptyAtts = new AttributeCollection(pool);
+			int elemId = pool.allocate(config.prefix, config.uri,
+			        ((StyledBlock) b).getStyle());
+			builder.startElement(elemId, emptyAtts, new int[0], 0);
+			builder.characters(b.getText().toCharArray(), 0, b.getText()
+			        .length());
+			builder.endElement(elemId);
+		} else {
+			builder.characters(b.getText().toCharArray(), 0, b.getText()
+			        .length());
+		}
+	}
+
+	/**
+	 * Highlight the nodes using the standard configuration file
+	 * 
+	 * @param context
+	 * @param hlCode
+	 * @param nodes
+	 * @return
+	 * @throws Exception
+	 */
+	public static NodeEnumeration highlight(Context context, String hlCode,
+	        NodeEnumeration nodes) throws Exception {
+		return highlight(context, hlCode, nodes, null);
+	}
+
+	/**
+	 * highlight the nodes using a specific interface
+	 * 
+	 * @param context
+	 * @param hlCode
+	 * @param nodes
+	 * @param configFilename
+	 * @return
+	 * @throws Exception
+	 */
+	public static NodeEnumeration highlight(Context context, String hlCode,
+	        NodeEnumeration nodes, String configFilename) throws Exception {
+		try {
+			Config c = Config.getInstance(configFilename);
+			MainHighlighter hl = c.getMainHighlighter(hlCode);
+
+			NamePool pool = context.getController().getNamePool();
+
+			List<NodeInfo> resultNodes = new ArrayList<NodeInfo>();
+
+			while (nodes.hasMoreElements()) {
+				NodeInfo ni = nodes.nextElement();
+				AxisEnumeration ae = ni.getEnumeration(Axis.CHILD, AnyNodeTest
+				        .getInstance());
+				while (ae.hasMoreElements()) {
+					NodeInfo n2i = ae.nextElement();
+					if (n2i.getNodeType() == NodeInfo.TEXT) {
+						if (hl != null) {
+							Builder builder = context.getController()
+							        .makeBuilder();
+							builder.startDocument();
+							List<Block> l = hl.highlight(n2i.getStringValue());
+							for (Block b : l) {
+								blockToSaxon6Node(b, builder, pool, c);
+							}
+							builder.endDocument();
+							DocumentInfo doc = builder.getCurrentDocument();
+							NodeEnumeration elms = doc.getEnumeration(
+							        Axis.CHILD, AnyNodeTest.getInstance());
+							while (elms.hasMoreElements()) {
+								resultNodes.add(elms.nextElement());
+							}
+						} else {
+							resultNodes.add(n2i);
+						}
+					} else {
+						// deepCopy(builder, pool, n2i);
+						resultNodes.add(n2i);
+					}
+				}
+			}
+			return new NodeEnumerationIterator(resultNodes.iterator());
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	static class NodeEnumerationIterator implements NodeEnumeration {
+
+		protected Iterator<NodeInfo> it;
+
+		NodeEnumerationIterator(Iterator<NodeInfo> useit) {
+			it = useit;
+		}
+
+		public boolean hasMoreElements() {
+			return it.hasNext();
+		}
+
+		public boolean isPeer() {
+			return true;
+		}
+
+		public boolean isReverseSorted() {
+			return false;
+		}
+
+		public boolean isSorted() {
+			return true;
+		}
+
+		public NodeInfo nextElement() throws XPathException {
+			return it.next();
+		}
+
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/ConnectorSaxonB.java b/src/main/java/net/sf/xslthl/ConnectorSaxonB.java
new file mode 100644
index 0000000..cb21450
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/ConnectorSaxonB.java
@@ -0,0 +1,145 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.saxon.event.Builder;
+import net.sf.saxon.expr.XPathContext;
+import net.sf.saxon.om.AxisInfo;
+import net.sf.saxon.tree.iter.AxisIterator;
+import net.sf.saxon.om.Item;
+import net.sf.saxon.tree.iter.ListIterator;
+import net.sf.saxon.om.NamePool;
+import net.sf.saxon.om.NodeInfo;
+import net.sf.saxon.om.SequenceIterator;
+import net.sf.saxon.pattern.AnyNodeTest;
+import net.sf.saxon.type.Type;
+
+/**
+ * A new saxon connector to be used with saxon 8.5 and later.
+ */
+public class ConnectorSaxonB {
+
+	private static void blockToSaxon6Node(Block b, Builder builder,
+	        NamePool pool, Config config) throws Exception {
+		if (b.isStyled()) {
+			int elemId = pool.allocate(config.prefix, config.uri,
+			        ((StyledBlock) b).getStyle());
+			builder.startElement(null, null, 0, 0);
+			builder.characters(b.getText(), 0, b.getText().length());
+			builder.endElement();
+		} else {
+			builder.characters(b.getText(), 0, b.getText().length());
+		}
+	}
+
+	/**
+	 * Highlight the nodes using the standard configuration file
+	 * 
+	 * @param context
+	 * @param hlCode
+	 * @param nodes
+	 * @return
+	 * @throws Exception
+	 */
+	public static SequenceIterator highlight(XPathContext context,
+	        String hlCode, SequenceIterator nodes) throws Exception {
+		return highlight(context, hlCode, nodes, null);
+	}
+
+	/**
+	 * highlight the nodes using a specific interface
+	 * 
+	 * @param context
+	 * @param hlCode
+	 * @param seq
+	 * @param configFilename
+	 * @return
+	 * @throws Exception
+	 */
+	public static SequenceIterator highlight(XPathContext context,
+	        String hlCode, SequenceIterator seq, String configFilename)
+	        throws Exception {
+		try {
+			Config c = Config.getInstance(configFilename);
+			MainHighlighter hl = c.getMainHighlighter(hlCode);
+
+			NamePool pool = context.getController().getNamePool();
+
+			List<Item> resultNodes = new ArrayList<Item>();
+			while (seq.next() != null) {
+				Item itm = seq.current();
+				if (itm instanceof NodeInfo) {
+					NodeInfo ni = (NodeInfo) itm;
+					SequenceIterator ae = ni.iterateAxis(AxisInfo.CHILD,
+					        AnyNodeTest.getInstance());
+					while (ae.next() != null) {
+						Item itm2 = ae.current();
+						if (itm2 instanceof NodeInfo) {
+							NodeInfo n2i = (NodeInfo) itm2;
+							if (n2i.getNodeKind() == Type.TEXT) {
+								if (hl != null) {
+									Builder builder = context.getController()
+									        .makeBuilder();
+									builder.open();
+									builder.startDocument(0);
+									List<Block> l = hl.highlight(n2i
+									        .getStringValue());
+									for (Block b : l) {
+										blockToSaxon6Node(b, builder, pool, c);
+									}
+									builder.endDocument();
+									builder.close();
+									NodeInfo doc = builder.getCurrentRoot();
+									AxisIterator elms = doc.iterateAxis(
+									        AxisInfo.CHILD, AnyNodeTest
+									                .getInstance());
+									while (elms.next() != null) {
+										resultNodes.add(elms.current());
+									}
+								} else {
+									resultNodes.add(n2i);
+								}
+							} else {
+								resultNodes.add(n2i);
+							}
+						} else {
+							resultNodes.add(itm2);
+						}
+					}
+				} else {
+					resultNodes.add(itm);
+				}
+			}
+			return new ListIterator(resultNodes);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/ConnectorSaxonEE.java b/src/main/java/net/sf/xslthl/ConnectorSaxonEE.java
new file mode 100644
index 0000000..2212979
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/ConnectorSaxonEE.java
@@ -0,0 +1,195 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.saxon.event.Builder;
+import net.sf.saxon.expr.XPathContext;
+import net.sf.saxon.om.Item;
+import net.sf.saxon.om.NamePool;
+import net.sf.saxon.om.NodeInfo;
+import net.sf.saxon.om.SequenceIterator;
+import net.sf.saxon.type.AnyType;
+import net.sf.saxon.type.Type;
+
+/**
+ * A new saxon connector to be used with saxon 8.5 and later. This class uses
+ * Java reflection to call Saxon classes in order to be able to compile both
+ * connectors with the older Saxon library.
+ */
+public class ConnectorSaxonEE {
+
+	private static void blockToSaxon6Node(Block b, Builder builder,
+	        Config config) throws Exception {
+		if (b.isStyled()) {
+			// int elemId = pool.allocate(config.prefix, config.uri,
+			// ((StyledBlock) b).getStyle());
+
+			// new FingerprintedQName(config.prefix, config.uri, ((StyledBlock)
+			// b).getStyle())
+			Class fpQnameClazz = Class
+			        .forName("net.sf.saxon.om.FingerprintedQName");
+			Constructor constructor = fpQnameClazz.getConstructor(new Class[] {
+			        String.class, String.class, String.class });
+			Object fpQname = constructor.newInstance(new Object[] {
+			        config.prefix, config.uri, ((StyledBlock) b).getStyle() });
+
+			// builder.startElement(fpQname, AnyType.getInstance(), 0, 0);
+			Method startElement = builder.getClass().getMethod(
+			        "startElement",
+			        new Class[] { Class.forName("net.sf.saxon.om.NodeName"),
+			                net.sf.saxon.type.SchemaType.class, int.class,
+			                int.class });
+			startElement.invoke(builder,
+			        new Object[] { fpQname, AnyType.getInstance(), 0, 0 });
+			builder.characters(b.getText(), 0, b.getText().length());
+			builder.endElement();
+		} else {
+			builder.characters(b.getText(), 0, b.getText().length());
+		}
+	}
+
+	/**
+	 * Highlight the nodes using the standard configuration file
+	 * 
+	 * @param context
+	 * @param hlCode
+	 * @param nodes
+	 * @return
+	 * @throws Exception
+	 */
+	public static SequenceIterator highlight(XPathContext context,
+	        String hlCode, SequenceIterator nodes) throws Exception {
+		return highlight(context, hlCode, nodes, null);
+	}
+
+	/**
+	 * highlight the nodes using a specific interface
+	 * 
+	 * @param context
+	 * @param hlCode
+	 * @param seq
+	 * @param configFilename
+	 * @return
+	 * @throws Exception
+	 */
+	public static SequenceIterator highlight(XPathContext context,
+	        String hlCode, SequenceIterator seq, String configFilename)
+	        throws Exception {
+		try {
+			Config c = Config.getInstance(configFilename);
+			MainHighlighter hl = c.getMainHighlighter(hlCode);
+
+			// Axis info obtained via Java reflection.
+			byte childType = (Byte) Class.forName("net.sf.saxon.om.AxisInfo")
+			        .getField("CHILD").get(null);
+			Method iterateAxis = Class
+			        .forName("net.sf.saxon.om.NodeInfo")
+			        .getMethod(
+			                "iterateAxis",
+			                new Class[] {
+			                        byte.class,
+			                        Class.forName("net.sf.saxon.pattern.NodeTest") });
+			Class axisIterClazz = Class
+			        .forName("net.sf.saxon.tree.iter.AxisIterator");
+			Method next = axisIterClazz.getMethod("next", new Class[0]);
+
+			List<Item> resultNodes = new ArrayList<Item>();
+			Item itm = null;
+			while ((itm = seq.next()) != null) {
+				// Item itm = seq.current();
+				if (itm instanceof NodeInfo) {
+					NodeInfo ni = (NodeInfo) itm;
+					SequenceIterator ae = (SequenceIterator) iterateAxis
+					        .invoke(ni,
+					                new Object[] {
+					                        childType,
+					                        net.sf.saxon.pattern.AnyNodeTest
+					                                .getInstance() });
+					// SequenceIterator ae = ni.iterateAxis(childType,
+					// net.sf.saxon.pattern.AnyNodeTest.getInstance());
+					Item itm2 = null;
+					while ((itm2 = ae.next()) != null) {
+						if (itm2 instanceof NodeInfo) {
+							NodeInfo n2i = (NodeInfo) itm2;
+							if (n2i.getNodeKind() == Type.TEXT) {
+								if (hl != null) {
+									Builder builder = context.getController()
+									        .makeBuilder();
+									builder.open();
+									builder.startDocument(0);
+									List<Block> l = hl.highlight(n2i
+									        .getStringValue());
+									for (Block b : l) {
+										blockToSaxon6Node(b, builder, c);
+									}
+									builder.endDocument();
+									builder.close();
+									NodeInfo doc = builder.getCurrentRoot();
+
+									Object elms = iterateAxis
+									        .invoke(doc,
+									                new Object[] {
+									                        childType,
+									                        net.sf.saxon.pattern.AnyNodeTest
+									                                .getInstance() });
+									// Object elms =
+									// doc.iterateAxis(childType,net.sf.saxon.pattern.AnyNodeTest);
+									Item crt = null;
+									while ((crt = (Item) next.invoke(elms,
+									        new Object[0])) != null) {
+										resultNodes.add(crt);
+									}
+								} else {
+									resultNodes.add(n2i);
+								}
+							} else {
+								resultNodes.add(n2i);
+							}
+						} else {
+							resultNodes.add(itm2);
+						}
+					}
+				} else {
+					resultNodes.add(itm);
+				}
+			}
+			Class lstIterClassName = Class
+			        .forName("net.sf.saxon.tree.iter.ListIterator");
+			Constructor constructor = lstIterClassName
+			        .getConstructor(new Class[] { List.class });
+			return (SequenceIterator) constructor
+			        .newInstance(new Object[] { resultNodes });
+		} catch (Throwable e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/ConnectorXalan.java b/src/main/java/net/sf/xslthl/ConnectorXalan.java
new file mode 100644
index 0000000..60b94bd
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/ConnectorXalan.java
@@ -0,0 +1,137 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.xalan.extensions.ExpressionContext;
+import org.apache.xpath.NodeSet;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * XalanConnector for XsltHL. Usage: Add the namespace
+ * <code>xmlns:xhl="xalan://net.sf.xslthl.XalanConnector"</code> then you can
+ * use the function:
+ * <code>xhl:highlight($language, exsl:node-set($content))</code> or <code>xhl:highlight($language, exsl:node-set($content), 'myConfigFile')</code>
+ * 
+ * @author Michiel Hendriks
+ */
+public class ConnectorXalan {
+	protected static NodeList highlight(ExpressionContext c, String source,
+	        MainHighlighter hl, Config config) throws Exception {
+		NodeSet list = new NodeSet();
+		List<Block> l = hl.highlight(source);
+		for (Block b : l) {
+			Node elm;
+			if (b.isStyled()) {
+				elm = DocumentInstance.doc.createElementNS(config.uri,
+				        ((StyledBlock) b).getStyle());
+				elm.setTextContent(b.getText());
+			} else {
+				elm = DocumentInstance.doc.createTextNode(b.getText());
+			}
+
+			list.addElement(elm);
+		}
+		return list;
+	}
+
+	/**
+	 * highlight the given nodes using the standard configuration
+	 * 
+	 * @param context
+	 * @param hlCode
+	 * @param nodes
+	 * @return
+	 */
+	public static final NodeList highlight(ExpressionContext context,
+	        String hlCode, NodeList nodes) {
+		return highlight(context, hlCode, nodes, null);
+	}
+
+	/**
+	 * highlight the given nodes
+	 * 
+	 * @param context
+	 * @param hlCode
+	 * @param nodes
+	 * @param configFilename
+	 * @return
+	 */
+	public static final NodeList highlight(ExpressionContext context,
+	        String hlCode, NodeList nodes, String configFilename) {
+		try {
+			Config c = Config.getInstance(configFilename);
+			MainHighlighter hl = c.getMainHighlighter(hlCode);
+			NodeSet list = new NodeSet();
+			for (int i = 0; i < nodes.getLength(); i++) {
+				Node n = nodes.item(i);
+				NodeList childs = n.getChildNodes();
+				for (int j = 0; j < childs.getLength(); j++) {
+					Node m = childs.item(j);
+					if (m.getNodeType() == Node.TEXT_NODE) {
+						if (hl != null) {
+							list.addNodes(highlight(context, m.getNodeValue(),
+							        hl, c));
+						} else {
+							list.addNode(DocumentInstance.doc.createTextNode(m
+							        .getNodeValue()));
+						}
+					} else {
+						list.addNode(m);
+					}
+				}
+			}
+			return list;
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	/**
+	 * Used for note construction. (lazy loading)
+	 */
+	private static class DocumentInstance {
+		private static final Document doc;
+		static {
+			try {
+				doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
+				        .newDocument();
+			}
+
+			catch (ParserConfigurationException e) {
+				throw new RuntimeException(e);
+			}
+
+		}
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/FilteredElementIterator.java b/src/main/java/net/sf/xslthl/FilteredElementIterator.java
new file mode 100644
index 0000000..b97ebfe
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/FilteredElementIterator.java
@@ -0,0 +1,211 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2009 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * An iterator over the child elements of a given element, filtered by a set of
+ * element names.
+ * 
+ * @author Michiel Hendriks
+ */
+public class FilteredElementIterator implements Iterator<Element> {
+
+	/**
+	 * Defines a filter used by this iterator
+	 * 
+	 * @author Michiel Hendriks
+	 */
+	public interface Acceptor {
+		/**
+		 * Accept or reject an element
+		 * 
+		 * @param elm
+		 *            The current element
+		 * @return True if the element is accepted
+		 */
+		boolean accepted(Element elm);
+	}
+
+	/**
+	 * Acceptor that accepts elements based on the tag name
+	 */
+	public static class TagNameAcceptor implements Acceptor {
+		protected Set<String> names;
+
+		public TagNameAcceptor(Set<String> acceptNames) {
+			if (acceptNames == null) {
+				throw new NullPointerException("Set can not be null");
+			}
+			names = new HashSet<String>(acceptNames);
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * net.sf.xslthl.FilteredElementIterator.Acceptor#accepted(org.w3c.dom
+		 * .Element)
+		 */
+		public boolean accepted(Element elm) {
+			return names.contains(elm.getTagName());
+		}
+
+	}
+
+	/**
+	 * The current element
+	 */
+	protected Element base;
+
+	/**
+	 * The current element
+	 */
+	protected Element current;
+
+	/**
+	 * The used acceptor for filtering
+	 */
+	protected Acceptor acceptor;
+
+	/**
+	 * If true a new value should be retrieved
+	 */
+	protected boolean dirty = true;
+
+	/**
+	 * Will be true if the search reached an end
+	 */
+	protected boolean finished;
+
+	public FilteredElementIterator(Element baseElement, Acceptor filter) {
+		if (baseElement == null) {
+			throw new NullPointerException("Base Element can not be null");
+		}
+		if (filter == null) {
+			throw new NullPointerException("Acceptor can not be null");
+		}
+		acceptor = filter;
+		base = baseElement;
+		dirty = true;
+	}
+
+	/**
+	 * Creates a filtered element iterator that accepts elements with a given
+	 * tag name
+	 * 
+	 * @param baseElement
+	 * @param acceptTagNames
+	 */
+	public FilteredElementIterator(Element baseElement,
+	        Set<String> acceptTagNames) {
+		this(baseElement, new TagNameAcceptor(acceptTagNames));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.util.Iterator#hasNext()
+	 */
+	public boolean hasNext() {
+		if (!finished && dirty) {
+			// not finished, and the current value is dirty
+			getNextElement();
+		}
+		return current != null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.util.Iterator#next()
+	 */
+	public Element next() {
+		if (!finished && dirty) {
+			// if dirty first get a new value
+			getNextElement();
+		}
+		if (finished) {
+			// no more elements
+			throw new NoSuchElementException();
+		}
+		dirty = true;
+		return current;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.util.Iterator#remove()
+	 */
+	public void remove() {
+		throw new UnsupportedOperationException("Elements can not be removed");
+	}
+
+	/**
+	 * Get the next valid element
+	 */
+	protected void getNextElement() {
+		assert !finished : "Should not call getNextElements on a finished list";
+		if (current == null) {
+			current = getAcceptedElement(base.getFirstChild());
+		} else {
+			current = getAcceptedElement(current.getNextSibling());
+		}
+		// iteration is finished when the current element is null
+		finished = current == null;
+		dirty = false;
+	}
+
+	/**
+	 * Get the next accepted element. Will continue searching for the next
+	 * sibling nodes.
+	 * 
+	 * @param node
+	 *            The first node to test
+	 * @return The accepted element, or null
+	 */
+	protected Element getAcceptedElement(Node node) {
+		while (node != null) {
+			if (node.getNodeType() == Node.ELEMENT_NODE
+			        && node instanceof Element) {
+				Element result = (Element) node;
+				if (acceptor.accepted(result)) {
+					return result;
+				}
+			}
+			node = node.getNextSibling();
+		}
+		return null;
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/Highlighter.java b/src/main/java/net/sf/xslthl/Highlighter.java
new file mode 100644
index 0000000..07ad51a
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/Highlighter.java
@@ -0,0 +1,128 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.io.Serializable;
+import java.util.Comparator;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Base highlighter. Accepted parameters:
+ * <dl>
+ * <dt>Style</dt>
+ * <dd>The style to use in the generated block. Must be a valid XML name.</dd>
+ * </dl>
+ */
+public abstract class Highlighter {
+
+	/**
+	 * validates a valid XML name (note: ':' is not allowed)
+	 * http://www.w3.org/TR/2000/REC-xml-20001006#NT-Letter
+	 */
+	public static final Pattern XMLname = Pattern
+	        .compile("[\\p{Ll}\\p{Lu}\\p{Lo}\\p{Lt}\\p{Nl}_][\\p{Ll}\\p{Lu}\\p{Lo}\\p{Lt}\\p{Nl}\\p{Mc}\\p{Me}\\p{Mn}\\p{Lm}\\p{Nd}_.-]*");
+
+	public final static class IgnoreCaseComparator implements
+	        Comparator<String>, Serializable {
+		private static final long serialVersionUID = -3992873598858412249L;
+
+		public int compare(String s1, String s2) {
+			return s1.compareToIgnoreCase(s2);
+		}
+	}
+
+	public final static boolean isNewLine(Character c) {
+		return '\n' == c || '\r' == c;
+	}
+
+	/**
+	 * The name of the style to use
+	 */
+	protected String styleName;
+
+	/**
+	 * Initializer
+	 * 
+	 * @param params
+	 * @throws HighlighterConfigurationException
+	 */
+	public void init(Params params) throws HighlighterConfigurationException {
+		if (params == null) {
+			styleName = getDefaultStyle();
+		} else {
+			styleName = params.getParam("style", getDefaultStyle());
+		}
+		if (styleName == null || styleName.length() == 0) {
+			throw new HighlighterConfigurationException(
+			        "Required parameter 'style' is not set.");
+		}
+		if (StyledBlock.NO_STYLE.equalsIgnoreCase(styleName)) {
+			styleName = StyledBlock.NO_STYLE;
+		} else if (StyledBlock.HIDDEN_STYLE.equalsIgnoreCase(styleName)) {
+			styleName = StyledBlock.HIDDEN_STYLE;
+		} else {
+			if (!XMLname.matcher(styleName).matches()) {
+				throw new HighlighterConfigurationException(String.format(
+				        "%s is not a valid XML Name", styleName));
+			}
+		}
+	}
+
+	/**
+	 * return true if the current character is a possible match for this
+	 * highlighter
+	 * 
+	 * @param in
+	 * @return
+	 */
+	public boolean startsWith(CharIter in) {
+		return false;
+	}
+
+	/**
+	 * Perform highlighting on the current token stream. Return true when
+	 * highlighting was performed, or false in case of a false positive.
+	 * 
+	 * @param in
+	 * @param out
+	 * @return
+	 */
+	public abstract boolean highlight(CharIter in, List<Block> out);
+
+	/**
+	 * The default style name
+	 * 
+	 * @return
+	 */
+	public abstract String getDefaultStyle();
+
+	/**
+	 * Reset this highlighter to it's initially configured state
+	 */
+	public void reset() {
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/HighlighterConfigurationException.java b/src/main/java/net/sf/xslthl/HighlighterConfigurationException.java
new file mode 100644
index 0000000..d76cabd
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/HighlighterConfigurationException.java
@@ -0,0 +1,28 @@
+/**
+ * 
+ */
+package net.sf.xslthl;
+
+/**
+ * Exception thrown on construction of a highlighter when the configuration is
+ * incomplete
+ */
+public class HighlighterConfigurationException extends Exception {
+	private static final long serialVersionUID = -4137958185614779128L;
+
+	/**
+	 * @param arg0
+	 * @param arg1
+	 */
+	public HighlighterConfigurationException(String arg0, Throwable arg1) {
+		super(arg0, arg1);
+	}
+
+	/**
+	 * @param arg0
+	 */
+	public HighlighterConfigurationException(String arg0) {
+		super(arg0);
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/MainHighlighter.java b/src/main/java/net/sf/xslthl/MainHighlighter.java
new file mode 100644
index 0000000..89dd082
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/MainHighlighter.java
@@ -0,0 +1,164 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Main source highlighter. It will call all registered highlighters.
+ */
+public class MainHighlighter {
+
+	protected String id;
+	protected String filename;
+
+	/**
+	 * Normal highlighter
+	 */
+	protected List<Highlighter> highlighters = new ArrayList<Highlighter>();
+
+	/**
+     * 
+     */
+	protected List<WholeHighlighter> wholehighlighters = new ArrayList<WholeHighlighter>();
+
+	public MainHighlighter(String highlighterId, String configFilename) {
+		id = highlighterId;
+		filename = configFilename;
+	}
+
+	/**
+	 * The highlighter identifier
+	 * 
+	 * @return
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/**
+	 * The configuration filename, can be null
+	 * 
+	 * @return
+	 */
+	public String getFilename() {
+		return filename;
+	}
+
+	public void add(Highlighter h) {
+		if (h instanceof WholeHighlighter) {
+			wholehighlighters.add((WholeHighlighter) h);
+		} else {
+			highlighters.add(h);
+		}
+	}
+
+	@Deprecated
+	public void addWhole(WholeHighlighter h) {
+		add(h);
+	}
+
+	/**
+	 * Convert the input string into a collection of text blocks
+	 * 
+	 * @param source
+	 * @return
+	 */
+	public List<Block> highlight(String source) {
+		CharIter in = new CharIter(source);
+		List<Block> out = new ArrayList<Block>();
+
+		if (highlighters.size() > 0) {
+			while (!in.finished()) {
+				boolean found = false;
+				for (Highlighter h : highlighters) {
+					if (h.startsWith(in)) {
+						int pos = in.getPosition();
+						int oldMark = -2;
+						Block preBlock = null;
+						if (in.isMarked()) {
+							oldMark = in.getMark();
+							preBlock = in.markedToBlock();
+							out.add(preBlock);
+						}
+						found = h.highlight(in, out);
+						if (found) {
+							break;
+						} else {
+							// undo last action when it was a false positive
+							in.moveNext(pos - in.getPosition());
+							if (preBlock != null) {
+								out.remove(preBlock);
+							}
+							if (oldMark != -2) {
+								in.setMark(oldMark);
+							}
+						}
+					}
+				}
+				if (!found) {
+					in.moveNext();
+				}
+			}
+		} else {
+			in.moveToEnd();
+		}
+
+		if (in.isMarked()) {
+			out.add(in.markedToBlock());
+		}
+
+		if (wholehighlighters.size() > 0) {
+			for (WholeHighlighter h : wholehighlighters) {
+				List<Block> oldout = out;
+				out = new LinkedList<Block>();
+				for (Block b : oldout) {
+					if (b.isStyled()
+					        && (h.appliesOnAllStyles() || h
+					                .appliesOnStyle(((StyledBlock) b)
+					                        .getStyle())) || !b.isStyled()
+					        && h.appliesOnEmptyStyle()) {
+						h.highlight(new CharIter(b.getText()), out);
+					} else {
+						out.add(b);
+					}
+				}
+			}
+		}
+
+		for (Highlighter h : highlighters) {
+			h.reset();
+		}
+		for (WholeHighlighter h : wholehighlighters) {
+			h.reset();
+		}
+
+		return out;
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/Params.java b/src/main/java/net/sf/xslthl/Params.java
new file mode 100644
index 0000000..6705efb
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/Params.java
@@ -0,0 +1,165 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.util.Collection;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Syntax highlighter parameters
+ */
+public class Params {
+
+	public interface ParamsLoader<T> {
+		T load(Params params) throws HighlighterConfigurationException;
+	}
+
+	protected Element paramElem;
+
+	public Params(Element paramElem) {
+		this.paramElem = paramElem;
+	}
+
+	/**
+	 * Return the text content for the given element. This is different from the
+	 * Element.getTextContect() function in a way that normal text nodes are
+	 * trimmed and CDATA is used AS IS
+	 * 
+	 * @param elm
+	 * @return
+	 */
+	protected String getTextContent(Node elm) {
+		if (elm == null) {
+			return "";
+		}
+		StringBuilder sb = new StringBuilder();
+		NodeList list = elm.getChildNodes();
+		for (int i = 0; i < list.getLength(); i++) {
+			Node n = list.item(i);
+			if (sb.length() > 0) {
+				sb.append(' ');
+			}
+			if (n.getNodeType() == Node.CDATA_SECTION_NODE) {
+				sb.append(n.getTextContent());
+			} else {
+				sb.append(n.getTextContent().trim());
+			}
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Get the current element as value
+	 * 
+	 * @return
+	 */
+	public String getParam() {
+		return getTextContent(paramElem);
+	}
+
+	/**
+	 * Get a single parameter. Returns null when the parameter doesn't exist.
+	 * 
+	 * @param name
+	 * @return
+	 */
+	public String getParam(String name) {
+		return getParam(name, null);
+	}
+
+	/**
+	 * Get a single parameter with a default value.
+	 * 
+	 * @param name
+	 * @param defaultValue
+	 * @return
+	 */
+	public String getParam(String name, String defaultValue) {
+		NodeList nodes = paramElem.getElementsByTagName(name);
+		if (nodes.getLength() == 0) {
+			return defaultValue;
+		}
+		return getTextContent(nodes.item(0));
+	}
+
+	/**
+	 * @param name
+	 * @return
+	 */
+	public Params getParams(String name) {
+		Element elm = (Element) paramElem.getElementsByTagName(name).item(0);
+		if (elm == null) {
+			return null;
+		}
+		return new Params(elm);
+	}
+
+	/**
+	 * Return true if a parameter with the given name exists.
+	 * 
+	 * @param name
+	 * @return
+	 */
+	public boolean isSet(String name) {
+		return paramElem.getElementsByTagName(name).getLength() > 0;
+	}
+
+	/**
+	 * Load multiple parameters into a list
+	 * 
+	 * @param name
+	 * @param list
+	 */
+	public void getMutliParams(String name, Collection<String> list) {
+		NodeList nodes = paramElem.getElementsByTagName(name);
+		for (int i = 0; i < nodes.getLength(); i++) {
+			Element elem = (Element) nodes.item(i);
+			list.add(getTextContent(elem));
+		}
+	}
+
+	/**
+	 * Get the parameters using a specialized loader
+	 * 
+	 * @param <T>
+	 * @param name
+	 * @param list
+	 * @param loader
+	 * @throws HighlighterConfigurationException
+	 */
+	public <T> void getMultiParams(String name, Collection<T> list,
+	        ParamsLoader<? extends T> loader)
+	        throws HighlighterConfigurationException {
+		NodeList nodes = paramElem.getElementsByTagName(name);
+		for (int i = 0; i < nodes.getLength(); i++) {
+			Element elem = (Element) nodes.item(i);
+			list.add(loader.load(new Params(elem)));
+		}
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/StyledBlock.java b/src/main/java/net/sf/xslthl/StyledBlock.java
new file mode 100644
index 0000000..f7227e2
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/StyledBlock.java
@@ -0,0 +1,100 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+/**
+ * A block with a style
+ */
+public class StyledBlock extends Block {
+	/**
+	 * Do not add a style, just "block" it
+	 */
+	public static final String NO_STYLE = "none";
+
+	/**
+	 * Remove this part from the result
+	 */
+	public static final String HIDDEN_STYLE = "hidden";
+
+	/**
+	 * The style name
+	 */
+	protected String style;
+
+	public StyledBlock(String text, String style) {
+		super(text);
+		this.style = style;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Block#toString()
+	 */
+	@Override
+	public String toString() {
+		if (StyledBlock.HIDDEN_STYLE.equalsIgnoreCase(style)) {
+			return "";
+		}
+		if (StyledBlock.NO_STYLE.equalsIgnoreCase(style)) {
+			return getText();
+		}
+		return String.format("<%s>%s</%s>", getStyle(), getText(), getStyle());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Block#getText()
+	 */
+	@Override
+	public String getText() {
+		if (StyledBlock.HIDDEN_STYLE.equalsIgnoreCase(style)) {
+			return "";
+		}
+
+		return super.getText();
+	}
+
+	/**
+	 * @return the style name
+	 */
+	public String getStyle() {
+		return style;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Block#isStyled()
+	 */
+	@Override
+	public boolean isStyled() {
+		return style != null && !StyledBlock.NO_STYLE.equalsIgnoreCase(style)
+		        && !StyledBlock.HIDDEN_STYLE.equalsIgnoreCase(style);
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/Version.java b/src/main/java/net/sf/xslthl/Version.java
new file mode 100644
index 0000000..cd7c7d5
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/Version.java
@@ -0,0 +1,75 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Version information for xslthl
+ */
+public class Version {
+	/**
+	 * @return the version string
+	 */
+	public static String getVersion() {
+		return VersionInternal.versionString;
+	}
+
+	/**
+	 * Internal class responsible for loading
+	 */
+	private static class VersionInternal {
+		private static Logger LOG = Logger.getLogger("net.sf.xslthl");
+
+		private static String versionString = "undefined";
+
+		static {
+			Properties prop = new Properties();
+			InputStream is = VersionInternal.class
+			        .getResourceAsStream("META-INF/maven/net.sf.xslthl/xslthl/pom.properties");
+			if (is != null) {
+				try {
+					prop.load(is);
+					versionString = prop.getProperty("version", versionString);
+
+				} catch (Exception e) {
+					LOG.log(Level.WARNING,
+					        "Unable to get version information. "
+					                + e.getMessage(), e);
+				} finally {
+					try {
+						is.close();
+					} catch (IOException e) {
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/WholeHighlighter.java b/src/main/java/net/sf/xslthl/WholeHighlighter.java
new file mode 100644
index 0000000..468ad58
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/WholeHighlighter.java
@@ -0,0 +1,75 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+/**
+ * 
+ */
+public abstract class WholeHighlighter extends Highlighter {
+	private Collection<String> styles = new HashSet<String>();
+	private boolean emptyStyle = true;
+	private boolean allStyles = false;
+
+	void loadStyles(Params params) {
+		if (!params.isSet("empty")) {
+			emptyStyle = false;
+		}
+		if (params.isSet("all")) {
+			allStyles = true;
+			return;
+		}
+		params.getMutliParams("style", styles);
+	}
+
+	boolean appliesOnEmptyStyle() {
+		return emptyStyle;
+	}
+
+	boolean appliesOnAllStyles() {
+		return allStyles;
+	}
+
+	boolean appliesOnStyle(String style) {
+		return styles.contains(style);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#init(net.sf.xslthl.Params)
+	 */
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		if (params != null && params.isSet("applyOnStyles")) {
+			loadStyles(params.getParams("applyOnStyles"));
+		}
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/AnnotationHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/AnnotationHighlighter.java
new file mode 100644
index 0000000..41da0ab
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/AnnotationHighlighter.java
@@ -0,0 +1,107 @@
+/**
+ * 
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.List;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.Highlighter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Recognizes annotations. Accepted parameters:
+ * <dl>
+ * <dt>start</dt>
+ * <dd>How the annotation starts. <b>Required.</b></dd>
+ * <dt>end</dt>
+ * <dd>How the annotation ends. Optional.</dd>
+ * <dt>valueStart</dt>
+ * <dd>String used to start the value section of annotations</dd>
+ * <dt>valueEnd</dt>
+ * <dd>String used to end the value section of annotations</dd>
+ * </dl>
+ */
+public class AnnotationHighlighter extends Highlighter {
+
+	protected String start, end, valueStart, valueEnd;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#init(net.sf.xslthl.Params)
+	 */
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		start = params.getParam("start");
+		end = params.getParam("end");
+		valueStart = params.getParam("valueStart");
+		valueEnd = params.getParam("valueEnd");
+		if (start == null || start.length() == 0) {
+			throw new HighlighterConfigurationException(
+			        "Required parameter 'start' is not set.");
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		return "annotation";
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#startsWith(net.sf.xslthl.CharIter)
+	 */
+	@Override
+	public boolean startsWith(CharIter in) {
+		if (in.startsWith(start)) {
+			return Character.isJavaIdentifierStart(in.next(start.length()));
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		in.moveNext(start.length()); // skip start
+		int valueCnt = 0;
+		boolean hadEnd = false;
+		while (!in.finished()) {
+			if (valueStart != null && in.startsWith(valueStart)) {
+				++valueCnt;
+			} else if (valueEnd != null && in.startsWith(valueEnd)) {
+				--valueCnt;
+			} else if (valueCnt == 0) {
+				if (end != null && valueCnt == 0 && in.startsWith(end)) {
+					in.moveNext(end.length());
+					hadEnd = true;
+					break;
+				} else if (end == null && Character.isWhitespace(in.current())) {
+					hadEnd = true;
+					break;
+				}
+			}
+			in.moveNext();
+		}
+		if (!hadEnd) {
+			return false;
+		}
+		out.add(in.markedToStyledBlock(styleName));
+		return true;
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/HTMLHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/HTMLHighlighter.java
new file mode 100644
index 0000000..5e89921
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/HTMLHighlighter.java
@@ -0,0 +1,372 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+import net.sf.xslthl.WholeHighlighter;
+import net.sf.xslthl.highlighters.xml.ElementPrefix;
+import net.sf.xslthl.highlighters.xml.ElementSet;
+import net.sf.xslthl.highlighters.xml.RealElementSet;
+
+/**
+ * XML/SGML highlighter. It has a couple of default styles: tag, attribute,
+ * value, directive. Accepted parameters:
+ * <dl>
+ * <dt>elementSet</dt>
+ * <dd>Specialized highlighting for set elements</dd>
+ * <dt>elementPrefix</dt>
+ * <dd>Specialized highlighting for element prefixes</dd>
+ * <dt>styleElement</dt>
+ * <dd>The style to use for elements, defaults to 'tag'</dd>
+ * <dt>styleAttributes</dt>
+ * <dd>The style to use for attributes, defaults to 'attribute'</dd>
+ * <dt>styleValue</dt>
+ * <dd>The style to use for attribute values, defaults to 'value'</dd>
+ * <dt>stylePi</dt>
+ * <dd>The style to use for processing instructions, defaults to 'directive'</dd>
+ * <dt>styleComment</dt>
+ * <dd>The style to use for comments, defaults to 'comment'</dd>
+ * <dt>styleDoctype</dt>
+ * <dd>The style to use for the doctype declaration, defaults to 'doccomment'</dd>
+ * </dl>
+ */
+public class HTMLHighlighter extends WholeHighlighter {
+
+	final static Character APOSTROPHE = '\'';
+	final static Character EQUALS = '=';
+	final static Character EXCLAMATION_MARK = '!';
+	final static Character GREATER_THAN = '>';
+	final static Character HYPHEN = '-';
+	final static Character LESS_THAN = '<';
+	final static Character QUESTION_MARK = '?';
+	final static Character QUOTE = '"';
+	final static Character SLASH = '/';
+
+	/**
+	 * Overriden styles
+	 */
+	protected Collection<ElementSet> elementSets = new HashSet<ElementSet>();
+
+	/**
+	 * Style to use for elements
+	 */
+	protected String styleElement = "tag";
+
+	/**
+	 * The style for attributes
+	 */
+	protected String styleAttribute = "attribute";
+
+	/**
+	 * The style for attribute values
+	 */
+	protected String styleValue = "value";
+
+	/**
+	 * The style for processing instructions
+	 */
+	protected String stylePi = "directive";
+
+	/**
+	 * The style for comments
+	 */
+	protected String styleComment = "comment";
+
+	/**
+	 * Style to use for the doctype part
+	 */
+	protected String styleDoctype = "doctype";
+
+	/**
+	 * @param tagName
+	 * @return
+	 */
+	protected String getStyleForTagName(String tagName) {
+		for (ElementSet es : elementSets) {
+			if (es.matches(tagName)) {
+				return es.getStyle();
+			}
+		}
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.WholeHighlighter#init(net.sf.xslthl.Params)
+	 */
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		if (params != null) {
+
+			styleAttribute = params.getParam("styleAttribute", styleAttribute);
+			styleComment = params.getParam("styleComment", styleComment);
+			styleDoctype = params.getParam("styleDoctype", styleDoctype);
+			styleElement = params.getParam("styleElement", styleElement);
+			stylePi = params.getParam("stylePi", stylePi);
+			styleValue = params.getParam("styleValue", styleValue);
+
+			params.getMultiParams("elementSet", elementSets,
+			        new Params.ParamsLoader<RealElementSet>() {
+				        public RealElementSet load(Params params)
+				                throws HighlighterConfigurationException {
+					        return new RealElementSet(params);
+				        }
+			        });
+			params.getMultiParams("elementPrefix", elementSets,
+			        new Params.ParamsLoader<ElementPrefix>() {
+				        public ElementPrefix load(Params params)
+				                throws HighlighterConfigurationException {
+					        return new ElementPrefix(params);
+				        }
+			        });
+		}
+	}
+
+	/**
+	 * @param in
+	 * @param out
+	 */
+	void readTagContent(CharIter in, List<Block> out) {
+		while (!in.finished()
+		        && !HTMLHighlighter.GREATER_THAN.equals(in.current())
+		        && !HTMLHighlighter.SLASH.equals(in.current())) {
+			if (!Character.isWhitespace(in.current())) {
+				if (in.isMarked()) {
+					out.add(in.markedToBlock());
+				}
+				while (!in.finished()
+				        && !HTMLHighlighter.EQUALS.equals(in.current())
+				        && !Character.isWhitespace(in.current())) {
+					in.moveNext();
+				}
+				out.add(in.markedToStyledBlock(styleAttribute));
+				while (!in.finished() && Character.isWhitespace(in.current())) {
+					in.moveNext();
+				}
+				if (in.finished()
+				        || !HTMLHighlighter.EQUALS.equals(in.current())) { // HTML
+					// no-value
+					// attributes
+					continue;
+				}
+				in.moveNext(); // skip '='
+				while (!in.finished() && Character.isWhitespace(in.current())) {
+					in.moveNext();
+				}
+				out.add(in.markedToBlock());
+				if (HTMLHighlighter.QUOTE.equals(in.current())
+				        || HTMLHighlighter.APOSTROPHE.equals(in.current())) {
+					Character boundary = in.current();
+					in.moveNext();
+					while (!in.finished() && !boundary.equals(in.current())) {
+						in.moveNext();
+					}
+					if (!in.finished()) {
+						in.moveNext();
+					}
+					out.add(in.markedToStyledBlock(styleValue));
+				} else {
+					while (!in.finished()
+					        && !HTMLHighlighter.GREATER_THAN
+					                .equals(in.current())
+					        //&& !HTMLHighlighter.SLASH.equals(in.current())
+					        && !Character.isWhitespace(in.current())) {
+						in.moveNext();
+					}
+					out.add(in.markedToStyledBlock(styleValue));
+				}
+			} else {
+				in.moveNext();
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		while (!in.finished()) {
+			if (HTMLHighlighter.LESS_THAN.equals(in.current())) {
+				out.add(in.markedToBlock());
+				in.moveNext(); // skip <
+				if (HTMLHighlighter.SLASH.equals(in.current())) {
+					// closing tag -> tag
+					while (!in.finished()
+					        && !HTMLHighlighter.GREATER_THAN
+					                .equals(in.current())) {
+						in.moveNext();
+					}
+					String style = getStyleForTagName(in.getMarked().trim()
+					        .substring(2));
+					// </dfsdf > trims to </dfsdf> and than to <dfsdf>
+					in.moveNext(); // get >
+					if (style != null) {
+						out.add(in.markedToStyledBlock(style));
+					} else {
+						out.add(in.markedToStyledBlock(styleElement));
+					}
+				} else if (HTMLHighlighter.QUESTION_MARK.equals(in.current())) {
+					// processing instruction -> directive
+					while (!in.finished()
+					        && !(HTMLHighlighter.GREATER_THAN.equals(in
+					                .current()) && HTMLHighlighter.QUESTION_MARK
+					                .equals(in.prev()))) {
+						in.moveNext();
+					}
+					in.moveNext();
+					out.add(in.markedToStyledBlock(stylePi));
+				} else if (HTMLHighlighter.EXCLAMATION_MARK.equals(in.current())
+				        && HTMLHighlighter.HYPHEN.equals(in.next())
+				        && HTMLHighlighter.HYPHEN.equals(in.next(2))) {
+					// comment
+					while (!in.finished()
+					        && !(HTMLHighlighter.GREATER_THAN.equals(in
+					                .current())
+					                && HTMLHighlighter.HYPHEN.equals(in.prev()) && HTMLHighlighter.HYPHEN
+					                .equals(in.prev(2)))) {
+						in.moveNext();
+					}
+					in.moveNext();
+					out.add(in.markedToStyledBlock(styleComment));
+				} else if (HTMLHighlighter.EXCLAMATION_MARK.equals(in.current())
+				        && in.startsWith("[CDATA[", 1)) {
+					// CDATA section
+					in.moveNext(8);
+					out.add(in.markedToStyledBlock(styleElement));
+					int idx = in.indexOf("]]>");
+					if (idx == -1) {
+						in.moveToEnd();
+					} else {
+						in.moveNext(idx);
+					}
+					out.add(in.markedToBlock());
+					if (idx != -1) {
+						in.moveNext(3);
+						out.add(in.markedToStyledBlock(styleElement));
+					}
+				} else if (HTMLHighlighter.EXCLAMATION_MARK.equals(in.current())
+				        && in.startsWith("DOCTYPE", 1)) {
+					// doctype... just ignore most of it
+					int cnt = 1;
+					while (!in.finished() && cnt > 0) {
+						if (in.current().equals(GREATER_THAN)) {
+							--cnt;
+						} else if (in.current().equals(LESS_THAN)) {
+							++cnt;
+						}
+						in.moveNext();
+					}
+					out.add(in.markedToStyledBlock(styleDoctype));
+				} else {
+					// normal tag
+					while (!in.finished()
+					        && !HTMLHighlighter.GREATER_THAN
+					                .equals(in.current())
+					        && !HTMLHighlighter.SLASH.equals(in.current())
+					        && !Character.isWhitespace(in.current())) {
+						in.moveNext();
+					}
+					String style = getStyleForTagName(in.getMarked().trim()
+					        .substring(1));
+
+					// find short tag
+					boolean shortTag = false;
+					int cnt = 0;
+					while (!in.finished()
+					        && !HTMLHighlighter.GREATER_THAN
+					                .equals(in.current())
+					        && !HTMLHighlighter.SLASH.equals(in.current())
+					        && Character.isWhitespace(in.current())) {
+						in.moveNext();
+						++cnt;
+					}
+					if (HTMLHighlighter.SLASH.equals(in.current())) {
+						in.moveNext();
+						++cnt;
+					}
+					if (HTMLHighlighter.GREATER_THAN.equals(in.current())) {
+						in.moveNext();
+						shortTag = true;
+					} else {
+						in.moveNext(-cnt);
+					}
+
+					if (style != null) {
+						out.add(in.markedToStyledBlock(style));
+					} else {
+						out.add(in.markedToStyledBlock(styleElement));
+					}
+					if (!shortTag && !in.finished()
+					        && Character.isWhitespace(in.current())) {
+						readTagContent(in, out);
+
+						if (!in.finished()) {
+							if (HTMLHighlighter.SLASH.equals(in.current())) {
+								in.moveNext();
+							}
+							in.moveNext();
+							if (style != null) {
+								out.add(in.markedToStyledBlock(style));
+							} else {
+								out.add(in.markedToStyledBlock(styleElement));
+							}
+						}
+					}
+				}
+			} else {
+				in.moveNext();
+			}
+		}
+		if (in.isMarked()) {
+			out.add(in.markedToBlock());
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		// not really used, just here to prevent an error to pop up
+		return "xml";
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/HeredocHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/HeredocHighlighter.java
new file mode 100644
index 0000000..529e715
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/HeredocHighlighter.java
@@ -0,0 +1,172 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.Highlighter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Accepts heredoc constructions. Accepted parameters:
+ * <dl>
+ * <dt>start</dt>
+ * <dd>How the heredoc construction starts. <b>Required.</b></dd>
+ * <dt>quote</dt>
+ * <dd>Allowed quote characters to be used in the identifier name. This
+ * parameter can be used more than once.</dd>
+ * <dt>noWhiteSpace</dt>
+ * <dd>whitespace after start is not allowed.</dd>
+ * <dt>looseTerminator</dt>
+ * <dd>if set the identifier does not have to start on a new line</dd>
+ * <dt>flag</dt>
+ * <dd>Flags that can be put after the 'start'. This parameter can be used more
+ * than once.</dd>
+ * </dl>
+ * See http://en.wikipedia.org/wiki/Heredoc
+ */
+public class HeredocHighlighter extends Highlighter {
+
+	/**
+	 * The token that initiates a heredoc construction
+	 */
+	protected String start;
+
+	/**
+	 * quote characters that can be used in the heredoc identifier
+	 */
+	protected Set<String> quoteChar;
+
+	protected boolean noWhiteSpace;
+
+	protected boolean looseTerminator;
+
+	protected boolean indentFlag;
+
+	protected Set<String> flags;
+
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		start = params.getParam("start");
+		if (start == null || start.length() == 0) {
+			throw new HighlighterConfigurationException(
+			        "Required parameter 'start' is not set.");
+		}
+		quoteChar = new HashSet<String>();
+		params.getMutliParams("quote", quoteChar);
+		noWhiteSpace = params.isSet("noWhiteSpace");
+		looseTerminator = params.isSet("looseTerminator");
+		flags = new HashSet<String>();
+		params.getMutliParams("flag", flags);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#startsWith(net.sf.xslthl.CharIter)
+	 */
+	@Override
+	public boolean startsWith(CharIter in) {
+		if (in.startsWith(start)) {
+			if (noWhiteSpace) {
+				return !Character.isWhitespace(in.next(start.length() + 1));
+			}
+			return true;
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		in.moveNext(start.length()); // skip start
+		// skip flags
+		while (flags.contains(in.current().toString())) {
+			in.moveNext();
+		}
+		// skip whitespace
+		if (!noWhiteSpace) {
+			while (!in.finished() && Character.isWhitespace(in.current())) {
+				in.moveNext();
+			}
+		}
+		StringBuilder heredocId = new StringBuilder();
+		Character quoted = '\0';
+		// identifier might me quoted
+		if (quoteChar.contains(in.current().toString())) {
+			quoted = in.current();
+			in.moveNext();
+		}
+		while (!in.finished()
+		        && (Character.isLetterOrDigit(in.current()) || in.current() == '_')
+		        && !quoted.equals(in.current())) {
+			heredocId.append(in.current());
+			in.moveNext();
+		}
+		if (quoted.equals(in.current())) {
+			in.moveNext();
+		}
+		if (heredocId.length() == 0) {
+			return false;
+		}
+		int i;
+		do {
+			i = in.indexOf(heredocId.toString());
+			if (i < 0) {
+				in.moveToEnd();
+			} else {
+				in.moveNext(i + heredocId.length());
+			}
+			if (looseTerminator || isNewLine(in.prev(heredocId.length() + 1))) {
+				break;
+			}
+		} while (i != -1);
+		out.add(in.markedToStyledBlock(styleName));
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		return "string";
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/HexaDecimalHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/HexaDecimalHighlighter.java
new file mode 100644
index 0000000..bf2e455
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/HexaDecimalHighlighter.java
@@ -0,0 +1,20 @@
+/**
+ * 
+ */
+package net.sf.xslthl.highlighters;
+
+/**
+ * Number highlighter for hexadecimal numbers
+ */
+public class HexaDecimalHighlighter extends NumberHighlighter {
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.highlighters.NumberHighlighter#isDigit(char)
+	 */
+	@Override
+	protected boolean isDigit(char ch) {
+		return (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')
+		        || super.isDigit(ch);
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/KeywordsHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/KeywordsHighlighter.java
new file mode 100644
index 0000000..d082b34
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/KeywordsHighlighter.java
@@ -0,0 +1,172 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.TreeSet;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.Highlighter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Scans for registered keywords Accepted parameters:
+ * <dl>
+ * <dt>keywords</dt>
+ * <dd>Keywords this highlighter recognizes. Can be used multiple times</dd>
+ * <dt>ignoreCase</dt>
+ * <dd>If this element is present the keywords are case insensitive.</dd>
+ * </dl>
+ */
+public class KeywordsHighlighter extends Highlighter {
+	/**
+	 * the keywords this highligher accepts
+	 */
+	protected Collection<String> keywords;
+
+	/**
+	 * Ignore case of the keywords.
+	 */
+	protected boolean ignoreCase = false;
+
+	/**
+	 * Optional extra character sequence that defines the start of an identifier
+	 */
+	protected String startChars;
+
+	/**
+	 * Optional extra character sequence that defines the part of an identifier
+	 */
+	protected String partChars;
+
+	/**
+	 * If true, then startChars and partChars are the only characters accepted
+	 * for the identifiers
+	 */
+	protected boolean exclusiveChars;
+
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		ignoreCase = params.isSet("ignoreCase");
+		exclusiveChars = params.isSet("exclusiveChars");
+		if (ignoreCase) {
+			keywords = new TreeSet<String>(new IgnoreCaseComparator());
+		} else {
+			keywords = new TreeSet<String>();
+		}
+		params.getMutliParams("keyword", keywords);
+
+		startChars = params.getParam("beginChars");
+		partChars = params.getParam("partChars");
+	}
+
+	protected void appendUnique(StringBuilder buf, char ch) {
+		for (int i = 0; i < buf.length(); ++i) {
+			if (buf.charAt(i) == ch) {
+				return;
+			}
+		}
+		buf.append(ch);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#startsWith(net.sf.xslthl.CharIter)
+	 */
+	@Override
+	public boolean startsWith(CharIter in) {
+		if (isIdentifierStart(in.current())
+		        && (in.prev() == null || !isIdentifierPart(in.prev()))) {
+			return true;
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		while (!in.finished() && isIdentifierPart(in.current())) {
+			in.moveNext();
+		}
+		if (keywords.contains(in.getMarked())) {
+			out.add(in.markedToStyledBlock(styleName));
+			return true;
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		return "keyword";
+	}
+
+	/**
+	 * @param ch
+	 * @return True if this character is a valid start of an identifier
+	 */
+	protected boolean isIdentifierStart(char ch) {
+		if (startChars != null) {
+			if (startChars.indexOf(ch) != -1) {
+				return true;
+			}
+			if (exclusiveChars) {
+				return false;
+			}
+		}
+		return Character.isJavaIdentifierStart(ch);
+	}
+
+	/**
+	 * @param ch
+	 * @return True if this character is a valid part of an identifier
+	 */
+	protected boolean isIdentifierPart(char ch) {
+		if (partChars != null) {
+			if (partChars.indexOf(ch) != -1) {
+				return true;
+			}
+			if (exclusiveChars) {
+				return false;
+			}
+		}
+		return Character.isJavaIdentifierPart(ch);
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/MultilineCommentHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/MultilineCommentHighlighter.java
new file mode 100644
index 0000000..c8be042
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/MultilineCommentHighlighter.java
@@ -0,0 +1,109 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.List;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.Highlighter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Performs highlighting for multi-line comments Accepted parameters:
+ * <dl>
+ * <dt>start</dt>
+ * <dd>How the multiline comment starts. <b>Required.</b></dd>
+ * <dt>end</dt>
+ * <dd>How the multiline comment ends. <b>Required.</b></dd>
+ * </dl>
+ */
+public class MultilineCommentHighlighter extends Highlighter {
+
+	/**
+	 * The start and end token
+	 */
+	protected String start, end;
+
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		start = params.getParam("start");
+		end = params.getParam("end");
+		if (start == null || start.length() == 0) {
+			throw new HighlighterConfigurationException(
+			        "Required parameter 'start' is not set.");
+		}
+		if (end == null || end.length() == 0) {
+			throw new HighlighterConfigurationException(
+			        "Required parameter 'end' is not set.");
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#startsWith(net.sf.xslthl.CharIter)
+	 */
+	@Override
+	public boolean startsWith(CharIter in) {
+		if (in.startsWith(start)) {
+			return true;
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		in.moveNext(start.length()); // skip start
+		int endIndex = in.indexOf(end);
+		if (endIndex == -1) {
+			in.moveToEnd();
+		} else {
+			in.moveNext(endIndex + end.length());
+		}
+		out.add(in.markedToStyledBlock(styleName));
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		return "comment";
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/NestedMultilineCommentHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/NestedMultilineCommentHighlighter.java
new file mode 100644
index 0000000..f9ced87
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/NestedMultilineCommentHighlighter.java
@@ -0,0 +1,78 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.List;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Just like the multiline comment highlighter, but accepts nesting of comments.
+ */
+public class NestedMultilineCommentHighlighter extends
+        MultilineCommentHighlighter {
+
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * net.sf.xslthl.MultilineCommentHighlighter#highlight(net.sf.xslthl.CharIter
+	 * , java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		in.moveNext(start.length()); // skip start
+
+		int depth = 1;
+		while (!in.finished()) {
+			if (in.startsWith(end)) {
+				in.moveNext(end.length());
+				if (depth == 1) {
+					break;
+				} else {
+					depth--;
+				}
+			} else if (in.startsWith(start)) {
+				depth++;
+				in.moveNext(start.length());
+			} else {
+				in.moveNext();
+			}
+		}
+
+		out.add(in.markedToStyledBlock(styleName));
+		return true;
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/NumberHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/NumberHighlighter.java
new file mode 100644
index 0000000..e1be8d7
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/NumberHighlighter.java
@@ -0,0 +1,210 @@
+/**
+ * 
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.Highlighter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Recognizes numbers. Accepted parameters:
+ * <dl>
+ * <dt>point</dt>
+ * <dd>character used for the decimal point. If not declared no decimal points
+ * are accepted.</dd>
+ * <dt>thousands</dt>
+ * <dd>thousand separator</dd>
+ * <dt>exponent</dt>
+ * <dd>the string used for recognizing the exponent part of a floating point</dd>
+ * <dt>pointStarts</dt>
+ * <dd>a switch, when set the value defined as point can also be used to start a
+ * number. For example ".1234" would also be accepted as a number.</dd>
+ * <dt>prefix</dt>
+ * <dd>required start of a number, can be useful in the hexnumber highlighter to
+ * define how a hexadecimal number is started</dd>
+ * <dt>suffix</dt>
+ * <dd>an optional string that can be found after a number, can be define
+ * multiple times. This is often used to set the "size" of a integer or floating
+ * point.</dd>
+ * <dt>ignoreCase</dt>
+ * <dd>all strings parameters are case insensitive</dd>
+ * <dt>letterNoFollow</dt>
+ * <dd>If set, numbers may not contain a letter at the end. For example:
+ * <code>123kg</code> will not be seen as a number. This was the default before
+ * version 2.1</dd>
+ * </dl>
+ */
+public class NumberHighlighter extends Highlighter {
+
+	/**
+	 * The decimal point
+	 */
+	protected String decimalPoint;
+
+	/**
+	 * Thousand seperator
+	 */
+	protected String thousandSep;
+
+	/**
+	 * The character to use to start the exponent
+	 */
+	protected String exponent;
+
+	/**
+	 * Opional suffixes
+	 */
+	protected List<String> suffix;
+
+	/**
+	 * Required prefix
+	 */
+	protected String prefix;
+
+	/**
+	 * Ignore case when looking for exponent and flags
+	 */
+	protected boolean ignoreCase;
+
+	/**
+	 * If true a number can start with the decimal point
+	 */
+	protected boolean pointStarts;
+
+	protected boolean letterNoFollow;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#init(net.sf.xslthl.Params)
+	 */
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		decimalPoint = params.getParam("point");
+		thousandSep = params.getParam("thousands");
+		exponent = params.getParam("exponent");
+		pointStarts = decimalPoint != null && params.isSet("pointStarts");
+		ignoreCase = params.isSet("ignoreCase");
+		suffix = new ArrayList<String>();
+		params.getMutliParams("suffix", suffix);
+		prefix = params.getParam("prefix");
+		letterNoFollow = params.isSet("cleanEnd");
+	}
+
+	/**
+	 * Return true if it is an ascii digit
+	 * 
+	 * @param ch
+	 * @return
+	 */
+	protected boolean isDigit(char ch) {
+		return ch >= '0' && ch <= '9';
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		return "number";
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#startsWith(net.sf.xslthl.CharIter)
+	 */
+	@Override
+	public boolean startsWith(CharIter in) {
+		if (in.getPosition() > 0 && (prefix == null)
+		        && (Character.isLetter(in.prev()) || isDigit(in.prev()))) {
+			// If the previous character was a number, then this cannot be the
+			// start of a number. fixes bug #2986341
+			return false;
+		}
+		if (prefix != null) {
+			return in.startsWith(prefix, ignoreCase)
+			        && isDigit(in.next(prefix.length()));
+		}
+		if (pointStarts) {
+			if (in.startsWith(decimalPoint, ignoreCase)) {
+				Character next = in.next(decimalPoint.length());
+				if (next != null) {
+					if (isDigit(next)) {
+						return true;
+					}
+				}
+			}
+		}
+		return isDigit(in.current());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		boolean hadPoint = false;
+		boolean hadExponent = false;
+		if (prefix != null && in.startsWith(prefix, ignoreCase)) {
+			in.moveNext(prefix.length());
+		}
+		if (pointStarts && in.startsWith(decimalPoint, ignoreCase)) {
+			in.moveNext(decimalPoint.length());
+			hadPoint = true;
+		}
+		while (!in.finished()) {
+			if (!hadPoint) {
+				if (decimalPoint != null
+				        && in.startsWith(decimalPoint, ignoreCase)) {
+					hadPoint = true;
+					in.moveNext(decimalPoint.length());
+					continue;
+				} else if (thousandSep != null
+				        && in.startsWith(thousandSep, ignoreCase)) {
+					in.moveNext(thousandSep.length());
+					continue;
+				}
+			}
+			if (!hadExponent) {
+				if (exponent != null && in.startsWith(exponent, ignoreCase)) {
+					hadPoint = true;
+					hadExponent = true;
+					in.moveNext(exponent.length());
+					if (in.current().equals('-') || in.current().equals('+')) {
+						in.moveNext();
+					}
+					continue;
+				}
+			}
+			if (!isDigit(in.current())) {
+				break;
+			}
+			in.moveNext();
+		}
+		for (String suf : suffix) {
+			if (in.startsWith(suf, ignoreCase)) {
+				in.moveNext(suf.length());
+				break;
+			}
+		}
+		if (letterNoFollow
+		        && (!in.finished() && Character.isLetter(in.current()))) {
+			return false;
+		}
+		out.add(in.markedToStyledBlock(styleName));
+		return true;
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/OnelineCommentHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/OnelineCommentHighlighter.java
new file mode 100644
index 0000000..bec2bdd
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/OnelineCommentHighlighter.java
@@ -0,0 +1,147 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.List;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.Highlighter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Single line comments. Accepted parameters:
+ * <dl>
+ * <dt>start</dt>
+ * <dd>How the single line comment starts <b>Required.</b></dd>
+ * <dt>lineBreakEscape</dt>
+ * <dd>string that can be used to break the line and continue on the next line</dd>
+ * <dt>solitary</dt>
+ * <dd>a switch, if set the comment must not be preceded by non whitespace on
+ * the line</dd>
+ * </dl>
+ */
+public class OnelineCommentHighlighter extends Highlighter {
+
+	/**
+	 * The start of the comment highlighter
+	 */
+	protected String start;
+
+	/**
+	 * String used to escape a newline
+	 */
+	protected String lineBreakEscape;
+
+	protected boolean solitary;
+
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		if (params.isSet("start")) {
+			start = params.getParam("start");
+			lineBreakEscape = params.getParam("lineBreakEscape");
+		} else {
+			// legacy format
+			start = params.getParam();
+		}
+		if (start == null || start.length() == 0) {
+			throw new HighlighterConfigurationException(
+			        "Required parameter 'start' is not set.");
+		}
+		solitary = params.isSet("solitary");
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#startsWith(net.sf.xslthl.CharIter)
+	 */
+	@Override
+	public boolean startsWith(CharIter in) {
+		if (in.startsWith(start)) {
+			if (solitary) {
+				int i = 1;
+				while (i < in.getPosition()
+				        && Character.isWhitespace(in.prev(i))) {
+					if (isNewLine(in.prev(i))) {
+						return true;
+					}
+					++i;
+				}
+				return false;
+			}
+			return true;
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		in.moveNext(start.length()); // skip start
+		int endIndex;
+		do {
+			endIndex = in.indexOf("\n");
+			int cnt = 1;
+			if (endIndex == -1) {
+				in.moveToEnd();
+			} else {
+				in.moveNext(endIndex);
+				if (in.prev().equals('\r')) {
+					in.moveNext(-1);
+					++cnt;
+				}
+			}
+			if (lineBreakEscape == null || lineBreakEscape.length() == 0) {
+				break;
+			}
+			if (!in.startsWith(lineBreakEscape, -1 * lineBreakEscape.length())) {
+				break;
+			}
+			in.moveNext(cnt);
+		} while (endIndex != -1);
+		out.add(in.markedToStyledBlock(styleName));
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		return "comment";
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/RegexHighlighterEx.java b/src/main/java/net/sf/xslthl/highlighters/RegexHighlighterEx.java
new file mode 100644
index 0000000..003e40a
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/RegexHighlighterEx.java
@@ -0,0 +1,142 @@
+/**
+ * 
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.Highlighter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Regular expression highlighter. Accepted parameters:
+ * <dl>
+ * <dt>pattern</dt>
+ * <dd>The regular expression pattern to be matched.</dd>
+ * <dt>flags</dt>
+ * <dd>Flags, see javadoc (use the constant names AS IS)</dd>
+ * </dl>
+ */
+public class RegexHighlighterEx extends Highlighter {
+
+	protected Pattern pattern;
+
+	/**
+	 * Matcher used to find locations
+	 */
+	protected Matcher matcher;
+
+	/**
+	 * If true this matcher is done
+	 */
+	protected boolean finished;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#init(net.sf.xslthl.Params)
+	 */
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		int flags = 0;
+		String[] flagString = params.getParam("flags", "").split("[;,]");
+		for (String flag : flagString) {
+			flag = flag.trim();
+			if ("CASE_INSENSITIVE".equalsIgnoreCase(flag)) {
+				flags += Pattern.CASE_INSENSITIVE;
+			} else if ("DOTALL".equalsIgnoreCase(flag)) {
+				flags += Pattern.DOTALL;
+			} else if ("MULTILINE".equalsIgnoreCase(flag)) {
+				flags += Pattern.MULTILINE;
+			} else if ("UNICODE_CASE".equalsIgnoreCase(flag)) {
+				flags += Pattern.UNICODE_CASE;
+			} else if ("LITERAL".equalsIgnoreCase(flag)) {
+				flags += Pattern.LITERAL;
+			} else if ("UNIX_LINES".equalsIgnoreCase(flag)) {
+				flags += Pattern.UNIX_LINES;
+			} else if ("COMMENTS".equalsIgnoreCase(flag)) {
+				flags += Pattern.COMMENTS;
+			} else if ("CANON_EQ".equalsIgnoreCase(flag)) {
+				flags += Pattern.CANON_EQ;
+			}
+		}
+		String pat = params.getParam("pattern");
+		if (params.isSet("pattern")) {
+			try {
+				pattern = Pattern.compile(pat, flags);
+			} catch (PatternSyntaxException e) {
+				throw new HighlighterConfigurationException(e.getMessage(), e);
+			}
+		}
+		if (pattern == null) {
+			throw new HighlighterConfigurationException(
+			        "Required parameter 'pattern' is not set.");
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#reset()
+	 */
+	@Override
+	public void reset() {
+		matcher = null;
+		finished = false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#startsWith(net.sf.xslthl.CharIter)
+	 */
+	@Override
+	public boolean startsWith(CharIter in) {
+		if (matcher == null) {
+			matcher = in.createMatcher(pattern);
+			finished = !matcher.find();
+		}
+		while (!finished && matcher.start() < in.getPosition()) {
+			finished = !matcher.find();
+		}
+		if (!finished) {
+			return matcher.start() == in.getPosition();
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		if (!finished) {
+			in.moveNext(matcher.end() - matcher.start());
+			out.add(in.markedToStyledBlock(styleName));
+			finished = !matcher.find();
+			return true;
+		}
+		return false;
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/StringHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/StringHighlighter.java
new file mode 100644
index 0000000..adc0840
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/StringHighlighter.java
@@ -0,0 +1,145 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.List;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.Highlighter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Recognizes strings. Accepted parameters:
+ * <dl>
+ * <dt>string</dt>
+ * <dd>How the string starts. <b>Required.</b></dd>
+ * <dt>endString</dt>
+ * <dd>How the string ends. If not present the start value is used.</dd>
+ * <dt>escape</dt>
+ * <dd>Character to use to escape characters. Optional.</dd>
+ * <dt>doubleEscapes</dt>
+ * <dd>When present the double usage of start is considered to be an escaped
+ * start (used in Pascal). Optional.</dd>
+ * <dt>spanNewLines</dt>
+ * <dd>When present strings can span newlines, otherwise a newline breaks the
+ * string parsing.</dd>
+ * </dl>
+ */
+public class StringHighlighter extends Highlighter {
+
+	/**
+	 * The start token and the escape token.
+	 */
+	private String start, end, escape;
+	/**
+	 * If set the double occurance of start escapes it.
+	 */
+	private boolean doubleEscapes;
+	/**
+	 * If set newlines are ignored in string parsing.
+	 */
+	private boolean spansNewLines;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#init(net.sf.xslthl.Params)
+	 */
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		start = params.getParam("string");
+		end = params.getParam("endString", start);
+		escape = params.getParam("escape");
+		doubleEscapes = params.isSet("doubleEscapes");
+		spansNewLines = params.isSet("spanNewLines");
+		if (start == null || start.length() == 0) {
+			throw new HighlighterConfigurationException(
+			        "Required parameter 'start' is not set.");
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#startsWith(net.sf.xslthl.CharIter)
+	 */
+	@Override
+	public boolean startsWith(CharIter in) {
+		if (in.startsWith(start)) {
+			return true;
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		in.moveNext(start.length()); // skip start
+		boolean wasEscape = false;
+		while (!in.finished()) {
+			if (!spansNewLines && isNewLine(in.current())) {
+				break;
+			}
+			if (in.startsWith(end) && !wasEscape) {
+				if (doubleEscapes && in.startsWith(end, end.length())) {
+					in.moveNext();
+				} else {
+					in.moveNext(end.length() - 1);
+					break;
+				}
+			} else if (escape != null && in.startsWith(escape) && !wasEscape) {
+				wasEscape = true;
+			} else {
+				wasEscape = false;
+			}
+			in.moveNext();
+		}
+		if (!in.finished()) {
+			in.moveNext();
+		}
+		out.add(in.markedToStyledBlock(styleName));
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		return "string";
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/WordHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/WordHighlighter.java
new file mode 100644
index 0000000..ff59d75
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/WordHighlighter.java
@@ -0,0 +1,96 @@
+/**
+ * 
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.Highlighter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Highlights the list of elements as they are encounterd. No special
+ * processing. This is a slow highlighter. Accepted parameters:
+ * <dl>
+ * <dt>word</dt>
+ * <dd>The word it recognizes, can be used multiple times.</dd>
+ * <dt>ignoreCase</dt>
+ * <dd>the words are recognized case insensitive</dd>
+ * </dl>
+ */
+public class WordHighlighter extends Highlighter {
+
+	/**
+	 * The words to recognize
+	 */
+	protected List<String> words;
+
+	/**
+	 * If true ingore the case
+	 */
+	protected boolean caseInsensitive;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#init(net.sf.xslthl.Params)
+	 */
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		words = new ArrayList<String>();
+		params.getMutliParams("word", words);
+		caseInsensitive = params.isSet("ignoreCase");
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#startsWith(net.sf.xslthl.CharIter)
+	 */
+	@Override
+	public boolean startsWith(CharIter in) {
+		for (String string : words) {
+			if (in.startsWith(string, caseInsensitive)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		// no default style
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		for (String string : words) {
+			if (in.startsWith(string, caseInsensitive)) {
+				in.moveNext(string.length());
+				if (in.finished() || Character.isWhitespace(in.current())) {
+					out.add(in.markedToStyledBlock(styleName));
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/XMLHighlighter.java b/src/main/java/net/sf/xslthl/highlighters/XMLHighlighter.java
new file mode 100644
index 0000000..56c5695
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/XMLHighlighter.java
@@ -0,0 +1,376 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+
+import net.sf.xslthl.Block;
+import net.sf.xslthl.CharIter;
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+import net.sf.xslthl.WholeHighlighter;
+import net.sf.xslthl.highlighters.xml.ElementPrefix;
+import net.sf.xslthl.highlighters.xml.ElementSet;
+import net.sf.xslthl.highlighters.xml.RealElementSet;
+
+/**
+ * XML/SGML highlighter. It has a couple of default styles: tag, attribute,
+ * value, directive. Accepted parameters:
+ * <dl>
+ * <dt>elementSet</dt>
+ * <dd>Specialized highlighting for set elements</dd>
+ * <dt>elementPrefix</dt>
+ * <dd>Specialized highlighting for element prefixes</dd>
+ * <dt>styleElement</dt>
+ * <dd>The style to use for elements, defaults to 'tag'</dd>
+ * <dt>styleAttributes</dt>
+ * <dd>The style to use for attributes, defaults to 'attribute'</dd>
+ * <dt>styleValue</dt>
+ * <dd>The style to use for attribute values, defaults to 'value'</dd>
+ * <dt>stylePi</dt>
+ * <dd>The style to use for processing instructions, defaults to 'directive'</dd>
+ * <dt>styleComment</dt>
+ * <dd>The style to use for comments, defaults to 'comment'</dd>
+ * <dt>styleDoctype</dt>
+ * <dd>The style to use for the doctype declaration, defaults to 'doccomment'</dd>
+ * </dl>
+ */
+public class XMLHighlighter extends WholeHighlighter {
+
+	final static Character APOSTROPHE = '\'';
+	final static Character EQUALS = '=';
+	final static Character EXCLAMATION_MARK = '!';
+	final static Character GREATER_THAN = '>';
+	final static Character HYPHEN = '-';
+	final static Character LESS_THAN = '<';
+	final static Character QUESTION_MARK = '?';
+	final static Character QUOTE = '"';
+	final static Character SLASH = '/';
+
+	/**
+	 * Overriden styles
+	 */
+	protected Collection<ElementSet> elementSets = new HashSet<ElementSet>();
+
+	/**
+	 * Style to use for elements
+	 */
+	protected String styleElement = "tag";
+
+	/**
+	 * The style for attributes
+	 */
+	protected String styleAttribute = "attribute";
+
+	/**
+	 * The style for attribute values
+	 */
+	protected String styleValue = "value";
+
+	/**
+	 * The style for processing instructions
+	 */
+	protected String stylePi = "directive";
+
+	/**
+	 * The style for comments
+	 */
+	protected String styleComment = "comment";
+
+	/**
+	 * Style to use for the doctype part
+	 */
+	protected String styleDoctype = "doctype";
+
+	/**
+	 * @param tagName
+	 * @return
+	 */
+	protected String getStyleForTagName(String tagName) {
+		for (ElementSet es : elementSets) {
+			if (es.matches(tagName)) {
+				return es.getStyle();
+			}
+		}
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.WholeHighlighter#init(net.sf.xslthl.Params)
+	 */
+	@Override
+	public void init(Params params) throws HighlighterConfigurationException {
+		super.init(params);
+		if (params != null) {
+
+			styleAttribute = params.getParam("styleAttribute", styleAttribute);
+			styleComment = params.getParam("styleComment", styleComment);
+			styleDoctype = params.getParam("styleDoctype", styleDoctype);
+			styleElement = params.getParam("styleElement", styleElement);
+			stylePi = params.getParam("stylePi", stylePi);
+			styleValue = params.getParam("styleValue", styleValue);
+
+			params.getMultiParams("elementSet", elementSets,
+			        new Params.ParamsLoader<RealElementSet>() {
+				        public RealElementSet load(Params params)
+				                throws HighlighterConfigurationException {
+					        return new RealElementSet(params);
+				        }
+			        });
+			params.getMultiParams("elementPrefix", elementSets,
+			        new Params.ParamsLoader<ElementPrefix>() {
+				        public ElementPrefix load(Params params)
+				                throws HighlighterConfigurationException {
+					        return new ElementPrefix(params);
+				        }
+			        });
+		}
+	}
+
+	/**
+	 * @param in
+	 * @param out
+	 */
+	void readTagContent(CharIter in, List<Block> out) {
+		while (!in.finished()
+		        && !XMLHighlighter.GREATER_THAN.equals(in.current())
+		        && !XMLHighlighter.SLASH.equals(in.current())) {
+			if (!Character.isWhitespace(in.current())) {
+				if (in.isMarked()) {
+					out.add(in.markedToBlock());
+				}
+				while (!in.finished()
+				        && !XMLHighlighter.EQUALS.equals(in.current())
+				        && !Character.isWhitespace(in.current())) {
+					in.moveNext();
+				}
+				out.add(in.markedToStyledBlock(styleAttribute));
+				while (!in.finished() && Character.isWhitespace(in.current())) {
+					in.moveNext();
+				}
+				if (in.finished()
+				        || !XMLHighlighter.EQUALS.equals(in.current())) { // HTML
+					// no-value
+					// attributes
+					continue;
+				}
+				in.moveNext(); // skip '='
+				while (!in.finished() && Character.isWhitespace(in.current())) {
+					in.moveNext();
+				}
+				out.add(in.markedToBlock());
+				if (XMLHighlighter.QUOTE.equals(in.current())
+				        || XMLHighlighter.APOSTROPHE.equals(in.current())) {
+					Character boundary = in.current();
+					in.moveNext();
+					while (!in.finished() && !boundary.equals(in.current())) {
+						in.moveNext();
+					}
+					if (!in.finished()) {
+						in.moveNext();
+					}
+					out.add(in.markedToStyledBlock(styleValue));
+				} else {
+					while (!in.finished()
+					        && !XMLHighlighter.GREATER_THAN
+					                .equals(in.current())
+					        && !XMLHighlighter.SLASH.equals(in.current())
+					        && !Character.isWhitespace(in.current())) {
+						in.moveNext();
+					}
+					out.add(in.markedToStyledBlock(styleValue));
+				}
+			} else {
+				in.moveNext();
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#highlight(net.sf.xslthl.CharIter,
+	 * java.util.List)
+	 */
+	@Override
+	public boolean highlight(CharIter in, List<Block> out) {
+		while (!in.finished()) {
+			if (XMLHighlighter.LESS_THAN.equals(in.current())) {
+				out.add(in.markedToBlock());
+				in.moveNext(); // skip <
+				if (XMLHighlighter.SLASH.equals(in.current())) {
+					// closing tag -> tag
+					while (!in.finished()
+					        && !XMLHighlighter.GREATER_THAN
+					                .equals(in.current())) {
+						in.moveNext();
+					}
+					String style = getStyleForTagName(in.getMarked().trim()
+					        .substring(2));
+					// </dfsdf > trims to </dfsdf> and than to <dfsdf>
+					in.moveNext(); // get >
+					if (style != null) {
+						out.add(in.markedToStyledBlock(style));
+					} else {
+						out.add(in.markedToStyledBlock(styleElement));
+					}
+				} else if (XMLHighlighter.QUESTION_MARK.equals(in.current())) {
+					// processing instruction -> directive
+					while (!in.finished()
+					        && !(XMLHighlighter.GREATER_THAN.equals(in
+					                .current()) && XMLHighlighter.QUESTION_MARK
+					                .equals(in.prev()))) {
+						in.moveNext();
+					}
+					in.moveNext();
+					out.add(in.markedToStyledBlock(stylePi));
+				} else if (XMLHighlighter.EXCLAMATION_MARK.equals(in.current())
+				        && XMLHighlighter.HYPHEN.equals(in.next())
+				        && XMLHighlighter.HYPHEN.equals(in.next(2))) {
+					// comment
+					while (!in.finished()
+					        && !(XMLHighlighter.GREATER_THAN.equals(in
+					                .current())
+					                && XMLHighlighter.HYPHEN.equals(in.prev()) && XMLHighlighter.HYPHEN
+					                    .equals(in.prev(2)))) {
+						in.moveNext();
+					}
+					in.moveNext();
+					out.add(in.markedToStyledBlock(styleComment));
+				} else if (XMLHighlighter.EXCLAMATION_MARK.equals(in.current())
+				        && in.startsWith("[CDATA[", 1)) {
+					// CDATA section
+					in.moveNext(8);
+					out.add(in.markedToStyledBlock(styleElement));
+					int idx = in.indexOf("]]>");
+					if (idx == -1) {
+						in.moveToEnd();
+					} else {
+						in.moveNext(idx);
+					}
+					out.add(in.markedToBlock());
+					if (idx != -1) {
+						in.moveNext(3);
+						out.add(in.markedToStyledBlock(styleElement));
+					}
+				} else if (XMLHighlighter.EXCLAMATION_MARK.equals(in.current())
+				        && in.startsWith("DOCTYPE", 1)) {
+					// doctype... just ignore most of it
+					int cnt = 1;
+					while (!in.finished() && cnt > 0) {
+						if (in.current().equals(GREATER_THAN)) {
+							--cnt;
+						} else if (in.current().equals(LESS_THAN)) {
+							++cnt;
+						}
+						in.moveNext();
+					}
+					out.add(in.markedToStyledBlock(styleDoctype));
+				} else {
+					// normal tag
+					while (!in.finished()
+					        && !XMLHighlighter.GREATER_THAN
+					                .equals(in.current())
+					        && !XMLHighlighter.SLASH.equals(in.current())
+					        && !Character.isWhitespace(in.current())) {
+						in.moveNext();
+					}
+					String style = getStyleForTagName(in.getMarked().trim()
+					        .substring(1));
+
+					// find short tag
+					boolean shortTag = false;
+					int cnt = 0;
+					while (!in.finished()
+					        && !XMLHighlighter.GREATER_THAN
+					                .equals(in.current())
+					        && !XMLHighlighter.SLASH.equals(in.current())
+					        && Character.isWhitespace(in.current())) {
+						in.moveNext();
+
+						++cnt;
+					}
+
+					if (!in.finished()) {
+						if (XMLHighlighter.SLASH.equals(in.current())) {
+							in.moveNext();
+							++cnt;
+						}
+						if (XMLHighlighter.GREATER_THAN.equals(in.current())) {
+							in.moveNext();
+							shortTag = true;
+						} else {
+							in.moveNext(-cnt);
+						}
+					}
+
+					if (style != null) {
+						out.add(in.markedToStyledBlock(style));
+					} else {
+						out.add(in.markedToStyledBlock(styleElement));
+					}
+					if (!shortTag && !in.finished()
+					        && Character.isWhitespace(in.current())) {
+						readTagContent(in, out);
+
+						if (!in.finished()) {
+							if (XMLHighlighter.SLASH.equals(in.current())) {
+								in.moveNext();
+							}
+							in.moveNext();
+							if (style != null) {
+								out.add(in.markedToStyledBlock(style));
+							} else {
+								out.add(in.markedToStyledBlock(styleElement));
+							}
+						}
+					}
+				}
+			} else {
+				in.moveNext();
+			}
+		}
+		if (in.isMarked()) {
+			out.add(in.markedToBlock());
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.Highlighter#getDefaultStyle()
+	 */
+	@Override
+	public String getDefaultStyle() {
+		// not really used, just here to prevent an error to pop up
+		return "xml";
+	}
+}
diff --git a/src/main/java/net/sf/xslthl/highlighters/xml/ElementPrefix.java b/src/main/java/net/sf/xslthl/highlighters/xml/ElementPrefix.java
new file mode 100644
index 0000000..5d5e2e6
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/xml/ElementPrefix.java
@@ -0,0 +1,66 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters.xml;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Style override based on XML prefix
+ */
+public class ElementPrefix extends ElementSet {
+
+	/**
+	 * The prefixex to highlight
+	 */
+	private Set<String> prefix;
+
+	public ElementPrefix(Params params)
+	        throws HighlighterConfigurationException {
+		super(params);
+		prefix = new HashSet<String>();
+		params.getMutliParams("prefix", prefix);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.highlighters.XMLHighlighter.ElementSet#matches(java
+	 * .lang.String)
+	 */
+	@Override
+	public boolean matches(String tagName) {
+		for (String pf : prefix) {
+			if (tagName.startsWith(pf)) {
+				return true;
+			}
+		}
+		return false;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/net/sf/xslthl/highlighters/xml/ElementSet.java b/src/main/java/net/sf/xslthl/highlighters/xml/ElementSet.java
new file mode 100644
index 0000000..d389b28
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/xml/ElementSet.java
@@ -0,0 +1,56 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters.xml;
+
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+
+/**
+ * Style overrides for various elements
+ */
+public abstract class ElementSet {
+	/**
+	 * The overridden stylename
+	 */
+	protected String style;
+
+	public ElementSet(Params params) throws HighlighterConfigurationException {
+		style = params.getParam("style");
+	}
+
+	/**
+	 * @param tagName
+	 * @return true if it matches an overridden style
+	 */
+	public abstract boolean matches(String tagName);
+
+	/**
+	 * @return the style
+	 */
+	public String getStyle() {
+		return style;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/net/sf/xslthl/highlighters/xml/RealElementSet.java b/src/main/java/net/sf/xslthl/highlighters/xml/RealElementSet.java
new file mode 100644
index 0000000..af09dc5
--- /dev/null
+++ b/src/main/java/net/sf/xslthl/highlighters/xml/RealElementSet.java
@@ -0,0 +1,66 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl.highlighters.xml;
+
+import java.util.Collection;
+import java.util.TreeSet;
+
+import net.sf.xslthl.HighlighterConfigurationException;
+import net.sf.xslthl.Params;
+import net.sf.xslthl.Highlighter.IgnoreCaseComparator;
+
+/**
+ * Override the style for given elements (whole name)
+ */
+public class RealElementSet extends ElementSet {
+	/**
+	 * The tags names
+	 */
+	private Collection<String> tagNames;
+
+	public RealElementSet(Params params)
+	        throws HighlighterConfigurationException {
+		super(params);
+		boolean ignoreCase = params.isSet("ignoreCase");
+		if (ignoreCase) {
+			tagNames = new TreeSet<String>(new IgnoreCaseComparator());
+		} else {
+			tagNames = new TreeSet<String>();
+		}
+		params.getMutliParams("element", tagNames);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see net.sf.xslthl.highlighters.XMLHighlighter.ElementSet#matches(java
+	 * .lang.String)
+	 */
+	@Override
+	public boolean matches(String tagName) {
+		return tagNames.contains(tagName);
+	}
+}
\ No newline at end of file
diff --git a/src/site/apt/index.apt b/src/site/apt/index.apt
new file mode 100644
index 0000000..b176048
--- /dev/null
+++ b/src/site/apt/index.apt
@@ -0,0 +1,29 @@
+  ---
+  XSLT syntax highlighting
+  ---
+  
+XSLT syntax highlighting
+
+  Xslthl is an implementation of syntax highlighting as an extension module for Java based XSLT processors. 
+  So if you have, for example, an article about programming written in {{{http://wiki.docbook.org/topic/DocBook}DocBook}}, 
+  code examples can be automatically syntax highlighted when you use {{{http://docbook.sourceforge.net/}DocBook XSL}} 
+  to transform the DocBook code to HTML, Rtf, etc.
+
+  DocBook XSL ships with {{{http://sagehill.net/docbookxsl/SyntaxHighlighting.html}built in support}} 
+  for syntax highlighting using xslthl. 
+  But xslthl is not limited to be used just with DocBook Xsl, you can use it for anything that used XSLT 
+  and one of the supported XSLT processors. More information about how to use xslthl with your own xslt processing 
+  can be found on the {{{http://xslthl.sourceforge.net/wiki/index.php/Usage}wiki}}, 
+  just like information about how to configure xslthl to 
+  {{{http://xslthl.sourceforge.net/wiki/index.php/Syntax_Highlighters}support new languages}}.
+
+
+* Supported XSLT Processors
+
+  Xslthl supports the following Java based XSLT Processors:
+  
+    * {{{http://xml.apache.org/xalan-j/}Apache Xalan-J}} (2.7 and later)
+    
+    * {{{http://saxon.sourceforge.net/}Saxon for Xslt 1}} (6.5, and 7)
+    
+    * {{{http://saxon.sourceforge.net/}Saxon for Xslt 2}} (8.5 and later)
diff --git a/src/site/site.xml b/src/site/site.xml
new file mode 100644
index 0000000..8e7371e
--- /dev/null
+++ b/src/site/site.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+	<body>
+		<menu name="Overview">
+			<item name="Introduction" href="index.html" />
+			<item name="Documentation" href="http://xslthl.sourceforge.net/wiki/index.php/Main_Page" />
+			<item name="Examples" href="examples" />
+			<item name="Project Page" href="http://sourceforge.net/projects/xslthl/" />
+		</menu>
+		<menu ref="reports" />
+	</body>
+</project>
diff --git a/src/test/java/net/sf/xslthl/BlockTest.java b/src/test/java/net/sf/xslthl/BlockTest.java
new file mode 100644
index 0000000..601d265
--- /dev/null
+++ b/src/test/java/net/sf/xslthl/BlockTest.java
@@ -0,0 +1,106 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * 
+ * @author Michiel Hendriks
+ */
+public class BlockTest {
+
+	static final String BLOCK_CONTENT = "Foo bar quux.";
+	Block block;
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@Before
+	public void setUp() throws Exception {
+		block = new Block(BLOCK_CONTENT);
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@After
+	public void tearDown() throws Exception {
+		block = null;
+	}
+
+	/**
+	 * Test method for {@link net.sf.xslthl.Block#Block(java.lang.String)}.
+	 */
+	@Test
+	public void testBlock() {
+		new Block(null);
+		new Block("");
+		new Block(BLOCK_CONTENT);
+	}
+
+	/**
+	 * Test method for {@link net.sf.xslthl.Block#getText()}.
+	 */
+	@Test
+	public void testGetText() {
+		assertEquals(BLOCK_CONTENT, block.getText());
+	}
+
+	/**
+	 * Test method for {@link net.sf.xslthl.Block#toString()}.
+	 */
+	@Test
+	public void testToString() {
+		assertEquals(BLOCK_CONTENT, block.toString());
+		assertEquals(block.getText(), block.toString());
+	}
+
+	/**
+	 * Test method for {@link net.sf.xslthl.Block#isStyled()}.
+	 */
+	@Test
+	public void testIsStyled() {
+		assertFalse(block.isStyled());
+	}
+
+	/**
+	 * Test method for {@link net.sf.xslthl.Block#isEmpty()}.
+	 */
+	@Test
+	public void testEmpty() {
+		assertFalse(block.isEmpty());
+		Block empty = new Block(null);
+		assertTrue(empty.isEmpty());
+		empty = new Block("");
+		assertTrue(empty.isEmpty());
+	}
+
+}
diff --git a/src/test/java/net/sf/xslthl/StyledBlockTest.java b/src/test/java/net/sf/xslthl/StyledBlockTest.java
new file mode 100644
index 0000000..54540d7
--- /dev/null
+++ b/src/test/java/net/sf/xslthl/StyledBlockTest.java
@@ -0,0 +1,167 @@
+/*
+ * xslthl - XSLT Syntax Highlighting
+ * https://sourceforge.net/projects/xslthl/
+ * Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+ * 
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ * 
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ * 
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ * 
+ * Michal Molhanec <mol1111 at users.sourceforge.net>
+ * Jirka Kosek <kosek at users.sourceforge.net>
+ * Michiel Hendriks <elmuerte at users.sourceforge.net>
+ */
+package net.sf.xslthl;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.xslthl.highlighters.XMLHighlighter;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * 
+ * @author Michiel Hendriks
+ */
+public class StyledBlockTest {
+
+	static final String BLOCK_CONTENT = "Foo bar quux.";
+	static final String STYLE = "FooBarQuux";
+	StyledBlock block;
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@Before
+	public void setUp() throws Exception {
+		block = new StyledBlock(BLOCK_CONTENT, STYLE);
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@After
+	public void tearDown() throws Exception {
+		block = null;
+	}
+
+	/**
+	 * Test method for {@link net.sf.xslthl.StyledBlock#getText()}.
+	 */
+	@Test
+	public void testGetText() {
+		assertEquals(BLOCK_CONTENT, block.getText());
+	}
+
+	/**
+	 * Test method for {@link net.sf.xslthl.StyledBlock#toString()}.
+	 */
+	@Test
+	public void testToString() {
+		assertEquals("<" + STYLE + ">" + BLOCK_CONTENT + "</" + STYLE + ">",
+		        block.toString());
+		block = new StyledBlock(BLOCK_CONTENT, StyledBlock.NO_STYLE);
+		assertEquals(BLOCK_CONTENT, block.toString());
+		block = new StyledBlock(BLOCK_CONTENT, StyledBlock.HIDDEN_STYLE);
+		assertEquals("", block.toString());
+	}
+
+	/**
+	 * Test method for {@link net.sf.xslthl.StyledBlock#isStyled()}.
+	 */
+	@Test
+	public void testIsStyled() {
+		assertTrue(block.isStyled());
+		block = new StyledBlock(BLOCK_CONTENT, StyledBlock.NO_STYLE);
+		assertFalse(block.isStyled());
+		block = new StyledBlock(BLOCK_CONTENT, StyledBlock.HIDDEN_STYLE);
+		assertFalse(block.isStyled());
+		block = new StyledBlock(BLOCK_CONTENT, null);
+		assertFalse(block.isStyled());
+	}
+
+	/**
+	 * Test method for
+	 * {@link net.sf.xslthl.StyledBlock#StyledBlock(java.lang.String, java.lang.String)}
+	 * .
+	 */
+	@Test
+	public void testStyledBlock() {
+		new StyledBlock(null, null);
+		new StyledBlock("foo", null);
+		new StyledBlock(null, "foo");
+	}
+
+	/**
+	 * Test method for {@link net.sf.xslthl.StyledBlock#getStyle()}.
+	 */
+	@Test
+	public void testGetStyle() {
+		assertEquals(STYLE, block.getStyle());
+		block = new StyledBlock(BLOCK_CONTENT, StyledBlock.NO_STYLE);
+		assertEquals(StyledBlock.NO_STYLE, block.getStyle());
+		block = new StyledBlock(BLOCK_CONTENT, StyledBlock.HIDDEN_STYLE);
+		assertEquals(StyledBlock.HIDDEN_STYLE, block.getStyle());
+		block = new StyledBlock(BLOCK_CONTENT, null);
+		assertNull(block.getStyle());
+	}
+
+	/**
+	 * Guard against cases in which the tag is not properly finished.
+	 * 
+	 * @throws Exception
+	 */
+	@Test
+	public void testXMLHighlighter() throws Exception {
+		XMLHighlighter hl = new XMLHighlighter();
+		ArrayList<Block> blocks = new ArrayList<Block>();
+		hl.highlight(new CharIter(
+		        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+		                + "        <!DOCTYPE x:root [\n"
+		                + "            <!ENTITY ent \"entity\">\n"
+		                + "        ]>\n" + "\n" + "        <x:root"), blocks);
+		assertEquals(
+		        "[, <directive><?xml version=\"1.0\" encoding=\"UTF-8\"?></directive>, \n"
+		                + "        , <doctype><!DOCTYPE x:root [\n"
+		                + "            <!ENTITY ent \"entity\">\n"
+		                + "        ]></doctype>, \n" + "\n"
+		                + "        , <tag><x:root</tag>]", blocks.toString());
+	}
+
+	/**
+	 * Guard against cases in which the CSS tokenizer is fed XML content.
+	 * 
+	 * @throws Exception
+	 */
+	@Test
+	public void testCSSHighlighterWithXML() throws Exception {
+		Config c = Config
+		        .getInstance(new File("highlighters/xslthl-config.xml").toURI()
+		                .toString());
+		MainHighlighter hl = c.getMainHighlighter("css");
+		List<Block> blocks = new ArrayList<Block>();
+		blocks = hl.highlight("<p padding-left=\"20\">....");
+		assertEquals(
+		        "[<p , <keyword>padding-left</keyword>, =, <string>\"20\"</string>, >....]",
+		        blocks.toString());
+	}
+
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/xslthl.git



More information about the pkg-java-commits mailing list