[Pkg-javascript-commits] [highlight.js] 01/03: Imported Upstream version 8.2+ds

Cédric Boutillier boutil at moszumanska.debian.org
Mon Sep 15 12:08:34 UTC 2014


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

boutil pushed a commit to branch master
in repository highlight.js.

commit 90a86eac874f676cf382391448008a63f2f8be3b
Author: Cédric Boutillier <boutil at debian.org>
Date:   Sun Aug 24 10:39:15 2014 +0200

    Imported Upstream version 8.2+ds
---
 .gitignore                                   |   1 +
 .travis.yml                                  |  10 +
 AUTHORS.en.txt                               |  12 +-
 AUTHORS.ru.txt                               |  12 +-
 CHANGES.md                                   |  47 +++++
 README.md                                    |  12 +-
 README.ru.md                                 |  10 +-
 docs/building-testing.rst                    |  29 ++-
 docs/conf.py                                 |   4 +-
 docs/css-classes-reference.rst               |  93 +++++++-
 docs/language-contribution.rst               |   6 +-
 package.json                                 |  41 ++++
 src/highlight.js                             |  55 +++--
 src/languages/axapta.js                      |   6 +-
 src/languages/clojure.js                     |   8 +-
 src/languages/coffeescript.js                |   9 +-
 src/languages/cs.js                          |  39 +++-
 src/languages/dart.js                        | 106 ++++++++++
 src/languages/dos.js                         |  40 ++--
 src/languages/dust.js                        |  41 ++++
 src/languages/erlang.js                      |   4 +-
 src/languages/fsharp.js                      |  19 +-
 src/languages/gcode.js                       |  82 ++++++++
 src/languages/gherkin.js                     |   1 +
 src/languages/groovy.js                      |  90 ++++++++
 src/languages/java.js                        |  51 +++--
 src/languages/lisp.js                        |   6 +-
 src/languages/livecodeserver.js              |   2 +-
 src/languages/makefile.js                    |   1 +
 src/languages/markdown.js                    |  16 +-
 src/languages/nginx.js                       |   3 +-
 src/languages/objectivec.js                  |   3 +-
 src/languages/php.js                         |   5 +-
 src/languages/q.js                           |  27 +++
 src/languages/ruby.js                        |  48 ++---
 src/languages/rust.js                        |  27 ++-
 src/languages/scala.js                       |  89 ++++----
 src/languages/scheme.js                      | 126 +++++++++++
 src/languages/swift.js                       |  10 +-
 src/languages/xml.js                         |   2 +-
 src/package.json                             |  24 ---
 src/styles/arta.css                          |   8 +-
 src/styles/ascetic.css                       |   2 +-
 src/styles/atelier-dune.dark.css             |   1 +
 src/styles/atelier-dune.light.css            |   1 +
 src/styles/atelier-forest.dark.css           |   1 +
 src/styles/atelier-forest.light.css          |   1 +
 src/styles/atelier-heath.dark.css            |   1 +
 src/styles/atelier-heath.light.css           |   1 +
 src/styles/atelier-lakeside.dark.css         |   1 +
 src/styles/atelier-lakeside.light.css        |   1 +
 src/styles/atelier-seaside.dark.css          |   1 +
 src/styles/atelier-seaside.light.css         |   1 +
 src/styles/brown_paper.css                   |  12 +-
 src/styles/codepen-embed.css                 |   1 +
 src/styles/color-brewer.css                  |   8 +-
 src/styles/dark.css                          |  12 +-
 src/styles/default.css                       |   7 +-
 src/styles/docco.css                         |   2 +
 src/styles/far.css                           |  14 +-
 src/styles/foundation.css                    |   1 +
 src/styles/github.css                        |  16 +-
 src/styles/googlecode.css                    |  10 +-
 src/styles/hybrid.css                        |   4 +-
 src/styles/idea.css                          |   5 +-
 src/styles/ir_black.css                      |   4 +-
 src/styles/kimbie.dark.css                   |   3 +-
 src/styles/kimbie.light.css                  |   1 +
 src/styles/magula.css                        |   6 +-
 src/styles/mono-blue.css                     |   5 +
 src/styles/monokai.css                       |  12 +-
 src/styles/monokai_sublime.css               |   9 +-
 src/styles/obsidian.css                      |  12 +-
 src/styles/paraiso.dark.css                  |   1 +
 src/styles/paraiso.light.css                 |   1 +
 src/styles/pojoaque.css                      |   8 +-
 src/styles/railscasts.css                    |   6 +-
 src/styles/rainbow.css                       |  14 +-
 src/styles/school_book.css                   |  12 +-
 src/styles/solarized_dark.css                |   5 +-
 src/styles/solarized_light.css               |   5 +-
 src/styles/sunburst.css                      |   6 +-
 src/styles/tomorrow-night-blue.css           |   1 +
 src/styles/tomorrow-night-bright.css         |   1 +
 src/styles/tomorrow-night-eighties.css       |   1 +
 src/styles/tomorrow-night.css                |   1 +
 src/styles/tomorrow.css                      |   1 +
 src/styles/vs.css                            |   6 +-
 src/styles/xcode.css                         |   6 +-
 src/styles/zenburn.css                       |   7 +-
 src/test.html                                | 303 +++++++++++++++++++++++----
 test/detect/1c/default.txt                   |  16 ++
 test/detect/actionscript/default.txt         |  24 +++
 test/detect/apache/default.txt               |  19 ++
 test/detect/applescript/default.txt          |  14 ++
 test/detect/asciidoc/default.txt             |  65 ++++++
 test/detect/autohotkey/default.txt           |  24 +++
 test/detect/avrasm/default.txt               |  19 ++
 test/detect/axapta/default.txt               |  32 +++
 test/detect/bash/default.txt                 |  30 +++
 test/detect/brainfuck/default.txt            |  17 ++
 test/detect/capnproto/default.txt            |  55 +++++
 test/detect/clojure/default.txt              |  18 ++
 test/detect/cmake/default.txt                |  19 ++
 test/detect/coffeescript/default.txt         |  42 ++++
 test/detect/cpp/default.txt                  |  15 ++
 test/detect/cs/default.txt                   |  25 +++
 test/detect/css/default.txt                  |  25 +++
 test/detect/d/default.txt                    |  44 ++++
 test/detect/dart/default.txt                 |  32 +++
 test/detect/delphi/default.txt               |  30 +++
 test/detect/diff/default.txt                 |  30 +++
 test/detect/django/default.txt               |  16 ++
 test/detect/dos/default.txt                  |  24 +++
 test/detect/dust/default.txt                 |   7 +
 test/detect/elixir/default.txt               |  49 +++++
 test/detect/erlang-repl/default.txt          |  27 +++
 test/detect/erlang/default.txt               |  60 ++++++
 test/detect/fix/default.txt                  |   4 +
 test/detect/fsharp/default.txt               |  48 +++++
 test/detect/gcode/default.txt                |  31 +++
 test/detect/gherkin/default.txt              |  25 +++
 test/detect/glsl/default.txt                 |  37 ++++
 test/detect/go/default.txt                   |  34 +++
 test/detect/gradle/default.txt               |  62 ++++++
 test/detect/groovy/default.txt               |  56 +++++
 test/detect/haml/default.txt                 |  14 ++
 test/detect/handlebars/default.txt           |   7 +
 test/detect/haskell/default.txt              |  44 ++++
 test/detect/haxe/default.txt                 |  29 +++
 test/detect/http/default.txt                 |   6 +
 test/detect/ini/default.txt                  |  12 ++
 test/detect/java/default.txt                 |  35 ++++
 test/detect/javascript/default.txt           |  16 ++
 test/detect/json/default.txt                 |  12 ++
 test/detect/lasso/default.txt                |  47 +++++
 test/detect/lisp/default.txt                 |  22 ++
 test/detect/livecodeserver/default.txt       |  30 +++
 test/detect/lua/default.txt                  |  32 +++
 test/detect/makefile/default.txt             |  13 ++
 test/detect/markdown/default.txt             |  23 ++
 test/detect/mathematica/default.txt          |  14 ++
 test/detect/matlab/default.txt               |  38 ++++
 test/detect/mel/default.txt                  |  25 +++
 test/detect/mizar/default.txt                |  86 ++++++++
 test/detect/monkey/default.txt               |  37 ++++
 test/detect/nginx/default.txt                |  47 +++++
 test/detect/nimrod/default.txt               |  22 ++
 test/detect/nix/default.txt                  |  24 +++
 test/detect/nsis/default.txt                 |  33 +++
 test/detect/objectivec/default.txt           |  43 ++++
 test/detect/ocaml/default.txt                |  23 ++
 test/detect/oxygene/default.txt              |  56 +++++
 test/detect/parser3/default.txt              |  34 +++
 test/detect/perl/default.txt                 |  32 +++
 test/detect/php/default.txt                  |  52 +++++
 test/detect/profile/default.txt              |   8 +
 test/detect/protobuf/default.txt             |  23 ++
 test/detect/python/default.txt               |  12 ++
 test/detect/q/default.txt                    |   9 +
 test/detect/r/default.txt                    |  69 ++++++
 test/detect/rib/default.txt                  |  25 +++
 test/detect/rsl/default.txt                  |  15 ++
 test/detect/ruby/default.txt                 |  57 +++++
 test/detect/ruleslanguage/default.txt        |  36 ++++
 test/detect/rust/default.txt                 |  75 +++++++
 test/detect/scala/default.txt                |  44 ++++
 test/detect/scheme/default.txt               |  28 +++
 test/detect/scilab/default.txt               |  14 ++
 test/detect/scss/default.txt                 |  73 +++++++
 test/detect/smalltalk/default.txt            |  39 ++++
 test/detect/sql/default.txt                  |  19 ++
 test/detect/swift/default.txt                |  11 +
 test/detect/tex/default.txt                  |  17 ++
 test/detect/thrift/default.txt               |  40 ++++
 test/detect/typescript/default.txt           |  16 ++
 test/detect/vala/default.txt                 |  46 ++++
 test/detect/vbnet/default.txt                |  42 ++++
 test/detect/vbscript/default.txt             |  29 +++
 test/detect/vhdl/default.txt                 |  41 ++++
 test/detect/vim/default.txt                  |  15 ++
 test/detect/x86asm/default.txt               |  40 ++++
 test/detect/xml/default.txt                  |  22 ++
 test/expect/brInPre.txt                      |   1 +
 test/expect/custommarkup.txt                 |   3 +
 test/expect/customtabreplace.txt             |   4 +
 test/expect/explicit.txt                     |   2 +
 test/expect/languagealias.txt                |   1 +
 test/expect/shortenedexplicit.txt            |   2 +
 test/expect/tabreplace.txt                   |   2 +
 test/highlightAuto.js                        |  38 ++++
 test/index.html                              |  54 +++++
 test/markup.js                               |  33 +++
 test/markup/coffeescript/division.expect.txt |   8 +
 test/markup/coffeescript/division.txt        |   8 +
 test/markup/coffeescript/function.expect.txt |  11 +
 test/markup/coffeescript/function.txt        |  11 +
 test/markup/coffeescript/regex.expect.txt    |   8 +
 test/markup/coffeescript/regex.txt           |   8 +
 test/markup/cs/titles.expect.txt             |  16 ++
 test/markup/cs/titles.txt                    |  16 ++
 test/mocha.opts                              |   5 +
 test/special.js                              |  23 ++
 test/special/customMarkup.js                 |  48 +++++
 test/special/explicitLanguage.js             |  42 ++++
 test/special/languageAlias.js                |  21 ++
 test/special/noHighlight.js                  |  17 ++
 test/utility.js                              |  11 +
 tools/build.py                               |  11 +-
 209 files changed, 4636 insertions(+), 382 deletions(-)

diff --git a/.gitignore b/.gitignore
index 8301361..22b5864 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ docs/_build
 .idea/
 __pycache__
 *.swp
+node_modules
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..ac55096
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,10 @@
+language: python
+python:
+  - "3.3"
+before_install:
+  - "python tools/build.py -t node"
+  - npm config set python python2.7
+install:
+  - npm install
+script:
+  - npm test
diff --git a/AUTHORS.en.txt b/AUTHORS.en.txt
index 7a98a0a..46ec398 100644
--- a/AUTHORS.en.txt
+++ b/AUTHORS.en.txt
@@ -1,6 +1,6 @@
 Syntax highlighting with language autodetection.
 
-URL:   http://highlightjs.org/
+URL:   https://highlightjs.org/
 
 Core developers (in order of appearance):
 
@@ -118,3 +118,13 @@ Contributors:
 - Chris Eidhof <chris at eidhof.nl>
 - Nate Cook <natecook at gmail.com>
 - Matt Diephouse <matt at diephouse.com>
+- Erik Osheim <d_m at plastic-idolatry.com>
+- Guillaume Laforge <glaforge at gmail.com>
+- Lucas Mazza <lucastmazza at gmail.com>
+- Maxim Dikun <dikmax at gmail.com>
+- Henrik Feldt <henrik at haf.se>
+- Anton Kochkov <anton.kochkov at gmail.com>
+- Michael Allen <Michael.Allen at benefitfocus.com>
+- JP Verkamp <me at jverkamp.com>
+- Adam Joseph Cook <adam.joseph.cook at gmail.com>
+- Sergey Vidyuk <svidyuk at gmail.com>
diff --git a/AUTHORS.ru.txt b/AUTHORS.ru.txt
index b3a7bae..c15faae 100644
--- a/AUTHORS.ru.txt
+++ b/AUTHORS.ru.txt
@@ -1,6 +1,6 @@
 Подсветка синтаксиса с автоопределением языка.
 
-URL:   http://highlightjs.org/
+URL:   https://highlightjs.org/
 
 Ключевые разработчики (в порядке появления):
 
@@ -118,3 +118,13 @@ URL:   http://highlightjs.org/
 - Крис Еидхоф <chris at eidhof.nl>
 - Нейт Кук <natecook at gmail.com>
 - Мэтт Дайпхауз <matt at diephouse.com>
+- Эрик Осхейм <d_m at plastic-idolatry.com>
+- Гийом Ляфорж <glaforge at gmail.com>
+- Лукас Мазза <lucastmazza at gmail.com>
+- Максим Дикун <dikmax at gmail.com>
+- Хенрик Фельдт <henrik at haf.se>
+- Антон Кочков <anton.kochkov at gmail.com>
+- Михаэль Аллен <Michael.Allen at benefitfocus.com>
+- Д.П. Веркамп <me at jverkamp.com>
+- Адам Джозеф Кук <adam.joseph.cook at gmail.com>
+- Сергей Видюк <svidyuk at gmail.com>
diff --git a/CHANGES.md b/CHANGES.md
index 0cc10f6..8e6ab0c 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,49 @@
+## Version 8.2
+
+We've finally got [real tests][test] and [continuous testing on Travis][ci]
+thanks to [Jeremy Hull][] and [Chris Eidhof][]. The tests designed to cover
+everything: language detection, correct parsing of individual language features
+and various special cases. This is a very important change that gives us
+confidence in extending language definitions and refactoring library core.
+
+We're going to redesign the old [demo/test suite][demo] into an interactive
+demo web app. If you're confident front-end developer or designer and want to
+help us with it, drop a comment into [the issue][#542] on GitHub.
+
+[test]: https://github.com/isagalaev/highlight.js/tree/master/test
+[demo]: https://highlightjs.org/static/test.html
+[#542]: https://github.com/isagalaev/highlight.js/issues/542
+[ci]: https://travis-ci.org/isagalaev/highlight.js
+[Jeremy Hull]: https://github.com/sourrust
+[Chris Eidhof]: https://github.com/chriseidhof
+
+As usually there's a handful of new languages in this release:
+
+- *Groovy* by [Guillaume Laforge][]
+- *Dart* by [Maxim Dikun][]
+- *Dust* by [Michael Allen][]
+- *Scheme* by [JP Verkamp][]
+- *G-Code* by [Adam Joseph Cook][]
+- *Q* from Kx Systems by [Sergey Vidyuk][]
+
+[Guillaume Laforge]: https://github.com/glaforge
+[Maxim Dikun]: https://github.com/dikmax
+[Michael Allen]: https://github.com/bfui
+[JP Verkamp]: https://github.com/jpverkamp
+[Adam Joseph Cook]: https://github.com/adamjcook
+[Sergey Vidyuk]: https://github.com/sv
+
+Other improvements:
+
+- [Erik Osheim][] heavily reworked Scala definitions making it richer.
+- [Lucas Mazza][] fixed Ruby hashes highlighting
+- Lisp variants (Lisp, Clojure and Scheme) are unified in regard to naming
+  the first symbol in parentheses: it's "keyword" in general case and also
+  "built_in" for built-in functions in Clojure and Scheme.
+
+[Erik Osheim]: https://github.com/non
+[Lucas Mazza]: https://github.com/lucasmazza
+
 ## Version 8.1
 
 New languages:
@@ -25,6 +71,7 @@ New styles:
 - *Hybrid* by [Nic West][]
 
 [Sam Pikesley]: https://github.com/pikesley
+[Sindre Sorhus]: https://github.com/sindresorhus
 [Josh Adams]: https://github.com/knewter
 [Jan T. Sott]: https://github.com/idleberg
 [Jun Yang]: https://github.com/harttle
diff --git a/README.md b/README.md
index 0e77343..8618022 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 # Highlight.js
 
+[![Build Status](https://travis-ci.org/isagalaev/highlight.js.svg?branch=master)](https://travis-ci.org/isagalaev/highlight.js)
+
 Highlight.js is a syntax highlighter written in JavaScript. It works in the
 browser as well as on the server. It works with pretty much any markup,
 doesn't depend on any framework and has automatic language detection.
@@ -27,10 +29,10 @@ specify the language in the class attribute:
 The list of supported language classes is available in the [class reference][8].
 Classes can also be prefixed with either `language-` or `lang-`.
 
-To disable highlighting altogether use the `no-highlight` class:
+To disable highlighting altogether use the `nohighlight` class:
 
 ```html
-<pre><code class="no-highlight">...</code></pre>
+<pre><code class="nohighlight">...</code></pre>
 ```
 
 ## Custom Initialization
@@ -46,7 +48,7 @@ $(document).ready(function() {
   $('pre code').each(function(i, block) {
     hljs.highlightBlock(block);
   });
-};)
+});
 ```
 
 You can use any tags instead of `<pre><code>` to mark up your code. If you don't
@@ -82,7 +84,7 @@ details.
 
 ## Links
 
-The official site for the library is at <http://highlightjs.org/>.
+The official site for the library is at <https://highlightjs.org/>.
 
 Further in-depth documentation for the API and other topics is at
 <http://highlightjs.readthedocs.org/>.
@@ -92,7 +94,7 @@ Authors and contributors are listed in the [AUTHORS.en.txt][9] file.
 [1]: http://highlightjs.readthedocs.org/en/latest/api.html#inithighlightingonload
 [2]: http://highlightjs.readthedocs.org/en/latest/api.html#highlightblock-block
 [3]: http://highlightjs.readthedocs.org/en/latest/api.html#configure-options
-[4]: http://highlightjs.org/download/
+[4]: https://highlightjs.org/download/
 [5]: http://highlightjs.readthedocs.org/en/latest/building-testing.html
 [8]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html
 [9]: https://github.com/isagalaev/highlight.js/blob/master/AUTHORS.en.txt
diff --git a/README.ru.md b/README.ru.md
index f6cb3cb..198c029 100644
--- a/README.ru.md
+++ b/README.ru.md
@@ -27,10 +27,10 @@ Highlight.js — это подсветчик синтаксиса, написа
 Список поддерживаемых классов языков доступен в [справочнике по классам][8].
 Класс также можно предваоить префиксами `language-` или `lang-`.
 
-Чтобы отключить подсветку для какого-то блока, используйте класс `no-highlight`:
+Чтобы отключить подсветку для какого-то блока, используйте класс `nohighlight`:
 
 ```html
-<pre><code class="no-highlight">...</code></pre>
+<pre><code class="nohighlight">...</code></pre>
 ```
 
 ## Инициализация вручную
@@ -47,7 +47,7 @@ $(document).ready(function() {
   $('pre code').each(function(i, block) {
     hljs.highlightBlock(block);
   });
-};)
+});
 ```
 
 Вы можете использовать любые теги разметки вместо `<pre><code>`. Если
@@ -84,7 +84,7 @@ Highlight.js распространяется под лицензией BSD. П
 
 ## Ссылки
 
-Официальный сайт билиотеки расположен по адресу <http://highlightjs.org/>.
+Официальный сайт билиотеки расположен по адресу <https://highlightjs.org/>.
 
 Более подробная документация по API и другим темам расположена на
 <http://highlightjs.readthedocs.org/>.
@@ -94,7 +94,7 @@ Highlight.js распространяется под лицензией BSD. П
 [1]: http://highlightjs.readthedocs.org/en/latest/api.html#inithighlightingonload
 [2]: http://highlightjs.readthedocs.org/en/latest/api.html#highlightblock-block
 [3]: http://highlightjs.readthedocs.org/en/latest/api.html#configure-options
-[4]: http://highlightjs.org/download/
+[4]: https://highlightjs.org/download/
 [5]: http://highlightjs.readthedocs.org/en/latest/building-testing.html
 [8]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html
 [9]: https://github.com/isagalaev/highlight.js/blob/master/AUTHORS.ru.txt
diff --git a/docs/building-testing.rst b/docs/building-testing.rst
index 802e745..5179f76 100644
--- a/docs/building-testing.rst
+++ b/docs/building-testing.rst
@@ -34,14 +34,27 @@ The build result will be in the ``build/`` directory.
 Testing
 -------
 
-Testing is done in a browser using the provided ``src/test.html`` file that
-contains snippets for all the supported languages. You can use browser builds
-with all or only some of the languages, with or without compression.
+Testing is done using `mocha <https://visionmedia.github.io/mocha/>` and the
+files are found in the ``test/`` directory. You can use the node build to
+run the tests in the command line with ``npm test`` after installing the
+dependencies with ``npm install``.
+
+**Note**: for Debian-based machine, like Ubuntu, you might need to create an
+alias or symbolic link for nodejs to node. The reason for this is the
+dependencies that are requires to test highlight.js has a reference to
+"node".
+
+The normal tests themselves have more to do with auto-detection, but you
+might want to see a visual representation of the highlighted language. To
+accomplish this you can place a snippet of the language in ``src/test.html``
+and use the browser build type with or without compression.
 
 The usual approach to debugging and testing a language is first building
 highlight.js with only the language you're working on without compression
-(to have readable code in browser error messages). After this you have to build
-the entire package with all the languages and see if anything is broken. If your
-language breaks auto-detection it should be fixed by
-:ref:`improving relevance <relevance>`, which is a black art in and of itself.
-When in doubt, please refer to the discussion group!
+(to have readable code in browser error messages). After this you have to
+build the entire package -- this time for node -- with all the languages,
+place the snippet you used inside the browser in
+``test/detect/<language_name>/default.txt``, and run the testing suite to
+see if any tests fail. If your language breaks auto-detection, it should be
+fixed by :ref:`improving relevance <relevance>`, which is a black art in and
+of itself. When in doubt, please refer to the discussion group!
diff --git a/docs/conf.py b/docs/conf.py
index c79a852..8ec77ff 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -48,9 +48,9 @@ copyright = u'2012, Ivan Sagalaev'
 # built documents.
 #
 # The short X.Y version.
-version = '8.1'
+version = '8.2'
 # The full version, including alpha/beta/rc tags.
-release = '8.1'
+release = '8.2'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/docs/css-classes-reference.rst b/docs/css-classes-reference.rst
index d692c5a..e04b691 100644
--- a/docs/css-classes-reference.rst
+++ b/docs/css-classes-reference.rst
@@ -103,6 +103,22 @@ Scala ("scala")
 * ``params``:           everything in parentheses inside a class header
 * ``inheritance``:      keywords "extends" and "with" inside class header
 
+Groovy ("groovy)
+----------------
+
+* ``keyword``:          keyword
+* ``number``:           number
+* ``string``:           string, map string keys and named argument labels
+* ``regex``:            regular expression
+* ``comment``:          comment
+* ``annotation``:       annotation
+* ``javadoc``:          javadoc comment
+* ``javadoctag``:       @-tag in javadoc
+* ``class``:            class header
+* ``title``:            class name inside a header
+* ``label``:            label
+* ``shebang``:          Groovy shell script header
+
 Go ("go", "golang")
 -------------------
 
@@ -244,8 +260,17 @@ Handlebars ("handlebars", "hbs", "html.hbs", "html.handlebars")
 
 * ``expression``:       expression to be evaluated
 * ``variable``:         variable
-* ``begin``:-block      the beginning of a block
-* ``end``:-block        the ending of a block
+* ``begin-block``:      the beginning of a block
+* ``end-block``:        the ending of a block
+* ``string``:           string
+
+Dust ("dust", "dst")
+--------------------
+
+* ``expression``:       expression to be evaluated
+* ``variable``:         variable
+* ``begin-block``:      the beginning of a block
+* ``end-block``:        the ending of a block
 * ``string``:           string
 
 JSON ("json")
@@ -311,6 +336,21 @@ CoffeeScript ("coffeescript", "coffee", "cson", "iced")
 * ``params``:           parentheses and everything inside them in a function's header
 * ``property``:         @-property within class and functions
 
+Dart ("dart")
+--------------------
+
+* ``keyword``:          keyword
+* ``literal``:          keyword that can be uses as identifier but have special meaning in some cases
+* ``built_in``:         some of basic built in classes and function
+* ``number``:           number
+* ``string``:           string
+* ``subst``:            in-string substitution (${...})
+* ``comment``:          commment
+* ``annotaion``:        annotation
+* ``dartdoc``:          dartdoc comment
+* ``class``:            class header from "class" till "{"
+* ``title``:            class name
+
 ActionScript ("actionscript", "as")
 -----------------------------------
 
@@ -462,6 +502,7 @@ Java ("java", "jsp")
 * ``annotaion``:        annotation
 * ``javadoc``:          javadoc comment
 * ``class``:            class header from "class" till "{"
+* ``function``:         method header
 * ``title``:            class or method name
 * ``params``:           everything in parentheses inside a class header
 * ``inheritance``:      keywords "extends" and "implements" inside class header
@@ -508,6 +549,8 @@ C# ("cs", "csharp")
 * ``string``:           string
 * ``comment``:          comment
 * ``xmlDocTag``:        xmldoc tag ("///", "<!--", "-->", "<..>")
+* ``class``:            class header from "class" till "{"
+* ``function``:         method header
 * ``title``:            title of namespace or class
 
 F# ("fsharp", "fs")
@@ -598,14 +641,13 @@ Smalltalk ("smalltalk", "st")
 Lisp ("lisp")
 -------------
 
-* ``keyword``:          keyword
 * ``number``:           number
 * ``string``:           string
 * ``comment``:          comment
 * ``variable``:         variable
 * ``literal``:          b, t and nil
 * ``list``:             non-quoted list
-* ``title``:            first symbol in a non-quoted list
+* ``keyword``:          first symbol in a non-quoted list
 * ``body``:             remainder of the non-quoted list
 * ``quoted``:           quoted list, both "(quote .. )" and "'(..)"
 
@@ -617,8 +659,23 @@ Clojure ("clojure", "clj")
 * ``number``:           number
 * ``collection``:       collections
 * ``attribute``:        :keyword
-* ``title``:            function name (built-in or user defined)
-* ``built_in``:         built-in function name
+* ``list``:             non-quoted list
+* ``keyword``:          first symbol in a list
+* ``built_in``:         built-in function name as the first symbol in a list
+
+Scheme ("scheme")
+--------------------------
+
+* ``shebang``:          script interpreter header
+* ``comment``:          comment
+* ``string``:           string
+* ``number``:           number
+* ``regexp``:           regexp
+* ``variable``:         single-quote 'identifier
+* ``list``:             non-quoted list
+* ``keyword``:          first symbol in a list
+* ``built_in``:         built-in function name as the first symbol in a list
+* ``literal``:          #t, #f, #\...\
 
 Ini ("ini")
 -----------
@@ -734,7 +791,6 @@ Axapta ("axapta")
 * ``class``:            class header from "class" till "{"
 * ``title``:            class name inside a header
 * ``params``:           everything in parentheses inside a class header
-* ``inheritance``:      keywords "extends" and "implements" inside class header
 * ``preprocessor``:     preprocessor directive
 
 Oracle Rules Language ("ruleslanguage")
@@ -1043,3 +1099,26 @@ Swift ("swift")
 * ``params``:           parameters of a function
 * ``type``:             a type
 * ``preprocessor``:     @attributes
+
+G-Code ("gcode", "nc")
+-------------------------------
+
+* ``keyword``:          G words, looping constructs and conditional operators
+* ``comment``:          comment
+* ``number``:           number
+* ``built_in``:         trigonometric and mathematical functions
+* ``title``:            M words and variable registers
+* ``preprocessor``:     program number and ending character
+* ``label``:            block number
+
+
+Q ("k", "kdb")
+-------------------
+
+* ``comment``:          comment
+* ``string``:           string constant
+* ``number``:           number
+* ``keyword``:          language keywords
+* ``constant``:         0/1b
+* ``typename``:         built-in plain types (int, symbol etc.)
+* ``built_in``:         built-in function
diff --git a/docs/language-contribution.rst b/docs/language-contribution.rst
index 81263a5..f0b8c89 100644
--- a/docs/language-contribution.rst
+++ b/docs/language-contribution.rst
@@ -55,8 +55,10 @@ because real-world code rarely contains all language features in one place.
 This fragment is also absolutely *not* required to actually work or make sense :-).
 Good example are C++ and HTML fragments in ``test.html``.
 
-Then put the fragment into the ``test.html`` similar to other languages
-and test if it's properly detected and doesn't break detection of other languages.
+Then put the fragment into the ``test.html`` and
+``test/language/<language_name>/default.txt``` similar to other languages
+and test if it's properly detected and doesn't break detection of other
+languages.
 
 
 4. Write class reference
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..e810f67
--- /dev/null
+++ b/package.json
@@ -0,0 +1,41 @@
+{
+  "name": "highlight.js",
+  "description": "Syntax highlighting with language autodetection.",
+  "keywords": [
+    "highlight",
+    "syntax"
+  ],
+  "homepage": "https://highlightjs.org/",
+  "version": "8.2.0",
+  "author": {
+    "name": "Ivan Sagalaev",
+    "email": "maniac at softwaremaniacs.org"
+  },
+  "contributors": [],
+  "bugs": {
+    "url": "https://github.com/isagalaev/highlight.js/issues"
+  },
+  "licenses": [
+    {
+      "type": "BSD",
+      "url": "https://github.com/isagalaev/highlight.js/blob/master/LICENSE"
+    }
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isagalaev/highlight.js.git"
+  },
+  "main": "./lib/index.js",
+  "scripts": {
+    "test": "./node_modules/.bin/mocha test/"
+  },
+  "engines": {
+    "node": "*"
+  },
+  "devDependencies": {
+    "glob": "^4.0.5",
+    "jsdom": "^0.11.1",
+    "mocha": "^1.21.4",
+    "should": "^4.0.4"
+  }
+}
diff --git a/src/highlight.js b/src/highlight.js
index ce0f67b..9fbaefc 100644
--- a/src/highlight.js
+++ b/src/highlight.js
@@ -1,6 +1,6 @@
 /*
 Syntax highlighting with language autodetection.
-http://highlightjs.org/
+https://highlightjs.org/
 */
 
 function() {
@@ -23,7 +23,7 @@ function() {
   function blockLanguage(block) {
     var classes = (block.className + ' ' + (block.parentNode ? block.parentNode.className : '')).split(/\s+/);
     classes = classes.map(function(c) {return c.replace(/^lang(uage)?-/, '');});
-    return classes.filter(function(c) {return getLanguage(c) || c == 'no-highlight';})[0];
+    return classes.filter(function(c) {return getLanguage(c) || /no(-?)highlight/.test(c);})[0];
   }
 
   function inherit(parent, obj) {
@@ -44,8 +44,6 @@ function() {
       for (var child = node.firstChild; child; child = child.nextSibling) {
         if (child.nodeType == 3)
           offset += child.nodeValue.length;
-        else if (tag(child) == 'br')
-          offset += 1;
         else if (child.nodeType == 1) {
           result.push({
             event: 'start',
@@ -53,11 +51,16 @@ function() {
             node: child
           });
           offset = _nodeStream(child, offset);
-          result.push({
-            event: 'stop',
-            offset: offset,
-            node: child
-          });
+          // Prevent void elements from having an end tag that would actually
+          // double them in the output. There are more void elements in HTML
+          // but we list only those realistically expected in code display.
+          if (!tag(child).match(/br|hr|img|input/)) {
+            result.push({
+              event: 'stop',
+              offset: offset,
+              node: child
+            });
+          }
         }
       }
       return offset;
@@ -228,8 +231,6 @@ function() {
         .map(reStr)
         .filter(Boolean);
       mode.terminators = terminators.length ? langRe(terminators.join('|'), true) : {exec: function(s) {return null;}};
-
-      mode.continuation = {};
     }
 
     compileMode(language);
@@ -308,7 +309,7 @@ function() {
       if (top.subLanguage && !languages[top.subLanguage]) {
         return escape(mode_buffer);
       }
-      var result = top.subLanguage ? highlight(top.subLanguage, mode_buffer, true, top.continuation.top) : highlightAuto(mode_buffer);
+      var result = top.subLanguage ? highlight(top.subLanguage, mode_buffer, true, subLanguageTop) : highlightAuto(mode_buffer);
       // Counting embedded language score towards the host language may be disabled
       // with zeroing the containing mode relevance. Usecase in point is Markdown that
       // allows XML everywhere and makes every XML snippet to have a much larger Markdown
@@ -317,7 +318,7 @@ function() {
         relevance += result.relevance;
       }
       if (top.subLanguageMode == 'continuous') {
-        top.continuation.top = result.top;
+        subLanguageTop = result.top;
       }
       return buildSpan(result.language, result.value, false, true);
     }
@@ -399,10 +400,11 @@ function() {
 
     compileLanguage(language);
     var top = continuation || language;
+    var subLanguageTop;
     var result = '';
     for(var current = top; current != language; current = current.parent) {
       if (current.className) {
-        result += buildSpan(current.className, result, true);
+        result = buildSpan(current.className, '', true) + result;
       }
     }
     var mode_buffer = '';
@@ -503,18 +505,25 @@ function() {
   two optional parameters for fixMarkup.
   */
   function highlightBlock(block) {
-    var text = options.useBR ? block.innerHTML
-      .replace(/\n/g,'').replace(/<br>|<br [^>]*>/g, '\n').replace(/<[^>]*>/g,'')
-      : block.textContent;
     var language = blockLanguage(block);
-    if (language == 'no-highlight')
+    if (/no(-?)highlight/.test(language))
         return;
+
+    var node;
+    if (options.useBR) {
+      node = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+      node.innerHTML = block.innerHTML.replace(/\n/g, '').replace(/<br[ \/]*>/g, '\n');
+    } else {
+      node = block;
+    }
+    var text = node.textContent;
     var result = language ? highlight(language, text, true) : highlightAuto(text);
-    var original = nodeStream(block);
-    if (original.length) {
-      var pre = document.createElementNS('http://www.w3.org/1999/xhtml', 'pre');
-      pre.innerHTML = result.value;
-      result.value = mergeStreams(original, nodeStream(pre), text);
+
+    var originalStream = nodeStream(node);
+    if (originalStream.length) {
+      var resultNode = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+      resultNode.innerHTML = result.value;
+      result.value = mergeStreams(originalStream, nodeStream(resultNode), text);
     }
     result.value = fixMarkup(result.value);
 
diff --git a/src/languages/axapta.js b/src/languages/axapta.js
index 832e9d9..8a6ebbc 100644
--- a/src/languages/axapta.js
+++ b/src/languages/axapta.js
@@ -26,11 +26,7 @@ function(hljs) {
         beginKeywords: 'class interface', end: '{', excludeEnd: true,
         illegal: ':',
         contains: [
-          {
-            className: 'inheritance',
-            beginKeywords: 'extends implements',
-            relevance: 10
-          },
+          {beginKeywords: 'extends implements'},
           hljs.UNDERSCORE_TITLE_MODE
         ]
       }
diff --git a/src/languages/clojure.js b/src/languages/clojure.js
index 5d9dd69..02f6150 100644
--- a/src/languages/clojure.js
+++ b/src/languages/clojure.js
@@ -8,7 +8,7 @@ function(hljs) {
   var keywords = {
     built_in:
       // Clojure keywords
-      'def cond apply if-not if-let if not not= = < < > <= <= >= == + / * - rem '+
+      'def cond apply if-not if-let if not not= = < > <= >= == + / * - rem '+
       'quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? '+
       'set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? '+
       'class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? '+
@@ -76,14 +76,14 @@ function(hljs) {
     keywords: {literal: 'true false nil'},
     relevance: 0
   };
-  var TITLE = {
+  var NAME = {
     keywords: keywords,
     lexemes: CLJ_IDENT_RE,
-    className: 'title', begin: CLJ_IDENT_RE,
+    className: 'keyword', begin: CLJ_IDENT_RE,
     starts: BODY
   };
 
-  LIST.contains = [{className: 'comment', begin: 'comment'}, TITLE, BODY];
+  LIST.contains = [{className: 'comment', begin: 'comment'}, NAME, BODY];
   BODY.contains = [LIST, STRING, HINT, HINT_COL, COMMENT, KEY, COLLECTION, NUMBER];
   COLLECTION.contains = [LIST, STRING, HINT, COMMENT, KEY, COLLECTION, NUMBER];
 
diff --git a/src/languages/coffeescript.js b/src/languages/coffeescript.js
index dfa9fde..f649e3c 100644
--- a/src/languages/coffeescript.js
+++ b/src/languages/coffeescript.js
@@ -67,7 +67,9 @@ function(hljs) {
           relevance: 0
         },
         {
-          begin: '/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)' // \S is required to parse x / 2 / 3 as two divisions
+          // regex can't start with space to parse x / 2 / 3 as two divisions
+          // regex can't start with *, and it supports an "illegal" in the main mode
+          begin: /\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/
         }
       ]
     },
@@ -86,6 +88,7 @@ function(hljs) {
   return {
     aliases: ['coffee', 'cson', 'iced'],
     keywords: KEYWORDS,
+    illegal: /\/\*/,
     contains: EXPRESSIONS.concat([
       {
         className: 'comment',
@@ -94,13 +97,13 @@ function(hljs) {
       hljs.HASH_COMMENT_MODE,
       {
         className: 'function',
-        begin: '(' + JS_IDENT_RE + '\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>', end: '[-=]>',
+        begin: '(^\\s*|\\B)(' + JS_IDENT_RE + '\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>', end: '[-=]>',
         returnBegin: true,
         contains: [
           TITLE,
           {
             className: 'params',
-            begin: '\\(', returnBegin: true,
+            begin: '\\([^\\(]', returnBegin: true,
             /* We need another contained nameless mode to not have every nested
             pair of parens to be called "params" */
             contains: [{
diff --git a/src/languages/cs.js b/src/languages/cs.js
index 391f9ed..9897eec 100644
--- a/src/languages/cs.js
+++ b/src/languages/cs.js
@@ -12,9 +12,11 @@ function(hljs) {
     'object operator out override params private protected public readonly ref return sbyte ' +
     'sealed short sizeof stackalloc static string struct switch this throw true try typeof ' +
     'uint ulong unchecked unsafe ushort using virtual volatile void while async await ' +
+    'protected public private internal ' +
     // Contextual keywords.
     'ascending descending from get group into join let orderby partial select set value var ' +
     'where yield';
+  var GENERIC_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '>)?';
   return {
     aliases: ['csharp'],
     keywords: KEYWORDS,
@@ -56,21 +58,42 @@ function(hljs) {
       hljs.QUOTE_STRING_MODE,
       hljs.C_NUMBER_MODE,
       {
-        beginKeywords: 'protected public private internal', end: /[{;=]/,
+        beginKeywords: 'class namespace interface', end: /[{;=]/,
+        illegal: /[^\s:]/,
+        contains: [
+          hljs.TITLE_MODE,
+          hljs.C_LINE_COMMENT_MODE,
+          hljs.C_BLOCK_COMMENT_MODE
+        ]
+      },
+      {
+        // this prevents 'new Name(...)' from being recognized as a function definition
+        beginKeywords: 'new', end: /\s/,
+        relevance: 0
+      },
+      {
+        className: 'function',
+        begin: '(' + GENERIC_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*\\(', returnBegin: true, end: /[{;=]/,
+        excludeEnd: true,
         keywords: KEYWORDS,
         contains: [
           {
-            beginKeywords: 'class namespace interface',
-            starts: {
-              contains: [hljs.TITLE_MODE]
-            }
+            begin: hljs.IDENT_RE + '\\s*\\(', returnBegin: true,
+            contains: [hljs.TITLE_MODE]
           },
           {
-            begin: hljs.IDENT_RE + '\\s*\\(', returnBegin: true,
+            className: 'params',
+            begin: /\(/, end: /\)/,
+            keywords: KEYWORDS,
             contains: [
-              hljs.TITLE_MODE
+              hljs.APOS_STRING_MODE,
+              hljs.QUOTE_STRING_MODE,
+              hljs.C_NUMBER_MODE,
+              hljs.C_BLOCK_COMMENT_MODE
             ]
-          }
+          },
+          hljs.C_LINE_COMMENT_MODE,
+          hljs.C_BLOCK_COMMENT_MODE
         ]
       }
     ]
diff --git a/src/languages/dart.js b/src/languages/dart.js
new file mode 100644
index 0000000..9334cbd
--- /dev/null
+++ b/src/languages/dart.js
@@ -0,0 +1,106 @@
+/*
+Language: Dart
+Requires: markdown.js
+Author: Maxim Dikun <dikmax at gmail.com>
+Description: Dart is a JavaScript replacement language developed by Google. For more information see http://dartlang.org/
+*/
+
+function (hljs) {
+  var SUBST = {
+    className: 'subst',
+    begin: '\\$\\{', end: '}',
+    keywords: 'true false null this is new super'
+  };
+
+  var STRING = {
+    className: 'string',
+    variants: [
+      {
+        begin: 'r\'\'\'', end: '\'\'\''
+      },
+      {
+        begin: 'r"""', end: '"""'
+      },
+      {
+        begin: 'r\'', end: '\'',
+        illegal: '\\n'
+      },
+      {
+        begin: 'r"', end: '"',
+        illegal: '\\n'
+      },
+      {
+        begin: '\'\'\'', end: '\'\'\'',
+        contains: [hljs.BACKSLASH_ESCAPE, SUBST]
+      },
+      {
+        begin: '"""', end: '"""',
+        contains: [hljs.BACKSLASH_ESCAPE, SUBST]
+      },
+      {
+        begin: '\'', end: '\'',
+        illegal: '\\n',
+        contains: [hljs.BACKSLASH_ESCAPE, SUBST]
+      },
+      {
+        begin: '"', end: '"',
+        illegal: '\\n',
+        contains: [hljs.BACKSLASH_ESCAPE, SUBST]
+      }
+    ]
+  };
+  SUBST.contains = [
+    hljs.C_NUMBER_MODE, STRING
+  ];
+
+  var KEYWORDS = {
+    keyword: 'assert break case catch class const continue default do else enum extends false final finally for if ' +
+      'in is new null rethrow return super switch this throw true try var void while with',
+    literal: 'abstract as dynamic export external factory get implements import library operator part set static typedef',
+    built_in:
+      // dart:core
+      'print Comparable DateTime Duration Function Iterable Iterator List Map Match Null Object Pattern RegExp Set ' +
+      'Stopwatch String StringBuffer StringSink Symbol Type Uri bool double int num ' +
+      // dart:html
+      'document window querySelector querySelectorAll Element ElementList'
+  };
+
+  return {
+    keywords: KEYWORDS,
+    contains: [
+      STRING,
+      {
+        className: 'dartdoc',
+        begin: '/\\*\\*', end: '\\*/',
+        subLanguage: 'markdown',
+        subLanguageMode: 'continuous'
+      },
+      {
+        className: 'dartdoc',
+        begin: '///', end: '$',
+        subLanguage: 'markdown',
+        subLanguageMode: 'continuous'
+      },
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE,
+      {
+        className: 'class',
+        beginKeywords: 'class interface', end: '{', excludeEnd: true,
+        contains: [
+          {
+            beginKeywords: 'extends implements'
+          },
+          hljs.UNDERSCORE_TITLE_MODE
+        ]
+      },
+      hljs.C_NUMBER_MODE,
+      {
+        className: 'annotation', begin: '@[A-Za-z]+'
+      },
+      {
+        begin: '=>' // No markup, just a relevance booster
+      }
+    ]
+  }
+}
+
diff --git a/src/languages/dos.js b/src/languages/dos.js
index 924e5dd..27bba93 100644
--- a/src/languages/dos.js
+++ b/src/languages/dos.js
@@ -1,36 +1,52 @@
 /*
 Language: DOS .bat
-Author: Alexander Makarov (http://rmcreative.ru/)
+Author: Alexander Makarov <sam at rmcreative.ru>
+Contributors: Anton Kochkov <anton.kochkov at gmail.com>
 */
 
 function(hljs) {
+  var COMMENT = {
+    className: 'comment',
+    begin: /@?rem\b/, end: /$/,
+	  relevance: 10
+  };
+  var LABEL = {
+	  className: 'label',
+	  begin: '^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)',
+	  relevance: 0
+  };
   return {
     aliases: ['bat', 'cmd'],
     case_insensitive: true,
     keywords: {
-      flow: 'if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq',
+      flow: 'if else goto for in do call exit not exist errorlevel defined',
+      operator: 'equ neq lss leq gtr geq',
       keyword: 'shift cd dir echo setlocal endlocal set pause copy',
       stream: 'prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux',
-      winutils: 'ping net ipconfig taskkill xcopy ren del'
+      winutils: 'ping net ipconfig taskkill xcopy ren del',
+      built_in: 'append assoc at attrib break cacls cd chcp chdir chkdsk chkntfs cls cmd color ' +
+        'comp compact convert date dir diskcomp diskcopy doskey erase fs ' +
+        'find findstr format ftype graftabl help keyb label md mkdir mode more move path ' +
+        'pause print popd pushd promt rd recover rem rename replace restore rmdir shift' +
+        'sort start subst time title tree type ver verify vol',
     },
     contains: [
       {
-        className: 'envvar', begin: '%%[^ ]'
+        className: 'envvar', begin: /%%[^ ]|%[^ ]+?%|![^ ]+?!/
       },
       {
-        className: 'envvar', begin: '%[^ ]+?%'
-      },
-      {
-        className: 'envvar', begin: '![^ ]+?!'
+        className: 'function',
+        begin: LABEL.begin, end: 'goto:eof',
+        contains: [
+          hljs.inherit(hljs.TITLE_MODE, {begin: '([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*'}),
+          COMMENT
+        ]
       },
       {
         className: 'number', begin: '\\b\\d+',
         relevance: 0
       },
-      {
-        className: 'comment',
-        begin: '@?rem', end: '$'
-      }
+      COMMENT
     ]
   };
 }
diff --git a/src/languages/dust.js b/src/languages/dust.js
new file mode 100644
index 0000000..5785948
--- /dev/null
+++ b/src/languages/dust.js
@@ -0,0 +1,41 @@
+/*
+Language: Dust
+Requires: xml.js
+Author: Michael Allen <michael.allen at benefitfocus.com>
+Description: Matcher for dust.js templates.
+*/
+
+function(hljs) {
+  var EXPRESSION_KEYWORDS = 'if eq ne lt lte gt gte select default math sep';
+  return {
+    aliases: ['dst'],
+    case_insensitive: true,
+    subLanguage: 'xml', subLanguageMode: 'continuous',
+    contains: [
+      {
+        className: 'expression',
+        begin: '{', end: '}',
+        relevance: 0,
+        contains: [
+          {
+            className: 'begin-block', begin: '\#[a-zA-Z\-\ \.]+',
+            keywords: EXPRESSION_KEYWORDS
+          },
+          {
+            className: 'string',
+            begin: '"', end: '"'
+          },
+          {
+            className: 'end-block', begin: '\\\/[a-zA-Z\-\ \.]+',
+            keywords: EXPRESSION_KEYWORDS
+          },
+          {
+            className: 'variable', begin: '[a-zA-Z\-\.]+',
+            keywords: EXPRESSION_KEYWORDS,
+            relevance: 0
+          }
+        ]
+      }
+    ]
+  };
+}
diff --git a/src/languages/erlang.js b/src/languages/erlang.js
index 05da495..583b8d5 100644
--- a/src/languages/erlang.js
+++ b/src/languages/erlang.js
@@ -9,8 +9,8 @@ function(hljs) {
   var FUNCTION_NAME_RE = '(' + BASIC_ATOM_RE + ':' + BASIC_ATOM_RE + '|' + BASIC_ATOM_RE + ')';
   var ERLANG_RESERVED = {
     keyword:
-      'after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let ' +
-      'not of orelse|10 query receive rem try when xor',
+      'after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if ' +
+      'let not of orelse|10 query receive rem try when xor',
     literal:
       'false true'
   };
diff --git a/src/languages/fsharp.js b/src/languages/fsharp.js
index b0b4f31..a963b99 100644
--- a/src/languages/fsharp.js
+++ b/src/languages/fsharp.js
@@ -1,13 +1,22 @@
 /*
 Language: F#
 Author: Jonas Follesø <jonas at follesoe.no>
-Contributors: Troy Kershaw <hello at troykershaw.com>
-Description: F# language definition.
+Contributors: Troy Kershaw <hello at troykershaw.com>, Henrik Feldt <henrik at haf.se>
 */
 function(hljs) {
+  var TYPEPARAM = {
+    begin: '<', end: '>',
+    contains: [
+      hljs.inherit(hljs.TITLE_MODE, {begin: /'[a-zA-Z0-9_]+/})
+    ]
+  };
+
   return {
     aliases: ['fs'],
     keywords:
+      // monad builder keywords (at top, matches before non-bang kws)
+      'yield! return! let! do!' +
+      // regular keywords
       'abstract and as assert base begin class default delegate do done ' +
       'downcast downto elif else end exception extern false finally for ' +
       'fun function global if in inherit inline interface internal lazy let ' +
@@ -32,12 +41,14 @@ function(hljs) {
         className: 'class',
         beginKeywords: 'type', end: '\\(|=|$', excludeEnd: true,
         contains: [
-          hljs.UNDERSCORE_TITLE_MODE
+          hljs.UNDERSCORE_TITLE_MODE,
+          TYPEPARAM
         ]
       },
       {
         className: 'annotation',
-        begin: '\\[<', end: '>\\]'
+        begin: '\\[<', end: '>\\]',
+        relevance: 10
       },
       {
         className: 'attribute',
diff --git a/src/languages/gcode.js b/src/languages/gcode.js
new file mode 100644
index 0000000..16372e6
--- /dev/null
+++ b/src/languages/gcode.js
@@ -0,0 +1,82 @@
+/*
+ Language: G-code (ISO 6983)
+ Contributors: Adam Joseph Cook <adam.joseph.cook at gmail.com>
+ Description: G-code syntax highlighter for Fanuc and other common CNC machine tool controls.
+ */
+
+function(hljs) {
+    var GCODE_IDENT_RE = '[A-Z_][A-Z0-9_.]*';
+    var GCODE_CLOSE_RE = '\\%';
+    var GCODE_KEYWORDS = {
+        literal:
+            '',
+        built_in:
+            '',
+        keyword:
+            'IF DO WHILE ENDWHILE CALL ENDIF SUB ENDSUB GOTO REPEAT ENDREPEAT ' +
+            'EQ LT GT NE GE LE OR XOR'
+    };
+    var GCODE_START = {
+        className: 'preprocessor',
+        begin: '([O])([0-9]+)'
+    };
+    var GCODE_CODE = [
+        hljs.C_LINE_COMMENT_MODE,
+        {
+            className: 'comment',
+            begin: /\(/, end: /\)/,
+            contains: [hljs.PHRASAL_WORDS_MODE]
+        },
+        hljs.C_BLOCK_COMMENT_MODE,
+        hljs.inherit(hljs.C_NUMBER_MODE, {begin: '([-+]?([0-9]*\\.?[0-9]+\\.?))|' + hljs.C_NUMBER_RE}),
+        hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),
+        hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),
+        {
+            className: 'keyword',
+            begin: '([G])([0-9]+\\.?[0-9]?)'
+        },
+        {
+            className: 'title',
+            begin: '([M])([0-9]+\\.?[0-9]?)'
+        },
+        {
+            className: 'title',
+            begin: '(VC|VS|#)',
+            end: '(\\d+)'
+        },
+        {
+            className: 'title',
+            begin: '(VZOFX|VZOFY|VZOFZ)'
+        },
+        {
+            className: 'built_in',
+            begin: '(ATAN|ABS|ACOS|ASIN|SIN|COS|EXP|FIX|FUP|ROUND|LN|TAN)(\\[)',
+            end: '([-+]?([0-9]*\\.?[0-9]+\\.?))(\\])'
+        },
+        {
+            className: 'label',
+            variants: [
+                {
+                    begin: 'N', end: '\\d+',
+                    illegal: '\\W'
+                }
+            ]
+        }
+    ];
+
+    return {
+        aliases: ['nc'],
+        // Some implementations (CNC controls) of G-code are interoperable with uppercase and lowercase letters seamlessly.
+        // However, most prefer all uppercase and uppercase is customary.
+        case_insensitive: true,
+        lexemes: GCODE_IDENT_RE,
+        keywords: GCODE_KEYWORDS,
+        contains: [
+            {
+                className: 'preprocessor',
+                begin: GCODE_CLOSE_RE
+            },
+            GCODE_START
+        ].concat(GCODE_CODE)
+    };
+}
\ No newline at end of file
diff --git a/src/languages/gherkin.js b/src/languages/gherkin.js
index dd842af..2732f25 100644
--- a/src/languages/gherkin.js
+++ b/src/languages/gherkin.js
@@ -6,6 +6,7 @@
 
 function (hljs) {
   return {
+    aliases: ['feature'],
     keywords: 'Feature Background Ability Business\ Need Scenario Scenarios Scenario\ Outline Scenario\ Template Examples Given And Then But When',
     contains: [
       {
diff --git a/src/languages/groovy.js b/src/languages/groovy.js
new file mode 100644
index 0000000..409e295
--- /dev/null
+++ b/src/languages/groovy.js
@@ -0,0 +1,90 @@
+/*
+ Language: Groovy
+ Author: Guillaume Laforge <glaforge at gmail.com>
+ Website: http://glaforge.appspot.com
+ Description: Groovy programming language implementation inspired from Vsevolod's Java mode
+ */
+
+function(hljs) {
+    return {
+        keywords: {
+            typename: 'byte short char int long boolean float double void',
+            literal : 'true false null',
+            keyword:
+                // groovy specific keywords
+            'def as in assert trait ' +
+                // common keywords with Java
+            'super this abstract static volatile transient public private protected synchronized final ' +
+            'class interface enum if else for while switch case break default continue ' +
+            'throw throws try catch finally implements extends new import package return instanceof'
+        },
+
+        contains: [
+            hljs.C_LINE_COMMENT_MODE,
+            {
+                className: 'javadoc',
+                begin: '/\\*\\*', end: '\\*//*',
+                contains: [
+                    {
+                        className: 'javadoctag', begin: '@[A-Za-z]+'
+                    }
+                ]
+            },
+            hljs.C_BLOCK_COMMENT_MODE,
+            {
+                className: 'string',
+                begin: '"""', end: '"""'
+            },
+            {
+                className: 'string',
+                begin: "'''", end: "'''"
+            },
+            {
+                className: 'string',
+                begin: "\\$/", end: "/\\$",
+                relevance: 10
+            },
+            hljs.APOS_STRING_MODE,
+            {
+                className: 'regexp',
+                begin: /~?\/[^\/\n]+\//,
+                contains: [
+                    hljs.BACKSLASH_ESCAPE
+                ]
+            },
+            hljs.QUOTE_STRING_MODE,
+            {
+                className: 'shebang',
+                begin: "^#!/usr/bin/env", end: '$',
+                illegal: '\n'
+            },
+            hljs.BINARY_NUMBER_MODE,
+            {
+                className: 'class',
+                beginKeywords: 'class interface trait enum', end: '{',
+                illegal: ':',
+                contains: [
+                    {beginKeywords: 'extends implements'},
+                    hljs.UNDERSCORE_TITLE_MODE,
+                ]
+            },
+            hljs.C_NUMBER_MODE,
+            {
+                className: 'annotation', begin: '@[A-Za-z]+'
+            },
+            {
+                // highlight map keys and named parameters as strings
+                className: 'string', begin: /[^\?]{0}[A-Za-z0-9_$]+ *:/
+            },
+            {
+                // catch middle element of the ternary operator
+                // to avoid highlight it as a label, named parameter, or map key
+                begin: /\?/, end: /\:/
+            },
+            {
+                // highlight labeled statements
+                className: 'label', begin: '^\\s*[A-Za-z0-9_$]+:'
+            },
+        ]
+    }
+}
diff --git a/src/languages/java.js b/src/languages/java.js
index 7ac5754..4e67fa9 100644
--- a/src/languages/java.js
+++ b/src/languages/java.js
@@ -4,11 +4,12 @@ Author: Vsevolod Solovyov <vsevolod.solovyov at gmail.com>
 */
 
 function(hljs) {
+  var GENERIC_IDENT_RE = hljs.UNDERSCORE_IDENT_RE + '(<' + hljs.UNDERSCORE_IDENT_RE + '>)?';
   var KEYWORDS =
     'false synchronized int abstract float private char boolean static null if const ' +
     'for true while long throw strictfp finally protected import native final return void ' +
     'enum else break transient new catch instanceof byte super volatile case assert short ' +
-    'package default double public try this switch continue throws';
+    'package default double public try this switch continue throws protected public private';
   return {
     aliases: ['jsp'],
     keywords: KEYWORDS,
@@ -17,37 +18,53 @@ function(hljs) {
       {
         className: 'javadoc',
         begin: '/\\*\\*', end: '\\*/',
+        relevance: 0,
         contains: [{
           className: 'javadoctag', begin: '(^|\\s)@[A-Za-z]+'
-        }],
-        relevance: 10
+        }]
       },
       hljs.C_LINE_COMMENT_MODE,
       hljs.C_BLOCK_COMMENT_MODE,
       hljs.APOS_STRING_MODE,
       hljs.QUOTE_STRING_MODE,
       {
-        beginKeywords: 'protected public private', end: /[{;=]/,
+        className: 'class',
+        beginKeywords: 'class interface', end: /[{;=]/, excludeEnd: true,
+        keywords: 'class interface',
+        illegal: /[:"\[\]]/,
+        contains: [
+          {beginKeywords: 'extends implements'},
+          hljs.UNDERSCORE_TITLE_MODE
+        ]
+      },
+      {
+        // this prevents 'new Name(...)' from being recognized as a function definition
+        beginKeywords: 'new', end: /\s/,
+        relevance: 0
+      },
+      {
+        className: 'function',
+        begin: '(' + GENERIC_IDENT_RE + '\\s+)+' + hljs.UNDERSCORE_IDENT_RE + '\\s*\\(', returnBegin: true, end: /[{;=]/,
+        excludeEnd: true,
         keywords: KEYWORDS,
         contains: [
           {
-            className: 'class',
-            beginKeywords: 'class interface', endsWithParent: true, excludeEnd: true,
-            illegal: /[:"\[\]]/,
-            contains: [
-              {
-                beginKeywords: 'extends implements',
-                relevance: 10
-              },
-              hljs.UNDERSCORE_TITLE_MODE
-            ]
+            begin: hljs.UNDERSCORE_IDENT_RE + '\\s*\\(', returnBegin: true,
+            contains: [hljs.UNDERSCORE_TITLE_MODE]
           },
           {
-            begin: hljs.UNDERSCORE_IDENT_RE + '\\s*\\(', returnBegin: true,
+            className: 'params',
+            begin: /\(/, end: /\)/,
+            keywords: KEYWORDS,
             contains: [
-              hljs.UNDERSCORE_TITLE_MODE
+              hljs.APOS_STRING_MODE,
+              hljs.QUOTE_STRING_MODE,
+              hljs.C_NUMBER_MODE,
+              hljs.C_BLOCK_COMMENT_MODE
             ]
-          }
+          },
+          hljs.C_LINE_COMMENT_MODE,
+          hljs.C_BLOCK_COMMENT_MODE
         ]
       },
       hljs.C_NUMBER_MODE,
diff --git a/src/languages/lisp.js b/src/languages/lisp.js
index 7549e88..9a64904 100644
--- a/src/languages/lisp.js
+++ b/src/languages/lisp.js
@@ -28,7 +28,7 @@ function(hljs) {
   var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null});
   var COMMENT = {
     className: 'comment',
-    begin: ';', end: '$'
+    begin: ';', end: '$', relevance: 0
   };
   var VARIABLE = {
     className: 'variable',
@@ -51,7 +51,7 @@ function(hljs) {
       },
       {
         begin: '\\(quote ', end: '\\)',
-        keywords: {title: 'quote'}
+        keywords: 'quote'
       }
     ]
   };
@@ -67,7 +67,7 @@ function(hljs) {
     endsWithParent: true,
     relevance: 0
   };
-  LIST.contains = [{className: 'title', begin: LISP_IDENT_RE}, BODY];
+  LIST.contains = [{className: 'keyword', begin: LISP_IDENT_RE}, BODY];
   BODY.contains = [QUOTED, QUOTED_ATOM, LIST, LITERAL, NUMBER, STRING, COMMENT, VARIABLE, KEYWORD];
 
   return {
diff --git a/src/languages/livecodeserver.js b/src/languages/livecodeserver.js
index 34752e0..a7bebb3 100644
--- a/src/languages/livecodeserver.js
+++ b/src/languages/livecodeserver.js
@@ -1,5 +1,5 @@
 /*
-Language: LiveCode server and revIgniter
+Language: LiveCode
 Author: Ralf Bitter <rabit at revigniter.com>
 Description: Language definition for LiveCode server accounting for revIgniter (a web application framework) characteristics.
 Version: 1.0a
diff --git a/src/languages/makefile.js b/src/languages/makefile.js
index 99de6cd..baea1b4 100644
--- a/src/languages/makefile.js
+++ b/src/languages/makefile.js
@@ -39,6 +39,7 @@ function(hljs) {
       },
       {
         begin: /^\t+/, end: /$/,
+        relevance: 0,
         contains: [
           hljs.QUOTE_STRING_MODE,
           VARIABLE
diff --git a/src/languages/markdown.js b/src/languages/markdown.js
index 201b71a..9e1b832 100644
--- a/src/languages/markdown.js
+++ b/src/languages/markdown.js
@@ -65,7 +65,7 @@ function(hljs) {
       },
       // using links - title and link
       {
-        begin: '\\[.+?\\][\\(\\[].+?[\\)\\]]',
+        begin: '\\[.+?\\][\\(\\[].*?[\\)\\]]',
         returnBegin: true,
         contains: [
           {
@@ -89,17 +89,17 @@ function(hljs) {
         relevance: 10
       },
       {
-        begin: '^\\[\.+\\]:', end: '$',
+        begin: '^\\[\.+\\]:',
         returnBegin: true,
         contains: [
           {
             className: 'link_reference',
-            begin: '\\[', end: '\\]',
-            excludeBegin: true, excludeEnd: true
-          },
-          {
-            className: 'link_url',
-            begin: '\\s', end: '$'
+            begin: '\\[', end: '\\]:',
+            excludeBegin: true, excludeEnd: true,
+            starts: {
+              className: 'link_url',
+              end: '$'
+            }
           }
         ]
       }
diff --git a/src/languages/nginx.js b/src/languages/nginx.js
index 8b60f2a..a411e13 100644
--- a/src/languages/nginx.js
+++ b/src/languages/nginx.js
@@ -35,7 +35,8 @@ function(hljs) {
       },
       {
         className: 'url',
-        begin: '([a-z]+):/', end: '\\s', endsWithParent: true, excludeEnd: true
+        begin: '([a-z]+):/', end: '\\s', endsWithParent: true, excludeEnd: true,
+        contains: [VAR]
       },
       {
         className: 'regexp',
diff --git a/src/languages/objectivec.js b/src/languages/objectivec.js
index 081cf0e..b7a292f 100644
--- a/src/languages/objectivec.js
+++ b/src/languages/objectivec.js
@@ -19,7 +19,7 @@ function(hljs) {
     literal:
     	'false true FALSE TRUE nil YES NO NULL',
     built_in:
-      'NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView ' +
+      'NSString NSData NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView ' +
       'NSView NSViewController NSWindow NSWindowController NSSet NSUUID NSIndexSet ' +
       'UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread ' +
       'UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool ' +
@@ -31,6 +31,7 @@ function(hljs) {
       'UIFont UIApplication NSNotFound NSNotificationCenter NSNotification ' +
       'UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar ' +
       'NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection ' +
+      'NSURLSession NSURLSessionDataTask NSURLSessionDownloadTask NSURLSessionUploadTask NSURLResponse' +
       'UIInterfaceOrientation MPMoviePlayerController dispatch_once_t ' +
       'dispatch_queue_t dispatch_sync dispatch_async dispatch_once'
   };
diff --git a/src/languages/php.js b/src/languages/php.js
index d4e1495..897013b 100644
--- a/src/languages/php.js
+++ b/src/languages/php.js
@@ -88,10 +88,7 @@ function(hljs) {
         beginKeywords: 'class interface', end: '{', excludeEnd: true,
         illegal: /[:\(\$"]/,
         contains: [
-          {
-            beginKeywords: 'extends implements',
-            relevance: 10
-          },
+          {beginKeywords: 'extends implements'},
           hljs.UNDERSCORE_TITLE_MODE
         ]
       },
diff --git a/src/languages/q.js b/src/languages/q.js
new file mode 100644
index 0000000..9ac89eb
--- /dev/null
+++ b/src/languages/q.js
@@ -0,0 +1,27 @@
+/*
+Language: Q
+Author: Sergey Vidyuk <svidyuk at gmail.com>
+Description: K/Q/Kdb+ from Kx Systems
+*/
+function(hljs) {
+  var Q_KEYWORDS = {
+  keyword: 
+    'do while select delete by update from',
+  constant:
+    '0b 1b',
+  built_in: 
+    'neg not null string reciprocal floor ceiling signum mod xbar xlog and or each scan over prior mmu lsq inv md5 ltime gtime count first var dev med cov cor all any rand sums prds mins maxs fills deltas ratios avgs differ prev next rank reverse iasc idesc asc desc msum mcount mavg mdev xrank mmin mmax xprev rotate distinct group where flip type key til get value attr cut set upsert raze union inter except cross sv vs sublist enlist read0 read1 hopen hclose hdel hsym hcount peach system [...]
+  typename: 
+    '`float `double int `timestamp `timespan `datetime `time `boolean `symbol `char `byte `short `long `real `month `date `minute `second `guid'    
+  };
+  return {
+  aliases:['k', 'kdb'],
+  keywords: Q_KEYWORDS, 
+  lexemes: /\b(`?)[A-Za-z0-9_]+\b/, 
+  contains: [ 
+  hljs.C_LINE_COMMENT_MODE,
+    hljs.QUOTE_STRING_MODE,
+    hljs.C_NUMBER_MODE
+     ]
+  };
+}
diff --git a/src/languages/ruby.js b/src/languages/ruby.js
index 8806f91..6dc887c 100644
--- a/src/languages/ruby.js
+++ b/src/languages/ruby.js
@@ -105,13 +105,13 @@ function(hljs) {
     },
     {
       className: 'symbol',
-      begin: ':',
-      contains: [STRING, {begin: RUBY_METHOD_RE}],
+      begin: hljs.UNDERSCORE_IDENT_RE + '(\\!|\\?)?:',
       relevance: 0
     },
     {
       className: 'symbol',
-      begin: hljs.UNDERSCORE_IDENT_RE + '(\\!|\\?)?:',
+      begin: ':',
+      contains: [STRING, {begin: RUBY_METHOD_RE}],
       relevance: 0
     },
     {
@@ -146,45 +146,27 @@ function(hljs) {
   ];
   SUBST.contains = RUBY_DEFAULT_CONTAINS;
   PARAMS.contains = RUBY_DEFAULT_CONTAINS;
-  
+
   var IRB_DEFAULT = [
     {
-      relevance: 1,
-      className: 'output',
-      begin: '^\\s*=> ', end: "$",
-      returnBegin: true,
-      contains: [
-        {
-          className: 'status',
-          begin: '^\\s*=>'
-        },
-        {
-          begin: ' ', end: '$',
-          contains: RUBY_DEFAULT_CONTAINS
-        }
-      ]
+      begin: /^\s*=>/,
+      className: 'status',
+      starts: {
+        end: '$', contains: RUBY_DEFAULT_CONTAINS
+      }
     },
     {
-      relevance: 1,
-      className: 'input',
-      begin: '^[^ ][^=>]*>+ ', end: "$",
-      returnBegin: true,
-      contains: [
-        {
-          className: 'prompt',
-          begin: '^[^ ][^=>]*>+'
-        },
-        {
-          begin: ' ', end: '$',
-          contains: RUBY_DEFAULT_CONTAINS
-        }
-      ]
+      className: 'prompt',
+      begin: /^\S[^=>\n]*>+/,
+      starts: {
+        end: '$', contains: RUBY_DEFAULT_CONTAINS
+      }
     }
   ];
 
   return {
     aliases: ['rb', 'gemspec', 'podspec', 'thor', 'irb'],
     keywords: RUBY_KEYWORDS,
-    contains: IRB_DEFAULT.concat(RUBY_DEFAULT_CONTAINS)
+    contains: [COMMENT].concat(IRB_DEFAULT).concat(RUBY_DEFAULT_CONTAINS)
   };
 }
diff --git a/src/languages/rust.js b/src/languages/rust.js
index 9c9a951..3e9c457 100644
--- a/src/languages/rust.js
+++ b/src/languages/rust.js
@@ -7,15 +7,24 @@ Contributors: Roman Shmatov <romanshmatov at gmail.com>
 function(hljs) {
   return {
     aliases: ['rs'],
-    keywords:
-      'alignof as be box break const continue crate do else enum extern ' +
-      'false fn for if impl in let loop match mod mut offsetof once priv ' +
-      'proc pub pure ref return self sizeof static struct super trait true ' +
-      'type typeof unsafe unsized use virtual while yield ' +
-      'int i8 i16 i32 i64 ' +
-      'uint u8 u32 u64 ' +
-      'float f32 f64 ' +
-      'str char bool',
+    keywords: {
+      keyword:
+        'alignof as be box break const continue crate do else enum extern ' +
+        'false fn for if impl in let loop match mod mut offsetof once priv ' +
+        'proc pub pure ref return self sizeof static struct super trait true ' +
+        'type typeof unsafe unsized use virtual while yield ' +
+        'int i8 i16 i32 i64 ' +
+        'uint u8 u32 u64 ' +
+        'float f32 f64 ' +
+        'str char bool',
+      built_in:
+        'assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! ' +
+        'debug_assert! debug_assert_eq! env! fail! file! format! format_args! ' +
+        'include_bin! include_str! line! local_data_key! module_path! ' +
+        'option_env! print! println! select! stringify! try! unimplemented! ' +
+        'unreachable! vec! write! writeln!'
+    },
+    lexemes: hljs.IDENT_RE + '!?',
     illegal: '</',
     contains: [
       hljs.C_LINE_COMMENT_MODE,
diff --git a/src/languages/scala.js b/src/languages/scala.js
index 0ac495a..102efad 100644
--- a/src/languages/scala.js
+++ b/src/languages/scala.js
@@ -1,61 +1,76 @@
 /*
 Language: Scala
 Author: Jan Berkel <jan.berkel at gmail.com>
+Contributors: Erik Osheim <d_m at plastic-idolatry.com>
 */
 
 function(hljs) {
+
   var ANNOTATION = {
     className: 'annotation', begin: '@[A-Za-z]+'
   };
+
   var STRING = {
     className: 'string',
     begin: 'u?r?"""', end: '"""',
     relevance: 10
   };
+
   var SYMBOL = {
     className: 'symbol',
     begin: '\'\\w[\\w\\d_]*(?!\')'
   };
+
+  var TYPE = {
+    className: 'type',
+    begin: '\\b[A-Z][A-Za-z0-9_]*',
+    relevance: 0
+  };
+
+  var NAME = {
+    className: 'title',
+    begin: /[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,
+    relevance: 0
+  }
+
+  var CLASS = {
+    className: 'class',
+    beginKeywords: 'class object trait type',
+    end: /[:={\[(\n;]/,
+    contains: [{className: 'keyword', beginKeywords: 'extends with', relevance: 10}, NAME]
+  };
+
+  var METHOD = {
+    className: 'function',
+    beginKeywords: 'def val',
+    end: /[:={\[(\n;]/,
+    contains: [NAME]
+  };
+
+  var JAVADOC = {
+    className: 'javadoc',
+    begin: '/\\*\\*', end: '\\*/',
+    contains: [{
+      className: 'javadoctag',
+      begin: '@[A-Za-z]+'
+    }],
+    relevance: 10
+  };
+
   return {
-    keywords:
-      'type yield lazy override def with val var false true sealed abstract private trait ' +
-      'object null if for while throw finally protected extends import final return else ' +
-      'break new catch super class case package default try this match continue throws',
+    keywords: {
+      literal: 'true false null',
+      keyword: 'type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit'
+    },
     contains: [
-      {
-        className: 'javadoc',
-        begin: '/\\*\\*', end: '\\*/',
-        contains: [{
-          className: 'javadoctag',
-          begin: '@[A-Za-z]+'
-        }],
-        relevance: 10
-      },
-      hljs.C_LINE_COMMENT_MODE, hljs.C_BLOCK_COMMENT_MODE,
-      STRING, hljs.QUOTE_STRING_MODE,
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE,
+      STRING,
+      hljs.QUOTE_STRING_MODE,
       SYMBOL,
-      {
-        className: 'class',
-        begin: '((case )?class |object |trait )', // beginKeywords won't work because a single "case" shouldn't start this mode
-        end: '({|$)', excludeEnd: true,
-        illegal: ':',
-        keywords: 'case class trait object',
-        contains: [
-          {
-            beginKeywords: 'extends with',
-            relevance: 10
-          },
-          hljs.UNDERSCORE_TITLE_MODE,
-          {
-            className: 'params',
-            begin: '\\(', end: '\\)',
-            contains: [
-              hljs.QUOTE_STRING_MODE, STRING,
-              ANNOTATION
-            ]
-          }
-        ]
-      },
+      TYPE,
+      METHOD,
+      CLASS,
       hljs.C_NUMBER_MODE,
       ANNOTATION
     ]
diff --git a/src/languages/scheme.js b/src/languages/scheme.js
new file mode 100644
index 0000000..7a12485
--- /dev/null
+++ b/src/languages/scheme.js
@@ -0,0 +1,126 @@
+/*
+Language: Scheme
+Description: Keywords based on http://community.schemewiki.org/?scheme-keywords
+Author: JP Verkamp <me at jverkamp.com>
+Contributors: Ivan Sagalaev <maniac at softwaremaniacs.org>
+Origin: clojure.js
+*/
+
+function(hljs) {
+  var SCHEME_IDENT_RE = '[^\\(\\)\\[\\]\\{\\}",\'`;#|\\\\\\s]+';
+  var SCHEME_SIMPLE_NUMBER_RE = '(\\-|\\+)?\\d+([./]\\d+)?';
+  var SCHEME_COMPLEX_NUMBER_RE = SCHEME_SIMPLE_NUMBER_RE + '[+\\-]' + SCHEME_SIMPLE_NUMBER_RE + 'i';
+  var BUILTINS = {
+    built_in:
+      'case-lambda call/cc class define-class exit-handler field import ' +
+      'inherit init-field interface let*-values let-values let/ec mixin ' +
+      'opt-lambda override protect provide public rename require ' +
+      'require-for-syntax syntax syntax-case syntax-error unit/sig unless ' +
+      'when with-syntax and begin call-with-current-continuation ' +
+      'call-with-input-file call-with-output-file case cond define ' +
+      'define-syntax delay do dynamic-wind else for-each if lambda let let* ' +
+      'let-syntax letrec letrec-syntax map or syntax-rules \' * + , ,@ - ... / ' +
+      '; < <= = => > >= ` abs acos angle append apply asin assoc assq assv atan ' +
+      'boolean? caar cadr call-with-input-file call-with-output-file ' +
+      'call-with-values car cdddar cddddr cdr ceiling char->integer ' +
+      'char-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? ' +
+      'char-downcase char-lower-case? char-numeric? char-ready? char-upcase ' +
+      'char-upper-case? char-whitespace? char<=? char<? char=? char>=? char>? ' +
+      'char? close-input-port close-output-port complex? cons cos ' +
+      'current-input-port current-output-port denominator display eof-object? ' +
+      'eq? equal? eqv? eval even? exact->inexact exact? exp expt floor ' +
+      'force gcd imag-part inexact->exact inexact? input-port? integer->char ' +
+      'integer? interaction-environment lcm length list list->string ' +
+      'list->vector list-ref list-tail list? load log magnitude make-polar ' +
+      'make-rectangular make-string make-vector max member memq memv min ' +
+      'modulo negative? newline not null-environment null? number->string ' +
+      'number? numerator odd? open-input-file open-output-file output-port? ' +
+      'pair? peek-char port? positive? procedure? quasiquote quote quotient ' +
+      'rational? rationalize read read-char real-part real? remainder reverse ' +
+      'round scheme-report-environment set! set-car! set-cdr! sin sqrt string ' +
+      'string->list string->number string->symbol string-append string-ci<=? ' +
+      'string-ci<? string-ci=? string-ci>=? string-ci>? string-copy ' +
+      'string-fill! string-length string-ref string-set! string<=? string<? ' +
+      'string=? string>=? string>? string? substring symbol->string symbol? ' +
+      'tan transcript-off transcript-on truncate values vector ' +
+      'vector->list vector-fill! vector-length vector-ref vector-set! ' +
+      'with-input-from-file with-output-to-file write write-char zero?'
+  };
+
+  var SHEBANG = {
+    className: 'shebang',
+    begin: '^#!',
+    end: '$'
+  };
+
+  var LITERAL = {
+    className: 'literal',
+    begin: '(#t|#f|#\\\\' + SCHEME_IDENT_RE + '|#\\\\.)'
+  };
+
+  var NUMBER = {
+    className: 'number',
+    variants: [
+      { begin: SCHEME_SIMPLE_NUMBER_RE, relevance: 0 },
+      { begin: SCHEME_COMPLEX_NUMBER_RE, relevance: 0 },
+      { begin: '#b[0-1]+(/[0-1]+)?' },
+      { begin: '#o[0-7]+(/[0-7]+)?' },
+      { begin: '#x[0-9a-f]+(/[0-9a-f]+)?' }
+    ]
+  };
+
+  var STRING = hljs.QUOTE_STRING_MODE;
+
+  var REGULAR_EXPRESSION = {
+    className: 'regexp',
+    begin: '#[pr]x"',
+    end: '[^\\\\]"'
+  };
+
+  var COMMENT = {
+    className: 'comment',
+    variants: [
+      { begin: ';',  end: '$', relevance: 0 },
+      { begin: '#\\|', end: '\\|#' }
+    ]
+  };
+
+  var IDENT = {
+    begin: SCHEME_IDENT_RE,
+    relevance: 0
+  };
+
+  var QUOTED_IDENT = {
+    className: 'variable',
+    begin: '\'' + SCHEME_IDENT_RE
+  };
+
+  var BODY = {
+    endsWithParent: true,
+    relevance: 0
+  };
+
+  var LIST = {
+    className: 'list',
+    variants: [
+      { begin: '\\(', end: '\\)' },
+      { begin: '\\[', end: '\\]' }
+    ],
+    contains: [
+      {
+        className: 'keyword',
+        begin: SCHEME_IDENT_RE,
+        lexemes: SCHEME_IDENT_RE,
+        keywords: BUILTINS
+      },
+      BODY
+    ]
+  };
+
+  BODY.contains = [LITERAL, NUMBER, STRING, COMMENT, IDENT, QUOTED_IDENT, LIST];
+
+  return {
+    illegal: /\S/,
+    contains: [SHEBANG, NUMBER, STRING, COMMENT, QUOTED_IDENT, LIST]
+  };
+}
diff --git a/src/languages/swift.js b/src/languages/swift.js
index a62c221..194e710 100644
--- a/src/languages/swift.js
+++ b/src/languages/swift.js
@@ -66,7 +66,7 @@ function(hljs) {
       NUMBERS,
       {
         className: 'func',
-        beginKeywords: 'func', excludeEnd: true,
+        beginKeywords: 'func', end: '{', excludeEnd: true,
         contains: [
           hljs.inherit(hljs.TITLE_MODE, {
             begin: /[A-Za-z$_][0-9A-Za-z$_]*/,
@@ -80,9 +80,13 @@ function(hljs) {
           {
             className: 'params',
             begin: /\(/, end: /\)/,
+            keywords: SWIFT_KEYWORDS,
             contains: [
-              hljs.C_LINE_COMMENT_MODE,
-              hljs.C_BLOCK_COMMENT_MODE
+              'self',
+              NUMBERS,
+              QUOTE_STRING_MODE,
+              hljs.C_BLOCK_COMMENT_MODE,
+              {begin: ':'} // relevance booster
             ],
             illegal: /["']/
           }
diff --git a/src/languages/xml.js b/src/languages/xml.js
index 2e68478..6ba9553 100644
--- a/src/languages/xml.js
+++ b/src/languages/xml.js
@@ -97,7 +97,7 @@ function(hljs) {
         begin: '</?', end: '/?>',
         contains: [
           {
-            className: 'title', begin: '[^ /><]+', relevance: 0
+            className: 'title', begin: /[^ \/><\n\t]+/, relevance: 0
           },
           TAG_INTERNALS
         ]
diff --git a/src/package.json b/src/package.json
deleted file mode 100644
index 4781f6a..0000000
--- a/src/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{ "name" : "highlight.js"
-, "description" : "Syntax highlighting with language autodetection."
-, "keywords" : ["highlight", "syntax"]
-, "homepage" : "http://highlightjs.org/"
-, "version" : "8.1.0"
-, "author" :
-  { "name": "Ivan Sagalaev"
-  , "email": "maniac at softwaremaniacs.org"
-  }
-, "contributors" : []
-, "bugs" : { "url" : "https://github.com/isagalaev/highlight.js/issues" }
-, "licenses" : [
-    { "type" : "BSD"
-    , "url" : "https://github.com/isagalaev/highlight.js/blob/master/LICENSE"
-    }
-  ]
-, "repository" :
-  { "type" : "git"
-  , "url" : "git://github.com/isagalaev/highlight.js.git"
-  }
-, "main" : "./lib/index.js"
-, "scripts" : {}
-, "engines" : { "node" : "*" }
-}
diff --git a/src/styles/arta.css b/src/styles/arta.css
index b8ed3db..1675e4e 100644
--- a/src/styles/arta.css
+++ b/src/styles/arta.css
@@ -8,6 +8,7 @@ Author: pumbur <pumbur at pumbur.net>
   overflow-x: auto;
   padding: 0.5em;
   background: #222;
+  -webkit-text-size-adjust: none;
 }
 
 .profile .hljs-header *,
@@ -53,9 +54,9 @@ Author: pumbur <pumbur at pumbur.net>
 
 .hljs-built_in,
 .hljs-literal,
-.vhdl .hljs-typename,
+.hljs-type,
+.hljs-typename,
 .go .hljs-constant,
-.go .hljs-typename,
 .ini .hljs-keyword,
 .lua .hljs-title,
 .perl .hljs-variable,
@@ -79,8 +80,6 @@ Author: pumbur <pumbur at pumbur.net>
 .css .hljs-id,
 .css .hljs-pseudo,
 .css .hljs-attr_selector,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
 .hljs-winutils,
 .tex .hljs-command,
 .hljs-request,
@@ -115,6 +114,7 @@ Author: pumbur <pumbur at pumbur.net>
 
 .hljs-yardoctag,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .profile .hljs-header,
 .ini .hljs-title,
 .apache .hljs-tag,
diff --git a/src/styles/ascetic.css b/src/styles/ascetic.css
index 7b87f6f..368c514 100644
--- a/src/styles/ascetic.css
+++ b/src/styles/ascetic.css
@@ -10,6 +10,7 @@ Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac at SoftwareManiac
   padding: 0.5em;
   background: white;
   color: black;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-string,
@@ -39,7 +40,6 @@ Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac at SoftwareManiac
 .hljs-tag .hljs-title,
 .ini .hljs-title,
 .lisp .hljs-title,
-.clojure .hljs-title,
 .http .hljs-title,
 .nginx .hljs-title,
 .css .hljs-tag,
diff --git a/src/styles/atelier-dune.dark.css b/src/styles/atelier-dune.dark.css
index d27ce9b..639c49d 100644
--- a/src/styles/atelier-dune.dark.css
+++ b/src/styles/atelier-dune.dark.css
@@ -81,6 +81,7 @@
   background: #292824;
   color: #a6a28c;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/atelier-dune.light.css b/src/styles/atelier-dune.light.css
index d200c0b..09da34b 100644
--- a/src/styles/atelier-dune.light.css
+++ b/src/styles/atelier-dune.light.css
@@ -81,6 +81,7 @@
   background: #fefbec;
   color: #6e6b5e;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/atelier-forest.dark.css b/src/styles/atelier-forest.dark.css
index 370b66d..2024a1e 100644
--- a/src/styles/atelier-forest.dark.css
+++ b/src/styles/atelier-forest.dark.css
@@ -81,6 +81,7 @@
   background: #2c2421;
   color: #a8a19f;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/atelier-forest.light.css b/src/styles/atelier-forest.light.css
index 4ae2af8..0c8ae45 100644
--- a/src/styles/atelier-forest.light.css
+++ b/src/styles/atelier-forest.light.css
@@ -81,6 +81,7 @@
   background: #f1efee;
   color: #68615e;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/atelier-heath.dark.css b/src/styles/atelier-heath.dark.css
index 87bcda0..c155d34 100644
--- a/src/styles/atelier-heath.dark.css
+++ b/src/styles/atelier-heath.dark.css
@@ -81,6 +81,7 @@
   background: #292329;
   color: #ab9bab;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/atelier-heath.light.css b/src/styles/atelier-heath.light.css
index 07fa895..40f4090 100644
--- a/src/styles/atelier-heath.light.css
+++ b/src/styles/atelier-heath.light.css
@@ -81,6 +81,7 @@
   background: #f7f3f7;
   color: #695d69;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/atelier-lakeside.dark.css b/src/styles/atelier-lakeside.dark.css
index 10f2b30..8f1aa6a 100644
--- a/src/styles/atelier-lakeside.dark.css
+++ b/src/styles/atelier-lakeside.dark.css
@@ -81,6 +81,7 @@
   background: #1f292e;
   color: #7ea2b4;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/atelier-lakeside.light.css b/src/styles/atelier-lakeside.light.css
index 749049a..96426d3 100644
--- a/src/styles/atelier-lakeside.light.css
+++ b/src/styles/atelier-lakeside.light.css
@@ -81,6 +81,7 @@
   background: #ebf8ff;
   color: #516d7b;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/atelier-seaside.dark.css b/src/styles/atelier-seaside.dark.css
index 94a3cdb..72f8430 100644
--- a/src/styles/atelier-seaside.dark.css
+++ b/src/styles/atelier-seaside.dark.css
@@ -81,6 +81,7 @@
   background: #242924;
   color: #8ca68c;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/atelier-seaside.light.css b/src/styles/atelier-seaside.light.css
index 28f187c..dff5767 100644
--- a/src/styles/atelier-seaside.light.css
+++ b/src/styles/atelier-seaside.light.css
@@ -81,6 +81,7 @@
   background: #f0fff0;
   color: #5e6e5e;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/brown_paper.css b/src/styles/brown_paper.css
index 73fee33..9490038 100644
--- a/src/styles/brown_paper.css
+++ b/src/styles/brown_paper.css
@@ -9,6 +9,7 @@ Brown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7 at ukr.net>
   overflow-x: auto;
   padding: 0.5em;
   background:#b7a68e url(./brown_papersq.png);
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-keyword,
@@ -16,8 +17,6 @@ Brown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7 at ukr.net>
 .hljs-change,
 .hljs-winutils,
 .hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
 .nginx .hljs-title,
 .tex .hljs-special,
 .hljs-request,
@@ -34,7 +33,7 @@ Brown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7 at ukr.net>
 
 .hljs-string,
 .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .hljs-tag .hljs-value,
 .css .hljs-rules .hljs-value,
 .hljs-preprocessor,
@@ -63,8 +62,8 @@ Brown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7 at ukr.net>
 }
 
 .hljs-comment,
-.java .hljs-annotation,
-.python .hljs-decorator,
+.hljs-annotation,
+.hljs-decorator,
 .hljs-template_comment,
 .hljs-pi,
 .hljs-doctype,
@@ -80,8 +79,9 @@ Brown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7 at ukr.net>
 .hljs-literal,
 .css .hljs-id,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .vbscript .hljs-built_in,
 .rsl .hljs-built_in,
 .smalltalk .hljs-class,
diff --git a/src/styles/codepen-embed.css b/src/styles/codepen-embed.css
index 0526730..578799c 100644
--- a/src/styles/codepen-embed.css
+++ b/src/styles/codepen-embed.css
@@ -11,6 +11,7 @@
   background: #222;
   color: #fff;
   font-family: Menlo, Monaco, 'Andale Mono', 'Lucida Console', 'Courier New', monospace;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
diff --git a/src/styles/color-brewer.css b/src/styles/color-brewer.css
index 8cb392f..1e0f02e 100644
--- a/src/styles/color-brewer.css
+++ b/src/styles/color-brewer.css
@@ -11,13 +11,12 @@ Ported by Fabrício Tavares de Oliveira
   overflow-x: auto;
   padding: 0.5em;
   background: #fff;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs,
 .hljs-subst,
 .hljs-tag .hljs-title,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
 .nginx .hljs-title {
   color: #000;
 }
@@ -98,6 +97,7 @@ Ported by Fabrício Tavares de Oliveira
 .hljs-shebang,
 .apache .hljs-sqbracket,
 .nginx .hljs-built_in,
+.hljs-list .hljs-built_in,
 .tex .hljs-formula,
 .erlang_repl .hljs-reserved,
 .hljs-prompt,
@@ -121,12 +121,14 @@ Ported by Fabrício Tavares de Oliveira
 .css .hljs-tag,
 .hljs-javadoctag,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .hljs-yardoctag,
 .smalltalk .hljs-class,
 .hljs-winutils,
 .bash .hljs-variable,
 .apache .hljs-tag,
-.go .hljs-typename,
+.hljs-type,
+.hljs-typename,
 .tex .hljs-command,
 .asciidoc .hljs-strong,
 .markdown .hljs-strong,
diff --git a/src/styles/dark.css b/src/styles/dark.css
index 4f9b9fa..81693c1 100644
--- a/src/styles/dark.css
+++ b/src/styles/dark.css
@@ -9,6 +9,7 @@ Dark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac at SoftwareManiacs.Or
   overflow-x: auto;
   padding: 0.5em;
   background: #444;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-keyword,
@@ -16,8 +17,6 @@ Dark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac at SoftwareManiacs.Or
 .hljs-change,
 .hljs-winutils,
 .hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
 .nginx .hljs-title,
 .tex .hljs-special {
   color: white;
@@ -30,7 +29,7 @@ Dark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac at SoftwareManiacs.Or
 
 .hljs-string,
 .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .ini .hljs-title,
 .hljs-tag .hljs-value,
 .css .hljs-rules .hljs-value,
@@ -62,8 +61,8 @@ Dark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac at SoftwareManiacs.Or
 }
 
 .hljs-comment,
-.java .hljs-annotation,
-.python .hljs-decorator,
+.hljs-annotation,
+.hljs-decorator,
 .hljs-template_comment,
 .hljs-pi,
 .hljs-doctype,
@@ -79,7 +78,8 @@ Dark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac at SoftwareManiacs.Or
 .hljs-title,
 .css .hljs-id,
 .hljs-phpdoc,
-.haskell .hljs-type,
+.hljs-dartdoc,
+.hljs-type,
 .vbscript .hljs-built_in,
 .rsl .hljs-built_in,
 .smalltalk .hljs-class,
diff --git a/src/styles/default.css b/src/styles/default.css
index e5bd280..bdaaa35 100644
--- a/src/styles/default.css
+++ b/src/styles/default.css
@@ -9,13 +9,12 @@ Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac at SoftwareManiac
   overflow-x: auto;
   padding: 0.5em;
   background: #f0f0f0;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs,
 .hljs-subst,
 .hljs-tag .hljs-title,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
 .nginx .hljs-title {
   color: black;
 }
@@ -117,12 +116,14 @@ Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac at SoftwareManiac
 .css .hljs-tag,
 .hljs-javadoctag,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .hljs-yardoctag,
 .smalltalk .hljs-class,
 .hljs-winutils,
 .bash .hljs-variable,
 .apache .hljs-tag,
-.go .hljs-typename,
+.hljs-type,
+.hljs-typename,
 .tex .hljs-command,
 .asciidoc .hljs-strong,
 .markdown .hljs-strong,
diff --git a/src/styles/docco.css b/src/styles/docco.css
index 599fae8..21198b4 100644
--- a/src/styles/docco.css
+++ b/src/styles/docco.css
@@ -8,6 +8,7 @@ Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine
   padding: 0.5em;
   color: #000;
   background: #f8f8ff;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
@@ -37,6 +38,7 @@ Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine
 .hljs-string,
 .hljs-tag .hljs-value,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .tex .hljs-formula {
   color: #219161;
 }
diff --git a/src/styles/far.css b/src/styles/far.css
index 444d956..47e0d99 100644
--- a/src/styles/far.css
+++ b/src/styles/far.css
@@ -9,6 +9,7 @@ FAR Style (c) MajestiC <majestic2k at gmail.com>
   overflow-x: auto;
   padding: 0.5em;
   background: #000080;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs,
@@ -34,7 +35,6 @@ FAR Style (c) MajestiC <majestic2k at gmail.com>
 .apache .hljs-tag,
 .apache .hljs-cbracket,
 .tex .hljs-command,
-.clojure .hljs-title,
 .coffeescript .hljs-attribute {
   color: #ff0;
 }
@@ -42,7 +42,7 @@ FAR Style (c) MajestiC <majestic2k at gmail.com>
 .hljs-keyword,
 .css .hljs-id,
 .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .vbscript .hljs-built_in,
 .rsl .hljs-built_in,
 .smalltalk .hljs-class,
@@ -52,15 +52,15 @@ FAR Style (c) MajestiC <majestic2k at gmail.com>
 .hljs-change,
 .hljs-envvar,
 .bash .hljs-variable,
-.tex .hljs-special,
-.clojure .hljs-built_in {
+.tex .hljs-special {
   color: #fff;
 }
 
 .hljs-comment,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .hljs-javadoc,
-.java .hljs-annotation,
+.hljs-annotation,
 .hljs-template_comment,
 .hljs-deletion,
 .apache .hljs-sqbracket,
@@ -78,7 +78,7 @@ FAR Style (c) MajestiC <majestic2k at gmail.com>
   color: #0f0;
 }
 
-.python .hljs-decorator,
+.hljs-decorator,
 .django .hljs-filter .hljs-argument,
 .smalltalk .hljs-localvars,
 .smalltalk .hljs-array,
@@ -96,7 +96,7 @@ FAR Style (c) MajestiC <majestic2k at gmail.com>
 .hljs-keyword,
 .css .hljs-id,
 .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .vbscript .hljs-built_in,
 .rsl .hljs-built_in,
 .smalltalk .hljs-class,
diff --git a/src/styles/foundation.css b/src/styles/foundation.css
index 3c4ea99..5407dc2 100644
--- a/src/styles/foundation.css
+++ b/src/styles/foundation.css
@@ -11,6 +11,7 @@ Date: 2013-04-02
   overflow-x: auto;
   padding: 0.5em;
   background: #eee;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-header,
diff --git a/src/styles/github.css b/src/styles/github.css
index 47fc265..34b1744 100644
--- a/src/styles/github.css
+++ b/src/styles/github.css
@@ -10,6 +10,7 @@ github.com style (c) Vasily Polovnyov <vast at whiteants.net>
   padding: 0.5em;
   color: #333;
   background: #f8f8f8;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
@@ -35,33 +36,32 @@ github.com style (c) Vasily Polovnyov <vast at whiteants.net>
 .hljs-number,
 .hljs-hexcolor,
 .ruby .hljs-constant {
-  color: #099;
+  color: #008080;
 }
 
 .hljs-string,
 .hljs-tag .hljs-value,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .tex .hljs-formula {
   color: #d14;
 }
 
 .hljs-title,
 .hljs-id,
-.coffeescript .hljs-params,
 .scss .hljs-preprocessor {
   color: #900;
   font-weight: bold;
 }
 
 .javascript .hljs-title,
-.lisp .hljs-title,
-.clojure .hljs-title,
+.hljs-list .hljs-keyword,
 .hljs-subst {
   font-weight: normal;
 }
 
 .hljs-class .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .vhdl .hljs-literal,
 .tex .hljs-command {
   color: #458;
@@ -89,14 +89,14 @@ github.com style (c) Vasily Polovnyov <vast at whiteants.net>
 .hljs-symbol,
 .ruby .hljs-symbol .hljs-string,
 .lisp .hljs-keyword,
+.clojure .hljs-keyword,
+.scheme .hljs-keyword,
 .tex .hljs-special,
 .hljs-prompt {
   color: #990073;
 }
 
-.hljs-built_in,
-.lisp .hljs-title,
-.clojure .hljs-built_in {
+.hljs-built_in {
   color: #0086b3;
 }
 
diff --git a/src/styles/googlecode.css b/src/styles/googlecode.css
index fd23736..e893984 100644
--- a/src/styles/googlecode.css
+++ b/src/styles/googlecode.css
@@ -10,6 +10,7 @@ Google Code style (c) Aahan Krish <geekpanth3r at gmail.com>
   padding: 0.5em;
   background: white;
   color: black;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
@@ -20,8 +21,7 @@ Google Code style (c) Aahan Krish <geekpanth3r at gmail.com>
 
 .hljs-keyword,
 .method,
-.hljs-list .hljs-title,
-.clojure .hljs-built_in,
+.hljs-list .hljs-keyword,
 .nginx .hljs-title,
 .hljs-tag .hljs-title,
 .setting .hljs-value,
@@ -70,11 +70,12 @@ Google Code style (c) Aahan Krish <geekpanth3r at gmail.com>
 }
 
 .hljs-class .hljs-title,
-.haskell .hljs-type,
 .smalltalk .hljs-class,
 .hljs-javadoctag,
 .hljs-yardoctag,
 .hljs-phpdoc,
+.hljs-dartdoc,
+.hljs-type,
 .hljs-typename,
 .hljs-tag .hljs-attribute,
 .hljs-doctype,
@@ -82,8 +83,7 @@ Google Code style (c) Aahan Krish <geekpanth3r at gmail.com>
 .hljs-built_in,
 .setting,
 .hljs-params,
-.hljs-variable,
-.clojure .hljs-title {
+.hljs-variable {
   color: #606;
 }
 
diff --git a/src/styles/hybrid.css b/src/styles/hybrid.css
index f6c1427..cd38d9e 100644
--- a/src/styles/hybrid.css
+++ b/src/styles/hybrid.css
@@ -10,6 +10,7 @@ vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid)
   overflow-x: auto;
   padding: 0.5em;
   background: #1d1f21;
+  -webkit-text-size-adjust: none;
 }
 
 /*selection color*/
@@ -139,7 +140,8 @@ vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid)
 
 
 /*color: fg_orange*/
-.hljs-typename ,
+.hljs-type,
+.hljs-typename,
 .hljs-inheritance .hljs-parent,
 .hljs-constant,
 .hljs-built_in,
diff --git a/src/styles/idea.css b/src/styles/idea.css
index 576bc62..612908b 100644
--- a/src/styles/idea.css
+++ b/src/styles/idea.css
@@ -10,6 +10,7 @@ Intellij Idea-like styling (c) Vasily Polovnyov <vast at whiteants.net>
   padding: 0.5em;
   color: #000;
   background: #fff;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-subst,
@@ -56,8 +57,7 @@ Intellij Idea-like styling (c) Vasily Polovnyov <vast at whiteants.net>
 .css .hljs-function,
 .ini .hljs-title,
 .css .hljs-class,
-.hljs-list .hljs-title,
-.clojure .hljs-title,
+.hljs-list .hljs-keyword,
 .nginx .hljs-title,
 .tex .hljs-command,
 .hljs-request,
@@ -100,6 +100,7 @@ Intellij Idea-like styling (c) Vasily Polovnyov <vast at whiteants.net>
 }
 
 .hljs-phpdoc,
+.hljs-dartdoc,
 .hljs-yardoctag,
 .hljs-javadoctag {
   text-decoration: underline;
diff --git a/src/styles/ir_black.css b/src/styles/ir_black.css
index d92dc66..9041976 100644
--- a/src/styles/ir_black.css
+++ b/src/styles/ir_black.css
@@ -8,6 +8,7 @@
   padding: 0.5em;
   background: #000;
   color: #f8f8f8;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-shebang,
@@ -57,12 +58,13 @@
 .hljs-pi,
 .hljs-decorator,
 .tex .hljs-special,
-.haskell .hljs-type,
+.hljs-type,
 .hljs-constant,
 .smalltalk .hljs-class,
 .hljs-javadoctag,
 .hljs-yardoctag,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .nginx .hljs-built_in {
   color: #ffffb6;
 }
diff --git a/src/styles/kimbie.dark.css b/src/styles/kimbie.dark.css
index e5166c7..08e941a 100644
--- a/src/styles/kimbie.dark.css
+++ b/src/styles/kimbie.dark.css
@@ -55,7 +55,7 @@
 
 /* Kimbie Aqua */
 .css .hljs-hexcolor {
-  color:: #088649;
+  color: #088649;
 }
 
 /* Kimbie Blue */
@@ -82,6 +82,7 @@
   background: #221a0f;
   color: #d3af86;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/kimbie.light.css b/src/styles/kimbie.light.css
index 8ccbe49..27576f4 100644
--- a/src/styles/kimbie.light.css
+++ b/src/styles/kimbie.light.css
@@ -82,6 +82,7 @@
   background: #fbebd4;
   color: #84613d;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/magula.css b/src/styles/magula.css
index a977678..4263927 100644
--- a/src/styles/magula.css
+++ b/src/styles/magula.css
@@ -12,12 +12,11 @@ Music: Aphex Twin / Xtal
   overflow-x: auto;
   padding: 0.5em;
   background-color: #f4f4f4;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs,
-.hljs-subst,
-.lisp .hljs-title,
-.clojure .hljs-built_in {
+.hljs-subst {
   color: black;
 }
 
@@ -86,6 +85,7 @@ Music: Aphex Twin / Xtal
 .hljs-keyword,
 .hljs-id,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .hljs-title,
 .hljs-built_in,
 .smalltalk .hljs-class,
diff --git a/src/styles/mono-blue.css b/src/styles/mono-blue.css
index ec837db..157fa9b 100644
--- a/src/styles/mono-blue.css
+++ b/src/styles/mono-blue.css
@@ -6,6 +6,11 @@
   overflow-x: auto;
   padding: 0.5em;
   background: #eaeef3;
+  -webkit-text-size-adjust: none;
+}
+
+.hljs,
+.hljs-list .hljs-built_in {
   color: #00193a;
 }
 
diff --git a/src/styles/monokai.css b/src/styles/monokai.css
index bf1a13b..89165da 100644
--- a/src/styles/monokai.css
+++ b/src/styles/monokai.css
@@ -7,6 +7,7 @@ Monokai style - ported by Luigi Maselli - http://grigio.org
   overflow-x: auto;
   padding: 0.5em;
   background: #272822;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-tag,
@@ -17,8 +18,6 @@ Monokai style - ported by Luigi Maselli - http://grigio.org
 .hljs-change,
 .hljs-winutils,
 .hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
 .nginx .hljs-title,
 .tex .hljs-special {
   color: #f92672;
@@ -55,7 +54,7 @@ Monokai style - ported by Luigi Maselli - http://grigio.org
 .hljs-subst,
 .hljs-title,
 .hljs-emphasis,
-.haskell .hljs-type,
+.hljs-type,
 .hljs-preprocessor,
 .hljs-pragma,
 .ruby .hljs-class .hljs-parent,
@@ -80,11 +79,11 @@ Monokai style - ported by Luigi Maselli - http://grigio.org
 }
 
 .hljs-comment,
-.java .hljs-annotation,
+.hljs-annotation,
 .smartquote,
 .hljs-blockquote,
 .hljs-horizontal_rule,
-.python .hljs-decorator,
+.hljs-decorator,
 .hljs-template_comment,
 .hljs-pi,
 .hljs-doctype,
@@ -99,9 +98,10 @@ Monokai style - ported by Luigi Maselli - http://grigio.org
 .hljs-literal,
 .css .hljs-id,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .hljs-title,
 .hljs-header,
-.haskell .hljs-type,
+.hljs-type,
 .vbscript .hljs-built_in,
 .rsl .hljs-built_in,
 .smalltalk .hljs-class,
diff --git a/src/styles/monokai_sublime.css b/src/styles/monokai_sublime.css
index afb70df..e3aa98c 100644
--- a/src/styles/monokai_sublime.css
+++ b/src/styles/monokai_sublime.css
@@ -9,6 +9,7 @@ Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-lic
   overflow-x: auto;
   padding: 0.5em;
   background: #23241f;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs,
@@ -66,8 +67,6 @@ Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-lic
 .hljs-change,
 .hljs-winutils,
 .hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
 .nginx .hljs-title,
 .tex .hljs-special,
 .hljs-header,
@@ -99,7 +98,7 @@ Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-lic
 .hljs-string,
 .css .hljs-id,
 .hljs-subst,
-.haskell .hljs-type,
+.hljs-type,
 .ruby .hljs-class .hljs-parent,
 .hljs-built_in,
 .django .hljs-template_tag,
@@ -124,8 +123,8 @@ Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-lic
 
 .hljs-comment,
 .hljs-javadoc,
-.java .hljs-annotation,
-.python .hljs-decorator,
+.hljs-annotation,
+.hljs-decorator,
 .hljs-template_comment,
 .hljs-pi,
 .hljs-doctype,
diff --git a/src/styles/obsidian.css b/src/styles/obsidian.css
index 1116c8a..9c09ec2 100644
--- a/src/styles/obsidian.css
+++ b/src/styles/obsidian.css
@@ -8,6 +8,7 @@
   overflow-x: auto;
   padding: 0.5em;
   background: #282b2e;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-keyword,
@@ -15,8 +16,6 @@
 .hljs-change,
 .hljs-winutils,
 .hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
 .nginx .hljs-title,
 .css .hljs-id,
 .tex .hljs-special {
@@ -79,7 +78,7 @@
 .hljs-bullet,
 .hljs-subst,
 .hljs-emphasis,
-.haskell .hljs-type,
+.hljs-type,
 .hljs-preprocessor,
 .hljs-pragma,
 .ruby .hljs-class .hljs-parent,
@@ -108,10 +107,10 @@
 }
 
 .hljs-comment,
-.java .hljs-annotation,
+.hljs-annotation,
 .hljs-blockquote,
 .hljs-horizontal_rule,
-.python .hljs-decorator,
+.hljs-decorator,
 .hljs-template_comment,
 .hljs-pi,
 .hljs-deletion,
@@ -125,9 +124,10 @@
 .hljs-literal,
 .css .hljs-id,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .hljs-title,
 .hljs-header,
-.haskell .hljs-type,
+.hljs-type,
 .vbscript .hljs-built_in,
 .rsl .hljs-built_in,
 .smalltalk .hljs-class,
diff --git a/src/styles/paraiso.dark.css b/src/styles/paraiso.dark.css
index 0c895f6..4a803d4 100644
--- a/src/styles/paraiso.dark.css
+++ b/src/styles/paraiso.dark.css
@@ -81,6 +81,7 @@
   background: #2f1e2e;
   color: #a39e9b;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/paraiso.light.css b/src/styles/paraiso.light.css
index 8c2d64e..685333f 100644
--- a/src/styles/paraiso.light.css
+++ b/src/styles/paraiso.light.css
@@ -81,6 +81,7 @@
   background: #e7e9db;
   color: #4f424c;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/pojoaque.css b/src/styles/pojoaque.css
index edfba2c..17a5687 100644
--- a/src/styles/pojoaque.css
+++ b/src/styles/pojoaque.css
@@ -12,6 +12,7 @@ Based on Solarized Style from http://ethanschoonover.com/solarized
   padding: 0.5em;
   color: #dccf8f;
   background: url(./pojoaque.jpg) repeat scroll left top #181914;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
@@ -31,7 +32,7 @@ Based on Solarized Style from http://ethanschoonover.com/solarized
 .method,
 .hljs-addition,
 .css .hljs-tag,
-.clojure .hljs-title,
+.hljs-list .hljs-keyword,
 .nginx .hljs-title {
   color: #b64926;
 }
@@ -41,6 +42,7 @@ Based on Solarized Style from http://ethanschoonover.com/solarized
 .hljs-string,
 .hljs-tag .hljs-value,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .tex .hljs-formula,
 .hljs-regexp,
 .hljs-hexcolor {
@@ -53,8 +55,6 @@ Based on Solarized Style from http://ethanschoonover.com/solarized
 .hljs-chunk,
 .hljs-decorator,
 .hljs-built_in,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
 .hljs-identifier,
 .hljs-id {
   color: #ffb03b;
@@ -67,7 +67,7 @@ Based on Solarized Style from http://ethanschoonover.com/solarized
 .hljs-constant,
 .hljs-class .hljs-title,
 .hljs-parent,
-.haskell .hljs-type {
+.hljs-type {
   color: #b58900;
 }
 
diff --git a/src/styles/railscasts.css b/src/styles/railscasts.css
index 12e4f4d..8d28fc0 100644
--- a/src/styles/railscasts.css
+++ b/src/styles/railscasts.css
@@ -10,6 +10,7 @@ Railscasts-like style (c) Visoft, Inc. (Damien White)
   padding: 0.5em;
   background: #232323;
   color: #e6e1dc;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
@@ -63,11 +64,12 @@ Railscasts-like style (c) Visoft, Inc. (Damien White)
 }
 
 .hljs-class .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .smalltalk .hljs-class,
 .hljs-javadoctag,
 .hljs-yardoctag,
-.hljs-phpdoc {
+.hljs-phpdoc,
+.hljs-dartdoc {
   text-decoration: none;
 }
 
diff --git a/src/styles/rainbow.css b/src/styles/rainbow.css
index 8e30a94..a97abfb 100644
--- a/src/styles/rainbow.css
+++ b/src/styles/rainbow.css
@@ -10,6 +10,7 @@ Style with support for rainbow parens
   padding: 0.5em;
   background: #474949;
   color: #d1d9e1;
+  -webkit-text-size-adjust: none;
 }
 
 
@@ -43,6 +44,7 @@ Style with support for rainbow parens
 .hljs-string,
 .hljs-tag .hljs-value,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .tex .hljs-formula,
 .hljs-regexp,
 .hljs-hexcolor {
@@ -55,7 +57,6 @@ Style with support for rainbow parens
 .hljs-chunk,
 .hljs-decorator,
 .hljs-built_in,
-.lisp .hljs-title,
 .hljs-identifier {
   color: #b5bd68;
 }
@@ -65,27 +66,22 @@ Style with support for rainbow parens
 }
 
 .hljs-variable,
-.lisp .hljs-body,
 .smalltalk .hljs-number,
 .hljs-constant,
 .hljs-class .hljs-title,
 .hljs-parent,
 .haskell .hljs-label,
-.hljs-id,
-.lisp .hljs-title,
-.clojure .hljs-title .hljs-built_in {
+.hljs-id {
    color: #ffcc66;
 }
 
 .hljs-tag .hljs-title,
 .hljs-rules .hljs-property,
-.django .hljs-tag .hljs-keyword,
-.clojure .hljs-title .hljs-built_in {
+.django .hljs-tag .hljs-keyword {
   font-weight: bold;
 }
 
-.hljs-attribute,
-.clojure .hljs-title {
+.hljs-attribute {
   color: #81a2be;
 }
 
diff --git a/src/styles/school_book.css b/src/styles/school_book.css
index c4098b0..e981393 100644
--- a/src/styles/school_book.css
+++ b/src/styles/school_book.css
@@ -10,6 +10,7 @@ School Book style from goldblog.com.ua (c) Zaripov Yura <yur4ik7 at ukr.net>
   padding: 15px 0.5em 0.5em 30px;
   font-size: 11px !important;
   line-height:16px !important;
+  -webkit-text-size-adjust: none;
 }
 
 pre{
@@ -23,8 +24,6 @@ pre{
 .hljs-change,
 .hljs-winutils,
 .hljs-flow,
-.lisp .hljs-title,
-.clojure .hljs-built_in,
 .nginx .hljs-title,
 .tex .hljs-special {
   color:#005599;
@@ -39,7 +38,7 @@ pre{
 
 .hljs-string,
 .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .hljs-tag .hljs-value,
 .css .hljs-rules .hljs-value,
 .hljs-preprocessor,
@@ -70,8 +69,8 @@ pre{
 }
 
 .hljs-comment,
-.java .hljs-annotation,
-.python .hljs-decorator,
+.hljs-annotation,
+.hljs-decorator,
 .hljs-template_comment,
 .hljs-pi,
 .hljs-doctype,
@@ -85,8 +84,9 @@ pre{
 .hljs-literal,
 .css .hljs-id,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .vbscript .hljs-built_in,
 .rsl .hljs-built_in,
 .smalltalk .hljs-class,
diff --git a/src/styles/solarized_dark.css b/src/styles/solarized_dark.css
index 6187a41..41a3603 100644
--- a/src/styles/solarized_dark.css
+++ b/src/styles/solarized_dark.css
@@ -10,6 +10,7 @@ Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums at gmai
   padding: 0.5em;
   background: #002b36;
   color: #839496;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
@@ -41,6 +42,7 @@ Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums at gmai
 .hljs-tag .hljs-value,
 .hljs-rules .hljs-value,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .tex .hljs-formula,
 .hljs-regexp,
 .hljs-hexcolor,
@@ -69,7 +71,7 @@ Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums at gmai
 .hljs-constant,
 .hljs-class .hljs-title,
 .hljs-parent,
-.haskell .hljs-type,
+.hljs-type,
 .hljs-link_reference {
   color: #b58900;
 }
@@ -86,7 +88,6 @@ Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums at gmai
 .hljs-attr_selector,
 .hljs-subst,
 .hljs-cdata,
-.clojure .hljs-title,
 .css .hljs-pseudo,
 .hljs-header {
   color: #cb4b16;
diff --git a/src/styles/solarized_light.css b/src/styles/solarized_light.css
index e108289..914ffb1 100644
--- a/src/styles/solarized_light.css
+++ b/src/styles/solarized_light.css
@@ -10,6 +10,7 @@ Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums at gmai
   padding: 0.5em;
   background: #fdf6e3;
   color: #657b83;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
@@ -41,6 +42,7 @@ Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums at gmai
 .hljs-tag .hljs-value,
 .hljs-rules .hljs-value,
 .hljs-phpdoc,
+.hljs-dartdoc,
 .tex .hljs-formula,
 .hljs-regexp,
 .hljs-hexcolor,
@@ -69,7 +71,7 @@ Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums at gmai
 .hljs-constant,
 .hljs-class .hljs-title,
 .hljs-parent,
-.haskell .hljs-type,
+.hljs-type,
 .hljs-link_reference {
   color: #b58900;
 }
@@ -86,7 +88,6 @@ Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums at gmai
 .hljs-attr_selector,
 .hljs-subst,
 .hljs-cdata,
-.clojure .hljs-title,
 .css .hljs-pseudo,
 .hljs-header {
   color: #cb4b16;
diff --git a/src/styles/sunburst.css b/src/styles/sunburst.css
index 5ff1997..90ddd4d 100644
--- a/src/styles/sunburst.css
+++ b/src/styles/sunburst.css
@@ -10,6 +10,7 @@ Sunburst-like style (c) Vasily Polovnyov <vast at whiteants.net>
   padding: 0.5em;
   background: #000;
   color: #f8f8f8;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
@@ -66,11 +67,12 @@ Sunburst-like style (c) Vasily Polovnyov <vast at whiteants.net>
 }
 
 .hljs-class .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .smalltalk .hljs-class,
 .hljs-javadoctag,
 .hljs-yardoctag,
-.hljs-phpdoc {
+.hljs-phpdoc,
+.hljs-dartdoc {
   text-decoration: underline;
 }
 
diff --git a/src/styles/tomorrow-night-blue.css b/src/styles/tomorrow-night-blue.css
index 506b73c..f21fcb4 100644
--- a/src/styles/tomorrow-night-blue.css
+++ b/src/styles/tomorrow-night-blue.css
@@ -81,6 +81,7 @@
   background: #002451;
   color: white;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/tomorrow-night-bright.css b/src/styles/tomorrow-night-bright.css
index 24b03bd..781259a 100644
--- a/src/styles/tomorrow-night-bright.css
+++ b/src/styles/tomorrow-night-bright.css
@@ -80,6 +80,7 @@
   background: black;
   color: #eaeaea;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/tomorrow-night-eighties.css b/src/styles/tomorrow-night-eighties.css
index 219019d..33a6031 100644
--- a/src/styles/tomorrow-night-eighties.css
+++ b/src/styles/tomorrow-night-eighties.css
@@ -80,6 +80,7 @@
   background: #2d2d2d;
   color: #cccccc;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/tomorrow-night.css b/src/styles/tomorrow-night.css
index cb8ceb7..5a8e9cd 100644
--- a/src/styles/tomorrow-night.css
+++ b/src/styles/tomorrow-night.css
@@ -81,6 +81,7 @@
   background: #1d1f21;
   color: #c5c8c6;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/tomorrow.css b/src/styles/tomorrow.css
index 2aa9f76..a410a67 100644
--- a/src/styles/tomorrow.css
+++ b/src/styles/tomorrow.css
@@ -78,6 +78,7 @@
   background: white;
   color: #4d4d4c;
   padding: 0.5em;
+  -webkit-text-size-adjust: none;
 }
 
 .coffeescript .javascript,
diff --git a/src/styles/vs.css b/src/styles/vs.css
index 91451eb..63f4988 100644
--- a/src/styles/vs.css
+++ b/src/styles/vs.css
@@ -9,6 +9,7 @@ Visual Studio-like style based on original C# coloring by Jason Diamond <jason at d
   padding: 0.5em;
   background: white;
   color: black;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
@@ -77,12 +78,15 @@ Visual Studio-like style based on original C# coloring by Jason Diamond <jason at d
 }
 
 .hljs-phpdoc,
+.hljs-dartdoc,
 .hljs-javadoc,
 .hljs-xmlDocTag {
   color: #808080;
 }
 
-.vhdl .hljs-typename { font-weight: bold; }
+.hljs-type,
+.hljs-typename { font-weight: bold; }
+
 .vhdl .hljs-string { color: #666666; }
 .vhdl .hljs-literal { color: #a31515; }
 .vhdl .hljs-attribute { color: #00b0e8; }
diff --git a/src/styles/xcode.css b/src/styles/xcode.css
index 1cf3b0e..ee8980a 100644
--- a/src/styles/xcode.css
+++ b/src/styles/xcode.css
@@ -10,6 +10,7 @@ XCode style (c) Angel Garcia <angelgarcia.mail at gmail.com>
   padding: 0.5em;
   background: #fff;
   color: black;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-comment,
@@ -67,19 +68,18 @@ XCode style (c) Angel Garcia <angelgarcia.mail at gmail.com>
 .hljs-symbol .hljs-string,
 .hljs-number,
 .css .hljs-function,
-.clojure .hljs-title,
-.clojure .hljs-built_in,
 .hljs-function .hljs-title,
 .coffeescript .hljs-attribute {
   color: #1c00cf;
 }
 
 .hljs-class .hljs-title,
-.haskell .hljs-type,
 .smalltalk .hljs-class,
 .hljs-javadoctag,
 .hljs-yardoctag,
 .hljs-phpdoc,
+.hljs-dartdoc,
+.hljs-type,
 .hljs-typename,
 .hljs-tag .hljs-attribute,
 .hljs-doctype,
diff --git a/src/styles/zenburn.css b/src/styles/zenburn.css
index 8da11a2..006caf5 100644
--- a/src/styles/zenburn.css
+++ b/src/styles/zenburn.css
@@ -11,6 +11,7 @@ based on dark.css by Ivan Sagalaev
   padding: 0.5em;
   background: #3f3f3f;
   color: #dcdcdc;
+  -webkit-text-size-adjust: none;
 }
 
 .hljs-keyword,
@@ -58,9 +59,9 @@ based on dark.css by Ivan Sagalaev
 }
 
 .dos .hljs-keyword,
-.python .hljs-decorator,
+.hljs-decorator,
 .hljs-title,
-.haskell .hljs-type,
+.hljs-type,
 .diff .hljs-header,
 .ruby .hljs-class .hljs-parent,
 .apache .hljs-tag,
@@ -99,7 +100,7 @@ based on dark.css by Ivan Sagalaev
 .hljs-shebang,
 .diff .hljs-addition,
 .hljs-comment,
-.java .hljs-annotation,
+.hljs-annotation,
 .hljs-template_comment,
 .hljs-pi,
 .hljs-doctype {
diff --git a/src/test.html b/src/test.html
index bd9c9dd..25634c4 100755
--- a/src/test.html
+++ b/src/test.html
@@ -288,7 +288,7 @@
   </script>
 <body>
 
-<p>This is a demo/test page showing all languages supported by <a href="http://highlightjs.org/">highlight.js</a>.
+<p>This is a demo/test page showing all languages supported by <a href="https://highlightjs.org/">highlight.js</a>.
 Most snippets do not contain working code :-).
 
 <div id="styleswitcher">
@@ -310,7 +310,8 @@ def somefunc(param1='', param2=0):
         print 'Gre\'ater'
     return (param2 - param1 + 1 + 0b10l) or None
 
-class SomeClass:<br>    pass
+class SomeClass:
+    pass
 
 >>> message = '''interpreter
 ... prompt'''
@@ -353,6 +354,8 @@ end
 
 class Car < ActiveRecord::Base
   has_many :wheels, :class_name => 'Wheel', :foreign_key => 'car_id'
+  has_many :wheels, class_name: 'Wheel', foreign_key: 'car_id'
+  scope :available, -> { where(available: true) }
 end
 omega = -> { 'alpha' }
 alpha = ->(arg) { arg*2 }
@@ -533,37 +536,110 @@ datahere</code></pre>
   <tr>
     <th>Scala
     <td class="scala">
-<pre><code>object abstractTypes extends Application {
-  abstract class SeqBuffer {
-    type T; val element: Seq[T]; def length = element.length
-  }
+<pre><code>case class Person(name: String, age: Int)
+
+def absoluteValue(n: Int): Int =
+  if (n < 0) -n else n
+
+val hux = "hux"
+def mux = "mux"
+def qux: String = "qux"
+
+type ξ[A] = (A, A)
+
+trait Hist { lhs =>
+  def ⊕(rhs: Hist): Hist
 }
 
-/** Turn command line arguments to uppercase */
-object Main {
-  def main(args: Array[String]) {
-    val res = for (a <- args) yield a.toUpperCase
-    println("Arguments: " + res.toString)
-  }
+def gsum[A: Ring](as: Seq[A]): A =
+  as.foldLeft(Ring[A].zero)(_ + _)
+
+sealed trait Compass
+case object North extends Compass
+case object South extends Compass
+case object East extends Compass
+case object West extends Compass
+
+trait Cake {
+  type T;
+  val things: Seq[T]
+
+  abstract class Spindler
+
+  def spindle(s: Spindler, ts: Seq[T], reversed: Boolean = false): Seq[T]
 }
 
-/** Maps are easy to use in Scala. */
-object Maps {
-  val colors = Map("red" -> 0xFF0000,
-                   "turquoise" -> 0x00FFFF,
-                   "black" -> 0x000000,
-                   "orange" -> 0xFF8040,
-                   "brown" -> 0x804000)
-  def main(args: Array[String]) {
-    for (name <- args) println(
-      colors.get(name) match {
-        case Some(code) =>
-          name + " has code: " + code
-        case None =>
-          "Unknown color: " + name
-      }
-    )
-  }
+val colors = Map(
+  "red" -> 0xFF0000,
+  "turquoise" -> 0x00FFFF,
+  "black" -> 0x000000,
+  "orange" -> 0xFF8040,
+  "brown" -> 0x804000)
+
+lazy val ns = for {
+  x <- 0 until 100
+  y <- 0 until 100
+} yield (x + y) * 33.33
+</code></pre>
+
+  <tr>
+      <th>Groovy</th>
+      <td class="groovy">
+<pre><code>#!/usr/bin/env groovy
+package model
+
+import groovy.transform.CompileStatic
+import java.util.List as MyList
+
+trait Distributable {
+    void distribute(String version) {}
+}
+
+ at CompileStatic
+class Distribution implements Distributable {
+    double number = 1234.234 / 567
+    def otherNumber = 3 / 4
+    boolean archivable = condition ?: true
+    def ternary = a ? b : c
+    String name = "Guillaume"
+    Closure description = null
+    List<DownloadPackage> packages = []
+    String regex = ~/.*foo.*/
+    String multi = '''
+        multi line string
+    ''' + """
+        now with double quotes and ${gstring}
+    """ + $/
+        even with dollar slashy strings
+    /$
+
+    /**
+     * description method
+     * @param cl the closure
+     */
+    void description(Closure cl) { this.description = cl }
+
+    void version(String name, Closure versionSpec) {
+        def closure = { println "hi" } as Runnable
+
+        MyList ml = [1, 2, [a: 1, b:2,c :3]]
+        for (ch in "name") {}
+
+        // single line comment
+        DownloadPackage pkg = new DownloadPackage(version: name)
+
+        check that: true
+
+        label:
+        def clone = versionSpec.rehydrate(pkg, pkg, pkg)
+        /*
+            now clone() in a multiline comment
+        */
+        clone()
+        packages.add(pkg)
+
+        assert 4 / 2 == 2
+    }
 }
 </code></pre>
 
@@ -701,6 +777,8 @@ you can write text [with links](http://example.com) inline or [link references][
 * one _thing_ has *em*phasis
 * two __things__ are **bold**
 
+[1]: http://example.com
+
 ---
 
 hello world
@@ -715,7 +793,6 @@ hello world
 1. one thing (yeah!)
 2. two thing `i can write code`, and `more` wipee!
 
-[1]: http://example.com
 </code></pre>
 
 	<tr>
@@ -823,6 +900,19 @@ Markup is <em>not</em> highlighted within comments.
 </code></pre>
 
   <tr>
+    <th>Dust.js
+    <td class="dust">
+<pre>
+<code><h3>Hours</h3>
+
+<ul>
+  {#users}
+  <li {hello}}>{firstName}</li>{~n}
+  {/users}
+</ul>
+</code></pre>
+
+  <tr>
     <th>CSS
     <td class="css">
 <pre><code>@media screen and (-webkit-min-device-pixel-ratio: 0) {
@@ -999,6 +1089,9 @@ x = f / foo / gm
 x = f /foo * 2/6
 
 # Regexps
+x = /\//
+x = /\n/
+x = /ab\/ ab/
 x = f /6 * 2/ - 3
 x = f /foo * 2/gm
 x = if true then /\n/ else /[.,]+/
@@ -1048,6 +1141,43 @@ OPERATOR = /// ^ (
 ) ///</code></pre>
 
 <tr>
+  <th>Dart</th>
+  <td class="dart">
+<pre><code>library app;
+import 'dart:html';
+
+part 'app2.dart';
+
+/**
+ * Class description and [link](http://dartlang.org/).
+ */
+ at Awesome('it works!')
+class SomeClass<S extends Iterable> extends BaseClass<S> implements Comparable {
+  factory SomeClass(num param);
+  SomeClass._internal(int q) : super() {
+    assert(q != 1);
+    double z = 0.0;
+  }
+
+  /// **Sum** function
+  int sum(int a, int b) => a + b;
+
+  ElementList els() => querySelectorAll('.dart');
+}
+
+String str = ' (${'parameter' + 'zxc'})';
+String str = " (${true ? 2 + 2 / 2 : null})";
+String str = r'\nraw\';
+String str = r"\nraw\";
+var str = '''
+Something ${2+3}
+''';
+var str = r"""
+Something ${2+3}
+""";
+</code></pre>
+
+<tr>
     <th>ActionScript
     <td class="actionscript">
 <pre><code>package org.example.dummy {
@@ -1529,6 +1659,8 @@ public abstract class L2Character extends L2Object {
   public class NotifyAITask implements Runnable {
     private final CtrlEvent _evt;
 
+    List<String> mList = new ArrayList<String>()
+
     public void run() {
       try {
         getAI().notifyEvent(_evt, _evt.class, null);
@@ -1709,10 +1841,6 @@ let checkList alist =
     | _ -> failwith "List is too big!"
 
 
-type IEncoding =
-    abstract Encode : string -> string
-    abstract Decode : string -> string
-
 let text = "Some text..."
 let text2 = @"A ""verbatim"" string..."
 let catalog = """
@@ -1742,6 +1870,9 @@ type Point = {X: float; Y: float;}
 type s
 let minutte = 60<s>
 
+type DefaultMailbox<'a>() =
+    let mutable inbox = ConcurrentQueue<'a>()
+    let awaitMsg = new AutoResetEvent(false)
 </code></pre>
 
   <tr>
@@ -2060,6 +2191,38 @@ heapExample
     (cons chunk (lazy-seq (chunk-seq rdr)))))
 </code></pre>
 
+<tr>
+  <th>Scheme
+  <td class="scheme">
+<pre><code>;; Calculation of Hofstadter's male and female sequences as a list of pairs
+
+(define (hofstadter-male-female n)
+(letrec ((female (lambda (n)
+           (if (= n 0)
+           1
+           (- n (male (female (- n 1)))))))
+     (male (lambda (n)
+         (if (= n 0)
+             0
+             (- n (female (male (- n 1))))))))
+  (let loop ((i 0))
+    (if (> i n)
+    '()
+    (cons (cons (female i)
+            (male i))
+      (loop (+ i 1)))))))
+
+(hofstadter-male-female 8)
+
+(define (find-first func lst)
+(call-with-current-continuation
+ (lambda (return-immediately)
+   (for-each (lambda (x)
+       (if (func x)
+           (return-immediately x)))
+         lst)
+   #f)))</code></pre>
+
   <tr>
     <th>Ini file
     <td class="ini">
@@ -2129,7 +2292,12 @@ http {
     #lingering_time 30;
 
     server {
-        server_name   one.example.com  www.one.example.com;
+        server_name www.example.com;
+        return 301 http://www.example.com$request_uri;
+    }
+
+    server {
+        server_name   example.com;
         access_log   /var/log/nginx.access_log  main;
 
         rewrite (.*) /index.php?page=$1 break;
@@ -2863,6 +3031,7 @@ It ends with an unescaped '\"'.";
         result *= i;
         i += 1;
     }
+    assert!(i == n);
     ret result;
 }
 
@@ -3232,6 +3401,22 @@ caption:db      'SEGV',0
 section .drectve info
         db      '/defaultlib:user32.lib /defaultlib:msvcrt.lib '
 </code></pre>
+<tr>
+    <th>Q/KDB+
+    <td class="q">
+<pre><code>
+select time, price by date,stock from quote where price=(max;price)fby stock
+data:raze value flip trade
+select vwap:size wavg price by 5 xbar time.minute from aapl where date within (.z.d-10;.z.d)
+f1:{[x;y;z] show (x;y+z);sum 1 2 3}
+.z.pc:{[handle] show -3!(`long$.z.p;"Closed";handle)}
+// random normal distribution, e.g. nor 10
+nor:{$[x=2*n:x div 2;raze sqrt[-2*log n?1f]*/:(sin;cos)@\:(2*pi)*n?1f;-1_.z.s 1+x]}
+
+mode:{where g=max g:count each group x}		// mode function
+</code></pre>
+
+
 
   <tr>
   <th>Monkey
@@ -3416,6 +3601,42 @@ if( propFile.canRead() ) {
 }
 </code></pre>
 
+  <tr>
+    <th>G-code</th>
+    <td class="gcode">
+<pre><code>O003 (DIAMOND SQUARE)
+N2 G54 G90 G49 G80
+N3 M6 T1 (1.ENDMILL)
+N4 M3 S1800
+N5 G0 X-.6 Y2.050
+N6 G43  H1  Z.1
+N7 G1 Z-.3 F50.
+N8 G41 D1 Y1.45
+N9 G1 X0 F20.
+N10 G2 J-1.45
+(CUTTER COMP CANCEL)
+N11 G1 Z-.2 F50.
+N12 Y-.990
+N13 G40
+N14 G0 X-.6 Y1.590
+N15 G0 Z.1
+N16 M5 G49 G28 G91 Z0
+N17 CALL O9456
+N18 #500=0.004
+N19 #503=[#500+#501]
+N20 VC45=0.0006
+VS4=0.0007
+N21 G90 G10 L20 P3 X5.Y4. Z6.567
+N22 G0 X5000
+N23 IF [#1 LT 0.370] GOTO 49
+N24 X-0.678 Y+.990
+N25 G84.3 X-0.1
+N26 #4=#5*COS[45]
+N27 #4=#5*SIN[45]
+N28 VZOFZ=652.9658
+%
+</code></pre>
+
 </table>
 
 
@@ -3468,14 +3689,6 @@ if( propFile.canRead() ) {
 </code></pre>
 
   <tr>
-    <th>Non-pre container
-    <td>
-<div id="codecontainer" class="code">for x in [1, 2, 3]:<br>
-  count(x)<br>
-</div>
-<script>hljs.highlightBlock(document.getElementById('codecontainer'), null, true);</script>
-
-  <tr>
     <th>Language alias
     <td>
       <pre><code class="language-js">var x = '<p>this should <b>not</b> be highlighted as <em>HTML</em>';</code></pre>
@@ -3489,7 +3702,7 @@ if( propFile.canRead() ) {
   <tr>
     <th>Disabled highlighting
     <td>
-<pre><code class="no-highlight"><div id="contents">
+<pre><code class="nohighlight"><div id="contents">
   <p>Hello, World!c
 </div>
 </code></pre>
@@ -3536,5 +3749,5 @@ if( propFile.canRead() ) {
     Stylesheet switcher: <a href="mailto:voldmar at voldmar.ru">Vladimir Epifanov</a><br>
     Test result detection: <a href="mailto:maniac at softwaremaniacs.org">Ivan Sagalaev</a><br>
     Export script: <a href="mailto:xonixx at gmail.com">Vladimir Gubarkov</a><br>
-    Highlighting: <a href="http://highlightjs.org/">highlight.js</a>
+    Highlighting: <a href="https://highlightjs.org/">highlight.js</a>
 </address>
diff --git a/test/detect/1c/default.txt b/test/detect/1c/default.txt
new file mode 100644
index 0000000..7dcdf3e
--- /dev/null
+++ b/test/detect/1c/default.txt
@@ -0,0 +1,16 @@
+#Если Клиент Тогда
+Перем СимвольныйКодКаталога = "ля-ля-ля"; //комментарий
+Функция Сообщить(Знач ТекстСообщения, ТекстСообщения2) Экспорт //комментарий к функции
+  x=ТекстСообщения+ТекстСообщения2+"
+  |строка1
+  |строка2
+  |строка3";
+КонецФункции
+#КонецЕсли
+
+// Процедура ПриНачалеРаботыСистемы
+//
+Процедура ПриНачалеРаботыСистемы()
+  Обработки.Помощник.ПолучитьФорму("Форма").Открыть();
+  d = '21.01.2008'
+КонецПроцедуры
diff --git a/test/detect/actionscript/default.txt b/test/detect/actionscript/default.txt
new file mode 100644
index 0000000..b416de8
--- /dev/null
+++ b/test/detect/actionscript/default.txt
@@ -0,0 +1,24 @@
+package org.example.dummy {
+    import org.dummy.*;
+
+    /*define package inline interface*/
+    public interface IFooBarzable {
+        public function foo(... pairs):Array;
+    }
+
+    public class FooBar implements IFooBarzable {
+        static private var cnt:uint = 0;
+        private var bar:String;
+
+        //constructor
+        public function TestBar(bar:String):void {
+            bar = bar;
+            ++cnt;
+        }
+
+        public function foo(... pairs):Array {
+            pairs.push(bar);
+            return pairs;
+        }
+    }
+}
\ No newline at end of file
diff --git a/test/detect/apache/default.txt b/test/detect/apache/default.txt
new file mode 100644
index 0000000..3bf2af4
--- /dev/null
+++ b/test/detect/apache/default.txt
@@ -0,0 +1,19 @@
+# rewrite`s rules for wordpress pretty url
+LoadModule rewrite_module  modules/mod_rewrite.so
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteRule . index.php [NC,L]
+
+ExpiresActive On
+ExpiresByType application/x-javascript  "access plus 1 days"
+
+Order Deny,Allow
+Allow from All
+
+<Location /maps/>
+  RewriteMap map txt:map.txt
+  RewriteMap lower int:tolower
+  RewriteCond %{REQUEST_URI} ^/([^/.]+)\.html$ [NC]
+  RewriteCond ${map:${lower:%1}|NOT_FOUND} !NOT_FOUND
+  RewriteRule .? /index.php?q=${map:${lower:%1}} [NC,L]
+</Location>
diff --git a/test/detect/applescript/default.txt b/test/detect/applescript/default.txt
new file mode 100644
index 0000000..f0b658b
--- /dev/null
+++ b/test/detect/applescript/default.txt
@@ -0,0 +1,14 @@
+repeat 5 times
+    if foo is greater than bar then
+        display dialog "Hello there"
+    else
+        beep
+    end if
+end repeat
+
+(* comment (*nested comment*) *)
+on do_something(s, y)
+    return {s + pi, y mod 4}
+end do_something
+
+do shell script "/bin/echo 'hello'"
diff --git a/test/detect/asciidoc/default.txt b/test/detect/asciidoc/default.txt
new file mode 100644
index 0000000..2af6ee6
--- /dev/null
+++ b/test/detect/asciidoc/default.txt
@@ -0,0 +1,65 @@
+Hello, World!
+============
+Author Name, <author at domain.foo>
+
+you can write text http://example.com[with links], optionally
+using an explicit link:http://example.com[link prefix].
+
+* single quotes around a phrase place 'emphasis'
+** alternatively, you can put underlines around a phrase to add _emphasis_
+* astericks around a phrase make the text *bold*
+* pluses around a phrase make it +monospaced+
+* `smart' quotes using a leading backtick and trailing single quote
+** use two of each for double ``smart'' quotes
+
+- escape characters are supported
+- you can escape a quote inside emphasized text like 'here\'s johnny!'
+
+term:: definition
+ another term:: another definition
+
+// this is just a comment
+
+Let's make a break.
+
+'''
+
+////
+we'll be right with you
+
+after this brief interruption.
+////
+
+== We're back!
+
+Want to see a image::images/tiger.png[Tiger]?
+
+.Nested highlighting
+++++
+<this_is inline="xml"></this_is>
+++++
+
+____
+asciidoc is so powerful.
+____
+
+another quote:
+
+[quote, Sir Arthur Conan Doyle, The Adventures of Sherlock Holmes]
+____
+When you have eliminated all which is impossible, then whatever remains, however improbable, must be the truth.
+____
+
+Getting Literal
+---------------
+
+ want to get literal? prefix a line with a space.
+
+....
+I'll join that party, too.
+....
+
+. one thing (yeah!)
+. two thing `i can write code`, and `more` wipee!
+
+NOTE: AsciiDoc is quite cool, you should try it.
\ No newline at end of file
diff --git a/test/detect/autohotkey/default.txt b/test/detect/autohotkey/default.txt
new file mode 100644
index 0000000..5b4a749
--- /dev/null
+++ b/test/detect/autohotkey/default.txt
@@ -0,0 +1,24 @@
+; hotkeys and hotstrings
+#a::WinSet, AlwaysOnTop, Toggle, A
+#Space::
+  MsgBox, Percent sign (`%) need to be escaped.
+  Run "C:\Program Files\some\program.exe"
+  Gosub, label1
+return
+::btw::by the way
+; volume
+#Numpad8::Send {Volume_Up}
+#Numpad5::Send {Volume_Mute}
+#Numpad2::Send {Volume_Down}
+
+label1:
+  if (Clipboard = "")
+  {
+    MsgBox, , Clipboard, Empty!
+  }
+  else
+  {
+    StringReplace, temp, Clipboard, old, new, All
+    MsgBox, , Clipboard, %temp%
+  }
+return
diff --git a/test/detect/avrasm/default.txt b/test/detect/avrasm/default.txt
new file mode 100644
index 0000000..5fee656
--- /dev/null
+++ b/test/detect/avrasm/default.txt
@@ -0,0 +1,19 @@
+;* Title:       Block Copy Routines
+;* Version:     1.1
+
+.include "8515def.inc"
+
+    rjmp    RESET   ;reset handle
+
+.def    flashsize=r16       ;size of block to be copied
+
+flash2ram:
+    lpm         ;get constant
+    st  Y+,r0       ;store in SRAM and increment Y-pointer
+    adiw    ZL,1        ;increment Z-pointer
+    dec flashsize
+    brne    flash2ram   ;if not end of table, loop more
+    ret
+
+.def    ramtemp =r1     ;temporary storage register
+.def    ramsize =r16        ;size of block to be copied
diff --git a/test/detect/axapta/default.txt b/test/detect/axapta/default.txt
new file mode 100644
index 0000000..100750a
--- /dev/null
+++ b/test/detect/axapta/default.txt
@@ -0,0 +1,32 @@
+class ExchRateLoadBatch extends RunBaseBatch {
+  ExchRateLoad rbc;
+  container currencies;
+  boolean actual;
+  boolean overwrite;
+  date beg;
+  date end;
+
+  #define.CurrentVersion(5)
+
+  #localmacro.CurrentList
+    currencies,
+    actual,
+    beg,
+    end
+  #endmacro
+}
+
+public boolean unpack(container packedClass) {
+  container       base;
+  boolean         ret;
+  Integer         version    = runbase::getVersion(packedClass);
+
+  switch (version) {
+    case #CurrentVersion:
+      [version, #CurrentList] = packedClass;
+      return true;
+    default:
+      return false;
+  }
+  return ret;
+}
diff --git a/test/detect/bash/default.txt b/test/detect/bash/default.txt
new file mode 100644
index 0000000..b265481
--- /dev/null
+++ b/test/detect/bash/default.txt
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+###### BEGIN CONFIG
+ACCEPTED_HOSTS="/root/.hag_accepted.conf"
+BE_VERBOSE=false
+###### END CONFIG
+
+if [ "$UID" -ne 0 ]
+then
+ echo "Superuser rights is required"
+ echo 'Printing the # sign'
+ exit 2
+fi
+
+if test $# -eq 0
+then
+elif test [ $1 == 'start' ]
+else
+fi
+
+genApacheConf(){
+ if [[ "$2" = "www" ]]
+ then
+  full_domain=$1
+ else
+  full_domain=$2.$1
+ fi
+ host_root="${APACHE_HOME_DIR}$1/$2/$(title)"
+ echo -e "# Host $1/$2 :"
+}
diff --git a/test/detect/brainfuck/default.txt b/test/detect/brainfuck/default.txt
new file mode 100644
index 0000000..5156af0
--- /dev/null
+++ b/test/detect/brainfuck/default.txt
@@ -0,0 +1,17 @@
+++++++++++
+[ 3*10 and 10*10
+  ->+++>++++++++++<<
+]>>
+[ filling cells
+  ->++>>++>++>+>++>>++>++>++>++>++>++>++>++>++>++>++[</]<[<]<[<]>>
+]<
++++++++++<<
+[ rough codes correction loop
+  ->>>+>+>+>+++>+>+>+>+>+>+>+>+>+>+>+>+>+>+[<]<
+]
+more accurate сodes correction
+>>>++>
+-->+++++++>------>++++++>++>+++++++++>++++++++++>++++++++>--->++++++++++>------>++++++>
+++>+++++++++++>++++++++++++>------>+++
+rewind and output
+[<]>[.>]
diff --git a/test/detect/capnproto/default.txt b/test/detect/capnproto/default.txt
new file mode 100644
index 0000000..f57fbea
--- /dev/null
+++ b/test/detect/capnproto/default.txt
@@ -0,0 +1,55 @@
+ at 0xdbb9ad1f14bf0b36;  # unique file ID, generated by `capnp id`
+
+struct Person {
+  name @0 :Text;
+  birthdate @3 :Date;
+
+  email @1 :Text;
+  phones @2 :List(PhoneNumber);
+
+  struct PhoneNumber {
+    number @0 :Text;
+    type @1 :Type;
+
+    enum Type {
+      mobile @0;
+      home @1;
+      work @2;
+    }
+  }
+}
+
+struct Date {
+  year @0 :Int16;
+  month @1 :UInt8;
+  day @2 :UInt8;
+  flags @3 :List(Bool) = [ true, false, false, true ];
+}
+
+interface Node {
+  isDirectory @0 () -> (result :Bool);
+}
+
+interface Directory extends(Node) {
+  list @0 () -> (list: List(Entry));
+  struct Entry {
+    name @0 :Text;
+    node @1 :Node;
+  }
+
+  create @1 (name :Text) -> (file :File);
+  mkdir @2 (name :Text) -> (directory :Directory)
+  open @3 (name :Text) -> (node :Node);
+  delete @4 (name :Text);
+  link @5 (name :Text, node :Node);
+}
+
+interface File extends(Node) {
+  size @0 () -> (size: UInt64);
+  read @1 (startAt :UInt64 = 0, amount :UInt64 = 0xffffffffffffffff)
+       -> (data: Data);
+  # Default params = read entire file.
+
+  write @2 (startAt :UInt64, data :Data);
+  truncate @3 (size :UInt64);
+}
\ No newline at end of file
diff --git a/test/detect/clojure/default.txt b/test/detect/clojure/default.txt
new file mode 100644
index 0000000..ebce235
--- /dev/null
+++ b/test/detect/clojure/default.txt
@@ -0,0 +1,18 @@
+; Comment
+
+(def
+  ^{:macro true
+    :added "1.0"}
+  let (fn* let [&form &env & decl] (cons 'let* decl)))
+
+(def ^:dynamic chunk-size 17)
+
+(defn next-chunk [rdr]
+  (let [buf (char-array chunk-size)
+        s (.read rdr buf)]
+  (when (pos? s)
+    (java.nio.CharBuffer/wrap buf 0 s))))
+
+(defn chunk-seq [rdr]
+  (when-let [chunk (next-chunk rdr)]
+    (cons chunk (lazy-seq (chunk-seq rdr)))))
diff --git a/test/detect/cmake/default.txt b/test/detect/cmake/default.txt
new file mode 100644
index 0000000..2bbea38
--- /dev/null
+++ b/test/detect/cmake/default.txt
@@ -0,0 +1,19 @@
+cmake_minimum_required(VERSION 2.8.8)
+project(cmake_example)
+
+# Show message on Linux platform
+if (${CMAKE_SYSTEM_NAME} MATCHES Linux)
+    message("Good choice, bro!")
+endif()
+
+# Tell CMake to run moc when necessary:
+set(CMAKE_AUTOMOC ON)
+# As moc files are generated in the binary dir,
+# tell CMake to always look for includes there:
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+# Widgets finds its own dependencies.
+find_package(Qt5Widgets REQUIRED)
+
+add_executable(myproject main.cpp mainwindow.cpp)
+qt5_use_modules(myproject Widgets)
diff --git a/test/detect/coffeescript/default.txt b/test/detect/coffeescript/default.txt
new file mode 100644
index 0000000..a023c7f
--- /dev/null
+++ b/test/detect/coffeescript/default.txt
@@ -0,0 +1,42 @@
+grade = (student, period=(if b? then 7 else 6), messages={"A": "Excellent"}) ->
+  if student.excellentWork
+    "A+"
+  else if student.okayStuff
+    if student.triedHard then "B" else "B-"
+  else
+    "C"
+
+square = (x) -> x * x
+
+two = -> 2
+
+math =
+  root:   Math.sqrt
+  square: square
+  cube:   (x) -> x * square x
+
+race = (winner, runners...) ->
+  print winner, runners
+
+class Animal extends Being
+  constructor: (@name) ->
+
+  move: (meters) ->
+    alert @name + " moved #{meters}m."
+
+hi = `function() {
+  return [document.title, "Hello JavaScript"].join(": ");
+}`
+
+heredoc = """
+CoffeeScript subst test #{ 010 + 0xf / 0b10 + "nested string #{ /\n/ }"}
+"""
+
+###
+CoffeeScript Compiler v1.2.0
+Released under the MIT License
+###
+
+OPERATOR = /// ^ (
+?: [-=]>             # function
+) ///
diff --git a/test/detect/cpp/default.txt b/test/detect/cpp/default.txt
new file mode 100644
index 0000000..37497ac
--- /dev/null
+++ b/test/detect/cpp/default.txt
@@ -0,0 +1,15 @@
+#include <iostream>
+#define IABS(x) ((x) < 0 ? -(x) : (x))
+
+int main(int argc, char *argv[]) {
+
+  /* An annoying "Hello World" example */
+  for (auto i = 0; i < 0xFFFF; i++)
+    cout << "Hello, World!" << endl;
+
+  char c = '\n';
+  unordered_map <string, vector<string> > m;
+  m["key"] = "\\\\"; // this is an error
+
+  return -2e3 + 12l;
+}
diff --git a/test/detect/cs/default.txt b/test/detect/cs/default.txt
new file mode 100644
index 0000000..b9ad569
--- /dev/null
+++ b/test/detect/cs/default.txt
@@ -0,0 +1,25 @@
+using System;
+
+#pragma warning disable 414, 3021
+
+public class Program
+{
+    /// <summary>The entry point to the program.</summary>
+    public static int Main(string[] args)
+    {
+        Console.WriteLine("Hello, World!");
+        string s = @"This
+""string""
+spans
+multiple
+lines!";
+        return 0;
+    }
+}
+
+async Task<int> AccessTheWebAsync()
+{
+    // ...
+    string urlContents = await getStringTask;
+    return urlContents.Length;
+}
diff --git a/test/detect/css/default.txt b/test/detect/css/default.txt
new file mode 100644
index 0000000..e7a102b
--- /dev/null
+++ b/test/detect/css/default.txt
@@ -0,0 +1,25 @@
+ at media screen and (-webkit-min-device-pixel-ratio: 0) {
+  body:first-of-type pre::after {
+    content: 'highlight: ' attr(class);
+  }
+  body {
+    background: linear-gradient(45deg, blue, red);
+  }
+}
+
+ at import url('print.css');
+ at page:right {
+ margin: 1cm 2cm 1.3cm 4cm;
+}
+
+ at font-face {
+  font-family: Chunkfive; src: url('Chunkfive.otf');
+}
+
+div.text,
+#content,
+li[lang=ru] {
+  font: Tahoma, Chunkfive, sans-serif;
+  background: url('hatch.png') /* wtf? */;  color: #F0F0F0 !important;
+  width: 100%;
+}
diff --git a/test/detect/d/default.txt b/test/detect/d/default.txt
new file mode 100644
index 0000000..92cc8d8
--- /dev/null
+++ b/test/detect/d/default.txt
@@ -0,0 +1,44 @@
+#!/usr/bin/rdmd
+// Computes average line length for standard input.
+import std.stdio;
+
+/+
+  this is a /+ nesting +/ comment
++/
+
+enum COMPILED_ON = __TIMESTAMP__;  // special token
+
+enum character = '©';
+enum copy_valid = '©';
+enum backslash_escaped = '\\';
+
+// string literals
+enum str = `hello "world"!`;
+enum multiline = r"lorem
+ipsum
+dolor";  // wysiwyg string, no escapes here allowed
+enum multiline2 = "sit
+amet
+\"adipiscing\"
+elit.";
+enum hex = x"66 6f 6f";   // same as "foo"
+
+#line 5
+
+// float literals
+enum f = [3.14f, .1, 1., 1e100, 0xc0de.01p+100];
+
+static if (something == true) {
+   import std.algorithm;
+}
+
+void main() pure nothrow @safe {
+    ulong lines = 0;
+    double sumLength = 0;
+    foreach (line; stdin.byLine()) {
+        ++lines;
+        sumLength += line.length;
+    }
+    writeln("Average line length: ",
+        lines ? sumLength / lines : 0);
+}
diff --git a/test/detect/dart/default.txt b/test/detect/dart/default.txt
new file mode 100644
index 0000000..39df4e0
--- /dev/null
+++ b/test/detect/dart/default.txt
@@ -0,0 +1,32 @@
+library app;
+import 'dart:html';
+
+part 'app2.dart';
+
+/**
+ * Class description and [link](http://dartlang.org/).
+ */
+ at Awesome('it works!')
+class SomeClass<S extends Iterable> extends BaseClass<S> implements Comparable {
+  factory SomeClass(num param);
+  SomeClass._internal(int q) : super() {
+    assert(q != 1);
+    double z = 0.0;
+  }
+
+  /// **Sum** function
+  int sum(int a, int b) => a + b;
+
+  ElementList els() => querySelectorAll('.dart');
+}
+
+String str = ' (${'parameter' + 'zxc'})';
+String str = " (${true ? 2 + 2 / 2 : null})";
+String str = r'\nraw\';
+String str = r"\nraw\";
+var str = '''
+Something ${2+3}
+''';
+var str = r"""
+Something ${2+3}
+""";
diff --git a/test/detect/delphi/default.txt b/test/detect/delphi/default.txt
new file mode 100644
index 0000000..cea946d
--- /dev/null
+++ b/test/detect/delphi/default.txt
@@ -0,0 +1,30 @@
+TList = Class(TObject)
+Private
+  Some: String;
+Public
+  Procedure Inside; // Suxx
+End;{TList}
+
+Procedure CopyFile(InFileName, var OutFileName: String);
+Const
+  BufSize = 4096; (* Huh? *)
+Var
+  InFile, OutFile: TStream;
+  Buffer: Array[1..BufSize] Of Byte;
+  ReadBufSize: Integer;
+Begin
+  InFile := Nil;
+  OutFile := Nil;
+  Try
+    InFile := TFileStream.Create(InFileName, fmOpenRead);
+    OutFile := TFileStream.Create(OutFileName, fmCreate);
+    Repeat
+      ReadBufSize := InFile.Read(Buffer, BufSize);
+      OutFile.Write(Buffer, ReadBufSize);
+    Until ReadBufSize<>BufSize;
+    Log('File ''' + InFileName + ''' copied'#13#10);
+  Finally
+    InFile.Free;
+    OutFile.Free;
+  End;{Try}
+End;{CopyFile}
diff --git a/test/detect/diff/default.txt b/test/detect/diff/default.txt
new file mode 100644
index 0000000..4f4c04f
--- /dev/null
+++ b/test/detect/diff/default.txt
@@ -0,0 +1,30 @@
+Index: languages/ini.js
+===================================================================
+--- languages/ini.js    (revision 199)
++++ languages/ini.js    (revision 200)
+@@ -1,8 +1,7 @@
+ hljs.LANGUAGES.ini =
+ {
+   case_insensitive: true,
+-  defaultMode:
+-  {
++  defaultMode: {
+     contains: ['comment', 'title', 'setting'],
+     illegal: '[^\\s]'
+   },
+
+*** /path/to/original timestamp
+--- /path/to/new      timestamp
+***************
+*** 1,3 ****
+--- 1,9 ----
++ This is an important
++ notice! It should
++ therefore be located at
++ the beginning of this
++ document!
+
+! compress the size of the
+! changes.
+
+  It is important to spell
diff --git a/test/detect/django/default.txt b/test/detect/django/default.txt
new file mode 100644
index 0000000..150037f
--- /dev/null
+++ b/test/detect/django/default.txt
@@ -0,0 +1,16 @@
+{% if articles|length %}
+{% for article in articles %}
+
+{# Striped table #}
+<tr class="{% cycle odd,even %}">
+  <td>{{ article|default:"Hi... "|escape }}</td>
+  <td {% if article.today %}class="today"{% endif %}>{{ article.date|date:'d.m.Y' }}</td>
+</tr>
+
+{% endfor %}
+{% endif %}
+
+{% comment %}
+Comments may be long and multiline.
+Markup is <em>not</em> highlighted within comments.
+{% endcomment %}
diff --git a/test/detect/dos/default.txt b/test/detect/dos/default.txt
new file mode 100644
index 0000000..246ca3d
--- /dev/null
+++ b/test/detect/dos/default.txt
@@ -0,0 +1,24 @@
+cd \
+copy a b
+ping 192.168.0.1
+ at rem ping 192.168.0.1
+net stop sharedaccess
+del %tmp% /f /s /q
+del %temp% /f /s /q
+ipconfig /flushdns
+taskkill /F /IM JAVA.EXE /T
+
+cd Photoshop/Adobe Photoshop CS3/AMT/
+if exist application.sif (
+    ren application.sif _application.sif
+) else (
+    ren _application.sif application.sif
+)
+
+taskkill /F /IM proquota.exe /T
+
+sfc /SCANNOW
+
+set path = test
+
+xcopy %1\*.* %2
diff --git a/test/detect/dust/default.txt b/test/detect/dust/default.txt
new file mode 100644
index 0000000..e04bc34
--- /dev/null
+++ b/test/detect/dust/default.txt
@@ -0,0 +1,7 @@
+<h3>Hours</h3>
+
+<ul>
+  {#users}
+  <li {hello}}>{firstName}</li>{~n}
+  {/users}
+</ul>
diff --git a/test/detect/elixir/default.txt b/test/detect/elixir/default.txt
new file mode 100644
index 0000000..4aabe34
--- /dev/null
+++ b/test/detect/elixir/default.txt
@@ -0,0 +1,49 @@
+defrecord Person, first_name: nil, last_name: "Dudington" do
+  def name record do # huh ?
+    "#{record.first_name} #{record.last_name}"
+  end
+end
+
+defrecord User, name: "José", age: 25
+
+guy = Person.new first_name: "Guy"
+guy.name
+
+defmodule ListServer do
+  @moduledoc """
+  This module provides an easy to use ListServer, useful for keeping
+  lists of things.
+  """
+  use GenServer.Behaviour
+  alias Foo.Bar
+
+  ### Public API
+  @doc """
+  Starts and links a new ListServer, returning {:ok, pid}
+
+  ## Example
+
+    iex> {:ok, pid} = ListServer.start_link
+
+  """
+  def start_link do
+    :gen_server.start_link({:local, :list}, __MODULE__, [], [])
+  end
+
+  ### GenServer API
+  def init(list) do
+    {:ok, list}
+  end
+
+  # Clear the list
+  def handle_cast :clear, list do
+    {:noreply, []}
+  end
+end
+
+{:ok, pid} = ListServer.start_link
+pid <- {:foo, "bar"}
+
+greeter = fn(x) -> IO.puts "hey #{x}" end
+greeter.("Bob")
+
diff --git a/test/detect/erlang-repl/default.txt b/test/detect/erlang-repl/default.txt
new file mode 100644
index 0000000..8f2bef3
--- /dev/null
+++ b/test/detect/erlang-repl/default.txt
@@ -0,0 +1,27 @@
+1> Str = "abcd".
+"abcd"
+2> L = test:length(Str).
+4
+3> Descriptor = {L, list_to_atom(Str)}.
+{4,abcd}
+4> L.
+4
+5> b().
+Descriptor = {4,abcd}
+L = 4
+Str = "abcd"
+ok
+6> f(L).
+ok
+7> b().
+Descriptor = {4,abcd}
+Str = "abcd"
+ok
+8> {L, _} = Descriptor.
+{4,abcd}
+9> L.
+4
+10> 2#101.
+5
+11> 1.85e+3.
+1850
diff --git a/test/detect/erlang/default.txt b/test/detect/erlang/default.txt
new file mode 100644
index 0000000..528e064
--- /dev/null
+++ b/test/detect/erlang/default.txt
@@ -0,0 +1,60 @@
+-module(ssh_cli).
+
+-behaviour(ssh_channel).
+
+-include("ssh.hrl").
+%% backwards compatibility
+-export([listen/1, listen/2, listen/3, listen/4, stop/1]).
+
+if L =/= [] ->      % If L is not empty
+    sum(L) / count(L);
+true ->
+    error
+end.
+
+%% state
+-record(state, {
+    cm,
+    channel
+   }).
+
+-spec foo(integer()) -> integer().
+foo(X) -> 1 + X.
+
+test(Foo)->Foo.
+
+init([Shell, Exec]) ->
+    {ok, #state{shell = Shell, exec = Exec}};
+init([Shell]) ->
+    false = not true,
+    io:format("Hello, \"~p!~n", [atom_to_list('World')]),
+    {ok, #state{shell = Shell}}.
+
+concat([Single]) -> Single;
+concat(RList) ->
+    EpsilonFree = lists:filter(
+        fun (Element) ->
+            case Element of
+                epsilon -> false;
+                _ -> true
+            end
+        end,
+        RList),
+    case EpsilonFree of
+        [Single] -> Single;
+        Other -> {concat, Other}
+    end.
+
+union_dot_union({union, _}=U1, {union, _}=U2) ->
+    union(lists:flatten(
+        lists:map(
+            fun (X1) ->
+                lists:map(
+                    fun (X2) ->
+                        concat([X1, X2])
+                    end,
+                    union_to_list(U2)
+                )
+            end,
+            union_to_list(U1)
+        ))).
diff --git a/test/detect/fix/default.txt b/test/detect/fix/default.txt
new file mode 100644
index 0000000..e93a625
--- /dev/null
+++ b/test/detect/fix/default.txt
@@ -0,0 +1,4 @@
+8=FIX.4.2␁9=0␁35=8␁49=SENDERTEST␁56=TARGETTEST␁34=00000001526␁52=20120429-13:30:08.137␁1=ABC12345␁11=2012abc1234␁14=100␁17=201254321␁20=0␁30=NYSE␁31=108.20␁32=100␁38=100␁39=2␁40=1␁47=A␁54=5␁55=BRK␁59=2␁60=20120429-13:30:08.000␁65=B␁76=BROKER␁84=0␁100=NYSE␁111=100␁150=2␁151=0␁167=CS␁377=N␁10000=SampleCustomTag␁10=123␁
+
+8=FIX.4.29=035=849=SENDERTEST56=TARGETTEST34=0000000152652=20120429-13:30:08.1371=ABC1234511=2012abc123414=10017=20125432120=030=NYSE31=108.2032=10038=10039=240=147=A54=555=BRK59=260=20120429-13:30:08.00065=B76=BROKER84=0100=NYSE111=100150=2151=0167=CS377=N10000=SampleCustomTag10=123
+
\ No newline at end of file
diff --git a/test/detect/fsharp/default.txt b/test/detect/fsharp/default.txt
new file mode 100644
index 0000000..b7a0031
--- /dev/null
+++ b/test/detect/fsharp/default.txt
@@ -0,0 +1,48 @@
+open System
+
+// Single line comment...
+(*
+  This is a
+  multiline comment.
+*)
+let checkList alist =
+    match alist with
+    | [] -> 0
+    | [a] -> 1
+    | [a; b] -> 2
+    | [a; b; c] -> 3
+    | _ -> failwith "List is too big!"
+
+
+let text = "Some text..."
+let text2 = @"A ""verbatim"" string..."
+let catalog = """
+Some "long" string...
+"""
+
+let rec fib x = if x <= 2 then 1 else fib(x-1) + fib(x-2)
+
+let fibs =
+    Async.Parallel [ for i in 0..40 -> async { return fib(i) } ]
+    |> Async.RunSynchronously
+
+type Sprocket(gears) =
+  member this.Gears : int = gears
+
+[<AbstractClass>]
+type Animal =
+  abstract Speak : unit -> unit
+
+type Widget =
+  | RedWidget
+  | GreenWidget
+
+type Point = {X: float; Y: float;}
+
+[<Measure>]
+type s
+let minutte = 60<s>
+
+type DefaultMailbox<'a>() =
+    let mutable inbox = ConcurrentQueue<'a>()
+    let awaitMsg = new AutoResetEvent(false)
diff --git a/test/detect/gcode/default.txt b/test/detect/gcode/default.txt
new file mode 100644
index 0000000..c265246
--- /dev/null
+++ b/test/detect/gcode/default.txt
@@ -0,0 +1,31 @@
+O003 (DIAMOND SQUARE)
+N2 G54 G90 G49 G80
+N3 M6 T1 (1.ENDMILL)
+N4 M3 S1800
+N5 G0 X-.6 Y2.050
+N6 G43  H1  Z.1
+N7 G1 Z-.3 F50.
+N8 G41 D1 Y1.45
+N9 G1 X0 F20.
+N10 G2 J-1.45
+(CUTTER COMP CANCEL)
+N11 G1 Z-.2 F50.
+N12 Y-.990
+N13 G40
+N14 G0 X-.6 Y1.590
+N15 G0 Z.1
+N16 M5 G49 G28 G91 Z0
+N17 CALL O9456
+N18 #500=0.004
+N19 #503=[#500+#501]
+N20 VC45=0.0006
+VS4=0.0007
+N21 G90 G10 L20 P3 X5.Y4. Z6.567
+N22 G0 X5000
+N23 IF [#1 LT 0.370] GOTO 49
+N24 X-0.678 Y+.990
+N25 G84.3 X-0.1
+N26 #4=#5*COS[45]
+N27 #4=#5*SIN[45]
+N28 VZOFZ=652.9658
+%
diff --git a/test/detect/gherkin/default.txt b/test/detect/gherkin/default.txt
new file mode 100644
index 0000000..52981fd
--- /dev/null
+++ b/test/detect/gherkin/default.txt
@@ -0,0 +1,25 @@
+# language: en
+Feature: Addition
+  In order to avoid silly mistakes
+  As a math idiot
+  I want to be told the sum of two numbers
+
+  @this_is_a_tag
+  Scenario Outline: Add two numbers
+    * I have a calculator
+    Given I have entered <input_1> into the calculator
+    And I have entered <input_2> into the calculator
+    When I press <button>
+    Then the result should be <output> on the screen
+    And I have a string like
+    """
+    Here is
+    some
+    multiline text
+    """
+
+  Examples:
+    | input_1 | input_2 | button | output |
+    | 20      | 30      | add    | 50     |
+    | 2       | 5       | add    | 7      |
+    | 0       | 40      | add    | 40     |
diff --git a/test/detect/glsl/default.txt b/test/detect/glsl/default.txt
new file mode 100644
index 0000000..ddaf246
--- /dev/null
+++ b/test/detect/glsl/default.txt
@@ -0,0 +1,37 @@
+// vertex shader
+#version 150
+in  vec2 in_Position;
+in  vec3 in_Color;
+
+out vec3 ex_Color;
+void main(void) {
+    gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0);
+    ex_Color = in_Color;
+}
+
+
+// geometry shader
+#version 150
+
+layout(triangles) in;
+layout(triangle_strip, max_vertices = 3) out;
+
+void main() {
+  for(int i = 0; i < gl_in.length(); i++) {
+    gl_Position = gl_in[i].gl_Position;
+    EmitVertex();
+  }
+  EndPrimitive();
+}
+
+
+// fragment shader
+#version 150
+precision highp float;
+
+in  vec3 ex_Color;
+out vec4 gl_FragColor;
+
+void main(void) {
+    gl_FragColor = vec4(ex_Color, 1.0);
+}
diff --git a/test/detect/go/default.txt b/test/detect/go/default.txt
new file mode 100644
index 0000000..aa8663a
--- /dev/null
+++ b/test/detect/go/default.txt
@@ -0,0 +1,34 @@
+package main
+
+import (
+    "fmt"
+    "os"
+)
+
+const (
+    Sunday = iota
+    numberOfDays  // this constant is not exported
+)
+
+type Foo interface {
+    FooFunc(int, float32) (complex128, []int)
+}
+
+type Bar struct {
+    os.File /* multi-line
+               comment */
+    PublicData chan int
+}
+
+func main() {
+    ch := make(chan int)
+    ch <- 1
+    x, ok := <- ch
+    ok = true
+    float_var := 1.0e10
+    defer fmt.Println('\'')
+    defer fmt.Println(`exitting now\`)
+    var fv1 float64 = 0.75
+    go println(len("hello world!"))
+    return
+}
diff --git a/test/detect/gradle/default.txt b/test/detect/gradle/default.txt
new file mode 100644
index 0000000..e317ef0
--- /dev/null
+++ b/test/detect/gradle/default.txt
@@ -0,0 +1,62 @@
+
+apply plugin: 'android'
+
+android {
+    compileSdkVersion 19
+    buildToolsVersion "19.1"
+
+    defaultConfig {
+        minSdkVersion 15
+        targetSdkVersion 19
+        versionCode 5
+        versionName "0.4.4"
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+    signingConfigs {
+        release
+    }
+    buildTypes {
+        release {
+            // runProguard true
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
+            signingConfig signingConfigs.release
+        }
+    }
+}
+
+dependencies {
+    compile fileTree(dir: 'libs', include: ['*.jar'])
+
+    compile 'com.example:example-lib:1.0.0'
+}
+
+
+def propFile = file('../signing.properties')
+if( propFile.canRead() ) {
+    def Properties p = new Properties()
+    p.load(new FileInputStream(propFile))
+
+    if( p!=null
+    &&  p.containsKey("STORE_FILE")
+    &&  p.containsKey('STORE_PASSWORD')
+    &&  p.containsKey('KEY_ALIAS')
+    &&  p.containsKey('KEY_PASSWORD')
+    ) {
+        println "RELEASE_BUILD: Signing..."
+
+        android.signingConfigs.release.storeFile = file( p['STORE_FILE'] )
+        android.signingConfigs.release.storePassword = p['STORE_PASSWORD']
+        android.signingConfigs.release.keyAlias = p['KEY_ALIAS']
+        android.signingConfigs.release.keyPassword = p['KEY_PASSWORD']
+    } else {
+        println "RELEASE_BUILD: Required properties in signing.properties are missing"
+        android.buildTypes.release.signingConfig = null
+    }
+} else {
+    println "RELEASE_BUILD: signing.properties not found"
+    android.buildTypes.release.signingProperties = null
+}
diff --git a/test/detect/groovy/default.txt b/test/detect/groovy/default.txt
new file mode 100644
index 0000000..7970359
--- /dev/null
+++ b/test/detect/groovy/default.txt
@@ -0,0 +1,56 @@
+#!/usr/bin/env groovy
+package model
+
+import groovy.transform.CompileStatic
+import java.util.List as MyList
+
+trait Distributable {
+    void distribute(String version) {}
+}
+
+ at CompileStatic
+class Distribution implements Distributable {
+    double number = 1234.234 / 567
+    def otherNumber = 3 / 4
+    boolean archivable = condition ?: true
+    def ternary = a ? b : c
+    String name = "Guillaume"
+    Closure description = null
+    List<DownloadPackage> packages = []
+    String regex = ~/.*foo.*/
+    String multi = '''
+        multi line string
+    ''' + """
+        now with double quotes and ${gstring}
+    """ + $/
+        even with dollar slashy strings
+    /$
+
+    /**
+     * description method
+     * @param cl the closure
+     */
+    void description(Closure cl) { this.description = cl }
+
+    void version(String name, Closure versionSpec) {
+        def closure = { println "hi" } as Runnable
+
+        MyList ml = [1, 2, [a: 1, b:2,c :3]]
+        for (ch in "name") {}
+
+        // single line comment
+        DownloadPackage pkg = new DownloadPackage(version: name)
+
+        check that: true
+
+        label:
+        def clone = versionSpec.rehydrate(pkg, pkg, pkg)
+        /*
+            now clone() in a multiline comment
+        */
+        clone()
+        packages.add(pkg)
+
+        assert 4 / 2 == 2
+    }
+}
diff --git a/test/detect/haml/default.txt b/test/detect/haml/default.txt
new file mode 100644
index 0000000..fb4bab3
--- /dev/null
+++ b/test/detect/haml/default.txt
@@ -0,0 +1,14 @@
+!!! XML
+%html
+  %body
+    %h1.jumbo{:id=>"a", :style=>'font-weight: normal', :title=>title} highlight.js
+    /html comment
+    -# ignore this line
+    %ul(style='margin: 0')
+    -items.each do |i|
+      %i= i
+    = variable
+    =variable2
+    ~ variable3
+    ~variable4
+    The current year is #{DataTime.now.year}.
diff --git a/test/detect/handlebars/default.txt b/test/detect/handlebars/default.txt
new file mode 100644
index 0000000..1544ac3
--- /dev/null
+++ b/test/detect/handlebars/default.txt
@@ -0,0 +1,7 @@
+<h3>Hours</h3>
+
+<ul>
+  {{#each content.users}}
+  <li {{bindAttr hello="world"}}>{{firstName}}</li>
+  {{/each}}
+</ul>
diff --git a/test/detect/haskell/default.txt b/test/detect/haskell/default.txt
new file mode 100644
index 0000000..c5b8e0f
--- /dev/null
+++ b/test/detect/haskell/default.txt
@@ -0,0 +1,44 @@
+{-# LANGUAGE TypeSynonymInstances #-}
+module Network.UDP
+( DataPacket(..)
+, openBoundUDPPort
+, openListeningUDPPort
+, pingUDPPort
+, sendUDPPacketTo
+, recvUDPPacket
+, recvUDPPacketFrom
+) where
+
+{- this is a {- nested -} comment -}
+
+import qualified Data.ByteString as Strict (ByteString, concat, singleton)
+import qualified Data.ByteString.Lazy as Lazy (ByteString, toChunks, fromChunks)
+import Data.ByteString.Char8 (pack, unpack)
+import Network.Socket hiding (sendTo, recv, recvFrom)
+import Network.Socket.ByteString (sendTo, recv, recvFrom)
+
+infix 3 `foo`
+infixl 6 `bar`
+infixr 9 `baz`
+
+-- Type class for converting StringLike types to and from strict ByteStrings
+class DataPacket a where
+  toStrictBS :: a -> Strict.ByteString
+  fromStrictBS :: Strict.ByteString -> a
+
+instance DataPacket Strict.ByteString where
+  toStrictBS = id
+  {-# INLINE toStrictBS #-}
+  fromStrictBS = id
+  {-# INLINE fromStrictBS #-}
+
+openBoundUDPPort :: String -> Int -> IO Socket
+openBoundUDPPort uri port = do
+  s <- getUDPSocket
+  bindAddr <- inet_addr uri
+  let a = SockAddrInet (toEnum port) bindAddr
+  bindSocket s a
+  return s
+
+pingUDPPort :: Socket -> SockAddr -> IO ()
+pingUDPPort s a = sendTo s (Strict.singleton 0) a >> return ()
diff --git a/test/detect/haxe/default.txt b/test/detect/haxe/default.txt
new file mode 100644
index 0000000..546af42
--- /dev/null
+++ b/test/detect/haxe/default.txt
@@ -0,0 +1,29 @@
+
+// quicksort example from http://haxe.org/doc/snip/quicksort
+class Quicksort {
+
+    static var arr = [4,8,0,3,9,1,5,2,6,7];
+
+    static function quicksort( lo : Int, hi : Int ) : Void {
+        var i = lo;
+        var j = hi;
+        var buf = arr;
+        var p = buf[(lo+hi)>>1];
+        while( i <= j ) {
+            while( arr[i] > p ) i++;
+            while( arr[j] < p ) j--;
+            if( i <= j ) {
+                var t = buf[i];
+                buf[i++] = buf[j];
+                buf[j--] = t;
+            }
+        }
+        if( lo < j ) quicksort( lo, j );
+        if( i < hi ) quicksort( i, hi );
+    }
+
+    static function main() {
+        quicksort( 0, arr.length-1 );
+        trace(arr);
+    }
+}
diff --git a/test/detect/http/default.txt b/test/detect/http/default.txt
new file mode 100644
index 0000000..34631a1
--- /dev/null
+++ b/test/detect/http/default.txt
@@ -0,0 +1,6 @@
+POST /task?id=1 HTTP/1.1
+Host: example.org
+Content-Type: application/json; charset=utf-8
+Content-Length: 19
+
+{"status": "ok", "extended": true}
diff --git a/test/detect/ini/default.txt b/test/detect/ini/default.txt
new file mode 100644
index 0000000..fb2f900
--- /dev/null
+++ b/test/detect/ini/default.txt
@@ -0,0 +1,12 @@
+;Settings relating to the location and loading of the database
+[Database]
+ProfileDir=.
+ShowProfileMgr=smart
+Profile1_Name[] = "\|/_-=MegaDestoyer=-_\|/"
+DefaultProfile=True
+AutoCreate = no
+
+[AutoExec]
+use-prompt="prompt"
+Glob=autoexec_*.ini
+AskAboutIgnoredPlugins=0
diff --git a/test/detect/java/default.txt b/test/detect/java/default.txt
new file mode 100644
index 0000000..baf8e02
--- /dev/null
+++ b/test/detect/java/default.txt
@@ -0,0 +1,35 @@
+/**
+ * @author John Smith <john.smith at example.com>
+ * @version 1.0
+*/
+package l2f.gameserver.model;
+
+import java.util.ArrayList;
+
+public abstract class L2Character extends L2Object {
+  public static final Short ABNORMAL_EFFECT_BLEEDING = 0x0001; // not sure
+
+  public void moveTo(int x, int y, int z) {
+    _ai = null;
+    _log.warning("Should not be called");
+    if (1 > 5) {
+      return;
+    }
+  }
+
+  /** Task of AI notification */
+  @SuppressWarnings( { "nls", "unqualified-field-access", "boxing" })
+  public class NotifyAITask implements Runnable {
+    private final CtrlEvent _evt;
+
+    List<String> mList = new ArrayList<String>()
+
+    public void run() {
+      try {
+        getAI().notifyEvent(_evt, _evt.class, null);
+      } catch (Throwable t) {
+        t.printStackTrace();
+      }
+    }
+  }
+}
diff --git a/test/detect/javascript/default.txt b/test/detect/javascript/default.txt
new file mode 100644
index 0000000..efb30bd
--- /dev/null
+++ b/test/detect/javascript/default.txt
@@ -0,0 +1,16 @@
+function $initHighlight(block, flags) {
+  try {
+    if (block.className.search(/\bno\-highlight\b/) != -1)
+      return processBlock(block.function, true, 0x0F) + ' class=""';
+  } catch (e) {
+    /* handle exception */
+    var e4x =
+        <div>Example
+            <p>1234</p></div>;
+  }
+  for (var i = 0 / 2; i < classes.length; i++) { // "0 / 2" should not be parsed as regexp
+    if (checkCondition(classes[i]) === undefined)
+      return /\d+[\s/]/g;
+  }
+  console.log(Array.every(classes, Boolean));
+}
\ No newline at end of file
diff --git a/test/detect/json/default.txt b/test/detect/json/default.txt
new file mode 100644
index 0000000..9710b22
--- /dev/null
+++ b/test/detect/json/default.txt
@@ -0,0 +1,12 @@
+[
+  {
+    "title": "apples",
+    "count": [12000, 20000],
+    "description": {"text": "...", "sensitive": false}
+  },
+  {
+    "title": "oranges",
+    "count": [17500, null],
+    "description": {"text": "...", "sensitive": false}
+  }
+]
diff --git a/test/detect/lasso/default.txt b/test/detect/lasso/default.txt
new file mode 100644
index 0000000..1802414
--- /dev/null
+++ b/test/detect/lasso/default.txt
@@ -0,0 +1,47 @@
+<?LassoScript
+/* Lasso 8 */
+  local('query' = 'SELECT * FROM `'+var:'table'+'` WHERE `id` > 10
+    ORDER BY `Name` LIMIT 30');
+  Inline: -Username=$DBuser, -Password=$DBpass, -Database=$DBname, -sql=#query;
+    var("class1.name" = (found_count != 0 ? "subtotal" | "nonefound"),
+        "total_amount" = found_count);
+    records;
+      output: "<tr>"loop_count"</tr>";
+    /records;
+  /Inline;
+?><div class="[$class1.name]">[$total_amount]</div>
+<?lasso
+/* Lasso 9 */ ?>
+[noprocess] causes [delimiters] to be <?=skipped?> until the next [/noprocess]
+[
+  define strings_combine(value::string, ...other)::string => {
+    local(result = #value->append(#other->asString&trim))
+    return #result
+  }
+  /**! descriptive text */
+  define person => type {
+    parent entity
+    data name::string, protected nickname, birthdate :: date
+    data private ssn = null
+    private showAge() => { return ..age }
+    protected fullName() => `"` + .nickname + `"` + .'name'
+    public ssnListed::boolean => .ssn() ? true | false
+  }
+  define person->name=(value) => {
+    .'name' = #value
+    return self->'name'
+  }
+] <!-- an HTML comment <?=disables delimiters?> as well -->
+[no_square_brackets] disables [square brackets] for the rest of the file
+<?=
+  // query expression
+  with n in array((:-12, 0xABCD, 3.14159e14), (:NaN, -infinity, .57721))
+  let swapped = pair(#n->second, #n->first)
+  group #swapped by #n->first into t
+  let key = #t->key
+  order by #key
+  select pair(#key, #1)
+  do {^
+    #n->upperCase
+  ^}
+?>
diff --git a/test/detect/lisp/default.txt b/test/detect/lisp/default.txt
new file mode 100644
index 0000000..949a30a
--- /dev/null
+++ b/test/detect/lisp/default.txt
@@ -0,0 +1,22 @@
+#!/usr/bin/env csi
+
+(defun prompt-for-cd ()
+   "Prompts
+    for CD"
+   (prompt-read "Title" 1.53 1 2/4 1.7 1.7e0 2.9E-4 +42 -7 #b001 #b001/100 #o777 #O777 #xabc55 #c(0 -5.6))
+   (prompt-read "Artist" &rest)
+   (or (parse-integer (prompt-read "Rating") :junk-allowed t) 0)
+  (if x (format t "yes") (format t "no" nil) ;and here comment
+  )
+  ;; second line comment
+  '(+ 1 2)
+  (defvar *lines*)                ; list of all lines
+  (position-if-not #'sys::whitespacep line :start beg))
+  (quote (privet 1 2 3))
+  '(hello world)
+  (* 5 7)
+  (1 2 34 5)
+  (:use "aaaa")
+  (let ((x 10) (y 20))
+    (print (+ x y))
+  )
\ No newline at end of file
diff --git a/test/detect/livecodeserver/default.txt b/test/detect/livecodeserver/default.txt
new file mode 100644
index 0000000..8c04e63
--- /dev/null
+++ b/test/detect/livecodeserver/default.txt
@@ -0,0 +1,30 @@
+<?rev
+
+global gControllerHandlers, gData
+local sTest
+put "blog,index" into gControllerHandlers
+
+
+command blog
+  -- simple comment
+  put "Hello World!" into sTest
+  # ANOTHER COMMENT
+  put "form,url,asset" into tHelpers
+  rigLoadHelper tHelpers
+end blog
+
+/*Hello
+block comment!*/
+
+function myFunction
+  if the secs > 2000000000 then
+    put "Welcome to the future!"
+  else
+    return "something"
+  end if
+end myFunction
+
+
+--| END OF blog.lc
+--| Location: ./system/application/controllers/blog.lc
+----------------------------------------------------------------------
diff --git a/test/detect/lua/default.txt b/test/detect/lua/default.txt
new file mode 100644
index 0000000..58174ee
--- /dev/null
+++ b/test/detect/lua/default.txt
@@ -0,0 +1,32 @@
+--[[
+Simple signal/slot implementation
+]]
+local signal_mt = {
+    __index = {
+        register = table.insert
+    }
+}
+function signal_mt.__index:emit(... --[[ Comment in params ]])
+    for _, slot in ipairs(self) do
+        slot(self, ...)
+    end
+end
+local function create_signal()
+    return setmetatable({}, signal_mt)
+end
+
+-- Signal test
+local signal = create_signal()
+signal:register(function(signal, ...)
+    print(...)
+end)
+signal:emit('Answer to Life, the Universe, and Everything:', 42)
+
+--[==[ [=[ [[
+Nested ]]
+multi-line ]=]
+comment ]==]
+[==[ Nested
+[=[ multi-line
+[[ string
+]] ]=] ]==]
diff --git a/test/detect/makefile/default.txt b/test/detect/makefile/default.txt
new file mode 100644
index 0000000..cd1ec79
--- /dev/null
+++ b/test/detect/makefile/default.txt
@@ -0,0 +1,13 @@
+# Makefile
+
+BUILDDIR      = _build
+EXTRAS       ?= $(BUILDDIR)/extras
+
+.PHONY: main clean
+
+main:
+	@echo "Building main facility..."
+	build_main $(BUILDDIR)
+
+clean:
+	rm -rf $(BUILDDIR)/*
diff --git a/test/detect/markdown/default.txt b/test/detect/markdown/default.txt
new file mode 100644
index 0000000..8b02f1e
--- /dev/null
+++ b/test/detect/markdown/default.txt
@@ -0,0 +1,23 @@
+# hello world
+
+you can write text [with links](http://example.com) inline or [link references][1].
+
+* one _thing_ has *em*phasis
+* two __things__ are **bold**
+
+[1]: http://example.com
+
+---
+
+hello world
+===========
+
+<this_is inline="xml"></this_is>
+
+> markdown is so cool
+
+    so are code segments
+
+1. one thing (yeah!)
+2. two thing `i can write code`, and `more` wipee!
+
diff --git a/test/detect/mathematica/default.txt b/test/detect/mathematica/default.txt
new file mode 100644
index 0000000..aeff95e
--- /dev/null
+++ b/test/detect/mathematica/default.txt
@@ -0,0 +1,14 @@
+(* ::Package:: *)
+
+(* Mathematica Package *)
+
+BeginPackage["SomePkg`"]
+
+Begin["`Private`"]
+
+SomeFn[ns_List] := Fold[Function[{x, y}, x + y], 0, Map[# * 2 &, ns]];
+Print[$ActivationKey];
+
+End[] (* End Private Context *)
+
+EndPackage[]
diff --git a/test/detect/matlab/default.txt b/test/detect/matlab/default.txt
new file mode 100644
index 0000000..8248e3d
--- /dev/null
+++ b/test/detect/matlab/default.txt
@@ -0,0 +1,38 @@
+n = 20; % number of points
+points = [random('unid', 100, n, 1), random('unid', 100, n, 1)];
+len = zeros(1, n - 1);
+points = sortrows(points);
+%% Initial set of points
+plot(points(:,1),points(:,2));
+for i = 1: n-1
+    len(i) = points(i + 1, 1) - points(i, 1);
+end
+while(max(len) > 2 * min(len))
+    [d, i] = max(len);
+    k = on_margin(points, i, d, -1);
+    m = on_margin(points, i + 1, d, 1);
+    xm = 0; ym = 0;
+%% New point
+    if(i == 1 || i + 1 == n)
+        xm = mean(points([i,i+1],1))
+        ym = mean(points([i,i+1],2))
+    else
+        [xm, ym] = dlg1(points([k, i, i + 1, m], 1), ...
+            points([k, i, i + 1, m], 2))
+    end
+
+    points = [ points(1:i, :); [xm, ym]; points(i + 1:end, :)];
+end
+
+function [net] = get_fit_network(inputs, targets)
+    % Create Network
+    numHiddenNeurons = 20;  % Adjust as desired
+    net = newfit(inputs,targets,numHiddenNeurons);
+    net.trainParam.goal = 0.01;
+    net.trainParam.epochs = 1000;
+    % Train and Apply Network
+    [net,tr] = train(net,inputs,targets);
+end
+
+foo_matrix = [1, 2, 3; 4, 5, 6]''';
+foo_cell = {1, 2, 3; 4, 5, 6}''.'.';
diff --git a/test/detect/mel/default.txt b/test/detect/mel/default.txt
new file mode 100644
index 0000000..d8abe7e
--- /dev/null
+++ b/test/detect/mel/default.txt
@@ -0,0 +1,25 @@
+proc string[] getSelectedLights()
+
+{
+  string $selectedLights[];
+
+  string $select[] = `ls -sl -dag -leaf`;
+
+  for ( $shape in $select )
+  {
+    // Determine if this is a light.
+    //
+    string $class[] = getClassification( `nodeType $shape` );
+
+
+    if ( ( `size $class` ) > 0 && ( "light" == $class[0] ) )
+    {
+      $selectedLights[ `size $selectedLights` ] = $shape;
+    }
+  }
+
+  // Result is an array of all lights included in
+
+  // current selection list.
+  return $selectedLights;
+}
diff --git a/test/detect/mizar/default.txt b/test/detect/mizar/default.txt
new file mode 100644
index 0000000..87b2d99
--- /dev/null
+++ b/test/detect/mizar/default.txt
@@ -0,0 +1,86 @@
+::: ## Lambda calculus
+
+environ
+
+  vocabularies LAMBDA,
+      NUMBERS,
+      NAT_1, XBOOLE_0, SUBSET_1, FINSEQ_1, XXREAL_0, CARD_1,
+      ARYTM_1, ARYTM_3, TARSKI, RELAT_1, ORDINAL4, FUNCOP_1;
+
+  :: etc...
+
+begin
+
+reserve D for DecoratedTree,
+        p,q,r for FinSequence of NAT,
+        x for set;
+
+definition
+  let D;
+
+  attr D is LambdaTerm-like means
+    (dom D qua Tree) is finite &
+::>                          *143,306
+    for r st r in dom D holds
+      r is FinSequence of {0,1} &
+      r^<*0*> in dom D implies D.r = 0;
+end;
+
+registration
+  cluster LambdaTerm-like for DecoratedTree of NAT;
+  existence;
+::>       *4
+end;
+
+definition
+  mode LambdaTerm is LambdaTerm-like DecoratedTree of NAT;
+end;
+
+::: Then we extend this ordinary one-step beta reduction, that is,
+:::  any subterm is also allowed to reduce.
+definition
+  let M,N;
+
+  pred M beta N means
+    ex p st
+      M|p beta_shallow N|p &
+      for q st not p is_a_prefix_of q holds
+        [r,x] in M iff [r,x] in N;
+end;
+
+theorem Th4:
+  ProperPrefixes (v^<*x*>) = ProperPrefixes v \/ {v}
+proof
+  thus ProperPrefixes (v^<*x*>) c= ProperPrefixes v \/ {v}
+  proof
+    let y;
+    assume y in ProperPrefixes (v^<*x*>);
+    then consider v1 such that
+A1: y = v1 and
+A2: v1 is_a_proper_prefix_of v^<*x*> by TREES_1:def 2;
+ v1 is_a_prefix_of v & v1 <> v or v1 = v by A2,TREES_1:9;
+then
+ v1 is_a_proper_prefix_of v or v1 in {v} by TARSKI:def 1,XBOOLE_0:def 8;
+then  y in ProperPrefixes v or y in {v} by A1,TREES_1:def 2;
+    hence thesis by XBOOLE_0:def 3;
+  end;
+  let y;
+  assume y in ProperPrefixes v \/ {v};
+then A3: y in ProperPrefixes v or y in {v} by XBOOLE_0:def 3;
+A4: now
+    assume y in ProperPrefixes v;
+    then consider v1 such that
+A5: y = v1 and
+A6: v1 is_a_proper_prefix_of v by TREES_1:def 2;
+ v is_a_prefix_of v^<*x*> by TREES_1:1;
+then  v1 is_a_proper_prefix_of v^<*x*> by A6,XBOOLE_1:58;
+    hence thesis by A5,TREES_1:def 2;
+  end;
+ v^{} = v by FINSEQ_1:34;
+  then
+ v is_a_prefix_of v^<*x*> & v <> v^<*x*> by FINSEQ_1:33,TREES_1:1;
+then  v is_a_proper_prefix_of v^<*x*> by XBOOLE_0:def 8;
+then  y in ProperPrefixes v or y = v & v in ProperPrefixes (v^<*x*>)
+  by A3,TARSKI:def 1,TREES_1:def 2;
+  hence thesis by A4;
+end;
\ No newline at end of file
diff --git a/test/detect/monkey/default.txt b/test/detect/monkey/default.txt
new file mode 100644
index 0000000..4db94a7
--- /dev/null
+++ b/test/detect/monkey/default.txt
@@ -0,0 +1,37 @@
+#IMAGE_FILES="*.png|*.jpg"
+#SOUND_FILES="*.wav|*.ogg"
+#MUSIC_FILES="*.wav|*.ogg"
+#BINARY_FILES="*.bin|*.dat"
+
+Import mojo
+
+' The main class which expends Mojo's 'App' class:
+Class GameApp Extends App
+    Field player:Player
+
+    Method OnCreate:Int()
+        Local img:Image = LoadImage("player.png")
+        Self.player = New Player()
+        SetUpdateRate(60)
+
+        Return 0
+    End
+
+    Method OnUpdate:Int()
+        player.x += HALFPI
+
+        If (player.x > 100) Then
+            player.x = 0
+        Endif
+
+        Return 0
+    End
+
+    Method OnRender:Int()
+        Cls(32, 64, 128)
+        player.Draw()
+
+        player = Null
+        Return 0
+    End
+End
diff --git a/test/detect/nginx/default.txt b/test/detect/nginx/default.txt
new file mode 100644
index 0000000..adf4b7e
--- /dev/null
+++ b/test/detect/nginx/default.txt
@@ -0,0 +1,47 @@
+user  www www;
+worker_processes  2;
+pid /var/run/nginx.pid;
+error_log  /var/log/nginx.error_log  debug | info | notice | warn | error | crit;
+
+events {
+    connections   2000;
+    use kqueue | rtsig | epoll | /dev/poll | select | poll;
+}
+
+http {
+    log_format main      '$remote_addr - $remote_user [$time_local] '
+                         '"$request" $status $bytes_sent '
+                         '"$http_referer" "$http_user_agent" '
+                         '"$gzip_ratio"';
+
+    send_timeout 3m;
+    client_header_buffer_size 1k;
+
+    gzip on;
+    gzip_min_length 1100;
+
+    #lingering_time 30;
+
+    server {
+        server_name   one.example.com  www.one.example.com;
+        access_log   /var/log/nginx.access_log  main;
+
+        rewrite (.*) /index.php?page=$1 break;
+
+        location / {
+            proxy_pass         http://127.0.0.1/;
+            proxy_redirect     off;
+            proxy_set_header   Host             $host;
+            proxy_set_header   X-Real-IP        $remote_addr;
+            charset            koi8-r;
+        }
+
+        location /api/ {
+            fastcgi_pass 127.0.0.1:9000;
+        }
+
+        location ~* \.(jpg|jpeg|gif)$ {
+            root         /spool/www;
+        }
+    }
+}
diff --git a/test/detect/nimrod/default.txt b/test/detect/nimrod/default.txt
new file mode 100644
index 0000000..dae8286
--- /dev/null
+++ b/test/detect/nimrod/default.txt
@@ -0,0 +1,22 @@
+
+import module1, module2, module3
+from module4 import nil
+
+type
+  TFoo = object ## Doc comment
+    a: int32
+  PFoo = ref TFoo
+
+proc do_stuff314(param_1: TFoo, par2am: var PFoo): PFoo {.exportc: "dostuff" .} =
+  # Regular comment
+  discard """
+  dfag
+sdfg""
+"""
+  result = nil
+
+method abc(a: TFoo) = discard 1u32 + 0xabcdefABCDEFi32 + 0o01234567i8 + 0b010
+
+discard rawstring"asdf""adfa"
+var normalstring = "asdf"
+let a: uint32 = 0xFFaF'u32
diff --git a/test/detect/nix/default.txt b/test/detect/nix/default.txt
new file mode 100644
index 0000000..ae8b8f7
--- /dev/null
+++ b/test/detect/nix/default.txt
@@ -0,0 +1,24 @@
+{ stdenv, foo, bar ? false, ... }:
+
+/*
+ * foo
+ */
+
+let
+  a = 1; # just a comment
+  b = null;
+  c = toString 10;
+in stdenv.mkDerivation rec {
+  name = "foo-${version}";
+  version = "1.3";
+
+  configureFlags = [ "--with-foo2" ] ++ stdenv.lib.optional bar "--with-foo=${ with stdenv.lib; foo }"
+
+  postInstall = ''
+    ${ if true then "--${test}" else false }
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://nixos.org;
+  };
+}
diff --git a/test/detect/nsis/default.txt b/test/detect/nsis/default.txt
new file mode 100644
index 0000000..ad0a41a
--- /dev/null
+++ b/test/detect/nsis/default.txt
@@ -0,0 +1,33 @@
+/*
+  NSIS Scheme
+  for highlight.js
+*/
+
+; Includes
+!include MUI2.nsh
+
+; Settings
+Name "installer_name"
+OutFile "installer_name.exe"
+RequestExecutionLevel user
+CRCCheck on
+!ifdef x64
+  InstallDir "$PROGRAMFILES64\installer_name"
+!else
+  InstallDir "$PROGRAMFILES\installer_name"
+!endif
+
+; Pages
+!insertmacro MUI_PAGE_INSTFILES
+
+; Sections
+Section "section_name" section_index
+  # your code here
+SectionEnd
+
+; Functions
+Function .onInit
+
+  MessageBox MB_OK "Here comes a$\n$\rline-break!"
+
+FunctionEnd
diff --git a/test/detect/objectivec/default.txt b/test/detect/objectivec/default.txt
new file mode 100644
index 0000000..177f2ff
--- /dev/null
+++ b/test/detect/objectivec/default.txt
@@ -0,0 +1,43 @@
+#import <UIKit/UIKit.h>
+#import "Dependency.h"
+
+ at protocol WorldDataSource
+ at optional
+- (NSString*)worldName;
+ at required
+- (BOOL)allowsToLive;
+ at end
+
+ at interface Test : NSObject <HelloDelegate, WorldDataSource> {
+  NSString *_greeting;
+}
+
+ at property (nonatomic, readonly) NSString *greeting;
+- (IBAction) show;
+ at end
+
+ at implementation Test
+
+ at synthesize test=_test;
+
++ (id) test {
+  return [self testWithGreeting:@"Hello, world!\nFoo bar!"];
+}
+
++ (id) testWithGreeting:(NSString*)greeting {
+  return [[[self alloc] initWithGreeting:greeting] autorelease];
+}
+
+- (id) initWithGreeting:(NSString*)greeting {
+  if ( (self = [super init]) ) {
+    _greeting = [greeting retain];
+  }
+  return self;
+}
+
+- (void) dealloc {
+  [_greeting release];
+  [super dealloc];
+}
+
+ at end
diff --git a/test/detect/ocaml/default.txt b/test/detect/ocaml/default.txt
new file mode 100644
index 0000000..60d199c
--- /dev/null
+++ b/test/detect/ocaml/default.txt
@@ -0,0 +1,23 @@
+(* This is a
+multiline, (* nested *) comment *)
+type point = { x: float; y: float };;
+let some_string = "this is a string";;
+let rec length lst =
+    match lst with
+      [] -> 0
+    | head :: tail -> 1 + length tail
+  ;;
+exception Test;;
+type expression =
+      Const of float
+    | Var of string
+    | Sum of expression * expression    (* e1 + e2 *)
+    | Diff of expression * expression   (* e1 - e2 *)
+    | Prod of expression * expression   (* e1 * e2 *)
+    | Quot of expression * expression   (* e1 / e2 *)
+class point =
+    object
+      val mutable x = 0
+      method get_x = x
+      method private move d = x <- x + d
+    end;;
diff --git a/test/detect/oxygene/default.txt b/test/detect/oxygene/default.txt
new file mode 100644
index 0000000..49b337b
--- /dev/null
+++ b/test/detect/oxygene/default.txt
@@ -0,0 +1,56 @@
+namespace LinkedList;
+
+interface
+
+uses
+  System.Text;
+
+type
+  List<T> = public class
+    where T is Object;
+  private
+    method AppendToString(aBuilder: StringBuilder);
+  public
+    constructor(aData: T);
+    constructor(aData: T; aNext: List<T>);
+    property Next: List<T>;
+    property Data: T;
+
+    method ToString: string; override;
+  end;
+
+implementation
+
+constructor List<T>(aData: T);
+begin
+  Data := aData;
+end;
+
+constructor List<T>(aData: T; aNext: List<T>);
+begin
+  constructor(aData);
+  Next := aNext;
+end;
+
+method List<T>.ToString: string;
+begin
+  with lBuilder := new StringBuilder do begin
+    AppendToString(lBuilder);
+    result := lBuilder.ToString();
+  end;
+end;
+
+method List<T>.AppendToString(aBuilder: StringBuilder);
+begin
+  if assigned(Data) then
+    aBuilder.Append(Data.ToString)
+  else
+    aBuilder.Append('nil');
+
+  if assigned(Next) then begin
+    aBuilder.Append(', ');
+    Next.AppendToString(aBuilder);
+  end;
+end;
+
+end.
diff --git a/test/detect/parser3/default.txt b/test/detect/parser3/default.txt
new file mode 100644
index 0000000..65374a3
--- /dev/null
+++ b/test/detect/parser3/default.txt
@@ -0,0 +1,34 @@
+ at CLASS
+base
+
+ at USE
+module.p
+
+ at BASE
+class
+
+# Comment for code
+ at create[aParam1;aParam2][local1;local2]
+  ^connect[mysql://host/database?ClientCharset=windows-1251]
+  ^for[i](1;10){
+    <p class="paragraph">^eval($i+10)</p>
+    ^connect[mysql://host/database]{
+      $tab[^table::sql{select * from `table` where a='1'}]
+      $var_Name[some${value}]
+    }
+  }
+
+  ^rem{
+    Multiline comment with code: $var
+    ^while(true){
+      ^for[i](1;10){
+        ^sleep[]
+      }
+    }
+  }
+  ^taint[^#0A]
+
+ at GET_base[]
+## Comment for code
+  # Isn't comment
+  $result[$.hash_item1[one] $.hash_item2[two]]
diff --git a/test/detect/perl/default.txt b/test/detect/perl/default.txt
new file mode 100644
index 0000000..17f5d2d
--- /dev/null
+++ b/test/detect/perl/default.txt
@@ -0,0 +1,32 @@
+# loads object
+sub load
+{
+  my $flds = $c->db_load($id, at _) || do {
+    Carp::carp "Can`t load (class: $c, id: $id): '$!'"; return undef
+  };
+  my $o = $c->_perl_new();
+  $id12 = $id / 24 / 3600;
+  $o->{'ID'} = $id12 + 123;
+  #$o->{'SHCUT'} = $flds->{'SHCUT'};
+  my $p = $o->props;
+  my $vt;
+  $string =~ m/^sought_text$/;
+  $items = split //, 'abc';
+  $string //= "bar";
+  for my $key (keys %$p)
+  {
+    if(${$vt.'::property'}) {
+      $o->{$key . '_real'} = $flds->{$key};
+      tie $o->{$key}, 'CMSBuilder::Property', $o, $key;
+    }
+  }
+  $o->save if delete $o->{'_save_after_load'};
+
+  # GH-117
+  my $g = glob("/usr/bin/*");
+
+  return $o;
+}
+
+=head1 NAME
+POD till the end of file
diff --git a/test/detect/php/default.txt b/test/detect/php/default.txt
new file mode 100644
index 0000000..635d6ed
--- /dev/null
+++ b/test/detect/php/default.txt
@@ -0,0 +1,52 @@
+require_once 'Zend/Uri/Http.php';
+
+namespace Location\Web;
+
+interface Factory
+{
+    static function _factory();
+}
+
+abstract class URI extends BaseURI implements Factory
+{
+    abstract function test();
+
+    public static $st1 = 1;
+    const ME = "Yo";
+    var $list = NULL;
+    private $var;
+
+    /**
+     * Returns a URI
+     *
+     * @return URI
+     */
+    static public function _factory($stats = array(), $uri = 'http')
+    {
+        echo __METHOD__;
+        $uri = explode(':', $uri, 0b10);
+        $schemeSpecific = isset($uri[1]) ? $uri[1] : '';
+        $desc = 'Multi
+line description';
+
+        // Security check
+        if (!ctype_alnum($scheme)) {
+            throw new Zend_Uri_Exception('Illegal scheme');
+        }
+
+        $this->var = 0 - self::$st;
+        $this->list = list(Array("1"=> 2, 2=>self::ME));
+
+        return [
+            'uri'   => $uri,
+            'value' => null,
+        ];
+    }
+}
+
+echo URI::ME . URI::$st1;
+
+__halt_compiler () ; datahere
+datahere
+datahere */
+datahere
diff --git a/test/detect/profile/default.txt b/test/detect/profile/default.txt
new file mode 100644
index 0000000..252e006
--- /dev/null
+++ b/test/detect/profile/default.txt
@@ -0,0 +1,8 @@
+       261917242 function calls in 686.251 CPU seconds
+
+       ncalls  tottime  filename:lineno(function)
+       152824  513.894  {method 'sort' of 'list' objects}
+    129590630   83.894  rrule.py:842(__cmp__)
+    129590630   82.439  {cmp}
+       153900    1.296  rrule.py:399(_iter)
+304393/151570    0.963  rrule.py:102(_iter_cached)
diff --git a/test/detect/protobuf/default.txt b/test/detect/protobuf/default.txt
new file mode 100644
index 0000000..90d4af3
--- /dev/null
+++ b/test/detect/protobuf/default.txt
@@ -0,0 +1,23 @@
+package languages.protobuf;
+
+option java_package = "org.highlightjs.languages.protobuf";
+
+message Customer {
+  required int64 customer_id = 1;
+  optional string name = 2;
+  optional string real_name = 3 [default = "Anonymous"];
+  optional Gender gender = 4;
+  repeated string email_addresses = 5;
+
+  optional bool is_admin = 6 [default = false]; // or should this be a repeated field in Account?
+
+  enum Gender {
+    MALE = 1,
+    FEMALE = 2
+  }
+}
+
+service CustomerSearch {
+  rpc FirstMatch(CustomerRequest) returns (CustomerResponse);
+  rpc AllMatches(CustomerRequest) returns (CustomerResponse);
+}
\ No newline at end of file
diff --git a/test/detect/python/default.txt b/test/detect/python/default.txt
new file mode 100644
index 0000000..1216323
--- /dev/null
+++ b/test/detect/python/default.txt
@@ -0,0 +1,12 @@
+ at requires_authorization
+def somefunc(param1='', param2=0):
+    r'''A docstring'''
+    if param1 > param2: # interesting
+        print 'Gre\'ater'
+    return (param2 - param1 + 1 + 0b10l) or None
+
+class SomeClass:
+    pass
+
+>>> message = '''interpreter
+... prompt'''
diff --git a/test/detect/q/default.txt b/test/detect/q/default.txt
new file mode 100644
index 0000000..6e9e3d9
--- /dev/null
+++ b/test/detect/q/default.txt
@@ -0,0 +1,9 @@
+select time, price by date,stock from quote where price=(max;price)fby stock
+data:raze value flip trade
+select vwap:size wavg price by 5 xbar time.minute from aapl where date within (.z.d-10;.z.d)
+f1:{[x;y;z] show (x;y+z);sum 1 2 3}
+.z.pc:{[handle] show -3!(`long$.z.p;"Closed";handle)}
+// random normal distribution, e.g. nor 10
+nor:{$[x=2*n:x div 2;raze sqrt[-2*log n?1f]*/:(sin;cos)@\:(2*pi)*n?1f;-1_.z.s 1+x]}
+
+mode:{where g=max g:count each group x}		// mode function
\ No newline at end of file
diff --git a/test/detect/r/default.txt b/test/detect/r/default.txt
new file mode 100644
index 0000000..fc9f4e5
--- /dev/null
+++ b/test/detect/r/default.txt
@@ -0,0 +1,69 @@
+library(ggplot2)
+
+centre <- function(x, type, ...) {
+  switch(type,
+         mean = mean(x),
+         median = median(x),
+         trimmed = mean(x, trim = .1))
+}
+
+myVar1
+myVar.2
+data$x
+foo "bar" baz
+# test "test"
+"test # test"
+
+(123) (1) (10) (0.1) (.2) (1e-7)
+(1.2e+7) (2e) (3e+10) (0x0) (0xa)
+(0xabcdef1234567890) (123L) (1L)
+(0x10L) (10000000L) (1e6L) (1.1L)
+(1e-3L) (4123.381E-10i)
+(3.) (3.E10) # BUG: .E10 should be part of number
+
+# Numbers in some different contexts
+1L
+0x40
+.234
+3.
+1L + 30
+plot(cars, xlim=20)
+plot(cars, xlim=0x20)
+foo<-30
+my.data.3 <- read() # not a number
+c(1,2,3)
+1%%2
+
+"this is a quote that spans
+multiple lines
+\"
+
+is this still a quote? it should be.
+# even still!
+
+" # now we're done.
+
+'same for
+single quotes #'
+
+# keywords
+NULL, NA, TRUE, FALSE, Inf, NaN, NA_integer_,
+NA_real_, NA_character_, NA_complex_, function,
+while, repeat, for, if, in, else, next, break,
+..., ..1, ..2
+
+# not keywords
+the quick brown fox jumped over the lazy dogs
+null na true false inf nan na_integer_ na_real_
+na_character_ na_complex_ Function While Repeat
+For If In Else Next Break .. .... "NULL" `NULL` 'NULL'
+
+# operators
++, -, *, /, %%, ^, >, >=, <, <=, ==, !=, !, &, |, ~,
+->, <-, <<-, $, :, ::
+
+# infix operator
+foo %union% bar
+%"test"%
+`"test"`
+
diff --git a/test/detect/rib/default.txt b/test/detect/rib/default.txt
new file mode 100644
index 0000000..ff23469
--- /dev/null
+++ b/test/detect/rib/default.txt
@@ -0,0 +1,25 @@
+FrameBegin 0
+Display "Scene" "framebuffer" "rgb"
+Option "searchpath" "shader" "+&:/home/kew"
+Option "trace" "int maxdepth" [4]
+Attribute "visibility" "trace" [1]
+Attribute "irradiance" "maxerror" [0.1]
+Attribute "visibility" "transmission" "opaque"
+Format 640 480 1.0
+ShadingRate 2
+PixelFilter "catmull-rom" 1 1
+PixelSamples 4 4
+Projection "perspective" "fov" 49.5502811377
+Scale 1 1 -1
+
+WorldBegin
+
+ReadArchive "Lamp.002_Light/instance.rib"
+Surface "plastic"
+ReadArchive "Cube.004_Mesh/instance.rib"
+# ReadArchive "Sphere.010_Mesh/instance.rib"
+# ReadArchive "Sphere.009_Mesh/instance.rib"
+ReadArchive "Sphere.006_Mesh/instance.rib"
+
+WorldEnd
+FrameEnd
diff --git a/test/detect/rsl/default.txt b/test/detect/rsl/default.txt
new file mode 100644
index 0000000..3cc4a0f
--- /dev/null
+++ b/test/detect/rsl/default.txt
@@ -0,0 +1,15 @@
+#define TEST_DEFINE 3.14
+/*  plastic surface shader
+ *
+ *  Pixie is:
+ *  (c) Copyright 1999-2003 Okan Arikan. All rights reserved.
+ */
+
+surface plastic (float Ka = 1, Kd = 0.5, Ks = 0.5, roughness = 0.1;
+                 color specularcolor = 1;) {
+  normal Nf = faceforward (normalize(N),I);
+  Ci = Cs * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks *
+       specular(Nf,-normalize(I),roughness);
+  Oi = Os;
+  Ci *= Oi;
+}
diff --git a/test/detect/ruby/default.txt b/test/detect/ruby/default.txt
new file mode 100644
index 0000000..85929f9
--- /dev/null
+++ b/test/detect/ruby/default.txt
@@ -0,0 +1,57 @@
+class A < B; def self.create(object = User) object end end
+class Zebra; def inspect; "X#{2 + self.object_id}" end end
+
+module ABC::DEF
+  include Comparable
+
+  # @param test
+  # @return [String] nothing
+  def foo(test)
+    Thread.new do |blockvar|
+      ABC::DEF.reverse(:a_symbol, :'a symbol', :<=>, 'test' + ?\012)
+      answer = valid?4 && valid?CONST && ?A && ?A.ord
+    end.join
+  end
+
+  def [](index) self[index] end
+  def ==(other) other == self end
+end
+
+class Car < ActiveRecord::Base
+  has_many :wheels, :class_name => 'Wheel', :foreign_key => 'car_id'
+  has_many :wheels, class_name: 'Wheel', foreign_key: 'car_id'
+  scope :available, -> { where(available: true) }
+end
+omega = -> { 'alpha' }
+alpha = ->(arg) { arg*2 }
+hash = {1 => 'one', 2 => 'two'}
+
+anIdentifier = an_identifier
+Constant = 1
+render action: :new
+
+str =~ /^(?:foo)$/
+str =~ %r{foo|bar|buz$}
+str =~ %r!foo|bar$!
+str =~ %r[foo|bar$]
+str =~ %r(\(foo|bar\)$)
+
+2.0.0p0 :001 > ['some']
+ => ["some"]
+2.0.0p0 :002 > if true
+2.0.0p0 :003?>   "yop"
+2.0.0p0 :004?>   end
+ => "yop"
+
+>> obj = OpenStruct.new :integer => 987, :symbol => :so_great
+=> #<OpenStruct integer=987, symbol=:so_great>
+>> [obj,obj,obj]
+=> [#<OpenStruct integer=987, symbol=:so_great>, #<OpenStruct integer=987, symbol=:so_great>, #<OpenStruct integer=987, symbol=:so_great>]
+>> {1 => obj, 2 => obj}
+=> {1=>#<OpenStruct integer=987, symbol=:so_great>, 2=>#<OpenStruct integer=987, symbol=:so_great>}
+>> if 10 > 20
+>> "YEAH"
+>> else
+?> "NO"
+>> end
+=> "NO"
diff --git a/test/detect/ruleslanguage/default.txt b/test/detect/ruleslanguage/default.txt
new file mode 100644
index 0000000..566d03e
--- /dev/null
+++ b/test/detect/ruleslanguage/default.txt
@@ -0,0 +1,36 @@
+//This is a comment
+ABORT "You experienced an abort.";
+WARN "THIS IS A WARNING";
+CALL "RIDER_X";
+DONE;
+FOR EACH X IN CSV_FILE "d:\lodestar\user\d377.lse"
+ LEAVE FOR;
+END FOR;
+IF ((BILL_KW = 0) AND (KW > 0)) THEN
+END IF;
+INCLUDE "R1";
+LEAVE RIDER;
+SELECT BILL_PERIOD
+   WHEN "WINTER"
+      BLOCK KWH
+      FROM 0 TO 400 CHARGE $0.03709
+      FROM 400 CHARGE $0.03000
+      TOTAL $ENERGY_CHARGE_WIN;
+   WHEN "SUMMER"
+      $VOLTAGE_DISCOUNT_SUM = $0.00
+   OTHERWISE
+      $VOLTAGE_DISCOUNT_SUM = $1.00
+END SELECT;
+/* Report top five peaks */
+LABEL PK.NM "Peak Number";
+SAVE_UPDATE MV TO TABLE "METERVALUE";
+
+FOR EACH INX IN ARRAYUPPERBOUND(#MYARRAY[])
+  #MYARRAY[INX].VALUE = 2;
+  CLEAR #MYARRAY[];
+END FOR
+
+//Interval Data
+HNDL_1_ADD_EDI = INTDADDATTRIBUTE(HNDL_1, "EDI_TRANSACTION", EDI_ID);
+HNDL_1_ADD_VAL_MSG = INTDADDVMSG(HNDL_1,"Missing (Status Code 9) values found");
+EMPTY_HNDL = INTDCREATEHANDLE('05/03/2006 00:00:00', '05/03/2006 23:59:59', 3600, "Y", "0", " ");
diff --git a/test/detect/rust/default.txt b/test/detect/rust/default.txt
new file mode 100644
index 0000000..24a1f81
--- /dev/null
+++ b/test/detect/rust/default.txt
@@ -0,0 +1,75 @@
+use std;
+
+123;                               // type int
+123u;                              // type uint
+123_u;                             // type uint
+0xff00;                            // type int
+0xff_u8;                           // type u8
+0b1111_1111_1001_0000_i32;         // type i32
+123.0;                             // type float
+0.1;                               // type float
+3f;                                // type float
+0.1f32;                            // type f32
+12E+99_f64;                        // type f64
+
+'a';
+'\n';
+'\x1A';
+'\u12AS';
+'\U1234ASDF';
+
+r"hello";
+r###"world"###;
+r##" "### "# "##;
+
+/* Factorial */
+fn fac(n: int) -> int {
+    let s: str = "This is
+a multi-line string.
+
+It ends with an unescaped '\"'.";
+    let c: char = 'Ф';
+    let r: str = r##" raw string "##;
+
+    let result = 1, i = 1;
+    while i <= n { // No parens around the condition
+        result *= i;
+        i += 1;
+    }
+    ret result;
+}
+
+pure fn pure_length<T>(ls: list<T>) -> uint { /* ... */ }
+
+type t = map::hashtbl<int,str>;
+let x = id::<int>(10);
+
+// Define some modules.
+#[path = "foo.rs"]
+mod foo;
+
+impl <T> Seq<T> for [T] {
+    fn len() -> uint { vec::len(self) }
+    fn iter(b: fn(T)) {
+        for elt in self { b(elt); }
+    }
+}
+
+enum list<T> {
+    Nil;
+    Cons(T, @list<T>);
+}
+
+let a: list<int> = Cons(7, @cons(13, @nil));
+
+struct Baz<'a> {
+    baz: &'a str,
+}
+
+'h: for i in range(0,10) {
+    'g: loop {
+        if i % 2 == 0 { continue 'h; }
+        if i == 9 { break 'h; }
+        break 'g;
+    }
+}
diff --git a/test/detect/scala/default.txt b/test/detect/scala/default.txt
new file mode 100644
index 0000000..d0de617
--- /dev/null
+++ b/test/detect/scala/default.txt
@@ -0,0 +1,44 @@
+case class Person(name: String, age: Int)
+
+def absoluteValue(n: Int): Int =
+  if (n < 0) -n else n
+
+val hux = "hux"
+def mux = "mux"
+def qux: String = "qux"
+
+type ξ[A] = (A, A)
+
+trait Hist { lhs =>
+  def ⊕(rhs: Hist): Hist
+}
+
+def gsum[A: Ring](as: Seq[A]): A =
+  as.foldLeft(Ring[A].zero)(_ + _)
+
+sealed trait Compass
+case object North extends Compass
+case object South extends Compass
+case object East extends Compass
+case object West extends Compass
+
+trait Cake {
+  type T;
+  val things: Seq[T]
+
+  abstract class Spindler
+
+  def spindle(s: Spindler, ts: Seq[T], reversed: Boolean = false): Seq[T]
+}
+
+val colors = Map(
+  "red" -> 0xFF0000,
+  "turquoise" -> 0x00FFFF,
+  "black" -> 0x000000,
+  "orange" -> 0xFF8040,
+  "brown" -> 0x804000)
+
+lazy val ns = for {
+  x <- 0 until 100
+  y <- 0 until 100
+} yield (x + y) * 33.33
diff --git a/test/detect/scheme/default.txt b/test/detect/scheme/default.txt
new file mode 100644
index 0000000..b62a98c
--- /dev/null
+++ b/test/detect/scheme/default.txt
@@ -0,0 +1,28 @@
+;; Calculation of Hofstadter's male and female sequences as a list of pairs
+
+(define (hofstadter-male-female n)
+(letrec ((female (lambda (n)
+           (if (= n 0)
+           1
+           (- n (male (female (- n 1)))))))
+     (male (lambda (n)
+         (if (= n 0)
+             0
+             (- n (female (male (- n 1))))))))
+  (let loop ((i 0))
+    (if (> i n)
+    '()
+    (cons (cons (female i)
+            (male i))
+      (loop (+ i 1)))))))
+
+(hofstadter-male-female 8)
+
+(define (find-first func lst)
+(call-with-current-continuation
+ (lambda (return-immediately)
+   (for-each (lambda (x)
+       (if (func x)
+           (return-immediately x)))
+         lst)
+   #f)))
diff --git a/test/detect/scilab/default.txt b/test/detect/scilab/default.txt
new file mode 100644
index 0000000..3f466c8
--- /dev/null
+++ b/test/detect/scilab/default.txt
@@ -0,0 +1,14 @@
+// A comment
+function I = foo(dims, varargin)
+  d=[1; matrix(dims(1:$-1),-1,1)]
+  for i=1:size(varargin)
+    if varargin(i)==[] then
+       I=[],
+       return;
+    end
+  end
+endfunction
+
+b = cos(a) + cosh(a);
+bar_matrix = [ "Hello", "world" ];
+foo_matrix = [1, 2, 3; 4, 5, 6];
diff --git a/test/detect/scss/default.txt b/test/detect/scss/default.txt
new file mode 100644
index 0000000..3e6b880
--- /dev/null
+++ b/test/detect/scss/default.txt
@@ -0,0 +1,73 @@
+ at import "compass/reset";
+
+// variables
+$colorGreen: #008000;
+$colorGreenDark: darken($colorGreen, 10);
+
+ at mixin container {
+    max-width: 980px;
+}
+
+// mixins with parameters
+ at mixin button($color:green) {
+    @if ($color == green) {
+        background-color: #008000;
+    }
+    @else if ($color == red) {
+        background-color: #B22222;
+    }
+}
+
+button {
+    @include button(red);
+}
+
+div,
+.navbar,
+#header,
+input[type="input"] {
+    font-family: "Helvetica Neue", Arial, sans-serif;
+    width: auto;
+    margin: 0 auto;
+    display: block;
+}
+
+.row-12 > [class*="spans"] {
+    border-left: 1px solid #B5C583;
+}
+
+// nested definitions
+ul {
+    width: 100%;
+    padding: {
+        left: 5px; right: 5px;
+    }
+  li {
+      float: left; margin-right: 10px;
+      .home {
+          background: url('http://placehold.it/20') scroll no-repeat 0 0;
+    }
+  }
+}
+
+.banner {
+    @extend .container;
+}
+
+a {
+  color: $colorGreen;
+  &:hover { color: $colorGreenDark; }
+  &:visited { color: #c458cb; }
+}
+
+ at for $i from 1 through 5 {
+    .span#{$i} {
+        width: 20px*$i;
+    }
+}
+
+ at mixin mobile {
+  @media screen and (max-width : 600px) {
+    @content;
+  }
+}
\ No newline at end of file
diff --git a/test/detect/smalltalk/default.txt b/test/detect/smalltalk/default.txt
new file mode 100644
index 0000000..7c960a7
--- /dev/null
+++ b/test/detect/smalltalk/default.txt
@@ -0,0 +1,39 @@
+Object>>method: num
+    "comment 123"
+    | var1 var2 |
+    (1 to: num) do: [:i | |var| ^i].
+    Klass with: var1.
+    Klass new.
+    arr := #('123' 123.345 #hello Transcript var $@).
+    arr := #().
+    var2 = arr at: 3.
+    ^ self abc
+
+heapExample
+    "HeapTest new heapExample"
+    "Multiline
+    decription"
+    | n rnd array time sorted |
+    n := 5000.
+    "# of elements to sort"
+    rnd := Random new.
+    array := (1 to: n)
+                collect: [:i | rnd next].
+    "First, the heap version"
+    time := Time
+                millisecondsToRun: [sorted := Heap withAll: array.
+    1
+        to: n
+        do: [:i |
+            sorted removeFirst.
+            sorted add: rnd next]].
+    Transcript cr; show: 'Time for Heap: ' , time printString , ' msecs'.
+    "The quicksort version"
+    time := Time
+                millisecondsToRun: [sorted := SortedCollection withAll: array.
+    1
+        to: n
+        do: [:i |
+            sorted removeFirst.
+            sorted add: rnd next]].
+    Transcript cr; show: 'Time for SortedCollection: ' , time printString , ' msecs'
diff --git a/test/detect/sql/default.txt b/test/detect/sql/default.txt
new file mode 100644
index 0000000..1879ddf
--- /dev/null
+++ b/test/detect/sql/default.txt
@@ -0,0 +1,19 @@
+BEGIN;
+CREATE TABLE "topic" (
+    -- This is the greatest table of all time
+    "id" serial NOT NULL PRIMARY KEY,
+    "forum_id" integer NOT NULL,
+    "subject" varchar(255) NOT NULL -- Because nobody likes an empty subject
+);
+ALTER TABLE "topic" ADD CONSTRAINT forum_id FOREIGN KEY ("forum_id") REFERENCES "forum" ("id");
+
+-- Initials
+insert into "topic" ("forum_id", "subject") values (2, 'D''artagnian');
+
+select /* comment */ count(*) from cicero_forum;
+
+-- this line lacks ; at the end to allow people to be sloppy and omit it in one-liners
+/*
+but who cares?
+*/
+COMMIT
\ No newline at end of file
diff --git a/test/detect/swift/default.txt b/test/detect/swift/default.txt
new file mode 100644
index 0000000..70908cb
--- /dev/null
+++ b/test/detect/swift/default.txt
@@ -0,0 +1,11 @@
+extension MyClass : Interface {
+    class func unarchiveFromFile<A>(file : A, (Int,Int) -> B) -> SKNode? {
+        let path: String = bundle.pathForResource(file, ofType: "file\(name + 5).txt")
+        let funnyNumber = 3 + 0xC2.15p2 * (1_000_000.000_000_1 - 000123.456) + 0o21
+        var sceneData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil)
+        /* a comment /* with a nested comment */ and the end */
+    }
+    @objc override func shouldAutorotate() {
+        return true
+    }
+}
diff --git a/test/detect/tex/default.txt b/test/detect/tex/default.txt
new file mode 100644
index 0000000..10b2555
--- /dev/null
+++ b/test/detect/tex/default.txt
@@ -0,0 +1,17 @@
+\documentclass{article}
+\usepackage[koi8-r]{inputenc}
+\hoffset=0pt
+\voffset=.3em
+\tolerance=400
+\newcommand{\eTiX}{\TeX}
+\begin{document}
+\section*{Highlight.js}
+\begin{table}[c|c]
+$\frac 12\, + \, \frac 1{x^3}\text{Hello \! world}$ & \textbf{Goodbye\~ world} \\\eTiX $ \pi=400 $
+\end{table}
+Ch\'erie, \c{c}a ne me pla\^\i t pas! % comment \b
+G\"otterd\"ammerung~45\%=34.
+$$
+    \int\limits_{0}^{\pi}\frac{4}{x-7}=3
+$$
+\end{document}
diff --git a/test/detect/thrift/default.txt b/test/detect/thrift/default.txt
new file mode 100644
index 0000000..fe2c6cd
--- /dev/null
+++ b/test/detect/thrift/default.txt
@@ -0,0 +1,40 @@
+namespace * thrift.test
+
+/**
+ * Docstring!
+ */
+enum Numberz
+{
+  ONE = 1,
+  TWO,
+  THREE,
+  FIVE = 5,
+  SIX,
+  EIGHT = 8
+}
+
+const Numberz myNumberz = Numberz.ONE;
+// the following is expected to fail:
+// const Numberz urNumberz = ONE;
+
+typedef i64 UserId
+
+struct Msg
+{
+  1: string message,
+  2: i32 type
+}
+struct NestedListsI32x2
+{
+  1: list<list<i32>> integerlist
+}
+struct NestedListsI32x3
+{
+  1: list<list<list<i32>>> integerlist
+}
+service ThriftTest
+{
+  void        testVoid(),
+  string      testString(1: string thing),
+  oneway void testInit()
+}
\ No newline at end of file
diff --git a/test/detect/typescript/default.txt b/test/detect/typescript/default.txt
new file mode 100644
index 0000000..0e97b4a
--- /dev/null
+++ b/test/detect/typescript/default.txt
@@ -0,0 +1,16 @@
+class MyClass {
+    public static myValue: string;
+    constructor(init: string) {
+      this.myValue = init;
+    }
+  }
+  import fs = require("fs");
+  module MyModule {
+    export interface MyInterface extends OtherInterface {
+      myProperty: any;
+    }
+  }
+  declare magicNumber number;
+  myArray.forEach(() => {
+    // fat arrow syntax
+  });
\ No newline at end of file
diff --git a/test/detect/vala/default.txt b/test/detect/vala/default.txt
new file mode 100644
index 0000000..aed0468
--- /dev/null
+++ b/test/detect/vala/default.txt
@@ -0,0 +1,46 @@
+using DBus;
+
+namespace Test {
+  class Foo : Object {
+    public signal void some_event ();   // definition of the signal
+    public void method () {
+      some_event ();                    // emitting the signal (callbacks get invoked)
+    }
+  }
+}
+
+/* defining a class */
+class Track : GLib.Object, Test.Foo {              /* subclassing 'GLib.Object' */
+  public double mass;                  /* a public field */
+  public double name { get; set; }     /* a public property */
+  private bool terminated = false;     /* a private field */
+  public void terminate() {            /* a public method */
+    terminated = true;
+  }
+}
+
+const ALL_UPPER_CASE = "you should follow this convention";
+
+var t = new Track();      // same as: Track t = new Track();
+var s = "hello";          // same as: string s = "hello";
+var l = new List<int>();       // same as: List<int> l = new List<int>();
+var i = 10;               // same as: int i = 10;
+
+
+#if (ololo)
+Regex regex = /foo/;
+#endif
+
+/*
+ * Entry point can be outside class
+ */
+void main () {
+  var long_string = """
+    Example of "verbatim string".
+    Same as in @"string" in C#
+  """
+  var foo = new Foo ();
+  foo.some_event.connect (callback_a);      // connecting the callback functions
+  foo.some_event.connect (callback_b);
+  foo.method ();
+}
diff --git a/test/detect/vbnet/default.txt b/test/detect/vbnet/default.txt
new file mode 100644
index 0000000..00ac152
--- /dev/null
+++ b/test/detect/vbnet/default.txt
@@ -0,0 +1,42 @@
+Import System
+Import System.IO
+#Const DEBUG = True
+
+Namespace Highlighter.Test
+  ''' <summary>This is an example class.</summary>
+  Public Class Program
+    Protected Shared hello As Integer = 3
+    Private Const ABC As Boolean = False
+
+#Region "Code"
+    ' Cheers!
+    <STAThread()> _
+    Public Shared Sub Main(ByVal args() As String, ParamArray arr As Object) Handles Form1.Click
+      On Error Resume Next
+      If ABC Then
+        While ABC : Console.WriteLine() : End While
+        For i As Long = 0 To 1000 Step 123
+          Try
+            System.Windows.Forms.MessageBox.Show(CInt("1").ToString())
+          Catch ex As Exception       ' What are you doing? Well...
+            Dim exp = CType(ex, IOException)
+            REM ORZ
+            Return
+          End Try
+        Next
+      Else
+        Dim l As New System.Collections.List<String>()
+        SyncLock l
+          If TypeOf l Is Decimal And l IsNot Nothing Then
+            RemoveHandler button1.Paint, delegate
+          End If
+          Dim d = New System.Threading.Thread(AddressOf ThreadProc)
+          Dim a = New Action(Sub(x, y) x + y)
+          Static u = From x As String In l Select x.Substring(2, 4) Where x.Length > 0
+        End SyncLock
+        Do : Laugh() : Loop Until hello = 4
+      End If
+    End Sub
+#End Region
+  End Class
+End Namespace
diff --git a/test/detect/vbscript/default.txt b/test/detect/vbscript/default.txt
new file mode 100644
index 0000000..0982529
--- /dev/null
+++ b/test/detect/vbscript/default.txt
@@ -0,0 +1,29 @@
+' creating configuration storage and initializing with default values
+Set cfg = CreateObject("Scripting.Dictionary")
+
+' reading ini file
+for i = 0 to ubound(ini_strings)
+    s = trim(ini_strings(i))
+
+    ' skipping empty strings and comments
+    if mid(s, 1, 1) <> "#" and len(s) > 0 then
+      ' obtaining key and value
+      parts = split(s, "=", -1, 1)
+
+      if ubound(parts)+1 = 2 then
+        parts(0) = trim(parts(0))
+        parts(1) = trim(parts(1))
+
+        ' reading configuration and filenames
+        select case lcase(parts(0))
+          case "uncompressed""_postfix" cfg.item("uncompressed""_postfix") = parts(1)
+          case "f"
+                    options = split(parts(1), "|", -1, 1)
+                    if ubound(options)+1 = 2 then
+                      ' 0: filename,  1: options
+                      ff.add trim(options(0)), trim(options(1))
+                    end if
+        end select
+      end if
+    end if
+next
\ No newline at end of file
diff --git a/test/detect/vhdl/default.txt b/test/detect/vhdl/default.txt
new file mode 100644
index 0000000..3e7edc0
--- /dev/null
+++ b/test/detect/vhdl/default.txt
@@ -0,0 +1,41 @@
+/*
+ * RS-trigger with assynch. reset
+ */
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity RS_trigger is
+    generic (T: Time := 0ns);
+    port ( R, S  : in  std_logic;
+           Q, nQ : out std_logic;
+           reset, clock : in  std_logic );
+end RS_trigger;
+
+architecture behaviour of RS_trigger is
+    signal QT: std_logic; -- Q(t)
+begin
+    process(clock, reset) is
+        subtype RS is std_logic_vector (1 downto 0);
+    begin
+        if reset = '0' then
+            QT <= '0';
+        else
+            if rising_edge(C) then
+                if not (R'stable(T) and S'stable(T)) then
+                    QT <= 'X';
+                else
+                    case RS'(R&S) is
+                        when "01" => QT <= '1';
+                        when "10" => QT <= '0';
+                        when "11" => QT <= 'X';
+                        when others => null;
+                    end case;
+                end if;
+            end if;
+        end if;
+    end process;
+
+    Q  <= QT;
+    nQ <= not QT;
+end architecture behaviour;
diff --git a/test/detect/vim/default.txt b/test/detect/vim/default.txt
new file mode 100644
index 0000000..d01988c
--- /dev/null
+++ b/test/detect/vim/default.txt
@@ -0,0 +1,15 @@
+if foo > 2 || has("gui_running")
+  syntax on
+  set hlsearch
+endif
+
+set autoindent
+
+" switch on highlighting
+function UnComment(fl, ll)
+  while idx >= a:ll
+    let srclines=getline(idx)
+    let dstlines=substitute(srclines, b:comment, "", "")
+    call setline(idx, dstlines)
+  endwhile
+endfunction
diff --git a/test/detect/x86asm/default.txt b/test/detect/x86asm/default.txt
new file mode 100644
index 0000000..2f27c78
--- /dev/null
+++ b/test/detect/x86asm/default.txt
@@ -0,0 +1,40 @@
+section .text
+extern  _MessageBoxA at 16
+%if     __NASM_VERSION_ID__ >= 0x02030000
+safeseh handler         ; register handler as "safe handler"
+%endif
+
+handler:
+        push    dword 1 ; MB_OKCANCEL
+        push    dword caption
+        push    dword text
+        push    dword 0
+        call    _MessageBoxA at 16
+        sub     eax,1   ; incidentally suits as return value
+                        ; for exception handler
+        ret
+
+global  _main
+_main:  push    dword handler
+        push    dword [fs:0]
+        mov     dword [fs:0], esp
+        xor     eax,eax
+        mov     eax, dword[eax]   ; cause exception
+        pop     dword [fs:0]      ; disengage exception handler
+        add     esp, 4
+        ret
+
+avx2:   vzeroupper
+        push      rbx
+        mov       rbx,   rsp
+        sub       rsp,   0h20
+        vmovdqa   ymm0,  [rcx]
+        vpaddb    ymm0,  [rdx]
+        leave
+        ret
+
+text:   db      'OK to rethrow, CANCEL to generate core dump',0
+caption:db      'SEGV',0
+
+section .drectve info
+        db      '/defaultlib:user32.lib /defaultlib:msvcrt.lib '
diff --git a/test/detect/xml/default.txt b/test/detect/xml/default.txt
new file mode 100644
index 0000000..3b12f1d
--- /dev/null
+++ b/test/detect/xml/default.txt
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<response value="ok" xml:lang="en">
+  <text>Ok</text>
+  <comment html_allowed="true"/>
+  <ns1:description><![CDATA[
+  CDATA is <not> magical.
+  ]]></ns1:description>
+  <a></a> <a/>
+</response>
+<!DOCTYPE html>
+<title>Title</title>
+
+<style>body {width: 500px;}</style>
+
+<script type="application/javascript">
+  function $init() {return true;}
+</script>
+
+<body>
+  <p checked class="title" id='title'>Title</p>
+  <!-- here goes the rest of the page -->
+</body>
diff --git a/test/expect/brInPre.txt b/test/expect/brInPre.txt
new file mode 100644
index 0000000..e065147
--- /dev/null
+++ b/test/expect/brInPre.txt
@@ -0,0 +1 @@
+>> <span class="hljs-string">'\x41\x42\x43'</span><br><span class="hljs-string">'ABC'</span><br><hr><br>>> <span class="hljs-string">'\x61\x62\x63'</span><br><span class="hljs-string">'abc'</span>
diff --git a/test/expect/custommarkup.txt b/test/expect/custommarkup.txt
new file mode 100644
index 0000000..4af8910
--- /dev/null
+++ b/test/expect/custommarkup.txt
@@ -0,0 +1,3 @@
+<span class="hljs-tag"><</span><a href="http://dev.w3.org/html5/spec/Overview.html#the-div-element"><span class="hljs-tag"><span class="hljs-title">div</span></span></a><span class="hljs-tag"> <span class="hljs-attribute">id</span>=<span class="hljs-value">"contents"</span>></span>
+  <del><span class="hljs-tag"><<span class="hljs-title">p</span>></span>Hello, World!</del><ins>Goodbye, cruel world!</ins>
+<span class="hljs-tag"></<span class="hljs-title">div</span>></span>
\ No newline at end of file
diff --git a/test/expect/customtabreplace.txt b/test/expect/customtabreplace.txt
new file mode 100644
index 0000000..d217f1c
--- /dev/null
+++ b/test/expect/customtabreplace.txt
@@ -0,0 +1,4 @@
+<span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]:
+<span style="background:yellow">    </span>count(x)
+    <span class="hljs-keyword">if</span> x == <span class="hljs-number">3</span>:
+    <span style="background:yellow">    </span>count(x + <span class="hljs-number">1</span>)
\ No newline at end of file
diff --git a/test/expect/explicit.txt b/test/expect/explicit.txt
new file mode 100644
index 0000000..59544c1
--- /dev/null
+++ b/test/expect/explicit.txt
@@ -0,0 +1,2 @@
+<span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]:
+  count(x)
\ No newline at end of file
diff --git a/test/expect/languagealias.txt b/test/expect/languagealias.txt
new file mode 100644
index 0000000..571f200
--- /dev/null
+++ b/test/expect/languagealias.txt
@@ -0,0 +1 @@
+<span class="hljs-keyword">var</span> x = <span class="hljs-string">'<p>this should <b>not</b> be highlighted as <em>HTML</em>'</span>;
\ No newline at end of file
diff --git a/test/expect/shortenedexplicit.txt b/test/expect/shortenedexplicit.txt
new file mode 100644
index 0000000..d0391a3
--- /dev/null
+++ b/test/expect/shortenedexplicit.txt
@@ -0,0 +1,2 @@
+<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">add_one</span><span class="hljs-params">(x)</span>:</span>
+    <span class="hljs-keyword">return</span> x + <span class="hljs-number">1</span>
\ No newline at end of file
diff --git a/test/expect/tabreplace.txt b/test/expect/tabreplace.txt
new file mode 100644
index 0000000..01d1c57
--- /dev/null
+++ b/test/expect/tabreplace.txt
@@ -0,0 +1,2 @@
+<span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]:
+    count(x)
\ No newline at end of file
diff --git a/test/highlightAuto.js b/test/highlightAuto.js
new file mode 100644
index 0000000..a7fd937
--- /dev/null
+++ b/test/highlightAuto.js
@@ -0,0 +1,38 @@
+'use strict';
+
+var fs      = require('fs');
+var hljs    = require('../build');
+var path    = require('path');
+var utility = require('./utility');
+
+function testAutoDetection(language) {
+  var languagePath = utility.buildPath('detect', language);
+
+  it('should have test for ' + language, function() {
+    var testExistence = fs.existsSync(languagePath);
+
+    testExistence.should.be.true;
+  });
+
+  it('should be detected as ' + language, function() {
+    var examples = fs.readdirSync(languagePath);
+
+    examples.forEach(function(example) {
+      var filename = path.join(languagePath, example),
+          content  = fs.readFileSync(filename, 'utf-8'),
+
+          expected = language,
+          actual   = hljs.highlightAuto(content).language;
+
+      actual.should.equal(expected);
+    });
+  });
+}
+
+describe('hljs', function() {
+  describe('.highlightAuto', function() {
+    var languages = hljs.listLanguages();
+
+    languages.forEach(testAutoDetection);
+  });
+});
diff --git a/test/index.html b/test/index.html
new file mode 100644
index 0000000..acc962a
--- /dev/null
+++ b/test/index.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>highlight.js test</title>
+</head>
+<body>
+<!-- explicit language (code) -->
+<pre><code class="python">for x in [1, 2, 3]:
+  count(x)</code></pre>
+
+<!-- explicit language (pre) -->
+<pre class="python"><code>for x in [1, 2, 3]:
+  count(x)</code></pre>
+
+<!-- html 5 style language class -->
+<pre><code class="language-python">for x in [1, 2, 3]:
+  count(x)</code></pre>
+
+<!-- shortened language prefix -->
+<pre><code class="lang-python">def add_one(x):
+    return x + 1</code></pre>
+
+<!-- tab replacement -->
+<pre><code class="python">for x in [1, 2, 3]:
+	count(x)</code></pre>
+
+<!-- custom markup -->
+<pre><code class="html"><<a href="http://dev.w3.org/html5/spec/Overview.html#the-div-element">div</a> id="contents">
+  <del><p>Hello, World!</del><!-- A comment should not break merging --><ins>Goodbye, cruel world!</ins>
+</div></code></pre>
+
+<!-- custom markup and tab replacement -->
+<pre><code class="python">for x in [1, 2, 3]:
+<span style="background:yellow">	</span>count(x)
+	if x == 3:
+	<span style="background:yellow">	</span>count(x + 1)</code></pre>
+
+<!-- <br> inside of <pre>s -->
+<pre><code class="language-javascript">>> '\x41\x42\x43'<br>'ABC'<br><hr><br>>> '\x61\x62\x63'<br>'abc'
+</code></pre>
+
+<!-- language alias -->
+<pre><code class="language-js">var x = '<p>this should <b>not</b> be highlighted as <em>HTML</em>';</code></pre>
+
+<!-- disable highlighting -->
+<pre><code class="nohighlight"><div id="contents">
+  <p>Hello, World!c
+</div></code></pre>
+
+<!-- non-code <pre> -->
+<pre><samp>Computer output</samp></pre>
+</body>
+</html>
diff --git a/test/markup.js b/test/markup.js
new file mode 100644
index 0000000..33caeb0
--- /dev/null
+++ b/test/markup.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var fs      = require('fs');
+var glob    = require('glob');
+var hljs    = require('../build');
+var path    = require('path');
+var utility = require('./utility');
+
+function testLanguage(language) {
+  var filePath  = utility.buildPath('markup', language, '*.expect.txt'),
+      filenames = glob.sync(filePath);
+
+  describe(language, function() {
+    filenames.forEach(function(filename) {
+      var testName   = path.basename(filename, '.expect.txt'),
+          sourceName = filename.replace(/\.expect/, ''),
+          source     = fs.readFileSync(sourceName, 'utf-8');
+
+      it('should markup ' + testName, function() {
+        var actual   = hljs.highlight(language, source).value,
+            expected = fs.readFileSync(filename, 'utf-8');
+
+        actual.should.equal(expected);
+      });
+    });
+  });
+}
+
+describe('markup generation test', function() {
+  var languages = fs.readdirSync(utility.buildPath('markup'));
+
+  languages.forEach(testLanguage);
+});
diff --git a/test/markup/coffeescript/division.expect.txt b/test/markup/coffeescript/division.expect.txt
new file mode 100644
index 0000000..28a9dfa
--- /dev/null
+++ b/test/markup/coffeescript/division.expect.txt
@@ -0,0 +1,8 @@
+<span class="hljs-comment"># Divisions</span>
+x = <span class="hljs-number">6</span>/foo/i
+x = <span class="hljs-number">6</span> /foo
+x = <span class="hljs-number">6</span> / foo
+x = <span class="hljs-number">6</span> /foo * <span class="hljs-number">2</span>/gm
+x = f /foo
+x = f / foo / gm
+x = f /foo * <span class="hljs-number">2</span>/<span class="hljs-number">6</span>
diff --git a/test/markup/coffeescript/division.txt b/test/markup/coffeescript/division.txt
new file mode 100644
index 0000000..483fa56
--- /dev/null
+++ b/test/markup/coffeescript/division.txt
@@ -0,0 +1,8 @@
+# Divisions
+x = 6/foo/i
+x = 6 /foo
+x = 6 / foo
+x = 6 /foo * 2/gm
+x = f /foo
+x = f / foo / gm
+x = f /foo * 2/6
diff --git a/test/markup/coffeescript/function.expect.txt b/test/markup/coffeescript/function.expect.txt
new file mode 100644
index 0000000..dba8519
--- /dev/null
+++ b/test/markup/coffeescript/function.expect.txt
@@ -0,0 +1,11 @@
+<span class="hljs-function"><span class="hljs-title">returnNull</span> = -></span> <span class="hljs-literal">null</span>
+<span class="hljs-function"><span class="hljs-title">returnTrue</span> = <span class="hljs-params">()</span> -></span> <span class="hljs-literal">true</span>
+<span class="hljs-function"><span class="hljs-title">square</span> = <span class="hljs-params">(x)</span> -></span> x * x
+
+str.split(<span class="hljs-string">" "</span>).map(<span class="hljs-function"><span class="hljs-params">(m)</span> -></span> m.charCodeAt(<span class="hljs-number">0</span>))
+
+fs.readFile(<span class="hljs-string">"package.json"</span>, <span class="hljs-string">"utf-8"</span>, <span class="hljs-function"><span class="hljs-params">(err, content)</span> -></span>
+  data = JSON.parse(content)
+
+  data.version
+)
diff --git a/test/markup/coffeescript/function.txt b/test/markup/coffeescript/function.txt
new file mode 100644
index 0000000..ca94072
--- /dev/null
+++ b/test/markup/coffeescript/function.txt
@@ -0,0 +1,11 @@
+returnNull = -> null
+returnTrue = () -> true
+square = (x) -> x * x
+
+str.split(" ").map((m) -> m.charCodeAt(0))
+
+fs.readFile("package.json", "utf-8", (err, content) ->
+  data = JSON.parse(content)
+
+  data.version
+)
diff --git a/test/markup/coffeescript/regex.expect.txt b/test/markup/coffeescript/regex.expect.txt
new file mode 100644
index 0000000..51c3f9c
--- /dev/null
+++ b/test/markup/coffeescript/regex.expect.txt
@@ -0,0 +1,8 @@
+<span class="hljs-comment"># Regexps</span>
+x = <span class="hljs-regexp">/\//</span>
+x = <span class="hljs-regexp">/\n/</span>
+x = <span class="hljs-regexp">/ab\/ ab/</span>
+x = f <span class="hljs-regexp">/6 * 2/</span> - <span class="hljs-number">3</span>
+x = f <span class="hljs-regexp">/foo * 2/gm</span>
+x = <span class="hljs-keyword">if</span> <span class="hljs-literal">true</span> <span class="hljs-keyword">then</span> <span class="hljs-regexp">/\n/</span> <span class="hljs-keyword">else</span> <span class="hljs-regexp">/[.,]+/</span>
+x = <span class="hljs-regexp">///^key-<span class="hljs-subst">#{key}</span>-\d+///</span>
diff --git a/test/markup/coffeescript/regex.txt b/test/markup/coffeescript/regex.txt
new file mode 100644
index 0000000..e62a0fc
--- /dev/null
+++ b/test/markup/coffeescript/regex.txt
@@ -0,0 +1,8 @@
+# Regexps
+x = /\//
+x = /\n/
+x = /ab\/ ab/
+x = f /6 * 2/ - 3
+x = f /foo * 2/gm
+x = if true then /\n/ else /[.,]+/
+x = ///^key-#{key}-\d+///
diff --git a/test/markup/cs/titles.expect.txt b/test/markup/cs/titles.expect.txt
new file mode 100644
index 0000000..f081381
--- /dev/null
+++ b/test/markup/cs/titles.expect.txt
@@ -0,0 +1,16 @@
+<span class="hljs-keyword">namespace</span> <span class="hljs-title">Foo</span> <span class="hljs-comment">// namespace</span>
+{
+    <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Greet</span> : <span class="hljs-title">Base</span> <span class="hljs-comment">// class</span>
+    {
+        <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Greet</span><span class="hljs-params">(<span class="hljs-keyword">string</span> who)</span> <span class="hljs-comment">// function</span>
+        </span>{
+            Who = who;
+        }
+
+        <span class="hljs-function">Type<<span class="hljs-keyword">int</span>> <span class="hljs-title">f</span><span class="hljs-params">(<span class="hljs-keyword">int</span> val = <span class="hljs-number">0</span>)</span>
+        </span>{
+          <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Type<<span class="hljs-keyword">int</span>>(val);
+        }
+    }
+
+}
diff --git a/test/markup/cs/titles.txt b/test/markup/cs/titles.txt
new file mode 100644
index 0000000..786abf7
--- /dev/null
+++ b/test/markup/cs/titles.txt
@@ -0,0 +1,16 @@
+namespace Foo // namespace
+{
+    public class Greet : Base // class
+    {
+        public Greet(string who) // function
+        {
+            Who = who;
+        }
+
+        Type<int> f(int val = 0)
+        {
+          return new Type<int>(val);
+        }
+    }
+
+}
diff --git a/test/mocha.opts b/test/mocha.opts
new file mode 100644
index 0000000..a7e4a0e
--- /dev/null
+++ b/test/mocha.opts
@@ -0,0 +1,5 @@
+--require should
+--reporter spec
+--ui bdd
+--bail
+--check-leaks
diff --git a/test/special.js b/test/special.js
new file mode 100644
index 0000000..21c9be5
--- /dev/null
+++ b/test/special.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var fs      = require('fs');
+var hljs    = require('../build');
+var jsdom   = require('jsdom').jsdom;
+var utility = require('./utility');
+
+var filename = utility.buildPath('index.html'),
+    page     = fs.readFileSync(filename, 'utf-8');
+
+// Allows hljs to use document
+global.document = jsdom(page);
+
+// Setup hljs environment
+hljs.configure({ tabReplace: '    ' });
+hljs.initHighlighting();
+
+describe('special cases test', function() {
+  require('./special/explicitLanguage');
+  require('./special/customMarkup');
+  require('./special/languageAlias');
+  require('./special/noHighlight');
+});
diff --git a/test/special/customMarkup.js b/test/special/customMarkup.js
new file mode 100644
index 0000000..95167e0
--- /dev/null
+++ b/test/special/customMarkup.js
@@ -0,0 +1,48 @@
+'use strict';
+
+var fs      = require('fs');
+var utility = require('../utility');
+
+var blocks;
+
+describe('custom markup', function() {
+  before(function() {
+    blocks = document.querySelectorAll('.hljs');
+  });
+
+  it('should replace tabs', function() {
+    var filename = utility.buildPath('expect', 'tabreplace.txt'),
+
+        expected = fs.readFileSync(filename, 'utf-8'),
+        actual   = blocks[4].innerHTML;
+
+    actual.should.equal(expected);
+  });
+
+  it('should keep custom markup', function() {
+    var filename = utility.buildPath('expect', 'custommarkup.txt'),
+
+        expected = fs.readFileSync(filename, 'utf-8'),
+        actual   = blocks[5].innerHTML;
+
+    actual.should.equal(expected);
+  });
+
+  it('should keep custom markup and replace tabs', function() {
+    var filename = utility.buildPath('expect', 'customtabreplace.txt'),
+
+        expected = fs.readFileSync(filename, 'utf-8'),
+        actual   = blocks[6].innerHTML;
+
+    actual.should.equal(expected);
+  });
+
+  it('should keep the same amount of void elements (<br>, <hr>, ...)', function() {
+    var filename = utility.buildPath('expect', 'brInPre.txt'),
+
+        expected = fs.readFileSync(filename, 'utf-8'),
+        actual   = blocks[7].innerHTML;
+
+    actual.should.equal(expected);
+  });
+});
diff --git a/test/special/explicitLanguage.js b/test/special/explicitLanguage.js
new file mode 100644
index 0000000..4ae42c7
--- /dev/null
+++ b/test/special/explicitLanguage.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var fs      = require('fs');
+var utility = require('../utility');
+
+var blocks, expected;
+
+describe('explicit language class', function() {
+  before(function() {
+    var filename = utility.buildPath('expect', 'explicit.txt');
+
+    expected = fs.readFileSync(filename, 'utf-8');
+    blocks   = document.querySelectorAll('.hljs');
+  });
+
+  it('should highlight block with language in code tag', function() {
+    var actual = blocks[0].innerHTML;
+
+    actual.should.equal(expected);
+  });
+
+  it('should highlight block with language in pre tag', function() {
+    var actual = blocks[1].innerHTML;
+
+    actual.should.equal(expected);
+  });
+
+  it('should highlight using html 5 style (language-*)', function() {
+    var actual = blocks[2].innerHTML;
+
+    actual.should.equal(expected);
+  });
+
+  it('should highlight with shortened prefix (lang-)', function() {
+    var filename = utility.buildPath('expect', 'shortenedexplicit.txt'),
+
+        expected = fs.readFileSync(filename, 'utf-8'),
+        actual   = blocks[3].innerHTML;
+
+    actual.should.equal(expected);
+  });
+});
diff --git a/test/special/languageAlias.js b/test/special/languageAlias.js
new file mode 100644
index 0000000..c3f527d
--- /dev/null
+++ b/test/special/languageAlias.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var fs      = require('fs');
+var utility = require('../utility');
+
+var blocks;
+
+describe('language alias', function() {
+  before(function() {
+    blocks = document.querySelectorAll('.hljs');
+  });
+
+  it('should highlight as aliased language', function() {
+    var filename = utility.buildPath('expect', 'languagealias.txt'),
+
+        expected = fs.readFileSync(filename, 'utf-8'),
+        actual   = blocks[8].innerHTML;
+
+    actual.should.equal(expected);
+  });
+});
diff --git a/test/special/noHighlight.js b/test/special/noHighlight.js
new file mode 100644
index 0000000..6904b82
--- /dev/null
+++ b/test/special/noHighlight.js
@@ -0,0 +1,17 @@
+'use strict';
+
+describe('no highlighting', function() {
+  it('should keep block unchanged', function() {
+    var expected = '<div id="contents">\n  <p>Hello, World!c\n</div>',
+        actual   = document.querySelector('.nohighlight').innerHTML;
+
+    actual.should.equal(expected);
+  });
+
+  it('should skip pre tags without a child code tag', function() {
+    var expected = 'Computer output',
+        actual   = document.querySelector('pre samp').innerHTML;
+
+    actual.should.equal(expected);
+  });
+});
diff --git a/test/utility.js b/test/utility.js
new file mode 100644
index 0000000..10fc604
--- /dev/null
+++ b/test/utility.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var path = require('path');
+
+// Build a path relative to `test/`
+exports.buildPath = function() {
+  var args  = [].slice.call(arguments, 0),
+      paths = [__dirname].concat(args);
+
+  return path.join.apply(this, paths);
+};
diff --git a/tools/build.py b/tools/build.py
index 15459f0..c6bb829 100644
--- a/tools/build.py
+++ b/tools/build.py
@@ -269,6 +269,15 @@ def build_node(root, build_path, filenames, options):
     if options.compress:
         print('Notice: not compressing files for "node" target.')
 
+    print('Copying styles...')
+    build_style_path = os.path.join(build_path, 'styles')
+    src_style_path = os.path.join(src_path, 'styles')
+    os.mkdir(build_style_path)
+    styles = [os.path.join(src_style_path, f) for f in os.listdir(src_style_path) if f.endswith('.css')]
+    for style in styles:
+        print(style)
+        shutil.copy(style, build_style_path)
+
     print('Copying over Metafiles...')
     filenames = ['LICENSE', 'README.md']
     for filename in filenames:
@@ -277,7 +286,7 @@ def build_node(root, build_path, filenames, options):
         shutil.copyfile(source, dest)
 
     print('Adding package.json...')
-    package = json.load(utf8_open(os.path.join(src_path, 'package.json')))
+    package = json.load(utf8_open(os.path.join(root, 'package.json')))
     authors = utf8_open(os.path.join(root, 'AUTHORS.en.txt'))
     matches = (re.match('^- (?P<name>.*) <(?P<email>.*)>$', a) for a in authors)
     package['contributors'] = [m.groupdict() for m in matches if m]

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/highlight.js.git



More information about the Pkg-javascript-commits mailing list