From c944749dd4c1bffa76f0fec673ecad0b4aabf10d Mon Sep 17 00:00:00 2001 From: Martin/Geno Date: Fri, 7 Dec 2018 15:48:05 +0100 Subject: [PATCH] Publishing to gh-pages --- categories/index.html | 76 + css/35c3.min.css | 1 + css/fonts/35c3-black.woff | Bin 0 -> 31516 bytes css/fonts/35c3-black.woff2 | Bin 0 -> 24504 bytes css/fonts/35c3-light.woff | Bin 0 -> 34596 bytes css/fonts/35c3-light.woff2 | Bin 0 -> 26640 bytes css/main.css | 11 + css/reveal.css | 293 + decentral_messaging/img/central.svg | 18 + decentral_messaging/img/federation.svg | 28 + decentral_messaging/img/j2me-bombus.jpg | Bin 0 -> 124656 bytes decentral_messaging/img/p2p.svg | 24 + decentral_messaging/index.html | 562 ++ highlight-js/.editorconfig | 8 + highlight-js/.gitattributes | 4 + highlight-js/.gitignore | 9 + highlight-js/.travis.yml | 30 + highlight-js/AUTHORS.en.txt | 274 + highlight-js/CHANGES.md | 1757 ++++++ highlight-js/LICENSE | 24 + highlight-js/README.md | 186 + highlight-js/README.ru.md | 142 + highlight-js/demo/demo.js | 119 + highlight-js/demo/index.html | 55 + highlight-js/demo/jquery-2.1.1.min.js | 4 + highlight-js/demo/perfect-scrollbar.min.css | 5 + highlight-js/demo/perfect-scrollbar.min.js | 4 + highlight-js/demo/readme.md | 1 + highlight-js/demo/style.css | 74 + highlight-js/docs/Makefile | 153 + highlight-js/docs/_static/.gitkeep | 0 highlight-js/docs/_templates/.gitkeep | 0 highlight-js/docs/api.rst | 120 + highlight-js/docs/building-testing.rst | 88 + highlight-js/docs/conf.py | 242 + highlight-js/docs/css-classes-reference.rst | 462 ++ highlight-js/docs/index.rst | 44 + highlight-js/docs/language-contribution.rst | 77 + highlight-js/docs/language-guide.rst | 264 + highlight-js/docs/language-requests.rst | 17 + highlight-js/docs/line-numbers.rst | 39 + highlight-js/docs/maintainers-guide.rst | 34 + highlight-js/docs/reference.rst | 360 ++ highlight-js/docs/style-guide.rst | 106 + highlight-js/package-lock.json | 2040 ++++++ highlight-js/package.json | 46 + highlight-js/src/highlight.js | 834 +++ highlight-js/src/languages/1c.js | 516 ++ highlight-js/src/languages/abnf.js | 75 + highlight-js/src/languages/accesslog.js | 43 + highlight-js/src/languages/actionscript.js | 79 + highlight-js/src/languages/ada.js | 181 + highlight-js/src/languages/angelscript.js | 112 + highlight-js/src/languages/apache.js | 54 + highlight-js/src/languages/applescript.js | 91 + highlight-js/src/languages/arcade.js | 142 + highlight-js/src/languages/arduino.js | 106 + highlight-js/src/languages/armasm.js | 98 + highlight-js/src/languages/asciidoc.js | 196 + highlight-js/src/languages/aspectj.js | 149 + highlight-js/src/languages/autohotkey.js | 65 + highlight-js/src/languages/autoit.js | 142 + highlight-js/src/languages/avrasm.js | 67 + highlight-js/src/languages/awk.js | 59 + highlight-js/src/languages/axapta.js | 36 + highlight-js/src/languages/bash.js | 81 + highlight-js/src/languages/basic.js | 55 + highlight-js/src/languages/bnf.js | 33 + highlight-js/src/languages/brainfuck.js | 41 + highlight-js/src/languages/cal.js | 85 + highlight-js/src/languages/capnproto.js | 55 + highlight-js/src/languages/ceylon.js | 70 + highlight-js/src/languages/clean.js | 33 + highlight-js/src/languages/clojure-repl.js | 22 + highlight-js/src/languages/clojure.js | 103 + highlight-js/src/languages/cmake.js | 59 + highlight-js/src/languages/coffeescript.js | 153 + highlight-js/src/languages/coq.js | 72 + highlight-js/src/languages/cos.js | 128 + highlight-js/src/languages/cpp.js | 198 + highlight-js/src/languages/crmsh.js | 101 + highlight-js/src/languages/crystal.js | 192 + highlight-js/src/languages/cs.js | 191 + highlight-js/src/languages/csp.js | 29 + highlight-js/src/languages/css.js | 109 + highlight-js/src/languages/d.js | 265 + highlight-js/src/languages/dart.js | 112 + highlight-js/src/languages/delphi.js | 72 + highlight-js/src/languages/diff.js | 46 + highlight-js/src/languages/django.js | 71 + highlight-js/src/languages/dns.js | 34 + highlight-js/src/languages/dockerfile.js | 29 + highlight-js/src/languages/dos.js | 57 + highlight-js/src/languages/dsconfig.js | 52 + highlight-js/src/languages/dts.js | 131 + highlight-js/src/languages/dust.js | 39 + highlight-js/src/languages/ebnf.js | 37 + highlight-js/src/languages/elixir.js | 106 + highlight-js/src/languages/elm.js | 95 + highlight-js/src/languages/erb.js | 23 + highlight-js/src/languages/erlang-repl.js | 51 + highlight-js/src/languages/erlang.js | 152 + highlight-js/src/languages/excel.js | 53 + highlight-js/src/languages/fix.js | 33 + highlight-js/src/languages/flix.js | 50 + highlight-js/src/languages/fortran.js | 76 + highlight-js/src/languages/fsharp.js | 64 + highlight-js/src/languages/gams.js | 162 + highlight-js/src/languages/gauss.js | 296 + highlight-js/src/languages/gcode.js | 72 + highlight-js/src/languages/gherkin.js | 42 + highlight-js/src/languages/glsl.js | 123 + highlight-js/src/languages/gml.js | 879 +++ highlight-js/src/languages/go.js | 61 + highlight-js/src/languages/golo.js | 28 + highlight-js/src/languages/gradle.js | 40 + highlight-js/src/languages/groovy.js | 100 + highlight-js/src/languages/haml.js | 114 + highlight-js/src/languages/handlebars.js | 41 + highlight-js/src/languages/haskell.js | 128 + highlight-js/src/languages/haxe.js | 117 + highlight-js/src/languages/hsp.js | 52 + highlight-js/src/languages/htmlbars.js | 78 + highlight-js/src/languages/http.js | 47 + highlight-js/src/languages/hy.js | 108 + highlight-js/src/languages/inform7.js | 62 + highlight-js/src/languages/ini.js | 71 + highlight-js/src/languages/irpf90.js | 82 + highlight-js/src/languages/isbl.js | 3179 ++++++++++ highlight-js/src/languages/java.js | 113 + highlight-js/src/languages/javascript.js | 174 + highlight-js/src/languages/jboss-cli.js | 53 + highlight-js/src/languages/json.js | 42 + highlight-js/src/languages/julia-repl.js | 46 + highlight-js/src/languages/julia.js | 167 + highlight-js/src/languages/kotlin.js | 204 + highlight-js/src/languages/lasso.js | 168 + highlight-js/src/languages/ldif.js | 27 + highlight-js/src/languages/leaf.js | 45 + highlight-js/src/languages/less.js | 145 + highlight-js/src/languages/lisp.js | 109 + highlight-js/src/languages/livecodeserver.js | 165 + highlight-js/src/languages/livescript.js | 157 + highlight-js/src/languages/llvm.js | 95 + highlight-js/src/languages/lsl.js | 89 + highlight-js/src/languages/lua.js | 71 + highlight-js/src/languages/makefile.js | 87 + highlight-js/src/languages/markdown.js | 115 + highlight-js/src/languages/mathematica.js | 63 + highlight-js/src/languages/matlab.js | 102 + highlight-js/src/languages/maxima.js | 412 ++ highlight-js/src/languages/mel.js | 231 + highlight-js/src/languages/mercury.js | 87 + highlight-js/src/languages/mipsasm.js | 92 + highlight-js/src/languages/mizar.js | 24 + highlight-js/src/languages/mojolicious.js | 31 + highlight-js/src/languages/monkey.js | 79 + highlight-js/src/languages/moonscript.js | 119 + highlight-js/src/languages/n1ql.js | 75 + highlight-js/src/languages/nginx.js | 99 + highlight-js/src/languages/nimrod.js | 58 + highlight-js/src/languages/nix.js | 55 + highlight-js/src/languages/nsis.js | 112 + highlight-js/src/languages/objectivec.js | 97 + highlight-js/src/languages/ocaml.js | 77 + highlight-js/src/languages/openscad.js | 63 + highlight-js/src/languages/oxygene.js | 75 + highlight-js/src/languages/parser3.js | 54 + highlight-js/src/languages/perl.js | 162 + highlight-js/src/languages/pf.js | 58 + highlight-js/src/languages/pgsql.js | 504 ++ highlight-js/src/languages/php.js | 133 + highlight-js/src/languages/plaintext.js | 12 + highlight-js/src/languages/pony.js | 97 + highlight-js/src/languages/powershell.js | 86 + highlight-js/src/languages/processing.js | 53 + highlight-js/src/languages/profile.js | 35 + highlight-js/src/languages/prolog.js | 93 + highlight-js/src/languages/properties.js | 75 + highlight-js/src/languages/protobuf.js | 42 + highlight-js/src/languages/puppet.js | 120 + highlight-js/src/languages/purebasic.js | 64 + highlight-js/src/languages/python.js | 120 + highlight-js/src/languages/q.js | 27 + highlight-js/src/languages/qml.js | 177 + highlight-js/src/languages/r.js | 75 + highlight-js/src/languages/reasonml.js | 304 + highlight-js/src/languages/rib.js | 33 + highlight-js/src/languages/roboconf.js | 74 + highlight-js/src/languages/routeros.js | 169 + highlight-js/src/languages/rsl.js | 42 + highlight-js/src/languages/ruby.js | 183 + highlight-js/src/languages/ruleslanguage.js | 67 + highlight-js/src/languages/rust.js | 114 + highlight-js/src/languages/sas.js | 131 + highlight-js/src/languages/scala.js | 121 + highlight-js/src/languages/scheme.js | 152 + highlight-js/src/languages/scilab.js | 61 + highlight-js/src/languages/scss.js | 102 + highlight-js/src/languages/shell.js | 21 + highlight-js/src/languages/smali.js | 61 + highlight-js/src/languages/smalltalk.js | 54 + highlight-js/src/languages/sml.js | 72 + highlight-js/src/languages/sqf.js | 412 ++ highlight-js/src/languages/sql.js | 167 + highlight-js/src/languages/stan.js | 89 + highlight-js/src/languages/stata.js | 45 + highlight-js/src/languages/step21.js | 52 + highlight-js/src/languages/stylus.js | 460 ++ highlight-js/src/languages/subunit.js | 39 + highlight-js/src/languages/swift.js | 131 + highlight-js/src/languages/taggerscript.js | 48 + highlight-js/src/languages/tap.js | 42 + highlight-js/src/languages/tcl.js | 65 + highlight-js/src/languages/tex.js | 68 + highlight-js/src/languages/thrift.js | 41 + highlight-js/src/languages/tp.js | 90 + highlight-js/src/languages/twig.js | 73 + highlight-js/src/languages/typescript.js | 173 + highlight-js/src/languages/vala.js | 55 + highlight-js/src/languages/vbnet.js | 60 + highlight-js/src/languages/vbscript-html.js | 19 + highlight-js/src/languages/vbscript.js | 45 + highlight-js/src/languages/verilog.js | 105 + highlight-js/src/languages/vhdl.js | 67 + highlight-js/src/languages/vim.js | 116 + highlight-js/src/languages/x86asm.js | 142 + highlight-js/src/languages/xl.js | 78 + highlight-js/src/languages/xml.js | 112 + highlight-js/src/languages/xquery.js | 77 + highlight-js/src/languages/yaml.js | 98 + highlight-js/src/languages/zephir.js | 111 + highlight-js/src/styles/a11y-dark.css | 99 + highlight-js/src/styles/a11y-light.css | 99 + highlight-js/src/styles/agate.css | 108 + highlight-js/src/styles/an-old-hope.css | 89 + highlight-js/src/styles/androidstudio.css | 66 + highlight-js/src/styles/arduino-light.css | 88 + highlight-js/src/styles/arta.css | 73 + highlight-js/src/styles/ascetic.css | 45 + highlight-js/src/styles/atelier-cave-dark.css | 83 + .../src/styles/atelier-cave-light.css | 85 + highlight-js/src/styles/atelier-dune-dark.css | 69 + .../src/styles/atelier-dune-light.css | 69 + .../src/styles/atelier-estuary-dark.css | 84 + .../src/styles/atelier-estuary-light.css | 84 + .../src/styles/atelier-forest-dark.css | 69 + .../src/styles/atelier-forest-light.css | 69 + .../src/styles/atelier-heath-dark.css | 69 + .../src/styles/atelier-heath-light.css | 69 + .../src/styles/atelier-lakeside-dark.css | 69 + .../src/styles/atelier-lakeside-light.css | 69 + .../src/styles/atelier-plateau-dark.css | 84 + .../src/styles/atelier-plateau-light.css | 84 + .../src/styles/atelier-savanna-dark.css | 84 + .../src/styles/atelier-savanna-light.css | 84 + .../src/styles/atelier-seaside-dark.css | 69 + .../src/styles/atelier-seaside-light.css | 69 + .../src/styles/atelier-sulphurpool-dark.css | 69 + .../src/styles/atelier-sulphurpool-light.css | 69 + .../src/styles/atom-one-dark-reasonable.css | 77 + highlight-js/src/styles/atom-one-dark.css | 96 + highlight-js/src/styles/atom-one-light.css | 96 + highlight-js/src/styles/brown-paper.css | 64 + highlight-js/src/styles/brown-papersq.png | Bin 0 -> 18198 bytes highlight-js/src/styles/codepen-embed.css | 60 + highlight-js/src/styles/color-brewer.css | 71 + highlight-js/src/styles/darcula.css | 77 + highlight-js/src/styles/dark.css | 63 + highlight-js/src/styles/darkula.css | 6 + highlight-js/src/styles/default.css | 99 + highlight-js/src/styles/docco.css | 97 + highlight-js/src/styles/dracula.css | 76 + highlight-js/src/styles/far.css | 71 + highlight-js/src/styles/foundation.css | 88 + highlight-js/src/styles/github-gist.css | 71 + highlight-js/src/styles/github.css | 99 + highlight-js/src/styles/gml.css | 78 + highlight-js/src/styles/googlecode.css | 89 + highlight-js/src/styles/grayscale.css | 101 + highlight-js/src/styles/gruvbox-dark.css | 108 + highlight-js/src/styles/gruvbox-light.css | 108 + highlight-js/src/styles/hopscotch.css | 83 + highlight-js/src/styles/hybrid.css | 102 + highlight-js/src/styles/idea.css | 97 + highlight-js/src/styles/ir-black.css | 73 + highlight-js/src/styles/isbl-editor-dark.css | 112 + highlight-js/src/styles/isbl-editor-light.css | 112 + highlight-js/src/styles/kimbie.dark.css | 74 + highlight-js/src/styles/kimbie.light.css | 74 + highlight-js/src/styles/lightfair.css | 87 + highlight-js/src/styles/magula.css | 70 + highlight-js/src/styles/mono-blue.css | 59 + highlight-js/src/styles/monokai-sublime.css | 83 + highlight-js/src/styles/monokai.css | 70 + highlight-js/src/styles/nord.css | 309 + highlight-js/src/styles/obsidian.css | 88 + highlight-js/src/styles/ocean.css | 74 + highlight-js/src/styles/paraiso-dark.css | 72 + highlight-js/src/styles/paraiso-light.css | 72 + highlight-js/src/styles/pojoaque.css | 83 + highlight-js/src/styles/pojoaque.jpg | Bin 0 -> 1186 bytes highlight-js/src/styles/purebasic.css | 96 + highlight-js/src/styles/qtcreator_dark.css | 83 + highlight-js/src/styles/qtcreator_light.css | 83 + highlight-js/src/styles/railscasts.css | 106 + highlight-js/src/styles/rainbow.css | 85 + highlight-js/src/styles/routeros.css | 108 + highlight-js/src/styles/school-book.css | 72 + highlight-js/src/styles/school-book.png | Bin 0 -> 486 bytes highlight-js/src/styles/shades-of-purple.css | 97 + highlight-js/src/styles/solarized-dark.css | 84 + highlight-js/src/styles/solarized-light.css | 84 + highlight-js/src/styles/sunburst.css | 102 + .../src/styles/tomorrow-night-blue.css | 75 + .../src/styles/tomorrow-night-bright.css | 74 + .../src/styles/tomorrow-night-eighties.css | 74 + highlight-js/src/styles/tomorrow-night.css | 75 + highlight-js/src/styles/tomorrow.css | 72 + highlight-js/src/styles/vs.css | 68 + highlight-js/src/styles/vs2015.css | 115 + highlight-js/src/styles/xcode.css | 104 + highlight-js/src/styles/xt256.css | 92 + highlight-js/src/styles/zenburn.css | 80 + highlight-js/test/api/autoDetection.js | 36 + highlight-js/test/api/binaryNumber.js | 25 + highlight-js/test/api/cNumber.js | 45 + highlight-js/test/api/fixmarkup.js | 21 + highlight-js/test/api/getLanguage.js | 43 + highlight-js/test/api/highlight.js | 19 + highlight-js/test/api/ident.js | 27 + highlight-js/test/api/index.js | 14 + highlight-js/test/api/number.js | 28 + highlight-js/test/api/starters.js | 37 + highlight-js/test/api/underscoreIdent.js | 29 + highlight-js/test/browser/index.js | 14 + highlight-js/test/browser/plain.js | 28 + highlight-js/test/browser/worker.js | 50 + highlight-js/test/detect/1c/default.txt | 30 + highlight-js/test/detect/abnf/default.txt | 22 + .../test/detect/accesslog/default.txt | 1 + .../test/detect/actionscript/default.txt | 24 + highlight-js/test/detect/ada/default.txt | 17 + .../test/detect/angelscript/default.txt | 51 + highlight-js/test/detect/apache/default.txt | 19 + .../test/detect/applescript/default.txt | 14 + highlight-js/test/detect/arcade/default.txt | 14 + highlight-js/test/detect/arduino/default.txt | 24 + highlight-js/test/detect/armasm/default.txt | 36 + highlight-js/test/detect/asciidoc/default.txt | 65 + highlight-js/test/detect/aspectj/default.txt | 23 + .../test/detect/autohotkey/default.txt | 24 + highlight-js/test/detect/autoit/default.txt | 16 + highlight-js/test/detect/avrasm/default.txt | 19 + highlight-js/test/detect/awk/default.txt | 16 + highlight-js/test/detect/axapta/default.txt | 32 + highlight-js/test/detect/bash/default.txt | 15 + highlight-js/test/detect/basic/default.txt | 22 + highlight-js/test/detect/bnf/default.txt | 8 + .../test/detect/brainfuck/default.txt | 17 + highlight-js/test/detect/cal/default.txt | 33 + .../test/detect/capnproto/default.txt | 55 + highlight-js/test/detect/ceylon/default.txt | 8 + highlight-js/test/detect/clean/default.txt | 30 + .../test/detect/clojure-repl/default.txt | 7 + highlight-js/test/detect/clojure/default.txt | 11 + highlight-js/test/detect/cmake/default.txt | 19 + .../test/detect/coffeescript/default.txt | 13 + highlight-js/test/detect/coq/default.txt | 41 + highlight-js/test/detect/cos/default.txt | 21 + highlight-js/test/detect/cpp/comment.txt | 16 + highlight-js/test/detect/cpp/default.txt | 14 + highlight-js/test/detect/crmsh/default.txt | 48 + highlight-js/test/detect/crystal/default.txt | 29 + highlight-js/test/detect/cs/default.txt | 16 + highlight-js/test/detect/csp/default.txt | 5 + highlight-js/test/detect/css/default.txt | 15 + highlight-js/test/detect/d/default.txt | 44 + highlight-js/test/detect/dart/default.txt | 37 + highlight-js/test/detect/delphi/default.txt | 30 + highlight-js/test/detect/diff/default.txt | 30 + highlight-js/test/detect/django/default.txt | 15 + highlight-js/test/detect/dns/default.txt | 17 + .../test/detect/dockerfile/default.txt | 56 + highlight-js/test/detect/dos/default.txt | 24 + highlight-js/test/detect/dsconfig/default.txt | 22 + highlight-js/test/detect/dts/default.txt | 71 + highlight-js/test/detect/dust/default.txt | 7 + highlight-js/test/detect/ebnf/default.txt | 12 + highlight-js/test/detect/elixir/default.txt | 49 + highlight-js/test/detect/elm/default.txt | 18 + highlight-js/test/detect/erb/default.txt | 10 + .../test/detect/erlang-repl/default.txt | 27 + highlight-js/test/detect/erlang/default.txt | 60 + highlight-js/test/detect/excel/default.txt | 1 + highlight-js/test/detect/fix/default.txt | 4 + highlight-js/test/detect/flix/default.txt | 49 + highlight-js/test/detect/fortran/default.txt | 22 + highlight-js/test/detect/fsharp/default.txt | 48 + highlight-js/test/detect/gams/default.txt | 31 + highlight-js/test/detect/gauss/default.txt | 28 + highlight-js/test/detect/gcode/default.txt | 31 + highlight-js/test/detect/gherkin/default.txt | 25 + highlight-js/test/detect/glsl/default.txt | 37 + highlight-js/test/detect/gml/default.txt | 22 + highlight-js/test/detect/go/default.txt | 12 + highlight-js/test/detect/go/swift-like.txt | 15 + highlight-js/test/detect/golo/default.txt | 15 + highlight-js/test/detect/gradle/default.txt | 62 + highlight-js/test/detect/groovy/default.txt | 56 + highlight-js/test/detect/haml/default.txt | 14 + .../test/detect/handlebars/default.txt | 6 + highlight-js/test/detect/haskell/default.txt | 38 + highlight-js/test/detect/haxe/default.txt | 142 + highlight-js/test/detect/hsp/default.txt | 23 + highlight-js/test/detect/htmlbars/default.txt | 9 + highlight-js/test/detect/http/default.txt | 13 + highlight-js/test/detect/hy/default.txt | 37 + highlight-js/test/detect/index.js | 37 + highlight-js/test/detect/inform7/default.txt | 24 + highlight-js/test/detect/ini/default.txt | 12 + highlight-js/test/detect/irpf90/default.txt | 37 + highlight-js/test/detect/isbl/default.txt | 27 + highlight-js/test/detect/java/default.txt | 16 + .../test/detect/javascript/default.txt | 15 + .../test/detect/javascript/sample1.txt | 20 + .../test/detect/javascript/short-plain.txt | 8 + .../test/detect/jboss-cli/default.txt | 24 + highlight-js/test/detect/json/default.txt | 12 + .../test/detect/julia-repl/default.txt | 36 + highlight-js/test/detect/julia/default.txt | 104 + highlight-js/test/detect/kotlin/default.txt | 12 + highlight-js/test/detect/lasso/default.txt | 48 + highlight-js/test/detect/ldif/default.txt | 24 + highlight-js/test/detect/leaf/default.txt | 21 + highlight-js/test/detect/less/default.txt | 27 + highlight-js/test/detect/lisp/default.txt | 22 + .../test/detect/livecodeserver/default.txt | 30 + .../test/detect/livescript/default.txt | 38 + highlight-js/test/detect/llvm/default.txt | 61 + highlight-js/test/detect/lsl/default.txt | 12 + highlight-js/test/detect/lua/default.txt | 32 + highlight-js/test/detect/makefile/default.txt | 13 + highlight-js/test/detect/markdown/default.txt | 23 + .../test/detect/mathematica/default.txt | 14 + highlight-js/test/detect/matlab/default.txt | 45 + highlight-js/test/detect/maxima/default.txt | 57 + highlight-js/test/detect/mel/default.txt | 25 + highlight-js/test/detect/mercury/default.txt | 24 + highlight-js/test/detect/mipsasm/default.txt | 22 + highlight-js/test/detect/mizar/default.txt | 86 + .../test/detect/mojolicious/default.txt | 20 + highlight-js/test/detect/monkey/default.txt | 37 + .../test/detect/moonscript/default.txt | 37 + highlight-js/test/detect/n1ql/default.txt | 19 + highlight-js/test/detect/nginx/default.txt | 47 + highlight-js/test/detect/nimrod/default.txt | 21 + highlight-js/test/detect/nix/default.txt | 24 + highlight-js/test/detect/nsis/default.txt | 37 + .../test/detect/objectivec/default.txt | 13 + highlight-js/test/detect/ocaml/default.txt | 23 + highlight-js/test/detect/openscad/default.txt | 15 + highlight-js/test/detect/oxygene/default.txt | 56 + highlight-js/test/detect/parser3/default.txt | 34 + highlight-js/test/detect/perl/default.txt | 41 + highlight-js/test/detect/pf/default.txt | 43 + highlight-js/test/detect/pgsql/default.txt | 13 + highlight-js/test/detect/php/default.txt | 52 + .../test/detect/plaintext/default.txt | 6 + highlight-js/test/detect/pony/default.txt | 20 + .../test/detect/powershell/default.txt | 11 + .../test/detect/processing/default.txt | 17 + highlight-js/test/detect/profile/default.txt | 8 + highlight-js/test/detect/prolog/default.txt | 11 + .../test/detect/properties/default.txt | 11 + highlight-js/test/detect/protobuf/default.txt | 23 + highlight-js/test/detect/puppet/default.txt | 33 + .../test/detect/purebasic/default.txt | 29 + highlight-js/test/detect/python/default.txt | 12 + highlight-js/test/detect/q/default.txt | 9 + highlight-js/test/detect/qml/default.txt | 49 + highlight-js/test/detect/r/default.txt | 69 + highlight-js/test/detect/reasonml/default.txt | 47 + highlight-js/test/detect/rib/default.txt | 25 + highlight-js/test/detect/roboconf/default.txt | 54 + highlight-js/test/detect/routeros/default.txt | 17 + highlight-js/test/detect/rsl/default.txt | 15 + highlight-js/test/detect/ruby/default.txt | 13 + .../test/detect/ruby/double-colon.txt | 3 + .../test/detect/ruleslanguage/default.txt | 36 + highlight-js/test/detect/rust/default.txt | 16 + highlight-js/test/detect/sas/default.txt | 48 + highlight-js/test/detect/scala/default.txt | 58 + highlight-js/test/detect/scheme/default.txt | 28 + highlight-js/test/detect/scilab/default.txt | 14 + highlight-js/test/detect/scss/default.txt | 73 + highlight-js/test/detect/shell/default.txt | 11 + highlight-js/test/detect/smali/default.txt | 75 + .../test/detect/smalltalk/default.txt | 39 + highlight-js/test/detect/sml/default.txt | 26 + highlight-js/test/detect/sqf/default.txt | 16 + highlight-js/test/detect/sql/default.txt | 12 + highlight-js/test/detect/stan/default.txt | 39 + highlight-js/test/detect/stata/default.txt | 40 + highlight-js/test/detect/step21/default.txt | 33 + highlight-js/test/detect/stylus/default.txt | 25 + highlight-js/test/detect/subunit/default.txt | 18 + highlight-js/test/detect/swift/default.txt | 15 + .../test/detect/taggerscript/default.txt | 12 + highlight-js/test/detect/tap/default.txt | 24 + highlight-js/test/detect/tcl/default.txt | 26 + highlight-js/test/detect/tex/default.txt | 17 + highlight-js/test/detect/thrift/default.txt | 40 + highlight-js/test/detect/tp/default.txt | 156 + highlight-js/test/detect/twig/default.txt | 21 + .../test/detect/typescript/default.txt | 14 + highlight-js/test/detect/vala/default.txt | 46 + highlight-js/test/detect/vbnet/default.txt | 42 + .../test/detect/vbscript-html/default.txt | 7 + highlight-js/test/detect/vbscript/default.txt | 29 + highlight-js/test/detect/verilog/default.txt | 58 + highlight-js/test/detect/vhdl/default.txt | 41 + highlight-js/test/detect/vim/default.txt | 17 + highlight-js/test/detect/x86asm/default.txt | 40 + highlight-js/test/detect/xl/default.txt | 28 + highlight-js/test/detect/xml/default.txt | 13 + highlight-js/test/detect/xml/groovy-julia.txt | 5 + highlight-js/test/detect/xml/js.txt | 1 + highlight-js/test/detect/xquery/default.txt | 20 + highlight-js/test/detect/yaml/default.txt | 39 + highlight-js/test/detect/zephir/default.txt | 55 + highlight-js/test/fixtures/expect/brInPre.txt | 1 + .../test/fixtures/expect/custommarkup.txt | 3 + .../test/fixtures/expect/customtabreplace.txt | 4 + .../expect/endsWithParentVariants.txt | 1 + .../test/fixtures/expect/explicit1.txt | 2 + .../test/fixtures/expect/explicit2.txt | 2 + .../test/fixtures/expect/languagealias.txt | 1 + .../test/fixtures/expect/sublanguages.txt | 4 + .../test/fixtures/expect/tabreplace.txt | 2 + highlight-js/test/fixtures/expect/useBr.txt | 1 + highlight-js/test/fixtures/index.html | 146 + highlight-js/test/fixtures/nested.js | 17 + highlight-js/test/index.js | 22 + .../test/markup/accesslog/default.expect.txt | 1 + .../test/markup/accesslog/default.txt | 1 + .../actionscript/method-call.expect.txt | 1 + .../test/markup/actionscript/method-call.txt | 1 + .../test/markup/arcade/profile.expect.txt | 9 + highlight-js/test/markup/arcade/profile.txt | 9 + .../aspectj/intertype-constructor.expect.txt | 3 + .../markup/aspectj/intertype-constructor.txt | 3 + .../aspectj/intertype-method.expect.txt | 6 + .../test/markup/aspectj/intertype-method.txt | 6 + .../test/markup/bash/no-numbers.expect.txt | 3 + highlight-js/test/markup/bash/no-numbers.txt | 3 + .../markup/ceylon/nested-comments.expect.txt | 5 + .../test/markup/ceylon/nested-comments.txt | 5 + .../markup/clojure-repl/prompt.expect.txt | 2 + .../test/markup/clojure-repl/prompt.txt | 2 + .../test/markup/clojure/hint_col.expect.txt | 34 + highlight-js/test/markup/clojure/hint_col.txt | 34 + .../markup/clojure/symbols-numbers.expect.txt | 1 + .../test/markup/clojure/symbols-numbers.txt | 1 + .../markup/coffeescript/division.expect.txt | 8 + .../test/markup/coffeescript/division.txt | 8 + .../markup/coffeescript/function.expect.txt | 14 + .../test/markup/coffeescript/function.txt | 14 + .../test/markup/coffeescript/regex.expect.txt | 8 + .../test/markup/coffeescript/regex.txt | 8 + highlight-js/test/markup/cos/basic.expect.txt | 7 + highlight-js/test/markup/cos/basic.txt | 7 + .../test/markup/cos/embedded.expect.txt | 5 + highlight-js/test/markup/cos/embedded.txt | 5 + .../markup/cpp/expression-keywords.expect.txt | 2 + .../test/markup/cpp/expression-keywords.txt | 2 + .../markup/cpp/function-params.expect.txt | 7 + .../test/markup/cpp/function-params.txt | 7 + .../test/markup/cpp/function-title.expect.txt | 9 + .../test/markup/cpp/function-title.txt | 9 + .../markup/cpp/number-literals.expect.txt | 6 + .../test/markup/cpp/number-literals.txt | 6 + .../markup/cpp/pointers-returns.expect.txt | 4 + .../test/markup/cpp/pointers-returns.txt | 4 + .../test/markup/cpp/preprocessor.expect.txt | 13 + highlight-js/test/markup/cpp/preprocessor.txt | 13 + .../markup/cpp/primitive-types.expect.txt | 3 + .../test/markup/cpp/primitive-types.txt | 3 + .../markup/cpp/string-literals.expect.txt | 30 + .../test/markup/cpp/string-literals.txt | 30 + .../test/markup/crystal/literals.expect.txt | 98 + highlight-js/test/markup/crystal/literals.txt | 98 + .../test/markup/crystal/macro.expect.txt | 9 + highlight-js/test/markup/crystal/macro.txt | 9 + .../test/markup/crystal/operators.expect.txt | 34 + .../test/markup/crystal/operators.txt | 33 + .../test/markup/crystal/regexes.expect.txt | 12 + highlight-js/test/markup/crystal/regexes.txt | 12 + .../crystal/toplevel-keywords.expect.txt | 4 + .../test/markup/crystal/toplevel-keywords.txt | 4 + .../markup/cs/dotted-namespace.expect.txt | 6 + .../test/markup/cs/dotted-namespace.txt | 6 + highlight-js/test/markup/cs/floats.expect.txt | 4 + highlight-js/test/markup/cs/floats.txt | 4 + .../test/markup/cs/functions.expect.txt | 16 + highlight-js/test/markup/cs/functions.txt | 16 + .../markup/cs/string-interpolation.expect.txt | 9 + .../test/markup/cs/string-interpolation.txt | 9 + highlight-js/test/markup/cs/titles.expect.txt | 19 + highlight-js/test/markup/cs/titles.txt | 19 + .../markup/css/pseudo-selector.expect.txt | 2 + .../test/markup/css/pseudo-selector.txt | 2 + highlight-js/test/markup/css/url.expect.txt | 6 + highlight-js/test/markup/css/url.txt | 6 + .../delphi/compiler-directive.expect.txt | 4 + .../test/markup/delphi/compiler-directive.txt | 4 + .../test/markup/diff/comments.expect.txt | 10 + highlight-js/test/markup/diff/comments.txt | 10 + .../test/markup/dockerfile/default.expect.txt | 23 + .../test/markup/dockerfile/default.txt | 23 + .../test/markup/dos/comments.expect.txt | 3 + highlight-js/test/markup/dos/comments.txt | 3 + .../test/markup/dsconfig/default.expect.txt | 24 + highlight-js/test/markup/dsconfig/default.txt | 24 + .../markup/elixir/function-title.expect.txt | 15 + .../test/markup/elixir/function-title.txt | 15 + .../test/markup/excel/comments.expect.txt | 1 + highlight-js/test/markup/excel/comments.txt | 1 + .../test/markup/fortran/numbers.expect.txt | 15 + highlight-js/test/markup/fortran/numbers.txt | 15 + .../markup/fsharp/bang-keywords.expect.txt | 1 + .../test/markup/fsharp/bang-keywords.txt | 1 + .../markup/gauss/function_defs.expect.txt | 7 + .../test/markup/gauss/function_defs.txt | 7 + .../markup/gauss/function_refs.expect.txt | 5 + .../test/markup/gauss/function_refs.txt | 5 + .../test/markup/gauss/keywords.expect.txt | 7 + highlight-js/test/markup/gauss/keywords.txt | 7 + .../test/markup/go/numbers.expect.txt | 2 + highlight-js/test/markup/go/numbers.txt | 2 + .../test/markup/golo/default.expect.txt | 15 + highlight-js/test/markup/golo/default.txt | 15 + .../test/markup/haskell/infix.expect.txt | 3 + highlight-js/test/markup/haskell/infix.txt | 3 + .../markup/haskell/nested-comments.expect.txt | 1 + .../test/markup/haskell/nested-comments.txt | 1 + .../test/markup/http/default.expect.txt | 7 + highlight-js/test/markup/http/default.txt | 6 + highlight-js/test/markup/index.js | 39 + .../test/markup/java/gh1031.expect.txt | 7 + highlight-js/test/markup/java/gh1031.txt | 7 + .../test/markup/java/numbers.expect.txt | 9 + highlight-js/test/markup/java/numbers.txt | 9 + .../test/markup/java/titles.expect.txt | 10 + highlight-js/test/markup/java/titles.txt | 10 + .../javascript/arrow-function.expect.txt | 3 + .../test/markup/javascript/arrow-function.txt | 3 + .../test/markup/javascript/class.expect.txt | 11 + highlight-js/test/markup/javascript/class.txt | 11 + .../javascript/default-parameters.expect.txt | 1 + .../markup/javascript/default-parameters.txt | 1 + .../test/markup/javascript/jsx.expect.txt | 6 + highlight-js/test/markup/javascript/jsx.txt | 6 + .../markup/javascript/keywords.expect.txt | 13 + .../test/markup/javascript/keywords.txt | 13 + .../markup/javascript/method-call.expect.txt | 1 + .../test/markup/javascript/method-call.txt | 1 + .../test/markup/javascript/modules.expect.txt | 8 + .../test/markup/javascript/modules.txt | 8 + .../markup/javascript/object-attr.expect.txt | 6 + .../test/markup/javascript/object-attr.txt | 6 + .../test/markup/javascript/shebang.expect.txt | 3 + .../test/markup/javascript/shebang.txt | 3 + .../javascript/template-strings.expect.txt | 1 + .../markup/javascript/template-strings.txt | 1 + .../test/markup/kotlin/class.expect.txt | 16 + highlight-js/test/markup/kotlin/class.txt | 16 + .../test/markup/kotlin/function.expect.txt | 13 + highlight-js/test/markup/kotlin/function.txt | 13 + .../test/markup/lasso/delimiters.expect.txt | 7 + highlight-js/test/markup/lasso/delimiters.txt | 7 + .../test/markup/ldif/ldapmodify.expect.txt | 7 + highlight-js/test/markup/ldif/ldapmodify.txt | 7 + .../test/markup/ldif/schema.expect.txt | 15 + highlight-js/test/markup/ldif/schema.txt | 15 + .../test/markup/less/selectors.expect.txt | 8 + highlight-js/test/markup/less/selectors.txt | 8 + highlight-js/test/markup/lisp/mec.expect.txt | 4 + highlight-js/test/markup/lisp/mec.txt | 4 + .../test/markup/markdown/code.expect.txt | 8 + highlight-js/test/markup/markdown/code.txt | 8 + .../markup/matlab/block_comment.expect.txt | 27 + .../test/markup/matlab/block_comment.txt | 27 + .../test/markup/matlab/transpose.expect.txt | 40 + highlight-js/test/markup/matlab/transpose.txt | 40 + .../test/markup/maxima/example.expect.txt | 42 + highlight-js/test/markup/maxima/example.txt | 42 + .../test/markup/maxima/numbers.expect.txt | 24 + highlight-js/test/markup/maxima/numbers.txt | 24 + .../test/markup/maxima/symbols.expect.txt | 18 + highlight-js/test/markup/maxima/symbols.txt | 18 + .../test/markup/ocaml/literals.expect.txt | 29 + highlight-js/test/markup/ocaml/literals.txt | 29 + .../test/markup/ocaml/types.expect.txt | 17 + highlight-js/test/markup/ocaml/types.txt | 17 + .../test/markup/pgsql/clauses.expect.txt | 67 + highlight-js/test/markup/pgsql/clauses.txt | 67 + .../test/markup/pgsql/clauses2.expect.txt | 160 + highlight-js/test/markup/pgsql/clauses2.txt | 160 + .../test/markup/pgsql/constraints.expect.txt | 21 + .../test/markup/pgsql/constraints.txt | 21 + .../test/markup/pgsql/options.expect.txt | 44 + highlight-js/test/markup/pgsql/options.txt | 44 + .../test/markup/pgsql/plpgsql.expect.txt | 61 + highlight-js/test/markup/pgsql/plpgsql.txt | 61 + .../test/markup/pgsql/sql-commands.expect.txt | 99 + .../test/markup/pgsql/sql-commands.txt | 99 + .../markup/pgsql/window-functions.expect.txt | 35 + .../test/markup/pgsql/window-functions.txt | 35 + highlight-js/test/markup/pgsql/xml.expect.txt | 47 + highlight-js/test/markup/pgsql/xml.txt | 47 + .../test/markup/php/comments.expect.txt | 19 + highlight-js/test/markup/php/comments.txt | 19 + .../test/markup/php/heredoc.expect.txt | 14 + highlight-js/test/markup/php/heredoc.txt | 14 + .../test/markup/pony/prime.expect.txt | 2 + highlight-js/test/markup/pony/prime.txt | 2 + .../powershell/apos-herestring.expect.txt | 11 + .../markup/powershell/apos-herestring.txt | 11 + .../powershell/quote-herestring.expect.txt | 11 + .../markup/powershell/quote-herestring.txt | 11 + .../test/markup/properties/syntax.expect.txt | 14 + .../test/markup/properties/syntax.txt | 14 + .../protobuf/message-message.expect.txt | 7 + .../test/markup/protobuf/message-message.txt | 7 + .../markup/python/escaped-quotes.expect.txt | 43 + .../test/markup/python/escaped-quotes.txt | 43 + .../test/markup/python/f-strings.expect.txt | 10 + highlight-js/test/markup/python/f-strings.txt | 10 + .../markup/python/function-header.expect.txt | 2 + .../test/markup/python/function-header.txt | 2 + .../python/matrix-multiplication.expect.txt | 7 + .../markup/python/matrix-multiplication.txt | 7 + .../test/markup/reasonml/functions.expect.txt | 22 + .../test/markup/reasonml/functions.txt | 22 + .../test/markup/reasonml/literals.expect.txt | 41 + .../test/markup/reasonml/literals.txt | 41 + .../test/markup/reasonml/modules.expect.txt | 19 + highlight-js/test/markup/reasonml/modules.txt | 19 + .../reasonml/pattern-matching.expect.txt | 20 + .../test/markup/reasonml/pattern-matching.txt | 20 + .../test/markup/ruby/gemfile.expect.txt | 3 + highlight-js/test/markup/ruby/gemfile.txt | 3 + .../test/markup/ruby/heredoc.expect.txt | 8 + highlight-js/test/markup/ruby/heredoc.txt | 8 + .../test/markup/ruby/prompt.expect.txt | 23 + highlight-js/test/markup/ruby/prompt.txt | 23 + .../test/markup/ruby/regexes.expect.txt | 5 + highlight-js/test/markup/ruby/regexes.txt | 5 + .../test/markup/rust/comments.expect.txt | 3 + highlight-js/test/markup/rust/comments.txt | 3 + .../test/markup/rust/numbers.expect.txt | 13 + highlight-js/test/markup/rust/numbers.txt | 13 + .../test/markup/rust/strings.expect.txt | 14 + highlight-js/test/markup/rust/strings.txt | 14 + .../test/markup/rust/traits.expect.txt | 3 + highlight-js/test/markup/rust/traits.txt | 3 + .../test/markup/rust/types.expect.txt | 4 + highlight-js/test/markup/rust/types.txt | 4 + .../test/markup/rust/variables.expect.txt | 3 + highlight-js/test/markup/rust/variables.txt | 3 + .../test/markup/scala/case-classes.expect.txt | 3 + .../test/markup/scala/case-classes.txt | 3 + .../test/markup/scheme/lambda.expect.txt | 1 + highlight-js/test/markup/scheme/lambda.txt | 1 + .../test/markup/scheme/quoted.expect.txt | 1 + highlight-js/test/markup/scheme/quoted.txt | 1 + .../test/markup/sql/interval.expect.txt | 17 + highlight-js/test/markup/sql/interval.txt | 17 + highlight-js/test/markup/sql/join.expect.txt | 17 + highlight-js/test/markup/sql/join.txt | 17 + .../test/markup/sql/keywords.expect.txt | 1 + highlight-js/test/markup/sql/keywords.txt | 1 + .../test/markup/sql/lateral-view.expect.txt | 7 + highlight-js/test/markup/sql/lateral-view.txt | 7 + .../test/markup/sql/numeric-types.expect.txt | 1 + .../test/markup/sql/numeric-types.txt | 1 + .../test/markup/sql/set-operator.expect.txt | 1 + highlight-js/test/markup/sql/set-operator.txt | 1 + .../test/markup/sql/tablesample.expect.txt | 5 + highlight-js/test/markup/sql/tablesample.txt | 5 + .../markup/sql/values-statement.expect.txt | 7 + .../test/markup/sql/values-statement.txt | 7 + .../markup/sql/window-function.expect.txt | 23 + .../test/markup/sql/window-function.txt | 23 + .../subunit/subunit-errorline.expect.txt | 2 + .../test/markup/subunit/subunit-errorline.txt | 2 + .../subunit/subunit-failureline.expect.txt | 4 + .../markup/subunit/subunit-failureline.txt | 4 + .../subunit/subunit-progressline.expect.txt | 7 + .../markup/subunit/subunit-progressline.txt | 7 + .../subunit/subunit-skipline.expect.txt | 3 + .../test/markup/subunit/subunit-skipline.txt | 3 + .../subunit/subunit-successline.expect.txt | 8 + .../markup/subunit/subunit-successline.txt | 8 + .../markup/subunit/subunit-tagline.expect.txt | 5 + .../test/markup/subunit/subunit-tagline.txt | 5 + .../subunit/subunit-testline.expect.txt | 10 + .../test/markup/subunit/subunit-testline.txt | 10 + .../subunit/subunit-timeline.expect.txt | 3 + .../test/markup/subunit/subunit-timeline.txt | 3 + .../subunit/subunit-uxsuccessline.expect.txt | 3 + .../markup/subunit/subunit-uxsuccessline.txt | 3 + .../subunit/subunit-xfailline.expect.txt | 3 + .../test/markup/subunit/subunit-xfailline.txt | 3 + .../test/markup/swift/functions.expect.txt | 10 + highlight-js/test/markup/swift/functions.txt | 10 + .../markup/swift/multiline-string.expect.txt | 3 + .../test/markup/swift/multiline-string.txt | 3 + highlight-js/test/markup/tap/basic.expect.txt | 5 + highlight-js/test/markup/tap/basic.txt | 5 + .../markup/tap/without-numbers.expect.txt | 6 + .../test/markup/tap/without-numbers.txt | 6 + .../test/markup/tap/yaml-block.expect.txt | 26 + highlight-js/test/markup/tap/yaml-block.txt | 26 + .../twig/filter_with_underscore.expect.txt | 1 + .../markup/twig/filter_with_underscore.txt | 1 + .../test/markup/twig/template_tags.expect.txt | 12 + .../test/markup/twig/template_tags.txt | 11 + .../test/markup/typescript/class.expect.txt | 11 + highlight-js/test/markup/typescript/class.txt | 11 + .../typescript/decorator-factories.expect.txt | 13 + .../markup/typescript/decorator-factories.txt | 13 + .../markup/typescript/functions.expect.txt | 11 + .../test/markup/typescript/functions.txt | 11 + .../test/markup/typescript/jsx.expect.txt | 41 + highlight-js/test/markup/typescript/jsx.txt | 41 + .../markup/typescript/module-id.expect.txt | 14 + .../test/markup/typescript/module-id.txt | 14 + .../test/markup/verilog/misc.expect.txt | 37 + highlight-js/test/markup/verilog/misc.txt | 37 + .../test/markup/verilog/numbers.expect.txt | 8 + highlight-js/test/markup/verilog/numbers.txt | 8 + .../markup/vim/strings-comments.expect.txt | 4 + .../test/markup/vim/strings-comments.txt | 4 + .../x86asm/labels-directives.expect.txt | 6 + .../test/markup/x86asm/labels-directives.txt | 6 + .../markup/xml/space-attributes.expect.txt | 3 + .../test/markup/xml/space-attributes.txt | 3 + .../markup/xml/unquoted-attributes.expect.txt | 9 + .../test/markup/xml/unquoted-attributes.txt | 9 + .../test/markup/yaml/string.expect.txt | 7 + highlight-js/test/markup/yaml/string.txt | 7 + highlight-js/test/markup/yaml/tag.expect.txt | 4 + highlight-js/test/markup/yaml/tag.txt | 4 + highlight-js/test/mocha.opts | 6 + highlight-js/test/special/buildClassName.js | 39 + highlight-js/test/special/customMarkup.js | 43 + .../test/special/endsWithParentVariants.js | 19 + highlight-js/test/special/explicitLanguage.js | 44 + highlight-js/test/special/index.js | 45 + highlight-js/test/special/languageAlias.js | 20 + highlight-js/test/special/noHighlight.js | 88 + highlight-js/test/special/subLanguages.js | 17 + highlight-js/test/special/useBr.js | 30 + highlight-js/test/utility.js | 29 + highlight-js/tools/all.js | 34 + highlight-js/tools/browser.js | 160 + highlight-js/tools/build.js | 89 + highlight-js/tools/cdn.js | 88 + highlight-js/tools/codeformat.js | 47 + highlight-js/tools/developer.html | 107 + highlight-js/tools/keywordsformat.js | 18 + highlight-js/tools/node.js | 141 + highlight-js/tools/tasks.js | 248 + highlight-js/tools/utility.js | 169 + index.html | 84 + reveal-js/.gitignore | 14 + reveal-js/.travis.yml | 5 + reveal-js/CONTRIBUTING.md | 23 + reveal-js/Gruntfile.js | 193 + reveal-js/LICENSE | 19 + reveal-js/README.md | 1309 ++++ reveal-js/bower.json | 27 + reveal-js/css/print/paper.css | 203 + reveal-js/css/print/pdf.css | 164 + reveal-js/css/reveal.css | 1591 +++++ reveal-js/css/reveal.scss | 1764 ++++++ reveal-js/css/theme/README.md | 21 + reveal-js/css/theme/beige.css | 277 + reveal-js/css/theme/black.css | 273 + reveal-js/css/theme/blood.css | 296 + reveal-js/css/theme/league.css | 279 + reveal-js/css/theme/moon.css | 277 + reveal-js/css/theme/night.css | 271 + reveal-js/css/theme/serif.css | 273 + reveal-js/css/theme/simple.css | 276 + reveal-js/css/theme/sky.css | 280 + reveal-js/css/theme/solarized.css | 277 + reveal-js/css/theme/source/beige.scss | 39 + reveal-js/css/theme/source/black.scss | 49 + reveal-js/css/theme/source/blood.scss | 78 + reveal-js/css/theme/source/league.scss | 34 + reveal-js/css/theme/source/moon.scss | 57 + reveal-js/css/theme/source/night.scss | 34 + reveal-js/css/theme/source/serif.scss | 35 + reveal-js/css/theme/source/simple.scss | 43 + reveal-js/css/theme/source/sky.scss | 46 + reveal-js/css/theme/source/solarized.scss | 63 + reveal-js/css/theme/source/white.scss | 49 + reveal-js/css/theme/template/mixins.scss | 29 + reveal-js/css/theme/template/settings.scss | 43 + reveal-js/css/theme/template/theme.scss | 325 + reveal-js/css/theme/white.css | 273 + reveal-js/demo.html | 416 ++ reveal-js/index.html | 49 + reveal-js/js/reveal.js | 5577 +++++++++++++++++ reveal-js/lib/css/zenburn.css | 80 + reveal-js/lib/font/league-gothic/LICENSE | 2 + .../lib/font/league-gothic/league-gothic.css | 10 + .../lib/font/league-gothic/league-gothic.eot | Bin 0 -> 25696 bytes .../lib/font/league-gothic/league-gothic.ttf | Bin 0 -> 64256 bytes .../lib/font/league-gothic/league-gothic.woff | Bin 0 -> 30764 bytes reveal-js/lib/font/source-sans-pro/LICENSE | 45 + .../source-sans-pro-italic.eot | Bin 0 -> 75720 bytes .../source-sans-pro-italic.ttf | Bin 0 -> 238084 bytes .../source-sans-pro-italic.woff | Bin 0 -> 98556 bytes .../source-sans-pro-regular.eot | Bin 0 -> 88070 bytes .../source-sans-pro-regular.ttf | Bin 0 -> 288008 bytes .../source-sans-pro-regular.woff | Bin 0 -> 114324 bytes .../source-sans-pro-semibold.eot | Bin 0 -> 89897 bytes .../source-sans-pro-semibold.ttf | Bin 0 -> 284640 bytes .../source-sans-pro-semibold.woff | Bin 0 -> 115648 bytes .../source-sans-pro-semibolditalic.eot | Bin 0 -> 75706 bytes .../source-sans-pro-semibolditalic.ttf | Bin 0 -> 240944 bytes .../source-sans-pro-semibolditalic.woff | Bin 0 -> 98816 bytes .../font/source-sans-pro/source-sans-pro.css | 39 + reveal-js/lib/js/classList.js | 2 + reveal-js/lib/js/head.min.js | 6 + reveal-js/lib/js/html5shiv.js | 7 + reveal-js/package.json | 43 + reveal-js/plugin/highlight/highlight.js | 77 + reveal-js/plugin/markdown/example.html | 136 + reveal-js/plugin/markdown/example.md | 36 + reveal-js/plugin/markdown/markdown.js | 412 ++ reveal-js/plugin/markdown/marked.js | 6 + reveal-js/plugin/math/math.js | 67 + reveal-js/plugin/multiplex/client.js | 13 + reveal-js/plugin/multiplex/index.js | 64 + reveal-js/plugin/multiplex/master.js | 34 + reveal-js/plugin/multiplex/package.json | 19 + reveal-js/plugin/notes-server/client.js | 65 + reveal-js/plugin/notes-server/index.js | 69 + reveal-js/plugin/notes-server/notes.html | 585 ++ reveal-js/plugin/notes/notes.html | 792 +++ reveal-js/plugin/notes/notes.js | 147 + reveal-js/plugin/print-pdf/print-pdf.js | 67 + reveal-js/plugin/search/search.js | 206 + reveal-js/plugin/zoom-js/zoom.js | 272 + reveal-js/test/examples/assets/image1.png | Bin 0 -> 21991 bytes reveal-js/test/examples/assets/image2.png | Bin 0 -> 10237 bytes reveal-js/test/examples/barebones.html | 41 + reveal-js/test/examples/embedded-media.html | 49 + reveal-js/test/examples/math.html | 185 + .../test/examples/slide-backgrounds.html | 144 + .../test/examples/slide-transitions.html | 101 + reveal-js/test/qunit-2.5.0.css | 436 ++ reveal-js/test/qunit-2.5.0.js | 5188 +++++++++++++++ reveal-js/test/simple.md | 12 + .../test-markdown-element-attributes.html | 134 + .../test/test-markdown-element-attributes.js | 44 + reveal-js/test/test-markdown-external.html | 36 + reveal-js/test/test-markdown-external.js | 20 + reveal-js/test/test-markdown-options.html | 41 + reveal-js/test/test-markdown-options.js | 27 + .../test/test-markdown-slide-attributes.html | 128 + .../test/test-markdown-slide-attributes.js | 44 + reveal-js/test/test-markdown.html | 52 + reveal-js/test/test-markdown.js | 11 + reveal-js/test/test-pdf.html | 83 + reveal-js/test/test-pdf.js | 12 + reveal-js/test/test.html | 86 + reveal-js/test/test.js | 593 ++ tags/index.html | 76 + 984 files changed, 76724 insertions(+) create mode 100644 categories/index.html create mode 100644 css/35c3.min.css create mode 100644 css/fonts/35c3-black.woff create mode 100644 css/fonts/35c3-black.woff2 create mode 100644 css/fonts/35c3-light.woff create mode 100644 css/fonts/35c3-light.woff2 create mode 100644 css/main.css create mode 100644 css/reveal.css create mode 100644 decentral_messaging/img/central.svg create mode 100644 decentral_messaging/img/federation.svg create mode 100644 decentral_messaging/img/j2me-bombus.jpg create mode 100644 decentral_messaging/img/p2p.svg create mode 100644 decentral_messaging/index.html create mode 100644 highlight-js/.editorconfig create mode 100644 highlight-js/.gitattributes create mode 100644 highlight-js/.gitignore create mode 100644 highlight-js/.travis.yml create mode 100644 highlight-js/AUTHORS.en.txt create mode 100644 highlight-js/CHANGES.md create mode 100644 highlight-js/LICENSE create mode 100644 highlight-js/README.md create mode 100644 highlight-js/README.ru.md create mode 100644 highlight-js/demo/demo.js create mode 100644 highlight-js/demo/index.html create mode 100644 highlight-js/demo/jquery-2.1.1.min.js create mode 100644 highlight-js/demo/perfect-scrollbar.min.css create mode 100644 highlight-js/demo/perfect-scrollbar.min.js create mode 100644 highlight-js/demo/readme.md create mode 100644 highlight-js/demo/style.css create mode 100644 highlight-js/docs/Makefile create mode 100644 highlight-js/docs/_static/.gitkeep create mode 100644 highlight-js/docs/_templates/.gitkeep create mode 100644 highlight-js/docs/api.rst create mode 100644 highlight-js/docs/building-testing.rst create mode 100644 highlight-js/docs/conf.py create mode 100644 highlight-js/docs/css-classes-reference.rst create mode 100644 highlight-js/docs/index.rst create mode 100644 highlight-js/docs/language-contribution.rst create mode 100644 highlight-js/docs/language-guide.rst create mode 100644 highlight-js/docs/language-requests.rst create mode 100644 highlight-js/docs/line-numbers.rst create mode 100644 highlight-js/docs/maintainers-guide.rst create mode 100644 highlight-js/docs/reference.rst create mode 100644 highlight-js/docs/style-guide.rst create mode 100644 highlight-js/package-lock.json create mode 100644 highlight-js/package.json create mode 100644 highlight-js/src/highlight.js create mode 100644 highlight-js/src/languages/1c.js create mode 100644 highlight-js/src/languages/abnf.js create mode 100644 highlight-js/src/languages/accesslog.js create mode 100644 highlight-js/src/languages/actionscript.js create mode 100644 highlight-js/src/languages/ada.js create mode 100644 highlight-js/src/languages/angelscript.js create mode 100644 highlight-js/src/languages/apache.js create mode 100644 highlight-js/src/languages/applescript.js create mode 100644 highlight-js/src/languages/arcade.js create mode 100644 highlight-js/src/languages/arduino.js create mode 100644 highlight-js/src/languages/armasm.js create mode 100644 highlight-js/src/languages/asciidoc.js create mode 100644 highlight-js/src/languages/aspectj.js create mode 100644 highlight-js/src/languages/autohotkey.js create mode 100644 highlight-js/src/languages/autoit.js create mode 100644 highlight-js/src/languages/avrasm.js create mode 100644 highlight-js/src/languages/awk.js create mode 100644 highlight-js/src/languages/axapta.js create mode 100644 highlight-js/src/languages/bash.js create mode 100644 highlight-js/src/languages/basic.js create mode 100644 highlight-js/src/languages/bnf.js create mode 100644 highlight-js/src/languages/brainfuck.js create mode 100644 highlight-js/src/languages/cal.js create mode 100644 highlight-js/src/languages/capnproto.js create mode 100644 highlight-js/src/languages/ceylon.js create mode 100644 highlight-js/src/languages/clean.js create mode 100644 highlight-js/src/languages/clojure-repl.js create mode 100644 highlight-js/src/languages/clojure.js create mode 100644 highlight-js/src/languages/cmake.js create mode 100644 highlight-js/src/languages/coffeescript.js create mode 100644 highlight-js/src/languages/coq.js create mode 100644 highlight-js/src/languages/cos.js create mode 100644 highlight-js/src/languages/cpp.js create mode 100644 highlight-js/src/languages/crmsh.js create mode 100644 highlight-js/src/languages/crystal.js create mode 100644 highlight-js/src/languages/cs.js create mode 100644 highlight-js/src/languages/csp.js create mode 100644 highlight-js/src/languages/css.js create mode 100644 highlight-js/src/languages/d.js create mode 100644 highlight-js/src/languages/dart.js create mode 100644 highlight-js/src/languages/delphi.js create mode 100644 highlight-js/src/languages/diff.js create mode 100644 highlight-js/src/languages/django.js create mode 100644 highlight-js/src/languages/dns.js create mode 100644 highlight-js/src/languages/dockerfile.js create mode 100644 highlight-js/src/languages/dos.js create mode 100644 highlight-js/src/languages/dsconfig.js create mode 100644 highlight-js/src/languages/dts.js create mode 100644 highlight-js/src/languages/dust.js create mode 100644 highlight-js/src/languages/ebnf.js create mode 100644 highlight-js/src/languages/elixir.js create mode 100644 highlight-js/src/languages/elm.js create mode 100644 highlight-js/src/languages/erb.js create mode 100644 highlight-js/src/languages/erlang-repl.js create mode 100644 highlight-js/src/languages/erlang.js create mode 100644 highlight-js/src/languages/excel.js create mode 100644 highlight-js/src/languages/fix.js create mode 100644 highlight-js/src/languages/flix.js create mode 100644 highlight-js/src/languages/fortran.js create mode 100644 highlight-js/src/languages/fsharp.js create mode 100644 highlight-js/src/languages/gams.js create mode 100644 highlight-js/src/languages/gauss.js create mode 100644 highlight-js/src/languages/gcode.js create mode 100644 highlight-js/src/languages/gherkin.js create mode 100644 highlight-js/src/languages/glsl.js create mode 100644 highlight-js/src/languages/gml.js create mode 100644 highlight-js/src/languages/go.js create mode 100644 highlight-js/src/languages/golo.js create mode 100644 highlight-js/src/languages/gradle.js create mode 100644 highlight-js/src/languages/groovy.js create mode 100644 highlight-js/src/languages/haml.js create mode 100644 highlight-js/src/languages/handlebars.js create mode 100644 highlight-js/src/languages/haskell.js create mode 100644 highlight-js/src/languages/haxe.js create mode 100644 highlight-js/src/languages/hsp.js create mode 100644 highlight-js/src/languages/htmlbars.js create mode 100644 highlight-js/src/languages/http.js create mode 100644 highlight-js/src/languages/hy.js create mode 100644 highlight-js/src/languages/inform7.js create mode 100644 highlight-js/src/languages/ini.js create mode 100644 highlight-js/src/languages/irpf90.js create mode 100644 highlight-js/src/languages/isbl.js create mode 100644 highlight-js/src/languages/java.js create mode 100644 highlight-js/src/languages/javascript.js create mode 100644 highlight-js/src/languages/jboss-cli.js create mode 100644 highlight-js/src/languages/json.js create mode 100644 highlight-js/src/languages/julia-repl.js create mode 100644 highlight-js/src/languages/julia.js create mode 100644 highlight-js/src/languages/kotlin.js create mode 100644 highlight-js/src/languages/lasso.js create mode 100644 highlight-js/src/languages/ldif.js create mode 100644 highlight-js/src/languages/leaf.js create mode 100644 highlight-js/src/languages/less.js create mode 100644 highlight-js/src/languages/lisp.js create mode 100644 highlight-js/src/languages/livecodeserver.js create mode 100644 highlight-js/src/languages/livescript.js create mode 100644 highlight-js/src/languages/llvm.js create mode 100644 highlight-js/src/languages/lsl.js create mode 100644 highlight-js/src/languages/lua.js create mode 100644 highlight-js/src/languages/makefile.js create mode 100644 highlight-js/src/languages/markdown.js create mode 100644 highlight-js/src/languages/mathematica.js create mode 100644 highlight-js/src/languages/matlab.js create mode 100644 highlight-js/src/languages/maxima.js create mode 100644 highlight-js/src/languages/mel.js create mode 100644 highlight-js/src/languages/mercury.js create mode 100644 highlight-js/src/languages/mipsasm.js create mode 100644 highlight-js/src/languages/mizar.js create mode 100644 highlight-js/src/languages/mojolicious.js create mode 100644 highlight-js/src/languages/monkey.js create mode 100644 highlight-js/src/languages/moonscript.js create mode 100644 highlight-js/src/languages/n1ql.js create mode 100644 highlight-js/src/languages/nginx.js create mode 100644 highlight-js/src/languages/nimrod.js create mode 100644 highlight-js/src/languages/nix.js create mode 100644 highlight-js/src/languages/nsis.js create mode 100644 highlight-js/src/languages/objectivec.js create mode 100644 highlight-js/src/languages/ocaml.js create mode 100644 highlight-js/src/languages/openscad.js create mode 100644 highlight-js/src/languages/oxygene.js create mode 100644 highlight-js/src/languages/parser3.js create mode 100644 highlight-js/src/languages/perl.js create mode 100644 highlight-js/src/languages/pf.js create mode 100644 highlight-js/src/languages/pgsql.js create mode 100644 highlight-js/src/languages/php.js create mode 100644 highlight-js/src/languages/plaintext.js create mode 100644 highlight-js/src/languages/pony.js create mode 100644 highlight-js/src/languages/powershell.js create mode 100644 highlight-js/src/languages/processing.js create mode 100644 highlight-js/src/languages/profile.js create mode 100644 highlight-js/src/languages/prolog.js create mode 100644 highlight-js/src/languages/properties.js create mode 100644 highlight-js/src/languages/protobuf.js create mode 100644 highlight-js/src/languages/puppet.js create mode 100644 highlight-js/src/languages/purebasic.js create mode 100644 highlight-js/src/languages/python.js create mode 100644 highlight-js/src/languages/q.js create mode 100644 highlight-js/src/languages/qml.js create mode 100644 highlight-js/src/languages/r.js create mode 100644 highlight-js/src/languages/reasonml.js create mode 100644 highlight-js/src/languages/rib.js create mode 100644 highlight-js/src/languages/roboconf.js create mode 100644 highlight-js/src/languages/routeros.js create mode 100644 highlight-js/src/languages/rsl.js create mode 100644 highlight-js/src/languages/ruby.js create mode 100644 highlight-js/src/languages/ruleslanguage.js create mode 100644 highlight-js/src/languages/rust.js create mode 100644 highlight-js/src/languages/sas.js create mode 100644 highlight-js/src/languages/scala.js create mode 100644 highlight-js/src/languages/scheme.js create mode 100644 highlight-js/src/languages/scilab.js create mode 100644 highlight-js/src/languages/scss.js create mode 100644 highlight-js/src/languages/shell.js create mode 100644 highlight-js/src/languages/smali.js create mode 100644 highlight-js/src/languages/smalltalk.js create mode 100644 highlight-js/src/languages/sml.js create mode 100644 highlight-js/src/languages/sqf.js create mode 100644 highlight-js/src/languages/sql.js create mode 100644 highlight-js/src/languages/stan.js create mode 100644 highlight-js/src/languages/stata.js create mode 100644 highlight-js/src/languages/step21.js create mode 100644 highlight-js/src/languages/stylus.js create mode 100644 highlight-js/src/languages/subunit.js create mode 100644 highlight-js/src/languages/swift.js create mode 100644 highlight-js/src/languages/taggerscript.js create mode 100644 highlight-js/src/languages/tap.js create mode 100644 highlight-js/src/languages/tcl.js create mode 100644 highlight-js/src/languages/tex.js create mode 100644 highlight-js/src/languages/thrift.js create mode 100644 highlight-js/src/languages/tp.js create mode 100644 highlight-js/src/languages/twig.js create mode 100644 highlight-js/src/languages/typescript.js create mode 100644 highlight-js/src/languages/vala.js create mode 100644 highlight-js/src/languages/vbnet.js create mode 100644 highlight-js/src/languages/vbscript-html.js create mode 100644 highlight-js/src/languages/vbscript.js create mode 100644 highlight-js/src/languages/verilog.js create mode 100644 highlight-js/src/languages/vhdl.js create mode 100644 highlight-js/src/languages/vim.js create mode 100644 highlight-js/src/languages/x86asm.js create mode 100644 highlight-js/src/languages/xl.js create mode 100644 highlight-js/src/languages/xml.js create mode 100644 highlight-js/src/languages/xquery.js create mode 100644 highlight-js/src/languages/yaml.js create mode 100644 highlight-js/src/languages/zephir.js create mode 100644 highlight-js/src/styles/a11y-dark.css create mode 100644 highlight-js/src/styles/a11y-light.css create mode 100644 highlight-js/src/styles/agate.css create mode 100644 highlight-js/src/styles/an-old-hope.css create mode 100644 highlight-js/src/styles/androidstudio.css create mode 100644 highlight-js/src/styles/arduino-light.css create mode 100644 highlight-js/src/styles/arta.css create mode 100644 highlight-js/src/styles/ascetic.css create mode 100644 highlight-js/src/styles/atelier-cave-dark.css create mode 100644 highlight-js/src/styles/atelier-cave-light.css create mode 100644 highlight-js/src/styles/atelier-dune-dark.css create mode 100644 highlight-js/src/styles/atelier-dune-light.css create mode 100644 highlight-js/src/styles/atelier-estuary-dark.css create mode 100644 highlight-js/src/styles/atelier-estuary-light.css create mode 100644 highlight-js/src/styles/atelier-forest-dark.css create mode 100644 highlight-js/src/styles/atelier-forest-light.css create mode 100644 highlight-js/src/styles/atelier-heath-dark.css create mode 100644 highlight-js/src/styles/atelier-heath-light.css create mode 100644 highlight-js/src/styles/atelier-lakeside-dark.css create mode 100644 highlight-js/src/styles/atelier-lakeside-light.css create mode 100644 highlight-js/src/styles/atelier-plateau-dark.css create mode 100644 highlight-js/src/styles/atelier-plateau-light.css create mode 100644 highlight-js/src/styles/atelier-savanna-dark.css create mode 100644 highlight-js/src/styles/atelier-savanna-light.css create mode 100644 highlight-js/src/styles/atelier-seaside-dark.css create mode 100644 highlight-js/src/styles/atelier-seaside-light.css create mode 100644 highlight-js/src/styles/atelier-sulphurpool-dark.css create mode 100644 highlight-js/src/styles/atelier-sulphurpool-light.css create mode 100644 highlight-js/src/styles/atom-one-dark-reasonable.css create mode 100644 highlight-js/src/styles/atom-one-dark.css create mode 100644 highlight-js/src/styles/atom-one-light.css create mode 100644 highlight-js/src/styles/brown-paper.css create mode 100644 highlight-js/src/styles/brown-papersq.png create mode 100644 highlight-js/src/styles/codepen-embed.css create mode 100644 highlight-js/src/styles/color-brewer.css create mode 100644 highlight-js/src/styles/darcula.css create mode 100644 highlight-js/src/styles/dark.css create mode 100644 highlight-js/src/styles/darkula.css create mode 100644 highlight-js/src/styles/default.css create mode 100644 highlight-js/src/styles/docco.css create mode 100644 highlight-js/src/styles/dracula.css create mode 100644 highlight-js/src/styles/far.css create mode 100644 highlight-js/src/styles/foundation.css create mode 100644 highlight-js/src/styles/github-gist.css create mode 100644 highlight-js/src/styles/github.css create mode 100644 highlight-js/src/styles/gml.css create mode 100644 highlight-js/src/styles/googlecode.css create mode 100644 highlight-js/src/styles/grayscale.css create mode 100644 highlight-js/src/styles/gruvbox-dark.css create mode 100644 highlight-js/src/styles/gruvbox-light.css create mode 100644 highlight-js/src/styles/hopscotch.css create mode 100644 highlight-js/src/styles/hybrid.css create mode 100644 highlight-js/src/styles/idea.css create mode 100644 highlight-js/src/styles/ir-black.css create mode 100644 highlight-js/src/styles/isbl-editor-dark.css create mode 100644 highlight-js/src/styles/isbl-editor-light.css create mode 100644 highlight-js/src/styles/kimbie.dark.css create mode 100644 highlight-js/src/styles/kimbie.light.css create mode 100644 highlight-js/src/styles/lightfair.css create mode 100644 highlight-js/src/styles/magula.css create mode 100644 highlight-js/src/styles/mono-blue.css create mode 100644 highlight-js/src/styles/monokai-sublime.css create mode 100644 highlight-js/src/styles/monokai.css create mode 100644 highlight-js/src/styles/nord.css create mode 100644 highlight-js/src/styles/obsidian.css create mode 100644 highlight-js/src/styles/ocean.css create mode 100644 highlight-js/src/styles/paraiso-dark.css create mode 100644 highlight-js/src/styles/paraiso-light.css create mode 100644 highlight-js/src/styles/pojoaque.css create mode 100644 highlight-js/src/styles/pojoaque.jpg create mode 100644 highlight-js/src/styles/purebasic.css create mode 100644 highlight-js/src/styles/qtcreator_dark.css create mode 100644 highlight-js/src/styles/qtcreator_light.css create mode 100644 highlight-js/src/styles/railscasts.css create mode 100644 highlight-js/src/styles/rainbow.css create mode 100644 highlight-js/src/styles/routeros.css create mode 100644 highlight-js/src/styles/school-book.css create mode 100644 highlight-js/src/styles/school-book.png create mode 100644 highlight-js/src/styles/shades-of-purple.css create mode 100644 highlight-js/src/styles/solarized-dark.css create mode 100644 highlight-js/src/styles/solarized-light.css create mode 100644 highlight-js/src/styles/sunburst.css create mode 100644 highlight-js/src/styles/tomorrow-night-blue.css create mode 100644 highlight-js/src/styles/tomorrow-night-bright.css create mode 100644 highlight-js/src/styles/tomorrow-night-eighties.css create mode 100644 highlight-js/src/styles/tomorrow-night.css create mode 100644 highlight-js/src/styles/tomorrow.css create mode 100644 highlight-js/src/styles/vs.css create mode 100644 highlight-js/src/styles/vs2015.css create mode 100644 highlight-js/src/styles/xcode.css create mode 100644 highlight-js/src/styles/xt256.css create mode 100644 highlight-js/src/styles/zenburn.css create mode 100644 highlight-js/test/api/autoDetection.js create mode 100644 highlight-js/test/api/binaryNumber.js create mode 100644 highlight-js/test/api/cNumber.js create mode 100644 highlight-js/test/api/fixmarkup.js create mode 100644 highlight-js/test/api/getLanguage.js create mode 100644 highlight-js/test/api/highlight.js create mode 100644 highlight-js/test/api/ident.js create mode 100644 highlight-js/test/api/index.js create mode 100644 highlight-js/test/api/number.js create mode 100644 highlight-js/test/api/starters.js create mode 100644 highlight-js/test/api/underscoreIdent.js create mode 100644 highlight-js/test/browser/index.js create mode 100644 highlight-js/test/browser/plain.js create mode 100644 highlight-js/test/browser/worker.js create mode 100644 highlight-js/test/detect/1c/default.txt create mode 100644 highlight-js/test/detect/abnf/default.txt create mode 100644 highlight-js/test/detect/accesslog/default.txt create mode 100644 highlight-js/test/detect/actionscript/default.txt create mode 100644 highlight-js/test/detect/ada/default.txt create mode 100644 highlight-js/test/detect/angelscript/default.txt create mode 100644 highlight-js/test/detect/apache/default.txt create mode 100644 highlight-js/test/detect/applescript/default.txt create mode 100644 highlight-js/test/detect/arcade/default.txt create mode 100644 highlight-js/test/detect/arduino/default.txt create mode 100644 highlight-js/test/detect/armasm/default.txt create mode 100644 highlight-js/test/detect/asciidoc/default.txt create mode 100644 highlight-js/test/detect/aspectj/default.txt create mode 100644 highlight-js/test/detect/autohotkey/default.txt create mode 100644 highlight-js/test/detect/autoit/default.txt create mode 100644 highlight-js/test/detect/avrasm/default.txt create mode 100644 highlight-js/test/detect/awk/default.txt create mode 100644 highlight-js/test/detect/axapta/default.txt create mode 100644 highlight-js/test/detect/bash/default.txt create mode 100644 highlight-js/test/detect/basic/default.txt create mode 100644 highlight-js/test/detect/bnf/default.txt create mode 100644 highlight-js/test/detect/brainfuck/default.txt create mode 100644 highlight-js/test/detect/cal/default.txt create mode 100644 highlight-js/test/detect/capnproto/default.txt create mode 100644 highlight-js/test/detect/ceylon/default.txt create mode 100644 highlight-js/test/detect/clean/default.txt create mode 100644 highlight-js/test/detect/clojure-repl/default.txt create mode 100644 highlight-js/test/detect/clojure/default.txt create mode 100644 highlight-js/test/detect/cmake/default.txt create mode 100644 highlight-js/test/detect/coffeescript/default.txt create mode 100644 highlight-js/test/detect/coq/default.txt create mode 100644 highlight-js/test/detect/cos/default.txt create mode 100644 highlight-js/test/detect/cpp/comment.txt create mode 100644 highlight-js/test/detect/cpp/default.txt create mode 100644 highlight-js/test/detect/crmsh/default.txt create mode 100644 highlight-js/test/detect/crystal/default.txt create mode 100644 highlight-js/test/detect/cs/default.txt create mode 100644 highlight-js/test/detect/csp/default.txt create mode 100644 highlight-js/test/detect/css/default.txt create mode 100644 highlight-js/test/detect/d/default.txt create mode 100644 highlight-js/test/detect/dart/default.txt create mode 100644 highlight-js/test/detect/delphi/default.txt create mode 100644 highlight-js/test/detect/diff/default.txt create mode 100644 highlight-js/test/detect/django/default.txt create mode 100644 highlight-js/test/detect/dns/default.txt create mode 100644 highlight-js/test/detect/dockerfile/default.txt create mode 100644 highlight-js/test/detect/dos/default.txt create mode 100644 highlight-js/test/detect/dsconfig/default.txt create mode 100644 highlight-js/test/detect/dts/default.txt create mode 100644 highlight-js/test/detect/dust/default.txt create mode 100644 highlight-js/test/detect/ebnf/default.txt create mode 100644 highlight-js/test/detect/elixir/default.txt create mode 100644 highlight-js/test/detect/elm/default.txt create mode 100644 highlight-js/test/detect/erb/default.txt create mode 100644 highlight-js/test/detect/erlang-repl/default.txt create mode 100644 highlight-js/test/detect/erlang/default.txt create mode 100644 highlight-js/test/detect/excel/default.txt create mode 100644 highlight-js/test/detect/fix/default.txt create mode 100644 highlight-js/test/detect/flix/default.txt create mode 100644 highlight-js/test/detect/fortran/default.txt create mode 100644 highlight-js/test/detect/fsharp/default.txt create mode 100644 highlight-js/test/detect/gams/default.txt create mode 100644 highlight-js/test/detect/gauss/default.txt create mode 100644 highlight-js/test/detect/gcode/default.txt create mode 100644 highlight-js/test/detect/gherkin/default.txt create mode 100644 highlight-js/test/detect/glsl/default.txt create mode 100644 highlight-js/test/detect/gml/default.txt create mode 100644 highlight-js/test/detect/go/default.txt create mode 100644 highlight-js/test/detect/go/swift-like.txt create mode 100644 highlight-js/test/detect/golo/default.txt create mode 100644 highlight-js/test/detect/gradle/default.txt create mode 100644 highlight-js/test/detect/groovy/default.txt create mode 100644 highlight-js/test/detect/haml/default.txt create mode 100644 highlight-js/test/detect/handlebars/default.txt create mode 100644 highlight-js/test/detect/haskell/default.txt create mode 100644 highlight-js/test/detect/haxe/default.txt create mode 100644 highlight-js/test/detect/hsp/default.txt create mode 100644 highlight-js/test/detect/htmlbars/default.txt create mode 100644 highlight-js/test/detect/http/default.txt create mode 100644 highlight-js/test/detect/hy/default.txt create mode 100644 highlight-js/test/detect/index.js create mode 100644 highlight-js/test/detect/inform7/default.txt create mode 100644 highlight-js/test/detect/ini/default.txt create mode 100644 highlight-js/test/detect/irpf90/default.txt create mode 100644 highlight-js/test/detect/isbl/default.txt create mode 100644 highlight-js/test/detect/java/default.txt create mode 100644 highlight-js/test/detect/javascript/default.txt create mode 100644 highlight-js/test/detect/javascript/sample1.txt create mode 100644 highlight-js/test/detect/javascript/short-plain.txt create mode 100644 highlight-js/test/detect/jboss-cli/default.txt create mode 100644 highlight-js/test/detect/json/default.txt create mode 100644 highlight-js/test/detect/julia-repl/default.txt create mode 100644 highlight-js/test/detect/julia/default.txt create mode 100644 highlight-js/test/detect/kotlin/default.txt create mode 100644 highlight-js/test/detect/lasso/default.txt create mode 100644 highlight-js/test/detect/ldif/default.txt create mode 100644 highlight-js/test/detect/leaf/default.txt create mode 100644 highlight-js/test/detect/less/default.txt create mode 100644 highlight-js/test/detect/lisp/default.txt create mode 100644 highlight-js/test/detect/livecodeserver/default.txt create mode 100644 highlight-js/test/detect/livescript/default.txt create mode 100644 highlight-js/test/detect/llvm/default.txt create mode 100644 highlight-js/test/detect/lsl/default.txt create mode 100644 highlight-js/test/detect/lua/default.txt create mode 100644 highlight-js/test/detect/makefile/default.txt create mode 100644 highlight-js/test/detect/markdown/default.txt create mode 100644 highlight-js/test/detect/mathematica/default.txt create mode 100644 highlight-js/test/detect/matlab/default.txt create mode 100644 highlight-js/test/detect/maxima/default.txt create mode 100644 highlight-js/test/detect/mel/default.txt create mode 100644 highlight-js/test/detect/mercury/default.txt create mode 100644 highlight-js/test/detect/mipsasm/default.txt create mode 100644 highlight-js/test/detect/mizar/default.txt create mode 100644 highlight-js/test/detect/mojolicious/default.txt create mode 100644 highlight-js/test/detect/monkey/default.txt create mode 100644 highlight-js/test/detect/moonscript/default.txt create mode 100644 highlight-js/test/detect/n1ql/default.txt create mode 100644 highlight-js/test/detect/nginx/default.txt create mode 100644 highlight-js/test/detect/nimrod/default.txt create mode 100644 highlight-js/test/detect/nix/default.txt create mode 100644 highlight-js/test/detect/nsis/default.txt create mode 100644 highlight-js/test/detect/objectivec/default.txt create mode 100644 highlight-js/test/detect/ocaml/default.txt create mode 100644 highlight-js/test/detect/openscad/default.txt create mode 100644 highlight-js/test/detect/oxygene/default.txt create mode 100644 highlight-js/test/detect/parser3/default.txt create mode 100644 highlight-js/test/detect/perl/default.txt create mode 100644 highlight-js/test/detect/pf/default.txt create mode 100644 highlight-js/test/detect/pgsql/default.txt create mode 100644 highlight-js/test/detect/php/default.txt create mode 100644 highlight-js/test/detect/plaintext/default.txt create mode 100644 highlight-js/test/detect/pony/default.txt create mode 100644 highlight-js/test/detect/powershell/default.txt create mode 100644 highlight-js/test/detect/processing/default.txt create mode 100644 highlight-js/test/detect/profile/default.txt create mode 100644 highlight-js/test/detect/prolog/default.txt create mode 100644 highlight-js/test/detect/properties/default.txt create mode 100644 highlight-js/test/detect/protobuf/default.txt create mode 100644 highlight-js/test/detect/puppet/default.txt create mode 100644 highlight-js/test/detect/purebasic/default.txt create mode 100644 highlight-js/test/detect/python/default.txt create mode 100644 highlight-js/test/detect/q/default.txt create mode 100644 highlight-js/test/detect/qml/default.txt create mode 100644 highlight-js/test/detect/r/default.txt create mode 100644 highlight-js/test/detect/reasonml/default.txt create mode 100644 highlight-js/test/detect/rib/default.txt create mode 100644 highlight-js/test/detect/roboconf/default.txt create mode 100644 highlight-js/test/detect/routeros/default.txt create mode 100644 highlight-js/test/detect/rsl/default.txt create mode 100644 highlight-js/test/detect/ruby/default.txt create mode 100644 highlight-js/test/detect/ruby/double-colon.txt create mode 100644 highlight-js/test/detect/ruleslanguage/default.txt create mode 100644 highlight-js/test/detect/rust/default.txt create mode 100644 highlight-js/test/detect/sas/default.txt create mode 100644 highlight-js/test/detect/scala/default.txt create mode 100644 highlight-js/test/detect/scheme/default.txt create mode 100644 highlight-js/test/detect/scilab/default.txt create mode 100644 highlight-js/test/detect/scss/default.txt create mode 100644 highlight-js/test/detect/shell/default.txt create mode 100644 highlight-js/test/detect/smali/default.txt create mode 100644 highlight-js/test/detect/smalltalk/default.txt create mode 100644 highlight-js/test/detect/sml/default.txt create mode 100644 highlight-js/test/detect/sqf/default.txt create mode 100644 highlight-js/test/detect/sql/default.txt create mode 100644 highlight-js/test/detect/stan/default.txt create mode 100644 highlight-js/test/detect/stata/default.txt create mode 100644 highlight-js/test/detect/step21/default.txt create mode 100644 highlight-js/test/detect/stylus/default.txt create mode 100644 highlight-js/test/detect/subunit/default.txt create mode 100644 highlight-js/test/detect/swift/default.txt create mode 100644 highlight-js/test/detect/taggerscript/default.txt create mode 100644 highlight-js/test/detect/tap/default.txt create mode 100644 highlight-js/test/detect/tcl/default.txt create mode 100644 highlight-js/test/detect/tex/default.txt create mode 100644 highlight-js/test/detect/thrift/default.txt create mode 100644 highlight-js/test/detect/tp/default.txt create mode 100644 highlight-js/test/detect/twig/default.txt create mode 100644 highlight-js/test/detect/typescript/default.txt create mode 100644 highlight-js/test/detect/vala/default.txt create mode 100644 highlight-js/test/detect/vbnet/default.txt create mode 100644 highlight-js/test/detect/vbscript-html/default.txt create mode 100644 highlight-js/test/detect/vbscript/default.txt create mode 100644 highlight-js/test/detect/verilog/default.txt create mode 100644 highlight-js/test/detect/vhdl/default.txt create mode 100644 highlight-js/test/detect/vim/default.txt create mode 100644 highlight-js/test/detect/x86asm/default.txt create mode 100644 highlight-js/test/detect/xl/default.txt create mode 100644 highlight-js/test/detect/xml/default.txt create mode 100644 highlight-js/test/detect/xml/groovy-julia.txt create mode 100644 highlight-js/test/detect/xml/js.txt create mode 100644 highlight-js/test/detect/xquery/default.txt create mode 100644 highlight-js/test/detect/yaml/default.txt create mode 100644 highlight-js/test/detect/zephir/default.txt create mode 100644 highlight-js/test/fixtures/expect/brInPre.txt create mode 100644 highlight-js/test/fixtures/expect/custommarkup.txt create mode 100644 highlight-js/test/fixtures/expect/customtabreplace.txt create mode 100644 highlight-js/test/fixtures/expect/endsWithParentVariants.txt create mode 100644 highlight-js/test/fixtures/expect/explicit1.txt create mode 100644 highlight-js/test/fixtures/expect/explicit2.txt create mode 100644 highlight-js/test/fixtures/expect/languagealias.txt create mode 100644 highlight-js/test/fixtures/expect/sublanguages.txt create mode 100644 highlight-js/test/fixtures/expect/tabreplace.txt create mode 100644 highlight-js/test/fixtures/expect/useBr.txt create mode 100644 highlight-js/test/fixtures/index.html create mode 100644 highlight-js/test/fixtures/nested.js create mode 100644 highlight-js/test/index.js create mode 100644 highlight-js/test/markup/accesslog/default.expect.txt create mode 100644 highlight-js/test/markup/accesslog/default.txt create mode 100644 highlight-js/test/markup/actionscript/method-call.expect.txt create mode 100644 highlight-js/test/markup/actionscript/method-call.txt create mode 100644 highlight-js/test/markup/arcade/profile.expect.txt create mode 100644 highlight-js/test/markup/arcade/profile.txt create mode 100644 highlight-js/test/markup/aspectj/intertype-constructor.expect.txt create mode 100644 highlight-js/test/markup/aspectj/intertype-constructor.txt create mode 100644 highlight-js/test/markup/aspectj/intertype-method.expect.txt create mode 100644 highlight-js/test/markup/aspectj/intertype-method.txt create mode 100644 highlight-js/test/markup/bash/no-numbers.expect.txt create mode 100644 highlight-js/test/markup/bash/no-numbers.txt create mode 100644 highlight-js/test/markup/ceylon/nested-comments.expect.txt create mode 100644 highlight-js/test/markup/ceylon/nested-comments.txt create mode 100644 highlight-js/test/markup/clojure-repl/prompt.expect.txt create mode 100644 highlight-js/test/markup/clojure-repl/prompt.txt create mode 100644 highlight-js/test/markup/clojure/hint_col.expect.txt create mode 100644 highlight-js/test/markup/clojure/hint_col.txt create mode 100644 highlight-js/test/markup/clojure/symbols-numbers.expect.txt create mode 100644 highlight-js/test/markup/clojure/symbols-numbers.txt create mode 100644 highlight-js/test/markup/coffeescript/division.expect.txt create mode 100644 highlight-js/test/markup/coffeescript/division.txt create mode 100644 highlight-js/test/markup/coffeescript/function.expect.txt create mode 100644 highlight-js/test/markup/coffeescript/function.txt create mode 100644 highlight-js/test/markup/coffeescript/regex.expect.txt create mode 100644 highlight-js/test/markup/coffeescript/regex.txt create mode 100644 highlight-js/test/markup/cos/basic.expect.txt create mode 100644 highlight-js/test/markup/cos/basic.txt create mode 100644 highlight-js/test/markup/cos/embedded.expect.txt create mode 100644 highlight-js/test/markup/cos/embedded.txt create mode 100644 highlight-js/test/markup/cpp/expression-keywords.expect.txt create mode 100644 highlight-js/test/markup/cpp/expression-keywords.txt create mode 100644 highlight-js/test/markup/cpp/function-params.expect.txt create mode 100644 highlight-js/test/markup/cpp/function-params.txt create mode 100644 highlight-js/test/markup/cpp/function-title.expect.txt create mode 100644 highlight-js/test/markup/cpp/function-title.txt create mode 100644 highlight-js/test/markup/cpp/number-literals.expect.txt create mode 100644 highlight-js/test/markup/cpp/number-literals.txt create mode 100644 highlight-js/test/markup/cpp/pointers-returns.expect.txt create mode 100644 highlight-js/test/markup/cpp/pointers-returns.txt create mode 100644 highlight-js/test/markup/cpp/preprocessor.expect.txt create mode 100644 highlight-js/test/markup/cpp/preprocessor.txt create mode 100644 highlight-js/test/markup/cpp/primitive-types.expect.txt create mode 100644 highlight-js/test/markup/cpp/primitive-types.txt create mode 100644 highlight-js/test/markup/cpp/string-literals.expect.txt create mode 100644 highlight-js/test/markup/cpp/string-literals.txt create mode 100644 highlight-js/test/markup/crystal/literals.expect.txt create mode 100644 highlight-js/test/markup/crystal/literals.txt create mode 100644 highlight-js/test/markup/crystal/macro.expect.txt create mode 100644 highlight-js/test/markup/crystal/macro.txt create mode 100644 highlight-js/test/markup/crystal/operators.expect.txt create mode 100644 highlight-js/test/markup/crystal/operators.txt create mode 100644 highlight-js/test/markup/crystal/regexes.expect.txt create mode 100644 highlight-js/test/markup/crystal/regexes.txt create mode 100644 highlight-js/test/markup/crystal/toplevel-keywords.expect.txt create mode 100644 highlight-js/test/markup/crystal/toplevel-keywords.txt create mode 100644 highlight-js/test/markup/cs/dotted-namespace.expect.txt create mode 100644 highlight-js/test/markup/cs/dotted-namespace.txt create mode 100644 highlight-js/test/markup/cs/floats.expect.txt create mode 100644 highlight-js/test/markup/cs/floats.txt create mode 100644 highlight-js/test/markup/cs/functions.expect.txt create mode 100644 highlight-js/test/markup/cs/functions.txt create mode 100644 highlight-js/test/markup/cs/string-interpolation.expect.txt create mode 100644 highlight-js/test/markup/cs/string-interpolation.txt create mode 100644 highlight-js/test/markup/cs/titles.expect.txt create mode 100644 highlight-js/test/markup/cs/titles.txt create mode 100644 highlight-js/test/markup/css/pseudo-selector.expect.txt create mode 100644 highlight-js/test/markup/css/pseudo-selector.txt create mode 100644 highlight-js/test/markup/css/url.expect.txt create mode 100644 highlight-js/test/markup/css/url.txt create mode 100644 highlight-js/test/markup/delphi/compiler-directive.expect.txt create mode 100644 highlight-js/test/markup/delphi/compiler-directive.txt create mode 100644 highlight-js/test/markup/diff/comments.expect.txt create mode 100644 highlight-js/test/markup/diff/comments.txt create mode 100644 highlight-js/test/markup/dockerfile/default.expect.txt create mode 100644 highlight-js/test/markup/dockerfile/default.txt create mode 100644 highlight-js/test/markup/dos/comments.expect.txt create mode 100644 highlight-js/test/markup/dos/comments.txt create mode 100644 highlight-js/test/markup/dsconfig/default.expect.txt create mode 100644 highlight-js/test/markup/dsconfig/default.txt create mode 100644 highlight-js/test/markup/elixir/function-title.expect.txt create mode 100644 highlight-js/test/markup/elixir/function-title.txt create mode 100644 highlight-js/test/markup/excel/comments.expect.txt create mode 100644 highlight-js/test/markup/excel/comments.txt create mode 100644 highlight-js/test/markup/fortran/numbers.expect.txt create mode 100644 highlight-js/test/markup/fortran/numbers.txt create mode 100644 highlight-js/test/markup/fsharp/bang-keywords.expect.txt create mode 100644 highlight-js/test/markup/fsharp/bang-keywords.txt create mode 100644 highlight-js/test/markup/gauss/function_defs.expect.txt create mode 100644 highlight-js/test/markup/gauss/function_defs.txt create mode 100644 highlight-js/test/markup/gauss/function_refs.expect.txt create mode 100644 highlight-js/test/markup/gauss/function_refs.txt create mode 100644 highlight-js/test/markup/gauss/keywords.expect.txt create mode 100644 highlight-js/test/markup/gauss/keywords.txt create mode 100644 highlight-js/test/markup/go/numbers.expect.txt create mode 100644 highlight-js/test/markup/go/numbers.txt create mode 100644 highlight-js/test/markup/golo/default.expect.txt create mode 100644 highlight-js/test/markup/golo/default.txt create mode 100644 highlight-js/test/markup/haskell/infix.expect.txt create mode 100644 highlight-js/test/markup/haskell/infix.txt create mode 100644 highlight-js/test/markup/haskell/nested-comments.expect.txt create mode 100644 highlight-js/test/markup/haskell/nested-comments.txt create mode 100644 highlight-js/test/markup/http/default.expect.txt create mode 100644 highlight-js/test/markup/http/default.txt create mode 100644 highlight-js/test/markup/index.js create mode 100644 highlight-js/test/markup/java/gh1031.expect.txt create mode 100644 highlight-js/test/markup/java/gh1031.txt create mode 100644 highlight-js/test/markup/java/numbers.expect.txt create mode 100644 highlight-js/test/markup/java/numbers.txt create mode 100644 highlight-js/test/markup/java/titles.expect.txt create mode 100644 highlight-js/test/markup/java/titles.txt create mode 100644 highlight-js/test/markup/javascript/arrow-function.expect.txt create mode 100644 highlight-js/test/markup/javascript/arrow-function.txt create mode 100644 highlight-js/test/markup/javascript/class.expect.txt create mode 100644 highlight-js/test/markup/javascript/class.txt create mode 100644 highlight-js/test/markup/javascript/default-parameters.expect.txt create mode 100644 highlight-js/test/markup/javascript/default-parameters.txt create mode 100644 highlight-js/test/markup/javascript/jsx.expect.txt create mode 100644 highlight-js/test/markup/javascript/jsx.txt create mode 100644 highlight-js/test/markup/javascript/keywords.expect.txt create mode 100644 highlight-js/test/markup/javascript/keywords.txt create mode 100644 highlight-js/test/markup/javascript/method-call.expect.txt create mode 100644 highlight-js/test/markup/javascript/method-call.txt create mode 100644 highlight-js/test/markup/javascript/modules.expect.txt create mode 100644 highlight-js/test/markup/javascript/modules.txt create mode 100644 highlight-js/test/markup/javascript/object-attr.expect.txt create mode 100644 highlight-js/test/markup/javascript/object-attr.txt create mode 100644 highlight-js/test/markup/javascript/shebang.expect.txt create mode 100644 highlight-js/test/markup/javascript/shebang.txt create mode 100644 highlight-js/test/markup/javascript/template-strings.expect.txt create mode 100644 highlight-js/test/markup/javascript/template-strings.txt create mode 100644 highlight-js/test/markup/kotlin/class.expect.txt create mode 100644 highlight-js/test/markup/kotlin/class.txt create mode 100644 highlight-js/test/markup/kotlin/function.expect.txt create mode 100644 highlight-js/test/markup/kotlin/function.txt create mode 100644 highlight-js/test/markup/lasso/delimiters.expect.txt create mode 100644 highlight-js/test/markup/lasso/delimiters.txt create mode 100644 highlight-js/test/markup/ldif/ldapmodify.expect.txt create mode 100644 highlight-js/test/markup/ldif/ldapmodify.txt create mode 100644 highlight-js/test/markup/ldif/schema.expect.txt create mode 100644 highlight-js/test/markup/ldif/schema.txt create mode 100644 highlight-js/test/markup/less/selectors.expect.txt create mode 100644 highlight-js/test/markup/less/selectors.txt create mode 100644 highlight-js/test/markup/lisp/mec.expect.txt create mode 100644 highlight-js/test/markup/lisp/mec.txt create mode 100644 highlight-js/test/markup/markdown/code.expect.txt create mode 100644 highlight-js/test/markup/markdown/code.txt create mode 100644 highlight-js/test/markup/matlab/block_comment.expect.txt create mode 100644 highlight-js/test/markup/matlab/block_comment.txt create mode 100644 highlight-js/test/markup/matlab/transpose.expect.txt create mode 100644 highlight-js/test/markup/matlab/transpose.txt create mode 100644 highlight-js/test/markup/maxima/example.expect.txt create mode 100644 highlight-js/test/markup/maxima/example.txt create mode 100644 highlight-js/test/markup/maxima/numbers.expect.txt create mode 100644 highlight-js/test/markup/maxima/numbers.txt create mode 100644 highlight-js/test/markup/maxima/symbols.expect.txt create mode 100644 highlight-js/test/markup/maxima/symbols.txt create mode 100644 highlight-js/test/markup/ocaml/literals.expect.txt create mode 100644 highlight-js/test/markup/ocaml/literals.txt create mode 100644 highlight-js/test/markup/ocaml/types.expect.txt create mode 100644 highlight-js/test/markup/ocaml/types.txt create mode 100644 highlight-js/test/markup/pgsql/clauses.expect.txt create mode 100644 highlight-js/test/markup/pgsql/clauses.txt create mode 100644 highlight-js/test/markup/pgsql/clauses2.expect.txt create mode 100644 highlight-js/test/markup/pgsql/clauses2.txt create mode 100644 highlight-js/test/markup/pgsql/constraints.expect.txt create mode 100644 highlight-js/test/markup/pgsql/constraints.txt create mode 100644 highlight-js/test/markup/pgsql/options.expect.txt create mode 100644 highlight-js/test/markup/pgsql/options.txt create mode 100644 highlight-js/test/markup/pgsql/plpgsql.expect.txt create mode 100644 highlight-js/test/markup/pgsql/plpgsql.txt create mode 100644 highlight-js/test/markup/pgsql/sql-commands.expect.txt create mode 100644 highlight-js/test/markup/pgsql/sql-commands.txt create mode 100644 highlight-js/test/markup/pgsql/window-functions.expect.txt create mode 100644 highlight-js/test/markup/pgsql/window-functions.txt create mode 100644 highlight-js/test/markup/pgsql/xml.expect.txt create mode 100644 highlight-js/test/markup/pgsql/xml.txt create mode 100644 highlight-js/test/markup/php/comments.expect.txt create mode 100644 highlight-js/test/markup/php/comments.txt create mode 100644 highlight-js/test/markup/php/heredoc.expect.txt create mode 100644 highlight-js/test/markup/php/heredoc.txt create mode 100644 highlight-js/test/markup/pony/prime.expect.txt create mode 100644 highlight-js/test/markup/pony/prime.txt create mode 100644 highlight-js/test/markup/powershell/apos-herestring.expect.txt create mode 100644 highlight-js/test/markup/powershell/apos-herestring.txt create mode 100644 highlight-js/test/markup/powershell/quote-herestring.expect.txt create mode 100644 highlight-js/test/markup/powershell/quote-herestring.txt create mode 100644 highlight-js/test/markup/properties/syntax.expect.txt create mode 100644 highlight-js/test/markup/properties/syntax.txt create mode 100644 highlight-js/test/markup/protobuf/message-message.expect.txt create mode 100644 highlight-js/test/markup/protobuf/message-message.txt create mode 100644 highlight-js/test/markup/python/escaped-quotes.expect.txt create mode 100644 highlight-js/test/markup/python/escaped-quotes.txt create mode 100644 highlight-js/test/markup/python/f-strings.expect.txt create mode 100644 highlight-js/test/markup/python/f-strings.txt create mode 100644 highlight-js/test/markup/python/function-header.expect.txt create mode 100644 highlight-js/test/markup/python/function-header.txt create mode 100644 highlight-js/test/markup/python/matrix-multiplication.expect.txt create mode 100644 highlight-js/test/markup/python/matrix-multiplication.txt create mode 100644 highlight-js/test/markup/reasonml/functions.expect.txt create mode 100644 highlight-js/test/markup/reasonml/functions.txt create mode 100644 highlight-js/test/markup/reasonml/literals.expect.txt create mode 100644 highlight-js/test/markup/reasonml/literals.txt create mode 100644 highlight-js/test/markup/reasonml/modules.expect.txt create mode 100644 highlight-js/test/markup/reasonml/modules.txt create mode 100644 highlight-js/test/markup/reasonml/pattern-matching.expect.txt create mode 100644 highlight-js/test/markup/reasonml/pattern-matching.txt create mode 100644 highlight-js/test/markup/ruby/gemfile.expect.txt create mode 100644 highlight-js/test/markup/ruby/gemfile.txt create mode 100644 highlight-js/test/markup/ruby/heredoc.expect.txt create mode 100644 highlight-js/test/markup/ruby/heredoc.txt create mode 100644 highlight-js/test/markup/ruby/prompt.expect.txt create mode 100644 highlight-js/test/markup/ruby/prompt.txt create mode 100644 highlight-js/test/markup/ruby/regexes.expect.txt create mode 100644 highlight-js/test/markup/ruby/regexes.txt create mode 100644 highlight-js/test/markup/rust/comments.expect.txt create mode 100644 highlight-js/test/markup/rust/comments.txt create mode 100644 highlight-js/test/markup/rust/numbers.expect.txt create mode 100644 highlight-js/test/markup/rust/numbers.txt create mode 100644 highlight-js/test/markup/rust/strings.expect.txt create mode 100644 highlight-js/test/markup/rust/strings.txt create mode 100644 highlight-js/test/markup/rust/traits.expect.txt create mode 100644 highlight-js/test/markup/rust/traits.txt create mode 100644 highlight-js/test/markup/rust/types.expect.txt create mode 100644 highlight-js/test/markup/rust/types.txt create mode 100644 highlight-js/test/markup/rust/variables.expect.txt create mode 100644 highlight-js/test/markup/rust/variables.txt create mode 100644 highlight-js/test/markup/scala/case-classes.expect.txt create mode 100644 highlight-js/test/markup/scala/case-classes.txt create mode 100644 highlight-js/test/markup/scheme/lambda.expect.txt create mode 100644 highlight-js/test/markup/scheme/lambda.txt create mode 100644 highlight-js/test/markup/scheme/quoted.expect.txt create mode 100644 highlight-js/test/markup/scheme/quoted.txt create mode 100644 highlight-js/test/markup/sql/interval.expect.txt create mode 100644 highlight-js/test/markup/sql/interval.txt create mode 100644 highlight-js/test/markup/sql/join.expect.txt create mode 100644 highlight-js/test/markup/sql/join.txt create mode 100644 highlight-js/test/markup/sql/keywords.expect.txt create mode 100644 highlight-js/test/markup/sql/keywords.txt create mode 100644 highlight-js/test/markup/sql/lateral-view.expect.txt create mode 100644 highlight-js/test/markup/sql/lateral-view.txt create mode 100644 highlight-js/test/markup/sql/numeric-types.expect.txt create mode 100644 highlight-js/test/markup/sql/numeric-types.txt create mode 100644 highlight-js/test/markup/sql/set-operator.expect.txt create mode 100644 highlight-js/test/markup/sql/set-operator.txt create mode 100644 highlight-js/test/markup/sql/tablesample.expect.txt create mode 100644 highlight-js/test/markup/sql/tablesample.txt create mode 100644 highlight-js/test/markup/sql/values-statement.expect.txt create mode 100644 highlight-js/test/markup/sql/values-statement.txt create mode 100644 highlight-js/test/markup/sql/window-function.expect.txt create mode 100644 highlight-js/test/markup/sql/window-function.txt create mode 100644 highlight-js/test/markup/subunit/subunit-errorline.expect.txt create mode 100644 highlight-js/test/markup/subunit/subunit-errorline.txt create mode 100644 highlight-js/test/markup/subunit/subunit-failureline.expect.txt create mode 100644 highlight-js/test/markup/subunit/subunit-failureline.txt create mode 100644 highlight-js/test/markup/subunit/subunit-progressline.expect.txt create mode 100644 highlight-js/test/markup/subunit/subunit-progressline.txt create mode 100644 highlight-js/test/markup/subunit/subunit-skipline.expect.txt create mode 100644 highlight-js/test/markup/subunit/subunit-skipline.txt create mode 100644 highlight-js/test/markup/subunit/subunit-successline.expect.txt create mode 100644 highlight-js/test/markup/subunit/subunit-successline.txt create mode 100644 highlight-js/test/markup/subunit/subunit-tagline.expect.txt create mode 100644 highlight-js/test/markup/subunit/subunit-tagline.txt create mode 100644 highlight-js/test/markup/subunit/subunit-testline.expect.txt create mode 100644 highlight-js/test/markup/subunit/subunit-testline.txt create mode 100644 highlight-js/test/markup/subunit/subunit-timeline.expect.txt create mode 100644 highlight-js/test/markup/subunit/subunit-timeline.txt create mode 100644 highlight-js/test/markup/subunit/subunit-uxsuccessline.expect.txt create mode 100644 highlight-js/test/markup/subunit/subunit-uxsuccessline.txt create mode 100644 highlight-js/test/markup/subunit/subunit-xfailline.expect.txt create mode 100644 highlight-js/test/markup/subunit/subunit-xfailline.txt create mode 100644 highlight-js/test/markup/swift/functions.expect.txt create mode 100644 highlight-js/test/markup/swift/functions.txt create mode 100644 highlight-js/test/markup/swift/multiline-string.expect.txt create mode 100644 highlight-js/test/markup/swift/multiline-string.txt create mode 100644 highlight-js/test/markup/tap/basic.expect.txt create mode 100644 highlight-js/test/markup/tap/basic.txt create mode 100644 highlight-js/test/markup/tap/without-numbers.expect.txt create mode 100644 highlight-js/test/markup/tap/without-numbers.txt create mode 100644 highlight-js/test/markup/tap/yaml-block.expect.txt create mode 100644 highlight-js/test/markup/tap/yaml-block.txt create mode 100644 highlight-js/test/markup/twig/filter_with_underscore.expect.txt create mode 100644 highlight-js/test/markup/twig/filter_with_underscore.txt create mode 100644 highlight-js/test/markup/twig/template_tags.expect.txt create mode 100644 highlight-js/test/markup/twig/template_tags.txt create mode 100644 highlight-js/test/markup/typescript/class.expect.txt create mode 100644 highlight-js/test/markup/typescript/class.txt create mode 100644 highlight-js/test/markup/typescript/decorator-factories.expect.txt create mode 100644 highlight-js/test/markup/typescript/decorator-factories.txt create mode 100644 highlight-js/test/markup/typescript/functions.expect.txt create mode 100644 highlight-js/test/markup/typescript/functions.txt create mode 100644 highlight-js/test/markup/typescript/jsx.expect.txt create mode 100644 highlight-js/test/markup/typescript/jsx.txt create mode 100644 highlight-js/test/markup/typescript/module-id.expect.txt create mode 100644 highlight-js/test/markup/typescript/module-id.txt create mode 100644 highlight-js/test/markup/verilog/misc.expect.txt create mode 100644 highlight-js/test/markup/verilog/misc.txt create mode 100644 highlight-js/test/markup/verilog/numbers.expect.txt create mode 100644 highlight-js/test/markup/verilog/numbers.txt create mode 100644 highlight-js/test/markup/vim/strings-comments.expect.txt create mode 100644 highlight-js/test/markup/vim/strings-comments.txt create mode 100644 highlight-js/test/markup/x86asm/labels-directives.expect.txt create mode 100644 highlight-js/test/markup/x86asm/labels-directives.txt create mode 100644 highlight-js/test/markup/xml/space-attributes.expect.txt create mode 100644 highlight-js/test/markup/xml/space-attributes.txt create mode 100644 highlight-js/test/markup/xml/unquoted-attributes.expect.txt create mode 100644 highlight-js/test/markup/xml/unquoted-attributes.txt create mode 100644 highlight-js/test/markup/yaml/string.expect.txt create mode 100644 highlight-js/test/markup/yaml/string.txt create mode 100644 highlight-js/test/markup/yaml/tag.expect.txt create mode 100644 highlight-js/test/markup/yaml/tag.txt create mode 100644 highlight-js/test/mocha.opts create mode 100644 highlight-js/test/special/buildClassName.js create mode 100644 highlight-js/test/special/customMarkup.js create mode 100644 highlight-js/test/special/endsWithParentVariants.js create mode 100644 highlight-js/test/special/explicitLanguage.js create mode 100644 highlight-js/test/special/index.js create mode 100644 highlight-js/test/special/languageAlias.js create mode 100644 highlight-js/test/special/noHighlight.js create mode 100644 highlight-js/test/special/subLanguages.js create mode 100644 highlight-js/test/special/useBr.js create mode 100644 highlight-js/test/utility.js create mode 100644 highlight-js/tools/all.js create mode 100644 highlight-js/tools/browser.js create mode 100644 highlight-js/tools/build.js create mode 100644 highlight-js/tools/cdn.js create mode 100644 highlight-js/tools/codeformat.js create mode 100644 highlight-js/tools/developer.html create mode 100644 highlight-js/tools/keywordsformat.js create mode 100644 highlight-js/tools/node.js create mode 100644 highlight-js/tools/tasks.js create mode 100644 highlight-js/tools/utility.js create mode 100644 index.html create mode 100644 reveal-js/.gitignore create mode 100644 reveal-js/.travis.yml create mode 100644 reveal-js/CONTRIBUTING.md create mode 100644 reveal-js/Gruntfile.js create mode 100644 reveal-js/LICENSE create mode 100644 reveal-js/README.md create mode 100644 reveal-js/bower.json create mode 100644 reveal-js/css/print/paper.css create mode 100644 reveal-js/css/print/pdf.css create mode 100644 reveal-js/css/reveal.css create mode 100644 reveal-js/css/reveal.scss create mode 100644 reveal-js/css/theme/README.md create mode 100644 reveal-js/css/theme/beige.css create mode 100644 reveal-js/css/theme/black.css create mode 100644 reveal-js/css/theme/blood.css create mode 100644 reveal-js/css/theme/league.css create mode 100644 reveal-js/css/theme/moon.css create mode 100644 reveal-js/css/theme/night.css create mode 100644 reveal-js/css/theme/serif.css create mode 100644 reveal-js/css/theme/simple.css create mode 100644 reveal-js/css/theme/sky.css create mode 100644 reveal-js/css/theme/solarized.css create mode 100644 reveal-js/css/theme/source/beige.scss create mode 100644 reveal-js/css/theme/source/black.scss create mode 100644 reveal-js/css/theme/source/blood.scss create mode 100644 reveal-js/css/theme/source/league.scss create mode 100644 reveal-js/css/theme/source/moon.scss create mode 100644 reveal-js/css/theme/source/night.scss create mode 100644 reveal-js/css/theme/source/serif.scss create mode 100644 reveal-js/css/theme/source/simple.scss create mode 100644 reveal-js/css/theme/source/sky.scss create mode 100644 reveal-js/css/theme/source/solarized.scss create mode 100644 reveal-js/css/theme/source/white.scss create mode 100644 reveal-js/css/theme/template/mixins.scss create mode 100644 reveal-js/css/theme/template/settings.scss create mode 100644 reveal-js/css/theme/template/theme.scss create mode 100644 reveal-js/css/theme/white.css create mode 100644 reveal-js/demo.html create mode 100644 reveal-js/index.html create mode 100644 reveal-js/js/reveal.js create mode 100644 reveal-js/lib/css/zenburn.css create mode 100644 reveal-js/lib/font/league-gothic/LICENSE create mode 100644 reveal-js/lib/font/league-gothic/league-gothic.css create mode 100755 reveal-js/lib/font/league-gothic/league-gothic.eot create mode 100755 reveal-js/lib/font/league-gothic/league-gothic.ttf create mode 100755 reveal-js/lib/font/league-gothic/league-gothic.woff create mode 100644 reveal-js/lib/font/source-sans-pro/LICENSE create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-italic.eot create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-italic.ttf create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-italic.woff create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-regular.eot create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-regular.ttf create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-regular.woff create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-semibold.eot create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-semibold.ttf create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-semibold.woff create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf create mode 100755 reveal-js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff create mode 100644 reveal-js/lib/font/source-sans-pro/source-sans-pro.css create mode 100644 reveal-js/lib/js/classList.js create mode 100644 reveal-js/lib/js/head.min.js create mode 100644 reveal-js/lib/js/html5shiv.js create mode 100644 reveal-js/package.json create mode 100644 reveal-js/plugin/highlight/highlight.js create mode 100644 reveal-js/plugin/markdown/example.html create mode 100644 reveal-js/plugin/markdown/example.md create mode 100755 reveal-js/plugin/markdown/markdown.js create mode 100644 reveal-js/plugin/markdown/marked.js create mode 100755 reveal-js/plugin/math/math.js create mode 100644 reveal-js/plugin/multiplex/client.js create mode 100644 reveal-js/plugin/multiplex/index.js create mode 100644 reveal-js/plugin/multiplex/master.js create mode 100644 reveal-js/plugin/multiplex/package.json create mode 100644 reveal-js/plugin/notes-server/client.js create mode 100644 reveal-js/plugin/notes-server/index.js create mode 100644 reveal-js/plugin/notes-server/notes.html create mode 100644 reveal-js/plugin/notes/notes.html create mode 100644 reveal-js/plugin/notes/notes.js create mode 100644 reveal-js/plugin/print-pdf/print-pdf.js create mode 100644 reveal-js/plugin/search/search.js create mode 100644 reveal-js/plugin/zoom-js/zoom.js create mode 100644 reveal-js/test/examples/assets/image1.png create mode 100644 reveal-js/test/examples/assets/image2.png create mode 100644 reveal-js/test/examples/barebones.html create mode 100644 reveal-js/test/examples/embedded-media.html create mode 100644 reveal-js/test/examples/math.html create mode 100644 reveal-js/test/examples/slide-backgrounds.html create mode 100644 reveal-js/test/examples/slide-transitions.html create mode 100644 reveal-js/test/qunit-2.5.0.css create mode 100644 reveal-js/test/qunit-2.5.0.js create mode 100644 reveal-js/test/simple.md create mode 100644 reveal-js/test/test-markdown-element-attributes.html create mode 100644 reveal-js/test/test-markdown-element-attributes.js create mode 100644 reveal-js/test/test-markdown-external.html create mode 100644 reveal-js/test/test-markdown-external.js create mode 100644 reveal-js/test/test-markdown-options.html create mode 100644 reveal-js/test/test-markdown-options.js create mode 100644 reveal-js/test/test-markdown-slide-attributes.html create mode 100644 reveal-js/test/test-markdown-slide-attributes.js create mode 100644 reveal-js/test/test-markdown.html create mode 100644 reveal-js/test/test-markdown.js create mode 100644 reveal-js/test/test-pdf.html create mode 100644 reveal-js/test/test-pdf.js create mode 100644 reveal-js/test/test.html create mode 100644 reveal-js/test/test.js create mode 100644 tags/index.html diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 0000000..c8a68f2 --- /dev/null +++ b/categories/index.html @@ -0,0 +1,76 @@ + + + + Categories + + + + + + + + + + + + + +
+
+ + + +
+ + +
+ + + + + + + + + + diff --git a/css/35c3.min.css b/css/35c3.min.css new file mode 100644 index 0000000..ec49b04 --- /dev/null +++ b/css/35c3.min.css @@ -0,0 +1 @@ +@font-face{font-family:"35c3-font-light";src:url("fonts/35c3-light.woff2") format("woff2"),url("fonts/35c3-light.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:"35c3-font-black";src:url("fonts/35c3-black.woff2") format("woff2"),url("fonts/35c3-black.woff") format("woff");font-weight:bold;font-style:normal}*{box-sizing:border-box}.text-white{color:#fff}.bg-white{color:#000;background-color:#fff}.text-black{color:#000}.bg-black{color:#fff;background-color:#000}.text-fresh{color:#0084b0}.bg-fresh{color:#fff;background-color:#0084b0}.text-hope{color:#00a356}.bg-hope{color:#fff;background-color:#00a356}.text-glint{color:#f9b000}.bg-glint{color:#fff;background-color:#f9b000}.text-beat{color:#e40429}.bg-beat{color:#fff;background-color:#e40429}.text-tenacity{color:#44357e}.bg-tenacity{color:#fff;background-color:#44357e}.text-base{color:#18386b}.bg-base{color:#fff;background-color:#18386b}.text-reboot{color:#4d4d4c}.bg-reboot{color:#fff;background-color:#4d4d4c}*{font-family:"35c3-font-light"}h1,h2,h3,h4,h5,h6{font-family:"35c3-font-black"}a{color:#0084b0}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-breakline{white-space:pre-wrap;word-break:break-all}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}label{font-weight:bold}blockquote{padding:10px 20px;margin:0 0 20px;border-left:4px solid transparent;border-image:linear-gradient(to bottom, #00a356, #0084b0) 1 round}code{padding:2px 4px;color:#f9b000;background-color:#4d4d4c}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #4d4d4c}.table tr th,.table tr td{padding:8px;text-align:left;vertical-align:top;font-size:1em}hr{height:8px;border:none;background-image:linear-gradient(to right, #0084b0, #00a356)}.border{border:2px solid transparent;border-image:linear-gradient(to right, #00a356, #0084b0) 1 round}input,textarea,select{width:100%;border-radius:0;box-shadow:none;border:2px solid transparent;border-image:linear-gradient(to right, #00a356, #0084b0) 1 round;background:none;padding:6px 6px;font-size:1em;color:#4d4d4c}input:invalid,input:required,textarea:required{border-image:linear-gradient(to right, #e40429, #44357e) 1 round}input:disabled,textarea:disabled{border-image:linear-gradient(to right, #4d4d4c, #18386b) 1 round}input[type=range]{border:none;background:transparent;margin:0;padding:0;height:32px}input[type=range]:focus{outline:none}input[type=range]::-moz-range-thumb{height:26px;width:26px;border:none;border-radius:50%;background:#009483;cursor:pointer}input[type=range]::-moz-range-thumb:active,input[type=range]::-moz-range-thumb:hover{height:26px;width:26px;border:4px solid #009483;border-radius:50%;cursor:pointer}input[type=range]::-moz-range-track{width:100%;height:8px;cursor:pointer;background-image:linear-gradient(to right, #0084b0, #00a356)}select{-moz-appearance:none;appearance:none}.checkbox{position:relative;display:inline-block;width:26px;height:26px;text-indent:-9999px}.checkbox input{opacity:0;width:0;height:0}.checkbox .toggle{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0}.checkbox .toggle:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;border:2px solid #4d4d4c;transition:.4s}.checkbox .toggle:after{content:"";position:absolute;width:14px;height:6px;left:5px;top:6px;border:3px solid transparent;border-top:none;border-right:none;transform:rotate(-45deg);transition:.4s}.checkbox input:checked+.toggle:after{border-color:#4d4d4c}.checkbox input:checked+.toggle:before{border-color:#0084b0;background-color:#0084b0}.checkbox.checkbox-hope input:checked+.toggle:before{border-color:#00a356;background-color:#00a356}.checkbox.checkbox-beat input:checked+.toggle:before{border-color:#e40429;background-color:#e40429}.checkbox:hover .toggle:after{border-color:#0084b0}.checkbox.checkbox-hope:hover .toggle:after{border-color:#00a356}.checkbox.checkbox-beat:hover .toggle:after{border-color:#e40429}.checkbox:hover input:checked+.toggle:before,.checkbox.checkbox-hope:hover input:checked+.toggle:before,.checkbox.checkbox-beat:hover input:checked+.toggle:before{background-color:transparent}.checkbox:hover input:checked+.toggle:after,.checkbox.checkbox-hope:hover input:checked+.toggle:after,.checkbox.checkbox-beat:hover input:checked+.toggle:after{border-color:transparent}.radio{position:relative;display:inline-block;width:26px;height:26px;text-indent:-9999px}.radio input{opacity:0;width:0;height:0}.radio .toggle{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0}.radio .toggle:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;border:2px solid #4d4d4c;border-radius:100%;transition:.4s}.radio .toggle:after{content:"";position:absolute;width:11px;height:11px;left:7px;top:7px;border:1px solid transparent;border-top:none;border-right:none;border-radius:100%;transition:.4s}.radio input:checked+.toggle:after{background-color:#4d4d4c}.radio input:checked+.toggle:before{border-color:#0084b0}.radio.radio-hope input:checked+.toggle:before{border-color:#00a356}.radio.radio-beat input:checked+.toggle:before{border-color:#e40429}.radio:hover .toggle:after,.radio input:checked+.toggle:after{background-color:#0084b0}.radio.radio-hope:hover .toggle:after,.radio.radio-hope input:checked+.toggle:after{background-color:#00a356}.radio.radio-beat:hover .toggle:after,.radio.radio-beat input:checked+.toggle:after{background-color:#e40429}.switch{position:relative;display:inline-block;width:48px;height:26px;text-indent:-9999px}.switch input{opacity:0;width:0;height:0}.switch .toggle{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0}.switch .toggle:before{position:absolute;top:3px;left:0;right:0;bottom:3px;content:"";background-color:#4d4d4c;border-radius:26px;transition:.4s}.switch .toggle:after{position:absolute;content:"";height:26px;width:26px;left:0;bottom:0;background-color:#0084b0;transition:.2s;border-radius:50%;transition:.4s}.switch.switch-hope .toggle:after{background-color:#00a356}.switch.switch-beat .toggle:after{background-color:#e40429}.switch input:checked+.toggle:after{transform:translateX(23px);background-color:#4d4d4c}.switch input:checked+.toggle:before{background-color:#0084b0}.switch.switch-hope input:checked+.toggle:before{background-color:#00a356}.switch.switch-beat input:checked+.toggle:before{background-color:#e40429}button{font-size:1em}.btn{display:inline-block;text-align:center;padding:8px;cursor:pointer;white-space:nowrap;vertical-align:middle;border:none;color:#4d4d4c;background-color:transparent}.btn:hover{opacity:.8}.btn:active{opacity:.9}.btn-white{background-color:#fff}.btn-black{background-color:#000}.btn-fresh{color:#fff;background-color:#0084b0}.btn-hope{color:#fff;background-color:#00a356}.btn-glint{color:#fff;background-color:#f9b000}.btn-beat{color:#fff;background-color:#e40429}.btn-tenacity{color:#fff;background-color:#44357e}.btn-base{color:#fff;background-color:#18386b}.btn-reboot{color:#fff;background-color:#4d4d4c}.btn.btn-block{width:100%}.btn-xs{font-size:.7em;padding:4px}.btn-sm{font-size:.9em;padding:6px}.btn-xl{font-size:1.2em;padding:10px}.btn-round{width:2.33em;height:2.33em;border-radius:50%;overflow:hidden;display:inline-flex;justify-content:center;align-items:center;flex-direction:row}.img-auto{display:block;max-width:100%;height:auto}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media screen and (min-width: 768px){.container{width:744.96px}}@media screen and (min-width: 992px){.container{width:962.24px}}@media screen and (min-width: 1200px){.container{width:1164px}}@media screen and (min-width: 1800px){.container{width:1746px}}.row{display:grid;grid-template-columns:repeat(12, 1fr);grid-row-gap:8px;grid-column-gap:8px}.col-1{grid-column-end:span 1}.col-offset-1{grid-column-start:2}.col-2{grid-column-end:span 2}.col-offset-2{grid-column-start:3}.col-3{grid-column-end:span 3}.col-offset-3{grid-column-start:4}.col-4{grid-column-end:span 4}.col-offset-4{grid-column-start:5}.col-5{grid-column-end:span 5}.col-offset-5{grid-column-start:6}.col-6{grid-column-end:span 6}.col-offset-6{grid-column-start:7}.col-7{grid-column-end:span 7}.col-offset-7{grid-column-start:8}.col-8{grid-column-end:span 8}.col-offset-8{grid-column-start:9}.col-9{grid-column-end:span 9}.col-offset-9{grid-column-start:10}.col-10{grid-column-end:span 10}.col-offset-10{grid-column-start:11}.col-11{grid-column-end:span 11}.col-offset-11{grid-column-start:12}.col-12{grid-column-end:span 12}.col-offset-12{grid-column-start:13}@media screen and (max-width: 767px){.col-xs-1{grid-column-end:span 1}.col-xs-offset-1{grid-column-start:2}.col-xs-2{grid-column-end:span 2}.col-xs-offset-2{grid-column-start:3}.col-xs-3{grid-column-end:span 3}.col-xs-offset-3{grid-column-start:4}.col-xs-4{grid-column-end:span 4}.col-xs-offset-4{grid-column-start:5}.col-xs-5{grid-column-end:span 5}.col-xs-offset-5{grid-column-start:6}.col-xs-6{grid-column-end:span 6}.col-xs-offset-6{grid-column-start:7}.col-xs-7{grid-column-end:span 7}.col-xs-offset-7{grid-column-start:8}.col-xs-8{grid-column-end:span 8}.col-xs-offset-8{grid-column-start:9}.col-xs-9{grid-column-end:span 9}.col-xs-offset-9{grid-column-start:10}.col-xs-10{grid-column-end:span 10}.col-xs-offset-10{grid-column-start:11}.col-xs-11{grid-column-end:span 11}.col-xs-offset-11{grid-column-start:12}.col-xs-12{grid-column-end:span 12}.col-xs-offset-12{grid-column-start:13}}@media screen and (min-width: 768px){.col-sm-1{grid-column-end:span 1}.col-sm-offset-1{grid-column-start:2}.col-sm-2{grid-column-end:span 2}.col-sm-offset-2{grid-column-start:3}.col-sm-3{grid-column-end:span 3}.col-sm-offset-3{grid-column-start:4}.col-sm-4{grid-column-end:span 4}.col-sm-offset-4{grid-column-start:5}.col-sm-5{grid-column-end:span 5}.col-sm-offset-5{grid-column-start:6}.col-sm-6{grid-column-end:span 6}.col-sm-offset-6{grid-column-start:7}.col-sm-7{grid-column-end:span 7}.col-sm-offset-7{grid-column-start:8}.col-sm-8{grid-column-end:span 8}.col-sm-offset-8{grid-column-start:9}.col-sm-9{grid-column-end:span 9}.col-sm-offset-9{grid-column-start:10}.col-sm-10{grid-column-end:span 10}.col-sm-offset-10{grid-column-start:11}.col-sm-11{grid-column-end:span 11}.col-sm-offset-11{grid-column-start:12}.col-sm-12{grid-column-end:span 12}.col-sm-offset-12{grid-column-start:13}}@media screen and (min-width: 992px){.col-md-1{grid-column-end:span 1}.col-md-offset-1{grid-column-start:2}.col-md-2{grid-column-end:span 2}.col-md-offset-2{grid-column-start:3}.col-md-3{grid-column-end:span 3}.col-md-offset-3{grid-column-start:4}.col-md-4{grid-column-end:span 4}.col-md-offset-4{grid-column-start:5}.col-md-5{grid-column-end:span 5}.col-md-offset-5{grid-column-start:6}.col-md-6{grid-column-end:span 6}.col-md-offset-6{grid-column-start:7}.col-md-7{grid-column-end:span 7}.col-md-offset-7{grid-column-start:8}.col-md-8{grid-column-end:span 8}.col-md-offset-8{grid-column-start:9}.col-md-9{grid-column-end:span 9}.col-md-offset-9{grid-column-start:10}.col-md-10{grid-column-end:span 10}.col-md-offset-10{grid-column-start:11}.col-md-11{grid-column-end:span 11}.col-md-offset-11{grid-column-start:12}.col-md-12{grid-column-end:span 12}.col-md-offset-12{grid-column-start:13}}@media screen and (min-width: 1200px){.col-lg-1{grid-column-end:span 1}.col-lg-offset-1{grid-column-start:2}.col-lg-2{grid-column-end:span 2}.col-lg-offset-2{grid-column-start:3}.col-lg-3{grid-column-end:span 3}.col-lg-offset-3{grid-column-start:4}.col-lg-4{grid-column-end:span 4}.col-lg-offset-4{grid-column-start:5}.col-lg-5{grid-column-end:span 5}.col-lg-offset-5{grid-column-start:6}.col-lg-6{grid-column-end:span 6}.col-lg-offset-6{grid-column-start:7}.col-lg-7{grid-column-end:span 7}.col-lg-offset-7{grid-column-start:8}.col-lg-8{grid-column-end:span 8}.col-lg-offset-8{grid-column-start:9}.col-lg-9{grid-column-end:span 9}.col-lg-offset-9{grid-column-start:10}.col-lg-10{grid-column-end:span 10}.col-lg-offset-10{grid-column-start:11}.col-lg-11{grid-column-end:span 11}.col-lg-offset-11{grid-column-start:12}.col-lg-12{grid-column-end:span 12}.col-lg-offset-12{grid-column-start:13}}@media screen and (min-width: 1800px){.col-xl-1{grid-column-end:span 1}.col-xl-offset-1{grid-column-start:2}.col-xl-2{grid-column-end:span 2}.col-xl-offset-2{grid-column-start:3}.col-xl-3{grid-column-end:span 3}.col-xl-offset-3{grid-column-start:4}.col-xl-4{grid-column-end:span 4}.col-xl-offset-4{grid-column-start:5}.col-xl-5{grid-column-end:span 5}.col-xl-offset-5{grid-column-start:6}.col-xl-6{grid-column-end:span 6}.col-xl-offset-6{grid-column-start:7}.col-xl-7{grid-column-end:span 7}.col-xl-offset-7{grid-column-start:8}.col-xl-8{grid-column-end:span 8}.col-xl-offset-8{grid-column-start:9}.col-xl-9{grid-column-end:span 9}.col-xl-offset-9{grid-column-start:10}.col-xl-10{grid-column-end:span 10}.col-xl-offset-10{grid-column-start:11}.col-xl-11{grid-column-end:span 11}.col-xl-offset-11{grid-column-start:12}.col-xl-12{grid-column-end:span 12}.col-xl-offset-12{grid-column-start:13}}.hidden{display:none}.visible,.visible-block{display:block}.visible-inline{display:inline}.visible-inline-block{display:inline-block}.visible-print,.visible-print-block,.visible-print-inline,.visible-print-inline-block{display:none}@media print{.hidden-print{display:none}.visible-print,.visible-print-block{display:block}.visible-print-inline{display:inline}.visible-print-inline-block{display:inline-block}}@media screen and (max-width: 767px){.hidden-xs{display:none}.visible-xs,.visible-xs-block{display:block}.visible-xs-inline{display:inline}.visible-xs-inline-block{display:inline-block}}@media screen and (min-width: 768px)and (max-width: 991px){.hidden-sm{display:none}.visible-sm,.visible-sm-block{display:block}.visible-sm-inline{display:inline}.visible-sm-inline-block{display:inline-block}}@media screen and (min-width: 992px)and (max-width: 1199px){.hidden-md{display:none}.visible-md,.visible-md-block{display:block}.visible-md-inline{display:inline}.visible-md-inline-block{display:inline-block}}@media screen and (min-width: 1200px)and (max-width: 1799px){.hidden-lg{display:none}.visible-lg,.visible-lg-block{display:block}.visible-lg-inline{display:inline}.visible-lg-inline-block{display:inline-block}}@media screen and (min-width: 1800px){.hidden-xl{display:none}.visible-xl,.visible-xl-block{display:block}.visible-xl-inline{display:inline}.visible-xl-inline-block{display:inline-block}}/*# sourceMappingURL=35c3.min.css.map */ diff --git a/css/fonts/35c3-black.woff b/css/fonts/35c3-black.woff new file mode 100644 index 0000000000000000000000000000000000000000..05da8f26a87fba344a8332378adff339ca0d9b8f GIT binary patch literal 31516 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

)gCFvpBQXJajwN7#M&D`u8 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 S0002k8E6Rr0bBF8i2wjkoSc~e literal 0 HcmV?d00001 diff --git a/css/fonts/35c3-black.woff2 b/css/fonts/35c3-black.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..23bf0a3fd70c191aca4008351611ce1c833e41ed GIT binary patch literal 24504 zcmV(*K;FN1Pew8T0RR910AIKO6951J0UeA00AEP}2QxDO00000000000000000000 z0000#Mn+Uk92#gFf%bkJh9m}H0E1!(LJ5Rr5eN!`jTC|DRsl8wBm;*i3xiew1Rw>D zbO(i741z{KcV%K`23x5JaX?|W3!pne*VwA+{+tEl*o2%2OEk%YP}U&p?by#hAs?OyfDtY$y|#j*-1$$liRz$ zm$^%@It;@q7zvApDSvg~n=_iI=#30^+YBabw!+0FN}URd-1xuFnMtOf9c3n$c|uXb zymYg$+m=v{?I?|`J$f|M*MI)q{C@3|6C;5@2%!nmv`~dYTT<04t=~H{R~RwI#X9Qt z^`ry*y#9%)JDsCvCMKp97`^S-u(8=J^z?B|=E<2$b=9iolH)k;zS}jf!nw#lIQNew z4RMpEgb(QB;1GqA6ZX!U5j?H&I&b0r1rQ_&MZ_+aK*a$&!s@E(*0B;*wA<85q{s54c(oUflvW2fbz&w#`a6sv@Ig1tPdB!7QwYW z{@7?t+`#v4+xS{O=w`33TMFq$dk31M4e;+DFu-|ucfF6PM;3TnQW#6Mz?0kksOy*f zkG{0S20puN<`F)kmg!pbY#Pv6Od=Jem)`lXf$z6QR@WF5a`pMur{`6!Up?<+^!Vt} zDNuY0lmh(%rGP1@!1w*G{nbCz+FkB~#h|nd6|hH8 z2rvBizu#}3$-HlZ$^lQe5n>z`trE)qKQ+@25$1>;kdC zg6HerFYY>%^b&rst^pgfS3R-oRM+zT0ch~iT1dT7e8p1Y1zM7wf1TPY*-?R5M>s5i zBM-|hlm3_D`0GbWWG6XGiZ8WYQs`Mu$;pAKeYWHFIYs+`(F&0B+Rzc>%CrG)`%QcQ zPgSe^9{}kAH^yqOXtugq@p5-vWBdU?0RxgIW1i@rbD4}QdO0Lv|#EB99z+7vtE&VC02Z{(rAFVfmUR z!rm10G@so;cu;|#>ZLB*|GcYr1#0b1By8VsX3TC1t7bO`Kh16ro9Lb4*`0(>m3&jW zaEd%Ar5&G7j1TW^gOyuNI8_QXtf7&P4~ z=CetCWWB!^>9N7FpR6eA!w3IRx}ROy8UXO|sK@?M7|`5)Z!KbKUJ2I~0Q=<2NIRpP z0ZYsV#9|~GgRvo3IoHv48z)+?Q{*^>tH&2(05Ty!xmnTL1!RUKT?&{pyZS|__CBFu z{EDdXXSDVjPT&m>*a(@*-1Z#yv4#ufYd7%oL05*D>xl9 z@2J&z>fVAVHMs)TZne03AiW);U4um8s!-YRfGqhoZA*hEqZV{ngZ|cr?xSObpqMn4M^Lq1u<=yFGx(lZfPs#dnB~n2?OHoCt#{CwdwzmUs>1 z*{SUXGoflY6s~3oc}cdECh7K6_ZDOkHiC>|#?{*fv#p%%Z^<6^k}JHqgAsIyoMV_C zmh&OYN3uR<_=M$CS)Va{F6Rq|uPTSbuZze6G&|bKF81{uHvB{!^!vl6b@u>jMKy+a zUCEG8#+IClkvfU2JGLuXhBT%wW8C>8#xajA>-HIUC$d zjYhzAVj>=>V>pSInF0-Q<7}gy<$BKzVS`*~eVENCHuDyCEkUUg*px^NI)6Cj$WWT& zsZq;Z-5u8vcp(iP;~rjvYT;8*iR**4yTd!L0cvG;nLoXf1+x?f%Hwb!WS&XL+YW-x zf>#6CnH+var*fQPsUZtwR0nl82h&S=hv`jh$xnsCfd5mTx$F2%4 zy%I_m&2EQ}POEEBl9l%)|7r1}G114V4_q6%@;_Vh_F7qW?zaY*E@iu-AOu-pyHc55 zlL(sJ_u?%G7@wu`-%gs>PjILafi0|~S3YadZG~H8>xJ#R^LU$UR z3uRv)zzsgYZSjjQ;%sCpmfKI_P7E$s3%C=zFH2g5_5G^(WpR81v4`1Fvr%qu0>);* zrEc%9u}cbo*0SqoC;D`?nXc?1LBX@jQ=!K}em=$!&>0%ILqH;Rsi(-q(O0kYE1}P` zZziiF${EqzW^J#v z^X=NMwN!o0y@v72r(Q>8W`riG79FjLL9tyHC}Pq?9YJcTrU8Yz<`(Fn3y~-cfh+>W zl$++GzposNK;zyK1s!zJkEL+pA=r2qwG&>PT4@@h)`olJzm* z)bI`sGH$(X0e;nZ=-aQNvh=uY$O7f+ag#^W5i92eG76;v9MmtYa}88g`jFpyj&seT zpCBV|7+@n-Y7k?k#%!Q9bSGO&nB>A9zP1UC+a>)+XCenBz6!nGI;bPLC{JkbZuuSd19RL>LB44-H^V^#tif>&IEmIEWx<#OPueli(P8&9doyd2o((h)0I?}4$6WxG_mjcv>bL;XnEIg+Rxu;^xR!S5G zf3%vH0mGl~lVs^wqcW>pYg{-O94_}l8ZJ13_e9?lv)?pwL5d;6Di5JO!v9z@t%N0_ zPDL$fHdI$))fLr^URhu5*z3;anssLBJXSk}W5{b|YswJcCp3{OrKPJN)mJh_h=EpM z^SDs)rwSVmP2KJqgCs~JAOQ-%KqTMjQv&qR)ISkW^7J2VjTx*h~6^>x341n(Q*?JeKDXw&rL-{UD zJ1GL#QwktU25m#Tf0;&ULXHHT8D) z=u{tbv}ZbckGqoGA=-XDjiS z72RPHlo)J$e%1#mX8VWOTR`S(?o+n}@(7WY{*+tOKENg*dP=JNYeaUP?=Rrv) z#PK(PgtILZl{)0COVNtUV+)d7MczBgH>EZWsWmQwh+}=cLwmKF7l=LDOv^=YJO*g! z0*$&J^{k*iLLdji7LrysKGM#M%=$Y=X(LcQkRww+O$f?7uh3?QL_p}w{BZ8<|FuWj zQ|ES7Qdm@L@kO;IYdTHmLDjTamQAA9a|f>qATX0;&JrFi8*G7zmYlEjol-J((Vj2E z#EaC9$xKmZ)S63vs2}Yk%V>VnfC89A)HTLLTSlbY`&9SheKa6^>olrB7LE**o zc?dwAJHy{Nv0p{4-!El*yz&UP#E@KC$wq8UuRe!%hLyWZoD#45@x0{2B#J!_)(2EK z*&yfdZ;z&h%xTiG0CiWi?3Ie;aN2`)uk4`C7PHNI)_xDAtx`jIiHWUuD^>e0gaBrX zhwnZxaAXd6Z5Qt{v?+Ni^%c{lMCWZ9iy1|SXup#AFk#C|3||#MZ*`>IA6Q;cY5)j5 zd0epo3@HYg8W6}5IP50p|1D2g2p4zLc61hiT8j|43Fxi_?I?iVZj0c+aI2Y%&`NF2 zN(ZZAs5wL}E|9cXaS$PNoE9 zdnU}=(z1hBCENSd(?Xk>^aP1ipweno^NtLW(@4y4#g8RuM;a(eVrC`+<-MvwQ<<8% zK^5?6jFh(6DF+}DxMjX7WL(j1(Xyr2%|>b>Bh?9$-v#JnP3t_bS!|cp*OQ@SVy+SJU5A_zoVhV+~8? zejHf9J^4gQ7hB6jxpJvAH+0R6Q~$(+6TN7ck*3+0jB>txa2){xN_tb+Ewtw5VI5@* z!?<`jbL~oC=GX@q(ns%kcrh9?iyUC6?O}n|ERhHs1UK3P3?W#6_DaZS9#Axl#SNoQ z2mo}hqkhj&UzIr%oh^+I9$SY|k`w9W>vsTYplBym85LSbU7nTbmE}6 ze7fzwVgmORODnutA_3;+2tL190!3ypr99O5e z=ZVoan|QV9BfHSzIFMDxi7PoHKcWPo!~eYTYXYf79uV5>Cj_b@IXsZGigHlPPBA&N z!L(C7eVFPrB*kPJ2|-gBnuE(J$$1YeS`?^?gsnAnZR?1?GQpklE5WJG zz@6zFs&mi6aNefsd>1oZx@ow~m26jq>*`O%EV*0Kqn?=eX9(^&T~>1lQtg-4YXPhV zOyAeLGNd$)pKdpy&gMEfX4{9YY&FU?y4%V~g{*RgZxSbP;bXpsjCfU4il_mhS`tIVZ-*tK|lY0 zi>nVx(Pe)^WpgDpwZqzMJ0vJ`U^#}`MQQU7PGnK{oPIPBeAyrl(TOmR-;a^%7?}bA zu3U}u@Rjb>47st2FOp_M@m$zQ>3S1`Wau0MhO3=V@(rZ`p1cwe>X#L7rT5^od)AI` zGt+)e3;<%zP2d%w&sUqCG_jJQXy+*zGFWo`s90!XxJeo^3o=2im$e3Jn=BRBJ?Z4W z;sAQVa{ovHYZHadw_@rpX%Wg66rljm#Wlr#10_<}tG?2^n_o?%nMOkhi3B7bWgOVR2BA$j zDeOoT5vgb{KYYdUwEkJ1&6MEk;gnK-d}h7_NW8RaKAuRhq%C- zytqgHjpwM^S#?Rzm{Tq5g8N|Gv*sWk;RAo^5JVrJ<0(&ZUH<7!@NG;E#2dY+# z1G}|Z`2nzPIDk}j839y+g_g)3M_M9fLvj%Cm_qld(A3U1_cpZvvUw;aPG*5=64cb| zgi1(mllDTas%m8D+4G2+Jd_D+koIEJ9|6&fN8D`F_)J0$0fHdM=D_soKD%af3d!Cz zEt*O9S(}(9b&@n<;LT}U9%LGE$x|AguGd+=-`DT%hwn@0?5im0ATxL9N)`K|^z9y! zK2fbV8omip>&iz&Z`u#Hq@tu~tWVeP$MJ`+Lv5XtzPb{-uEMUXY7NbzuCi3qt^=%+ zxO?IFc&hH~2!zg}E*HiCSu~zoSrBU(EyY$dRiI=m4FI_|SaHgNDBZP@hHw!_+;*9kMg+yNix|#T^&>sES2h0QQ1`hH? z&n3~+-fWO1RV8jD1!4rFG{Y8+b5WSWvkd|nb+p-Bfl+86PXl>NZlOCiTVrjnt5nmH zrg|Bvu9%wORI0F=7fm!uQ~`=2VkuQ%lBBZ3q}Q^QR*NI6j9ZIwmvQR|$NJ5HjmmVJ zN5~fH)ti(J2c~g{i9&;B#il`}R<8?=b+U-V#MH#6zmi<*X0lt{A?_Zpj2csO8IH2U^L~K;8!9&b07llx@0bt@sbU7p;7SP1j|eC$~gM9-Ypq^^M@UcQ6>C0 zci{FA92jAkQb;t^x3HvPO)>3;6EYIls$0ju(B4RzqKZTh1>Ut< ztrdd0|Gy4IQUI$?V|ooHLUpuX1GAg9F)+W0cNl8fW6&n~5;IjPkopj%xDINQ$25pe zFjt^tJ`pUXLFU5BXrjX}4zKlUfK6T*FDmfzWanIGQ@AR_bf~PNkKJCVt7#r;X|ROq z!M*QN%h%y0j49Ibyaeo&24zHr*TKF9D9k~1CvI=l9H~H2A2{wAp;BirWaRoJcul6x z#e#ytx;317df@mNjxVK2plq<82@J*hMQDZDiVN!vX803 zZkN*!$>gLV{e|sH`hl68E~Fn$KN&=16jTB>V>5DOdo~t_Z*Cp3Xbm5vndQ^;aav|= z7Wz<)Zap&0B3i?uMvE1*ZXgR+$7ym_QQxV9G^lg!&eQMVaxxK_fc&x-dTYdrbp(B*xNUid%a16>^o6D_)b=$oQI<>UsHyiC6v zqX`BJPQJKkg;nRhIK@JAr1QGPzFSmcXQS7<=Gy}j?FH$nqCmve7Y7CkARV*yuxucY zcq^1MItokfS9gpwj2&|(Z8{7GFNLVT>a?8%wbE`e-pB|F9=uj$+bYF)1$A6tI2j>O zAUuWb;Q>PjxmOx*Yu-o>w$)$@AZ>b^zh6pBStvbGrrA9qJHd7=d*rXBGOIK*s~{Ms z0G|CC%-dm^Kr25~r=5C}SPYLBsHoJhyu}8QiPYY2Il(BnNxkVwof zc){582L|+e1Tji3Jm$G$oIbJ>s30`=x?3S@AWhL^Thy9y1l%{mIX;l(AQ)X_0W<-} zdJ;6XEIVQrchS*nAAVrqG<1NZ;rfzw+1eABF*?A9ShJ@UJE_<^2p;1Z#bi+)M&@&B zm#3xV1eMvKiHyUr`*gD7GW*Rr>-@4ZddI3Fr@Pa+O6=~3Hyqp^O?W6TP>Jzd^OY*P zn6c<`>N|3JDrPl!k#|=b32iwhO(`L#WO?cgk&Tq49&`Bpk}%#O*d~uAIQTcLGb)!0 z>0v|T*5sBv{5KVEP(i2=l$6SmF>Mc(o&^AbwOhZH*}0C8<_Bn)i@MYWmQ{%3jICOB zQe`hbZvAq02&|A4rnsYzTOtFjqB0fA4ffqJr0L? zM!MCgo*R|`fWITlwlJCo@UG>x77op2(IfxtHv_sJ-(uq0&4-M;2%RK1QUK$ur*x;; zr}RMV(&ZMLBjGNptM5b|&KAT+Nh$6vvU&knTiD0~Jl~elO`3unn~_GFkZqPlgDr&l z%>BB?9b)eBklGBHY0970oE0av{3!)2-;4uWlw2ulft}L%h5)AZW|(s6aKZ@fZU}`M z?H3G(NL4nLoM@pqJ8 zV-cy)YaGR!b~0D*YKVdMv-X%x#Z?M8aEQqcFAgp@6&D-E1~ruj4DGHlNCOZle~EO` zQ4FV0%5noorgn4VQU{ywJZ{ZPSQ>Zd>9qmB4VIRJDR2oGkjWG-yE<_Mn>e;{EOv#U zj-B3U9qgn7oUBGoI*>^RFOhYsSD5t}aH>1xUKp6qBeXiA4+>R|m6b<075L zW41w&4kE(AA+3UibStrL4c0|=+8$TaYoZ_=TotTGkPvZ#gotAk|2rE2SUiUVUh)<} zH9Xa@NN@NO1=3-EG+E!Rvn8s)XtS?_ILTTJ)8>QP5v0i0io7sPvUwARRgCC1651x_G>l-|$kJsaH%Z4je z?TE8>S7hB&n7S*P?*36vNW0lMUT=KcQ8aWMG<2O|c23^Dcu#=F9MOCB?MeWI;lvZT z{hkPL68CPo+Ha9^EdP&wVByCPM4BgM_dddpCaFNIZ6q9RP!2ARwjS=ji%I7&>4b62 zFQx_T04?5_Kw z#59BLm;`!L$RRgs0s8H`h=q9J@)JUvziy09aG3oafCy}HRSTP9h%T=g!t74Dr)26) zT5pH&c+bAI+*>*YBhmecS@1);s}nMX2|;^&_^1-DzV>X=TD<%%981J&soVx!{Cx@R z7nO7b{%7xO4;!(o?E6jLWaB;J3BiAuRQbOG%3o<=Cg?E$Y)%^g?}G3fekn;b;7>O5 z&;m)^6M#Gqrvrixw=A}bz3E!|WTu?aSkLv+UaeQ}6}?_>OQTzBOzQsopS1k{=Ym0= zD`WA=Ed$<2ugXjI?jhsXOVqx%tv1&(T7CN8FE^jgJ)LkS;l|-mg0{ZlA`q7;7^5mrxztVD^}{&L=8NTOz1i*}Fg5|3nweWzT3OpbY@v2A zdk04+xU-9^8^Ybg)5{x)LSuY<{jmN4fkD9`pEEYTINq%oe%8R|pA=SPBvH`Yz zJq3Js^2ahJ7XT2(7k_zn&21a~`W+_^2@l%(^L7XAdyi4&gNmm5{VlD{oqV9<)!~D{ z^?Mot&`=HqH;~gr0nL&J5h#)G+0F0zEs zmI-7m!rZb0lsUqzFoDgbN$;sFW}O~nLUziEsF53nXGqc5NOFk62MYzuddYZLGa1Lm ztIg!abH*Zu*MK$nB4e2O1kiD)5byFgEg>v=tK|VmP#!?QCUju|Q*Ou%z2&USq*{9| z0n+PCY1~(_$rzbcgO7ve*6=F32v-5ge1v#-k7feiT+Mus7-9l0r6`0b=TG37?&>i% zGCZ6rvrZ$^T96G46LPf18}vXJ7{vubS~iIUI*XA!LO^EJS`q|=-pVjRt;0j@wl(WS z1Qv$JfWx$lkzx=;NQ~iwv$F-HAFw#b!hg$80MM^M_aV9vNWB~29*^PE|AnsE>5Yg; z_@8eM+Snr#P{HG~HUY&#mWY8TiOIs}NE^5!#8`C5d7FU8!l#9ky!8bfIMd6S5#L6U zO-h>y!AUr17qCK1;Q!YLh>}Pl&~$+y?mV_igUoX4EBpx**H*#3^&E0TYliu%Y*vZ` zxuTS1fGzYd{uaBZrfcnJJS5c-oq5cBvsm&c5rmvKspZ10Pc|;uSICuP+h?{Xhd;*w zspE~#IM1NXw9*9pWvNc%7=t9#OAM(5pXTUu?1eT2p$IQxS!K`v{t!mYQs`IYFKavj zC)HfS(Pj`Svujo())BQ$^UU6g@&#EitJ8`U;k-={AdHyhNxcq=ciC%#0m2Go_(0~K zJNB~-&IluBn-m3dCJs31*dR4%*@*e7dxj|4498v>M^@Y}Oc*OKj(4l0H}xUUsamh7 zXl+TOpo&KFHeL0mI>k;8;{y8w4JD`ZN~D3@^_m##i#fK7)e@3LpB4jvg8r%-g@_80 zgOjbTWWK(#x#+q28g$7POz~ob(0U^_BZ0?}6W5|tnvUY&;#Fjwhcmk&+7O4`_Hbul z)RO?8D81g_Ur7abQ4lj4HjZhSaPH&F5%qbNry1K}wz-WgrQGf*CV-#at6jSt2>a46*ot@OW zbYAyxA>PqdbFWTLEzB%4a}m$3B0G1N`gASckDp2(L_ddV1;RF0B`Z7A3v`7dp0c3^ z9wi~Jca|Lv4oVpQ#2Zk^vH5S!7CPid!b!476QtAfwj~GLVZ~NkQhA^m&G)7}Ij;y8 zkGeOTmy8S}DkuAMKK%C8kn#p#Wtc;bx4)S$iFa_dgoi)j3 z2mAP7RFtHlK0(4}mE~qQcDAA-U0XQpnzXBzyq|{*l)-^6NRJh-fp174=(@n1z#v;< zfO#`oEzZ+4@DUK9m-)6Va&)0P5d{{#3v-?o?iKM*d^~2zfCy+J6H9Y^R#M}f1+P>Q zV{ASvH*}&l7bCw9QQ-Q#gzE`Z8SqRFYDI9rE;cBqD?8_b@*F^*F~>e)Js2LzeQU_R zuV)^v(b9?mL4(S|d0Y7n;&3rXp+!VIlfpW4iFfw6qCG!8)$TUwt5-~#^YSdoY#et} z+UoWqR98uto@mM76t139w3bw;v(xHH?sVgs$K@x18q4~UblR;IgV|RNWTFpg1mUsw z=(wUF-PkZ4VmqFv!l>ULlX$XmSa$z*j$X%vn(fylfl@2{zU8;0;Yk@t7|1(idJj

&j42h-!A2OUQ=M@^(nU-?>?1Y*9uX0cYL)|!u= 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 literal 0 HcmV?d00001 diff --git a/css/fonts/35c3-light.woff2 b/css/fonts/35c3-light.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5ab01ce52fffc93270c5e044b93ae24ce04f7b4b GIT binary patch literal 26640 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 literal 0 HcmV?d00001 diff --git a/css/main.css b/css/main.css new file mode 100644 index 0000000..2bc127b --- /dev/null +++ b/css/main.css @@ -0,0 +1,11 @@ +@import "reveal.css"; + +.reveal .slides { + text-align: left; +} +body { + background-image: url(https://ccchb.de/logo/CCCHB-logo_256x256_bw.png); + background-position: left 20px top 10px; + background-repeat: no-repeat; + background-size: 8% auto; +} diff --git a/css/reveal.css b/css/reveal.css new file mode 100644 index 0000000..e225c83 --- /dev/null +++ b/css/reveal.css @@ -0,0 +1,293 @@ +@import "35c3.min.css"; + +body { + color:#fff; + background-color:#000; + font-size: 32px; + font-weight: normal; + padding: 5px; +} + +.reveal { + padding: 5px; + border: 8px solid; + border-image: linear-gradient(to right, #00a356, #0084b0) 1; +} + +.reveal .controls { + color: #00a356; + right: 50px; + bottom: 50px; +} + +::selection { + color: #fff; + background: #ffc0d5; + text-shadow: none; +} + +::-moz-selection { + color: #fff; + background: #ffc0d5; + text-shadow: none; +} + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; +} + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + font-weight: 700; + line-height: 1.2; + letter-spacing: normal; + text-transform: uppercase; + text-shadow: none; + word-wrap: break-word; +} + +.reveal h1 { + font-size: 2.6em; +} + +.reveal h2 { + font-size: 2.2em; +} + +.reveal h3 { + font-size: 1.7em; +} + +.reveal h4 { + font-size: 1.4em; +} + +.reveal h1 { + text-shadow: none; +} + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; +} + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; +} + +.reveal strong, +.reveal b { + font-weight: bold; +} + +.reveal em { + font-style: italic; +} + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; +} + +.reveal ol { + list-style-type: decimal; +} + +.reveal ul { + list-style-type: disc; +} + +.reveal ul ul { + list-style-type: square; +} + +.reveal ul ul ul { + list-style-type: circle; +} + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; +} + +.reveal dt { + font-weight: bold; +} + +.reveal dd { + margin-left: 40px; +} + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); +} + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; +} + +.reveal q { + font-style: italic; +} + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); + border: 2px solid transparent; + border-image: linear-gradient(to right, #00a356, #0084b0) 1 round; +} + +.reveal code { + font-family: monospace; + text-transform: none; +} + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; +} + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; +} + +.reveal table th { + font-weight: bold; +} + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; +} + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; +} + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; +} + +.reveal table tbody tr:last-child th, +.reveal table tbody tr:last-child td { + border-bottom: none; +} + +.reveal sup { + vertical-align: super; +} + +.reveal sub { + vertical-align: sub; +} + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; +} + +.reveal small * { + vertical-align: top; +} + +/********************************************* + * LINKS + *********************************************/ +.reveal .roll span:after { + color: #fff; + background: #f30053; +} + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #363636; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); +} + +.reveal section img.plain { + border: 0; + box-shadow: none; +} + +.reveal a img { + -webkit-transition: all .15s linear; + -moz-transition: all .15s linear; + transition: all .15s linear; +} + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #00a356; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); +} + +/********************************************* + * PROGRESS BAR + *********************************************/ + +.reveal .progress span { + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); +} + +.reveal .progress { + margin: 2px; + z-index: 1000; + background: rgba(0, 0, 0, 0.2); + color: #00a356; +} diff --git a/decentral_messaging/img/central.svg b/decentral_messaging/img/central.svg new file mode 100644 index 0000000..4dc6bb8 --- /dev/null +++ b/decentral_messaging/img/central.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/decentral_messaging/img/federation.svg b/decentral_messaging/img/federation.svg new file mode 100644 index 0000000..cfdb128 --- /dev/null +++ b/decentral_messaging/img/federation.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decentral_messaging/img/j2me-bombus.jpg b/decentral_messaging/img/j2me-bombus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..637bda49093d02adaf56024ef2cc259d68608e6c GIT binary patch literal 124656 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�VqOREcQaDo-X^+CZg|2(qXXE#u-k#bZH~YXF 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 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decentral_messaging/index.html b/decentral_messaging/index.html new file mode 100644 index 0000000..12c657a --- /dev/null +++ b/decentral_messaging/index.html @@ -0,0 +1,562 @@ + + + + Dezentrale Messenger + + + + + + + + + + + + + +

+
+ +
+ +

Dezentrale Messenger

+
+

The very last word in instant messaging

+(Motto vom XMPP-Client Converations)

+ +

genofire - Chaos Computer Club Bremen e.V.

+ +
+ +

Agenda

+ +
    +
  • Dezentralität
  • +
  • XMPP - Der Standard
  • +
  • Software (Client und Server)
  • +
  • Ist der Hoster gut
  • +
  • Verschlüsselung
  • +
  • Ausblick
  • +
  • Alternativen
  • +
+ +
+ +

Dezentralität

+ +
    +
  • vs. Zentralität
  • +
+ +

Leider von den meisten Messenger verwendet

+ +

+ +
+ +

Dezentralität

+ +
    +
  • Federation
  • +
+ +

Kommunikation über verschieden unabhängige zentrale Komponenten

+ +

+ + + +
+ +

Dezentralität

+ +
    +
  • Peer-to-Peer
  • +
+ +

Geräte tauschen direkt miteinander Nachrichten aus (ohne eine zentrale Componente)

+ +

+ + + +
+ +

Dezentralität

+ +

Warum notwendig?

+ +
    +
  • Eröffnet ein Wettbewerb
  • +
  • kleine und viele Angriffsziele + +
      +
    • vor Kriminelle
    • +
    • vor Regierungen
    • +
    • alle Überwachen
    • +
    • blockieren / sperren (Zensur)
    • +
  • +
  • Verringert Missbrauch durch Vertrauen
  • +
+ + + +
+ +

Dezentralität

+ +

Nachteile

+ +
    +
  • Komplexität steigt
  • +
  • Gewollte Verringerung an Marktanteil
  • +
  • Kann auch von kriminellen Elementen genutzt werden
  • +
  • Nutzer müssen ggf. sich Ihre Adresse und Passwort merken
  • +
+ + + +
+ +

Extensible Messaging and Presence Protocol (XMPP)

+ +
    +
  • Existiert seit 1999 (unter den Namen Jabber)
  • + +
  • IETF Standard seit 2002

  • + +
  • Google Talk 2005 - 2013 (entwickelte Jingle)

  • + +
  • Facebook 2010 - 2014

  • + +
  • WhatsApp nutzt es intern

  • +
+ + + +
+ +

XMPP

+ +

Adressierung

+ +

JID (Jabber ID) genannt:

+ +
node@domain/ressource
+
+ +

URI-Format: (falls MUC mit ?join am Ende)

+ +
xmpp:node@domain?join
+
+ + + +
+ +

XMPP

+ +

Message

+ +
<message from="geno@fireorbit.de"
+ to="#ccchb@irc.hackint.org" type="groupchat">
+	Hello World
+</message>
+
+ +

Types:

+ +
    +
  • chat
  • +
  • groupchat
  • +
  • headline
  • +
  • normal
  • +
  • error
  • +
+ +
+ +

XMPP

+ +

Present: Aktuelle Live Informationen

+ +
<present to="#ccchb@irc.hackint.org" type="subscribe">
+</present>
+
+ +

Types:

+ +
    +
  • error
  • +
  • probe
  • +
  • subscribe(d)
  • +
  • unavailable
  • +
  • unsubscribe(d)
  • +
+ +
+ +

XMPP

+ +

IQ (Instant Query): Abfragen mit Rückantworten

+ +
<iq to="irc.hackint.org" type="get">
+	<ping xmlns='urn:xmpp:ping'/>
+</iq>
+
+ +

Types:

+ +
    +
  • get
  • +
  • set
  • +
  • result
  • +
  • error
  • +
+ + + +
+ +

Software Clients

+ +

Empfehlungen:

+ +
    +
  • Conversations (Android) + +
      +
    • Pix-Art Messenger
    • +
  • +
  • ChatSecure (iPhone)
  • +
  • Gajim (Desktop)
  • +
  • ConverseJS (WebClient)
  • +
  • Viele mehr + +
  • +
+ +
+ +

Software Clients

+ +

Bombus - Client in J2ME für normale Telefone +

+ Wikipedia - Article Java +

+ +
+ +

Software Server

+ +
    +
  • prosody in lua

    + +
      +
    • leicht erweiterbar
    • +
    • riesige Sammlung an erweiterbaren Modulen (die man nutzen muss)
    • +
  • + +
  • ejabberd (Fork: mongooseIM) in erlang

    + +
      +
    • besitzt alle nötigen Funktionen von Haus aus
    • +
    • sehr gut gewartet
    • +
  • + +
  • OpenFire in Java

  • +
+ +
+ +

Ist der Hoster gut

+ +

Tools zum Testen des Servers (Auswahl an Servern)

+ + + +

XEPs:

+ +
    +
  • PEP / PubSub
  • +
  • MAM (für MUC)
  • +
  • HTTP-Upload
  • +
  • DNS-SRV for TLS (HTTPS)
  • +
+ + + +
+ +

XMPP

+ +

Verschlüsselung

+ +
    +
  • Off-The-Record
  • +
  • OpenPGP
  • +
  • OX
  • +
  • OMEMO
  • +
+ +

Detailert: here

+ + + +
+ +

XMPP Verschlüsselung

+ +
    +
  • Geräte erstellt asynchrones Schlüsselpaar + +
      +
    • öffentlichen Schlüssel wird per PubSub auf dem Server hinterlegt
    • +
  • +
  • Kontakte werden durch PEP / PubSub über neuen Schlüssel informiert + +
      +
    • Dieser muss diesen öffentlichen Schlüssel laden
    • +
  • +
+ + + +
+ +

+

Demo

+Anleitung +

+ +
+ +

Ausblick

+ +
    +
  • Transports + +
      +
    • Biboumi: IRC
    • +
    • Spectrum2: e.g AIM, ICQ, MSN, Yahoo, Telegram, Twitter, “WhatsApp”
    • +
  • +
  • PubSub + +
      +
    • Blogging / Posting (siehe Movim)
    • +
  • +
  • Commands + +
      +
    • Internet of Things
    • +
  • +
+ +

XEP-Liste letzter Eintrag: XEP-0410: MUC Self-Ping (Schrödinger’s Chat)

+ + + +
+ +

Alternativen zu XMPP

+ +

Peer-to-Peer

+ +
    +
  • Nutzen das Tor-Netzwerk + +
      +
    • Tox
    • +
    • Briar + +
        +
      • kann auch Local per Wifi und Bluetooth genutzt werden
      • +
    • +
    • … (viele mehr)
    • +
  • + +
  • libp2p

  • + +
  • (mir sonst keine Weiteren bekannt …)

  • +
+ +
+ +

Alternativen zu XMPP

+ +

Federation

+ +
    +
  • Matrix (Riot): + +
      +
    • Änderungsvorschläge am Protokoll werden durch das Unternehmen entschieden
    • +
  • +
  • (mir sonst keine Weiteren bekannt …)
  • +
+ +
+ +

+

Ende

+

Hackerethik

+ +

3. Mißtraue Autoritäten – fördere Dezentralisierung. +

+
+ +
+ + +
+ + + + + + + + + + diff --git a/highlight-js/.editorconfig b/highlight-js/.editorconfig new file mode 100644 index 0000000..821eb72 --- /dev/null +++ b/highlight-js/.editorconfig @@ -0,0 +1,8 @@ +[*] +end_of_line = lf +insert_final_newline = true + +[*.{js,css}] +charset = utf-8 +indent_style = space +indent_size = 2 diff --git a/highlight-js/.gitattributes b/highlight-js/.gitattributes new file mode 100644 index 0000000..5c7d623 --- /dev/null +++ b/highlight-js/.gitattributes @@ -0,0 +1,4 @@ +# The build script and some tests use `\n` as markers, so we need to make sure +# that all javascript files are checked out using UNIX line endings (not `\r\n`) +*.js eol=lf +*.txt eol=lf \ No newline at end of file diff --git a/highlight-js/.gitignore b/highlight-js/.gitignore new file mode 100644 index 0000000..9fef4d6 --- /dev/null +++ b/highlight-js/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +build +docs/_build +.idea/ +__pycache__ +*.swp +node_modules +.project +yarn.lock diff --git a/highlight-js/.travis.yml b/highlight-js/.travis.yml new file mode 100644 index 0000000..7ef674f --- /dev/null +++ b/highlight-js/.travis.yml @@ -0,0 +1,30 @@ +language: node_js +node_js: + - "lts/*" + - "node" +env: + - + - BROWSER=1 + - BROWSER=1 NOCOMPRESS=1 +script: + - | + export BUILD_PARAMS="" + + if [ "x$BROWSER" = "x1" ]; then + export BUILD_PARAMS="$BUILD_PARAMS -t browser" + else + export BUILD_PARAMS="$BUILD_PARAMS -t node" + fi + + if [ "x$NOCOMPRESS" = "x1" ]; then + export BUILD_PARAMS="$BUILD_PARAMS -n" + fi + + node tools/build.js $BUILD_PARAMS + + if [ "x$BROWSER" = "x1" ]; then + npm run test-browser + else + npm run test + fi +sudo: false # Use container-based architecture diff --git a/highlight-js/AUTHORS.en.txt b/highlight-js/AUTHORS.en.txt new file mode 100644 index 0000000..4ae292c --- /dev/null +++ b/highlight-js/AUTHORS.en.txt @@ -0,0 +1,274 @@ +Syntax highlighting with language autodetection. + +URL: https://highlightjs.org/ + +Current core developers (alphabetical): + +- Gidi Meir Morris +- Jan T. Sott +- Li Xuanji +- Marcos Cáceres +- Sang Dang + +Former maintainers: + +- Ivan Sagalaev (original author) +- Jeremy Hull +- Oleg Efimov + +Contributors: + +- Peter Leonov +- Victor Karamzin +- Vsevolod Solovyov +- Anton Kovalyov +- Nikita Ledyaev +- Konstantin Evdokimenko +- Dmitri Roudakov +- Yuri Ivanov +- Vladimir Ermakov +- Vladimir Gubarkov +- Brian Beck +- MajestiC +- Vasily Polovnyov +- Vladimir Epifanov +- Alexander Makarov +- Vah +- Shuen-Huei Guan +- Jason Diamond +- Michal Gabrukiewicz +- Ruslan Keba +- Sergey Baranov +- Zaripov Yura +- Oleg Volchkov +- Vasily Mikhailitchenko +- Jan Berkel +- Vladimir Moskva +- Loren Segal +- Andrew Fedorov +- Igor Kalnitsky +- Valerii Hiora +- Nikolay Zakharov +- Dmitry Kovega +- Sergey Ignatov +- Antono Vasiljev +- Stephan Kountso +- pumbur +- John Crepezzi +- Andrey Vlasovskikh +- Alexander Myadzel +- Evgeny Stepanischev +- Dmytrii Nagirniak +- Luigi Maselli +- Denis Bardadym +- Aahan Krish +- Ilya Baryshev +- Aleksandar Ruzicic +- Joe Cheng +- Angel G. Olloqui +- Jason Tate +- Sergey Tikhomirov +- Marc Fornos +- Yoshihide Jimbo +- Casey Duncan +- Eugene Nizhibitsky +- Alberto Gimeno +- Kirk Kimmel +- Nathan Grigg +- Dr. Drang +- Robin Ward +- Dmitry Medvinsky +- Jason Jacobson +- Jonas Follesø +- Dan Allen +- noformnocontent +- Damien White +- Alexander Marenin +- Cédric Néhémie +- Simon Madine +- Benjamin Pannell +- Eric Knibbe +- Poren Chiang +- Kelley van Evert +- Kurt Emch +- Mehdi Dogguy +- Nicolas Braud-Santoni +- Ralf Bitter +- Sylvestre Ledru +- Troy Kershaw +- Zena Treep +- Daniel Kvasnicka +- Carlo Kok +- Bram de Haan +- Seongwon Lee +- Zaven Muradyan +- Brent Bradbury +- Martin Dilling-Hansen +- Ilya Vassilevsky +- Josh Adams +- Dan Tao +- Jeff Escalante +- Jun Yang +- Nikolay Lisienko +- Heiko August +- Domen Kožar +- Travis Odom +- innocenat +- Arthur Bikmullin +- Pascal Hurni +- Roman Shmatov +- Nic West +- Panu Horsmalahti +- Flaviu Tamas +- Damian Mee +- Christopher Kaster +- Chris Eidhof +- Nate Cook +- Matt Diephouse +- Erik Osheim +- Guillaume Laforge +- Lucas Mazza +- Maxim Dikun +- Henrik Feldt +- Anton Kochkov +- Michael Allen +- JP Verkamp +- Adam Joseph Cook +- Sergey Vidyuk +- Radek Liska +- Jose Molina Colmenero +- Max Mikhailov +- Bryant Williams +- Erik Paluka +- Luke Holder +- David Mohundro +- Nicholas Blumhardt +- Christophe de Dinechin +- Taneli Vatanen +- Jen Evers-Corvina +- Kassio Borges +- Cedric Sohrauer +- Mickaël Delahaye +- Hakan Özler +- Trey Shugart +- Vincent Zurczak +- Adam Joseph Cook +- Edwin Dalorzo +- mucaho +- Dennis Titze +- Jon Evans +- Brian Quistorff +- Jonathan Suever +- Alexis Hénaut +- Chris Kiehl +- Peter Piwowarski +- Kenta Sato +- Anthony Scemama +- Taufik Nurrohman +- Pedro Oliveira +- Gu Yiling +- Thomas Applencourt +- Andrew Farmer +- Sergey Mashkov +- Raivo Laanemets +- Kenneth Fuglsang +- David Anson +- Louis Barranqueiro +- Tim Schumacher +- Lucas Werkmeister +- Dan Panzarella +- Bruno Dias +- Jay Strybis +- Guillaume Gomez +- Janis Voigtländer +- Dirk Kirsten +- MY Sun +- Vadimtro +- Benjamin Auder +- Dotan Dimet +- Manh Tuan +- Philippe Charrière +- Stefan Bechert +- Samuel Reed +- Yury Selivanov +- Tsuyusato Kitsune +- Mick MacCallum +- Kristoffer Gronlund +- Søren Enevoldsen +- Daniel Rosenwasser +- Ladislav Prskavec +- Jan Kühle +- Stefan Wienert +- Nikita Savchenko +- Stefania Mellai +- Nebuleon Fumika +- prince +- Brendan Rocks +- Raphaël Assénat +- Matt Evans +- Martin Braun +- Boris Cherny +- John Foster +- Robert Dodier +- Anthony Dugois +- Qeole +- Denis Ciccale +- Michael Johnston +- Taras +- Philipp Wolfer +- Mikko Kouhia +- Billy Quith +- Herbert Shin +- Tristano Ajmone +- Taisuke Fujimoto +- Boone Severson +- Victor Zhou +- Lars Schulna +- Jacob Childress +- Gavin Siu +- Builder's Brewery +- Sergey Bronnikov +- Joe Eli McIlvain +- Stephan Boyer +- Alex McKibben +- Daniel Gamage +- Matthew Daly +- Magnus Madsen +- Camil Staps +- Alexander Lichter +- Nicolas Le Gall +- Kenton Hamaluik +- Marvin Saignat +- Michael Rodler +- Sergey Sobko +- Hale Chan +- Kasper Andersen +- Philipp A. +- Guannan Wei +- Sam Wu +- Ike Ku +- Andres Täht +- Rene Saarsoo +- Jordi Petit +- Raphaël Parrëe +- Joël Porquet +- Alex Arslan +- Stanislav Belov +- Ivan Dementev +- Nicolas LLOBERA +- Morten Piibeleht +- Martin Clausen +- Arctic Ice Studio +- Google Inc. (David Benjamin) +- Ahmad Awais +- Tristian Kelly +- Melissa Geels +- Dmitriy Tarasov +- Egor Rogov +- Meseta +- Harmon +- Eric Bailey +- Gustavo Costa +- Antoine Boisier-Michaud +- Alejandro Isaza +- Laurent Voullemier diff --git a/highlight-js/CHANGES.md b/highlight-js/CHANGES.md new file mode 100644 index 0000000..0c924be --- /dev/null +++ b/highlight-js/CHANGES.md @@ -0,0 +1,1757 @@ +## Master + +New languages: + +New styles: + +Improvements: + +- Fixed Dockerfile definition when using highlight continuation parameter, by [Laurent Voullemier][] +- Added tests & new `annotation` and `verbatim` keywords to *Crystal*, by [Benoit de Chezelles][] +- Added missing dockerfile markup tests, by [Laurent Voullemier][] + Allow empty prompt text in clojure-repl, by [Egor Rogov][] +- Fixed several issues with *Crystal* language definition, by [Johannes Müller][] +- Added `C#` as an alias for *CSharp* language, by [Ahmed Atito][] +- Added generic user-defined proc support, new compiler define, refactor to re-use rules, and add tests to *GAUSS*, by [Matthew Evans][] +- Improve *Crystal* language to highlight regexes after some keywords, by [Tsuyusato Kitsune][] +- Fix filterByQualifiers: fileInfo can be null + +[Laurent Voullemier]: https://github.com/l-vo +[Benoit de Chezelles]: https://github.com/bew +[Johannes Müller]: https://github.com/straight-shoota +[Ahmed Atito]: https://github.com/atitoa93 +[Matthew Evans]: https://github.com/matthewevans +[Tsuyusato Kitsune]: https://github.com/MakeNowJust + +## Version 9.13.1 + +Improvements: + +- *C#* function declarations no longer include trailing whitespace, by [JeremyTCD][] +- Added new and missing keywords to *AngelScript*, by [Melissa Geels][] +- *TypeScript* decorator factories highlighting fix, by [Antoine Boisier-Michaud][] +- Added support for multiline strings to *Swift*, by [Alejandro Isaza][] +- Fixed issue that was causing some minifiers to fail. +- Fixed `autoDetection` to accept language aliases. + +[JeremyTCD]: https://github.com/JeremyTCD +[Melissa Geels]: https://github.com/codecat +[Antoine Boisier-Michaud]: https://github.com/Aboisier +[Alejandro Isaza]: https://github.com/alejandro-isaza + +## Version 9.13.0 + +New languages: + +- *ArcGIS Arcade* by [John Foster][] +- *AngelScript* by [Melissa Geels][] +- *GML* by [meseta][] +- *isbl* built-in language DIRECTUM and Conterra by [Dmitriy Tarasov][]. +- *PostgreSQL* SQL dialect and PL/pgSQL language by [Egor Rogov][]. +- *ReasonML* by [Gidi Meir Morris][] +- *SAS* by [Mauricio Caceres Bravo][] +- *Plaintext* by [Egor Rogov][] +- *.properties* by [bostko][] and [Egor Rogov][] + +New styles: + +- *a11y-dark theme* by [Eric Bailey][] +- *a11y-light theme* by [Eric Bailey][] +- *An Old Hope* by [Gustavo Costa][] +- *Atom One Dark Reasonable* by [Gidi Meir Morris][] +- *isbl editor dark* by [Dmitriy Tarasov][] +- *isbl editor light* by [Dmitriy Tarasov][] +- *Lightfair* by [Tristian Kelly][] +- [*Nord*][nord-highlightjs] by [Arctic Ice Studio][] +- *[🦄 Shades of Purple](https://github.com/ahmadawais/Shades-of-Purple-HighlightJS)* by [Ahmad Awais][] + +Improvements: + +- New attribute `endSameAsBegin` for nested constructs with variable names + by [Egor Rogov][]. +- *Python* highlighting of escaped quotes fixed by [Harmon][] +- *PHP*: Added alias for php7, by [Vijaya Chandran Mani][] +- *C++* string handling, by [David Benjamin][] +- *Swift* Add `@objcMembers` to `@attributes`, by [Berk Çebi][] +- Infrastructural changes by [Marcos Cáceres][] +- Fixed metachars highighting for *NSIS* by [Jan T. Sott][] +- *Yaml* highlight local tags as types by [Léo Lam][] +- Improved highlighting for *Elixir* by [Piotr Kaminski][] +- New attribute `disableAutodetect` for preventing autodetection by [Egor Rogov][] +- *Matlab*: transpose operators and double quote strings, by [JohnC32][] and [Egor Rogov][] +- Various documentation typos and improvemets by [Jimmy Wärting][], [Lutz Büch][], [bcleland][] +- *Cmake* updated with new keywords and commands by [Deniz Bahadir][] + +[Ahmad Awais]: https://github.com/ahmadawais +[Arctic Ice Studio]: https://github.com/arcticicestudio +[Dmitriy Tarasov]: https://github.com/MedvedTMN +[Egor Rogov]: https://github.com/egor-rogov +[Eric Bailey]: https://github.com/ericwbailey +[Gidi Meir Morris]: https://github.com/gmmorris +[Gustavo Costa]: https://github.com/gusbemacbe +[Harmon]: https://github.com/Harmon758 +[Melissa Geels]: https://github.com/codecat +[meseta]: https://github.com/meseta +[nord-highlightjs]: https://github.com/arcticicestudio/nord-highlightjs +[Tristian Kelly]: https://github.com/TristianK3604 +[Vijaya Chandran Mani]: https://github.com/vijaycs85 +[John Foster]: https://github.com/jf990 +[David Benjamin]: https://github.com/davidben +[Berk Çebi]: https://github.com/berkcebi +[Mauricio Caceres Bravo]: https://github.com/mcaceresb +[bostko]: https://github.com/bostko +[Deniz Bahadir]: https://github.com/Bagira80 +[bcleland]: https://github.com/bcleland +[JohnC32]: https://github.com/JohnC32 +[Lutz Büch]: https://github.com/lutz-100worte +[Piotr Kaminski]: https://github.com/pkaminski +[Léo Lam]: https://github.com/leoetlino +[Jan T. Sott]: https://github.com/idleberg +[Jimmy Wärting]: https://github.com/jimmywarting +[Marcos Cáceres]: https://github.com/marcoscaceres + +## Version 9.12.0 + +New language: + +- *MikroTik* RouterOS Scripting language by [Ivan Dementev][]. + +New style: + +- *VisualStudio 2015 Dark* by [Nicolas LLOBERA][] + +Improvements: + +- *Crystal* updated with new keywords and syntaxes by [Tsuyusato Kitsune][]. +- *Julia* updated to the modern definitions by [Alex Arslan][]. +- *julia-repl* added by [Morten Piibeleht][]. +- [Stanislav Belov][] wrote a new definition for *1C*, replacing the one that + has not been updated for more than 8 years. The new version supports syntax + for versions 7.7 and 8. +- [Nicolas LLOBERA][] improved C# definition fixing edge cases with function + titles detection and added highlighting of `[Attributes]`. +- [nnnik][] provided a few correctness fixes for *Autohotkey*. +- [Martin Clausen][] made annotation collections in *Clojure* to look + consistently with other kinds. +- [Alejandro Alonso][] updated *Swift* keywords. + +[Tsuyusato Kitsune]: https://github.com/MakeNowJust +[Alex Arslan]: https://github.com/ararslan +[Morten Piibeleht]: https://github.com/mortenpi +[Stanislav Belov]: https://github.com/4ppl +[Ivan Dementev]: https://github.com/DiVAN1x +[Nicolas LLOBERA]: https://github.com/Nicolas01 +[nnnik]: https://github.com/nnnik +[Martin Clausen]: https://github.com/maacl +[Alejandro Alonso]: https://github.com/Azoy + +## Version 9.11.0 + +New languages: + +- *Shell* by [Tsuyusato Kitsune][] +- *jboss-cli* by [Raphaël Parrëe][] + +Improvements: + +- [Joël Porquet] has [greatly improved the definition of *makefile*][5b3e0e6]. +- *C++* class titles are now highlighted as in other languages with classes. +- [Jordi Petit][] added rarely used `or`, `and` and `not` keywords to *C++*. +- [Pieter Vantorre][] fixed highlighting of negative floating point values. + + +[Tsuyusato Kitsune]: https://github.com/MakeNowJust +[Jordi Petit]: https://github.com/jordi-petit +[Raphaël Parrëe]: https://github.com/rparree +[Pieter Vantorre]: https://github.com/NuclearCookie +[5b3e0e6]: https://github.com/isagalaev/highlight.js/commit/5b3e0e68bfaae282faff6697d6a490567fa9d44b + + +## Version 9.10.0 + +Apologies for missing the previous release cycle. Some thing just can't be +automated… Anyway, we're back! + +New languages: + +- *Hy* by [Sergey Sobko][] +- *Leaf* by [Hale Chan][] +- *N1QL* by [Andres Täht][] and [Rene Saarsoo][] + +Improvements: + +- *Rust* got updated with new keywords by [Kasper Andersen][] and then + significantly modernized even more by [Eduard-Mihai Burtescu][] (yes, @eddyb, + Rust core team member!) +- *Python* updated with f-literals by [Philipp A][]. +- *YAML* updated with unquoted strings support. +- *Gauss* updated with new keywords by [Matt Evans][]. +- *Lua* updated with new keywords by [Joe Blow][]. +- *Kotlin* updated with new keywords by [Philipp Hauer][]. +- *TypeScript* got highlighting of function params and updated keywords by + [Ike Ku][]. +- *Scheme* now correctly handles \`-quoted lists thanks to [Guannan Wei]. +- [Sam Wu][] fixed handling of `<<` in *C++* defines. + +[Philipp A]: https://github.com/flying-sheep +[Philipp Hauer]: https://github.com/phauer +[Sergey Sobko]: https://github.com/profitware +[Hale Chan]: https://github.com/halechan +[Matt Evans]: https://github.com/matthewevans +[Joe Blow]: https://github.com/mossarelli +[Kasper Andersen]: https://github.com/kasma1990 +[Eduard-Mihai Burtescu]: https://github.com/eddyb +[Andres Täht]: https://github.com/andrestaht +[Rene Saarsoo]: https://github.com/nene +[Philipp Hauer]: https://github.com/phauer +[Ike Ku]: https://github.com/dempfi +[Guannan Wei]: https://github.com/Kraks +[Sam Wu]: https://github.com/samsam2310 + + +## Version 9.9.0 + +New languages + +- *LLVM* by [Michael Rodler][] + +Improvements: + +- *TypeScript* updated with annotations and param lists inside constructors, by + [Raphael Parree][]. +- *CoffeeScript* updated with new keywords and fixed to recognize JavaScript + in \`\`\`, thanks to thanks to [Geoffrey Booth][]. +- Compiler directives in *Delphi* are now correctly highlighted as "meta". + +[Raphael Parree]: https://github.com/rparree +[Michael Rodler]: https://github.com/f0rki +[Geoffrey Booth]: https://github.com/GeoffreyBooth + + +## Version 9.8.0 "New York" + +This version is the second one that deserved a name. Because I'm in New York, +and the release isn't missing the deadline only because it's still Tuesday on +West Coast. + +New languages: + +- *Clean* by [Camil Staps][] +- *Flix* by [Magnus Madsen][] + +Improvements: + +- [Kenton Hamaluik][] did a comprehensive update for *Haxe*. +- New commands for *PowerShell* from [Nicolas Le Gall][]. +- [Jan T. Sott][] updated *NSIS*. +- *Java* and *Swift* support unicode characters in identifiers thanks to + [Alexander Lichter][]. + +[Camil Staps]: https://github.com/camilstaps +[Magnus Madsen]: https://github.com/magnus-madsen +[Kenton Hamaluik]: https://github.com/FuzzyWuzzie +[Nicolas Le Gall]: https://github.com/darkitty +[Jan T. Sott]: https://github.com/idleberg +[Alexander Lichter]: https://github.com/manniL + + +## Version 9.7.0 + +A comprehensive bugfix release. This is one of the best things about +highlight.js: even boring things keep getting better (even if slow). + +- VHDL updated with PSL keywords and uses more consistent styling. +- Nested C-style comments no longer break highlighting in many languages. +- JavaScript updated with `=>` functions, highlighted object attributes and + parsing within template string substitution blocks (`${...}`). +- Fixed another corner case with self-closing `` in JSX. +- Added `HEALTHCHECK` directive in Docker. +- Delphi updated with new Free Pascal keywords. +- Fixed digit separator parsing in C++. +- C# updated with new keywords and fixed to allow multiple identifiers within + generics `<...>`. +- Fixed another slow regex in Less. + + +## Version 9.6.0 + +New languages: + +- *ABNF* and *EBNF* by [Alex McKibben][] +- *Awk* by [Matthew Daly][] +- *SubUnit* by [Sergey Bronnikov][] + +New styles: + +- *Atom One* in both Dark and Light variants by [Daniel Gamage][] + +Plus, a few smaller updates for *Lasso*, *Elixir*, *C++* and *SQL*. + +[Alex McKibben]: https://github.com/mckibbenta +[Daniel Gamage]: https://github.com/danielgamage +[Matthew Daly]: https://github.com/matthewbdaly +[Sergey Bronnikov]: https://github.com/ligurio + + +## Version 9.5.0 + +New languages: + +- *Excel* by [Victor Zhou][] +- *Linden Scripting Language* by [Builder's Brewery][] +- *TAP* (Test Anything Protocol) by [Sergey Bronnikov][] +- *Pony* by [Joe Eli McIlvain][] +- *Coq* by [Stephan Boyer][] +- *dsconfig* and *LDIF* by [Jacob Childress][] + +New styles: + +- *Ocean Dark* by [Gavin Siu][] + +Notable changes: + +- [Minh Nguyễn][] added more built-ins to Objective C. +- [Jeremy Hull][] fixed corner cases in C++ preprocessor directives and Diff + comments. +- [Victor Zhou][] added support for digit separators in C++ numbers. + +[Gavin Siu]: https://github.com/gavsiu +[Builder's Brewery]: https://github.com/buildersbrewery +[Victor Zhou]: https://github.com/OiCMudkips +[Sergey Bronnikov]: https://github.com/ligurio +[Joe Eli McIlvain]: https://github.com/jemc +[Stephan Boyer]: https://github.com/boyers +[Jacob Childress]: https://github.com/braveulysses +[Minh Nguyễn]: https://github.com/1ec5 +[Jeremy Hull]: https://github.com/sourrust + + +## Version 9.4.0 + +New languages: + +- *PureBASIC* by [Tristano Ajmone][] +- *BNF* by [Oleg Efimov][] +- *Ada* by [Lars Schulna][] + +New styles: + +- *PureBASIC* by [Tristano Ajmone][] + +Improvements to existing languages and styles: + +- We now highlight function declarations in Go. +- [Taisuke Fujimoto][] contributed very convoluted rules for raw and + interpolated strings in C#. +- [Boone Severson][] updated Verilog to comply with IEEE 1800-2012 + SystemVerilog. +- [Victor Zhou][] improved rules for comments and strings in PowerShell files. +- [Janis Voigtländer][] updated the definition of Elm to version 0.17 of the + languages. Elm is now featured on the front page of . +- Special variable `$this` is highlighted as a keyword in PHP. +- `usize` and `isize` are now highlighted in Rust. +- Fixed labels and directives in x86 assembler. + +[Tristano Ajmone]: https://github.com/tajmone +[Taisuke Fujimoto]: https://github.com/temp-impl +[Oleg Efimov]: https://github.com/Sannis +[Boone Severson]: https://github.com/BooneJS +[Victor Zhou]: https://github.com/OiCMudkips +[Lars Schulna]: https://github.com/captain-hanuta +[Janis Voigtländer]: https://github.com/jvoigtlaender + + +## Version 9.3.0 + +New languages: + +- *Tagger Script* by [Philipp Wolfer][] +- *MoonScript* by [Billy Quith][] + +New styles: + +- *xt256* by [Herbert Shin][] + +Improvements to existing languages and styles: + +- More robust handling of unquoted HTML tag attributes +- Relevance tuning for QML which was unnecessary eager at seizing other + languages' code +- Improve GAMS language parsing +- Fixed a bunch of bugs around selectors in Less +- Kotlin's got a new definition for annotations, updated keywords and other + minor improvements +- Added `move` to Rust keywords +- Markdown now recognizes \`\`\`-fenced code blocks +- Improved detection of function declarations in C++ and C# + +[Philipp Wolfer]: https://github.com/phw +[Billy Quith]: https://github.com/billyquith +[Herbert Shin]: https://github.com/initbar + + +## Version 9.2.0 + +New languages: + +- *QML* by [John Foster][] +- *HTMLBars* by [Michael Johnston][] +- *CSP* by [Taras][] +- *Maxima* by [Robert Dodier][] + +New styles: + +- *Gruvbox* by [Qeole][] +- *Dracula* by [Denis Ciccale][] + +Improvements to existing languages and styles: + +- We now correctly handle JSX with arbitrary node tree depth. +- Argument list for `(lambda)` in Scheme is no longer highlighted as a function + call. +- Stylus syntax doesn't break on valid CSS. +- More correct handling of comments and strings and other improvements for + VimScript. +- More subtle work on the default style. +- We now use anonymous modules for AMD. +- `macro_rules!` is now recognized as a built-in in Rust. + +[John Foster]: https://github.com/jf990 +[Qeole]: https://github.com/Qeole +[Denis Ciccale]: https://github.com/dciccale +[Michael Johnston]: https://github.com/lastobelus +[Taras]: https://github.com/oxdef +[Robert Dodier]: https://github.com/robert-dodier + + +## Version 9.1.0 + +New languages: + +- *Stan* by [Brendan Rocks][] +- *BASIC* by [Raphaël Assénat][] +- *GAUSS* by [Matt Evans][] +- *DTS* by [Martin Braun][] +- *Arduino* by [Stefania Mellai][] + +New Styles: + +- *Arduino Light* by [Stefania Mellai][] + +Improvements to existing languages and styles: + +- Handle return type annotations in Python +- Allow shebang headers in Javascript +- Support strings in Rust meta +- Recognize `struct` as a class-level definition in Rust +- Recognize b-prefixed chars and strings in Rust +- Better numbers handling in Verilog + +[Brendan Rocks]: http://brendanrocks.com +[Raphaël Assénat]: https://github.com/raphnet +[Matt Evans]: https://github.com/matthewevans +[Martin Braun]: https://github.com/mbr0wn +[Stefania Mellai]: https://github.com/smellai + + +## Version 9.0.0 + +The new major version brings a reworked styling system. Highlight.js now defines +a limited set of highlightable classes giving a consistent result across all the +styles and languages. You can read a more detailed explanation and background in +the [tracking issue][#348] that started this long process back in May. + +This change is backwards incompatible for those who uses highlight.js with a +custom stylesheet. The [new style guide][sg] explains how to write styles +in this new world. + +Bundled themes have also suffered a significant amount of improvements and may +look different in places, but all the things now consistent and make more sense. +Among others, the Default style has got a refresh and will probably be tweaked +some more in next releases. Please do give your feedback in our +[issue tracker][issues]. + +New languages in this release: + +- *Caché Object Script* by [Nikita Savchenko][] +- *YAML* by [Stefan Wienert][] +- *MIPS Assembler* by [Nebuleon Fumika][] +- *HSP* by [prince][] + +Improvements to existing languages and styles: + +- ECMAScript 6 modules import now do not require closing semicolon. +- ECMAScript 6 classes constructors now highlighted. +- Template string support for Typescript, as for ECMAScript 6. +- Scala case classes params highlight fixed. +- Built-in names introduced in Julia v0.4 added by [Kenta Sato][]. +- Refreshed Default style. + +Other notable changes: + +- [Web workers support][webworkers] added bu [Jan Kühle][]. +- We now have tests for compressed browser builds as well. +- The building tool chain has been switched to node.js 4.x. and is now + shamelessly uses ES6 features all over the place, courtesy of [Jeremy Hull][]. +- License added to non-compressed browser build. + +[Jan Kühle]: https://github.com/frigus02 +[Stefan Wienert]: https://github.com/zealot128 +[Kenta Sato]: https://github.com/bicycle1885 +[Nikita Savchenko]: https://github.com/ZitRos +[webworkers]: https://github.com/isagalaev/highlight.js#web-workers +[Jeremy Hull]: https://github.com/sourrust +[#348]: https://github.com/isagalaev/highlight.js/issues/348 +[sg]: http://highlightjs.readthedocs.org/en/latest/style-guide.html +[issues]: https://github.com/isagalaev/highlight.js/issues +[Nebuleon Fumika]: https://github.com/Nebuleon +[prince]: https://github.com/prince-0203 + + +## Version 8.9.1 + +Some last-minute changes reverted due to strange bug with minified browser build: + +- Scala case classes params highlight fixed +- ECMAScript 6 modules import now do not require closing semicolon +- ECMAScript 6 classes constructors now highlighted +- Template string support for Typescript, as for ECMAScript 6 +- License added to not minified browser build + + +## Version 8.9.0 + +New languages: + +- *crmsh* by [Kristoffer Gronlund][] +- *SQF* by [Soren Enevoldsen][] + +[Kristoffer Gronlund]: https://github.com/krig +[Soren Enevoldsen]: https://github.com/senevoldsen90 + +Notable fixes and improvements to existing languages: + +- Added `abstract` and `namespace` keywords to TypeScript by [Daniel Rosenwasser][] +- Added `label` support to Dockerfile by [Ladislav Prskavec][] +- Crystal highlighting improved by [Tsuyusato Kitsune][] +- Missing Swift keywords added by [Nate Cook][] +- Improve detection of C block comments +- ~~Scala case classes params highlight fixed~~ +- ~~ECMAScript 6 modules import now do not require closing semicolon~~ +- ~~ECMAScript 6 classes constructors now highlighted~~ +- ~~Template string support for Typescript, as for ECMAScript 6~~ + +Other notable changes: + +- ~~License added to not minified browser build~~ + +[Kristoffer Gronlund]: https://github.com/krig +[Søren Enevoldsen]: https://github.com/senevoldsen90 +[Daniel Rosenwasser]: https://github.com/DanielRosenwasser +[Ladislav Prskavec]: https://github.com/abtris +[Tsuyusato Kitsune]: https://github.com/MakeNowJust +[Nate Cook]: https://github.com/natecook1000 + + +## Version 8.8.0 + +New languages: + +- *Golo* by [Philippe Charrière][] +- *GAMS* by [Stefan Bechert][] +- *IRPF90* by [Anthony Scemama][] +- *Access logs* by [Oleg Efimov][] +- *Crystal* by [Tsuyusato Kitsune][] + +Notable fixes and improvements to existing languages: + +- JavaScript highlighting no longer fails with ES6 default parameters +- Added keywords `async` and `await` to Python +- PHP heredoc support improved +- Allow preprocessor directives within C++ functions + +Other notable changes: + +- Change versions to X.Y.Z SemVer-compatible format +- Added ability to build all targets at once + +[Philippe Charrière]: https://github.com/k33g +[Stefan Bechert]: https://github.com/b-pos465 +[Anthony Scemama]: https://github.com/scemama +[Oleg Efimov]: https://github.com/Sannis +[Tsuyusato Kitsune]: https://github.com/MakeNowJust + + +## Version 8.7 + +New languages: + +- *Zephir* by [Oleg Efimov][] +- *Elm* by [Janis Voigtländer][] +- *XQuery* by [Dirk Kirsten][] +- *Mojolicious* by [Dotan Dimet][] +- *AutoIt* by Manh Tuan from [J2TeaM][] +- *Toml* (ini extension) by [Guillaume Gomez][] + +New styles: + +- *Hopscotch* by [Jan T. Sott][] +- *Grayscale* by [MY Sun][] + +Notable fixes and improvements to existing languages: + +- Fix encoding of images when copied over in certain builds +- Fix incorrect highlighting of the word "bug" in comments +- Treat decorators different from matrix multiplication in Python +- Fix traits inheritance highlighting in Rust +- Fix incorrect document +- Oracle keywords added to SQL language definition by [Vadimtro][] +- Postgres keywords added to SQL language definition by [Benjamin Auder][] +- Fix registers in x86asm being highlighted as a hex number +- Fix highlighting for numbers with a leading decimal point +- Correctly highlight numbers and strings inside of C/C++ macros +- C/C++ functions now support pointer, reference, and move returns + +[Oleg Efimov]: https://github.com/Sannis +[Guillaume Gomez]: https://github.com/GuillaumeGomez +[Janis Voigtländer]: https://github.com/jvoigtlaender +[Jan T. Sott]: https://github.com/idleberg +[Dirk Kirsten]: https://github.com/dirkk +[MY Sun]: https://github.com/simonmysun +[Vadimtro]: https://github.com/Vadimtro +[Benjamin Auder]: https://github.com/ghost +[Dotan Dimet]: https://github.com/dotandimet +[J2TeaM]: https://github.com/J2TeaM + + +## Version 8.6 + +New languages: + +- *C/AL* by [Kenneth Fuglsang][] +- *DNS zone file* by [Tim Schumacher][] +- *Ceylon* by [Lucas Werkmeister][] +- *OpenSCAD* by [Dan Panzarella][] +- *Inform7* by [Bruno Dias][] +- *armasm* by [Dan Panzarella][] +- *TP* by [Jay Strybis][] + +New styles: + +- *Atelier Cave*, *Atelier Estuary*, + *Atelier Plateau* and *Atelier Savanna* by [Bram de Haan][] +- *Github Gist* by [Louis Barranqueiro][] + +Notable fixes and improvements to existing languages: + +- Multi-line raw strings from C++11 are now supported +- Fix class names with dashes in HAML +- The `async` keyword from ES6/7 is now supported +- TypeScript functions handle type and parameter complexity better +- We unified phpdoc/javadoc/yardoc etc modes across all languages +- CSS .class selectors relevance was dropped to prevent wrong language detection +- Images is now included to CDN build +- Release process is now automated + +[Bram de Haan]: https://github.com/atelierbram +[Kenneth Fuglsang]: https://github.com/kfuglsang +[Louis Barranqueiro]: https://github.com/LouisBarranqueiro +[Tim Schumacher]: https://github.com/enko +[Lucas Werkmeister]: https://github.com/lucaswerkmeister +[Dan Panzarella]: https://github.com/pzl +[Bruno Dias]: https://github.com/sequitur +[Jay Strybis]: https://github.com/unreal + + +## Version 8.5 + +New languages: + +- *pf.conf* by [Peter Piwowarski][] +- *Julia* by [Kenta Sato][] +- *Prolog* by [Raivo Laanemets][] +- *Docker* by [Alexis Hénaut][] +- *Fortran* by [Anthony Scemama][] and [Thomas Applencourt][] +- *Kotlin* by [Sergey Mashkov][] + +New styles: + +- *Agate* by [Taufik Nurrohman][] +- *Darcula* by [JetBrains][] +- *Atelier Sulphurpool* by [Bram de Haan][] +- *Android Studio* by [Pedro Oliveira][] + +Notable fixes and improvements to existing languages: + +- ES6 features in JavaScript are better supported now by [Gu Yiling][]. +- Swift now recognizes body-less method definitions. +- Single expression functions `def foo, do: ... ` now work in Elixir. +- More uniform detection of built-in classes in Objective C. +- Fixes for number literals and processor directives in Rust. +- HTML ` + ``` + +- `tabReplace` and `useBR` that were used in different places are also unified + into the global options object and are to be set using `configure(options)`. + This function is documented in our [API docs][]. Also note that these + parameters are gone from `highlightBlock` and `fixMarkup` which are now also + rely on `configure`. + +- We removed public-facing (though undocumented) object `hljs.LANGUAGES` which + was used to register languages with the library in favor of two new methods: + `registerLanguage` and `getLanguage`. Both are documented in our [API docs][]. + +- Result returned from `highlight` and `highlightAuto` no longer contains two + separate attributes contributing to relevance score, `relevance` and + `keyword_count`. They are now unified in `relevance`. + +Another technically compatible change that nonetheless might need attention: + +- The structure of the NPM package was refactored, so if you had installed it + locally, you'll have to update your paths. The usual `require('highlight.js')` + works as before. This is contributed by [Dmitry Smolin][]. + +New features: + +- Languages now can be recognized by multiple names like "js" for JavaScript or + "html" for, well, HTML (which earlier insisted on calling it "xml"). These + aliases can be specified in the class attribute of the code container in your + HTML as well as in various API calls. For now there are only a few very common + aliases but we'll expand it in the future. All of them are listed in the + [class reference][cr]. + +- Language detection can now be restricted to a subset of languages relevant in + a given context — a web page or even a single highlighting call. This is + especially useful for node.js build that includes all the known languages. + Another example is a StackOverflow-style site where users specify languages + as tags rather than in the markdown-formatted code snippets. This is + documented in the [API reference][] (see methods `highlightAuto` and + `configure`). + +- Language definition syntax streamlined with [variants][] and + [beginKeywords][]. + +New languages and styles: + +- *Oxygene* by [Carlo Kok][] +- *Mathematica* by [Daniel Kvasnička][] +- *Autohotkey* by [Seongwon Lee][] +- *Atelier* family of styles in 10 variants by [Bram de Haan][] +- *Paraíso* styles by [Jan T. Sott][] + +Miscellaneous improvements: + +- Highlighting `=>` prompts in Clojure. +- [Jeremy Hull][] fixed a lot of styles for consistency. +- Finally, highlighting PHP and HTML [mixed in peculiar ways][php-html]. +- Objective C and C# now properly highlight titles in method definition. +- Big overhaul of relevance counting for a number of languages. Please do report + bugs about mis-detection of non-trivial code snippets! + +[API reference]: http://highlightjs.readthedocs.org/en/latest/api.html + +[cr]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html +[api docs]: http://highlightjs.readthedocs.org/en/latest/api.html +[variants]: https://groups.google.com/d/topic/highlightjs/VoGC9-1p5vk/discussion +[beginKeywords]: https://github.com/isagalaev/highlight.js/commit/6c7fdea002eb3949577a85b3f7930137c7c3038d +[php-html]: https://twitter.com/highlightjs/status/408890903017689088 + +[Carlo Kok]: https://github.com/carlokok +[Bram de Haan]: https://github.com/atelierbram +[Daniel Kvasnička]: https://github.com/dkvasnicka +[Dmitry Smolin]: https://github.com/dimsmol +[Jeremy Hull]: https://github.com/sourrust +[Seongwon Lee]: https://github.com/dlimpid +[Jan T. Sott]: https://github.com/idleberg + + +## Version 7.5 + +A catch-up release dealing with some of the accumulated contributions. This one +is probably will be the last before the 8.0 which will be slightly backwards +incompatible regarding some advanced use-cases. + +One outstanding change in this version is the addition of 6 languages to the +[hosted script][d]: Markdown, ObjectiveC, CoffeeScript, Apache, Nginx and +Makefile. It now weighs about 6K more but we're going to keep it under 30K. + +New languages: + +- OCaml by [Mehdi Dogguy][mehdid] and [Nicolas Braud-Santoni][nbraud] +- [LiveCode Server][lcs] by [Ralf Bitter][revig] +- Scilab by [Sylvestre Ledru][sylvestre] +- basic support for Makefile by [Ivan Sagalaev][isagalaev] + +Improvements: + +- Ruby's got support for characters like `?A`, `?1`, `?\012` etc. and `%r{..}` + regexps. +- Clojure now allows a function call in the beginning of s-expressions + `(($filter "myCount") (arr 1 2 3 4 5))`. +- Haskell's got new keywords and now recognizes more things like pragmas, + preprocessors, modules, containers, FFIs etc. Thanks to [Zena Treep][treep] + for the implementation and to [Jeremy Hull][sourrust] for guiding it. +- Miscellaneous fixes in PHP, Brainfuck, SCSS, Asciidoc, CMake, Python and F#. + +[mehdid]: https://github.com/mehdid +[nbraud]: https://github.com/nbraud +[revig]: https://github.com/revig +[lcs]: http://livecode.com/developers/guides/server/ +[sylvestre]: https://github.com/sylvestre +[isagalaev]: https://github.com/isagalaev +[treep]: https://github.com/treep +[sourrust]: https://github.com/sourrust +[d]: http://highlightjs.org/download/ + + +## New core developers + +The latest long period of almost complete inactivity in the project coincided +with growing interest to it led to a decision that now seems completely obvious: +we need more core developers. + +So without further ado let me welcome to the core team two long-time +contributors: [Jeremy Hull][] and [Oleg +Efimov][]. + +Hope now we'll be able to work through stuff faster! + +P.S. The historical commit is [here][1] for the record. + +[Jeremy Hull]: https://github.com/sourrust +[Oleg Efimov]: https://github.com/sannis +[1]: https://github.com/isagalaev/highlight.js/commit/f3056941bda56d2b72276b97bc0dd5f230f2473f + + +## Version 7.4 + +This long overdue version is a snapshot of the current source tree with all the +changes that happened during the past year. Sorry for taking so long! + +Along with the changes in code highlight.js has finally got its new home at +, moving from its cradle on Software Maniacs which it +outgrew a long time ago. Be sure to report any bugs about the site to +. + +On to what's new… + +New languages: + +- Handlebars templates by [Robin Ward][] +- Oracle Rules Language by [Jason Jacobson][] +- F# by [Joans Follesø][] +- AsciiDoc and Haml by [Dan Allen][] +- Lasso by [Eric Knibbe][] +- SCSS by [Kurt Emch][] +- VB.NET by [Poren Chiang][] +- Mizar by [Kelley van Evert][] + +[Robin Ward]: https://github.com/eviltrout +[Jason Jacobson]: https://github.com/jayce7 +[Joans Follesø]: https://github.com/follesoe +[Dan Allen]: https://github.com/mojavelinux +[Eric Knibbe]: https://github.com/EricFromCanada +[Kurt Emch]: https://github.com/kemch +[Poren Chiang]: https://github.com/rschiang +[Kelley van Evert]: https://github.com/kelleyvanevert + +New style themes: + +- Monokai Sublime by [noformnocontent][] +- Railscasts by [Damien White][] +- Obsidian by [Alexander Marenin][] +- Docco by [Simon Madine][] +- Mono Blue by [Ivan Sagalaev][] (uses a single color hue for everything) +- Foundation by [Dan Allen][] + +[noformnocontent]: http://nn.mit-license.org/ +[Damien White]: https://github.com/visoft +[Alexander Marenin]: https://github.com/ioncreature +[Simon Madine]: https://github.com/thingsinjars +[Ivan Sagalaev]: https://github.com/isagalaev + +Other notable changes: + +- Corrected many corner cases in CSS. +- Dropped Python 2 version of the build tool. +- Implemented building for the AMD format. +- Updated Rust keywords (thanks to [Dmitry Medvinsky][]). +- Literal regexes can now be used in language definitions. +- CoffeeScript highlighting is now significantly more robust and rich due to + input from [Cédric Néhémie][]. + +[Dmitry Medvinsky]: https://github.com/dmedvinsky +[Cédric Néhémie]: https://github.com/abe33 + + +## Version 7.3 + +- Since this version highlight.js no longer works in IE version 8 and older. + It's made it possible to reduce the library size and dramatically improve code + readability and made it easier to maintain. Time to go forward! + +- New languages: AppleScript (by [Nathan Grigg][ng] and [Dr. Drang][dd]) and + Brainfuck (by [Evgeny Stepanischev][bolk]). + +- Improvements to existing languages: + + - interpreter prompt in Python (`>>>` and `...`) + - @-properties and classes in CoffeeScript + - E4X in JavaScript (by [Oleg Efimov][oe]) + - new keywords in Perl (by [Kirk Kimmel][kk]) + - big Ruby syntax update (by [Vasily Polovnyov][vast]) + - small fixes in Bash + +- Also Oleg Efimov did a great job of moving all the docs for language and style + developers and contributors from the old wiki under the source code in the + "docs" directory. Now these docs are nicely presented at + . + +[ng]: https://github.com/nathan11g +[dd]: https://github.com/drdrang +[bolk]: https://github.com/bolknote +[oe]: https://github.com/Sannis +[kk]: https://github.com/kimmel +[vast]: https://github.com/vast + + +## Version 7.2 + +A regular bug-fix release without any significant new features. Enjoy! + + +## Version 7.1 + +A Summer crop: + +- [Marc Fornos][mf] made the definition for Clojure along with the matching + style Rainbow (which, of course, works for other languages too). +- CoffeeScript support continues to improve getting support for regular + expressions. +- Yoshihide Jimbo ported to highlight.js [five Tomorrow styles][tm] from the + [project by Chris Kempson][tm0]. +- Thanks to [Casey Duncun][cd] the library can now be built in the popular + [AMD format][amd]. +- And last but not least, we've got a fair number of correctness and consistency + fixes, including a pretty significant refactoring of Ruby. + +[mf]: https://github.com/mfornos +[tm]: http://jmblog.github.com/color-themes-for-highlightjs/ +[tm0]: https://github.com/ChrisKempson/Tomorrow-Theme +[cd]: https://github.com/caseman +[amd]: http://requirejs.org/docs/whyamd.html + + +## Version 7.0 + +The reason for the new major version update is a global change of keyword syntax +which resulted in the library getting smaller once again. For example, the +hosted build is 2K less than at the previous version while supporting two new +languages. + +Notable changes: + +- The library now works not only in a browser but also with [node.js][]. It is + installable with `npm install highlight.js`. [API][] docs are available on our + wiki. + +- The new unique feature (apparently) among syntax highlighters is highlighting + *HTTP* headers and an arbitrary language in the request body. The most useful + languages here are *XML* and *JSON* both of which highlight.js does support. + Here's [the detailed post][p] about the feature. + +- Two new style themes: a dark "south" *[Pojoaque][]* by Jason Tate and an + emulation of*XCode* IDE by [Angel Olloqui][ao]. + +- Three new languages: *D* by [Aleksandar Ružičić][ar], *R* by [Joe Cheng][jc] + and *GLSL* by [Sergey Tikhomirov][st]. + +- *Nginx* syntax has become a million times smaller and more universal thanks to + remaking it in a more generic manner that doesn't require listing all the + directives in the known universe. + +- Function titles are now highlighted in *PHP*. + +- *Haskell* and *VHDL* were significantly reworked to be more rich and correct + by their respective maintainers [Jeremy Hull][sr] and [Igor Kalnitsky][ik]. + +And last but not least, many bugs have been fixed around correctness and +language detection. + +Overall highlight.js currently supports 51 languages and 20 style themes. + +[node.js]: http://nodejs.org/ +[api]: http://softwaremaniacs.org/wiki/doku.php/highlight.js:api +[p]: http://softwaremaniacs.org/blog/2012/05/10/http-and-json-in-highlight-js/en/ +[pojoaque]: http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html +[ao]: https://github.com/angelolloqui +[ar]: https://github.com/raleksandar +[jc]: https://github.com/jcheng5 +[st]: https://github.com/tikhomirov +[sr]: https://github.com/sourrust +[ik]: https://github.com/ikalnitsky + + +## Version 6.2 + +A lot of things happened in highlight.js since the last version! We've got nine +new contributors, the discussion group came alive, and the main branch on GitHub +now counts more than 350 followers. Here are most significant results coming +from all this activity: + +- 5 (five!) new languages: Rust, ActionScript, CoffeeScript, MatLab and + experimental support for markdown. Thanks go to [Andrey Vlasovskikh][av], + [Alexander Myadzel][am], [Dmytrii Nagirniak][dn], [Oleg Efimov][oe], [Denis + Bardadym][db] and [John Crepezzi][jc]. + +- 2 new style themes: Monokai by [Luigi Maselli][lm] and stylistic imitation of + another well-known highlighter Google Code Prettify by [Aahan Krish][ak]. + +- A vast number of [correctness fixes and code refactorings][log], mostly made + by [Oleg Efimov][oe] and [Evgeny Stepanischev][es]. + +[av]: https://github.com/vlasovskikh +[am]: https://github.com/myadzel +[dn]: https://github.com/dnagir +[oe]: https://github.com/Sannis +[db]: https://github.com/btd +[jc]: https://github.com/seejohnrun +[lm]: http://grigio.org/ +[ak]: https://github.com/geekpanth3r +[es]: https://github.com/bolknote +[log]: https://github.com/isagalaev/highlight.js/commits/ + + +## Version 6.1 — Solarized + +[Jeremy Hull][jh] has implemented my dream feature — a port of [Solarized][] +style theme famous for being based on the intricate color theory to achieve +correct contrast and color perception. It is now available for highlight.js in +both variants — light and dark. + +This version also adds a new original style Arta. Its author pumbur maintains a +[heavily modified fork of highlight.js][pb] on GitHub. + +[jh]: https://github.com/sourrust +[solarized]: http://ethanschoonover.com/solarized +[pb]: https://github.com/pumbur/highlight.js + + +## Version 6.0 + +New major version of the highlighter has been built on a significantly +refactored syntax. Due to this it's even smaller than the previous one while +supporting more languages! + +New languages are: + +- Haskell by [Jeremy Hull][sourrust] +- Erlang in two varieties — module and REPL — made collectively by [Nikolay + Zakharov][desh], [Dmitry Kovega][arhibot] and [Sergey Ignatov][ignatov] +- Objective C by [Valerii Hiora][vhbit] +- Vala by [Antono Vasiljev][antono] +- Go by [Stephan Kountso][steplg] + +[sourrust]: https://github.com/sourrust +[desh]: http://desh.su/ +[arhibot]: https://github.com/arhibot +[ignatov]: https://github.com/ignatov +[vhbit]: https://github.com/vhbit +[antono]: https://github.com/antono +[steplg]: https://github.com/steplg + +Also this version is marginally faster and fixes a number of small long-standing +bugs. + +Developer overview of the new language syntax is available in a [blog post about +recent beta release][beta]. + +[beta]: http://softwaremaniacs.org/blog/2011/04/25/highlight-js-60-beta/en/ + +P.S. New version is not yet available on a Yandex CDN, so for now you have to +download [your own copy][d]. + +[d]: /soft/highlight/en/download/ + + +## Version 5.14 + +Fixed bugs in HTML/XML detection and relevance introduced in previous +refactoring. + +Also test.html now shows the second best result of language detection by +relevance. + + +## Version 5.13 + +Past weekend began with a couple of simple additions for existing languages but +ended up in a big code refactoring bringing along nice improvements for language +developers. + +### For users + +- Description of C++ has got new keywords from the upcoming [C++ 0x][] standard. +- Description of HTML has got new tags from [HTML 5][]. +- CSS-styles have been unified to use consistent padding and also have lost + pop-outs with names of detected languages. +- [Igor Kalnitsky][ik] has sent two new language descriptions: CMake & VHDL. + +This makes total number of languages supported by highlight.js to reach 35. + +Bug fixes: + +- Custom classes on `
` tags are not being overridden anymore
+- More correct highlighting of code blocks inside non-`
` containers:
+  highlighter now doesn't insist on replacing them with its own container and
+  just replaces the contents.
+- Small fixes in browser compatibility and heuristics.
+
+[c++ 0x]: http://ru.wikipedia.org/wiki/C%2B%2B0x
+[html 5]: http://en.wikipedia.org/wiki/HTML5
+[ik]: http://kalnitsky.org.ua/
+
+### For developers
+
+The most significant change is the ability to include language submodes right
+under `contains` instead of defining explicit named submodes in the main array:
+
+    contains: [
+      'string',
+      'number',
+      {begin: '\\n', end: hljs.IMMEDIATE_RE}
+    ]
+
+This is useful for auxiliary modes needed only in one place to define parsing.
+Note that such modes often don't have `className` and hence won't generate a
+separate `` in the resulting markup. This is similar in effect to
+`noMarkup: true`. All existing languages have been refactored accordingly.
+
+Test file test.html has at last become a real test. Now it not only puts the
+detected language name under the code snippet but also tests if it matches the
+expected one. Test summary is displayed right above all language snippets.
+
+
+## CDN
+
+Fine people at [Yandex][] agreed to host highlight.js on their big fast servers.
+[Link up][l]!
+
+[yandex]: http://yandex.com/
+[l]: http://softwaremaniacs.org/soft/highlight/en/download/
+
+
+## Version 5.10 — "Paris".
+
+Though I'm on a vacation in Paris, I decided to release a new version with a
+couple of small fixes:
+
+- Tomas Vitvar discovered that TAB replacement doesn't always work when used
+  with custom markup in code
+- SQL parsing is even more rigid now and doesn't step over SmallTalk in tests
+
+
+## Version 5.9
+
+A long-awaited version is finally released.
+
+New languages:
+
+- Andrew Fedorov made a definition for Lua
+- a long-time highlight.js contributor [Peter Leonov][pl] made a definition for
+  Nginx config
+- [Vladimir Moskva][vm] made a definition for TeX
+
+[pl]: http://kung-fu-tzu.ru/
+[vm]: http://fulc.ru/
+
+Fixes for existing languages:
+
+- [Loren Segal][ls] reworked the Ruby definition and added highlighting for
+  [YARD][] inline documentation
+- the definition of SQL has become more solid and now it shouldn't be overly
+  greedy when it comes to language detection
+
+[ls]: http://gnuu.org/
+[yard]: http://yardoc.org/
+
+The highlighter has become more usable as a library allowing to do highlighting
+from initialization code of JS frameworks and in ajax methods (see.
+readme.eng.txt).
+
+Also this version drops support for the [WordPress][wp] plugin. Everyone is
+welcome to [pick up its maintenance][p] if needed.
+
+[wp]: http://wordpress.org/
+[p]: http://bazaar.launchpad.net/~isagalaev/+junk/highlight/annotate/342/src/wp_highlight.js.php
+
+
+## Version 5.8
+
+- Jan Berkel has contributed a definition for Scala. +1 to hotness!
+- All CSS-styles are rewritten to work only inside `
` tags to avoid
+  conflicts with host site styles.
+
+
+## Version 5.7.
+
+Fixed escaping of quotes in VBScript strings.
+
+
+## Version 5.5
+
+This version brings a small change: now .ini-files allow digits, underscores and
+square brackets in key names.
+
+
+## Version 5.4
+
+Fixed small but upsetting bug in the packer which caused incorrect highlighting
+of explicitly specified languages. Thanks to Andrew Fedorov for precise
+diagnostics!
+
+
+## Version 5.3
+
+The version to fulfil old promises.
+
+The most significant change is that highlight.js now preserves custom user
+markup in code along with its own highlighting markup. This means that now it's
+possible to use, say, links in code. Thanks to [Vladimir Dolzhenko][vd] for the
+[initial proposal][1] and for making a proof-of-concept patch.
+
+Also in this version:
+
+- [Vasily Polovnyov][vp] has sent a GitHub-like style and has implemented
+  support for CSS @-rules and Ruby symbols.
+- Yura Zaripov has sent two styles: Brown Paper and School Book.
+- Oleg Volchkov has sent a definition for [Parser 3][p3].
+
+[1]: http://softwaremaniacs.org/forum/highlightjs/6612/
+[p3]: http://www.parser.ru/
+[vp]: http://vasily.polovnyov.ru/
+[vd]: http://dolzhenko.blogspot.com/
+
+
+## Version 5.2
+
+- at last it's possible to replace indentation TABs with something sensible
+  (e.g. 2 or 4 spaces)
+- new keywords and built-ins for 1C by Sergey Baranov
+- a couple of small fixes to Apache highlighting
+
+
+## Version 5.1
+
+This is one of those nice version consisting entirely of new and shiny
+contributions!
+
+- [Vladimir Ermakov][vooon] created highlighting for AVR Assembler
+- [Ruslan Keba][rukeba] created highlighting for Apache config file. Also his
+  original visual style for it is now available for all highlight.js languages
+  under the name "Magula".
+- [Shuen-Huei Guan][drake] (aka Drake) sent new keywords for RenderMan
+  languages. Also thanks go to [Konstantin Evdokimenko][ke] for his advice on
+  the matter.
+
+[vooon]: http://vehq.ru/about/
+[rukeba]: http://rukeba.com/
+[drake]: http://drakeguan.org/
+[ke]: http://k-evdokimenko.moikrug.ru/
+
+
+## Version 5.0
+
+The main change in the new major version of highlight.js is a mechanism for
+packing several languages along with the library itself into a single compressed
+file. Now sites using several languages will load considerably faster because
+the library won't dynamically include additional files while loading.
+
+Also this version fixes a long-standing bug with Javascript highlighting that
+couldn't distinguish between regular expressions and division operations.
+
+And as usually there were a couple of minor correctness fixes.
+
+Great thanks to all contributors! Keep using highlight.js.
+
+
+## Version 4.3
+
+This version comes with two contributions from [Jason Diamond][jd]:
+
+- language definition for C# (yes! it was a long-missed thing!)
+- Visual Studio-like highlighting style
+
+Plus there are a couple of minor bug fixes for parsing HTML and XML attributes.
+
+[jd]: http://jason.diamond.name/weblog/
+
+
+## Version 4.2
+
+The biggest news is highlighting for Lisp, courtesy of Vasily Polovnyov. It's
+somewhat experimental meaning that for highlighting "keywords" it doesn't use
+any pre-defined set of a Lisp dialect. Instead it tries to highlight first word
+in parentheses wherever it makes sense. I'd like to ask people programming in
+Lisp to confirm if it's a good idea and send feedback to [the forum][f].
+
+Other changes:
+
+- Smalltalk was excluded from DEFAULT_LANGUAGES to save traffic
+- [Vladimir Epifanov][voldmar] has implemented javascript style switcher for
+  test.html
+- comments now allowed inside Ruby function definition
+- [MEL][] language from [Shuen-Huei Guan][drake]
+- whitespace now allowed between `
` and ``
+- better auto-detection of C++ and PHP
+- HTML allows embedded VBScript (`<% .. %>`)
+
+[f]: http://softwaremaniacs.org/forum/highlightjs/
+[voldmar]: http://voldmar.ya.ru/
+[mel]: http://en.wikipedia.org/wiki/Maya_Embedded_Language
+[drake]: http://drakeguan.org/
+
+
+## Version 4.1
+
+Languages:
+
+- Bash from Vah
+- DOS bat-files from Alexander Makarov (Sam)
+- Diff files from Vasily Polovnyov
+- Ini files from myself though initial idea was from Sam
+
+Styles:
+
+- Zenburn from Vladimir Epifanov, this is an imitation of a
+  [well-known theme for Vim][zenburn].
+- Ascetic from myself, as a realization of ideals of non-flashy highlighting:
+  just one color in only three gradations :-)
+
+In other news. [One small bug][bug] was fixed, built-in keywords were added for
+Python and C++ which improved auto-detection for the latter (it was shame that
+[my wife's blog][alenacpp] had issues with it from time to time). And lastly
+thanks go to Sam for getting rid of my stylistic comments in code that were
+getting in the way of [JSMin][].
+
+[zenburn]: http://en.wikipedia.org/wiki/Zenburn
+[alenacpp]: http://alenacpp.blogspot.com/
+[bug]: http://softwaremaniacs.org/forum/viewtopic.php?id=1823
+[jsmin]: http://code.google.com/p/jsmin-php/
+
+
+## Version 4.0
+
+New major version is a result of vast refactoring and of many contributions.
+
+Visible new features:
+
+- Highlighting of embedded languages. Currently is implemented highlighting of
+  Javascript and CSS inside HTML.
+- Bundled 5 ready-made style themes!
+
+Invisible new features:
+
+- Highlight.js no longer pollutes global namespace. Only one object and one
+  function for backward compatibility.
+- Performance is further increased by about 15%.
+
+Changing of a major version number caused by a new format of language definition
+files. If you use some third-party language files they should be updated.
+
+
+## Version 3.5
+
+A very nice version in my opinion fixing a number of small bugs and slightly
+increased speed in a couple of corner cases. Thanks to everybody who reports
+bugs in he [forum][f] and by email!
+
+There is also a new language — XML. A custom XML formerly was detected as HTML
+and didn't highlight custom tags. In this version I tried to make custom XML to
+be detected and highlighted by its own rules. Which by the way include such
+things as CDATA sections and processing instructions (``).
+
+[f]: http://softwaremaniacs.org/forum/viewforum.php?id=6
+
+
+## Version 3.3
+
+[Vladimir Gubarkov][xonix] has provided an interesting and useful addition.
+File export.html contains a little program that shows and allows to copy and
+paste an HTML code generated by the highlighter for any code snippet. This can
+be useful in situations when one can't use the script itself on a site.
+
+
+[xonix]: http://xonixx.blogspot.com/
+
+
+## Version 3.2 consists completely of contributions:
+
+- Vladimir Gubarkov has described SmallTalk
+- Yuri Ivanov has described 1C
+- Peter Leonov has packaged the highlighter as a Firefox extension
+- Vladimir Ermakov has compiled a mod for phpBB
+
+Many thanks to you all!
+
+
+## Version 3.1
+
+Three new languages are available: Django templates, SQL and Axapta. The latter
+two are sent by [Dmitri Roudakov][1]. However I've almost entirely rewrote an
+SQL definition but I'd never started it be it from the ground up :-)
+
+The engine itself has got a long awaited feature of grouping keywords
+("keyword", "built-in function", "literal"). No more hacks!
+
+[1]: http://roudakov.ru/
+
+
+## Version 3.0
+
+It is major mainly because now highlight.js has grown large and has become
+modular. Now when you pass it a list of languages to highlight it will
+dynamically load into a browser only those languages.
+
+Also:
+
+- Konstantin Evdokimenko of [RibKit][] project has created a highlighting for
+  RenderMan Shading Language and RenderMan Interface Bytestream. Yay for more
+  languages!
+- Heuristics for C++ and HTML got better.
+- I've implemented (at last) a correct handling of backslash escapes in C-like
+  languages.
+
+There is also a small backwards incompatible change in the new version. The
+function initHighlighting that was used to initialize highlighting instead of
+initHighlightingOnLoad a long time ago no longer works. If you by chance still
+use it — replace it with the new one.
+
+[RibKit]: http://ribkit.sourceforge.net/
+
+
+## Version 2.9
+
+Highlight.js is a parser, not just a couple of regular expressions. That said
+I'm glad to announce that in the new version 2.9 has support for:
+
+- in-string substitutions for Ruby -- `#{...}`
+- strings from from numeric symbol codes (like #XX) for Delphi
+
+
+## Version 2.8
+
+A maintenance release with more tuned heuristics. Fully backwards compatible.
+
+
+## Version 2.7
+
+- Nikita Ledyaev presents highlighting for VBScript, yay!
+- A couple of bugs with escaping in strings were fixed thanks to Mickle
+- Ongoing tuning of heuristics
+
+Fixed bugs were rather unpleasant so I encourage everyone to upgrade!
+
+
+## Version 2.4
+
+- Peter Leonov provides another improved highlighting for Perl
+- Javascript gets a new kind of keywords — "literals". These are the words
+  "true", "false" and "null"
+
+Also highlight.js homepage now lists sites that use the library. Feel free to
+add your site by [dropping me a message][mail] until I find the time to build a
+submit form.
+
+[mail]: mailto:Maniac@SoftwareManiacs.Org
+
+
+## Version 2.3
+
+This version fixes IE breakage in previous version. My apologies to all who have
+already downloaded that one!
+
+
+## Version 2.2
+
+- added highlighting for Javascript
+- at last fixed parsing of Delphi's escaped apostrophes in strings
+- in Ruby fixed highlighting of keywords 'def' and 'class', same for 'sub' in
+  Perl
+
+
+## Version 2.0
+
+- Ruby support by [Anton Kovalyov][ak]
+- speed increased by orders of magnitude due to new way of parsing
+- this same way allows now correct highlighting of keywords in some tricky
+  places (like keyword "End" at the end of Delphi classes)
+
+[ak]: http://anton.kovalyov.net/
+
+
+## Version 1.0
+
+Version 1.0 of javascript syntax highlighter is released!
+
+It's the first version available with English description. Feel free to post
+your comments and question to [highlight.js forum][forum]. And don't be afraid
+if you find there some fancy Cyrillic letters -- it's for Russian users too :-)
+
+[forum]: http://softwaremaniacs.org/forum/viewforum.php?id=6
diff --git a/highlight-js/LICENSE b/highlight-js/LICENSE
new file mode 100644
index 0000000..422deb7
--- /dev/null
+++ b/highlight-js/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2006, Ivan Sagalaev
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of highlight.js nor the names of its contributors 
+      may be used to endorse or promote products derived from this software 
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/highlight-js/README.md b/highlight-js/README.md
new file mode 100644
index 0000000..6cf5235
--- /dev/null
+++ b/highlight-js/README.md
@@ -0,0 +1,186 @@
+# Highlight.js
+
+[![Build Status](https://travis-ci.org/highlightjs/highlight.js.svg?branch=master)](https://travis-ci.org/highlightjs/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.
+
+## Getting Started
+
+The bare minimum for using highlight.js on a web page is linking to the
+library along with one of the styles and calling
+[`initHighlightingOnLoad`][1]:
+
+```html
+
+
+
+```
+
+This will find and highlight code inside of `
` tags; it tries
+to detect the language automatically. If automatic detection doesn’t
+work for you, you can specify the language in the `class` attribute:
+
+```html
+
...
+``` + +The list of supported language classes is available in the [class +reference][2]. Classes can also be prefixed with either `language-` or +`lang-`. + +To make arbitrary text look like code, but without highlighting, use the +`plaintext` class: + +```html +
...
+``` + +To disable highlighting altogether use the `nohighlight` class: + +```html +
...
+``` + +## Custom Initialization + +When you need a bit more control over the initialization of +highlight.js, you can use the [`highlightBlock`][3] and [`configure`][4] +functions. This allows you to control *what* to highlight and *when*. + +Here’s an equivalent way to calling [`initHighlightingOnLoad`][1] using +jQuery: + +```javascript +$(document).ready(function() { + $('pre code').each(function(i, block) { + hljs.highlightBlock(block); + }); +}); +``` + +You can use any tags instead of `
` to mark up your code. If
+you don't use a container that preserves line breaks you will need to
+configure highlight.js to use the `
` tag: + +```javascript +hljs.configure({useBR: true}); + +$('div.code').each(function(i, block) { + hljs.highlightBlock(block); +}); +``` + +For other options refer to the documentation for [`configure`][4]. + + +## Web Workers + +You can run highlighting inside a web worker to avoid freezing the browser +window while dealing with very big chunks of code. + +In your main script: + +```javascript +addEventListener('load', function() { + var code = document.querySelector('#code'); + var worker = new Worker('worker.js'); + worker.onmessage = function(event) { code.innerHTML = event.data; } + worker.postMessage(code.textContent); +}) +``` + +In worker.js: + +```javascript +onmessage = function(event) { + importScripts('/highlight.pack.js'); + var result = self.hljs.highlightAuto(event.data); + postMessage(result.value); +} +``` + + +## Getting the Library + +You can get highlight.js as a hosted, or custom-build, browser script or +as a server module. Right out of the box the browser script supports +both AMD and CommonJS, so if you wish you can use RequireJS or +Browserify without having to build from source. The server module also +works perfectly fine with Browserify, but there is the option to use a +build specific to browsers rather than something meant for a server. +Head over to the [download page][5] for all the options. + +**Don't link to GitHub directly.** The library is not supposed to work straight +from the source, it requires building. If none of the pre-packaged options +work for you refer to the [building documentation][6]. + +**The CDN-hosted package doesn't have all the languages.** Otherwise it'd be +too big. If you don't see the language you need in the ["Common" section][5], +it can be added manually: + +```html + +``` + +**On Almond.** You need to use the optimizer to give the module a name. For +example: + +``` +r.js -o name=hljs paths.hljs=/path/to/highlight out=highlight.js +``` + + +### CommonJS + +You can import Highlight.js as a CommonJS-module: + +```bash +npm install highlight.js --save +``` + +In your application: + +```javascript +import hljs from 'highlight.js'; +``` + +The default import imports all languages! Therefore it is likely to be more efficient to import only the library and the languages you need: + +```javascript +import hljs from 'highlight.js/lib/highlight'; +import javascript from 'highlight.js/lib/languages/javascript'; +hljs.registerLanguage('javascript', javascript); +``` + +To set the syntax highlighting style, if your build tool processes CSS from your JavaScript entry point, you can import the stylesheet directly into your CommonJS-module: + +```javascript +import hljs from 'highlight.js/lib/highlight'; +import 'highlight.js/styles/github.css' +``` + +## License + +Highlight.js is released under the BSD License. See [LICENSE][7] file +for details. + +## Links + +The official site for the library is at . + +Further in-depth documentation for the API and other topics is at +. + +Authors and contributors are listed in the [AUTHORS.en.txt][8] file. + +[1]: http://highlightjs.readthedocs.io/en/latest/api.html#inithighlightingonload +[2]: http://highlightjs.readthedocs.io/en/latest/css-classes-reference.html +[3]: http://highlightjs.readthedocs.io/en/latest/api.html#highlightblock-block +[4]: http://highlightjs.readthedocs.io/en/latest/api.html#configure-options +[5]: https://highlightjs.org/download/ +[6]: http://highlightjs.readthedocs.io/en/latest/building-testing.html +[7]: https://github.com/highlightjs/highlight.js/blob/master/LICENSE +[8]: https://github.com/highlightjs/highlight.js/blob/master/AUTHORS.en.txt diff --git a/highlight-js/README.ru.md b/highlight-js/README.ru.md new file mode 100644 index 0000000..44285f6 --- /dev/null +++ b/highlight-js/README.ru.md @@ -0,0 +1,142 @@ +# Highlight.js + +Highlight.js — это инструмент для подсветки синтаксиса, написанный на JavaScript. Он работает +и в браузере, и на сервере. Он работает с практически любой HTML разметкой, не +зависит от каких-либо фреймворков и умеет автоматически определять язык. + + +## Начало работы + +Минимум, что нужно сделать для использования highlight.js на веб-странице — это +подключить библиотеку, CSS-стили и вызывать [`initHighlightingOnLoad`][1]: + +```html + + + +``` + +Библиотека найдёт и раскрасит код внутри тегов `
`, попытавшись
+автоматически определить язык. Когда автоопределение не срабатывает, можно явно
+указать язык в атрибуте class:
+
+```html
+
...
+``` + +Список поддерживаемых классов языков доступен в [справочнике по классам][2]. +Класс также можно предварить префиксами `language-` или `lang-`. + +Чтобы отключить подсветку для какого-то блока, используйте класс `nohighlight`: + +```html +
...
+``` + +## Инициализация вручную + +Чтобы иметь чуть больше контроля за инициализацией подсветки, вы можете +использовать функции [`highlightBlock`][3] и [`configure`][4]. Таким образом +можно управлять тем, *что* и *когда* подсвечивать. + +Вот пример инициализации, эквивалентной вызову [`initHighlightingOnLoad`][1], но +с использованием jQuery: + +```javascript +$(document).ready(function() { + $('pre code').each(function(i, block) { + hljs.highlightBlock(block); + }); +}); +``` + +Вы можете использовать любые теги разметки вместо `
`. Если
+используете контейнер, не сохраняющий переводы строк, вам нужно сказать
+highlight.js использовать для них тег `
`: + +```javascript +hljs.configure({useBR: true}); + +$('div.code').each(function(i, block) { + hljs.highlightBlock(block); +}); +``` + +Другие опции можно найти в документации функции [`configure`][4]. + + +## Web Workers + +Подсветку можно запустить внутри web worker'а, чтобы окно +браузера не подтормаживало при работе с большими кусками кода. + +В основном скрипте: + +```javascript +addEventListener('load', function() { + var code = document.querySelector('#code'); + var worker = new Worker('worker.js'); + worker.onmessage = function(event) { code.innerHTML = event.data; } + worker.postMessage(code.textContent); +}) +``` + +В worker.js: + +```javascript +onmessage = function(event) { + importScripts('/highlight.pack.js'); + var result = self.hljs.highlightAuto(event.data); + postMessage(result.value); +} +``` + + +## Установка библиотеки + +Highlight.js можно использовать в браузере прямо с CDN хостинга или скачать +индивидуальную сборку, а также установив модуль на сервере. На +[странице загрузки][5] подробно описаны все варианты. + +**Не подключайте GitHub напрямую.** Библиотека не предназначена для +использования в виде исходного кода, а требует отдельной сборки. Если вам не +подходит ни один из готовых вариантов, читайте [документацию по сборке][6]. + +**Файл на CDN содержит не все языки.** Иначе он будет слишком большого размера. +Если нужного вам языка нет в [категории "Common"][5], можно дообавить его +вручную: + +```html + +``` + +**Про Almond.** Нужно задать имя модуля в оптимизаторе, например: + +``` +r.js -o name=hljs paths.hljs=/path/to/highlight out=highlight.js +``` + + +## Лицензия + +Highlight.js распространяется под лицензией BSD. Подробнее читайте файл +[LICENSE][7]. + + +## Ссылки + +Официальный сайт билиотеки расположен по адресу . + +Более подробная документация по API и другим темам расположена на +. + +Авторы и контрибьюторы перечислены в файле [AUTHORS.ru.txt][8] file. + +[1]: http://highlightjs.readthedocs.io/en/latest/api.html#inithighlightingonload +[2]: http://highlightjs.readthedocs.io/en/latest/css-classes-reference.html +[3]: http://highlightjs.readthedocs.io/en/latest/api.html#highlightblock-block +[4]: http://highlightjs.readthedocs.io/en/latest/api.html#configure-options +[5]: https://highlightjs.org/download/ +[6]: http://highlightjs.readthedocs.io/en/latest/building-testing.html +[7]: https://github.com/highlightjs/highlight.js/blob/master/LICENSE +[8]: https://github.com/highlightjs/highlight.js/blob/master/AUTHORS.ru.txt diff --git a/highlight-js/demo/demo.js b/highlight-js/demo/demo.js new file mode 100644 index 0000000..3516cb0 --- /dev/null +++ b/highlight-js/demo/demo.js @@ -0,0 +1,119 @@ +(function() { + 'use strict'; + + var $window = $(window), + $languages = $('#languages div'), + $linkTitle = $('link[title]'), + $categoryContainer = $('#categories'), + $styleContainer = $('#styles'); + + function resizeLists() { + var screenHeight = $window.height() + + $categoryContainer.css('max-height', screenHeight / 4); + $categoryContainer.perfectScrollbar('update'); + $styleContainer.height( + screenHeight - $styleContainer.position().top - 20 + ); + $styleContainer.perfectScrollbar('update'); + } + + function selectCategory(category) { + $languages.each(function(i, language) { + var $language = $(language); + + if ($language.hasClass(category)) { + var code = $language.find('code'); + + if (!code.hasClass('hljs')) { + hljs.highlightBlock(code.get(0)); + } + + $language.show(); + } else { + $language.hide(); + } + }); + + $(document).scrollTop(0); + } + + function categoryKey(c) { + return c === 'common' ? '' : c === 'misc' ? 'z' : c === 'all' ? 'zz' : c; + } + + function initCategories() { + var $categories, categoryNames; + var categories = {}; + + $languages.each(function(i, div) { + if (!div.className) { + div.className += 'misc'; + } + div.className += ' all'; + div.className.split(' ').forEach(function(c) { + categories[c] = (categories[c] || 0) + 1; + }); + }); + + categoryNames = Object.keys(categories); + + categoryNames.sort(function(a, b) { + a = categoryKey(a); + b = categoryKey(b); + return a < b ? -1 : a > b ? 1 : 0; + }); + + categoryNames.forEach(function(c) { + $categoryContainer.append( + '
  • ' + c + ' (' + categories[c] +')
  • ' + ); + }); + + $categories = $categoryContainer.find('li'); + + $categories.click(function() { + var $category = $(this); + + $categories.removeClass('current'); + $category.addClass('current'); + selectCategory($category.data('category')); + }); + + $categories.first().click(); + $categoryContainer.perfectScrollbar(); + } + + function selectStyle(style) { + $linkTitle.each(function(i, link) { + link.disabled = (link.title !== style); + }); + } + + function initStyles() { + var $styles; + + $linkTitle.each(function(i, link) { + $styleContainer.append('
  • ' + link.title + '
  • '); + }); + + $styles = $styleContainer.find('li'); + + $styles.click(function() { + var $style = $(this); + + $styles.removeClass('current'); + $style.addClass('current'); + selectStyle($style.text()); + }); + $styles.first().click(); + $styleContainer.perfectScrollbar(); + } + + $(function() { + initCategories(); + initStyles(); + $window.resize(resizeLists); + resizeLists(); + }); +}).call(this); diff --git a/highlight-js/demo/index.html b/highlight-js/demo/index.html new file mode 100644 index 0000000..14becb4 --- /dev/null +++ b/highlight-js/demo/index.html @@ -0,0 +1,55 @@ + + + + + + highlight.js demo + + + + + <% _.each(styles, function(style) { %> + + <% }); %> + + + + +
    + +
    + <% _.each(blobs, function(blob) { %> + <% var categories = blob.fileInfo.Category; %> +
    class="<%= categories.join(' ') %>"<% } %>> +

    <%- blob.fileInfo.Language %>

    +
    <%- blob.result %>
    +
    + <% }); %> +
    + +
    + + + + + + + diff --git a/highlight-js/demo/jquery-2.1.1.min.js b/highlight-js/demo/jquery-2.1.1.min.js new file mode 100644 index 0000000..e5ace11 --- /dev/null +++ b/highlight-js/demo/jquery-2.1.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
    ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b) +},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n(" diff --git a/highlight-js/test/detect/xquery/default.txt b/highlight-js/test/detect/xquery/default.txt new file mode 100644 index 0000000..9ac5efd --- /dev/null +++ b/highlight-js/test/detect/xquery/default.txt @@ -0,0 +1,20 @@ +declare option output:method 'json'; + +( +let $map := map { 'R': 'red', 'G': 'green', 'B': 'blue' } +return ( + $map?* (: 1. returns all values; same as: map:keys($map) ! $map(.) :), + $map?R (: 2. returns the value associated with the key 'R'; same as: $map('R') :), + $map?('G','B') (: 3. returns the values associated with the key 'G' and 'B' :) +), + +('A', 'B', 'C') => count(), + +for $country in db:open('factbook')//country +where $country/@population > 100000000 +let $name := $country/name[1] +for $city in $country//city[population > 1000000] +group by $name +return { $city/name } + +) diff --git a/highlight-js/test/detect/yaml/default.txt b/highlight-js/test/detect/yaml/default.txt new file mode 100644 index 0000000..49c4939 --- /dev/null +++ b/highlight-js/test/detect/yaml/default.txt @@ -0,0 +1,39 @@ +--- +# comment +string_1: "Bar" +string_2: 'bar' +string_3: bar +inline_keys_ignored: sompath/name/file.jpg +keywords_in_yaml: + - true + - false + - TRUE + - FALSE + - 21 + - 21.0 + - !!str 123 +"quoted_key": &foobar + bar: foo + foo: + "foo": bar + +reference: *foobar + +multiline_1: | + Multiline + String +multiline_2: > + Multiline + String +multiline_3: " + Multiline string + " + +ansible_variables: "foo {{variable}}" + +array_nested: +- a +- b: 1 + c: 2 +- b +- comment diff --git a/highlight-js/test/detect/zephir/default.txt b/highlight-js/test/detect/zephir/default.txt new file mode 100644 index 0000000..8142e7f --- /dev/null +++ b/highlight-js/test/detect/zephir/default.txt @@ -0,0 +1,55 @@ +function testBefore( a, var b = 5, int c = 10) +{ + a->method1(); + + return b + c; +} + +namespace Test; + +use RuntimeException as RE; + +/** + * Example comment + */ +class Test extends CustomClass implements TestInterface +{ + const C1 = null; + + // Magic constant: http://php.net/manual/ru/language.constants.predefined.php + const className = __CLASS__; + + public function method1() + { + int a = 1, b = 2; + return a + b; + } + + // See fn is allowed like shortcut + public fn method2() -> + { + call_user_func(function() { echo "hello"; }); + + + [1, 2, 3, 4, 5]->walk( + function(int! x) { + return x * x; + } + ); + + [1, 2, 3, 4, 5]->walk( + function(_, int key) { echo key; } + ); + + array input = [1, 2, 3, 4, 5]; + + input->walk( + function(_, int key) { echo key; } + ); + + + input->map(x => x * x); + + return this; + } +} diff --git a/highlight-js/test/fixtures/expect/brInPre.txt b/highlight-js/test/fixtures/expect/brInPre.txt new file mode 100644 index 0000000..e065147 --- /dev/null +++ b/highlight-js/test/fixtures/expect/brInPre.txt @@ -0,0 +1 @@ +>> '\x41\x42\x43'
    'ABC'


    >> '\x61\x62\x63'
    'abc' diff --git a/highlight-js/test/fixtures/expect/custommarkup.txt b/highlight-js/test/fixtures/expect/custommarkup.txt new file mode 100644 index 0000000..f0304c2 --- /dev/null +++ b/highlight-js/test/fixtures/expect/custommarkup.txt @@ -0,0 +1,3 @@ +<div id="contents"> + <p>Hello, World!Goodbye, cruel world! +</div> diff --git a/highlight-js/test/fixtures/expect/customtabreplace.txt b/highlight-js/test/fixtures/expect/customtabreplace.txt new file mode 100644 index 0000000..d217f1c --- /dev/null +++ b/highlight-js/test/fixtures/expect/customtabreplace.txt @@ -0,0 +1,4 @@ +for x in [1, 2, 3]: + count(x) + if x == 3: + count(x + 1) \ No newline at end of file diff --git a/highlight-js/test/fixtures/expect/endsWithParentVariants.txt b/highlight-js/test/fixtures/expect/endsWithParentVariants.txt new file mode 100644 index 0000000..15d7617 --- /dev/null +++ b/highlight-js/test/fixtures/expect/endsWithParentVariants.txt @@ -0,0 +1 @@ +( [ ( ) ] ) diff --git a/highlight-js/test/fixtures/expect/explicit1.txt b/highlight-js/test/fixtures/expect/explicit1.txt new file mode 100644 index 0000000..59544c1 --- /dev/null +++ b/highlight-js/test/fixtures/expect/explicit1.txt @@ -0,0 +1,2 @@ +for x in [1, 2, 3]: + count(x) \ No newline at end of file diff --git a/highlight-js/test/fixtures/expect/explicit2.txt b/highlight-js/test/fixtures/expect/explicit2.txt new file mode 100644 index 0000000..1a49fda --- /dev/null +++ b/highlight-js/test/fixtures/expect/explicit2.txt @@ -0,0 +1,2 @@ +@import "compass/reset"; +$colorGreenDark: darken($colorGreen, 10); diff --git a/highlight-js/test/fixtures/expect/languagealias.txt b/highlight-js/test/fixtures/expect/languagealias.txt new file mode 100644 index 0000000..571f200 --- /dev/null +++ b/highlight-js/test/fixtures/expect/languagealias.txt @@ -0,0 +1 @@ +var x = '<p>this should <b>not</b> be highlighted as <em>HTML</em>'; \ No newline at end of file diff --git a/highlight-js/test/fixtures/expect/sublanguages.txt b/highlight-js/test/fixtures/expect/sublanguages.txt new file mode 100644 index 0000000..2a89d6a --- /dev/null +++ b/highlight-js/test/fixtures/expect/sublanguages.txt @@ -0,0 +1,4 @@ +<? echo 'php'; /* ?> */ ?> +<body> +<script>document.write('Legacy code');</script> +</body> diff --git a/highlight-js/test/fixtures/expect/tabreplace.txt b/highlight-js/test/fixtures/expect/tabreplace.txt new file mode 100644 index 0000000..01d1c57 --- /dev/null +++ b/highlight-js/test/fixtures/expect/tabreplace.txt @@ -0,0 +1,2 @@ +for x in [1, 2, 3]: + count(x) \ No newline at end of file diff --git a/highlight-js/test/fixtures/expect/useBr.txt b/highlight-js/test/fixtures/expect/useBr.txt new file mode 100644 index 0000000..7707a4c --- /dev/null +++ b/highlight-js/test/fixtures/expect/useBr.txt @@ -0,0 +1 @@ +<head>
    <meta charset="utf-8">
    <title></title>
    </head> diff --git a/highlight-js/test/fixtures/index.html b/highlight-js/test/fixtures/index.html new file mode 100644 index 0000000..aba3e89 --- /dev/null +++ b/highlight-js/test/fixtures/index.html @@ -0,0 +1,146 @@ + + + + + highlight.js test + + +
    + + +
    for x in [1, 2, 3]:
    +  count(x)
    + + +
    for x in [1, 2, 3]:
    +  count(x)
    + + +
    for x in [1, 2, 3]:
    +  count(x)
    + + +
    @import "compass/reset";
    +$colorGreenDark: darken($colorGreen, 10);
    +
    + + +
    @import "compass/reset";
    +$colorGreenDark: darken($colorGreen, 10);
    +
    + +
    + +
    + + +
    for x in [1, 2, 3]:
    +	count(x)
    + + +
    <div id="contents">
    +  <p>Hello, World!Goodbye, cruel world!
    +</div>
    +
    + + +
    for x in [1, 2, 3]:
    +	count(x)
    +	if x == 3:
    +		count(x + 1)
    + + +
    >> '\x41\x42\x43'
    'ABC'


    >> '\x61\x62\x63'
    'abc' +
    + +
    + +
    + + +
    var x = '<p>this should <b>not</b> be highlighted as <em>HTML</em>';
    + +
    + +
    + + +
    <div id="contents">
    +  <p>Hello, World!
    +</div>
    +
    <div id="contents">
    +  <p>Hello, World!
    +</div>
    +
    <div id="contents">
    +  <p>Hello, World!
    +</div>
    +
    <div id="contents">
    +  <p>Hello, World!
    +</div>
    + + +
    Computer output
    + + +
    for x in [1, 2, 3]: count(x)
    + + +
    for x in [1, 2, 3]: count(x)
    + + +
    for x in [1, 2, 3]: count(x)
    + + +
    var x = 'foo';
    +
    var x = 'foo';
    + +
    + + +
    <? echo 'php'; /* ?> */ ?>
    +<body>
    +<script>document.write('Legacy code');</script>
    +</body>
    +
    + +
    + + +
    <?xml version="1.0"?>
    +    <response value="ok" xml:lang="en"></response>
    + + +
    <?xml version="1.0"?>
    +    <response value="ok" xml:lang="en"></response>
    + + +
    <?xml version="1.0"?>
    +    <response value="ok" xml:lang="en"></response>
    + + +
    <?xml version="1.0"?>
    +    <response value="ok" xml:lang="en"></response>
    + +
    + +
    + +
    <head>
    <meta charset="utf-8">
    <title></title>
    </head>
    + +
    <head>
    + <meta charset="utf-8">
    + <title></title>
    +</head>
    + +
    <head>
    + <meta charset="utf-8">
    + <title></title>
    +</head>
    + +
    + +
    ( [ ( ) ] )
    + + + + diff --git a/highlight-js/test/fixtures/nested.js b/highlight-js/test/fixtures/nested.js new file mode 100644 index 0000000..81e17d3 --- /dev/null +++ b/highlight-js/test/fixtures/nested.js @@ -0,0 +1,17 @@ +module.exports = function(hljs) { + var BODY = { + className: 'body', endsWithParent: true + }; + var LIST = { + className: 'list', + variants: [ + {begin: /\(/, end: /\)/}, + {begin: /\[/, end: /\]/} + ], + contains: [BODY] + }; + BODY.contains = [LIST]; + return { + contains: [LIST] + } +}; diff --git a/highlight-js/test/index.js b/highlight-js/test/index.js new file mode 100644 index 0000000..2657a31 --- /dev/null +++ b/highlight-js/test/index.js @@ -0,0 +1,22 @@ +'use strict'; + +// Tests specific to the API exposed inside the hljs object. +// Right now, that only includes tests for several common regular expressions. +require('./api'); + +// Tests for auto detection of languages via `highlightAuto`. +require('./detect'); + +// HTML markup tests for particular languages. Usually when there is an +// incorrect highlighting of one language, once the bug get fixed, the +// expected markup will be added into the `test/markup` folder to keep +// theses highlighting errors from cropping up again. +require('./markup'); + +// Tests meant for the browser only. Using the `test/fixtures/index.html` file +// along with `jsdom` these tests check for things like: custom markup already +// existing in the code being highlighted, blocks that disable highlighting, +// and several other cases. Do note that the `test/fixtures/index.html` file +// isn't actually used to test inside a browser but `jsdom` acts as a virtual +// browser inside of node.js and runs together with all the other tests. +require('./special'); diff --git a/highlight-js/test/markup/accesslog/default.expect.txt b/highlight-js/test/markup/accesslog/default.expect.txt new file mode 100644 index 0000000..4e4dc30 --- /dev/null +++ b/highlight-js/test/markup/accesslog/default.expect.txt @@ -0,0 +1 @@ +20.164.151.111 - - [20/Aug/2015:22:20:18 -0400] "GET /mywebpage/index.php HTTP/1.1" 403 772 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1" diff --git a/highlight-js/test/markup/accesslog/default.txt b/highlight-js/test/markup/accesslog/default.txt new file mode 100644 index 0000000..a9d4325 --- /dev/null +++ b/highlight-js/test/markup/accesslog/default.txt @@ -0,0 +1 @@ +20.164.151.111 - - [20/Aug/2015:22:20:18 -0400] "GET /mywebpage/index.php HTTP/1.1" 403 772 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1" diff --git a/highlight-js/test/markup/actionscript/method-call.expect.txt b/highlight-js/test/markup/actionscript/method-call.expect.txt new file mode 100644 index 0000000..752a397 --- /dev/null +++ b/highlight-js/test/markup/actionscript/method-call.expect.txt @@ -0,0 +1 @@ +x.get(0); diff --git a/highlight-js/test/markup/actionscript/method-call.txt b/highlight-js/test/markup/actionscript/method-call.txt new file mode 100644 index 0000000..1449787 --- /dev/null +++ b/highlight-js/test/markup/actionscript/method-call.txt @@ -0,0 +1 @@ +x.get(0); diff --git a/highlight-js/test/markup/arcade/profile.expect.txt b/highlight-js/test/markup/arcade/profile.expect.txt new file mode 100644 index 0000000..e7ace43 --- /dev/null +++ b/highlight-js/test/markup/arcade/profile.expect.txt @@ -0,0 +1,9 @@ +/* + Isolated test for the most recent version +*/ +function offsetPopulation(offset){ + var popDensity = Round( $feature.POPULATION / AreaGeodetic(Geometry($feature), "square-kilometers") ); + var geom = Geometry({ 'x': offset.x, 'y': offset.y, 'spatialReference':{'wkid':102100} }); + var myLayer = FeatureSet($map, ["POPULATION", "ELECTION-DATA"]); + return popDensity; +} \ No newline at end of file diff --git a/highlight-js/test/markup/arcade/profile.txt b/highlight-js/test/markup/arcade/profile.txt new file mode 100644 index 0000000..b4f54b0 --- /dev/null +++ b/highlight-js/test/markup/arcade/profile.txt @@ -0,0 +1,9 @@ +/* + Isolated test for the most recent version +*/ +function offsetPopulation(offset){ + var popDensity = Round( $feature.POPULATION / AreaGeodetic(Geometry($feature), "square-kilometers") ); + var geom = Geometry({ 'x': offset.x, 'y': offset.y, 'spatialReference':{'wkid':102100} }); + var myLayer = FeatureSet($map, ["POPULATION", "ELECTION-DATA"]); + return popDensity; +} diff --git a/highlight-js/test/markup/aspectj/intertype-constructor.expect.txt b/highlight-js/test/markup/aspectj/intertype-constructor.expect.txt new file mode 100644 index 0000000..9cfa198 --- /dev/null +++ b/highlight-js/test/markup/aspectj/intertype-constructor.expect.txt @@ -0,0 +1,3 @@ +public MyClass.new() throws Exception{ + // intertype constructor body +} diff --git a/highlight-js/test/markup/aspectj/intertype-constructor.txt b/highlight-js/test/markup/aspectj/intertype-constructor.txt new file mode 100644 index 0000000..0199ef9 --- /dev/null +++ b/highlight-js/test/markup/aspectj/intertype-constructor.txt @@ -0,0 +1,3 @@ +public MyClass.new() throws Exception{ + // intertype constructor body +} diff --git a/highlight-js/test/markup/aspectj/intertype-method.expect.txt b/highlight-js/test/markup/aspectj/intertype-method.expect.txt new file mode 100644 index 0000000..09b1c54 --- /dev/null +++ b/highlight-js/test/markup/aspectj/intertype-method.expect.txt @@ -0,0 +1,6 @@ +public void MyClass.doSomething() throws Exception{ + // intertype method body +} +public void A.doSomething(int param1){ + // intertype method body +} diff --git a/highlight-js/test/markup/aspectj/intertype-method.txt b/highlight-js/test/markup/aspectj/intertype-method.txt new file mode 100644 index 0000000..99787a0 --- /dev/null +++ b/highlight-js/test/markup/aspectj/intertype-method.txt @@ -0,0 +1,6 @@ +public void MyClass.doSomething() throws Exception{ + // intertype method body +} +public void A.doSomething(int param1){ + // intertype method body +} diff --git a/highlight-js/test/markup/bash/no-numbers.expect.txt b/highlight-js/test/markup/bash/no-numbers.expect.txt new file mode 100644 index 0000000..33fc753 --- /dev/null +++ b/highlight-js/test/markup/bash/no-numbers.expect.txt @@ -0,0 +1,3 @@ +# numbers aren't highlighted in bash as their semantics is +# not strictly defined for command line parameters +$ tail -10 access.log diff --git a/highlight-js/test/markup/bash/no-numbers.txt b/highlight-js/test/markup/bash/no-numbers.txt new file mode 100644 index 0000000..8e94063 --- /dev/null +++ b/highlight-js/test/markup/bash/no-numbers.txt @@ -0,0 +1,3 @@ +# numbers aren't highlighted in bash as their semantics is +# not strictly defined for command line parameters +$ tail -10 access.log diff --git a/highlight-js/test/markup/ceylon/nested-comments.expect.txt b/highlight-js/test/markup/ceylon/nested-comments.expect.txt new file mode 100644 index 0000000..85c529d --- /dev/null +++ b/highlight-js/test/markup/ceylon/nested-comments.expect.txt @@ -0,0 +1,5 @@ +/* + /* + Ceylon has nested comments. + */ + */ diff --git a/highlight-js/test/markup/ceylon/nested-comments.txt b/highlight-js/test/markup/ceylon/nested-comments.txt new file mode 100644 index 0000000..39b49eb --- /dev/null +++ b/highlight-js/test/markup/ceylon/nested-comments.txt @@ -0,0 +1,5 @@ +/* + /* + Ceylon has nested comments. + */ + */ diff --git a/highlight-js/test/markup/clojure-repl/prompt.expect.txt b/highlight-js/test/markup/clojure-repl/prompt.expect.txt new file mode 100644 index 0000000..ee50199 --- /dev/null +++ b/highlight-js/test/markup/clojure-repl/prompt.expect.txt @@ -0,0 +1,2 @@ +user=> +=> diff --git a/highlight-js/test/markup/clojure-repl/prompt.txt b/highlight-js/test/markup/clojure-repl/prompt.txt new file mode 100644 index 0000000..a410dda --- /dev/null +++ b/highlight-js/test/markup/clojure-repl/prompt.txt @@ -0,0 +1,2 @@ +user=> +=> diff --git a/highlight-js/test/markup/clojure/hint_col.expect.txt b/highlight-js/test/markup/clojure/hint_col.expect.txt new file mode 100644 index 0000000..06e96c0 --- /dev/null +++ b/highlight-js/test/markup/clojure/hint_col.expect.txt @@ -0,0 +1,34 @@ +(import [java.lang.annotation Retention RetentionPolicy Target ElementType] + [javax.xml.ws WebServiceRef WebServiceRefs]) + +(definterface Foo (foo [])) + +;; annotation on type +(deftype ^{Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + Bar [^int a + ;; on field + ^{:tag int + Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + b] + ;; on method + Foo (^{Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + foo [this] 42)) + +(seq (.getAnnotations Bar)) +(seq (.getAnnotations (.getField Bar "b"))) +(seq (.getAnnotations (.getMethod Bar "foo" nil))) diff --git a/highlight-js/test/markup/clojure/hint_col.txt b/highlight-js/test/markup/clojure/hint_col.txt new file mode 100644 index 0000000..9584dec --- /dev/null +++ b/highlight-js/test/markup/clojure/hint_col.txt @@ -0,0 +1,34 @@ +(import [java.lang.annotation Retention RetentionPolicy Target ElementType] + [javax.xml.ws WebServiceRef WebServiceRefs]) + +(definterface Foo (foo [])) + +;; annotation on type +(deftype ^{Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + Bar [^int a + ;; on field + ^{:tag int + Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + b] + ;; on method + Foo (^{Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + foo [this] 42)) + +(seq (.getAnnotations Bar)) +(seq (.getAnnotations (.getField Bar "b"))) +(seq (.getAnnotations (.getMethod Bar "foo" nil))) diff --git a/highlight-js/test/markup/clojure/symbols-numbers.expect.txt b/highlight-js/test/markup/clojure/symbols-numbers.expect.txt new file mode 100644 index 0000000..f9c48b2 --- /dev/null +++ b/highlight-js/test/markup/clojure/symbols-numbers.expect.txt @@ -0,0 +1 @@ +(def +x [(a 1) +2 -3.0 y-5]) diff --git a/highlight-js/test/markup/clojure/symbols-numbers.txt b/highlight-js/test/markup/clojure/symbols-numbers.txt new file mode 100644 index 0000000..01e839b --- /dev/null +++ b/highlight-js/test/markup/clojure/symbols-numbers.txt @@ -0,0 +1 @@ +(def +x [(a 1) +2 -3.0 y-5]) diff --git a/highlight-js/test/markup/coffeescript/division.expect.txt b/highlight-js/test/markup/coffeescript/division.expect.txt new file mode 100644 index 0000000..28a9dfa --- /dev/null +++ b/highlight-js/test/markup/coffeescript/division.expect.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/highlight-js/test/markup/coffeescript/division.txt b/highlight-js/test/markup/coffeescript/division.txt new file mode 100644 index 0000000..483fa56 --- /dev/null +++ b/highlight-js/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/highlight-js/test/markup/coffeescript/function.expect.txt b/highlight-js/test/markup/coffeescript/function.expect.txt new file mode 100644 index 0000000..0c4f8af --- /dev/null +++ b/highlight-js/test/markup/coffeescript/function.expect.txt @@ -0,0 +1,14 @@ +returnNull = -> null +returnTrue = () -> true +square = (x) -> x * x + +npmWishlist.sha256 = (str) -> + throw new Error() + +str.split(" ").map((m) -> m.charCodeAt(0)) + +fs.readFile("package.json", "utf-8", (err, content) -> + data = JSON.parse(content) + + data.version +) diff --git a/highlight-js/test/markup/coffeescript/function.txt b/highlight-js/test/markup/coffeescript/function.txt new file mode 100644 index 0000000..d76f3b9 --- /dev/null +++ b/highlight-js/test/markup/coffeescript/function.txt @@ -0,0 +1,14 @@ +returnNull = -> null +returnTrue = () -> true +square = (x) -> x * x + +npmWishlist.sha256 = (str) -> + throw new Error() + +str.split(" ").map((m) -> m.charCodeAt(0)) + +fs.readFile("package.json", "utf-8", (err, content) -> + data = JSON.parse(content) + + data.version +) diff --git a/highlight-js/test/markup/coffeescript/regex.expect.txt b/highlight-js/test/markup/coffeescript/regex.expect.txt new file mode 100644 index 0000000..51c3f9c --- /dev/null +++ b/highlight-js/test/markup/coffeescript/regex.expect.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/highlight-js/test/markup/coffeescript/regex.txt b/highlight-js/test/markup/coffeescript/regex.txt new file mode 100644 index 0000000..e62a0fc --- /dev/null +++ b/highlight-js/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/highlight-js/test/markup/cos/basic.expect.txt b/highlight-js/test/markup/cos/basic.expect.txt new file mode 100644 index 0000000..e26474f --- /dev/null +++ b/highlight-js/test/markup/cos/basic.expect.txt @@ -0,0 +1,7 @@ +SET test = 1 +set ^global = 2 +Write "Current date """, $ztimestamp, """, result: ", test + ^global = 3 +if (^global = 2) { + do ##class(Cinema.Utils).AddShow("test") // line comment +} +d:(^global = 2) ..thisClassMethod(1, 2, "test") diff --git a/highlight-js/test/markup/cos/basic.txt b/highlight-js/test/markup/cos/basic.txt new file mode 100644 index 0000000..97e0328 --- /dev/null +++ b/highlight-js/test/markup/cos/basic.txt @@ -0,0 +1,7 @@ +SET test = 1 +set ^global = 2 +Write "Current date """, $ztimestamp, """, result: ", test + ^global = 3 +if (^global = 2) { + do ##class(Cinema.Utils).AddShow("test") // line comment +} +d:(^global = 2) ..thisClassMethod(1, 2, "test") diff --git a/highlight-js/test/markup/cos/embedded.expect.txt b/highlight-js/test/markup/cos/embedded.expect.txt new file mode 100644 index 0000000..d070b70 --- /dev/null +++ b/highlight-js/test/markup/cos/embedded.expect.txt @@ -0,0 +1,5 @@ +/* + * Multiline comment + */ +&sql(SELECT * FROM Cinema.Film WHERE Length > 2) +&js<for (var i = 0; i < String("test").split("").length); ++i) { console.log(i); }> diff --git a/highlight-js/test/markup/cos/embedded.txt b/highlight-js/test/markup/cos/embedded.txt new file mode 100644 index 0000000..1f0c3e1 --- /dev/null +++ b/highlight-js/test/markup/cos/embedded.txt @@ -0,0 +1,5 @@ +/* + * Multiline comment + */ +&sql(SELECT * FROM Cinema.Film WHERE Length > 2) +&js diff --git a/highlight-js/test/markup/cpp/expression-keywords.expect.txt b/highlight-js/test/markup/cpp/expression-keywords.expect.txt new file mode 100644 index 0000000..4fb7c52 --- /dev/null +++ b/highlight-js/test/markup/cpp/expression-keywords.expect.txt @@ -0,0 +1,2 @@ +double x = exp(log(2)); // recognize built-ins +return 0; // recognize keyword that started the expression diff --git a/highlight-js/test/markup/cpp/expression-keywords.txt b/highlight-js/test/markup/cpp/expression-keywords.txt new file mode 100644 index 0000000..93b0cff --- /dev/null +++ b/highlight-js/test/markup/cpp/expression-keywords.txt @@ -0,0 +1,2 @@ +double x = exp(log(2)); // recognize built-ins +return 0; // recognize keyword that started the expression diff --git a/highlight-js/test/markup/cpp/function-params.expect.txt b/highlight-js/test/markup/cpp/function-params.expect.txt new file mode 100644 index 0000000..a388045 --- /dev/null +++ b/highlight-js/test/markup/cpp/function-params.expect.txt @@ -0,0 +1,7 @@ +int f( + int a = 1, + char* b = "2", // Line comment + double c = 3.0, /* Block comment */ + ARRAY(int, 5) d, + void* e __attribute__((unused)) +); diff --git a/highlight-js/test/markup/cpp/function-params.txt b/highlight-js/test/markup/cpp/function-params.txt new file mode 100644 index 0000000..6053675 --- /dev/null +++ b/highlight-js/test/markup/cpp/function-params.txt @@ -0,0 +1,7 @@ +int f( + int a = 1, + char* b = "2", // Line comment + double c = 3.0, /* Block comment */ + ARRAY(int, 5) d, + void* e __attribute__((unused)) +); diff --git a/highlight-js/test/markup/cpp/function-title.expect.txt b/highlight-js/test/markup/cpp/function-title.expect.txt new file mode 100644 index 0000000..750081e --- /dev/null +++ b/highlight-js/test/markup/cpp/function-title.expect.txt @@ -0,0 +1,9 @@ +int main() { + A a = new A(); + int b = b * sum(1, 2); + if (a->check1()) + return 3; + else if (a->check2()) + return 4; + return a->result(); +} diff --git a/highlight-js/test/markup/cpp/function-title.txt b/highlight-js/test/markup/cpp/function-title.txt new file mode 100644 index 0000000..74c810a --- /dev/null +++ b/highlight-js/test/markup/cpp/function-title.txt @@ -0,0 +1,9 @@ +int main() { + A a = new A(); + int b = b * sum(1, 2); + if (a->check1()) + return 3; + else if (a->check2()) + return 4; + return a->result(); +} diff --git a/highlight-js/test/markup/cpp/number-literals.expect.txt b/highlight-js/test/markup/cpp/number-literals.expect.txt new file mode 100644 index 0000000..09e2d5a --- /dev/null +++ b/highlight-js/test/markup/cpp/number-literals.expect.txt @@ -0,0 +1,6 @@ +/* digit separators */ +int number = 2'555'555'555; // digit separators +float exponentFloat = .123'456e3'000; // digit separators in floats +float suffixed = 3.000'001'234f // digit separators in suffixed numbers +char word[] = { '3', '\0' }; // make sure digit separators don't mess up chars +float negative = -123.0f; // negative floating point numbers diff --git a/highlight-js/test/markup/cpp/number-literals.txt b/highlight-js/test/markup/cpp/number-literals.txt new file mode 100644 index 0000000..ec02e50 --- /dev/null +++ b/highlight-js/test/markup/cpp/number-literals.txt @@ -0,0 +1,6 @@ +/* digit separators */ +int number = 2'555'555'555; // digit separators +float exponentFloat = .123'456e3'000; // digit separators in floats +float suffixed = 3.000'001'234f // digit separators in suffixed numbers +char word[] = { '3', '\0' }; // make sure digit separators don't mess up chars +float negative = -123.0f; // negative floating point numbers diff --git a/highlight-js/test/markup/cpp/pointers-returns.expect.txt b/highlight-js/test/markup/cpp/pointers-returns.expect.txt new file mode 100644 index 0000000..a2333fe --- /dev/null +++ b/highlight-js/test/markup/cpp/pointers-returns.expect.txt @@ -0,0 +1,4 @@ +// These will all work: +char** foo_bar(); +char ** foo_bar(); +char **foo_bar(); diff --git a/highlight-js/test/markup/cpp/pointers-returns.txt b/highlight-js/test/markup/cpp/pointers-returns.txt new file mode 100644 index 0000000..f56cc4a --- /dev/null +++ b/highlight-js/test/markup/cpp/pointers-returns.txt @@ -0,0 +1,4 @@ +// These will all work: +char** foo_bar(); +char ** foo_bar(); +char **foo_bar(); diff --git a/highlight-js/test/markup/cpp/preprocessor.expect.txt b/highlight-js/test/markup/cpp/preprocessor.expect.txt new file mode 100644 index 0000000..62fff51 --- /dev/null +++ b/highlight-js/test/markup/cpp/preprocessor.expect.txt @@ -0,0 +1,13 @@ +#include <iostream> +#define foo 1<<16 + +#ifdef DEBUG +TYPE1 foo(void) +#else +int foo(void) +#endif +{ } + +#define x(v) ((v)) +# define x(v) ((v)) +# define x(v) ((v)) diff --git a/highlight-js/test/markup/cpp/preprocessor.txt b/highlight-js/test/markup/cpp/preprocessor.txt new file mode 100644 index 0000000..b1ad6a6 --- /dev/null +++ b/highlight-js/test/markup/cpp/preprocessor.txt @@ -0,0 +1,13 @@ +#include +#define foo 1<<16 + +#ifdef DEBUG +TYPE1 foo(void) +#else +int foo(void) +#endif +{ } + +#define x(v) ((v)) +# define x(v) ((v)) +# define x(v) ((v)) diff --git a/highlight-js/test/markup/cpp/primitive-types.expect.txt b/highlight-js/test/markup/cpp/primitive-types.expect.txt new file mode 100644 index 0000000..1ab0047 --- /dev/null +++ b/highlight-js/test/markup/cpp/primitive-types.expect.txt @@ -0,0 +1,3 @@ +const uint64_t MAX_INT_64; + +struct position_tag; diff --git a/highlight-js/test/markup/cpp/primitive-types.txt b/highlight-js/test/markup/cpp/primitive-types.txt new file mode 100644 index 0000000..86f1167 --- /dev/null +++ b/highlight-js/test/markup/cpp/primitive-types.txt @@ -0,0 +1,3 @@ +const uint64_t MAX_INT_64; + +struct position_tag; diff --git a/highlight-js/test/markup/cpp/string-literals.expect.txt b/highlight-js/test/markup/cpp/string-literals.expect.txt new file mode 100644 index 0000000..1210b01 --- /dev/null +++ b/highlight-js/test/markup/cpp/string-literals.expect.txt @@ -0,0 +1,30 @@ +// Unicode literals +auto str = "Hello regular string"; +auto utf8 = u8"Hello utf-8 string"; +auto utf16 = u"Hello utf-16 string"; +auto utf32 = U"Hello utf-32 string"; + +// Wide-character strings +auto wide_char = L"Hello wchar_t string"; + +// Raw string literals (multiline) +auto char_multi = R"(Hello +"normal" +muliline +string.)"; +auto utf8_multi = u8R"(Hello +"utf-8" +muliline +string)"; +auto utf16_multi = uR"(Hello +"utf-16" +muliline +string)"; +auto utf32_multi = UR"(Hello +"utf-32" +muliline +string)"; + +// Meta strings +#include <stdio> +#include "lib.h" diff --git a/highlight-js/test/markup/cpp/string-literals.txt b/highlight-js/test/markup/cpp/string-literals.txt new file mode 100644 index 0000000..68b8bd4 --- /dev/null +++ b/highlight-js/test/markup/cpp/string-literals.txt @@ -0,0 +1,30 @@ +// Unicode literals +auto str = "Hello regular string"; +auto utf8 = u8"Hello utf-8 string"; +auto utf16 = u"Hello utf-16 string"; +auto utf32 = U"Hello utf-32 string"; + +// Wide-character strings +auto wide_char = L"Hello wchar_t string"; + +// Raw string literals (multiline) +auto char_multi = R"(Hello +"normal" +muliline +string.)"; +auto utf8_multi = u8R"(Hello +"utf-8" +muliline +string)"; +auto utf16_multi = uR"(Hello +"utf-16" +muliline +string)"; +auto utf32_multi = UR"(Hello +"utf-32" +muliline +string)"; + +// Meta strings +#include +#include "lib.h" diff --git a/highlight-js/test/markup/crystal/literals.expect.txt b/highlight-js/test/markup/crystal/literals.expect.txt new file mode 100644 index 0000000..46d8aef --- /dev/null +++ b/highlight-js/test/markup/crystal/literals.expect.txt @@ -0,0 +1,98 @@ +nil +true +false + +1 + +1_i8 +1_i16 +1_i32 +1_i64 +1_i128 + +1_u8 +1_u16 +1_u32 +1_u64 + ++10 +-20 + +2147483648 +9223372036854775808 + +1_000_000 + +0b1101 + +0o123 + +0xFE012D +0xfe012d + +1_f64 +1.0 +1.0_f32 +1_f32 + +1e10 +1e10_f64 +1.5e10 +1.5e-7 + ++1.3 +-0.5 + +1_000_000.111_111 +1_000_000.111_111e12 + +'c' +'\\' +'\u{ABCD}' + +"string" +"\u{48 45 4C 4C 4F}" +"interpolated #{string}" +"interpolated #{"string"}" +%(string) +%q(string) +%Q(string) +%(hello ("world")) +%[hello ["world"]] +%{hello {"world"}} +%<hello <"world">> +%|hello "world"| +"hello + world" +"hello \ + world, \ + no newlines" +<<-STRING + Hello world + STRING + +<<-'HERE' + hello \n + HERE + +:unquoted_symbol +:"quoted symbol" +:question? +:exclamation! +:+ + +%i(foo(bar) baz) +%w(one two three) + +/foo|bar/ +/h(e+)llo/ +/\d+/ +/あ/ + +%r((/)) +%r[[/]] +%r{{/}} +%r<</>> +%r|/| + +`echo foo > foo.txt` diff --git a/highlight-js/test/markup/crystal/literals.txt b/highlight-js/test/markup/crystal/literals.txt new file mode 100644 index 0000000..9de2fed --- /dev/null +++ b/highlight-js/test/markup/crystal/literals.txt @@ -0,0 +1,98 @@ +nil +true +false + +1 + +1_i8 +1_i16 +1_i32 +1_i64 +1_i128 + +1_u8 +1_u16 +1_u32 +1_u64 + ++10 +-20 + +2147483648 +9223372036854775808 + +1_000_000 + +0b1101 + +0o123 + +0xFE012D +0xfe012d + +1_f64 +1.0 +1.0_f32 +1_f32 + +1e10 +1e10_f64 +1.5e10 +1.5e-7 + ++1.3 +-0.5 + +1_000_000.111_111 +1_000_000.111_111e12 + +'c' +'\\' +'\u{ABCD}' + +"string" +"\u{48 45 4C 4C 4F}" +"interpolated #{string}" +"interpolated #{"string"}" +%(string) +%q(string) +%Q(string) +%(hello ("world")) +%[hello ["world"]] +%{hello {"world"}} +%> +%|hello "world"| +"hello + world" +"hello \ + world, \ + no newlines" +<<-STRING + Hello world + STRING + +<<-'HERE' + hello \n + HERE + +:unquoted_symbol +:"quoted symbol" +:question? +:exclamation! +:+ + +%i(foo(bar) baz) +%w(one two three) + +/foo|bar/ +/h(e+)llo/ +/\d+/ +/あ/ + +%r((/)) +%r[[/]] +%r{{/}} +%r<> +%r|/| + +`echo foo > foo.txt` diff --git a/highlight-js/test/markup/crystal/macro.expect.txt b/highlight-js/test/markup/crystal/macro.expect.txt new file mode 100644 index 0000000..38b2447 --- /dev/null +++ b/highlight-js/test/markup/crystal/macro.expect.txt @@ -0,0 +1,9 @@ +puts {{ "hello world" }} + +{% verbatim %}{{ "bla".id }}{% end %} + +macro foo + {% verbatim %} + {{ "bla".id }} + {% end %} +end diff --git a/highlight-js/test/markup/crystal/macro.txt b/highlight-js/test/markup/crystal/macro.txt new file mode 100644 index 0000000..1039545 --- /dev/null +++ b/highlight-js/test/markup/crystal/macro.txt @@ -0,0 +1,9 @@ +puts {{ "hello world" }} + +{% verbatim %}{{ "bla".id }}{% end %} + +macro foo + {% verbatim %} + {{ "bla".id }} + {% end %} +end diff --git a/highlight-js/test/markup/crystal/operators.expect.txt b/highlight-js/test/markup/crystal/operators.expect.txt new file mode 100644 index 0000000..cd70109 --- /dev/null +++ b/highlight-js/test/markup/crystal/operators.expect.txt @@ -0,0 +1,34 @@ ++ +- +* +% +& +| +^ +** +<< +>> +== +!= +< +<= +> +>= +<=> +=== +// +//= +&+ +&- +&* +&** +&+= +&-= +&*= +! +~ +[] +[]? +[]= +/ + diff --git a/highlight-js/test/markup/crystal/operators.txt b/highlight-js/test/markup/crystal/operators.txt new file mode 100644 index 0000000..80bac44 --- /dev/null +++ b/highlight-js/test/markup/crystal/operators.txt @@ -0,0 +1,33 @@ ++ +- +* +% +& +| +^ +** +<< +>> +== +!= +< +<= +> +>= +<=> +=== +// +//= +&+ +&- +&* +&** +&+= +&-= +&*= +! +~ +[] +[]? +[]= +/ diff --git a/highlight-js/test/markup/crystal/regexes.expect.txt b/highlight-js/test/markup/crystal/regexes.expect.txt new file mode 100644 index 0000000..5c93fd3 --- /dev/null +++ b/highlight-js/test/markup/crystal/regexes.expect.txt @@ -0,0 +1,12 @@ +if /foo/ +unless /foo/ +case /foo/ +select /foo/ +when /foo/ +while /foo/ +until /foo/ ++/foo/ + +# NG +xif /foo/ +ifx /foo/ diff --git a/highlight-js/test/markup/crystal/regexes.txt b/highlight-js/test/markup/crystal/regexes.txt new file mode 100644 index 0000000..409627a --- /dev/null +++ b/highlight-js/test/markup/crystal/regexes.txt @@ -0,0 +1,12 @@ +if /foo/ +unless /foo/ +case /foo/ +select /foo/ +when /foo/ +while /foo/ +until /foo/ ++/foo/ + +# NG +xif /foo/ +ifx /foo/ diff --git a/highlight-js/test/markup/crystal/toplevel-keywords.expect.txt b/highlight-js/test/markup/crystal/toplevel-keywords.expect.txt new file mode 100644 index 0000000..7583a10 --- /dev/null +++ b/highlight-js/test/markup/crystal/toplevel-keywords.expect.txt @@ -0,0 +1,4 @@ +class Foo; end +struct Bar; end + +annotation JSON::Field; end diff --git a/highlight-js/test/markup/crystal/toplevel-keywords.txt b/highlight-js/test/markup/crystal/toplevel-keywords.txt new file mode 100644 index 0000000..4ca49d4 --- /dev/null +++ b/highlight-js/test/markup/crystal/toplevel-keywords.txt @@ -0,0 +1,4 @@ +class Foo; end +struct Bar; end + +annotation JSON::Field; end diff --git a/highlight-js/test/markup/cs/dotted-namespace.expect.txt b/highlight-js/test/markup/cs/dotted-namespace.expect.txt new file mode 100644 index 0000000..96108bd --- /dev/null +++ b/highlight-js/test/markup/cs/dotted-namespace.expect.txt @@ -0,0 +1,6 @@ +namespace Dotted.Namespace +{ + class MyClass + { + } +} diff --git a/highlight-js/test/markup/cs/dotted-namespace.txt b/highlight-js/test/markup/cs/dotted-namespace.txt new file mode 100644 index 0000000..68356f8 --- /dev/null +++ b/highlight-js/test/markup/cs/dotted-namespace.txt @@ -0,0 +1,6 @@ +namespace Dotted.Namespace +{ + class MyClass + { + } +} diff --git a/highlight-js/test/markup/cs/floats.expect.txt b/highlight-js/test/markup/cs/floats.expect.txt new file mode 100644 index 0000000..7935858 --- /dev/null +++ b/highlight-js/test/markup/cs/floats.expect.txt @@ -0,0 +1,4 @@ +float test = 1.0f; +float test2 = 1.f; +float test3 = 1.0; +float test4 = 1; \ No newline at end of file diff --git a/highlight-js/test/markup/cs/floats.txt b/highlight-js/test/markup/cs/floats.txt new file mode 100644 index 0000000..777bfc9 --- /dev/null +++ b/highlight-js/test/markup/cs/floats.txt @@ -0,0 +1,4 @@ +float test = 1.0f; +float test2 = 1.f; +float test3 = 1.0; +float test4 = 1; \ No newline at end of file diff --git a/highlight-js/test/markup/cs/functions.expect.txt b/highlight-js/test/markup/cs/functions.expect.txt new file mode 100644 index 0000000..7546f94 --- /dev/null +++ b/highlight-js/test/markup/cs/functions.expect.txt @@ -0,0 +1,16 @@ +public void ExampleFunction1() { +} + +public void ExampleFunction2() +{ +} + +void ExampleFunctionDeclaration1(); + +void ExampleFunctionDeclaration2() +; + +public string ExampleExpressionBodiedFunction1() => "dummy"; + +public string ExampleExpressionBodiedFunction2() + => "dummy"; \ No newline at end of file diff --git a/highlight-js/test/markup/cs/functions.txt b/highlight-js/test/markup/cs/functions.txt new file mode 100644 index 0000000..e370c2a --- /dev/null +++ b/highlight-js/test/markup/cs/functions.txt @@ -0,0 +1,16 @@ +public void ExampleFunction1() { +} + +public void ExampleFunction2() +{ +} + +void ExampleFunctionDeclaration1(); + +void ExampleFunctionDeclaration2() +; + +public string ExampleExpressionBodiedFunction1() => "dummy"; + +public string ExampleExpressionBodiedFunction2() + => "dummy"; \ No newline at end of file diff --git a/highlight-js/test/markup/cs/string-interpolation.expect.txt b/highlight-js/test/markup/cs/string-interpolation.expect.txt new file mode 100644 index 0000000..65e754a --- /dev/null +++ b/highlight-js/test/markup/cs/string-interpolation.expect.txt @@ -0,0 +1,9 @@ +var istr = $"{{Hello}},\n{$"\"{nested}\"" + @" and " + $@"""{nested}""" /*comments*/ }"; +var ivstr = $@"{{Hello}}, +{ +$"\"{nested}\"" + @" +and +" + $@" +""{nested}"" +" +/*comments*/ }"; diff --git a/highlight-js/test/markup/cs/string-interpolation.txt b/highlight-js/test/markup/cs/string-interpolation.txt new file mode 100644 index 0000000..42e1e95 --- /dev/null +++ b/highlight-js/test/markup/cs/string-interpolation.txt @@ -0,0 +1,9 @@ +var istr = $"{{Hello}},\n{$"\"{nested}\"" + @" and " + $@"""{nested}""" /*comments*/ }"; +var ivstr = $@"{{Hello}}, +{ +$"\"{nested}\"" + @" +and +" + $@" +""{nested}"" +" +/*comments*/ }"; diff --git a/highlight-js/test/markup/cs/titles.expect.txt b/highlight-js/test/markup/cs/titles.expect.txt new file mode 100644 index 0000000..185cb34 --- /dev/null +++ b/highlight-js/test/markup/cs/titles.expect.txt @@ -0,0 +1,19 @@ +namespace Foo // namespace +{ + public class Greet : Base, Other // class + { + public Greet(string who) // function + { + Who = who; + } + + int[] f(int val = 0) + { + new Type(); + return getType(); + throw getError(); + await Stuff(); + } + } + +} diff --git a/highlight-js/test/markup/cs/titles.txt b/highlight-js/test/markup/cs/titles.txt new file mode 100644 index 0000000..ee1d815 --- /dev/null +++ b/highlight-js/test/markup/cs/titles.txt @@ -0,0 +1,19 @@ +namespace Foo // namespace +{ + public class Greet : Base, Other // class + { + public Greet(string who) // function + { + Who = who; + } + + int[] f(int val = 0) + { + new Type(); + return getType(); + throw getError(); + await Stuff(); + } + } + +} diff --git a/highlight-js/test/markup/css/pseudo-selector.expect.txt b/highlight-js/test/markup/css/pseudo-selector.expect.txt new file mode 100644 index 0000000..0749771 --- /dev/null +++ b/highlight-js/test/markup/css/pseudo-selector.expect.txt @@ -0,0 +1,2 @@ +li:not(.red){} +li:not(.red):not(.green){} diff --git a/highlight-js/test/markup/css/pseudo-selector.txt b/highlight-js/test/markup/css/pseudo-selector.txt new file mode 100644 index 0000000..4508da1 --- /dev/null +++ b/highlight-js/test/markup/css/pseudo-selector.txt @@ -0,0 +1,2 @@ +li:not(.red){} +li:not(.red):not(.green){} diff --git a/highlight-js/test/markup/css/url.expect.txt b/highlight-js/test/markup/css/url.expect.txt new file mode 100644 index 0000000..b9ca8ff --- /dev/null +++ b/highlight-js/test/markup/css/url.expect.txt @@ -0,0 +1,6 @@ +div { background: url("foo/bar/baz.jpg") } +div { background: url('foo/bar/baz.jpg') } +div { background: url(foo/bar/baz.jpg) } +div { background-image: url(data:image/png;base64,TWFuIGlzIGRpc3=) } +div { background-image: url("data:image/png;base64,TWFuIGlzIGRpc3=") } +div { background-image: url('data:image/png;base64,TWFuIGlzIGRpc3=') } diff --git a/highlight-js/test/markup/css/url.txt b/highlight-js/test/markup/css/url.txt new file mode 100644 index 0000000..7a91d04 --- /dev/null +++ b/highlight-js/test/markup/css/url.txt @@ -0,0 +1,6 @@ +div { background: url("foo/bar/baz.jpg") } +div { background: url('foo/bar/baz.jpg') } +div { background: url(foo/bar/baz.jpg) } +div { background-image: url(data:image/png;base64,TWFuIGlzIGRpc3=) } +div { background-image: url("data:image/png;base64,TWFuIGlzIGRpc3=") } +div { background-image: url('data:image/png;base64,TWFuIGlzIGRpc3=') } \ No newline at end of file diff --git a/highlight-js/test/markup/delphi/compiler-directive.expect.txt b/highlight-js/test/markup/delphi/compiler-directive.expect.txt new file mode 100644 index 0000000..e3ad344 --- /dev/null +++ b/highlight-js/test/markup/delphi/compiler-directive.expect.txt @@ -0,0 +1,4 @@ +{ Compiler directives } +{$I} (*$I*) +procedure A(x: {$IFDEF Debug}Integer{$ELSE}Word{$ENDIF}); +begin end; diff --git a/highlight-js/test/markup/delphi/compiler-directive.txt b/highlight-js/test/markup/delphi/compiler-directive.txt new file mode 100644 index 0000000..c62b1a2 --- /dev/null +++ b/highlight-js/test/markup/delphi/compiler-directive.txt @@ -0,0 +1,4 @@ +{ Compiler directives } +{$I} (*$I*) +procedure A(x: {$IFDEF Debug}Integer{$ELSE}Word{$ENDIF}); +begin end; diff --git a/highlight-js/test/markup/diff/comments.expect.txt b/highlight-js/test/markup/diff/comments.expect.txt new file mode 100644 index 0000000..5477ae7 --- /dev/null +++ b/highlight-js/test/markup/diff/comments.expect.txt @@ -0,0 +1,10 @@ +Index: languages/demo.js +=================================================================== +--- languages/demo.js (revision 199) ++++ languages/demo.js (revision 200) +@@ -1,8 +1,7 @@ ++ Here we highlight correctly +==== ++ Here too +===== ++ Here we don't anymore after five '=' next to each other diff --git a/highlight-js/test/markup/diff/comments.txt b/highlight-js/test/markup/diff/comments.txt new file mode 100644 index 0000000..f79bb67 --- /dev/null +++ b/highlight-js/test/markup/diff/comments.txt @@ -0,0 +1,10 @@ +Index: languages/demo.js +=================================================================== +--- languages/demo.js (revision 199) ++++ languages/demo.js (revision 200) +@@ -1,8 +1,7 @@ ++ Here we highlight correctly +==== ++ Here too +===== ++ Here we don't anymore after five '=' next to each other diff --git a/highlight-js/test/markup/dockerfile/default.expect.txt b/highlight-js/test/markup/dockerfile/default.expect.txt new file mode 100644 index 0000000..3d7b03d --- /dev/null +++ b/highlight-js/test/markup/dockerfile/default.expect.txt @@ -0,0 +1,23 @@ +FROM ubuntu + +MAINTAINER laurent@docker.com + +ARG debug=0 + +COPY www.conf /etc/php5/fpm/pool.d/ + +RUN apt-get update \ + && apt-get install -y php5-fpm php-apc php5-curl php5-gd php5-intl php5-mysql +RUN mkdir /tmp/sessions + +ENV APPLICATION_ENV dev + +USER www-data + +EXPOSE 80 + +VOLUME ["/var/www/html"] + +WORKDIR "/var/www/html" + +CMD [ "/usr/sbin/php5-fpm", "-F" ] diff --git a/highlight-js/test/markup/dockerfile/default.txt b/highlight-js/test/markup/dockerfile/default.txt new file mode 100644 index 0000000..bfeeaef --- /dev/null +++ b/highlight-js/test/markup/dockerfile/default.txt @@ -0,0 +1,23 @@ +FROM ubuntu + +MAINTAINER laurent@docker.com + +ARG debug=0 + +COPY www.conf /etc/php5/fpm/pool.d/ + +RUN apt-get update \ + && apt-get install -y php5-fpm php-apc php5-curl php5-gd php5-intl php5-mysql +RUN mkdir /tmp/sessions + +ENV APPLICATION_ENV dev + +USER www-data + +EXPOSE 80 + +VOLUME ["/var/www/html"] + +WORKDIR "/var/www/html" + +CMD [ "/usr/sbin/php5-fpm", "-F" ] diff --git a/highlight-js/test/markup/dos/comments.expect.txt b/highlight-js/test/markup/dos/comments.expect.txt new file mode 100644 index 0000000..3f00626 --- /dev/null +++ b/highlight-js/test/markup/dos/comments.expect.txt @@ -0,0 +1,3 @@ +rem comment + rem comment +copy a.txt b.txt > rem not_a_comment diff --git a/highlight-js/test/markup/dos/comments.txt b/highlight-js/test/markup/dos/comments.txt new file mode 100644 index 0000000..6456884 --- /dev/null +++ b/highlight-js/test/markup/dos/comments.txt @@ -0,0 +1,3 @@ +rem comment + rem comment +copy a.txt b.txt > rem not_a_comment diff --git a/highlight-js/test/markup/dsconfig/default.expect.txt b/highlight-js/test/markup/dsconfig/default.expect.txt new file mode 100644 index 0000000..cfb2fba --- /dev/null +++ b/highlight-js/test/markup/dsconfig/default.expect.txt @@ -0,0 +1,24 @@ +# Quoted and unquoted properties +dsconfig create-client-connection-policy \ + --policy-name "Restrictive Client Connection Policy" \ + --set "description:Restrictive Client Connection Policy" \ + --set enabled:true --set evaluation-order-index:1000 \ + --set "connection-criteria:User.0 Connection Criteria" \ + --set maximum-concurrent-connections:2 \ + --set "maximum-connection-duration:1 s" \ + --set "maximum-idle-connection-duration:1 s" \ + --set maximum-operation-count-per-connection:1000 +# dsconfig keyword is optional +create-client-connection-policy \ + --policy-name "Another Client Connection Policy" \ + --set enabled:true --set evaluation-order-index:100 \ + --set 'connection-criteria:User.1 Connection Criteria' \ +# Property without value + --reset maximum-concurrent-connections +# Unquoted property, quoted property value +dsconfig set-access-control-handler-prop \ + --add global-aci:'(target="ldap:///cn=config")(targetattr="*")(version 3.0; acl "Allow access to the config tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' \ + --add global-aci:'(target="ldap:///cn=monitor")(targetattr="*")(version 3.0; acl "Allow access to the monitor tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' \ + --remove global-aci:'(target="ldap:///cn=alerts")(targetattr="*")(version 3.0; acl "Allow access to the alerts tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' +# No continuation +dsconfig delete-log-publisher --publisher-name "File-Based Error Logger" diff --git a/highlight-js/test/markup/dsconfig/default.txt b/highlight-js/test/markup/dsconfig/default.txt new file mode 100644 index 0000000..430bda6 --- /dev/null +++ b/highlight-js/test/markup/dsconfig/default.txt @@ -0,0 +1,24 @@ +# Quoted and unquoted properties +dsconfig create-client-connection-policy \ + --policy-name "Restrictive Client Connection Policy" \ + --set "description:Restrictive Client Connection Policy" \ + --set enabled:true --set evaluation-order-index:1000 \ + --set "connection-criteria:User.0 Connection Criteria" \ + --set maximum-concurrent-connections:2 \ + --set "maximum-connection-duration:1 s" \ + --set "maximum-idle-connection-duration:1 s" \ + --set maximum-operation-count-per-connection:1000 +# dsconfig keyword is optional +create-client-connection-policy \ + --policy-name "Another Client Connection Policy" \ + --set enabled:true --set evaluation-order-index:100 \ + --set 'connection-criteria:User.1 Connection Criteria' \ +# Property without value + --reset maximum-concurrent-connections +# Unquoted property, quoted property value +dsconfig set-access-control-handler-prop \ + --add global-aci:'(target="ldap:///cn=config")(targetattr="*")(version 3.0; acl "Allow access to the config tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' \ + --add global-aci:'(target="ldap:///cn=monitor")(targetattr="*")(version 3.0; acl "Allow access to the monitor tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' \ + --remove global-aci:'(target="ldap:///cn=alerts")(targetattr="*")(version 3.0; acl "Allow access to the alerts tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' +# No continuation +dsconfig delete-log-publisher --publisher-name "File-Based Error Logger" diff --git a/highlight-js/test/markup/elixir/function-title.expect.txt b/highlight-js/test/markup/elixir/function-title.expect.txt new file mode 100644 index 0000000..c4d01de --- /dev/null +++ b/highlight-js/test/markup/elixir/function-title.expect.txt @@ -0,0 +1,15 @@ +def f do + :ok +end + +def f(list) do + :ok +end + +def f :clear, list do + :ok +end + +def f!, do: IO.puts "hello world" + +x = 5 diff --git a/highlight-js/test/markup/elixir/function-title.txt b/highlight-js/test/markup/elixir/function-title.txt new file mode 100644 index 0000000..9f950a6 --- /dev/null +++ b/highlight-js/test/markup/elixir/function-title.txt @@ -0,0 +1,15 @@ +def f do + :ok +end + +def f(list) do + :ok +end + +def f :clear, list do + :ok +end + +def f!, do: IO.puts "hello world" + +x = 5 diff --git a/highlight-js/test/markup/excel/comments.expect.txt b/highlight-js/test/markup/excel/comments.expect.txt new file mode 100644 index 0000000..596c4f2 --- /dev/null +++ b/highlight-js/test/markup/excel/comments.expect.txt @@ -0,0 +1 @@ +=(N4 + N5)*0.055 + N("This is a comment.") diff --git a/highlight-js/test/markup/excel/comments.txt b/highlight-js/test/markup/excel/comments.txt new file mode 100644 index 0000000..ab6e3db --- /dev/null +++ b/highlight-js/test/markup/excel/comments.txt @@ -0,0 +1 @@ +=(N4 + N5)*0.055 + N("This is a comment.") diff --git a/highlight-js/test/markup/fortran/numbers.expect.txt b/highlight-js/test/markup/fortran/numbers.expect.txt new file mode 100644 index 0000000..f90b246 --- /dev/null +++ b/highlight-js/test/markup/fortran/numbers.expect.txt @@ -0,0 +1,15 @@ +1.d0 +-1.d0 +1.d-5 +-1.D5 +342.e+12 +12. +12 +.23 +-.23 +1.E4 +1E4 +1D-4 +var1 +va1r +mo_tot_8 = 1./(0.4*log(float(elec_num_tot_8+0.4))) \ No newline at end of file diff --git a/highlight-js/test/markup/fortran/numbers.txt b/highlight-js/test/markup/fortran/numbers.txt new file mode 100644 index 0000000..49ad3bb --- /dev/null +++ b/highlight-js/test/markup/fortran/numbers.txt @@ -0,0 +1,15 @@ +1.d0 +-1.d0 +1.d-5 +-1.D5 +342.e+12 +12. +12 +.23 +-.23 +1.E4 +1E4 +1D-4 +var1 +va1r +mo_tot_8 = 1./(0.4*log(float(elec_num_tot_8+0.4))) \ No newline at end of file diff --git a/highlight-js/test/markup/fsharp/bang-keywords.expect.txt b/highlight-js/test/markup/fsharp/bang-keywords.expect.txt new file mode 100644 index 0000000..9aff5df --- /dev/null +++ b/highlight-js/test/markup/fsharp/bang-keywords.expect.txt @@ -0,0 +1 @@ +let! (result2 : byte[]) = stream.AsyncRead(bufferSize) diff --git a/highlight-js/test/markup/fsharp/bang-keywords.txt b/highlight-js/test/markup/fsharp/bang-keywords.txt new file mode 100644 index 0000000..5824ca8 --- /dev/null +++ b/highlight-js/test/markup/fsharp/bang-keywords.txt @@ -0,0 +1 @@ +let! (result2 : byte[]) = stream.AsyncRead(bufferSize) diff --git a/highlight-js/test/markup/gauss/function_defs.expect.txt b/highlight-js/test/markup/gauss/function_defs.expect.txt new file mode 100644 index 0000000..5203af0 --- /dev/null +++ b/highlight-js/test/markup/gauss/function_defs.expect.txt @@ -0,0 +1,7 @@ +proc (1) = foo(if, endif, 10); +proc foo; +proc (1) = calc(local__row, fin, ...); +fn /* inline */ twopi=pi*2; +fn _n_pi(n /* inline comment */) = pi*n; +keyword add(str, struct plotControl myPlot); +keyword sub; diff --git a/highlight-js/test/markup/gauss/function_defs.txt b/highlight-js/test/markup/gauss/function_defs.txt new file mode 100644 index 0000000..401af60 --- /dev/null +++ b/highlight-js/test/markup/gauss/function_defs.txt @@ -0,0 +1,7 @@ +proc (1) = foo(if, endif, 10); +proc foo; +proc (1) = calc(local__row, fin, ...); +fn /* inline */ twopi=pi*2; +fn _n_pi(n /* inline comment */) = pi*n; +keyword add(str, struct plotControl myPlot); +keyword sub; diff --git a/highlight-js/test/markup/gauss/function_refs.expect.txt b/highlight-js/test/markup/gauss/function_refs.expect.txt new file mode 100644 index 0000000..795eb54 --- /dev/null +++ b/highlight-js/test/markup/gauss/function_refs.expect.txt @@ -0,0 +1,5 @@ +k = colsf(fin); +nr = floor(minc(maxbytes/(k*8*3.5)|maxvec/(k+1))); +call random_user_function_2(-10.0, "hey", /* blah */ x[0x2F]); +ols("", csvReadM("test.csv")); +if myfn(10) == 20; diff --git a/highlight-js/test/markup/gauss/function_refs.txt b/highlight-js/test/markup/gauss/function_refs.txt new file mode 100644 index 0000000..d87911d --- /dev/null +++ b/highlight-js/test/markup/gauss/function_refs.txt @@ -0,0 +1,5 @@ +k = colsf(fin); +nr = floor(minc(maxbytes/(k*8*3.5)|maxvec/(k+1))); +call random_user_function_2(-10.0, "hey", /* blah */ x[0x2F]); +ols("", csvReadM("test.csv")); +if myfn(10) == 20; diff --git a/highlight-js/test/markup/gauss/keywords.expect.txt b/highlight-js/test/markup/gauss/keywords.expect.txt new file mode 100644 index 0000000..b02f6ef --- /dev/null +++ b/highlight-js/test/markup/gauss/keywords.expect.txt @@ -0,0 +1,7 @@ +for i(start, stop, bar(5)); +if (i-1 % 5 == 0 .and some_flag); +elseif i % 2 .eqv 0; +external string _olsrnam; +external proc indices2,indexcat; +myPlot.axes.and.for.if.endif.text = "hey"; +local f:proc; diff --git a/highlight-js/test/markup/gauss/keywords.txt b/highlight-js/test/markup/gauss/keywords.txt new file mode 100644 index 0000000..a39a18f --- /dev/null +++ b/highlight-js/test/markup/gauss/keywords.txt @@ -0,0 +1,7 @@ +for i(start, stop, bar(5)); +if (i-1 % 5 == 0 .and some_flag); +elseif i % 2 .eqv 0; +external string _olsrnam; +external proc indices2,indexcat; +myPlot.axes.and.for.if.endif.text = "hey"; +local f:proc; diff --git a/highlight-js/test/markup/go/numbers.expect.txt b/highlight-js/test/markup/go/numbers.expect.txt new file mode 100644 index 0000000..c7d4d2a --- /dev/null +++ b/highlight-js/test/markup/go/numbers.expect.txt @@ -0,0 +1,2 @@ +float_var := 1.0e10f +complex_var := 1.2e5+2.3i \ No newline at end of file diff --git a/highlight-js/test/markup/go/numbers.txt b/highlight-js/test/markup/go/numbers.txt new file mode 100644 index 0000000..f3b4a79 --- /dev/null +++ b/highlight-js/test/markup/go/numbers.txt @@ -0,0 +1,2 @@ +float_var := 1.0e10f +complex_var := 1.2e5+2.3i \ No newline at end of file diff --git a/highlight-js/test/markup/golo/default.expect.txt b/highlight-js/test/markup/golo/default.expect.txt new file mode 100644 index 0000000..7492208 --- /dev/null +++ b/highlight-js/test/markup/golo/default.expect.txt @@ -0,0 +1,15 @@ +module hello + +function dyno = -> DynamicObject() + +struct human = { name } + +@annotated +function main = |args| { + let a = 1 + var b = 2 + + println("hello") + + let john = human("John Doe") +} diff --git a/highlight-js/test/markup/golo/default.txt b/highlight-js/test/markup/golo/default.txt new file mode 100644 index 0000000..0c0f62c --- /dev/null +++ b/highlight-js/test/markup/golo/default.txt @@ -0,0 +1,15 @@ +module hello + +function dyno = -> DynamicObject() + +struct human = { name } + +@annotated +function main = |args| { + let a = 1 + var b = 2 + + println("hello") + + let john = human("John Doe") +} diff --git a/highlight-js/test/markup/haskell/infix.expect.txt b/highlight-js/test/markup/haskell/infix.expect.txt new file mode 100644 index 0000000..0ce07f7 --- /dev/null +++ b/highlight-js/test/markup/haskell/infix.expect.txt @@ -0,0 +1,3 @@ +infix 3 `foo` +infixl 6 `bar` +infixr 9 `baz` diff --git a/highlight-js/test/markup/haskell/infix.txt b/highlight-js/test/markup/haskell/infix.txt new file mode 100644 index 0000000..55f679a --- /dev/null +++ b/highlight-js/test/markup/haskell/infix.txt @@ -0,0 +1,3 @@ +infix 3 `foo` +infixl 6 `bar` +infixr 9 `baz` diff --git a/highlight-js/test/markup/haskell/nested-comments.expect.txt b/highlight-js/test/markup/haskell/nested-comments.expect.txt new file mode 100644 index 0000000..564c142 --- /dev/null +++ b/highlight-js/test/markup/haskell/nested-comments.expect.txt @@ -0,0 +1 @@ +{- this is a {- nested -} comment -} diff --git a/highlight-js/test/markup/haskell/nested-comments.txt b/highlight-js/test/markup/haskell/nested-comments.txt new file mode 100644 index 0000000..b716623 --- /dev/null +++ b/highlight-js/test/markup/haskell/nested-comments.txt @@ -0,0 +1 @@ +{- this is a {- nested -} comment -} diff --git a/highlight-js/test/markup/http/default.expect.txt b/highlight-js/test/markup/http/default.expect.txt new file mode 100644 index 0000000..dafe8dc --- /dev/null +++ b/highlight-js/test/markup/http/default.expect.txt @@ -0,0 +1,7 @@ +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/highlight-js/test/markup/http/default.txt b/highlight-js/test/markup/http/default.txt new file mode 100644 index 0000000..34631a1 --- /dev/null +++ b/highlight-js/test/markup/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/highlight-js/test/markup/index.js b/highlight-js/test/markup/index.js new file mode 100644 index 0000000..e80fedc --- /dev/null +++ b/highlight-js/test/markup/index.js @@ -0,0 +1,39 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let fs = bluebird.promisifyAll(require('fs')); +let glob = require('glob'); +let hljs = require('../../build'); +let path = require('path'); +let utility = require('../utility'); + +function testLanguage(language) { + describe(language, function() { + const filePath = utility.buildPath('markup', language, '*.expect.txt'), + filenames = glob.sync(filePath); + + _.each(filenames, function(filename) { + const testName = path.basename(filename, '.expect.txt'), + sourceName = filename.replace(/\.expect/, ''); + + it(`should markup ${testName}`, function(done) { + const sourceFile = fs.readFileAsync(sourceName, 'utf-8'), + expectedFile = fs.readFileAsync(filename, 'utf-8'); + + bluebird.join(sourceFile, expectedFile, function(source, expected) { + const actual = hljs.highlight(language, source).value; + + actual.trim().should.equal(expected.trim()); + done(); + }); + }); + }); + }); +} + +describe('hljs.highlight()', function() { + let markupPath = utility.buildPath('markup'); + + return fs.readdirAsync(markupPath).each(testLanguage); +}); diff --git a/highlight-js/test/markup/java/gh1031.expect.txt b/highlight-js/test/markup/java/gh1031.expect.txt new file mode 100644 index 0000000..43879d3 --- /dev/null +++ b/highlight-js/test/markup/java/gh1031.expect.txt @@ -0,0 +1,7 @@ +public class DefaultDataDaoImpl { + private List<AbstractCmrDataProcessor> cmrDataProcessors; +} + +public class DefaultDataDaoImpl { + private List<AbstractCmrDataProcessor, AbstractCmrDataProcessor> cmrDataProcessors; +} diff --git a/highlight-js/test/markup/java/gh1031.txt b/highlight-js/test/markup/java/gh1031.txt new file mode 100644 index 0000000..2e7e2e1 --- /dev/null +++ b/highlight-js/test/markup/java/gh1031.txt @@ -0,0 +1,7 @@ +public class DefaultDataDaoImpl { + private List cmrDataProcessors; +} + +public class DefaultDataDaoImpl { + private List cmrDataProcessors; +} diff --git a/highlight-js/test/markup/java/numbers.expect.txt b/highlight-js/test/markup/java/numbers.expect.txt new file mode 100644 index 0000000..713579c --- /dev/null +++ b/highlight-js/test/markup/java/numbers.expect.txt @@ -0,0 +1,9 @@ +long creditCardNumber = 1234_5678_9012_3456L; +long socialSecurityNumber = 999_99_9999L; +float pi = 3.14_15F; +long hexBytes = 0xFF_EC_DE_5E; +long hexWords = 0xCAFE_BABE; +long maxLong = 0x7fff_ffff_ffff_ffffL; +byte nybbles = 0b0010_0101; +long bytes = 0b11010010_01101001_10010100_10010010; +int n = 1234 + Contacts._ID; diff --git a/highlight-js/test/markup/java/numbers.txt b/highlight-js/test/markup/java/numbers.txt new file mode 100644 index 0000000..f68a40c --- /dev/null +++ b/highlight-js/test/markup/java/numbers.txt @@ -0,0 +1,9 @@ +long creditCardNumber = 1234_5678_9012_3456L; +long socialSecurityNumber = 999_99_9999L; +float pi = 3.14_15F; +long hexBytes = 0xFF_EC_DE_5E; +long hexWords = 0xCAFE_BABE; +long maxLong = 0x7fff_ffff_ffff_ffffL; +byte nybbles = 0b0010_0101; +long bytes = 0b11010010_01101001_10010100_10010010; +int n = 1234 + Contacts._ID; diff --git a/highlight-js/test/markup/java/titles.expect.txt b/highlight-js/test/markup/java/titles.expect.txt new file mode 100644 index 0000000..cc0a41b --- /dev/null +++ b/highlight-js/test/markup/java/titles.expect.txt @@ -0,0 +1,10 @@ +public class Greet { + public Either<Integer, String> f(int val) { + new Type(); + if (val) { + return getType(); + } else if (!val) { + throw getError(); + } + } +} diff --git a/highlight-js/test/markup/java/titles.txt b/highlight-js/test/markup/java/titles.txt new file mode 100644 index 0000000..c43f696 --- /dev/null +++ b/highlight-js/test/markup/java/titles.txt @@ -0,0 +1,10 @@ +public class Greet { + public Either f(int val) { + new Type(); + if (val) { + return getType(); + } else if (!val) { + throw getError(); + } + } +} diff --git a/highlight-js/test/markup/javascript/arrow-function.expect.txt b/highlight-js/test/markup/javascript/arrow-function.expect.txt new file mode 100644 index 0000000..7a4faaf --- /dev/null +++ b/highlight-js/test/markup/javascript/arrow-function.expect.txt @@ -0,0 +1,3 @@ +var f = x => x; +f(x => x + (y=2, z=undefined, ...rest) => y); +() => null; diff --git a/highlight-js/test/markup/javascript/arrow-function.txt b/highlight-js/test/markup/javascript/arrow-function.txt new file mode 100644 index 0000000..0d39f38 --- /dev/null +++ b/highlight-js/test/markup/javascript/arrow-function.txt @@ -0,0 +1,3 @@ +var f = x => x; +f(x => x + (y=2, z=undefined, ...rest) => y); +() => null; diff --git a/highlight-js/test/markup/javascript/class.expect.txt b/highlight-js/test/markup/javascript/class.expect.txt new file mode 100644 index 0000000..31a8507 --- /dev/null +++ b/highlight-js/test/markup/javascript/class.expect.txt @@ -0,0 +1,11 @@ +class Car extends Vehicle { + constructor(speed, cost) { + super(speed); + + var c = Symbol('cost'); + this[c] = cost; + + this.intro = `This is a car runs at + ${speed}.`; + } +} diff --git a/highlight-js/test/markup/javascript/class.txt b/highlight-js/test/markup/javascript/class.txt new file mode 100644 index 0000000..47fa67c --- /dev/null +++ b/highlight-js/test/markup/javascript/class.txt @@ -0,0 +1,11 @@ +class Car extends Vehicle { + constructor(speed, cost) { + super(speed); + + var c = Symbol('cost'); + this[c] = cost; + + this.intro = `This is a car runs at + ${speed}.`; + } +} diff --git a/highlight-js/test/markup/javascript/default-parameters.expect.txt b/highlight-js/test/markup/javascript/default-parameters.expect.txt new file mode 100644 index 0000000..d433ced --- /dev/null +++ b/highlight-js/test/markup/javascript/default-parameters.expect.txt @@ -0,0 +1 @@ +function visibleTodoFilter(state = 'watch', action) {} diff --git a/highlight-js/test/markup/javascript/default-parameters.txt b/highlight-js/test/markup/javascript/default-parameters.txt new file mode 100644 index 0000000..12fb144 --- /dev/null +++ b/highlight-js/test/markup/javascript/default-parameters.txt @@ -0,0 +1 @@ +function visibleTodoFilter(state = 'watch', action) {} diff --git a/highlight-js/test/markup/javascript/jsx.expect.txt b/highlight-js/test/markup/javascript/jsx.expect.txt new file mode 100644 index 0000000..7044949 --- /dev/null +++ b/highlight-js/test/markup/javascript/jsx.expect.txt @@ -0,0 +1,6 @@ +var jsx = <node/>; +var jsx = <node><child/></node>; +var jsx = <node>...<child>...</child></node>; +var jsx = <div><span><br /></span></div>; +var x = 5; +return (<node attr="value"></node>); diff --git a/highlight-js/test/markup/javascript/jsx.txt b/highlight-js/test/markup/javascript/jsx.txt new file mode 100644 index 0000000..2b3db72 --- /dev/null +++ b/highlight-js/test/markup/javascript/jsx.txt @@ -0,0 +1,6 @@ +var jsx = ; +var jsx = ; +var jsx = ......; +var jsx =

    ; +var x = 5; +return (); diff --git a/highlight-js/test/markup/javascript/keywords.expect.txt b/highlight-js/test/markup/javascript/keywords.expect.txt new file mode 100644 index 0000000..66edf9f --- /dev/null +++ b/highlight-js/test/markup/javascript/keywords.expect.txt @@ -0,0 +1,13 @@ +function $initHighlight(block, cls) { + try { + if (cls.search(/\bno\-highlight\b/) != -1) + return process(block, true, 0x0F) + + ' class=""'; + } catch (e) { + /* handle exception */ + } + for (var i = 0 / 2; i < classes.length; i++) { + if (checkCondition(classes[i]) === undefined) + return /\d+[\s/]/g; + } +} diff --git a/highlight-js/test/markup/javascript/keywords.txt b/highlight-js/test/markup/javascript/keywords.txt new file mode 100644 index 0000000..39b3f20 --- /dev/null +++ b/highlight-js/test/markup/javascript/keywords.txt @@ -0,0 +1,13 @@ +function $initHighlight(block, cls) { + try { + if (cls.search(/\bno\-highlight\b/) != -1) + return process(block, true, 0x0F) + + ' class=""'; + } catch (e) { + /* handle exception */ + } + for (var i = 0 / 2; i < classes.length; i++) { + if (checkCondition(classes[i]) === undefined) + return /\d+[\s/]/g; + } +} diff --git a/highlight-js/test/markup/javascript/method-call.expect.txt b/highlight-js/test/markup/javascript/method-call.expect.txt new file mode 100644 index 0000000..25b4a6a --- /dev/null +++ b/highlight-js/test/markup/javascript/method-call.expect.txt @@ -0,0 +1 @@ +x.continue(0); diff --git a/highlight-js/test/markup/javascript/method-call.txt b/highlight-js/test/markup/javascript/method-call.txt new file mode 100644 index 0000000..e4e6cc4 --- /dev/null +++ b/highlight-js/test/markup/javascript/method-call.txt @@ -0,0 +1 @@ +x.continue(0); diff --git a/highlight-js/test/markup/javascript/modules.expect.txt b/highlight-js/test/markup/javascript/modules.expect.txt new file mode 100644 index 0000000..0f83909 --- /dev/null +++ b/highlight-js/test/markup/javascript/modules.expect.txt @@ -0,0 +1,8 @@ +//------ underscore.js ------ +export default function (obj) {}; +export function each(obj, iterator, context) {}; +export { each as forEach }; +export function something() {}; + +//------ main.js ------ +import _, { each, something as otherthing } from 'underscore'; diff --git a/highlight-js/test/markup/javascript/modules.txt b/highlight-js/test/markup/javascript/modules.txt new file mode 100644 index 0000000..c0c8e35 --- /dev/null +++ b/highlight-js/test/markup/javascript/modules.txt @@ -0,0 +1,8 @@ +//------ underscore.js ------ +export default function (obj) {}; +export function each(obj, iterator, context) {}; +export { each as forEach }; +export function something() {}; + +//------ main.js ------ +import _, { each, something as otherthing } from 'underscore'; diff --git a/highlight-js/test/markup/javascript/object-attr.expect.txt b/highlight-js/test/markup/javascript/object-attr.expect.txt new file mode 100644 index 0000000..092d8d7 --- /dev/null +++ b/highlight-js/test/markup/javascript/object-attr.expect.txt @@ -0,0 +1,6 @@ +{ + key: value, + key2: value, + 'key-3': value, + key4: false ? undefined : true +} diff --git a/highlight-js/test/markup/javascript/object-attr.txt b/highlight-js/test/markup/javascript/object-attr.txt new file mode 100644 index 0000000..852dbdf --- /dev/null +++ b/highlight-js/test/markup/javascript/object-attr.txt @@ -0,0 +1,6 @@ +{ + key: value, + key2: value, + 'key-3': value, + key4: false ? undefined : true +} diff --git a/highlight-js/test/markup/javascript/shebang.expect.txt b/highlight-js/test/markup/javascript/shebang.expect.txt new file mode 100644 index 0000000..0bd20fa --- /dev/null +++ b/highlight-js/test/markup/javascript/shebang.expect.txt @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +var a = 1; diff --git a/highlight-js/test/markup/javascript/shebang.txt b/highlight-js/test/markup/javascript/shebang.txt new file mode 100644 index 0000000..5ea5ac0 --- /dev/null +++ b/highlight-js/test/markup/javascript/shebang.txt @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +var a = 1; diff --git a/highlight-js/test/markup/javascript/template-strings.expect.txt b/highlight-js/test/markup/javascript/template-strings.expect.txt new file mode 100644 index 0000000..74dddc1 --- /dev/null +++ b/highlight-js/test/markup/javascript/template-strings.expect.txt @@ -0,0 +1 @@ +`string ${foo + `str${undefined}ing`}`; diff --git a/highlight-js/test/markup/javascript/template-strings.txt b/highlight-js/test/markup/javascript/template-strings.txt new file mode 100644 index 0000000..a713e0a --- /dev/null +++ b/highlight-js/test/markup/javascript/template-strings.txt @@ -0,0 +1 @@ +`string ${foo + `str${undefined}ing`}`; diff --git a/highlight-js/test/markup/kotlin/class.expect.txt b/highlight-js/test/markup/kotlin/class.expect.txt new file mode 100644 index 0000000..583c2de --- /dev/null +++ b/highlight-js/test/markup/kotlin/class.expect.txt @@ -0,0 +1,16 @@ +class A { +} + +class B() + +class C() {} + +public class D + +class E1<T> +class E2<T, R> +class E3<T,R> + +class F1 : A +class F2 : A, B +class F3 : A<T> \ No newline at end of file diff --git a/highlight-js/test/markup/kotlin/class.txt b/highlight-js/test/markup/kotlin/class.txt new file mode 100644 index 0000000..cb7a911 --- /dev/null +++ b/highlight-js/test/markup/kotlin/class.txt @@ -0,0 +1,16 @@ +class A { +} + +class B() + +class C() {} + +public class D + +class E1 +class E2 +class E3 + +class F1 : A +class F2 : A, B +class F3 : A \ No newline at end of file diff --git a/highlight-js/test/markup/kotlin/function.expect.txt b/highlight-js/test/markup/kotlin/function.expect.txt new file mode 100644 index 0000000..62e3c83 --- /dev/null +++ b/highlight-js/test/markup/kotlin/function.expect.txt @@ -0,0 +1,13 @@ +fun a() = 1 +fun /* b1 */ b(/*b2*/ a : Int /*b3*/) /*b4*/ = a // b5 + + +fun <T> c() : String = "1" +inline fun <reified T> d() { return } + + +fun e( + a : Int, /*a*/ + b : String //b +) +{} diff --git a/highlight-js/test/markup/kotlin/function.txt b/highlight-js/test/markup/kotlin/function.txt new file mode 100644 index 0000000..1bc2a1a --- /dev/null +++ b/highlight-js/test/markup/kotlin/function.txt @@ -0,0 +1,13 @@ +fun a() = 1 +fun /* b1 */ b(/*b2*/ a : Int /*b3*/) /*b4*/ = a // b5 + + +fun c() : String = "1" +inline fun d() { return } + + +fun e( + a : Int, /*a*/ + b : String //b +) +{} \ No newline at end of file diff --git a/highlight-js/test/markup/lasso/delimiters.expect.txt b/highlight-js/test/markup/lasso/delimiters.expect.txt new file mode 100644 index 0000000..c3cab91 --- /dev/null +++ b/highlight-js/test/markup/lasso/delimiters.expect.txt @@ -0,0 +1,7 @@ +<div> +[local(y::decimal = .57721)] +[noprocess] <?lasso delimiters?> [until] [/noprocess] +[no_square_brackets] skip subsequent [square brackets] +<!--ignore <?LassoScript in HTML comments ?>--> +<?=!#y ? true | `string`?> +</div> diff --git a/highlight-js/test/markup/lasso/delimiters.txt b/highlight-js/test/markup/lasso/delimiters.txt new file mode 100644 index 0000000..375ac58 --- /dev/null +++ b/highlight-js/test/markup/lasso/delimiters.txt @@ -0,0 +1,7 @@ +
    +[local(y::decimal = .57721)] +[noprocess] [until] [/noprocess] +[no_square_brackets] skip subsequent [square brackets] + + +
    diff --git a/highlight-js/test/markup/ldif/ldapmodify.expect.txt b/highlight-js/test/markup/ldif/ldapmodify.expect.txt new file mode 100644 index 0000000..c3ba8ab --- /dev/null +++ b/highlight-js/test/markup/ldif/ldapmodify.expect.txt @@ -0,0 +1,7 @@ +dn: uid=user.0,ou=People,dc=example,dc=com +changeType: modify +add: cn +cn: Morris Day +- +add: mobile +mobile: (408) 555-7844 diff --git a/highlight-js/test/markup/ldif/ldapmodify.txt b/highlight-js/test/markup/ldif/ldapmodify.txt new file mode 100644 index 0000000..022b0eb --- /dev/null +++ b/highlight-js/test/markup/ldif/ldapmodify.txt @@ -0,0 +1,7 @@ +dn: uid=user.0,ou=People,dc=example,dc=com +changeType: modify +add: cn +cn: Morris Day +- +add: mobile +mobile: (408) 555-7844 diff --git a/highlight-js/test/markup/ldif/schema.expect.txt b/highlight-js/test/markup/ldif/schema.expect.txt new file mode 100644 index 0000000..0229806 --- /dev/null +++ b/highlight-js/test/markup/ldif/schema.expect.txt @@ -0,0 +1,15 @@ +dn: cn=schema +objectClass: top +objectClass: ldapSubentry +objectClass: subschema +# Single-valued JSON attribute +attributeTypes: ( example-json1-oid NAME 'json1' + EQUALITY jsonObjectExactMatch SYNTAX 1.3.6.1.4.1.30221.2.3.4 + SINGLE-VALUE X-ORIGIN 'custom attribute' ) +# Multi-valued JSON attribute +attributeTypes: ( example-mjson1-oid NAME 'mjson1' + EQUALITY jsonObjectExactMatch SYNTAX 1.3.6.1.4.1.30221.2.3.4 + X-ORIGIN 'custom attribute' ) +objectClasses: ( example-application-oc-oid NAME 'example-application-oc' + SUP top AUXILIARY MAY ( json1 $ mjson1 ) + X-ORIGIN 'custom auxiliary object class' ) diff --git a/highlight-js/test/markup/ldif/schema.txt b/highlight-js/test/markup/ldif/schema.txt new file mode 100644 index 0000000..02a620e --- /dev/null +++ b/highlight-js/test/markup/ldif/schema.txt @@ -0,0 +1,15 @@ +dn: cn=schema +objectClass: top +objectClass: ldapSubentry +objectClass: subschema +# Single-valued JSON attribute +attributeTypes: ( example-json1-oid NAME 'json1' + EQUALITY jsonObjectExactMatch SYNTAX 1.3.6.1.4.1.30221.2.3.4 + SINGLE-VALUE X-ORIGIN 'custom attribute' ) +# Multi-valued JSON attribute +attributeTypes: ( example-mjson1-oid NAME 'mjson1' + EQUALITY jsonObjectExactMatch SYNTAX 1.3.6.1.4.1.30221.2.3.4 + X-ORIGIN 'custom attribute' ) +objectClasses: ( example-application-oc-oid NAME 'example-application-oc' + SUP top AUXILIARY MAY ( json1 $ mjson1 ) + X-ORIGIN 'custom auxiliary object class' ) diff --git a/highlight-js/test/markup/less/selectors.expect.txt b/highlight-js/test/markup/less/selectors.expect.txt new file mode 100644 index 0000000..425530e --- /dev/null +++ b/highlight-js/test/markup/less/selectors.expect.txt @@ -0,0 +1,8 @@ +#foo { + tag #bar {} + > #bar {} + #bar {} + &#bar {} + &:hover {} + height: ~"@{height}px"; +} diff --git a/highlight-js/test/markup/less/selectors.txt b/highlight-js/test/markup/less/selectors.txt new file mode 100644 index 0000000..8a5ed6e --- /dev/null +++ b/highlight-js/test/markup/less/selectors.txt @@ -0,0 +1,8 @@ +#foo { + tag #bar {} + > #bar {} + #bar {} + &#bar {} + &:hover {} + height: ~"@{height}px"; +} diff --git a/highlight-js/test/markup/lisp/mec.expect.txt b/highlight-js/test/markup/lisp/mec.expect.txt new file mode 100644 index 0000000..a1e680d --- /dev/null +++ b/highlight-js/test/markup/lisp/mec.expect.txt @@ -0,0 +1,4 @@ +; MEC: Multiple Escape Characters. See https://github.com/highlightjs/highlight.js/issues/615 +(|spaces and +newlines| x) +(x '|quoted|) diff --git a/highlight-js/test/markup/lisp/mec.txt b/highlight-js/test/markup/lisp/mec.txt new file mode 100644 index 0000000..2a05b15 --- /dev/null +++ b/highlight-js/test/markup/lisp/mec.txt @@ -0,0 +1,4 @@ +; MEC: Multiple Escape Characters. See https://github.com/highlightjs/highlight.js/issues/615 +(|spaces and +newlines| x) +(x '|quoted|) diff --git a/highlight-js/test/markup/markdown/code.expect.txt b/highlight-js/test/markup/markdown/code.expect.txt new file mode 100644 index 0000000..881ec44 --- /dev/null +++ b/highlight-js/test/markup/markdown/code.expect.txt @@ -0,0 +1,8 @@ + var code = true; + + +```javascript +var code = true; +``` + +Inline `code`, and `more code`. diff --git a/highlight-js/test/markup/markdown/code.txt b/highlight-js/test/markup/markdown/code.txt new file mode 100644 index 0000000..d9bed99 --- /dev/null +++ b/highlight-js/test/markup/markdown/code.txt @@ -0,0 +1,8 @@ + var code = true; + + +```javascript +var code = true; +``` + +Inline `code`, and `more code`. diff --git a/highlight-js/test/markup/matlab/block_comment.expect.txt b/highlight-js/test/markup/matlab/block_comment.expect.txt new file mode 100644 index 0000000..2f08800 --- /dev/null +++ b/highlight-js/test/markup/matlab/block_comment.expect.txt @@ -0,0 +1,27 @@ +%{ evaluate_this = false; % Evaluated as regular single-line comment +evaluate_this = true; +%} + +evaluate_this = true; + +%{ +This is a multi-line comment +evaluate_this = false; +%{ +%} + +evaluate_this = true; + +%{ +Opening (%{) and closing (%}) block comment markers can be within a comment block +%} + +evaluate_this = true; + + %{ + Indented block comments can be indented +or not +and whitespace can be added before or after the %{ and %} + %} + +evaluate_this = true; diff --git a/highlight-js/test/markup/matlab/block_comment.txt b/highlight-js/test/markup/matlab/block_comment.txt new file mode 100644 index 0000000..92127cd --- /dev/null +++ b/highlight-js/test/markup/matlab/block_comment.txt @@ -0,0 +1,27 @@ +%{ evaluate_this = false; % Evaluated as regular single-line comment +evaluate_this = true; +%} + +evaluate_this = true; + +%{ +This is a multi-line comment +evaluate_this = false; +%{ +%} + +evaluate_this = true; + +%{ +Opening (%{) and closing (%}) block comment markers can be within a comment block +%} + +evaluate_this = true; + + %{ + Indented block comments can be indented +or not +and whitespace can be added before or after the %{ and %} + %} + +evaluate_this = true; diff --git a/highlight-js/test/markup/matlab/transpose.expect.txt b/highlight-js/test/markup/matlab/transpose.expect.txt new file mode 100644 index 0000000..26fe7f7 --- /dev/null +++ b/highlight-js/test/markup/matlab/transpose.expect.txt @@ -0,0 +1,40 @@ +% This use of ' is for transpose: +mat2x2 = [1 2; 3 4]'; % transpose of a matrix +cell2x2 = {1 2; 3 4}'; % transpose of a cell +v=mat2x2'; % transpose of a variable +v2 = (v')'; % two transpose operations +foo = 1.'; % transpose of scalar 1. + +% Nonconjugate transpose uses .' +mat2x2 = [1 2; 3 4].'; % of a matrix +cell2x2 = {1 2; 3 4}.'; % of a cell +v=mat2x2.'; % of a variable +v2 = (v.').'; % two operations +foo = 1..'; % of scalar 1. +bar = v.''.'.''; % mix of transpose operations + +% single quote strings: +sq1 = 'a single quote string'; +sq2 = ... +' abcd '; % single quote string starting at column 1 +sq3 = ['a','bc']; % array of single quote strings +sq4 = {'a','bc'}; % cell of single quote strings + +% double quote strings +dq1 = "a double string"; +dq2 = ... +" abcd "; % double quote string starting at column 1 +dq3 = ["a","bc"]; % array of double quote strings + +% Mixture of strings and transpose +c2 = {'a','bc'}'; % transpose of a cell of strings +s = ['a','bc']'; % you can transpose vectors of strings (they are really 'char' arrays) +s = s'; % and transpose back +% (s')' is a double transpose of a string +x = [(s')', ' xyz ', 'a single quote in a string'', escape \', two quotes in a string''''']; + +s2 = "abc\"def""ghi"; % newer versions of MATLAB support double quoted strings +s3 = (["abc", "defg"]')'; % transpose a vectors of quoted string twice +s4 = "abc"!; % transpose a quoted string + +b = true' + false'; % boolean constants diff --git a/highlight-js/test/markup/matlab/transpose.txt b/highlight-js/test/markup/matlab/transpose.txt new file mode 100644 index 0000000..d1da28e --- /dev/null +++ b/highlight-js/test/markup/matlab/transpose.txt @@ -0,0 +1,40 @@ +% This use of ' is for transpose: +mat2x2 = [1 2; 3 4]'; % transpose of a matrix +cell2x2 = {1 2; 3 4}'; % transpose of a cell +v=mat2x2'; % transpose of a variable +v2 = (v')'; % two transpose operations +foo = 1.'; % transpose of scalar 1. + +% Nonconjugate transpose uses .' +mat2x2 = [1 2; 3 4].'; % of a matrix +cell2x2 = {1 2; 3 4}.'; % of a cell +v=mat2x2.'; % of a variable +v2 = (v.').'; % two operations +foo = 1..'; % of scalar 1. +bar = v.''.'.''; % mix of transpose operations + +% single quote strings: +sq1 = 'a single quote string'; +sq2 = ... +' abcd '; % single quote string starting at column 1 +sq3 = ['a','bc']; % array of single quote strings +sq4 = {'a','bc'}; % cell of single quote strings + +% double quote strings +dq1 = "a double string"; +dq2 = ... +" abcd "; % double quote string starting at column 1 +dq3 = ["a","bc"]; % array of double quote strings + +% Mixture of strings and transpose +c2 = {'a','bc'}'; % transpose of a cell of strings +s = ['a','bc']'; % you can transpose vectors of strings (they are really 'char' arrays) +s = s'; % and transpose back +% (s')' is a double transpose of a string +x = [(s')', ' xyz ', 'a single quote in a string'', escape \', two quotes in a string''''']; + +s2 = "abc\"def""ghi"; % newer versions of MATLAB support double quoted strings +s3 = (["abc", "defg"]')'; % transpose a vectors of quoted string twice +s4 = "abc"!; % transpose a quoted string + +b = true' + false'; % boolean constants diff --git a/highlight-js/test/markup/maxima/example.expect.txt b/highlight-js/test/markup/maxima/example.expect.txt new file mode 100644 index 0000000..0e23890 --- /dev/null +++ b/highlight-js/test/markup/maxima/example.expect.txt @@ -0,0 +1,42 @@ +/* Maxima computer algebra system */ + +print ("mumble"); + +/* this + /* this is + /* this is a nested comment */ nested comment + */ comment + */ + +sin(%pi); /* should be highlighted again */ + +/* programming keywords */ + +if a then b elseif c then d else f; +for x:1 thru 10 step 2 do print(x); +for z:-2 while z < 0 do print(z); +for m:0 unless m > 10 do print(m); +for x in [1, 2, 3] do print(x); +foo and bar or not baz; + +/* different kinds of integers */ + +ibase : 18 $ +[0, 1234, 1234., 0abcdefgh]; +reset (ibase) $ + +/* strings */ + +s1 : "\"now\" is"; +s2 : "the 'time' for all good men"; +print (s1, s2, "to come to the aid", + "of their country"); + +/* expressions */ + +foo (x, y, z) := + if x > 1 + y + then z - x*y + elseif y <= 100! + then x/(y + z)^2 + else z - y . x . y; diff --git a/highlight-js/test/markup/maxima/example.txt b/highlight-js/test/markup/maxima/example.txt new file mode 100644 index 0000000..206f969 --- /dev/null +++ b/highlight-js/test/markup/maxima/example.txt @@ -0,0 +1,42 @@ +/* Maxima computer algebra system */ + +print ("mumble"); + +/* this + /* this is + /* this is a nested comment */ nested comment + */ comment + */ + +sin(%pi); /* should be highlighted again */ + +/* programming keywords */ + +if a then b elseif c then d else f; +for x:1 thru 10 step 2 do print(x); +for z:-2 while z < 0 do print(z); +for m:0 unless m > 10 do print(m); +for x in [1, 2, 3] do print(x); +foo and bar or not baz; + +/* different kinds of integers */ + +ibase : 18 $ +[0, 1234, 1234., 0abcdefgh]; +reset (ibase) $ + +/* strings */ + +s1 : "\"now\" is"; +s2 : "the 'time' for all good men"; +print (s1, s2, "to come to the aid", + "of their country"); + +/* expressions */ + +foo (x, y, z) := + if x > 1 + y + then z - x*y + elseif y <= 100! + then x/(y + z)^2 + else z - y . x . y; diff --git a/highlight-js/test/markup/maxima/numbers.expect.txt b/highlight-js/test/markup/maxima/numbers.expect.txt new file mode 100644 index 0000000..61fc9dd --- /dev/null +++ b/highlight-js/test/markup/maxima/numbers.expect.txt @@ -0,0 +1,24 @@ +0 +0. +12345. +12345 +0.0 +123.45 +0e0 +0b0 +12345e0 +12345e123 +12345e-123 +12345e+123 +12345b0 +12345b123 +12345b-123 +12345b+123 +1.2345e0 +1.2345e123 +1.2345e-123 +1.2345e+123 +1.2345b0 +1.2345b123 +1.2345b-123 +1.2345b+123 diff --git a/highlight-js/test/markup/maxima/numbers.txt b/highlight-js/test/markup/maxima/numbers.txt new file mode 100644 index 0000000..b93e4d5 --- /dev/null +++ b/highlight-js/test/markup/maxima/numbers.txt @@ -0,0 +1,24 @@ +0 +0. +12345. +12345 +0.0 +123.45 +0e0 +0b0 +12345e0 +12345e123 +12345e-123 +12345e+123 +12345b0 +12345b123 +12345b-123 +12345b+123 +1.2345e0 +1.2345e123 +1.2345e-123 +1.2345e+123 +1.2345b0 +1.2345b123 +1.2345b-123 +1.2345b+123 diff --git a/highlight-js/test/markup/maxima/symbols.expect.txt b/highlight-js/test/markup/maxima/symbols.expect.txt new file mode 100644 index 0000000..de72666 --- /dev/null +++ b/highlight-js/test/markup/maxima/symbols.expect.txt @@ -0,0 +1,18 @@ +/* symbolic constants */ + +[true, false, unknown, inf, minf, ind, + und, %e, %i, %pi, %phi, %gamma]; + +/* built-in variables */ + +[_, __, %, %%, linel, simp, dispflag, + stringdisp, lispdisp, %edispflag]; + +/* built-in functions */ + +[sin, cosh, exp, atan2, sqrt, log, struve_h, + sublist_indices, read_array]; + +/* user-defined symbols */ + +[foo, ?bar, baz%, quux_mumble_blurf]; diff --git a/highlight-js/test/markup/maxima/symbols.txt b/highlight-js/test/markup/maxima/symbols.txt new file mode 100644 index 0000000..e22b0c2 --- /dev/null +++ b/highlight-js/test/markup/maxima/symbols.txt @@ -0,0 +1,18 @@ +/* symbolic constants */ + +[true, false, unknown, inf, minf, ind, + und, %e, %i, %pi, %phi, %gamma]; + +/* built-in variables */ + +[_, __, %, %%, linel, simp, dispflag, + stringdisp, lispdisp, %edispflag]; + +/* built-in functions */ + +[sin, cosh, exp, atan2, sqrt, log, struve_h, + sublist_indices, read_array]; + +/* user-defined symbols */ + +[foo, ?bar, baz%, quux_mumble_blurf]; diff --git a/highlight-js/test/markup/ocaml/literals.expect.txt b/highlight-js/test/markup/ocaml/literals.expect.txt new file mode 100644 index 0000000..d0c95be --- /dev/null +++ b/highlight-js/test/markup/ocaml/literals.expect.txt @@ -0,0 +1,29 @@ +let i = 14 +let i = -14 +let i = 1_000 +let i = 0b100 +let i = 0x1FF +let i = 0o777 +let i64 = 128L +let i64 = 0b10L +let i32 = 32l +let i32 = 0x12l +let nat = 10n +let nat = 0o644n +let f = 5. +let f = 5.1 +let f = 1e+1 +let f = 1e1 +let f = 1e-1 +let f = 1_024e12 +let f = 1L + +let b = true || false +let l = [] +let a = [||] +let () = ignore (b) + +let c = 'a' +let c = '\xFF' +let c = '\128' +let c = '\n' diff --git a/highlight-js/test/markup/ocaml/literals.txt b/highlight-js/test/markup/ocaml/literals.txt new file mode 100644 index 0000000..d9d3632 --- /dev/null +++ b/highlight-js/test/markup/ocaml/literals.txt @@ -0,0 +1,29 @@ +let i = 14 +let i = -14 +let i = 1_000 +let i = 0b100 +let i = 0x1FF +let i = 0o777 +let i64 = 128L +let i64 = 0b10L +let i32 = 32l +let i32 = 0x12l +let nat = 10n +let nat = 0o644n +let f = 5. +let f = 5.1 +let f = 1e+1 +let f = 1e1 +let f = 1e-1 +let f = 1_024e12 +let f = 1L + +let b = true || false +let l = [] +let a = [||] +let () = ignore (b) + +let c = 'a' +let c = '\xFF' +let c = '\128' +let c = '\n' diff --git a/highlight-js/test/markup/ocaml/types.expect.txt b/highlight-js/test/markup/ocaml/types.expect.txt new file mode 100644 index 0000000..1c28405 --- /dev/null +++ b/highlight-js/test/markup/ocaml/types.expect.txt @@ -0,0 +1,17 @@ +(* type variables *) +type 'a t = 'a list +let f (a : 'a list) : 'a = List.hd a + +(* polymorphic variants *) +type t = [ `A | `B ] + +(* variants *) +type result = Sat | Unsat | Unknown + +(* module and module types *) +module type S = sig + val compute : unit -> unit +end +module Impl : S = struct + let compute () = () +end diff --git a/highlight-js/test/markup/ocaml/types.txt b/highlight-js/test/markup/ocaml/types.txt new file mode 100644 index 0000000..c18ed56 --- /dev/null +++ b/highlight-js/test/markup/ocaml/types.txt @@ -0,0 +1,17 @@ +(* type variables *) +type 'a t = 'a list +let f (a : 'a list) : 'a = List.hd a + +(* polymorphic variants *) +type t = [ `A | `B ] + +(* variants *) +type result = Sat | Unsat | Unknown + +(* module and module types *) +module type S = sig + val compute : unit -> unit +end +module Impl : S = struct + let compute () = () +end diff --git a/highlight-js/test/markup/pgsql/clauses.expect.txt b/highlight-js/test/markup/pgsql/clauses.expect.txt new file mode 100644 index 0000000..736d57e --- /dev/null +++ b/highlight-js/test/markup/pgsql/clauses.expect.txt @@ -0,0 +1,67 @@ +-- clauses + +ADD, ADD COLUMN, +ALTER, +DROP, DROP COLUMN, +SET, SET ( .. ), +ON, + ACCESS METHOD, + AGGREGATE, + ATTRIBUTE, + CASCADE, + COLLATION, + COLUMN, + CONFLICT, + CONSTRAINT, + CONVERSION, + DATABASE, + DEFAULT, + DOMAIN, + EVENT TRIGGER, + EXTENSION, + EVENT TRIGGER, + FOREIGN DATA WRAPPER, + FOREIGN TABLE, + FROM CURRENT, + FUNCTION, + IDENTITY, + INDEX, + ISOLATION LEVEL SERIALIZABLE, ISOLATION LEVEL REPEATABLE READ, + ISOLATION LEVEL READ COMMITTED, ISOLATION LEVEL READ UNCOMMITTED, + LARGE OBJECT, + LOGGED, UNLOGGED, + MAPPING FOR .. WITH .., MAPPING REPLACE .. WITH .., + MATERIALIZED VIEW, + NOT VALID, + OPERATOR, + OPERATOR CLASS .. USING .., + OPERATOR FAMILY .. USING .., + POLICY, + PROCEDURAL LANGUAGE, + PROCEDURE, + PUBLICATION, + READ WRITE, READ ONLY, + RESTRICT, + ROLE, + ROUTINE, + RULE, + SCHEMA, + SEQUENCE, + SERVER, + STATISTICS, + STORAGE PLAIN, STORAGE EXTERNAL, STORAGE EXTENDED, STORAGE MAIN, + SUBSCRIPTION, + TABLE, + TABLESPACE, + TEXT SEARCH CONFIGURATION, + TEXT SEARCH DICTIONARY, + TEXT SEARCH PARSER, + TEXT SEARCH TEMPLATE, + TRANSFORM FOR .. LANGUAGE SQL, + TRIGGER, + TYPE, + VALUE, + VIEW, + WITH OIDS, WITHOUT OIDS, + WITHOUT CLUSTER, +SET DATA TYPE; diff --git a/highlight-js/test/markup/pgsql/clauses.txt b/highlight-js/test/markup/pgsql/clauses.txt new file mode 100644 index 0000000..283429f --- /dev/null +++ b/highlight-js/test/markup/pgsql/clauses.txt @@ -0,0 +1,67 @@ +-- clauses + +ADD, ADD COLUMN, +ALTER, +DROP, DROP COLUMN, +SET, SET ( .. ), +ON, + ACCESS METHOD, + AGGREGATE, + ATTRIBUTE, + CASCADE, + COLLATION, + COLUMN, + CONFLICT, + CONSTRAINT, + CONVERSION, + DATABASE, + DEFAULT, + DOMAIN, + EVENT TRIGGER, + EXTENSION, + EVENT TRIGGER, + FOREIGN DATA WRAPPER, + FOREIGN TABLE, + FROM CURRENT, + FUNCTION, + IDENTITY, + INDEX, + ISOLATION LEVEL SERIALIZABLE, ISOLATION LEVEL REPEATABLE READ, + ISOLATION LEVEL READ COMMITTED, ISOLATION LEVEL READ UNCOMMITTED, + LARGE OBJECT, + LOGGED, UNLOGGED, + MAPPING FOR .. WITH .., MAPPING REPLACE .. WITH .., + MATERIALIZED VIEW, + NOT VALID, + OPERATOR, + OPERATOR CLASS .. USING .., + OPERATOR FAMILY .. USING .., + POLICY, + PROCEDURAL LANGUAGE, + PROCEDURE, + PUBLICATION, + READ WRITE, READ ONLY, + RESTRICT, + ROLE, + ROUTINE, + RULE, + SCHEMA, + SEQUENCE, + SERVER, + STATISTICS, + STORAGE PLAIN, STORAGE EXTERNAL, STORAGE EXTENDED, STORAGE MAIN, + SUBSCRIPTION, + TABLE, + TABLESPACE, + TEXT SEARCH CONFIGURATION, + TEXT SEARCH DICTIONARY, + TEXT SEARCH PARSER, + TEXT SEARCH TEMPLATE, + TRANSFORM FOR .. LANGUAGE SQL, + TRIGGER, + TYPE, + VALUE, + VIEW, + WITH OIDS, WITHOUT OIDS, + WITHOUT CLUSTER, +SET DATA TYPE; diff --git a/highlight-js/test/markup/pgsql/clauses2.expect.txt b/highlight-js/test/markup/pgsql/clauses2.expect.txt new file mode 100644 index 0000000..9988ed9 --- /dev/null +++ b/highlight-js/test/markup/pgsql/clauses2.expect.txt @@ -0,0 +1,160 @@ +-- clauses (part 2) + +ADMIN OPTION, +ALL, +ANALYZE, ANALYZE ( .. ), +AS ASSIGNMENT, AS IMPLICIT, +AS PERMISSIVE, AS RESTRICTIVE, +AS ENUM, AS RANGE, +AS ( .. ), -- select +ASC, DESC, +ATTACH PARTITION, +AUTHORIZATION, +BEFORE, AFTER, INSTEAD OF, +CACHE 100, NO CYCLE, +CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUT, +COLLATE, +CONCURRENTLY, +CONNECTION '..', +CONSTRAINT, +COST 100, +CLUSTER ON, +CURSOR, +DEPENDS ON EXTENSION, +DISABLE, ENABLE + REPLICA, ALWAYS, + TRIGGER, TRIGGER USER, REPLICA TRIGGER, ALWAYS TRIGGER, TRIGGER ALL, + RULE, REPLICA RULE, ALWAYS RULE, + ROW LEVEL SECURITY, FORCE ROW LEVEL SECURITY, NO FORCE ROW LEVEL SECURITY, +DISCARD PLANS, +DISTINCT, DISTINCT ON ( .. ), -- select +DO ALSO .., DO INSTEAD .., DO ALSO NOTHING, DO INSTEAD NOTHING, +DO NOTHING, DO UPDATE, +EXCEPT, +EXECUTE PROCEDURE, +EXPLAIN ( .. ), +EXTERNAL, +FAMILY, +FOR ROLE .. IN SCHEMA, +FOR USER, +FOR SEARCH, FOR ORDER BY, +FOR TABLE, FOR ALL TABLES, +FOR VALUES, FOR VALUES FROM .. TO, FOR VALUES IN ( .. ), +FOR ROW, FOR EACH ROW, FOR STATEMENT, FOR EACH STATEMENT, +FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE, FOR KEY SHARE, +FROM, +FROM '..', FROM PROGRAM, FROM STDIN, +FROM SQL WITH FUNCTION, TO SQL WITH FUNCTION, +FROM ( .. ), -- select +FUNCTION, FUNCTIONS, +GLOBAL, -- create global table +GROUP BY, +HAVING, +SELECT, + INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, USAGE, EXECUTE, ALL PRIVILEGES, + CONNECT, TEMPORARY, TEMP, +HANDLER, NO HANDLER +IF EXISTS, IF NOT EXISTS, +IMMUTABLE, +IN + ACCESS SHARE MODE, ROW SHARE MODE, ROW EXCLUSIVE MODE, SHARE UPDATE EXCLUSIVE MODE, + SHARE MODE, SHARE ROW EXCLUSIVE MODE, EXCLUSIVE MODE, ACCESS EXCLUSIVE MODE, +INCREMENT 100, INCREMENT BY 100, +INHERIT, NO INHERIT, +INHERITS ( .. ), +INLINE, +INTO, +JOIN, INNER JOIN, LEFT OUTER JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN, +LANGUAGE, +LATERAL, +LEAKPROOF, NOT LEAKPROOF, +LIMIT, LIMIT TO, +LOCAL, -- create local table, set +LOCATION, +MAXVALUE 100, NO MAXVALUE, +MINVALUE 100, NO MINVALUE, +NATURAL, +FETCH NEXT, FETCH PRIOR, FETCH FIRST, FETCH LAST, FETCH ABSOLUTE 10, FETCH RELATIVE 10, + FETCH ALL, FETCH FORWARD, FETCH FORWARD 10, FETCH FORWARD ALL, + FETCH BACKWARD, FETCH BACKWARD 10, FETCH BACKWARD ALL, +NOWAIT, +NULLS FIRST, NULLS LAST, +OFFSET 10 ROW, OFFSET 10 ROWS, -- select +ON TABLES, ON SEQUENCES, ON FUNCTIONS, ON ROUTINES, ON TYPES, ON SCHEMAS, +ON COMMIT PRESERVE ROWS, ON COMMIT DELETE ROWS, ON COMMIT DROP, +ONLY, +OPTIONS ( .. ), +OPERATOR, +OR REPLACE, +OVERRIDING SYSTEM VALUE, OVERRIDING USER VALUE, +OWNER TO .., OWNER TO CURRENT_USER, OWNER TO SESSION_USER, +OWNED BY, +PARALLEL UNSAFE, PARALLEL RESTRICTED, PARALLEL SAFE, +PARTITION BY RANGE (), PARTITION BY LIST (), PARTITION BY HASH (), +PARTITION OF .., +PREPARE, +PROCEDURAL, +PROCEDURES, +RECURSIVE, -- create view +REFERENCING OLD TABLE, REFERENCING NEW TABLE, +REFRESH VERSION, REFRESH PUBLICATION ( .. ), +REINDEX ( .. ), +REPEATABLE ( .. ), -- select +REPLICA IDENTITY + DEFAULT, USING INDEX, FULL, NOTHING, +RENAME + CONSTRAINT .. TO, TO, COLUMN .. TO, +RESET, RESET ALL, RESET ( .. ), +RESTART 100, RESTART WITH 100, +RESTART IDENTITY, CONTINUE IDENTITY, -- truncate +RETURNS, RETURNS TABLE ( .. ), +RETURNING, +ROLLUP ( .. ), CUBE ( .. ), GROUPING SETS ( .. ), +ROUTINES, +ROW, ROW ( .. ), +GRANT OPTION, +ROWS 100, +SCROLL CURSOR, NO SCROLL CURSOR, BINARY CURSOR, INSENSITIVE CURSOR, -- declare +SEQUENCES, +SECURITY INVOKER, SECURITY DEFINER, +SERVER, +SESSION, -- set +SKIP LOCKED, -- select +SNAPSHOT, -- set transaction +STABLE, +START 100, START WITH 100, +STORAGE, +STRICT, +SYSTEM, -- reindex +TABLES, +TABLESAMPLE, +TEMPORARY, TEMP, -- create sequence/table/view, discard +TO GROUP, PUBLIC WITH GRANT OPTION, +TO '..', TO PROGRAM, TO STDOUT, +TRANSFORM FOR TYPE, +TRUSTED, +TYPE, +UNIQUE, +UNION, INTERSECT, EXCEPT, -- select +UNLOGGED, +UPDATE TO, +USING .., USING ( .. ), +VACUUM ( .. ), +VALIDATE CONSTRAINT, +VALIDATOR, NO VALIDATOR, +VALUES, VALUES ( .. ), +VERBOSE, +VOLATILE, +WHEN ( .. ), +WHERE, WHERE CURRENT OF, +WINDOW, +WITH, WITH RECURSIVE, +WITH ALLOW_CONNECTIONS 10 CONNECTION LIMIT 1 IS_TEMPLATE true, +WITH CHECK ( .. ), +WITH DATA, WITH NO DATA, +WITH FUNCTION, WITHOUT FUNCTION, WITH INOUT, +WITH OPTIONS, +WITH ORDINALITY, -- select +WITH CASCADED CHECK OPTION, WITH LOCAL CHECK OPTION, +WITH HOLD, WITHOUT HOLD, -- declare +WITH, WITH ( .. ), (); diff --git a/highlight-js/test/markup/pgsql/clauses2.txt b/highlight-js/test/markup/pgsql/clauses2.txt new file mode 100644 index 0000000..f9e55fb --- /dev/null +++ b/highlight-js/test/markup/pgsql/clauses2.txt @@ -0,0 +1,160 @@ +-- clauses (part 2) + +ADMIN OPTION, +ALL, +ANALYZE, ANALYZE ( .. ), +AS ASSIGNMENT, AS IMPLICIT, +AS PERMISSIVE, AS RESTRICTIVE, +AS ENUM, AS RANGE, +AS ( .. ), -- select +ASC, DESC, +ATTACH PARTITION, +AUTHORIZATION, +BEFORE, AFTER, INSTEAD OF, +CACHE 100, NO CYCLE, +CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUT, +COLLATE, +CONCURRENTLY, +CONNECTION '..', +CONSTRAINT, +COST 100, +CLUSTER ON, +CURSOR, +DEPENDS ON EXTENSION, +DISABLE, ENABLE + REPLICA, ALWAYS, + TRIGGER, TRIGGER USER, REPLICA TRIGGER, ALWAYS TRIGGER, TRIGGER ALL, + RULE, REPLICA RULE, ALWAYS RULE, + ROW LEVEL SECURITY, FORCE ROW LEVEL SECURITY, NO FORCE ROW LEVEL SECURITY, +DISCARD PLANS, +DISTINCT, DISTINCT ON ( .. ), -- select +DO ALSO .., DO INSTEAD .., DO ALSO NOTHING, DO INSTEAD NOTHING, +DO NOTHING, DO UPDATE, +EXCEPT, +EXECUTE PROCEDURE, +EXPLAIN ( .. ), +EXTERNAL, +FAMILY, +FOR ROLE .. IN SCHEMA, +FOR USER, +FOR SEARCH, FOR ORDER BY, +FOR TABLE, FOR ALL TABLES, +FOR VALUES, FOR VALUES FROM .. TO, FOR VALUES IN ( .. ), +FOR ROW, FOR EACH ROW, FOR STATEMENT, FOR EACH STATEMENT, +FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE, FOR KEY SHARE, +FROM, +FROM '..', FROM PROGRAM, FROM STDIN, +FROM SQL WITH FUNCTION, TO SQL WITH FUNCTION, +FROM ( .. ), -- select +FUNCTION, FUNCTIONS, +GLOBAL, -- create global table +GROUP BY, +HAVING, +SELECT, + INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, USAGE, EXECUTE, ALL PRIVILEGES, + CONNECT, TEMPORARY, TEMP, +HANDLER, NO HANDLER +IF EXISTS, IF NOT EXISTS, +IMMUTABLE, +IN + ACCESS SHARE MODE, ROW SHARE MODE, ROW EXCLUSIVE MODE, SHARE UPDATE EXCLUSIVE MODE, + SHARE MODE, SHARE ROW EXCLUSIVE MODE, EXCLUSIVE MODE, ACCESS EXCLUSIVE MODE, +INCREMENT 100, INCREMENT BY 100, +INHERIT, NO INHERIT, +INHERITS ( .. ), +INLINE, +INTO, +JOIN, INNER JOIN, LEFT OUTER JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN, +LANGUAGE, +LATERAL, +LEAKPROOF, NOT LEAKPROOF, +LIMIT, LIMIT TO, +LOCAL, -- create local table, set +LOCATION, +MAXVALUE 100, NO MAXVALUE, +MINVALUE 100, NO MINVALUE, +NATURAL, +FETCH NEXT, FETCH PRIOR, FETCH FIRST, FETCH LAST, FETCH ABSOLUTE 10, FETCH RELATIVE 10, + FETCH ALL, FETCH FORWARD, FETCH FORWARD 10, FETCH FORWARD ALL, + FETCH BACKWARD, FETCH BACKWARD 10, FETCH BACKWARD ALL, +NOWAIT, +NULLS FIRST, NULLS LAST, +OFFSET 10 ROW, OFFSET 10 ROWS, -- select +ON TABLES, ON SEQUENCES, ON FUNCTIONS, ON ROUTINES, ON TYPES, ON SCHEMAS, +ON COMMIT PRESERVE ROWS, ON COMMIT DELETE ROWS, ON COMMIT DROP, +ONLY, +OPTIONS ( .. ), +OPERATOR, +OR REPLACE, +OVERRIDING SYSTEM VALUE, OVERRIDING USER VALUE, +OWNER TO .., OWNER TO CURRENT_USER, OWNER TO SESSION_USER, +OWNED BY, +PARALLEL UNSAFE, PARALLEL RESTRICTED, PARALLEL SAFE, +PARTITION BY RANGE (), PARTITION BY LIST (), PARTITION BY HASH (), +PARTITION OF .., +PREPARE, +PROCEDURAL, +PROCEDURES, +RECURSIVE, -- create view +REFERENCING OLD TABLE, REFERENCING NEW TABLE, +REFRESH VERSION, REFRESH PUBLICATION ( .. ), +REINDEX ( .. ), +REPEATABLE ( .. ), -- select +REPLICA IDENTITY + DEFAULT, USING INDEX, FULL, NOTHING, +RENAME + CONSTRAINT .. TO, TO, COLUMN .. TO, +RESET, RESET ALL, RESET ( .. ), +RESTART 100, RESTART WITH 100, +RESTART IDENTITY, CONTINUE IDENTITY, -- truncate +RETURNS, RETURNS TABLE ( .. ), +RETURNING, +ROLLUP ( .. ), CUBE ( .. ), GROUPING SETS ( .. ), +ROUTINES, +ROW, ROW ( .. ), +GRANT OPTION, +ROWS 100, +SCROLL CURSOR, NO SCROLL CURSOR, BINARY CURSOR, INSENSITIVE CURSOR, -- declare +SEQUENCES, +SECURITY INVOKER, SECURITY DEFINER, +SERVER, +SESSION, -- set +SKIP LOCKED, -- select +SNAPSHOT, -- set transaction +STABLE, +START 100, START WITH 100, +STORAGE, +STRICT, +SYSTEM, -- reindex +TABLES, +TABLESAMPLE, +TEMPORARY, TEMP, -- create sequence/table/view, discard +TO GROUP, PUBLIC WITH GRANT OPTION, +TO '..', TO PROGRAM, TO STDOUT, +TRANSFORM FOR TYPE, +TRUSTED, +TYPE, +UNIQUE, +UNION, INTERSECT, EXCEPT, -- select +UNLOGGED, +UPDATE TO, +USING .., USING ( .. ), +VACUUM ( .. ), +VALIDATE CONSTRAINT, +VALIDATOR, NO VALIDATOR, +VALUES, VALUES ( .. ), +VERBOSE, +VOLATILE, +WHEN ( .. ), +WHERE, WHERE CURRENT OF, +WINDOW, +WITH, WITH RECURSIVE, +WITH ALLOW_CONNECTIONS 10 CONNECTION LIMIT 1 IS_TEMPLATE true, +WITH CHECK ( .. ), +WITH DATA, WITH NO DATA, +WITH FUNCTION, WITHOUT FUNCTION, WITH INOUT, +WITH OPTIONS, +WITH ORDINALITY, -- select +WITH CASCADED CHECK OPTION, WITH LOCAL CHECK OPTION, +WITH HOLD, WITHOUT HOLD, -- declare +WITH, WITH ( .. ), (); diff --git a/highlight-js/test/markup/pgsql/constraints.expect.txt b/highlight-js/test/markup/pgsql/constraints.expect.txt new file mode 100644 index 0000000..56d273a --- /dev/null +++ b/highlight-js/test/markup/pgsql/constraints.expect.txt @@ -0,0 +1,21 @@ +-- column_constraint, table_constraint: + +CONSTRAINT, +NOT NULL, NULL, +CHECK ( .. ) NO INHERIT, +DEFAULT .., +EXCLUDE USING .. ( .. WITH .. ) .. WHERE ( .. ), +GENERATED ALWAYS AS IDENTITY, +GENERATED ALWAYS AS IDENTITY ( .. ), +GENERATED BY DEFAULT AS IDENTITY, +UNIQUE .., UNIQUE ( .. ), +PRIMARY KEY .., PRIMARY KEY ( .. ), +REFERENCES, REFERENCES .. ( .. ), +MATCH FULL, MATCH PARTIAL, MATCH SIMPLE, +ON DELETE .., ON UPDATE .., +DEFERRABLE, NOT DEFERRABLE, INITIALLY DEFERRED, INITIALLY IMMEDIATE, +FOREIGN KEY ( .. ) REFERENCES, +USING INDEX bar, +INCLUDE ( .. ), +WITH ( .. ), +USING INDEX TABLESPACE; diff --git a/highlight-js/test/markup/pgsql/constraints.txt b/highlight-js/test/markup/pgsql/constraints.txt new file mode 100644 index 0000000..6f0fdb5 --- /dev/null +++ b/highlight-js/test/markup/pgsql/constraints.txt @@ -0,0 +1,21 @@ +-- column_constraint, table_constraint: + +CONSTRAINT, +NOT NULL, NULL, +CHECK ( .. ) NO INHERIT, +DEFAULT .., +EXCLUDE USING .. ( .. WITH .. ) .. WHERE ( .. ), +GENERATED ALWAYS AS IDENTITY, +GENERATED ALWAYS AS IDENTITY ( .. ), +GENERATED BY DEFAULT AS IDENTITY, +UNIQUE .., UNIQUE ( .. ), +PRIMARY KEY .., PRIMARY KEY ( .. ), +REFERENCES, REFERENCES .. ( .. ), +MATCH FULL, MATCH PARTIAL, MATCH SIMPLE, +ON DELETE .., ON UPDATE .., +DEFERRABLE, NOT DEFERRABLE, INITIALLY DEFERRED, INITIALLY IMMEDIATE, +FOREIGN KEY ( .. ) REFERENCES, +USING INDEX bar, +INCLUDE ( .. ), +WITH ( .. ), +USING INDEX TABLESPACE; diff --git a/highlight-js/test/markup/pgsql/options.expect.txt b/highlight-js/test/markup/pgsql/options.expect.txt new file mode 100644 index 0000000..d9b4414 --- /dev/null +++ b/highlight-js/test/markup/pgsql/options.expect.txt @@ -0,0 +1,44 @@ +-- options of some commands + +WITH, WITH ( .. ), (), + -- alter/create role + SUPERUSER, NOSUPERUSER, CREATEDB, NOCREATEDB, CREATEROLE, NOCREATEROLE, INHERIT, NOINHERIT, + LOGIN, NOLOGIN, REPLICATION, NOREPLICATION, BYPASSRLS, NOBYPASSRLS, CONNECTION LIMIT 100, + ENCRYPTED PASSWORD, UNENCRYPTED PASSWORD, VALID UNTIL '2020-01-01', + IN ROLE, IN GROUP, ROLE, ADMIN, USER, SYSID; + -- copy + FORMAT, OIDS, FREEZE, DELIMITER, NULL '..', HEADER, QUOTE, ESCAPE, FORCE_QUOTE, + FORCE_NOT_NULL, FORCE_NULL, ENCODING; + -- create aggregate + BASETYPE=, SFUNC=, STYPE=, SSPACE=, FINALFUNC=, FINALFUNC_EXTRA=, + FINALFUNC_MODIFY=, COMBINEFUNC=, SERIALFUNC=, DESERIALFUNC=, + INITCOND=, MSFUNC=, MINVFUNC=, MSTYPE=, MSSPACE=, MFINALFUNC=, MFINALFUNC_EXTRA=, + MFINALFUNC_MODIFY=, MINITCOND=, SORTOP=, PARALLEL=; + -- create collation + LOCALE=, LC_COLLATE=, LC_CTYPE=, PROVIDER=, VERSION=; + -- create dataase + OWNER=, TEMPLATE=, ENCODING=, LC_COLLATE=, LC_CTYPE=, TABLESPACE=, ALLOW_CONNECTIONS=, + CONNECTION LIMIT=, IS_TEMPLATE=; + -- create extension + SCHEMA, VERSION, FROM, CASCADE; + -- create operator + PROCEDURE=, LEFTARG=, RIGHTARG=, COMMUTATOR=, NEGATOR=, RESTRICT=, JOIN=, HASHES=, MERGES= + -- create text search configuration + PARSER=, COPY=; + -- create text search dictionary + TEMPLATE=; + -- create text search parser + START=, GETTOKEN=, END=, LEXTYPES=, HEADLINE=; + -- create text search template + INIT=, LEXIZE=; + -- create type + SUBTYPE=, SUBTYPE_OPCLASS=, COLLATION=, CANONICAL=, SUBTYPE_DIFF=, + INPUT=, OUTPUT=, RECEIVE=, SEND=, TYPMOD_IN=, TYPMOD_OUT=, ANALYZE=, INTERNALLENGTH=, PASSEDBYVALUE=, + ALIGNMENT=, STORAGE=, LIKE=, CATEGORY=, PREFERRED=, DEFAULT=, ELEMENT=, DELIMITER=, COLLATABLE=; + -- analyze/explain/vacuum + ANALYZE, VERBOSE, COSTS, BUFFERS, TIMING, SUMMARY, FORMAT TEXT, FORMAT XML, FORMAT JSON, + FORMAT YAML, FREEZE, FULL, DISABLE_PAGE_SKIPPING; + +-- table like options + +TABLE t1(LIKE t1 INCLUDING COMMENTS INCLUDING CONSTRAINTS EXCLUDING DEFAULTS INCLUDING IDENTITY INCLUDING INDEXES INCLUDING STATISTICS INCLUDING STORAGE EXCLUDING ALL); diff --git a/highlight-js/test/markup/pgsql/options.txt b/highlight-js/test/markup/pgsql/options.txt new file mode 100644 index 0000000..17627c7 --- /dev/null +++ b/highlight-js/test/markup/pgsql/options.txt @@ -0,0 +1,44 @@ +-- options of some commands + +WITH, WITH ( .. ), (), + -- alter/create role + SUPERUSER, NOSUPERUSER, CREATEDB, NOCREATEDB, CREATEROLE, NOCREATEROLE, INHERIT, NOINHERIT, + LOGIN, NOLOGIN, REPLICATION, NOREPLICATION, BYPASSRLS, NOBYPASSRLS, CONNECTION LIMIT 100, + ENCRYPTED PASSWORD, UNENCRYPTED PASSWORD, VALID UNTIL '2020-01-01', + IN ROLE, IN GROUP, ROLE, ADMIN, USER, SYSID; + -- copy + FORMAT, OIDS, FREEZE, DELIMITER, NULL '..', HEADER, QUOTE, ESCAPE, FORCE_QUOTE, + FORCE_NOT_NULL, FORCE_NULL, ENCODING; + -- create aggregate + BASETYPE=, SFUNC=, STYPE=, SSPACE=, FINALFUNC=, FINALFUNC_EXTRA=, + FINALFUNC_MODIFY=, COMBINEFUNC=, SERIALFUNC=, DESERIALFUNC=, + INITCOND=, MSFUNC=, MINVFUNC=, MSTYPE=, MSSPACE=, MFINALFUNC=, MFINALFUNC_EXTRA=, + MFINALFUNC_MODIFY=, MINITCOND=, SORTOP=, PARALLEL=; + -- create collation + LOCALE=, LC_COLLATE=, LC_CTYPE=, PROVIDER=, VERSION=; + -- create dataase + OWNER=, TEMPLATE=, ENCODING=, LC_COLLATE=, LC_CTYPE=, TABLESPACE=, ALLOW_CONNECTIONS=, + CONNECTION LIMIT=, IS_TEMPLATE=; + -- create extension + SCHEMA, VERSION, FROM, CASCADE; + -- create operator + PROCEDURE=, LEFTARG=, RIGHTARG=, COMMUTATOR=, NEGATOR=, RESTRICT=, JOIN=, HASHES=, MERGES= + -- create text search configuration + PARSER=, COPY=; + -- create text search dictionary + TEMPLATE=; + -- create text search parser + START=, GETTOKEN=, END=, LEXTYPES=, HEADLINE=; + -- create text search template + INIT=, LEXIZE=; + -- create type + SUBTYPE=, SUBTYPE_OPCLASS=, COLLATION=, CANONICAL=, SUBTYPE_DIFF=, + INPUT=, OUTPUT=, RECEIVE=, SEND=, TYPMOD_IN=, TYPMOD_OUT=, ANALYZE=, INTERNALLENGTH=, PASSEDBYVALUE=, + ALIGNMENT=, STORAGE=, LIKE=, CATEGORY=, PREFERRED=, DEFAULT=, ELEMENT=, DELIMITER=, COLLATABLE=; + -- analyze/explain/vacuum + ANALYZE, VERBOSE, COSTS, BUFFERS, TIMING, SUMMARY, FORMAT TEXT, FORMAT XML, FORMAT JSON, + FORMAT YAML, FREEZE, FULL, DISABLE_PAGE_SKIPPING; + +-- table like options + +TABLE t1(LIKE t1 INCLUDING COMMENTS INCLUDING CONSTRAINTS EXCLUDING DEFAULTS INCLUDING IDENTITY INCLUDING INDEXES INCLUDING STATISTICS INCLUDING STORAGE EXCLUDING ALL); diff --git a/highlight-js/test/markup/pgsql/plpgsql.expect.txt b/highlight-js/test/markup/pgsql/plpgsql.expect.txt new file mode 100644 index 0000000..5b1c494 --- /dev/null +++ b/highlight-js/test/markup/pgsql/plpgsql.expect.txt @@ -0,0 +1,61 @@ +-- PL/pgSQL + +<< outerblock >> +DECLARE + quantity integer := 30; + subtotal ALIAS FOR $1; + prior ALIAS FOR old; + arow record; + curs1 refcursor; + curs2 CURSOR FOR SELECT * FROM tenk1; +BEGIN + DECLARE + quantity CONSTANT integer := 80; + myrow tablename%ROWTYPE; + myfield tablename.columnname%TYPE; + BEGIN + PERFORM pg_sleep(1); + RAISE NOTICE 'Quantity here is %', quantity; + END; + + SELECT * INTO myrec FROM emp WHERE empname = myname; + + IF NOT FOUND THEN + EXIT <<outer_block>>; + ELSIF quantity < 0 THEN + ASSERT a > b, 'Bad luck'; + END IF; + + FOR r IN SELECT * FROM foo LOOP + CONTINUE WHEN count < 50; + END LOOP; + + FOR i IN REVERSE 10..1 LOOP + FOREACH x IN ARRAY $1 + LOOP + s := s + x; + END LOOP; + END LOOP; + + WHILE NOT done LOOP + CASE x + WHEN 1, 2 THEN RETURN NEXT r; + ELSE RETURN QUERY SELECT * FROM sales; + END CASE; + END LOOP; + + EXECUTE 'SELECT count(*) FROM mytable WHERE inserted_by = $1' INTO c USING checked_user; + + OPEN curs1 SCROLL FOR SELECT * FROM foo WHERE key = mykey; + FETCH LAST FROM curs1 INTO x, y; + MOVE RELATIVE -2 FROM curs1; + UPDATE foo SET dataval = myval WHERE CURRENT OF curs1; + CLOSE curs1; + + RETURN quantity; +EXCEPTION + WHEN NO_DATA_FOUND THEN + GET DIAGNOSTICS integer_var = ROW_COUNT; + WHEN SQLSTATE '22012' THEN + NULL; +END; diff --git a/highlight-js/test/markup/pgsql/plpgsql.txt b/highlight-js/test/markup/pgsql/plpgsql.txt new file mode 100644 index 0000000..fcb22d1 --- /dev/null +++ b/highlight-js/test/markup/pgsql/plpgsql.txt @@ -0,0 +1,61 @@ +-- PL/pgSQL + +<< outerblock >> +DECLARE + quantity integer := 30; + subtotal ALIAS FOR $1; + prior ALIAS FOR old; + arow record; + curs1 refcursor; + curs2 CURSOR FOR SELECT * FROM tenk1; +BEGIN + DECLARE + quantity CONSTANT integer := 80; + myrow tablename%ROWTYPE; + myfield tablename.columnname%TYPE; + BEGIN + PERFORM pg_sleep(1); + RAISE NOTICE 'Quantity here is %', quantity; + END; + + SELECT * INTO myrec FROM emp WHERE empname = myname; + + IF NOT FOUND THEN + EXIT <>; + ELSIF quantity < 0 THEN + ASSERT a > b, 'Bad luck'; + END IF; + + FOR r IN SELECT * FROM foo LOOP + CONTINUE WHEN count < 50; + END LOOP; + + FOR i IN REVERSE 10..1 LOOP + FOREACH x IN ARRAY $1 + LOOP + s := s + x; + END LOOP; + END LOOP; + + WHILE NOT done LOOP + CASE x + WHEN 1, 2 THEN RETURN NEXT r; + ELSE RETURN QUERY SELECT * FROM sales; + END CASE; + END LOOP; + + EXECUTE 'SELECT count(*) FROM mytable WHERE inserted_by = $1' INTO c USING checked_user; + + OPEN curs1 SCROLL FOR SELECT * FROM foo WHERE key = mykey; + FETCH LAST FROM curs1 INTO x, y; + MOVE RELATIVE -2 FROM curs1; + UPDATE foo SET dataval = myval WHERE CURRENT OF curs1; + CLOSE curs1; + + RETURN quantity; +EXCEPTION + WHEN NO_DATA_FOUND THEN + GET DIAGNOSTICS integer_var = ROW_COUNT; + WHEN SQLSTATE '22012' THEN + NULL; +END; diff --git a/highlight-js/test/markup/pgsql/sql-commands.expect.txt b/highlight-js/test/markup/pgsql/sql-commands.expect.txt new file mode 100644 index 0000000..1b48f4f --- /dev/null +++ b/highlight-js/test/markup/pgsql/sql-commands.expect.txt @@ -0,0 +1,99 @@ +-- SQL Commands + +ABORT WORK, ABORT TRANSACTION, +ANALYZE, +BEGIN WORK, BEGIN TRANSACTION, +CALL, +CHECKPOINT, +CLOSE, +CLUSTER, +COMMENT, +COMMIT WORK, COMMIT TRANSACTION, +COMMIT PREPARED, +COPY, +CREATE, ALTER, DROP + ACCESS METHOD, + AGGREGATE, + CAST, + COLLATION, + CONVERSION, + DATABASE, + DOMAIN, + EVENT TRIGGER, + EXTENSION, + FOREIGN DATA WRAPPER, + FOREIGN TABLE, + FUNCTION, + GROUP, + INDEX, + LANGUAGE, + MATERIALIZED VIEW, + OPERATOR, + OPERATOR CLASS, + OPERATOR FAMILY, + POLICY, + PROCEDURE, + PUBLICATION, + ROLE, + ROUTINE, + RULE, + SCHEMA, + SEQUENCE, + SERVER, + STATISTICS, + SUBSCRIPTION, + TABLE, + TABLESPACE, + TEXT SEARCH CONFIGURATION, + TEXT SEARCH DICTIONARY, + TEXT SEARCH PARSER, + TEXT SEARCH TEMPLATE, + TRANSFORM, + TRIGGER, + TYPE, + USER, + USER MAPPING, + VIEW, +DEALLOCATE, +DECLARE, +DELETE, +DISCARD, +DO, +END WORK, END TRANSACTION, +EXECUTE, +EXPLAIN, +FETCH, +GRANT, +IMPORT FOREIGN SCHEMA, +INSERT, +LISTEN, +LOAD, +LOCK, +MOVE, +NOTIFY, +PREPARE, +PREPARE TRANSACTION, +REASSIGN OWNED, +REFRESH MATERIALIZED VIEW, +REINDEX, +RELEASE SAVEPOINT, +RESET, +REVOKE, +ROLLBACK WORK, ROLLBACK TRANSACTION, +ROLLBACK PREPARED, +ROLLBACK TO SAVEPOINT, +SAVEPOINT, +SECURITY LABEL, +SELECT, +SET, +SET CONSTRAINTS, +SET ROLE, RESET ROLE, +SET SESSION AUTHORIZATION, RESET SESSION AUTHORIZATION, +SET TRANSACTION, SET SESSION CHARACTERISTICS AS TRANSACTION, +SHOW, +START TRANSACTION, +TRUNCATE, +UNLISTEN, +UPDATE, +VACUUM, +VALUES; diff --git a/highlight-js/test/markup/pgsql/sql-commands.txt b/highlight-js/test/markup/pgsql/sql-commands.txt new file mode 100644 index 0000000..7f8ae69 --- /dev/null +++ b/highlight-js/test/markup/pgsql/sql-commands.txt @@ -0,0 +1,99 @@ +-- SQL Commands + +ABORT WORK, ABORT TRANSACTION, +ANALYZE, +BEGIN WORK, BEGIN TRANSACTION, +CALL, +CHECKPOINT, +CLOSE, +CLUSTER, +COMMENT, +COMMIT WORK, COMMIT TRANSACTION, +COMMIT PREPARED, +COPY, +CREATE, ALTER, DROP + ACCESS METHOD, + AGGREGATE, + CAST, + COLLATION, + CONVERSION, + DATABASE, + DOMAIN, + EVENT TRIGGER, + EXTENSION, + FOREIGN DATA WRAPPER, + FOREIGN TABLE, + FUNCTION, + GROUP, + INDEX, + LANGUAGE, + MATERIALIZED VIEW, + OPERATOR, + OPERATOR CLASS, + OPERATOR FAMILY, + POLICY, + PROCEDURE, + PUBLICATION, + ROLE, + ROUTINE, + RULE, + SCHEMA, + SEQUENCE, + SERVER, + STATISTICS, + SUBSCRIPTION, + TABLE, + TABLESPACE, + TEXT SEARCH CONFIGURATION, + TEXT SEARCH DICTIONARY, + TEXT SEARCH PARSER, + TEXT SEARCH TEMPLATE, + TRANSFORM, + TRIGGER, + TYPE, + USER, + USER MAPPING, + VIEW, +DEALLOCATE, +DECLARE, +DELETE, +DISCARD, +DO, +END WORK, END TRANSACTION, +EXECUTE, +EXPLAIN, +FETCH, +GRANT, +IMPORT FOREIGN SCHEMA, +INSERT, +LISTEN, +LOAD, +LOCK, +MOVE, +NOTIFY, +PREPARE, +PREPARE TRANSACTION, +REASSIGN OWNED, +REFRESH MATERIALIZED VIEW, +REINDEX, +RELEASE SAVEPOINT, +RESET, +REVOKE, +ROLLBACK WORK, ROLLBACK TRANSACTION, +ROLLBACK PREPARED, +ROLLBACK TO SAVEPOINT, +SAVEPOINT, +SECURITY LABEL, +SELECT, +SET, +SET CONSTRAINTS, +SET ROLE, RESET ROLE, +SET SESSION AUTHORIZATION, RESET SESSION AUTHORIZATION, +SET TRANSACTION, SET SESSION CHARACTERISTICS AS TRANSACTION, +SHOW, +START TRANSACTION, +TRUNCATE, +UNLISTEN, +UPDATE, +VACUUM, +VALUES; diff --git a/highlight-js/test/markup/pgsql/window-functions.expect.txt b/highlight-js/test/markup/pgsql/window-functions.expect.txt new file mode 100644 index 0000000..ef85a33 --- /dev/null +++ b/highlight-js/test/markup/pgsql/window-functions.expect.txt @@ -0,0 +1,35 @@ +-- window functions + +-- frame clause: + +RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +RANGE 10 PRECEDING EXCLUDE GROUP, +RANGE CURRENT ROW EXCLUDE TIES, +RANGE 10 FOLLOWING EXCLUDE NO OTHERS, +RANGE UNBOUNDED FOLLOWING, +RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +ROWS UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +ROWS 10 PRECEDING EXCLUDE GROUP, +ROWS CURRENT ROW EXCLUDE TIES, +ROWS 10 FOLLOWING EXCLUDE NO OTHERS, +ROWS UNBOUNDED FOLLOWING, +ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +GROUPS UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +GROUPS 10 PRECEDING EXCLUDE GROUP, +GROUPS CURRENT ROW EXCLUDE TIES, +GROUPS 10 FOLLOWING EXCLUDE NO OTHERS, +GROUPS UNBOUNDED FOLLOWING, +GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +-- examples + +SELECT string_agg(empno, ',' ORDER BY a) FROM empsalary; +SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY income) FROM households; +SELECT count(*) FILTER (WHERE i < 5) FROM generate_series(1,10) AS s(i); +SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary; +SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary; +SELECT sum(salary) OVER w, avg(salary) OVER w + FROM empsalary + WINDOW w AS (PARTITION BY depname ORDER BY salary DESC); diff --git a/highlight-js/test/markup/pgsql/window-functions.txt b/highlight-js/test/markup/pgsql/window-functions.txt new file mode 100644 index 0000000..8050fea --- /dev/null +++ b/highlight-js/test/markup/pgsql/window-functions.txt @@ -0,0 +1,35 @@ +-- window functions + +-- frame clause: + +RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +RANGE 10 PRECEDING EXCLUDE GROUP, +RANGE CURRENT ROW EXCLUDE TIES, +RANGE 10 FOLLOWING EXCLUDE NO OTHERS, +RANGE UNBOUNDED FOLLOWING, +RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +ROWS UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +ROWS 10 PRECEDING EXCLUDE GROUP, +ROWS CURRENT ROW EXCLUDE TIES, +ROWS 10 FOLLOWING EXCLUDE NO OTHERS, +ROWS UNBOUNDED FOLLOWING, +ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +GROUPS UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +GROUPS 10 PRECEDING EXCLUDE GROUP, +GROUPS CURRENT ROW EXCLUDE TIES, +GROUPS 10 FOLLOWING EXCLUDE NO OTHERS, +GROUPS UNBOUNDED FOLLOWING, +GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +-- examples + +SELECT string_agg(empno, ',' ORDER BY a) FROM empsalary; +SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY income) FROM households; +SELECT count(*) FILTER (WHERE i < 5) FROM generate_series(1,10) AS s(i); +SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary; +SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary; +SELECT sum(salary) OVER w, avg(salary) OVER w + FROM empsalary + WINDOW w AS (PARTITION BY depname ORDER BY salary DESC); diff --git a/highlight-js/test/markup/pgsql/xml.expect.txt b/highlight-js/test/markup/pgsql/xml.expect.txt new file mode 100644 index 0000000..93ca3f6 --- /dev/null +++ b/highlight-js/test/markup/pgsql/xml.expect.txt @@ -0,0 +1,47 @@ +-- xml + +XMLPARSE (DOCUMENT '...' PRESERVE WHITESPACE) +XMLPARSE (CONTENT '...' STRIP WHITESPACE) +XMLSERIALIZE ( DOCUMENT '...' AS text ) +XMLSERIALIZE ( CONTENT '...' AS text ) + +SET XML OPTION DOCUMENT; +SET XML OPTION CONTENT; + +SELECT xmlcomment('...'); +SELECT xmlconcat('...', '...'); +SELECT xmlelement(name foo, xmlattributes('...' as bar)); +SELECT xmlforest('...' AS foo, 123 AS bar); +SELECT xmlpi(name php, '...'); +SELECT xmlroot(xmlparse(document '...'), version '...', standalone yes); +SELECT xmlagg(x ORDER BY y DESC) FROM test; + +SELECT xmlexists('...' PASSING BY REF '...'); + +SELECT xpath('...', '...', ARRAY[ARRAY['...', '...']]); +SELECT xpath_exists('...', '...', ARRAY[ARRAY['...', '...']]); + +SELECT XMLTABLE('...' PASSING data COLUMNS id int PATH '...' DEFAULT '...', ordinality FOR ORDINALITY) ; + +SELECT XMLTABLE(XMLNAMESPACES('...' AS x, '...' AS "B"), '...' PASSING (SELECT data FROM xmldata) COLUMNS foo int PATH '...'); + +foo IS DOCUMENT +foo IS NOT DOCUMENT + +xml_is_well_formed(..) +xml_is_well_formed_document(..) +xml_is_well_formed_content(..) +table_to_xml(..) +query_to_xml(..) +cursor_to_xml(..) +table_to_xmlschema(..) +query_to_xmlschema(..) +cursor_to_xmlschema(..) +table_to_xml_and_xmlschema(..) +query_to_xml_and_xmlschema(..) +schema_to_xml(..) +schema_to_xmlschema(..) +schema_to_xml_and_xmlschema(..) +database_to_xml(..) +database_to_xmlschema(..) +database_to_xml_and_xmlschema(..) diff --git a/highlight-js/test/markup/pgsql/xml.txt b/highlight-js/test/markup/pgsql/xml.txt new file mode 100644 index 0000000..f925216 --- /dev/null +++ b/highlight-js/test/markup/pgsql/xml.txt @@ -0,0 +1,47 @@ +-- xml + +XMLPARSE (DOCUMENT '...' PRESERVE WHITESPACE) +XMLPARSE (CONTENT '...' STRIP WHITESPACE) +XMLSERIALIZE ( DOCUMENT '...' AS text ) +XMLSERIALIZE ( CONTENT '...' AS text ) + +SET XML OPTION DOCUMENT; +SET XML OPTION CONTENT; + +SELECT xmlcomment('...'); +SELECT xmlconcat('...', '...'); +SELECT xmlelement(name foo, xmlattributes('...' as bar)); +SELECT xmlforest('...' AS foo, 123 AS bar); +SELECT xmlpi(name php, '...'); +SELECT xmlroot(xmlparse(document '...'), version '...', standalone yes); +SELECT xmlagg(x ORDER BY y DESC) FROM test; + +SELECT xmlexists('...' PASSING BY REF '...'); + +SELECT xpath('...', '...', ARRAY[ARRAY['...', '...']]); +SELECT xpath_exists('...', '...', ARRAY[ARRAY['...', '...']]); + +SELECT XMLTABLE('...' PASSING data COLUMNS id int PATH '...' DEFAULT '...', ordinality FOR ORDINALITY) ; + +SELECT XMLTABLE(XMLNAMESPACES('...' AS x, '...' AS "B"), '...' PASSING (SELECT data FROM xmldata) COLUMNS foo int PATH '...'); + +foo IS DOCUMENT +foo IS NOT DOCUMENT + +xml_is_well_formed(..) +xml_is_well_formed_document(..) +xml_is_well_formed_content(..) +table_to_xml(..) +query_to_xml(..) +cursor_to_xml(..) +table_to_xmlschema(..) +query_to_xmlschema(..) +cursor_to_xmlschema(..) +table_to_xml_and_xmlschema(..) +query_to_xml_and_xmlschema(..) +schema_to_xml(..) +schema_to_xmlschema(..) +schema_to_xml_and_xmlschema(..) +database_to_xml(..) +database_to_xmlschema(..) +database_to_xml_and_xmlschema(..) diff --git a/highlight-js/test/markup/php/comments.expect.txt b/highlight-js/test/markup/php/comments.expect.txt new file mode 100644 index 0000000..a9e3312 --- /dev/null +++ b/highlight-js/test/markup/php/comments.expect.txt @@ -0,0 +1,19 @@ +<?php + +/** + * @param int $a + * @return bool + */ +function isEven($a) { + return ($a % 2) === 0; +} + +/** + * TODO: Rely on isEven, but do not highlight bug. + * + * @param int $a + * @return bool + */ +function isOdd($a) { + return ($a % 2) === 1; +} diff --git a/highlight-js/test/markup/php/comments.txt b/highlight-js/test/markup/php/comments.txt new file mode 100644 index 0000000..f709f20 --- /dev/null +++ b/highlight-js/test/markup/php/comments.txt @@ -0,0 +1,19 @@ +echo <<<EOT +String with $var and {$foo->bar[1]}. +EOT; + +echo <<<EOT + string + EOT + still string +EOT; + +array(<<<EOD +foobar! +EOD +); diff --git a/highlight-js/test/markup/php/heredoc.txt b/highlight-js/test/markup/php/heredoc.txt new file mode 100644 index 0000000..443d5fa --- /dev/null +++ b/highlight-js/test/markup/php/heredoc.txt @@ -0,0 +1,14 @@ +echo <<bar[1]}. +EOT; + +echo <<new create(name': String) => + name = name' + 'a' diff --git a/highlight-js/test/markup/pony/prime.txt b/highlight-js/test/markup/pony/prime.txt new file mode 100644 index 0000000..fdea080 --- /dev/null +++ b/highlight-js/test/markup/pony/prime.txt @@ -0,0 +1,2 @@ +new create(name': String) => + name = name' + 'a' diff --git a/highlight-js/test/markup/powershell/apos-herestring.expect.txt b/highlight-js/test/markup/powershell/apos-herestring.expect.txt new file mode 100644 index 0000000..8323231 --- /dev/null +++ b/highlight-js/test/markup/powershell/apos-herestring.expect.txt @@ -0,0 +1,11 @@ +@' The wild cat jumped over the $height-tall fence. + He did so with grace. +'@ + +This SHOULDNT be a part of the above strings span. + +@' The wild cat jumped over the $height-tall fence. + He did so with grace. +break-end-of-string'@ + +This SHOULD be a part of the above strings span. \ No newline at end of file diff --git a/highlight-js/test/markup/powershell/apos-herestring.txt b/highlight-js/test/markup/powershell/apos-herestring.txt new file mode 100644 index 0000000..704be67 --- /dev/null +++ b/highlight-js/test/markup/powershell/apos-herestring.txt @@ -0,0 +1,11 @@ +@' The wild cat jumped over the $height-tall fence. + He did so with grace. +'@ + +This SHOULDNT be a part of the above strings span. + +@' The wild cat jumped over the $height-tall fence. + He did so with grace. +break-end-of-string'@ + +This SHOULD be a part of the above strings span. \ No newline at end of file diff --git a/highlight-js/test/markup/powershell/quote-herestring.expect.txt b/highlight-js/test/markup/powershell/quote-herestring.expect.txt new file mode 100644 index 0000000..3095015 --- /dev/null +++ b/highlight-js/test/markup/powershell/quote-herestring.expect.txt @@ -0,0 +1,11 @@ +@" The wild cat jumped over the $height-tall fence. + He did so with grace. +"@ + +This SHOULDNT be a part of the above strings span. + +@" The wild cat jumped over the $height-tall fence. + He did so with grace. +break-end-of-string"@ + +This SHOULD be a part of the above strings span. \ No newline at end of file diff --git a/highlight-js/test/markup/powershell/quote-herestring.txt b/highlight-js/test/markup/powershell/quote-herestring.txt new file mode 100644 index 0000000..5f352dc --- /dev/null +++ b/highlight-js/test/markup/powershell/quote-herestring.txt @@ -0,0 +1,11 @@ +@" The wild cat jumped over the $height-tall fence. + He did so with grace. +"@ + +This SHOULDNT be a part of the above strings span. + +@" The wild cat jumped over the $height-tall fence. + He did so with grace. +break-end-of-string"@ + +This SHOULD be a part of the above strings span. \ No newline at end of file diff --git a/highlight-js/test/markup/properties/syntax.expect.txt b/highlight-js/test/markup/properties/syntax.expect.txt new file mode 100644 index 0000000..45b473a --- /dev/null +++ b/highlight-js/test/markup/properties/syntax.expect.txt @@ -0,0 +1,14 @@ +# comment + # comment +! comment + ! comment +key=val +key = val +key:val +key : val +key val +key val +key = val\ + val +key\ key\:\= val +key diff --git a/highlight-js/test/markup/properties/syntax.txt b/highlight-js/test/markup/properties/syntax.txt new file mode 100644 index 0000000..76a4a2b --- /dev/null +++ b/highlight-js/test/markup/properties/syntax.txt @@ -0,0 +1,14 @@ +# comment + # comment +! comment + ! comment +key=val +key = val +key:val +key : val +key val +key val +key = val\ + val +key\ key\:\= val +key diff --git a/highlight-js/test/markup/protobuf/message-message.expect.txt b/highlight-js/test/markup/protobuf/message-message.expect.txt new file mode 100644 index 0000000..a2d827b --- /dev/null +++ b/highlight-js/test/markup/protobuf/message-message.expect.txt @@ -0,0 +1,7 @@ +message Container { + message Message { + required int64 id = 1; + } + repeated Message messages = 1; + optional int32 number = 2; +} diff --git a/highlight-js/test/markup/protobuf/message-message.txt b/highlight-js/test/markup/protobuf/message-message.txt new file mode 100644 index 0000000..c4b6667 --- /dev/null +++ b/highlight-js/test/markup/protobuf/message-message.txt @@ -0,0 +1,7 @@ +message Container { + message Message { + required int64 id = 1; + } + repeated Message messages = 1; + optional int32 number = 2; +} diff --git a/highlight-js/test/markup/python/escaped-quotes.expect.txt b/highlight-js/test/markup/python/escaped-quotes.expect.txt new file mode 100644 index 0000000..baabb66 --- /dev/null +++ b/highlight-js/test/markup/python/escaped-quotes.expect.txt @@ -0,0 +1,43 @@ +'''text \''' text''' +u'''text \''' text''' +b'''text \''' text''' +r'''text \''' text''' +ur'''text \''' text''' +br'''text \''' text''' + +"""text \""" text""" +u"""text \""" text""" +b"""text \""" text""" +r"""text \""" text""" +ur"""text \""" text""" +br"""text \""" text""" + +f'''text \''' text''' +fr'''text \''' text''' +rf'''text \''' text''' + +f"""text \""" text""" +fr"""text \""" text""" +rf"""text \""" text""" + +u'text \' text' +r'text \' text' +ur'text \' text' + +u"text \" text" +r"text \" text" +ur"text \" text" + +b'text \' text' +br'text \' text' + +b"text \" text" +br"text \" text" + +f'text \' text' +fr'text \' text' +rf'text \' text' + +f"text \" text" +fr"text \" text" +rf"text \" text" \ No newline at end of file diff --git a/highlight-js/test/markup/python/escaped-quotes.txt b/highlight-js/test/markup/python/escaped-quotes.txt new file mode 100644 index 0000000..68040c9 --- /dev/null +++ b/highlight-js/test/markup/python/escaped-quotes.txt @@ -0,0 +1,43 @@ +'''text \''' text''' +u'''text \''' text''' +b'''text \''' text''' +r'''text \''' text''' +ur'''text \''' text''' +br'''text \''' text''' + +"""text \""" text""" +u"""text \""" text""" +b"""text \""" text""" +r"""text \""" text""" +ur"""text \""" text""" +br"""text \""" text""" + +f'''text \''' text''' +fr'''text \''' text''' +rf'''text \''' text''' + +f"""text \""" text""" +fr"""text \""" text""" +rf"""text \""" text""" + +u'text \' text' +r'text \' text' +ur'text \' text' + +u"text \" text" +r"text \" text" +ur"text \" text" + +b'text \' text' +br'text \' text' + +b"text \" text" +br"text \" text" + +f'text \' text' +fr'text \' text' +rf'text \' text' + +f"text \" text" +fr"text \" text" +rf"text \" text" \ No newline at end of file diff --git a/highlight-js/test/markup/python/f-strings.expect.txt b/highlight-js/test/markup/python/f-strings.expect.txt new file mode 100644 index 0000000..7453e27 --- /dev/null +++ b/highlight-js/test/markup/python/f-strings.expect.txt @@ -0,0 +1,10 @@ +f'{name}' +f"{name + 5}" +>>> f""" +... { +... name +... } +... """ +rf"{name}" +fr"{name}" +f"{name + f'{name}'}" diff --git a/highlight-js/test/markup/python/f-strings.txt b/highlight-js/test/markup/python/f-strings.txt new file mode 100644 index 0000000..cc28a84 --- /dev/null +++ b/highlight-js/test/markup/python/f-strings.txt @@ -0,0 +1,10 @@ +f'{name}' +f"{name + 5}" +>>> f""" +... { +... name +... } +... """ +rf"{name}" +fr"{name}" +f"{name + f'{name}'}" diff --git a/highlight-js/test/markup/python/function-header.expect.txt b/highlight-js/test/markup/python/function-header.expect.txt new file mode 100644 index 0000000..cf3c8e5 --- /dev/null +++ b/highlight-js/test/markup/python/function-header.expect.txt @@ -0,0 +1,2 @@ +def f(x: int) -> None: + pass diff --git a/highlight-js/test/markup/python/function-header.txt b/highlight-js/test/markup/python/function-header.txt new file mode 100644 index 0000000..793e3be --- /dev/null +++ b/highlight-js/test/markup/python/function-header.txt @@ -0,0 +1,2 @@ +def f(x: int) -> None: + pass diff --git a/highlight-js/test/markup/python/matrix-multiplication.expect.txt b/highlight-js/test/markup/python/matrix-multiplication.expect.txt new file mode 100644 index 0000000..97323a1 --- /dev/null +++ b/highlight-js/test/markup/python/matrix-multiplication.expect.txt @@ -0,0 +1,7 @@ +@meta +class C: + + @decorator + def f(self, H, V, beta, r): + S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r) + return S diff --git a/highlight-js/test/markup/python/matrix-multiplication.txt b/highlight-js/test/markup/python/matrix-multiplication.txt new file mode 100644 index 0000000..1dfff4c --- /dev/null +++ b/highlight-js/test/markup/python/matrix-multiplication.txt @@ -0,0 +1,7 @@ +@meta +class C: + + @decorator + def f(self, H, V, beta, r): + S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r) + return S diff --git a/highlight-js/test/markup/reasonml/functions.expect.txt b/highlight-js/test/markup/reasonml/functions.expect.txt new file mode 100644 index 0000000..bd4ad81 --- /dev/null +++ b/highlight-js/test/markup/reasonml/functions.expect.txt @@ -0,0 +1,22 @@ +/* This is a simple function */ +let greet = (name) => "Hello World"; + +let body = `Plain("uploaded " ++ cacheServiceConfig.desc ++ "configuration data into cache on S3"); + +let getCacheConfigByEnv = + ( + environment: environment, + cacheServiceConfig: Js.Dict.t(cachingServiceConfig) + ) => + switch (cacheServiceConfig) { + | Some(config) => config + | None => + raise(InvalidEnvironment("Caching Service Coinfiguration is missing")) + }; + +let readCacheServiceConfigAndDecode = (configJson) => + switch (configJson |> Js.Json.decodeObject) { + | None => raise(Json.Decode.DecodeError("Invalid Cache Config")) + | Some(data) => + data |> Js.Dict.map((. json) => CachingServiceConfig.decode(json)) + }; \ No newline at end of file diff --git a/highlight-js/test/markup/reasonml/functions.txt b/highlight-js/test/markup/reasonml/functions.txt new file mode 100644 index 0000000..f03ce9e --- /dev/null +++ b/highlight-js/test/markup/reasonml/functions.txt @@ -0,0 +1,22 @@ +/* This is a simple function */ +let greet = (name) => "Hello World"; + +let body = `Plain("uploaded " ++ cacheServiceConfig.desc ++ "configuration data into cache on S3"); + +let getCacheConfigByEnv = + ( + environment: environment, + cacheServiceConfig: Js.Dict.t(cachingServiceConfig) + ) => + switch (cacheServiceConfig) { + | Some(config) => config + | None => + raise(InvalidEnvironment("Caching Service Coinfiguration is missing")) + }; + +let readCacheServiceConfigAndDecode = (configJson) => + switch (configJson |> Js.Json.decodeObject) { + | None => raise(Json.Decode.DecodeError("Invalid Cache Config")) + | Some(data) => + data |> Js.Dict.map((. json) => CachingServiceConfig.decode(json)) + }; \ No newline at end of file diff --git a/highlight-js/test/markup/reasonml/literals.expect.txt b/highlight-js/test/markup/reasonml/literals.expect.txt new file mode 100644 index 0000000..ac88232 --- /dev/null +++ b/highlight-js/test/markup/reasonml/literals.expect.txt @@ -0,0 +1,41 @@ +let i = 14; +let i = (-14); +let i = 1000; +let i = 0b100; +let i = 0x1FF; +let i = 0o777; +let i64 = 128L; +let i64 = 0b10L; +let i32 = 32l; +let i32 = 0x12l; +let nat = 10n; +let nat = 0o644n; +let f = 5.; +let f = 5.1; +let f = 1e+1; +let f = 1e1; +let f = 1e-1; +let f = 1024e12; +let f = 1L; + +let f = 23.0 +. 1.0; +let f = 2 / 23 * 1; +let f = 2.0 /. 23.0 *. 1.0; +let exp = 2.0 ** 2.0; + +let structual = true == false; +let reference = true === false; + +let b = true || false; +let l = []; +let a = [||]; +let arr = [|1, 2, 3|]; +let b = [item1, item2, ...theRest]; +let () = ignore(b); + +let str = "a" ++ "b"; + +let c = 'a'; +let c = '\xFF'; +let c = '\128'; +let c = '\n'; \ No newline at end of file diff --git a/highlight-js/test/markup/reasonml/literals.txt b/highlight-js/test/markup/reasonml/literals.txt new file mode 100644 index 0000000..d0f624d --- /dev/null +++ b/highlight-js/test/markup/reasonml/literals.txt @@ -0,0 +1,41 @@ +let i = 14; +let i = (-14); +let i = 1000; +let i = 0b100; +let i = 0x1FF; +let i = 0o777; +let i64 = 128L; +let i64 = 0b10L; +let i32 = 32l; +let i32 = 0x12l; +let nat = 10n; +let nat = 0o644n; +let f = 5.; +let f = 5.1; +let f = 1e+1; +let f = 1e1; +let f = 1e-1; +let f = 1024e12; +let f = 1L; + +let f = 23.0 +. 1.0; +let f = 2 / 23 * 1; +let f = 2.0 /. 23.0 *. 1.0; +let exp = 2.0 ** 2.0; + +let structual = true == false; +let reference = true === false; + +let b = true || false; +let l = []; +let a = [||]; +let arr = [|1, 2, 3|]; +let b = [item1, item2, ...theRest]; +let () = ignore(b); + +let str = "a" ++ "b"; + +let c = 'a'; +let c = '\xFF'; +let c = '\128'; +let c = '\n'; \ No newline at end of file diff --git a/highlight-js/test/markup/reasonml/modules.expect.txt b/highlight-js/test/markup/reasonml/modules.expect.txt new file mode 100644 index 0000000..cff5a61 --- /dev/null +++ b/highlight-js/test/markup/reasonml/modules.expect.txt @@ -0,0 +1,19 @@ +let decode = json => + Json.Decode.{ + query: json |> field("query", string), + cacheKey: json |> field("cacheKey", string), + desc: json |> field("desc", string), + lambda: json |> field("lambda", string), + }; + +Some.Bucket.Of.( + let value = stuff(); +); + +let value = Some.Bucket.Of.stuff(); + +module type RewiredModule = { + type t = { + name: string + }; +}; \ No newline at end of file diff --git a/highlight-js/test/markup/reasonml/modules.txt b/highlight-js/test/markup/reasonml/modules.txt new file mode 100644 index 0000000..014ac4e --- /dev/null +++ b/highlight-js/test/markup/reasonml/modules.txt @@ -0,0 +1,19 @@ +let decode = json => + Json.Decode.{ + query: json |> field("query", string), + cacheKey: json |> field("cacheKey", string), + desc: json |> field("desc", string), + lambda: json |> field("lambda", string), + }; + +Some.Bucket.Of.( + let value = stuff(); +); + +let value = Some.Bucket.Of.stuff(); + +module type RewiredModule = { + type t = { + name: string + }; +}; \ No newline at end of file diff --git a/highlight-js/test/markup/reasonml/pattern-matching.expect.txt b/highlight-js/test/markup/reasonml/pattern-matching.expect.txt new file mode 100644 index 0000000..8ce0a3d --- /dev/null +++ b/highlight-js/test/markup/reasonml/pattern-matching.expect.txt @@ -0,0 +1,20 @@ +let message = + switch (person1) { + | School.Teacher => "Hello teacher!" + | School.Director => "Hello director!" + }; + +let message = + School.( + switch (person1) { + | Teacher => "Hello teacher!" + | Director => "Hello director!" + } + ); + +let readCacheServiceConfigAndDecode = (configJson) => + switch (configJson |> Js.Json.decodeObject) { + | None => raise(Json.Decode.DecodeError("Invalid Cache Config")) + | Some(data) => + data |> Js.Dict.map((. json) => CachingServiceConfig.decode(json)) + }; \ No newline at end of file diff --git a/highlight-js/test/markup/reasonml/pattern-matching.txt b/highlight-js/test/markup/reasonml/pattern-matching.txt new file mode 100644 index 0000000..af87fa6 --- /dev/null +++ b/highlight-js/test/markup/reasonml/pattern-matching.txt @@ -0,0 +1,20 @@ +let message = + switch (person1) { + | School.Teacher => "Hello teacher!" + | School.Director => "Hello director!" + }; + +let message = + School.( + switch (person1) { + | Teacher => "Hello teacher!" + | Director => "Hello director!" + } + ); + +let readCacheServiceConfigAndDecode = (configJson) => + switch (configJson |> Js.Json.decodeObject) { + | None => raise(Json.Decode.DecodeError("Invalid Cache Config")) + | Some(data) => + data |> Js.Dict.map((. json) => CachingServiceConfig.decode(json)) + }; diff --git a/highlight-js/test/markup/ruby/gemfile.expect.txt b/highlight-js/test/markup/ruby/gemfile.expect.txt new file mode 100644 index 0000000..6051fc8 --- /dev/null +++ b/highlight-js/test/markup/ruby/gemfile.expect.txt @@ -0,0 +1,3 @@ +gem "gem_name1", ">= 4.1" + +gem "gem_name2", "~> 4.1" diff --git a/highlight-js/test/markup/ruby/gemfile.txt b/highlight-js/test/markup/ruby/gemfile.txt new file mode 100644 index 0000000..bab6a60 --- /dev/null +++ b/highlight-js/test/markup/ruby/gemfile.txt @@ -0,0 +1,3 @@ +gem "gem_name1", ">= 4.1" + +gem "gem_name2", "~> 4.1" diff --git a/highlight-js/test/markup/ruby/heredoc.expect.txt b/highlight-js/test/markup/ruby/heredoc.expect.txt new file mode 100644 index 0000000..18e27a5 --- /dev/null +++ b/highlight-js/test/markup/ruby/heredoc.expect.txt @@ -0,0 +1,8 @@ +def foo() + msg = <<-HTML + <div> + <h4>#{bar}</h4> + </div> + HTML + +def baz() diff --git a/highlight-js/test/markup/ruby/heredoc.txt b/highlight-js/test/markup/ruby/heredoc.txt new file mode 100644 index 0000000..15a8f08 --- /dev/null +++ b/highlight-js/test/markup/ruby/heredoc.txt @@ -0,0 +1,8 @@ +def foo() + msg = <<-HTML +
    +

    #{bar}

    +
    + HTML + +def baz() diff --git a/highlight-js/test/markup/ruby/prompt.expect.txt b/highlight-js/test/markup/ruby/prompt.expect.txt new file mode 100644 index 0000000..b4634e6 --- /dev/null +++ b/highlight-js/test/markup/ruby/prompt.expect.txt @@ -0,0 +1,23 @@ +2.0.0p0 :001 > ['some'] + => ["some"] +2.0.0p0 :002 > if true +2.0.0p0 :003?> "yop" +2.0.0p0 :004?> end + => "yop" + +jruby-1.7.16 :001 > "RVM-Format" + +>> 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" + +irb(main):002:0> test = 1 diff --git a/highlight-js/test/markup/ruby/prompt.txt b/highlight-js/test/markup/ruby/prompt.txt new file mode 100644 index 0000000..9ef7be6 --- /dev/null +++ b/highlight-js/test/markup/ruby/prompt.txt @@ -0,0 +1,23 @@ +2.0.0p0 :001 > ['some'] + => ["some"] +2.0.0p0 :002 > if true +2.0.0p0 :003?> "yop" +2.0.0p0 :004?> end + => "yop" + +jruby-1.7.16 :001 > "RVM-Format" + +>> obj = OpenStruct.new :integer => 987, :symbol => :so_great +=> # +>> [obj,obj,obj] +=> [#, #, #] +>> {1 => obj, 2 => obj} +=> {1=>#, 2=>#} +>> if 10 > 20 +>> "YEAH" +>> else +?> "NO" +>> end +=> "NO" + +irb(main):002:0> test = 1 diff --git a/highlight-js/test/markup/ruby/regexes.expect.txt b/highlight-js/test/markup/ruby/regexes.expect.txt new file mode 100644 index 0000000..0c10838 --- /dev/null +++ b/highlight-js/test/markup/ruby/regexes.expect.txt @@ -0,0 +1,5 @@ +str =~ /^(?:foo)$/ +str =~ %r{foo|bar|buz$} +str =~ %r!foo|bar$! +str =~ %r[foo|bar$] +str =~ %r(\(foo|bar\)$) diff --git a/highlight-js/test/markup/ruby/regexes.txt b/highlight-js/test/markup/ruby/regexes.txt new file mode 100644 index 0000000..9d31e03 --- /dev/null +++ b/highlight-js/test/markup/ruby/regexes.txt @@ -0,0 +1,5 @@ +str =~ /^(?:foo)$/ +str =~ %r{foo|bar|buz$} +str =~ %r!foo|bar$! +str =~ %r[foo|bar$] +str =~ %r(\(foo|bar\)$) diff --git a/highlight-js/test/markup/rust/comments.expect.txt b/highlight-js/test/markup/rust/comments.expect.txt new file mode 100644 index 0000000..bdc3090 --- /dev/null +++ b/highlight-js/test/markup/rust/comments.expect.txt @@ -0,0 +1,3 @@ +/* rust has +/* nested /* block */ */ +*/ comments diff --git a/highlight-js/test/markup/rust/comments.txt b/highlight-js/test/markup/rust/comments.txt new file mode 100644 index 0000000..d265d56 --- /dev/null +++ b/highlight-js/test/markup/rust/comments.txt @@ -0,0 +1,3 @@ +/* rust has +/* nested /* block */ */ +*/ comments diff --git a/highlight-js/test/markup/rust/numbers.expect.txt b/highlight-js/test/markup/rust/numbers.expect.txt new file mode 100644 index 0000000..64d7954 --- /dev/null +++ b/highlight-js/test/markup/rust/numbers.expect.txt @@ -0,0 +1,13 @@ +123; +123usize; +123_usize; +0xff00; +0xff_u8; +0b1111111110010000; +0b1111_1111_1001_0000_i32; +0o764317; +0o764317_u16; +123.0; +0.1; +0.1f32; +12E+99_f64; diff --git a/highlight-js/test/markup/rust/numbers.txt b/highlight-js/test/markup/rust/numbers.txt new file mode 100644 index 0000000..798e8b7 --- /dev/null +++ b/highlight-js/test/markup/rust/numbers.txt @@ -0,0 +1,13 @@ +123; +123usize; +123_usize; +0xff00; +0xff_u8; +0b1111111110010000; +0b1111_1111_1001_0000_i32; +0o764317; +0o764317_u16; +123.0; +0.1; +0.1f32; +12E+99_f64; diff --git a/highlight-js/test/markup/rust/strings.expect.txt b/highlight-js/test/markup/rust/strings.expect.txt new file mode 100644 index 0000000..c36dd7c --- /dev/null +++ b/highlight-js/test/markup/rust/strings.expect.txt @@ -0,0 +1,14 @@ +'a'; +'\n'; +'\x1A'; +'\u12AS'; +'\U1234ASDF'; +b'a'; + +"hello"; +b"hello"; + +r"hello"; +r###"world"###; +r##" "### +"# "##; diff --git a/highlight-js/test/markup/rust/strings.txt b/highlight-js/test/markup/rust/strings.txt new file mode 100644 index 0000000..5a3da73 --- /dev/null +++ b/highlight-js/test/markup/rust/strings.txt @@ -0,0 +1,14 @@ +'a'; +'\n'; +'\x1A'; +'\u12AS'; +'\U1234ASDF'; +b'a'; + +"hello"; +b"hello"; + +r"hello"; +r###"world"###; +r##" "### +"# "##; diff --git a/highlight-js/test/markup/rust/traits.expect.txt b/highlight-js/test/markup/rust/traits.expect.txt new file mode 100644 index 0000000..2a96d67 --- /dev/null +++ b/highlight-js/test/markup/rust/traits.expect.txt @@ -0,0 +1,3 @@ +fn sqr(i: i32) { i * i } +trait Minimum : Copy {} +pub trait Builder where Self: Sized + Iterator<Item=Event> {} diff --git a/highlight-js/test/markup/rust/traits.txt b/highlight-js/test/markup/rust/traits.txt new file mode 100644 index 0000000..1a5b20d --- /dev/null +++ b/highlight-js/test/markup/rust/traits.txt @@ -0,0 +1,3 @@ +fn sqr(i: i32) { i * i } +trait Minimum : Copy {} +pub trait Builder where Self: Sized + Iterator {} diff --git a/highlight-js/test/markup/rust/types.expect.txt b/highlight-js/test/markup/rust/types.expect.txt new file mode 100644 index 0000000..65ca8fd --- /dev/null +++ b/highlight-js/test/markup/rust/types.expect.txt @@ -0,0 +1,4 @@ +type A: Trait; +type A; +type A = B; +type R<T> = m::R<T, ConcreteError> diff --git a/highlight-js/test/markup/rust/types.txt b/highlight-js/test/markup/rust/types.txt new file mode 100644 index 0000000..b8644e4 --- /dev/null +++ b/highlight-js/test/markup/rust/types.txt @@ -0,0 +1,4 @@ +type A: Trait; +type A; +type A = B; +type R = m::R diff --git a/highlight-js/test/markup/rust/variables.expect.txt b/highlight-js/test/markup/rust/variables.expect.txt new file mode 100644 index 0000000..a601118 --- /dev/null +++ b/highlight-js/test/markup/rust/variables.expect.txt @@ -0,0 +1,3 @@ +let foo; +let mut bar; +let _foo_bar; diff --git a/highlight-js/test/markup/rust/variables.txt b/highlight-js/test/markup/rust/variables.txt new file mode 100644 index 0000000..26420c1 --- /dev/null +++ b/highlight-js/test/markup/rust/variables.txt @@ -0,0 +1,3 @@ +let foo; +let mut bar; +let _foo_bar; diff --git a/highlight-js/test/markup/scala/case-classes.expect.txt b/highlight-js/test/markup/scala/case-classes.expect.txt new file mode 100644 index 0000000..162499f --- /dev/null +++ b/highlight-js/test/markup/scala/case-classes.expect.txt @@ -0,0 +1,3 @@ +abstract class Vertical extends CaseJeu +case class Haut(name: String) extends Vertical +case class Bas(name: String) extends Vertical diff --git a/highlight-js/test/markup/scala/case-classes.txt b/highlight-js/test/markup/scala/case-classes.txt new file mode 100644 index 0000000..7b41555 --- /dev/null +++ b/highlight-js/test/markup/scala/case-classes.txt @@ -0,0 +1,3 @@ +abstract class Vertical extends CaseJeu +case class Haut(name: String) extends Vertical +case class Bas(name: String) extends Vertical diff --git a/highlight-js/test/markup/scheme/lambda.expect.txt b/highlight-js/test/markup/scheme/lambda.expect.txt new file mode 100644 index 0000000..12c5b8e --- /dev/null +++ b/highlight-js/test/markup/scheme/lambda.expect.txt @@ -0,0 +1 @@ +(lambda (x y z) (+ y z)) diff --git a/highlight-js/test/markup/scheme/lambda.txt b/highlight-js/test/markup/scheme/lambda.txt new file mode 100644 index 0000000..bcc4840 --- /dev/null +++ b/highlight-js/test/markup/scheme/lambda.txt @@ -0,0 +1 @@ +(lambda (x y z) (+ y z)) diff --git a/highlight-js/test/markup/scheme/quoted.expect.txt b/highlight-js/test/markup/scheme/quoted.expect.txt new file mode 100644 index 0000000..a5bb8a8 --- /dev/null +++ b/highlight-js/test/markup/scheme/quoted.expect.txt @@ -0,0 +1 @@ +(scheme 'a '(a quoted (list)) `(quoted)) diff --git a/highlight-js/test/markup/scheme/quoted.txt b/highlight-js/test/markup/scheme/quoted.txt new file mode 100644 index 0000000..8b44e05 --- /dev/null +++ b/highlight-js/test/markup/scheme/quoted.txt @@ -0,0 +1 @@ +(scheme 'a '(a quoted (list)) `(quoted)) diff --git a/highlight-js/test/markup/sql/interval.expect.txt b/highlight-js/test/markup/sql/interval.expect.txt new file mode 100644 index 0000000..77073bf --- /dev/null +++ b/highlight-js/test/markup/sql/interval.expect.txt @@ -0,0 +1,17 @@ +SELECT + CURRENT_TIMESTAMP + - INTERVAL 2 YEARS + + INTERVAL 1 MONTH + - INTERVAL 3 DAYS + + INTERVAL 10 HOURS + + interval 30 MINUTES + - INTERVAL 20 SECOND AS past_timestamp +FROM VALUES ("dummy"); + +WITH ts AS ( + SELECT CURRENT_TIMESTAMP AS now FROM VALUES ('dummy') + ) +SELECT + now - INTERVAL 1 DAY - INTERVAL 2 HOURS - INTERVAL 3 MINUTES - INTERVAL 4 SECONDS AS LONG_VERSION, + now - INTERVAL '1 2:3:4.100' DAY TO SECOND AS SHORT_VERSION +FROM ts; diff --git a/highlight-js/test/markup/sql/interval.txt b/highlight-js/test/markup/sql/interval.txt new file mode 100644 index 0000000..9f1657d --- /dev/null +++ b/highlight-js/test/markup/sql/interval.txt @@ -0,0 +1,17 @@ +SELECT + CURRENT_TIMESTAMP + - INTERVAL 2 YEARS + + INTERVAL 1 MONTH + - INTERVAL 3 DAYS + + INTERVAL 10 HOURS + + interval 30 MINUTES + - INTERVAL 20 SECOND AS past_timestamp +FROM VALUES ("dummy"); + +WITH ts AS ( + SELECT CURRENT_TIMESTAMP AS now FROM VALUES ('dummy') + ) +SELECT + now - INTERVAL 1 DAY - INTERVAL 2 HOURS - INTERVAL 3 MINUTES - INTERVAL 4 SECONDS AS LONG_VERSION, + now - INTERVAL '1 2:3:4.100' DAY TO SECOND AS SHORT_VERSION +FROM ts; diff --git a/highlight-js/test/markup/sql/join.expect.txt b/highlight-js/test/markup/sql/join.expect.txt new file mode 100644 index 0000000..2389a7c --- /dev/null +++ b/highlight-js/test/markup/sql/join.expect.txt @@ -0,0 +1,17 @@ +SELECT + left_table.col1 AS l_col1, + left_table.col2 AS l_col2 +FROM + VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table + ANTI JOIN + VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table + ON left_table.col1 = right_table.col1; + +SELECT + left_table.col1 AS l_col1, + left_table.col2 AS l_col2 +FROM + VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table + LEFT SEMI JOIN + VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table + ON left_table.col1 = right_table.col1; diff --git a/highlight-js/test/markup/sql/join.txt b/highlight-js/test/markup/sql/join.txt new file mode 100644 index 0000000..1383197 --- /dev/null +++ b/highlight-js/test/markup/sql/join.txt @@ -0,0 +1,17 @@ +SELECT + left_table.col1 AS l_col1, + left_table.col2 AS l_col2 +FROM + VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table + ANTI JOIN + VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table + ON left_table.col1 = right_table.col1; + +SELECT + left_table.col1 AS l_col1, + left_table.col2 AS l_col2 +FROM + VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table + LEFT SEMI JOIN + VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table + ON left_table.col1 = right_table.col1; diff --git a/highlight-js/test/markup/sql/keywords.expect.txt b/highlight-js/test/markup/sql/keywords.expect.txt new file mode 100644 index 0000000..b0e7270 --- /dev/null +++ b/highlight-js/test/markup/sql/keywords.expect.txt @@ -0,0 +1 @@ +select * from t where t.select is null; diff --git a/highlight-js/test/markup/sql/keywords.txt b/highlight-js/test/markup/sql/keywords.txt new file mode 100644 index 0000000..57ff166 --- /dev/null +++ b/highlight-js/test/markup/sql/keywords.txt @@ -0,0 +1 @@ +select * from t where t.select is null; diff --git a/highlight-js/test/markup/sql/lateral-view.expect.txt b/highlight-js/test/markup/sql/lateral-view.expect.txt new file mode 100644 index 0000000..006b309 --- /dev/null +++ b/highlight-js/test/markup/sql/lateral-view.expect.txt @@ -0,0 +1,7 @@ +SELECT + master_child.col1 AS master_id, + child_table.child_id +FROM VALUES + ( 1 , ARRAY(1,2,3)), + (2, ARRAY(4,5,6)) AS master_child +LATERAL VIEW EXPLODE(master_child.col2) child_table AS child_id; diff --git a/highlight-js/test/markup/sql/lateral-view.txt b/highlight-js/test/markup/sql/lateral-view.txt new file mode 100644 index 0000000..9a152f3 --- /dev/null +++ b/highlight-js/test/markup/sql/lateral-view.txt @@ -0,0 +1,7 @@ +SELECT + master_child.col1 AS master_id, + child_table.child_id +FROM VALUES + ( 1 , ARRAY(1,2,3)), + (2, ARRAY(4,5,6)) AS master_child +LATERAL VIEW EXPLODE(master_child.col2) child_table AS child_id; diff --git a/highlight-js/test/markup/sql/numeric-types.expect.txt b/highlight-js/test/markup/sql/numeric-types.expect.txt new file mode 100644 index 0000000..2f5e035 --- /dev/null +++ b/highlight-js/test/markup/sql/numeric-types.expect.txt @@ -0,0 +1 @@ +SELECT CAST(32768 AS TINYINT) FROM VALUES('dummy'); diff --git a/highlight-js/test/markup/sql/numeric-types.txt b/highlight-js/test/markup/sql/numeric-types.txt new file mode 100644 index 0000000..ed7cec3 --- /dev/null +++ b/highlight-js/test/markup/sql/numeric-types.txt @@ -0,0 +1 @@ +SELECT CAST(32768 AS TINYINT) FROM VALUES('dummy'); diff --git a/highlight-js/test/markup/sql/set-operator.expect.txt b/highlight-js/test/markup/sql/set-operator.expect.txt new file mode 100644 index 0000000..1c90ba5 --- /dev/null +++ b/highlight-js/test/markup/sql/set-operator.expect.txt @@ -0,0 +1 @@ +SELECT * FROM VALUES 1, 2 ,3 UNION ALL VALUES 1, 2, 3; diff --git a/highlight-js/test/markup/sql/set-operator.txt b/highlight-js/test/markup/sql/set-operator.txt new file mode 100644 index 0000000..2fce4ac --- /dev/null +++ b/highlight-js/test/markup/sql/set-operator.txt @@ -0,0 +1 @@ +SELECT * FROM VALUES 1, 2 ,3 UNION ALL VALUES 1, 2, 3; diff --git a/highlight-js/test/markup/sql/tablesample.expect.txt b/highlight-js/test/markup/sql/tablesample.expect.txt new file mode 100644 index 0000000..cb17d70 --- /dev/null +++ b/highlight-js/test/markup/sql/tablesample.expect.txt @@ -0,0 +1,5 @@ +SELECT * FROM orders TABLESAMPLE (500 ROWS); + +SELECT * FROM customers TABLESAMPLE (25 PERCENT); + +SELECT * FROM employees TABLESAMPLE (BUCKET 2 OUT OF 10); diff --git a/highlight-js/test/markup/sql/tablesample.txt b/highlight-js/test/markup/sql/tablesample.txt new file mode 100644 index 0000000..b9e50c1 --- /dev/null +++ b/highlight-js/test/markup/sql/tablesample.txt @@ -0,0 +1,5 @@ +SELECT * FROM orders TABLESAMPLE (500 ROWS); + +SELECT * FROM customers TABLESAMPLE (25 PERCENT); + +SELECT * FROM employees TABLESAMPLE (BUCKET 2 OUT OF 10); diff --git a/highlight-js/test/markup/sql/values-statement.expect.txt b/highlight-js/test/markup/sql/values-statement.expect.txt new file mode 100644 index 0000000..91a0d6f --- /dev/null +++ b/highlight-js/test/markup/sql/values-statement.expect.txt @@ -0,0 +1,7 @@ +VALUES 1, 2 , 3; + +VALUES + (1, 'Spock'), + (2,'Kirk') , + (3, 'McCoy'), + (4,'Scotty'); diff --git a/highlight-js/test/markup/sql/values-statement.txt b/highlight-js/test/markup/sql/values-statement.txt new file mode 100644 index 0000000..0245c70 --- /dev/null +++ b/highlight-js/test/markup/sql/values-statement.txt @@ -0,0 +1,7 @@ +VALUES 1, 2 , 3; + +VALUES + (1, 'Spock'), + (2,'Kirk') , + (3, 'McCoy'), + (4,'Scotty'); diff --git a/highlight-js/test/markup/sql/window-function.expect.txt b/highlight-js/test/markup/sql/window-function.expect.txt new file mode 100644 index 0000000..a6882aa --- /dev/null +++ b/highlight-js/test/markup/sql/window-function.expect.txt @@ -0,0 +1,23 @@ +SELECT * +FROM ( + SELECT + posts.col1 AS emp_id, + posts.col2 AS dept_id, + posts.col3 AS posts, + DENSE_RANK() OVER post_ranking AS rank + FROM VALUES + (1, 1 ,100), + (2, 1 ,50), + (8, 1 ,250), + (3, 2 ,200), + (4, 2 ,300), + (9, 2 ,1000), + (5, 3 ,300), + (6, 3 ,100), + (7, 3 ,400) AS posts + WINDOW post_ranking AS ( + PARTITION BY posts.col2 + ORDER BY posts.col3 DESC + ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) +) +WHERE rank <= 2; diff --git a/highlight-js/test/markup/sql/window-function.txt b/highlight-js/test/markup/sql/window-function.txt new file mode 100644 index 0000000..a3dbf70 --- /dev/null +++ b/highlight-js/test/markup/sql/window-function.txt @@ -0,0 +1,23 @@ +SELECT * +FROM ( + SELECT + posts.col1 AS emp_id, + posts.col2 AS dept_id, + posts.col3 AS posts, + DENSE_RANK() OVER post_ranking AS rank + FROM VALUES + (1, 1 ,100), + (2, 1 ,50), + (8, 1 ,250), + (3, 2 ,200), + (4, 2 ,300), + (9, 2 ,1000), + (5, 3 ,300), + (6, 3 ,100), + (7, 3 ,400) AS posts + WINDOW post_ranking AS ( + PARTITION BY posts.col2 + ORDER BY posts.col3 DESC + ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) +) +WHERE rank <= 2; diff --git a/highlight-js/test/markup/subunit/subunit-errorline.expect.txt b/highlight-js/test/markup/subunit/subunit-errorline.expect.txt new file mode 100644 index 0000000..bf91c68 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-errorline.expect.txt @@ -0,0 +1,2 @@ +error: test simplename +error: test simple name diff --git a/highlight-js/test/markup/subunit/subunit-errorline.txt b/highlight-js/test/markup/subunit/subunit-errorline.txt new file mode 100644 index 0000000..2203d79 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-errorline.txt @@ -0,0 +1,2 @@ +error: test simplename +error: test simple name diff --git a/highlight-js/test/markup/subunit/subunit-failureline.expect.txt b/highlight-js/test/markup/subunit/subunit-failureline.expect.txt new file mode 100644 index 0000000..b570feb --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-failureline.expect.txt @@ -0,0 +1,4 @@ +failure: test simplename1 +failure test simplename1 +failure: test simple name1 +failure test simple name1 diff --git a/highlight-js/test/markup/subunit/subunit-failureline.txt b/highlight-js/test/markup/subunit/subunit-failureline.txt new file mode 100644 index 0000000..495838c --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-failureline.txt @@ -0,0 +1,4 @@ +failure: test simplename1 +failure test simplename1 +failure: test simple name1 +failure test simple name1 diff --git a/highlight-js/test/markup/subunit/subunit-progressline.expect.txt b/highlight-js/test/markup/subunit/subunit-progressline.expect.txt new file mode 100644 index 0000000..d72d157 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-progressline.expect.txt @@ -0,0 +1,7 @@ +progress: +5 +progress: +12 +progress: 29 +progress: -3 +progress: -91 +progress: push +progress: pop diff --git a/highlight-js/test/markup/subunit/subunit-progressline.txt b/highlight-js/test/markup/subunit/subunit-progressline.txt new file mode 100644 index 0000000..157114c --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-progressline.txt @@ -0,0 +1,7 @@ +progress: +5 +progress: +12 +progress: 29 +progress: -3 +progress: -91 +progress: push +progress: pop diff --git a/highlight-js/test/markup/subunit/subunit-skipline.expect.txt b/highlight-js/test/markup/subunit/subunit-skipline.expect.txt new file mode 100644 index 0000000..7d34d4c --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-skipline.expect.txt @@ -0,0 +1,3 @@ +skip test simplename +skip: test simple name +skip test simple name diff --git a/highlight-js/test/markup/subunit/subunit-skipline.txt b/highlight-js/test/markup/subunit/subunit-skipline.txt new file mode 100644 index 0000000..e90c933 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-skipline.txt @@ -0,0 +1,3 @@ +skip test simplename +skip: test simple name +skip test simple name diff --git a/highlight-js/test/markup/subunit/subunit-successline.expect.txt b/highlight-js/test/markup/subunit/subunit-successline.expect.txt new file mode 100644 index 0000000..f3e3ea0 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-successline.expect.txt @@ -0,0 +1,8 @@ +success test simplename1 +success: test simplename2 +successful test simplename3 +successful: test simplename4 +success test simple name1 +success: test simple name2 +successful test simple name3 +successful: test simple name4 diff --git a/highlight-js/test/markup/subunit/subunit-successline.txt b/highlight-js/test/markup/subunit/subunit-successline.txt new file mode 100644 index 0000000..00b29e0 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-successline.txt @@ -0,0 +1,8 @@ +success test simplename1 +success: test simplename2 +successful test simplename3 +successful: test simplename4 +success test simple name1 +success: test simple name2 +successful test simple name3 +successful: test simple name4 diff --git a/highlight-js/test/markup/subunit/subunit-tagline.expect.txt b/highlight-js/test/markup/subunit/subunit-tagline.expect.txt new file mode 100644 index 0000000..cf91f36 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-tagline.expect.txt @@ -0,0 +1,5 @@ +tags: fuzz unit beta functional +tags: -functional basic -beta +tags: -unit +tags: unit +tags: ddd diff --git a/highlight-js/test/markup/subunit/subunit-tagline.txt b/highlight-js/test/markup/subunit/subunit-tagline.txt new file mode 100644 index 0000000..6e8d521 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-tagline.txt @@ -0,0 +1,5 @@ +tags: fuzz unit beta functional +tags: -functional basic -beta +tags: -unit +tags: unit +tags: ddd diff --git a/highlight-js/test/markup/subunit/subunit-testline.expect.txt b/highlight-js/test/markup/subunit/subunit-testline.expect.txt new file mode 100644 index 0000000..f60f1a8 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-testline.expect.txt @@ -0,0 +1,10 @@ +test: test basicsuite1 +testing: test basicsuite1 +test test basicsuite1 +testing test basicsuite1 +test: test basic suite1 +testing: test basic suite1 +test test basic suite1 +testing test basic suite1 +testing test basic +test test 222 diff --git a/highlight-js/test/markup/subunit/subunit-testline.txt b/highlight-js/test/markup/subunit/subunit-testline.txt new file mode 100644 index 0000000..c11fd6d --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-testline.txt @@ -0,0 +1,10 @@ +test: test basicsuite1 +testing: test basicsuite1 +test test basicsuite1 +testing test basicsuite1 +test: test basic suite1 +testing: test basic suite1 +test test basic suite1 +testing test basic suite1 +testing test basic +test test 222 diff --git a/highlight-js/test/markup/subunit/subunit-timeline.expect.txt b/highlight-js/test/markup/subunit/subunit-timeline.expect.txt new file mode 100644 index 0000000..897ca50 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-timeline.expect.txt @@ -0,0 +1,3 @@ +time: 2016-03-13 18:12:37.231080Z +time: 1917-10-25 09:05:37.231080Z +time: 1984-03-24 07:02:09.231080Z diff --git a/highlight-js/test/markup/subunit/subunit-timeline.txt b/highlight-js/test/markup/subunit/subunit-timeline.txt new file mode 100644 index 0000000..1bd6510 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-timeline.txt @@ -0,0 +1,3 @@ +time: 2016-03-13 18:12:37.231080Z +time: 1917-10-25 09:05:37.231080Z +time: 1984-03-24 07:02:09.231080Z diff --git a/highlight-js/test/markup/subunit/subunit-uxsuccessline.expect.txt b/highlight-js/test/markup/subunit/subunit-uxsuccessline.expect.txt new file mode 100644 index 0000000..e773e46 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-uxsuccessline.expect.txt @@ -0,0 +1,3 @@ +uxsuccess test simplename +uxsuccess: test simple name +uxsuccess test simple name diff --git a/highlight-js/test/markup/subunit/subunit-uxsuccessline.txt b/highlight-js/test/markup/subunit/subunit-uxsuccessline.txt new file mode 100644 index 0000000..399a254 --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-uxsuccessline.txt @@ -0,0 +1,3 @@ +uxsuccess test simplename +uxsuccess: test simple name +uxsuccess test simple name diff --git a/highlight-js/test/markup/subunit/subunit-xfailline.expect.txt b/highlight-js/test/markup/subunit/subunit-xfailline.expect.txt new file mode 100644 index 0000000..944c83f --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-xfailline.expect.txt @@ -0,0 +1,3 @@ +xfail test simplename +xfail: test simple name +xfail test simple name diff --git a/highlight-js/test/markup/subunit/subunit-xfailline.txt b/highlight-js/test/markup/subunit/subunit-xfailline.txt new file mode 100644 index 0000000..de0fabb --- /dev/null +++ b/highlight-js/test/markup/subunit/subunit-xfailline.txt @@ -0,0 +1,3 @@ +xfail test simplename +xfail: test simple name +xfail test simple name diff --git a/highlight-js/test/markup/swift/functions.expect.txt b/highlight-js/test/markup/swift/functions.expect.txt new file mode 100644 index 0000000..a83afdf --- /dev/null +++ b/highlight-js/test/markup/swift/functions.expect.txt @@ -0,0 +1,10 @@ +protocol Protocol { + func f1() + func f2() +} + +class MyClass { + func f() { + return true + } +} diff --git a/highlight-js/test/markup/swift/functions.txt b/highlight-js/test/markup/swift/functions.txt new file mode 100644 index 0000000..cfd64ae --- /dev/null +++ b/highlight-js/test/markup/swift/functions.txt @@ -0,0 +1,10 @@ +protocol Protocol { + func f1() + func f2() +} + +class MyClass { + func f() { + return true + } +} diff --git a/highlight-js/test/markup/swift/multiline-string.expect.txt b/highlight-js/test/markup/swift/multiline-string.expect.txt new file mode 100644 index 0000000..452c44b --- /dev/null +++ b/highlight-js/test/markup/swift/multiline-string.expect.txt @@ -0,0 +1,3 @@ +var string = """ + var a = not actually code +""" \ No newline at end of file diff --git a/highlight-js/test/markup/swift/multiline-string.txt b/highlight-js/test/markup/swift/multiline-string.txt new file mode 100644 index 0000000..56db376 --- /dev/null +++ b/highlight-js/test/markup/swift/multiline-string.txt @@ -0,0 +1,3 @@ +var string = """ + var a = not actually code +""" \ No newline at end of file diff --git a/highlight-js/test/markup/tap/basic.expect.txt b/highlight-js/test/markup/tap/basic.expect.txt new file mode 100644 index 0000000..b0788be --- /dev/null +++ b/highlight-js/test/markup/tap/basic.expect.txt @@ -0,0 +1,5 @@ +1..4 +ok 1 - Input file opened +not ok 2 - First line of the input valid +ok 3 - Read the rest of the file +not ok 4 - Summarized correctly # TODO Not written yet diff --git a/highlight-js/test/markup/tap/basic.txt b/highlight-js/test/markup/tap/basic.txt new file mode 100644 index 0000000..a0e46dd --- /dev/null +++ b/highlight-js/test/markup/tap/basic.txt @@ -0,0 +1,5 @@ +1..4 +ok 1 - Input file opened +not ok 2 - First line of the input valid +ok 3 - Read the rest of the file +not ok 4 - Summarized correctly # TODO Not written yet diff --git a/highlight-js/test/markup/tap/without-numbers.expect.txt b/highlight-js/test/markup/tap/without-numbers.expect.txt new file mode 100644 index 0000000..2df4830 --- /dev/null +++ b/highlight-js/test/markup/tap/without-numbers.expect.txt @@ -0,0 +1,6 @@ +1..6 +not ok +ok +not ok +ok +ok diff --git a/highlight-js/test/markup/tap/without-numbers.txt b/highlight-js/test/markup/tap/without-numbers.txt new file mode 100644 index 0000000..1b9be5a --- /dev/null +++ b/highlight-js/test/markup/tap/without-numbers.txt @@ -0,0 +1,6 @@ +1..6 +not ok +ok +not ok +ok +ok diff --git a/highlight-js/test/markup/tap/yaml-block.expect.txt b/highlight-js/test/markup/tap/yaml-block.expect.txt new file mode 100644 index 0000000..9ec1463 --- /dev/null +++ b/highlight-js/test/markup/tap/yaml-block.expect.txt @@ -0,0 +1,26 @@ +TAP version 13 +ok - created Board +ok +ok +ok +ok +ok +ok +ok + --- + message: "Board layout" + severity: comment + dump: + board: + - ' 16G 05C ' + - ' G N C C C G ' + - ' G C + ' + - '10C 01G 03C ' + - 'R N G G A G C C C ' + - ' R G C + ' + - ' 01G 17C 00C ' + - ' G A G G N R R N R ' + - ' G R G ' + ... +ok - board has 7 tiles + starter tile +1..9 diff --git a/highlight-js/test/markup/tap/yaml-block.txt b/highlight-js/test/markup/tap/yaml-block.txt new file mode 100644 index 0000000..23503b9 --- /dev/null +++ b/highlight-js/test/markup/tap/yaml-block.txt @@ -0,0 +1,26 @@ +TAP version 13 +ok - created Board +ok +ok +ok +ok +ok +ok +ok + --- + message: "Board layout" + severity: comment + dump: + board: + - ' 16G 05C ' + - ' G N C C C G ' + - ' G C + ' + - '10C 01G 03C ' + - 'R N G G A G C C C ' + - ' R G C + ' + - ' 01G 17C 00C ' + - ' G A G G N R R N R ' + - ' G R G ' + ... +ok - board has 7 tiles + starter tile +1..9 diff --git a/highlight-js/test/markup/twig/filter_with_underscore.expect.txt b/highlight-js/test/markup/twig/filter_with_underscore.expect.txt new file mode 100644 index 0000000..b08eb55 --- /dev/null +++ b/highlight-js/test/markup/twig/filter_with_underscore.expect.txt @@ -0,0 +1 @@ +{{ "string with spaces"|url_encode }} diff --git a/highlight-js/test/markup/twig/filter_with_underscore.txt b/highlight-js/test/markup/twig/filter_with_underscore.txt new file mode 100644 index 0000000..14f61f0 --- /dev/null +++ b/highlight-js/test/markup/twig/filter_with_underscore.txt @@ -0,0 +1 @@ +{{ "string with spaces"|url_encode }} \ No newline at end of file diff --git a/highlight-js/test/markup/twig/template_tags.expect.txt b/highlight-js/test/markup/twig/template_tags.expect.txt new file mode 100644 index 0000000..a4840a2 --- /dev/null +++ b/highlight-js/test/markup/twig/template_tags.expect.txt @@ -0,0 +1,12 @@ +{% if posts|length %} + {% for article in articles %} + &lt;div&gt; + {{ article.title|upper() }} + + {# outputs 'WELCOME' #} + &lt;/div&gt; + {% endfor %} +{% endif %} + +{% set user = json_encode(user) %} + diff --git a/highlight-js/test/markup/twig/template_tags.txt b/highlight-js/test/markup/twig/template_tags.txt new file mode 100644 index 0000000..23bd8ab --- /dev/null +++ b/highlight-js/test/markup/twig/template_tags.txt @@ -0,0 +1,11 @@ +{% if posts|length %} + {% for article in articles %} + <div> + {{ article.title|upper() }} + + {# outputs 'WELCOME' #} + </div> + {% endfor %} +{% endif %} + +{% set user = json_encode(user) %} diff --git a/highlight-js/test/markup/typescript/class.expect.txt b/highlight-js/test/markup/typescript/class.expect.txt new file mode 100644 index 0000000..ff99191 --- /dev/null +++ b/highlight-js/test/markup/typescript/class.expect.txt @@ -0,0 +1,11 @@ +class Car extends Vehicle { + constructor(speed, cost) { + super(speed); + + var c = Symbol('cost'); + this[c] = cost; + + this.intro = `This is a car runs at + ${speed}.`; + } +} diff --git a/highlight-js/test/markup/typescript/class.txt b/highlight-js/test/markup/typescript/class.txt new file mode 100644 index 0000000..47fa67c --- /dev/null +++ b/highlight-js/test/markup/typescript/class.txt @@ -0,0 +1,11 @@ +class Car extends Vehicle { + constructor(speed, cost) { + super(speed); + + var c = Symbol('cost'); + this[c] = cost; + + this.intro = `This is a car runs at + ${speed}.`; + } +} diff --git a/highlight-js/test/markup/typescript/decorator-factories.expect.txt b/highlight-js/test/markup/typescript/decorator-factories.expect.txt new file mode 100644 index 0000000..08582b3 --- /dev/null +++ b/highlight-js/test/markup/typescript/decorator-factories.expect.txt @@ -0,0 +1,13 @@ +@foo('foo') +export class MyClass { + @baz(123) + private myAttribute: string; + + constructor(@bar(true) private x, + @bar(qux(quux(true))) private y) { } + + @bar() + private myMethod(@bar() z) { + console.log('Hello world.'); + } +} \ No newline at end of file diff --git a/highlight-js/test/markup/typescript/decorator-factories.txt b/highlight-js/test/markup/typescript/decorator-factories.txt new file mode 100644 index 0000000..c8081c6 --- /dev/null +++ b/highlight-js/test/markup/typescript/decorator-factories.txt @@ -0,0 +1,13 @@ +@foo('foo') +export class MyClass { + @baz(123) + private myAttribute: string; + + constructor(@bar(true) private x, + @bar(qux(quux(true))) private y) { } + + @bar() + private myMethod(@bar() z) { + console.log('Hello world.'); + } +} \ No newline at end of file diff --git a/highlight-js/test/markup/typescript/functions.expect.txt b/highlight-js/test/markup/typescript/functions.expect.txt new file mode 100644 index 0000000..efff5b5 --- /dev/null +++ b/highlight-js/test/markup/typescript/functions.expect.txt @@ -0,0 +1,11 @@ +var noop = function() {}; + +var identity = function(foo) { + return foo; +}; + +function println(value: string); + +function getArray(): number[] { + return [1, 2]; +} \ No newline at end of file diff --git a/highlight-js/test/markup/typescript/functions.txt b/highlight-js/test/markup/typescript/functions.txt new file mode 100644 index 0000000..5e4f9a9 --- /dev/null +++ b/highlight-js/test/markup/typescript/functions.txt @@ -0,0 +1,11 @@ +var noop = function() {}; + +var identity = function(foo) { + return foo; +}; + +function println(value: string); + +function getArray(): number[] { + return [1, 2]; +} diff --git a/highlight-js/test/markup/typescript/jsx.expect.txt b/highlight-js/test/markup/typescript/jsx.expect.txt new file mode 100644 index 0000000..8d3c418 --- /dev/null +++ b/highlight-js/test/markup/typescript/jsx.expect.txt @@ -0,0 +1,41 @@ +export function getModuleInstanceState(node: Node): ModuleInstanceState { + // A module is uninstantiated if it contains only + // 1. interface declarations, type alias declarations + if (node.kind === SyntaxKind.InterfaceDeclaration || node.kind === SyntaxKind.TypeAliasDeclaration) { + return ModuleInstanceState.NonInstantiated; + } + // 2. const enum declarations + else if (isConstEnumDeclaration(node)) { + return ModuleInstanceState.ConstEnumOnly; + } + // 3. non-exported import declarations + else if ((node.kind === SyntaxKind.ImportDeclaration || node.kind === SyntaxKind.ImportEqualsDeclaration) && !(node.flags & NodeFlags.Export)) { + return ModuleInstanceState.NonInstantiated; + } + // 4. other uninstantiated module declarations. + else if (node.kind === SyntaxKind.ModuleBlock) { + let state = ModuleInstanceState.NonInstantiated; + forEachChild(node, n => { + switch (getModuleInstanceState(n)) { + case ModuleInstanceState.NonInstantiated: + // child is non-instantiated - continue searching + return false; + case ModuleInstanceState.ConstEnumOnly: + // child is const enum only - record state and continue searching + state = ModuleInstanceState.ConstEnumOnly; + return false; + case ModuleInstanceState.Instantiated: + // child is instantiated - record state and stop + state = ModuleInstanceState.Instantiated; + return true; + } + }); + return state; + } + else if (node.kind === SyntaxKind.ModuleDeclaration) { + return getModuleInstanceState((<ModuleDeclaration>node).body); + } + else { + return ModuleInstanceState.Instantiated; + } +} diff --git a/highlight-js/test/markup/typescript/jsx.txt b/highlight-js/test/markup/typescript/jsx.txt new file mode 100644 index 0000000..72d8fe3 --- /dev/null +++ b/highlight-js/test/markup/typescript/jsx.txt @@ -0,0 +1,41 @@ +export function getModuleInstanceState(node: Node): ModuleInstanceState { + // A module is uninstantiated if it contains only + // 1. interface declarations, type alias declarations + if (node.kind === SyntaxKind.InterfaceDeclaration || node.kind === SyntaxKind.TypeAliasDeclaration) { + return ModuleInstanceState.NonInstantiated; + } + // 2. const enum declarations + else if (isConstEnumDeclaration(node)) { + return ModuleInstanceState.ConstEnumOnly; + } + // 3. non-exported import declarations + else if ((node.kind === SyntaxKind.ImportDeclaration || node.kind === SyntaxKind.ImportEqualsDeclaration) && !(node.flags & NodeFlags.Export)) { + return ModuleInstanceState.NonInstantiated; + } + // 4. other uninstantiated module declarations. + else if (node.kind === SyntaxKind.ModuleBlock) { + let state = ModuleInstanceState.NonInstantiated; + forEachChild(node, n => { + switch (getModuleInstanceState(n)) { + case ModuleInstanceState.NonInstantiated: + // child is non-instantiated - continue searching + return false; + case ModuleInstanceState.ConstEnumOnly: + // child is const enum only - record state and continue searching + state = ModuleInstanceState.ConstEnumOnly; + return false; + case ModuleInstanceState.Instantiated: + // child is instantiated - record state and stop + state = ModuleInstanceState.Instantiated; + return true; + } + }); + return state; + } + else if (node.kind === SyntaxKind.ModuleDeclaration) { + return getModuleInstanceState((node).body); + } + else { + return ModuleInstanceState.Instantiated; + } +} diff --git a/highlight-js/test/markup/typescript/module-id.expect.txt b/highlight-js/test/markup/typescript/module-id.expect.txt new file mode 100644 index 0000000..ae1092f --- /dev/null +++ b/highlight-js/test/markup/typescript/module-id.expect.txt @@ -0,0 +1,14 @@ +@Component({ + selector: 'my-example', + directives: [SomeDirective], + templateUrl: './my-example.component.html', + moduleId: module.id, + styles: [` + .my-example { + padding: 5px; + } + `] +}) +export class MyExampleComponent { + someProp: string = "blah"; +} diff --git a/highlight-js/test/markup/typescript/module-id.txt b/highlight-js/test/markup/typescript/module-id.txt new file mode 100644 index 0000000..ed0ebbb --- /dev/null +++ b/highlight-js/test/markup/typescript/module-id.txt @@ -0,0 +1,14 @@ +@Component({ + selector: 'my-example', + directives: [SomeDirective], + templateUrl: './my-example.component.html', + moduleId: module.id, + styles: [` + .my-example { + padding: 5px; + } + `] +}) +export class MyExampleComponent { + someProp: string = "blah"; +} \ No newline at end of file diff --git a/highlight-js/test/markup/verilog/misc.expect.txt b/highlight-js/test/markup/verilog/misc.expect.txt new file mode 100644 index 0000000..e665ae1 --- /dev/null +++ b/highlight-js/test/markup/verilog/misc.expect.txt @@ -0,0 +1,37 @@ +`timescale 1ns / 1ps + +/** + * counter: a generic clearable up-counter + */ + +module counter + #(parameter WIDTH=64) + ( + input clk, + input ce, + input arst_n, + output reg [WIDTH-1:0] q + ); + + // some child + clock_buffer #(WIDTH) buffer_inst ( + .clk(clk), + .ce(ce), + .reset(arst_n) + ); + + // Simple gated up-counter with async clear + + always @(posedge clk or negedge arst_n) begin + if (arst_n == 1'b0) begin + q <= {WIDTH {1'b0}}; + end + else begin + q <= q; + if (ce == 1'b1) begin + q <= q + 1; + end + end + end + +endmodule diff --git a/highlight-js/test/markup/verilog/misc.txt b/highlight-js/test/markup/verilog/misc.txt new file mode 100644 index 0000000..5db8cfd --- /dev/null +++ b/highlight-js/test/markup/verilog/misc.txt @@ -0,0 +1,37 @@ +`timescale 1ns / 1ps + +/** + * counter: a generic clearable up-counter + */ + +module counter + #(parameter WIDTH=64) + ( + input clk, + input ce, + input arst_n, + output reg [WIDTH-1:0] q + ); + + // some child + clock_buffer #(WIDTH) buffer_inst ( + .clk(clk), + .ce(ce), + .reset(arst_n) + ); + + // Simple gated up-counter with async clear + + always @(posedge clk or negedge arst_n) begin + if (arst_n == 1'b0) begin + q <= {WIDTH {1'b0}}; + end + else begin + q <= q; + if (ce == 1'b1) begin + q <= q + 1; + end + end + end + +endmodule diff --git a/highlight-js/test/markup/verilog/numbers.expect.txt b/highlight-js/test/markup/verilog/numbers.expect.txt new file mode 100644 index 0000000..d29935f --- /dev/null +++ b/highlight-js/test/markup/verilog/numbers.expect.txt @@ -0,0 +1,8 @@ +a = 'hff; +A = 'HFF; +b = 8'h33; +B = 8'H33; +c = 12; +d = 'o755; +e = 8'b1001_0001; +f = 8'b1111zzzx; diff --git a/highlight-js/test/markup/verilog/numbers.txt b/highlight-js/test/markup/verilog/numbers.txt new file mode 100644 index 0000000..d8a2406 --- /dev/null +++ b/highlight-js/test/markup/verilog/numbers.txt @@ -0,0 +1,8 @@ +a = 'hff; +A = 'HFF; +b = 8'h33; +B = 8'H33; +c = 12; +d = 'o755; +e = 8'b1001_0001; +f = 8'b1111zzzx; diff --git a/highlight-js/test/markup/vim/strings-comments.expect.txt b/highlight-js/test/markup/vim/strings-comments.expect.txt new file mode 100644 index 0000000..77ba698 --- /dev/null +++ b/highlight-js/test/markup/vim/strings-comments.expect.txt @@ -0,0 +1,4 @@ +" comment +let one = "string" " comment +let two = "crazy +\ string with a \" quote" diff --git a/highlight-js/test/markup/vim/strings-comments.txt b/highlight-js/test/markup/vim/strings-comments.txt new file mode 100644 index 0000000..d0be92d --- /dev/null +++ b/highlight-js/test/markup/vim/strings-comments.txt @@ -0,0 +1,4 @@ +" comment +let one = "string" " comment +let two = "crazy +\ string with a \" quote" diff --git a/highlight-js/test/markup/x86asm/labels-directives.expect.txt b/highlight-js/test/markup/x86asm/labels-directives.expect.txt new file mode 100644 index 0000000..801d661 --- /dev/null +++ b/highlight-js/test/markup/x86asm/labels-directives.expect.txt @@ -0,0 +1,6 @@ + .cfi_startproc +_ZN3lib13is_whitespace17h28afa23272bf056bE: + .align 16, 0x90 + ja .Lfunc_end0 +.Lfunc_end0: + ret diff --git a/highlight-js/test/markup/x86asm/labels-directives.txt b/highlight-js/test/markup/x86asm/labels-directives.txt new file mode 100644 index 0000000..127e6e9 --- /dev/null +++ b/highlight-js/test/markup/x86asm/labels-directives.txt @@ -0,0 +1,6 @@ + .cfi_startproc +_ZN3lib13is_whitespace17h28afa23272bf056bE: + .align 16, 0x90 + ja .Lfunc_end0 +.Lfunc_end0: + ret diff --git a/highlight-js/test/markup/xml/space-attributes.expect.txt b/highlight-js/test/markup/xml/space-attributes.expect.txt new file mode 100644 index 0000000..560fc87 --- /dev/null +++ b/highlight-js/test/markup/xml/space-attributes.expect.txt @@ -0,0 +1,3 @@ +<img src ="/pics/foo.jpg"> +<img src= "/pics/foo.jpg"> +<img src = "/pics/foo.jpg"> diff --git a/highlight-js/test/markup/xml/space-attributes.txt b/highlight-js/test/markup/xml/space-attributes.txt new file mode 100644 index 0000000..fb633af --- /dev/null +++ b/highlight-js/test/markup/xml/space-attributes.txt @@ -0,0 +1,3 @@ + + + diff --git a/highlight-js/test/markup/xml/unquoted-attributes.expect.txt b/highlight-js/test/markup/xml/unquoted-attributes.expect.txt new file mode 100644 index 0000000..621a51f --- /dev/null +++ b/highlight-js/test/markup/xml/unquoted-attributes.expect.txt @@ -0,0 +1,9 @@ +<img src="/pics/foo.jpg"> +<img src='/pics/foo.jpg'> +<img src=/pics/foo.jpg> +<img src=/pics/> +<img src=/pics /> +<img alt=''/> +<img alt/> +<img alt=''> +<img alt> diff --git a/highlight-js/test/markup/xml/unquoted-attributes.txt b/highlight-js/test/markup/xml/unquoted-attributes.txt new file mode 100644 index 0000000..cd19065 --- /dev/null +++ b/highlight-js/test/markup/xml/unquoted-attributes.txt @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/highlight-js/test/markup/yaml/string.expect.txt b/highlight-js/test/markup/yaml/string.expect.txt new file mode 100644 index 0000000..4980e5c --- /dev/null +++ b/highlight-js/test/markup/yaml/string.expect.txt @@ -0,0 +1,7 @@ +key: value +key: 'some value' +key: "some value" +key: | + multi-string + value +key: true diff --git a/highlight-js/test/markup/yaml/string.txt b/highlight-js/test/markup/yaml/string.txt new file mode 100644 index 0000000..db9b389 --- /dev/null +++ b/highlight-js/test/markup/yaml/string.txt @@ -0,0 +1,7 @@ +key: value +key: 'some value' +key: "some value" +key: | + multi-string + value +key: true diff --git a/highlight-js/test/markup/yaml/tag.expect.txt b/highlight-js/test/markup/yaml/tag.expect.txt new file mode 100644 index 0000000..dbc5645 --- /dev/null +++ b/highlight-js/test/markup/yaml/tag.expect.txt @@ -0,0 +1,4 @@ +key: !!builtintagname test +key: !localtagname test +key: "!notatag" +key: '!!notatageither' diff --git a/highlight-js/test/markup/yaml/tag.txt b/highlight-js/test/markup/yaml/tag.txt new file mode 100644 index 0000000..35f3615 --- /dev/null +++ b/highlight-js/test/markup/yaml/tag.txt @@ -0,0 +1,4 @@ +key: !!builtintagname test +key: !localtagname test +key: "!notatag" +key: '!!notatageither' diff --git a/highlight-js/test/mocha.opts b/highlight-js/test/mocha.opts new file mode 100644 index 0000000..dcb2ddb --- /dev/null +++ b/highlight-js/test/mocha.opts @@ -0,0 +1,6 @@ +--require should +--reporter spec +--ui bdd +--bail +--check-leaks +--inline-diffs diff --git a/highlight-js/test/special/buildClassName.js b/highlight-js/test/special/buildClassName.js new file mode 100644 index 0000000..4915f59 --- /dev/null +++ b/highlight-js/test/special/buildClassName.js @@ -0,0 +1,39 @@ +'use strict'; + +let _ = require('lodash'); + +describe('block class names', function() { + before(function() { + const testHTML = document.querySelectorAll('#build-classname .hljs'); + + this.blocks = _.map(testHTML, 'className'); + }); + + it('should add language class name to block', function() { + const expected = 'some-class hljs xml', + actual = this.blocks[0]; + + actual.should.equal(expected); + }); + + it('should not clutter block class (first)', function () { + const expected = 'hljs some-class xml', + actual = this.blocks[1]; + + actual.should.equal(expected); + }); + + it('should not clutter block class (last)', function () { + const expected = 'some-class hljs xml', + actual = this.blocks[2]; + + actual.should.equal(expected); + }); + + it('should not clutter block class (spaces around)', function () { + const expected = 'hljs some-class xml', + actual = this.blocks[3]; + + actual.should.equal(expected); + }); +}); diff --git a/highlight-js/test/special/customMarkup.js b/highlight-js/test/special/customMarkup.js new file mode 100644 index 0000000..4ace5e7 --- /dev/null +++ b/highlight-js/test/special/customMarkup.js @@ -0,0 +1,43 @@ +'use strict'; + +let _ = require('lodash'); +let utility = require('../utility'); + +describe('custom markup', function() { + before(function() { + const testHTML = document.querySelectorAll('#custom-markup .hljs'); + + this.blocks = _.map(testHTML, 'innerHTML'); + }); + + it('should replace tabs', function() { + const filename = utility.buildPath('fixtures', 'expect', + 'tabreplace.txt'), + actual = this.blocks[0]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); + + it('should keep custom markup', function() { + const filename = utility.buildPath('fixtures', 'expect', + 'custommarkup.txt'), + actual = this.blocks[1]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); + + it('should keep custom markup and replace tabs', function() { + const filename = utility.buildPath('fixtures', 'expect', + 'customtabreplace.txt'), + actual = this.blocks[2]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); + + it('should keep the same amount of void elements (
    ,
    , ...)', function() { + const filename = utility.buildPath('fixtures', 'expect', 'brInPre.txt'), + actual = this.blocks[3]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); +}); diff --git a/highlight-js/test/special/endsWithParentVariants.js b/highlight-js/test/special/endsWithParentVariants.js new file mode 100644 index 0000000..ce222a9 --- /dev/null +++ b/highlight-js/test/special/endsWithParentVariants.js @@ -0,0 +1,19 @@ +'use strict'; + +let utility = require('../utility'); + +describe('ends with parent variants', function() { + before(function() { + const filename = utility.buildPath('fixtures', 'expect', 'endsWithParentVariants.txt'), + testHTML = document.querySelectorAll('#ends-with-parent-variants .hljs'); + + return utility.setupFile(filename, 'utf-8', this, testHTML); + }); + + it('should end on all variants', function() { + const actual = this.blocks[0]; + + actual.should.equal(this.expected); + }); + +}); diff --git a/highlight-js/test/special/explicitLanguage.js b/highlight-js/test/special/explicitLanguage.js new file mode 100644 index 0000000..e527879 --- /dev/null +++ b/highlight-js/test/special/explicitLanguage.js @@ -0,0 +1,44 @@ +'use strict'; + +let utility = require('../utility'); + +describe('explicit language class', function() { + before(function() { + const filename = utility.buildPath('fixtures', 'expect', 'explicit1.txt'), + testHTML = document.querySelectorAll('#explicit-language .hljs'); + + return utility.setupFile(filename, 'utf-8', this, testHTML); + }); + + it('should highlight block with language in code tag', function() { + const actual = this.blocks[0]; + + actual.should.equal(this.expected); + }); + + it('should highlight block with language in pre tag', function() { + const actual = this.blocks[1]; + + actual.should.equal(this.expected); + }); + + it('should highlight using html 5 style (language-*)', function() { + const actual = this.blocks[2]; + + actual.should.equal(this.expected); + }); + + it('should highlight with shortened prefix (lang-)', function() { + const filename = utility.buildPath('fixtures', 'expect', 'explicit2.txt'), + actual = this.blocks[3]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); + + it('should highlight if classname contains uppercase symbols', function() { + const filename = utility.buildPath('fixtures', 'expect', 'explicit2.txt'), + actual = this.blocks[4]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); +}); diff --git a/highlight-js/test/special/index.js b/highlight-js/test/special/index.js new file mode 100644 index 0000000..3c158c5 --- /dev/null +++ b/highlight-js/test/special/index.js @@ -0,0 +1,45 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let hljs = require('../../build'); +let jsdomEnv = bluebird.promisify(require('jsdom').env); +let readFile = bluebird.promisify(require('fs').readFile); +let utility = require('../utility'); + +describe('special cases tests', function() { + before(function() { + const filename = utility.buildPath('fixtures', 'index.html'); + + return readFile(filename, 'utf-8') + .then(page => jsdomEnv(page)) + .then(window => { + let blocks; + + // Allows hljs to use document + global.document = window.document; + + // Special language to test endsWithParentVariants + hljs.registerLanguage('nested', require('../fixtures/nested.js')); + + // Setup hljs environment + hljs.configure({ tabReplace: ' ' }); + hljs.initHighlighting(); + + // Setup hljs for non-`
    ` tests
    +        hljs.configure({ useBR: true });
    +
    +        blocks = document.querySelectorAll('.code');
    +        _.each(blocks, hljs.highlightBlock);
    +      });
    +  });
    +
    +  require('./explicitLanguage');
    +  require('./customMarkup');
    +  require('./languageAlias');
    +  require('./noHighlight');
    +  require('./subLanguages');
    +  require('./buildClassName');
    +  require('./useBr');
    +  require('./endsWithParentVariants')
    +});
    diff --git a/highlight-js/test/special/languageAlias.js b/highlight-js/test/special/languageAlias.js
    new file mode 100644
    index 0000000..c2f9db2
    --- /dev/null
    +++ b/highlight-js/test/special/languageAlias.js
    @@ -0,0 +1,20 @@
    +'use strict';
    +
    +let _       = require('lodash');
    +let utility = require('../utility');
    +
    +describe('language alias', function() {
    +  before(function() {
    +    const testHTML = document.querySelectorAll('#language-alias .hljs');
    +
    +    this.blocks = _.map(testHTML, 'innerHTML');
    +  });
    +
    +  it('should highlight as aliased language', function() {
    +    const filename = utility.buildPath('fixtures', 'expect',
    +                                       'languagealias.txt'),
    +          actual   = this.blocks[0];
    +
    +    return utility.expectedFile(filename, 'utf-8', actual);
    +  });
    +});
    diff --git a/highlight-js/test/special/noHighlight.js b/highlight-js/test/special/noHighlight.js
    new file mode 100644
    index 0000000..9d51195
    --- /dev/null
    +++ b/highlight-js/test/special/noHighlight.js
    @@ -0,0 +1,88 @@
    +'use strict';
    +
    +let _ = require('lodash');
    +
    +describe('no highlighting', function() {
    +  before(function() {
    +    const testHTML = document.querySelectorAll('#no-highlight pre');
    +
    +    this.blocks   = _.map(testHTML, 'children[0].innerHTML');
    +    this.expected = {
    +      html:   '<div id="contents">\n  ' +
    +              '<p>Hello, World!\n</div>',
    +      python: 'for x in [1, 2, 3]: count(x)',
    +      javascript: 'var x = ' +
    +                  '\'foo\';'
    +    };
    +  });
    +
    +  it('should keep block unchanged (nohighlight)', function() {
    +    const expected = this.expected.html,
    +          actual   = this.blocks[0];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (no-highlight)', function() {
    +    const expected = this.expected.html,
    +          actual   = this.blocks[1];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (plain)', function() {
    +    const expected = this.expected.html,
    +          actual   = this.blocks[2];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (text)', function() {
    +    const expected = this.expected.html,
    +          actual   = this.blocks[3];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should skip pre tags without a child code tag', function() {
    +    const expected = 'Computer output',
    +          actual   = this.blocks[4];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (unsupported language)', function() {
    +    const expected = this.expected.python,
    +          actual   = this.blocks[5];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (unsupported lang)', function() {
    +    const expected = this.expected.python,
    +          actual   = this.blocks[6];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (unsupported prefixed language)', function() {
    +    const expected = this.expected.python,
    +          actual   = this.blocks[7];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should highlight class names containing text at the start', function() {
    +    const expected = this.expected.javascript,
    +          actual   = this.blocks[8];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should highlight class names containing text at the end', function() {
    +    const expected = this.expected.javascript,
    +          actual   = this.blocks[9];
    +
    +    actual.should.equal(expected);
    +  });
    +});
    diff --git a/highlight-js/test/special/subLanguages.js b/highlight-js/test/special/subLanguages.js
    new file mode 100644
    index 0000000..c7e458a
    --- /dev/null
    +++ b/highlight-js/test/special/subLanguages.js
    @@ -0,0 +1,17 @@
    +'use strict';
    +
    +let utility = require('../utility');
    +
    +describe('sub-languages', function() {
    +  before(function() {
    +    this.block = document.querySelector('#sublanguages');
    +  });
    +
    +  it('should highlight XML with PHP and JavaScript', function() {
    +    const filename = utility.buildPath('fixtures', 'expect',
    +                                     'sublanguages.txt'),
    +          actual   = this.block.innerHTML;
    +
    +    return utility.expectedFile(filename, 'utf-8', actual);
    +  });
    +});
    diff --git a/highlight-js/test/special/useBr.js b/highlight-js/test/special/useBr.js
    new file mode 100644
    index 0000000..70e2cc3
    --- /dev/null
    +++ b/highlight-js/test/special/useBr.js
    @@ -0,0 +1,30 @@
    +'use strict';
    +
    +let utility = require('../utility');
    +
    +describe('use br', function() {
    +  before(function() {
    +    const filename = utility.buildPath('fixtures', 'expect', 'useBr.txt'),
    +          testHTML = document.querySelectorAll('#use-br .hljs');
    +
    +    return utility.setupFile(filename, 'utf-8', this, testHTML);
    +  });
    +
    +  it('should respect 
    tags', function() { + const actual = this.blocks[0]; + + actual.should.equal(this.expected); + }); + + it('should ignore literal new lines', function() { + const actual = this.blocks[1]; + + actual.should.equal(this.expected); + }); + + it('should recognize xml-style
    ', function() { + const actual = this.blocks[2]; + + actual.should.equal(this.expected); + }); +}); diff --git a/highlight-js/test/utility.js b/highlight-js/test/utility.js new file mode 100644 index 0000000..967b170 --- /dev/null +++ b/highlight-js/test/utility.js @@ -0,0 +1,29 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let readFile = bluebird.promisify(require('fs').readFile); +let path = require('path'); + +// Build a path relative to `test/` +exports.buildPath = function() { + const args = _.slice(arguments, 0), + paths = [__dirname].concat(args); + + return path.join.apply(this, paths); +}; + +exports.numberToString = _.method('toString'); + +exports.expectedFile = function(filename, encoding, actual) { + return readFile(filename, encoding) + .then(expected => actual.trim().should.equal(expected.trim())); +}; + +exports.setupFile = function(filename, encoding, that, testHTML) { + return readFile(filename, encoding) + .then(expected => { + that.expected = expected.trim(); + that.blocks = _.map(testHTML, 'innerHTML'); + }); +}; diff --git a/highlight-js/tools/all.js b/highlight-js/tools/all.js new file mode 100644 index 0000000..6168be0 --- /dev/null +++ b/highlight-js/tools/all.js @@ -0,0 +1,34 @@ +'use strict'; + +let _ = require('lodash'); +let path = require('path'); +let cdn = require('./cdn'); +let node = require('./node'); +let browser = require('./browser'); + +function newBuildDirectory(dir, subdir) { + const build = path.join(dir.build, subdir); + + return { build: build }; +} + +module.exports = function(commander, dir) { + let data = {}; + + _.each(['cdn', 'node', 'browser'], function(target) { + const newDirectory = newBuildDirectory(dir, target), + directory = _.defaults(newDirectory, dir), + options = _.defaults({ target: target }, commander); + + data[target] = { + directory: directory, + commander: options + }; + }); + + return [].concat( + cdn(data.cdn.commander, data.cdn.directory), + node(data.node.commander, data.node.directory), + browser(data.browser.commander, data.browser.directory) + ); +}; diff --git a/highlight-js/tools/browser.js b/highlight-js/tools/browser.js new file mode 100644 index 0000000..9eb8c71 --- /dev/null +++ b/highlight-js/tools/browser.js @@ -0,0 +1,160 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let readFile = bluebird.promisify(require('fs').readFile); +let path = require('path'); + +let registry = require('./tasks'); +let utility = require('./utility'); + +let directory; + +function templateAllFunc(blobs) { + const name = path.join('demo', 'index.html'); + + blobs = _.compact(blobs); + + return bluebird.join( + readFile(name), + utility.getStyleNames(), + (template, styles) => ({ template, path, blobs, styles }) + ); +} + +function copyDocs() { + const input = path.join(directory.root, 'docs', '*.rst'), + output = path.join(directory.build, 'docs'); + + return { + startLog: { task: ['log', 'Copying documentation.'] }, + read: { requires: 'startLog', task: ['glob', utility.glob(input)] }, + writeLog: { requires: 'read', task: ['log', 'Writing documentation.'] }, + write: { requires: 'writeLog', task: ['dest', output] } + }; +} + +function generateDemo(filterCB, readArgs) { + let styleDir = path.join('src', 'styles'), + staticArgs = utility.glob(path.join('demo', '*.min.{js,css}')), + imageArgs = utility.glob(path.join(styleDir, '*.{png,jpg}'), + 'binary'), + stylesArgs = utility.glob(path.join(styleDir, '*.css')), + demoRoot = path.join(directory.build, 'demo'), + templateArgs = { callback: templateAllFunc }, + destArgs = { + dir: path.join(demoRoot, 'styles'), + encoding: 'binary' + }; + + return { + logStart: { task: ['log', 'Generating demo.'] }, + readLanguages: { requires: 'logStart', task: ['glob', readArgs] }, + filterSnippets: { requires: 'readLanguages', task: ['filter', filterCB] }, + readSnippet: { requires: 'filterSnippets', task: 'readSnippet' }, + template: { + requires: 'readSnippet', + task: ['templateAll', templateArgs] + }, + write: { + requires: 'template', + task: ['write', path.join(demoRoot, 'index.html')] + }, + readStatic: { requires: 'logStart', task: ['glob', staticArgs] }, + writeStatic: { requires: 'readStatic', task: ['dest', demoRoot] }, + readStyles: { requires: 'logStart', task: ['glob', stylesArgs] }, + compressStyles: { requires: 'readStyles', task: 'cssminify' }, + writeStyles: { requires: 'compressStyles', task: ['dest', destArgs] }, + readImages: { requires: 'logStart', task: ['glob', imageArgs] }, + writeImages: { requires:'readImages', task: ['dest', destArgs] }, + readDemoJS: { + requires: 'logStart', + task: ['read', path.join('demo', 'demo.js')] + }, + minifyDemoJS: { requires: 'readDemoJS', task: 'jsminify' }, + writeDemoJS: { requires: 'minifyDemoJS', task: ['dest', demoRoot] }, + readDemoCSS: { + requires: 'logStart', + task: ['read', path.join('demo', 'style.css')] + }, + minifyDemoCSS: { requires: 'readDemoCSS', task: 'cssminify' }, + writeDemoCSS: { requires: 'minifyDemoCSS', task: ['dest', demoRoot] } + }; +} + +module.exports = function(commander, dir) { + directory = dir; + + let hljsExt, output, requiresTask, tasks, + replace = utility.replace, + regex = utility.regex, + replaceClassNames = utility.replaceClassNames, + + coreFile = path.join('src', 'highlight.js'), + languages = utility.glob(path.join('src', 'languages', '*.js')), + filterCB = utility.buildFilterCallback(commander.args), + replaceArgs = replace(regex.header, ''), + templateArgs = + 'hljs.registerLanguage(\'<%= name %>\', <%= content %>);\n'; + + tasks = { + startLog: { task: ['log', 'Building highlight.js pack file.'] }, + readCore: { requires: 'startLog', task: ['read', coreFile] }, + read: { requires: 'startLog', task: ['glob', languages] }, + filter: { requires: 'read', task: ['filter', filterCB] }, + reorder: { requires: 'filter', task: 'reorderDeps' }, + replace: { requires: 'reorder', task: ['replace', replaceArgs] }, + template: { requires: 'replace', task: ['template', templateArgs] }, + packageFiles: { + requires: ['readCore', 'template'], + task: 'packageFiles' + } + }; + requiresTask = 'packageFiles'; + + if(commander.compress || commander.target === 'cdn') { + tasks.compresslog = { + requires: requiresTask, + task: ['log', 'Compressing highlight.js pack file.'] + }; + + tasks.replace2 = { + requires: 'compresslog', + task: [ 'replaceSkippingStrings' + , replace(regex.replaces, replaceClassNames) + ] + }; + + tasks.replace3 = { + requires: 'replace2', + task: ['replace', replace(regex.classname, '$1.className')] + }; + + tasks.minify = { requires: 'replace3', task: 'jsminify' }; + requiresTask = 'minify'; + } + + tasks.insertLicenseTag = { + requires: requiresTask, + task: 'insertLicenseTag' + }; + + tasks.writelog = { + requires: 'insertLicenseTag', + task: ['log', 'Writing highlight.js pack file.'] + }; + + hljsExt = commander.target === 'cdn' ? 'min' : 'pack'; + output = path.join(directory.build, `highlight.${hljsExt}.js`); + + tasks.write = { + requires: 'writelog', + task: ['write', output] + }; + + tasks = (commander.target === 'browser') + ? [copyDocs(), generateDemo(filterCB, languages), tasks] + : [tasks]; + + return utility.toQueue(tasks, registry); +}; diff --git a/highlight-js/tools/build.js b/highlight-js/tools/build.js new file mode 100644 index 0000000..d399551 --- /dev/null +++ b/highlight-js/tools/build.js @@ -0,0 +1,89 @@ +// For the basic introductions on using this build script, see: +// +// +// +// Otherwise, lets explain what each build target does in more detail, for +// those that wish to know before running this script. +// +// Build Targets +// ------------- +// +// * browser +// +// The default target. This will package up the core `highlight.js` along +// with all the language definitions into the file `highlight.pack.js` -- +// which will be compressed without including the option to disable it. It +// also builds the documentation for our readthedocs page, mentioned +// above, along with a local instance of the demo at: +// +// . +// +// * cdn +// +// This will package up the core `highlight.js` along with all the +// language definitions into the file `highlight.min.js` and compresses +// all languages and styles into separate files. Since the target is for +// CDNs -- like cdnjs and jsdelivr -- it doesn't matter if you put the +// option to disable compression, this target is always be compressed. Do +// keep in mind that we don't keep the build results in the main +// repository; however, there is a separate repository for those that want +// the CDN builds without using a third party site or building it +// themselves. For those curious, head over to: +// +// +// +// * node +// +// This build will transform the library into a CommonJS module. It +// includes the generation of an `index.js` file that will be the main +// file imported for use with Node.js or browserify. Do note that this +// includes all languages by default and it might be too heavy to use for +// browserify. Luckily, you can easily do two things to make the build +// smaller; either specify the specific language/category you need or you +// can use the browser or cdn builds and it will work like any CommonJS +// file. Also with the CommonJS module, it includes the documentation for +// our readthedocs page and the uncompressed styles. Getting this build is +// pretty easy as it is the one that gets published to npm with the +// standard `npm install highlight.js`, but you can also visit the package +// page at: +// +// +// +// * all +// +// Builds every target and places the results into a sub-directory based +// off of the target name relative to the `build` directory; for example, +// "node" with go into `build/node`, "cdn" will go into `build/cdn`, +// "browser" will go into `build/browser` and so forth. +// +// All build targets will end up in the `build` directory. + +'use strict'; + +let commander = require('commander'); +let path = require('path'); +let Queue = require('gear').Queue; +let registry = require('./tasks'); + +let build, dir = {}; + +commander + .usage('[options] [...]') + .option('-n, --no-compress', 'Disable compression') + .option('-t, --target ', 'Build for target ' + + '[all, browser, cdn, node]', + /^(browser|cdn|node|all)$/i, 'browser') + .parse(process.argv); + +commander.target = commander.target.toLowerCase(); + +build = require(`./${commander.target}`); +dir.root = path.dirname(__dirname); +dir.build = path.join(dir.root, 'build'); + +new Queue({ registry: registry }) + .clean(dir.build) + .log('Starting build.') + .series(build(commander, dir)) + .log('Finished build.') + .run(); diff --git a/highlight-js/tools/cdn.js b/highlight-js/tools/cdn.js new file mode 100644 index 0000000..3d93c9c --- /dev/null +++ b/highlight-js/tools/cdn.js @@ -0,0 +1,88 @@ +'use strict'; + +let path = require('path'); + +let browserBuild = require('./browser'); +let registry = require('./tasks'); +let utility = require('./utility'); + +let directory; + +function moveLanguages() { + let input = path.join(directory.root, 'src', 'languages', '*.js'), + output = path.join(directory.build, 'languages'), + regex = utility.regex, + replace = utility.replace, + + replaceArgs = replace(regex.header, ''), + template = 'hljs.registerLanguage(\'<%= name %>\','+ + ' <%= content %>);\n'; + + return { + startLog: { task: ['log', 'Building language files.'] }, + read: { + requires: 'startLog', + task: ['glob', utility.glob(input)] + }, + replace: { requires: 'read', task: ['replace', replaceArgs] }, + template: { requires: 'replace', task: ['template', template] }, + replace2: { + requires: 'template', + task: [ 'replaceSkippingStrings' + , replace(regex.replaces, utility.replaceClassNames) + ] + }, + replace3: { + requires: 'replace2', + task: ['replace', replace(regex.classname, '$1.className')] + }, + compressLog: { + requires: 'replace3', + task: ['log', 'Compressing languages files.'] + }, + minify: { requires: 'compressLog', task: 'jsminify' }, + rename: { requires: 'minify', task: ['rename', { extname: '.min.js' }] }, + writeLog: { + requires: 'rename', + task: ['log', 'Writing language files.'] + }, + write: { requires: 'writeLog', task: ['dest', output] } + }; +} + +function moveStyles() { + const css = path.join(directory.root, 'src', 'styles', '*.css'), + images = path.join(directory.root, 'src', 'styles', '*.{jpg,png}'), + output = path.join(directory.build, 'styles'), + options = { dir: output, encoding: 'binary' }; + + return { + startLog: { task: ['log', 'Building style files.'] }, + readCSS: { requires: 'startLog', task: ['glob', utility.glob(css)] }, + readImages: { + requires: 'startLog', + task: ['glob', utility.glob(images, 'binary')] + }, + compressLog: { + requires: 'readCSS', + task: ['log', 'Compressing style files.'] + }, + minify: { requires: 'compressLog', task: 'cssminify' }, + rename: { + requires: 'minify', + task: ['rename', { extname: '.min.css' }] + }, + writeLog: { + requires: ['rename', 'readImages'], + task: ['log', 'Writing style files.'] + }, + write: { requires: 'writeLog', task: ['dest', options] } + }; +} + +module.exports = function(commander, dir) { + directory = dir; + + return utility.toQueue([moveLanguages(), moveStyles()], registry) + .concat(browserBuild(commander, dir)); +}; diff --git a/highlight-js/tools/codeformat.js b/highlight-js/tools/codeformat.js new file mode 100644 index 0000000..e6c5727 --- /dev/null +++ b/highlight-js/tools/codeformat.js @@ -0,0 +1,47 @@ +'use strict'; + +var _ = require('lodash'); +var bluebird = require('bluebird'); +var path = require('path'); +var glob = bluebird.promisify(require('glob')); +var fs = require('fs'); +var readFile = bluebird.promisify(fs.readFile); +var writeFile = bluebird.promisify(fs.writeFile); +var beautify = require('js-beautify').js_beautify; + +var beautify_options = { + "indent_size": 2, + "indent_char": " ", + "eol": "\n", + "indent_level": 0, + "indent_with_tabs": false, + "preserve_newlines": true, + "max_preserve_newlines": 10, + "jslint_happy": false, + "space_after_anon_function": false, + "brace_style": "collapse", + "keep_array_indentation": false, + "keep_function_indentation": false, + "space_before_conditional": true, + "break_chained_methods": false, + "eval_code": false, + "end_with_newline": true +}; + +console.log("Starting formatting."); + +var sources = path.join('src', 'languages', '*.js'); + +bluebird.map(glob(sources), function (name) { + var basename = path.basename(name, '.js'); + + return readFile(name).then(function (blob) { + return beautify(blob.toString(), beautify_options); + }).then(function (blob) { + return writeFile(name, blob).then(function () { + console.log(" ✓ " + basename); + }); + }); +}).then(function () { + console.log("Finished formatting."); +}); diff --git a/highlight-js/tools/developer.html b/highlight-js/tools/developer.html new file mode 100644 index 0000000..91d8753 --- /dev/null +++ b/highlight-js/tools/developer.html @@ -0,0 +1,107 @@ + + + + + highlight.js developer + + + + + + +

    highlight.js developer

    + +
    +
    + +

    + + Language: +

    +
    +
    +

    Rendered in ... ms [...]

    +
    ...
    +
    +
    +

    Markup +

    ...
    +
    +
    + + + + + + + diff --git a/highlight-js/tools/keywordsformat.js b/highlight-js/tools/keywordsformat.js new file mode 100644 index 0000000..85d5b22 --- /dev/null +++ b/highlight-js/tools/keywordsformat.js @@ -0,0 +1,18 @@ +/** Example */ + +var all = 'keywords here'; + +var output = '', line = ''; +all.forEach(function (item) { + if (12 + 1 + line.length + 1 + item.length + 4 > 120) { + output += "\n" + " '" + line + " ' +"; + line = ''; + return; + } + if (line) { + line = line + ' ' + item; + } else { + line = item; + } +}); +console.log(output); diff --git a/highlight-js/tools/node.js b/highlight-js/tools/node.js new file mode 100644 index 0000000..c29ff2b --- /dev/null +++ b/highlight-js/tools/node.js @@ -0,0 +1,141 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let path = require('path'); + +let packageJSON = require('../package'); +let registry = require('./tasks'); +let utility = require('./utility'); + +let directory, filterCB, + languages = utility.glob(path.join('src', 'languages', '*.js')), + header = utility.regex.header; + +function templateAllFunc(blobs) { + const names = _.map(blobs, blob => path.basename(blob.name, '.js')); + + return bluebird.resolve({ names: names }); +} + +function buildLanguages() { + let input = languages, + output = path.join(directory.build, 'lib', 'languages'), + + replaceArgs = utility.replace(header, ''), + template = 'module.exports = <%= content %>;'; + + return { + logStart: { task: ['log', 'Building language files.'] }, + read: { requires: 'logStart', task: ['glob', input] }, + filter: { requires: 'read', task: ['filter', filterCB] }, + replace: { requires: 'filter', task: ['replace', replaceArgs] }, + template: { requires: 'replace', task: ['template', template] }, + writeLog: { + requires: 'template', + task: ['log', 'Writing language files.'] + }, + write: { requires: 'writeLog', task: ['dest', output] } + }; +} + +function buildCore() { + const input = path.join(directory.root, 'src', 'highlight.js'), + output = path.join(directory.build, 'lib'); + + return { + startLog: { task: ['log', 'Building core file.'] }, + read: { requires: 'startLog', task: ['read', input] }, + writeLog: { requires: 'read', task: ['log', 'Writing core file.'] }, + write: { requires: 'writeLog', task: ['dest', output] } + }; +} + +function buildIndex() { + let input = languages, + output = path.join(directory.build, 'lib', 'index.js'), + + templateArgs = { + template: [ 'var hljs = require(\'./highlight\');\n' + , '<% _.each(names, function(name) { %>' + + 'hljs.registerLanguage(\'<%= name %>\', ' + + 'require(\'./languages/<%= name %>\'));' + , '<% }); %>' + , 'module.exports = hljs;' + ].join('\n'), + callback: templateAllFunc + }; + + return { + startLog: { task: ['log', 'Building index file.'] }, + read: { requires: 'startLog', task: ['glob', input] }, + filter: { requires: 'read', task: ['filter', filterCB] }, + reorder: { requires: 'filter', task: 'reorderDeps' }, + template: { requires: 'reorder', task: ['templateAll', templateArgs] }, + writeLog: { requires: 'template', task: ['log', 'Writing index file.'] }, + write: { requires: 'writeLog', task: ['write', output] } + }; +} + +function copyMetaFiles() { + let docs = path.join('docs', '*.rst'), + glob = `{README.md,LICENSE,${docs}}`, + + input = utility.glob(path.join(directory.root, glob)), + output = { dir: directory.build, base: '.' }; + + return { + startLog: { task: ['log', 'Copying meta files.'] }, + read: { requires: 'startLog', task: ['glob', input] }, + writeLog: { requires: 'read', task: ['log', 'Writing meta files.'] }, + write: { requires: 'writeLog', task: ['dest', output] } + }; +} + +function buildStyles() { + let input = path.join(directory.root, 'src', 'styles', '*'), + output = path.join(directory.build, 'styles'), + options = { encoding: 'binary', dir: output }; + + return { + startLog: { task: ['log', 'Building style files.'] }, + read: { + requires: 'startLog', + task: ['glob', utility.glob(input, 'binary')] + }, + writeLog: { requires: 'read', task: ['log', 'Writing style files.'] }, + write: { requires: 'writeLog', task: ['dest', options] } + }; +} + +function buildPackageFile() { + const input = path.join(directory.root, 'AUTHORS.en.txt'), + output = path.join(directory.build, 'package.json'); + + return { + startLog: { task: ['log', 'Building package.json file.'] }, + read: { requires: 'startLog', task: ['read', input] }, + build: { requires: 'read', task: ['buildPackage', packageJSON] }, + writeLog: { + requires: 'build', + task: ['log', 'Writing package.json file.'] + }, + write: { requires: 'writeLog', task: ['write', output] } + }; +} + +module.exports = function(commander, dir) { + directory = dir; + filterCB = utility.buildFilterCallback(commander.args); + + let tasks = [ + buildLanguages(), + buildCore(), + buildIndex(), + buildStyles(), + copyMetaFiles(), + buildPackageFile() + ]; + + return utility.toQueue(tasks, registry); +}; diff --git a/highlight-js/tools/tasks.js b/highlight-js/tools/tasks.js new file mode 100644 index 0000000..de1a6ac --- /dev/null +++ b/highlight-js/tools/tasks.js @@ -0,0 +1,248 @@ +'use strict'; + +let _ = require('lodash'); +let del = require('del'); +let gear = require('gear'); +let path = require('path'); +let utility = require('./utility'); + +let parseHeader = utility.parseHeader; +let tasks = require('gear-lib'); + +tasks.clean = function(directories, blobs, done) { + directories = _.isString(directories) ? [directories] : directories; + + return del(directories).then(() => done(null, blobs)); +}; +tasks.clean.type = 'collect'; + +// Depending on the languages required for the current language being +// processed, this task reorders it's dependencies first then include the +// language. +tasks.reorderDeps = function(options, blobs, done) { + let buffer = {}, + newBlobOrder = []; + + _.each(blobs, function(blob) { + let basename = path.basename(blob.name), + fileInfo = parseHeader(blob.result), + extra = { blob: blob, processed: false }; + + buffer[basename] = _.merge(extra, fileInfo || {}); + }); + + function pushInBlob(object) { + if(!object.processed) { + object.processed = true; + newBlobOrder.push(object.blob); + } + } + + _.each(buffer, function(buf) { + let object; + + if(buf.Requires) { + _.each(buf.Requires, function(language) { + object = buffer[language]; + pushInBlob(object); + }); + } + + pushInBlob(buf); + }); + + done(null, newBlobOrder); +}; +tasks.reorderDeps.type = 'collect'; + +tasks.template = function(template, blob, done) { + template = template || ''; + + let filename = path.basename(blob.name), + basename = path.basename(filename, '.js'), + content = _.template(template)({ + name: basename, + filename: filename, + content: blob.result.trim() + }); + + return done(null, new gear.Blob(content, blob)); +}; + +tasks.templateAll = function(options, blobs, done) { + return options.callback(blobs) + .then(function(data) { + let template = options.template || data.template, + content = _.template(template)(data); + + return done(null, [new gear.Blob(content)]); + }) + .catch(done); +}; +tasks.templateAll.type = 'collect'; + +tasks.rename = function(options, blob, done) { + options = options || {}; + + let name = blob.name, + ext = new RegExp(path.extname(name) + '$'); + + name = name.replace(ext, options.extname); + + return done(null, new gear.Blob(blob.result, { name: name })); +}; + +// Adds the contributors from `AUTHORS.en.txt` onto the `package.json` file +// and moves the result into the `build` directory. +tasks.buildPackage = function(json, blob, done) { + let result, + lines = blob.result.split(/\r?\n/), + regex = /^- (.*) <(.*)>$/; + + json.contributors = _.transform(lines, function(result, line) { + let matches = line.match(regex); + + if(matches) { + result.push({ + name: matches[1], + email: matches[2] + }); + } + }, []); + + result = JSON.stringify(json, null, ' '); + + return done(null, new gear.Blob(result, blob)); +}; + +// Mainly for replacing the keys of `utility.REPLACES` for it's values while +// skipping over strings, regular expressions, or comments. However, this is +// pretty generic so long as you use the `utility.replace` function, you can +// replace a regular expression with a string. +tasks.replaceSkippingStrings = function(params, blob, done) { + let content = blob.result, + length = content.length, + offset = 0, + + replace = params.replace || '', + regex = params.regex, + starts = /\/\/|['"\/]/, + + result = [], + chunk, end, match, start, terminator; + + while(offset < length) { + chunk = content.slice(offset); + match = chunk.match(starts); + end = match ? match.index : length; + + chunk = content.slice(offset, end + offset); + result.push(chunk.replace(regex, replace)); + + offset += end; + + if(match) { + // We found a starter sequence: either a `//` or a "quote" + // In the case of `//` our terminator is the end of line. + // Otherwise it's either a matching quote or an escape symbol. + terminator = match[0] !== '//' ? new RegExp(`[${match[0]}\\\\]`) + : /$/m; + start = offset; + offset += 1; + + while(true) { + chunk = content.slice(offset); + match = chunk.match(terminator); + + if(!match) { + return done('Unmatched quote'); + } + + if(match[0] === '\\') { + offset += match.index + 2; + } else { + offset += match.index + 1; + result.push(content.slice(start, offset)); + break; + } + } + } + } + + return done(null, new gear.Blob(result.join(''), blob)); +}; + +tasks.filter = function(callback, blobs, done) { + let filteredBlobs = _.filter(blobs, callback); + + // Re-add in blobs required from header definition + _.each(filteredBlobs, function(blob) { + let dirname = path.dirname(blob.name), + content = blob.result, + fileInfo = parseHeader(content); + + if(fileInfo && fileInfo.Requires) { + _.each(fileInfo.Requires, function(language) { + let filename = `${dirname}/${language}`, + fileFound = _.find(filteredBlobs, { name: filename }); + + if(!fileFound) { + filteredBlobs.push( + _.find(blobs, { name: filename })); + } + }); + } + }); + + return done(null, filteredBlobs); +}; +tasks.filter.type = 'collect'; + +tasks.readSnippet = function(options, blob, done) { + let name = path.basename(blob.name, '.js'), + fileInfo = parseHeader(blob.result), + snippetName = path.join('test', 'detect', name, 'default.txt'); + + function onRead(error, blob) { + if(error) return done(error); // ignore missing snippets + + let meta = { name: `${name}.js`, fileInfo: fileInfo }; + + return done(null, new gear.Blob(blob.result, meta)); + } + + gear.Blob.readFile(snippetName, 'utf8', onRead, false); +}; + +tasks.insertLicenseTag = function(options, blob, done) { + let hljsVersion = require('../package').version, + licenseTag = `/*! highlight.js v${hljsVersion} | ` + + `BSD3 License | git.io/hljslicense */\n`; + + return done(null, new gear.Blob(licenseTag + blob.result, blob)); +}; + +// Packages up included languages into the core `highlight.js` and moves the +// result into the `build` directory. +tasks.packageFiles = function(options, blobs, done) { + let content, + coreFile = _.head(blobs), + languages = _.tail(blobs), + + lines = coreFile.result + .replace(utility.regex.header, '') + .split('\n\n'), + lastLine = _.last(lines), + langStr = _.reduce(languages, (str, language) => + `${str + language.result}\n`, ''); + + lines[lines.length - 1] = langStr.trim(); + + lines = lines.concat(lastLine); + content = lines.join('\n\n'); + + return done(null, [new gear.Blob(content)]); +}; +tasks.packageFiles.type = 'collect'; + +module.exports = new gear.Registry({ tasks: tasks }); diff --git a/highlight-js/tools/utility.js b/highlight-js/tools/utility.js new file mode 100644 index 0000000..81f5059 --- /dev/null +++ b/highlight-js/tools/utility.js @@ -0,0 +1,169 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let glob = bluebird.promisify(require('glob')); +let path = require('path'); + +let Queue = require('gear').Queue; + +let regex = {}, + headerRegex = /^\s*\/\*((.|\r?\n)*?)\*/; + +const REPLACES = { + 'case_insensitive': 'cI', + 'lexemes': 'l', + 'contains': 'c', + 'keywords': 'k', + 'subLanguage': 'sL', + 'className': 'cN', + 'begin': 'b', + 'beginKeywords': 'bK', + 'end': 'e', + 'endsWithParent': 'eW', + 'illegal': 'i', + 'excludeBegin': 'eB', + 'excludeEnd': 'eE', + 'returnBegin': 'rB', + 'returnEnd': 'rE', + 'relevance': 'r', + 'variants': 'v', + + 'IDENT_RE': 'IR', + 'UNDERSCORE_IDENT_RE': 'UIR', + 'NUMBER_RE': 'NR', + 'C_NUMBER_RE': 'CNR', + 'BINARY_NUMBER_RE': 'BNR', + 'RE_STARTERS_RE': 'RSR', + 'BACKSLASH_ESCAPE': 'BE', + 'APOS_STRING_MODE': 'ASM', + 'QUOTE_STRING_MODE': 'QSM', + 'PHRASAL_WORDS_MODE': 'PWM', + 'C_LINE_COMMENT_MODE': 'CLCM', + 'C_BLOCK_COMMENT_MODE': 'CBCM', + 'HASH_COMMENT_MODE': 'HCM', + 'NUMBER_MODE': 'NM', + 'C_NUMBER_MODE': 'CNM', + 'BINARY_NUMBER_MODE': 'BNM', + 'CSS_NUMBER_MODE': 'CSSNM', + 'REGEXP_MODE': 'RM', + 'TITLE_MODE': 'TM', + 'UNDERSCORE_TITLE_MODE': 'UTM', + 'COMMENT': 'C', + + 'beginRe': 'bR', + 'endRe': 'eR', + 'illegalRe': 'iR', + 'lexemesRe': 'lR', + 'terminators': 't', + 'terminator_end': 'tE' +}; + +regex.replaces = new RegExp( + `\\b(${Object.keys(REPLACES).join('|')})\\b`, 'g'); + +regex.classname = /(block|parentNode)\.cN/g; + +regex.header = /^\s*(\/\*((.|\r?\n)*?)\*\/)?\s*/; + +function replace(from, to) { + return { regex: from, replace: to }; +} + +function replaceClassNames(match) { + return REPLACES[match]; +} + +// All meta data, for each language definition, it store within the headers +// of each file in `src/languages`. `parseHeader` extracts that data and +// turns it into a useful object -- mainly for categories and what language +// this definition requires. +function parseHeader(content) { + let headers, + match = content.match(headerRegex); + + if (!match) { + return null; + } + + headers = _.compact(match[1].split('\n')); + + return _.reduce(headers, function(result, header) { + let keyVal = header.trim().split(': '), + key = keyVal[0], + value = keyVal[1] || ''; + + if(key !== 'Description' && key !== 'Language') { + value = value.split(/\s*,\s*/); + } + + result[key] = value; + + return result; + }, {}); +} + +function filterByQualifiers(blob, languages, categories) { + if(_.isEmpty(languages) && _.isEmpty(categories)) return true; + + let language = path.basename(blob.name, '.js'), + fileInfo = parseHeader(blob.result), + containsCategory = _.partial(_.includes, categories); + + if(!fileInfo) return false; + + let fileCategories = fileInfo.Category || []; + + return _.includes(languages, language) || + _.some(fileCategories, containsCategory); +} + +// For the filter task in `tools/tasks.js`, this function will look for +// categories and languages specificed from the CLI. +function buildFilterCallback(qualifiers) { + const result = _.partition(qualifiers, { 0: ':' }), + languages = result[1], + categories = _.map(result[0], category => category.slice(1)); + + return blob => filterByQualifiers(blob, languages, categories); +} + +function globDefaults(pattern, encoding) { + encoding = encoding || 'utf8'; + + // The limit option is a fix for issue #636 when the build script would + // EMFILE error for those systems who had a limit of open files per + // process. + // + // + return { pattern: pattern, limit: 50, encoding: encoding }; +} + +function getStyleNames() { + let stylesDir = 'src/styles/', + options = { ignore: `${stylesDir}default.css` }; + + return glob(`${stylesDir}*.css`, options) + .map(function(style) { + let basename = path.basename(style, '.css'), + name = _.startCase(basename), + pathName = path.relative('src', style); + + return { path: pathName, name: name }; + }); +} + +function toQueue(tasks, registry) { + return _.map(tasks, task => new Queue({ registry }).tasks(task)); +} + +module.exports = { + buildFilterCallback: buildFilterCallback, + getStyleNames: getStyleNames, + glob: globDefaults, + parseHeader: parseHeader, + regex: regex, + replace: replace, + replaceClassNames: replaceClassNames, + toQueue: toQueue +}; diff --git a/index.html b/index.html new file mode 100644 index 0000000..2ac1f16 --- /dev/null +++ b/index.html @@ -0,0 +1,84 @@ + + + + + Presentations from CCCHB + + + + + + + + + + + + + +
    +
    + +
    + +

    Presentations

    + + +
    + +
    + + +
    + + + + + + + + + + diff --git a/reveal-js/.gitignore b/reveal-js/.gitignore new file mode 100644 index 0000000..7d13714 --- /dev/null +++ b/reveal-js/.gitignore @@ -0,0 +1,14 @@ +.idea/ +*.iml +*.iws +*.eml +out/ +.DS_Store +.svn +log/*.log +tmp/** +node_modules/ +package-lock.json +.sass-cache +css/reveal.min.css +js/reveal.min.js diff --git a/reveal-js/.travis.yml b/reveal-js/.travis.yml new file mode 100644 index 0000000..15d6627 --- /dev/null +++ b/reveal-js/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - 4 +after_script: + - npm run build -- retire diff --git a/reveal-js/CONTRIBUTING.md b/reveal-js/CONTRIBUTING.md new file mode 100644 index 0000000..c2091e8 --- /dev/null +++ b/reveal-js/CONTRIBUTING.md @@ -0,0 +1,23 @@ +## Contributing + +Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**. + + +### Personal Support +If you have personal support or setup questions the best place to ask those are [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js). + + +### Bug Reports +When reporting a bug make sure to include information about which browser and operating system you are on as well as the necessary steps to reproduce the issue. If possible please include a link to a sample presentation where the bug can be tested. + + +### Pull Requests +- Should follow the coding style of the file you work in, most importantly: + - Tabs to indent + - Single-quoted strings +- Should be made towards the **dev branch** +- Should be submitted from a feature/topic branch (not your master) + + +### Plugins +Please do not submit plugins as pull requests. They should be maintained in their own separate repository. More information here: https://github.com/hakimel/reveal.js/wiki/Plugin-Guidelines diff --git a/reveal-js/Gruntfile.js b/reveal-js/Gruntfile.js new file mode 100644 index 0000000..8d8300b --- /dev/null +++ b/reveal-js/Gruntfile.js @@ -0,0 +1,193 @@ +/* global module:false */ +module.exports = function(grunt) { + var port = grunt.option('port') || 8000; + var root = grunt.option('root') || '.'; + + if (!Array.isArray(root)) root = [root]; + + // Project configuration + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + meta: { + banner: + '/*!\n' + + ' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' + + ' * http://revealjs.com\n' + + ' * MIT licensed\n' + + ' *\n' + + ' * Copyright (C) 2018 Hakim El Hattab, http://hakim.se\n' + + ' */' + }, + + qunit: { + files: [ 'test/*.html' ] + }, + + uglify: { + options: { + banner: '<%= meta.banner %>\n', + ie8: true + }, + build: { + src: 'js/reveal.js', + dest: 'js/reveal.min.js' + } + }, + + sass: { + core: { + src: 'css/reveal.scss', + dest: 'css/reveal.css' + }, + themes: { + expand: true, + cwd: 'css/theme/source', + src: ['*.sass', '*.scss'], + dest: 'css/theme', + ext: '.css' + } + }, + + autoprefixer: { + core: { + src: 'css/reveal.css' + } + }, + + cssmin: { + options: { + compatibility: 'ie9' + }, + compress: { + src: 'css/reveal.css', + dest: 'css/reveal.min.css' + } + }, + + jshint: { + options: { + curly: false, + eqeqeq: true, + immed: true, + esnext: true, + latedef: 'nofunc', + newcap: true, + noarg: true, + sub: true, + undef: true, + eqnull: true, + browser: true, + expr: true, + loopfunc: true, + globals: { + head: false, + module: false, + console: false, + unescape: false, + define: false, + exports: false + } + }, + files: [ 'Gruntfile.js', 'js/reveal.js' ] + }, + + connect: { + server: { + options: { + port: port, + base: root, + livereload: true, + open: true, + useAvailablePort: true + } + } + }, + + zip: { + bundle: { + src: [ + 'index.html', + 'css/**', + 'js/**', + 'lib/**', + 'images/**', + 'plugin/**', + '**.md' + ], + dest: 'reveal-js-presentation.zip' + } + }, + + watch: { + js: { + files: [ 'Gruntfile.js', 'js/reveal.js' ], + tasks: 'js' + }, + theme: { + files: [ + 'css/theme/source/*.sass', + 'css/theme/source/*.scss', + 'css/theme/template/*.sass', + 'css/theme/template/*.scss' + ], + tasks: 'css-themes' + }, + css: { + files: [ 'css/reveal.scss' ], + tasks: 'css-core' + }, + html: { + files: root.map(path => path + '/*.html') + }, + markdown: { + files: root.map(path => path + '/*.md') + }, + options: { + livereload: true + } + }, + + retire: { + js: [ 'js/reveal.js', 'lib/js/*.js', 'plugin/**/*.js' ], + node: [ '.' ] + } + + }); + + // Dependencies + grunt.loadNpmTasks( 'grunt-contrib-connect' ); + grunt.loadNpmTasks( 'grunt-contrib-cssmin' ); + grunt.loadNpmTasks( 'grunt-contrib-jshint' ); + grunt.loadNpmTasks( 'grunt-contrib-qunit' ); + grunt.loadNpmTasks( 'grunt-contrib-uglify' ); + grunt.loadNpmTasks( 'grunt-contrib-watch' ); + grunt.loadNpmTasks( 'grunt-autoprefixer' ); + grunt.loadNpmTasks( 'grunt-retire' ); + grunt.loadNpmTasks( 'grunt-sass' ); + grunt.loadNpmTasks( 'grunt-zip' ); + + // Default task + grunt.registerTask( 'default', [ 'css', 'js' ] ); + + // JS task + grunt.registerTask( 'js', [ 'jshint', 'uglify', 'qunit' ] ); + + // Theme CSS + grunt.registerTask( 'css-themes', [ 'sass:themes' ] ); + + // Core framework CSS + grunt.registerTask( 'css-core', [ 'sass:core', 'autoprefixer', 'cssmin' ] ); + + // All CSS + grunt.registerTask( 'css', [ 'sass', 'autoprefixer', 'cssmin' ] ); + + // Package presentation to archive + grunt.registerTask( 'package', [ 'default', 'zip' ] ); + + // Serve presentation locally + grunt.registerTask( 'serve', [ 'connect', 'watch' ] ); + + // Run tests + grunt.registerTask( 'test', [ 'jshint', 'qunit' ] ); + +}; diff --git a/reveal-js/LICENSE b/reveal-js/LICENSE new file mode 100644 index 0000000..1b8b5a7 --- /dev/null +++ b/reveal-js/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2018 Hakim El Hattab, http://hakim.se, and reveal.js contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/reveal-js/README.md b/reveal-js/README.md new file mode 100644 index 0000000..940e746 --- /dev/null +++ b/reveal-js/README.md @@ -0,0 +1,1309 @@ +# reveal.js [![Build Status](https://travis-ci.org/hakimel/reveal.js.svg?branch=master)](https://travis-ci.org/hakimel/reveal.js) Slides + +A framework for easily creating beautiful presentations using HTML. [Check out the live demo](http://revealjs.com/). + +reveal.js comes with a broad range of features including [nested slides](https://github.com/hakimel/reveal.js#markup), [Markdown contents](https://github.com/hakimel/reveal.js#markdown), [PDF export](https://github.com/hakimel/reveal.js#pdf-export), [speaker notes](https://github.com/hakimel/reveal.js#speaker-notes) and a [JavaScript API](https://github.com/hakimel/reveal.js#api). There's also a fully featured visual editor and platform for sharing reveal.js presentations at [slides.com](https://slides.com?ref=github). + + +## Table of contents + +- [Online Editor](#online-editor) +- [Installation](#installation) + - [Basic setup](#basic-setup) + - [Full setup](#full-setup) + - [Folder Structure](#folder-structure) +- [Instructions](#instructions) + - [Markup](#markup) + - [Markdown](#markdown) + - [Element Attributes](#element-attributes) + - [Slide Attributes](#slide-attributes) +- [Configuration](#configuration) +- [Presentation Size](#presentation-size) +- [Dependencies](#dependencies) +- [Ready Event](#ready-event) +- [Auto-sliding](#auto-sliding) +- [Keyboard Bindings](#keyboard-bindings) +- [Touch Navigation](#touch-navigation) +- [Lazy Loading](#lazy-loading) +- [API](#api) + - [Slide Changed Event](#slide-changed-event) + - [Presentation State](#presentation-state) + - [Slide States](#slide-states) + - [Slide Backgrounds](#slide-backgrounds) + - [Parallax Background](#parallax-background) + - [Slide Transitions](#slide-transitions) + - [Internal links](#internal-links) + - [Fragments](#fragments) + - [Fragment events](#fragment-events) + - [Code syntax highlighting](#code-syntax-highlighting) + - [Slide number](#slide-number) + - [Overview mode](#overview-mode) + - [Fullscreen mode](#fullscreen-mode) + - [Embedded media](#embedded-media) + - [Stretching elements](#stretching-elements) + - [postMessage API](#postmessage-api) +- [PDF Export](#pdf-export) +- [Theming](#theming) +- [Speaker Notes](#speaker-notes) + - [Share and Print Speaker Notes](#share-and-print-speaker-notes) + - [Server Side Speaker Notes](#server-side-speaker-notes) +- [Multiplexing](#multiplexing) + - [Master presentation](#master-presentation) + - [Client presentation](#client-presentation) + - [Socket.io server](#socketio-server) +- [MathJax](#mathjax) +- [License](#license) + +#### More reading + +- [Changelog](https://github.com/hakimel/reveal.js/releases): Up-to-date version history. +- [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own! +- [Browser Support](https://github.com/hakimel/reveal.js/wiki/Browser-Support): Explanation of browser support and fallbacks. +- [Plugins](https://github.com/hakimel/reveal.js/wiki/Plugins,-Tools-and-Hardware): A list of plugins that can be used to extend reveal.js. + + +## Online Editor + +Presentations are written using HTML or Markdown but there's also an online editor for those of you who prefer a graphical interface. Give it a try at [https://slides.com](https://slides.com?ref=github). + + +## Installation + +The **basic setup** is for authoring presentations only. The **full setup** gives you access to all reveal.js features and plugins such as speaker notes as well as the development tasks needed to make changes to the source. + +### Basic setup + +The core of reveal.js is very easy to install. You'll simply need to download a copy of this repository and open the index.html file directly in your browser. + +1. Download the latest version of reveal.js from +2. Unzip and replace the example contents in index.html with your own +3. Open index.html in a browser to view it + +### Full setup + +Some reveal.js features, like external Markdown and speaker notes, require that presentations run from a local web server. The following instructions will set up such a server as well as all of the development tasks needed to make edits to the reveal.js source code. + +1. Install [Node.js](http://nodejs.org/) (4.0.0 or later) + +1. Clone the reveal.js repository + ```sh + $ git clone https://github.com/hakimel/reveal.js.git + ``` + +1. Navigate to the reveal.js folder + ```sh + $ cd reveal.js + ``` + +1. Install dependencies + ```sh + $ npm install + ``` + +1. Serve the presentation and monitor source files for changes + ```sh + $ npm start + ``` + +1. Open to view your presentation + + You can change the port by using `npm start -- --port=8001`. + +### Folder Structure + +- **css/** Core styles without which the project does not function +- **js/** Like above but for JavaScript +- **plugin/** Components that have been developed as extensions to reveal.js +- **lib/** All other third party assets (JavaScript, CSS, fonts) + + +## Instructions + +### Markup + +Here's a barebones example of a fully working reveal.js presentation: +```html + + + + + + +
    +
    +
    Slide 1
    +
    Slide 2
    +
    +
    + + + + +``` + +The presentation markup hierarchy needs to be `.reveal > .slides > section` where the `section` represents one slide and can be repeated indefinitely. If you place multiple `section` elements inside of another `section` they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and will be included in the horizontal sequence. For example: + +```html +
    +
    +
    Single Horizontal Slide
    +
    +
    Vertical Slide 1
    +
    Vertical Slide 2
    +
    +
    +
    +``` + +### Markdown + +It's possible to write your slides using Markdown. To enable Markdown, add the `data-markdown` attribute to your `
    ` elements and wrap the contents in a ` +
    +``` + +#### External Markdown + +You can write your content as a separate file and have reveal.js load it at runtime. Note the separator arguments which determine how slides are delimited in the external file: the `data-separator` attribute defines a regular expression for horizontal slides (defaults to `^\r?\n---\r?\n$`, a newline-bounded horizontal rule) and `data-separator-vertical` defines vertical slides (disabled by default). The `data-separator-notes` attribute is a regular expression for specifying the beginning of the current slide's speaker notes (defaults to `notes?:`, so it will match both "note:" and "notes:"). The `data-charset` attribute is optional and specifies which charset to use when loading the external file. + +When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup). The following example customises all available options: + +```html +
    + +
    +``` + +#### Element Attributes + +Special syntax (through HTML comments) is available for adding attributes to Markdown elements. This is useful for fragments, amongst other things. + +```html +
    + +
    +``` + +#### Slide Attributes + +Special syntax (through HTML comments) is available for adding attributes to the slide `
    ` elements generated by your Markdown. + +```html +
    + +
    +``` + +#### Configuring *marked* + +We use [marked](https://github.com/chjj/marked) to parse Markdown. To customise marked's rendering, you can pass in options when [configuring Reveal](#configuration): + +```javascript +Reveal.initialize({ + // Options which are passed into marked + // See https://github.com/chjj/marked#options-1 + markdown: { + smartypants: true + } +}); +``` + +### Configuration + +At the end of your page you need to initialize reveal by running the following code. Note that all configuration values are optional and will default to the values specified below. + +```javascript +Reveal.initialize({ + + // Display presentation control arrows + controls: true, + + // Help the user learn the controls by providing hints, for example by + // bouncing the down arrow when they first encounter a vertical slide + controlsTutorial: true, + + // Determines where controls appear, "edges" or "bottom-right" + controlsLayout: 'bottom-right', + + // Visibility rule for backwards navigation arrows; "faded", "hidden" + // or "visible" + controlsBackArrows: 'faded', + + // Display a presentation progress bar + progress: true, + + // Display the page number of the current slide + slideNumber: false, + + // Push each slide change to the browser history + history: false, + + // Enable keyboard shortcuts for navigation + keyboard: true, + + // Enable the slide overview mode + overview: true, + + // Vertical centering of slides + center: true, + + // Enables touch navigation on devices with touch input + touch: true, + + // Loop the presentation + loop: false, + + // Change the presentation direction to be RTL + rtl: false, + + // Randomizes the order of slides each time the presentation loads + shuffle: false, + + // Turns fragments on and off globally + fragments: true, + + // Flags whether to include the current fragment in the URL, + // so that reloading brings you to the same fragment position + fragmentInURL: false, + + // Flags if the presentation is running in an embedded mode, + // i.e. contained within a limited portion of the screen + embedded: false, + + // Flags if we should show a help overlay when the questionmark + // key is pressed + help: true, + + // Flags if speaker notes should be visible to all viewers + showNotes: false, + + // Global override for autoplaying embedded media (video/audio/iframe) + // - null: Media will only autoplay if data-autoplay is present + // - true: All media will autoplay, regardless of individual setting + // - false: No media will autoplay, regardless of individual setting + autoPlayMedia: null, + + // Number of milliseconds between automatically proceeding to the + // next slide, disabled when set to 0, this value can be overwritten + // by using a data-autoslide attribute on your slides + autoSlide: 0, + + // Stop auto-sliding after user input + autoSlideStoppable: true, + + // Use this method for navigation when auto-sliding + autoSlideMethod: Reveal.navigateNext, + + // Specify the average time in seconds that you think you will spend + // presenting each slide. This is used to show a pacing timer in the + // speaker view + defaultTiming: 120, + + // Enable slide navigation via mouse wheel + mouseWheel: false, + + // Hides the address bar on mobile devices + hideAddressBar: true, + + // Opens links in an iframe preview overlay + // Add `data-preview-link` and `data-preview-link="false"` to customise each link + // individually + previewLinks: false, + + // Transition style + transition: 'slide', // none/fade/slide/convex/concave/zoom + + // Transition speed + transitionSpeed: 'default', // default/fast/slow + + // Transition style for full page slide backgrounds + backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom + + // Number of slides away from the current that are visible + viewDistance: 3, + + // Parallax background image + parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" + + // Number of pixels to move the parallax background per slide + // - Calculated automatically unless specified + // - Set to 0 to disable movement along an axis + parallaxBackgroundHorizontal: null, + parallaxBackgroundVertical: null, + + // The display mode that will be used to show slides + display: 'block' + +}); +``` + +The configuration can be updated after initialization using the `configure` method: + +```javascript +// Turn autoSlide off +Reveal.configure({ autoSlide: 0 }); + +// Start auto-sliding every 5s +Reveal.configure({ autoSlide: 5000 }); +``` + +### Presentation Size + +All presentations have a normal size, that is, the resolution at which they are authored. The framework will automatically scale presentations uniformly based on this size to ensure that everything fits on any given display or viewport. + +See below for a list of configuration options related to sizing, including default values: + +```javascript +Reveal.initialize({ + + // ... + + // The "normal" size of the presentation, aspect ratio will be preserved + // when the presentation is scaled to fit different resolutions. Can be + // specified using percentage units. + width: 960, + height: 700, + + // Factor of the display size that should remain empty around the content + margin: 0.1, + + // Bounds for smallest/largest possible scale to apply to content + minScale: 0.2, + maxScale: 1.5 + +}); +``` + +If you wish to disable this behavior and do your own scaling (e.g. using media queries), try these settings: + +```javascript +Reveal.initialize({ + + // ... + + width: "100%", + height: "100%", + margin: 0, + minScale: 1, + maxScale: 1 +}); +``` + +### Dependencies + +Reveal.js doesn't _rely_ on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example: + +```javascript +Reveal.initialize({ + dependencies: [ + // Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/ + { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } }, + + // Interpret Markdown in
    elements + { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + + // Syntax highlight for elements + { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, + + // Zoom in and out with Alt+click + { src: 'plugin/zoom-js/zoom.js', async: true }, + + // Speaker notes + { src: 'plugin/notes/notes.js', async: true }, + + // MathJax + { src: 'plugin/math/math.js', async: true } + ] +}); +``` + +You can add your own extensions using the same syntax. The following properties are available for each dependency object: +- **src**: Path to the script to load +- **async**: [optional] Flags if the script should load after reveal.js has started, defaults to false +- **callback**: [optional] Function to execute when the script has loaded +- **condition**: [optional] Function which must return true for the script to be loaded + +To load these dependencies, reveal.js requires [head.js](http://headjs.com/) *(a script loading library)* to be loaded before reveal.js. + +### Ready Event + +A `ready` event is fired when reveal.js has loaded all non-async dependencies and is ready to start navigating. To check if reveal.js is already 'ready' you can call `Reveal.isReady()`. + +```javascript +Reveal.addEventListener( 'ready', function( event ) { + // event.currentSlide, event.indexh, event.indexv +} ); +``` + +Note that we also add a `.ready` class to the `.reveal` element so that you can hook into this with CSS. + +### Auto-sliding + +Presentations can be configured to progress through slides automatically, without any user input. To enable this you will need to tell the framework how many milliseconds it should wait between slides: + +```javascript +// Slide every five seconds +Reveal.configure({ + autoSlide: 5000 +}); +``` + +When this is turned on a control element will appear that enables users to pause and resume auto-sliding. Alternatively, sliding can be paused or resumed by pressing »A« on the keyboard. Sliding is paused automatically as soon as the user starts navigating. You can disable these controls by specifying `autoSlideStoppable: false` in your reveal.js config. + +You can also override the slide duration for individual slides and fragments by using the `data-autoslide` attribute: + +```html +
    +

    After 2 seconds the first fragment will be shown.

    +

    After 10 seconds the next fragment will be shown.

    +

    Now, the fragment is displayed for 2 seconds before the next slide is shown.

    +
    +``` + +To override the method used for navigation when auto-sliding, you can specify the `autoSlideMethod` setting. To only navigate along the top layer and ignore vertical slides, set this to `Reveal.navigateRight`. + +Whenever the auto-slide mode is resumed or paused the `autoslideresumed` and `autoslidepaused` events are fired. + +### Keyboard Bindings + +If you're unhappy with any of the default keyboard bindings you can override them using the `keyboard` config option: + +```javascript +Reveal.configure({ + keyboard: { + 13: 'next', // go to the next slide when the ENTER key is pressed + 27: function() {}, // do something custom when ESC is pressed + 32: null // don't do anything when SPACE is pressed (i.e. disable a reveal.js default binding) + } +}); +``` + +### Touch Navigation + +You can swipe to navigate through a presentation on any touch-enabled device. Horizontal swipes change between horizontal slides, vertical swipes change between vertical slides. If you wish to disable this you can set the `touch` config option to false when initializing reveal.js. + +If there's some part of your content that needs to remain accessible to touch events you'll need to highlight this by adding a `data-prevent-swipe` attribute to the element. One common example where this is useful is elements that need to be scrolled. + +### Lazy Loading + +When working on presentation with a lot of media or iframe content it's important to load lazily. Lazy loading means that reveal.js will only load content for the few slides nearest to the current slide. The number of slides that are preloaded is determined by the `viewDistance` configuration option. + +To enable lazy loading all you need to do is change your `src` attributes to `data-src` as shown below. This is supported for image, video, audio and iframe elements. Lazy loaded iframes will also unload when the containing slide is no longer visible. + +```html +
    + + + +
    +``` + +### API + +The `Reveal` object exposes a JavaScript API for controlling navigation and reading state: + +```javascript +// Navigation +Reveal.slide( indexh, indexv, indexf ); +Reveal.left(); +Reveal.right(); +Reveal.up(); +Reveal.down(); +Reveal.prev(); +Reveal.next(); +Reveal.prevFragment(); +Reveal.nextFragment(); + +// Randomize the order of slides +Reveal.shuffle(); + +// Toggle presentation states, optionally pass true/false to force on/off +Reveal.toggleOverview(); +Reveal.togglePause(); +Reveal.toggleAutoSlide(); + +// Shows a help overlay with keyboard shortcuts, optionally pass true/false +// to force on/off +Reveal.toggleHelp(); + +// Change a config value at runtime +Reveal.configure({ controls: true }); + +// Returns the present configuration options +Reveal.getConfig(); + +// Fetch the current scale of the presentation +Reveal.getScale(); + +// Retrieves the previous and current slide elements +Reveal.getPreviousSlide(); +Reveal.getCurrentSlide(); + +Reveal.getIndices(); // { h: 0, v: 0, f: 0 } +Reveal.getSlidePastCount(); +Reveal.getProgress(); // (0 == first slide, 1 == last slide) +Reveal.getSlides(); // Array of all slides +Reveal.getTotalSlides(); // Total number of slides + +// Returns the speaker notes for the current slide +Reveal.getSlideNotes(); + +// State checks +Reveal.isFirstSlide(); +Reveal.isLastSlide(); +Reveal.isOverview(); +Reveal.isPaused(); +Reveal.isAutoSliding(); +``` + +### Custom Key Bindings + +Custom key bindings can be added and removed using the following Javascript API. Custom key bindings will override the default keyboard bindings, but will in turn be overridden by the user defined bindings in the ``keyboard`` config option. + +```javascript +Reveal.addKeyBinding( binding, callback ); +Reveal.removeKeyBinding( keyCode ); +``` + +For example + +```javascript +// The binding parameter provides the following properties +// keyCode: the keycode for binding to the callback +// key: the key label to show in the help overlay +// description: the description of the action to show in the help overlay +Reveal.addKeyBinding( { keyCode: 84, key: 'T', description: 'Start timer' }, function() { + // start timer +} ) + +// The binding parameter can also be a direct keycode without providing the help description +Reveal.addKeyBinding( 82, function() { + // reset timer +} ) +``` + +This allows plugins to add key bindings directly to Reveal so they can + +* make use of Reveal's pre-processing logic for key handling (for example, ignoring key presses when paused); and +* be included in the help overlay (optional) + +### Slide Changed Event + +A `slidechanged` event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes. + +Some libraries, like MathJax (see [#226](https://github.com/hakimel/reveal.js/issues/226#issuecomment-10261609)), get confused by the transforms and display states of slides. Often times, this can be fixed by calling their update or render function from this callback. + +```javascript +Reveal.addEventListener( 'slidechanged', function( event ) { + // event.previousSlide, event.currentSlide, event.indexh, event.indexv +} ); +``` + +### Presentation State + +The presentation's current state can be fetched by using the `getState` method. A state object contains all of the information required to put the presentation back as it was when `getState` was first called. Sort of like a snapshot. It's a simple object that can easily be stringified and persisted or sent over the wire. + +```javascript +Reveal.slide( 1 ); +// we're on slide 1 + +var state = Reveal.getState(); + +Reveal.slide( 3 ); +// we're on slide 3 + +Reveal.setState( state ); +// we're back on slide 1 +``` + +### Slide States + +If you set `data-state="somestate"` on a slide `
    `, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide. + +Furthermore you can also listen to these changes in state via JavaScript: + +```javascript +Reveal.addEventListener( 'somestate', function() { + // TODO: Sprinkle magic +}, false ); +``` + +### Slide Backgrounds + +Slides are contained within a limited portion of the screen by default to allow them to fit any display and scale uniformly. You can apply full page backgrounds outside of the slide area by adding a `data-background` attribute to your `
    ` elements. Four different types of backgrounds are supported: color, image, video and iframe. + +#### Color Backgrounds + +All CSS color formats are supported, including hex values, keywords, `rgba()` or `hsl()`. + +```html +
    +

    Color

    +
    +``` + +#### Image Backgrounds + +By default, background images are resized to cover the full page. Available options: + +| Attribute | Default | Description | +| :------------------------------- | :--------- | :---------- | +| data-background-image | | URL of the image to show. GIFs restart when the slide opens. | +| data-background-size | cover | See [background-size](https://developer.mozilla.org/docs/Web/CSS/background-size) on MDN. | +| data-background-position | center | See [background-position](https://developer.mozilla.org/docs/Web/CSS/background-position) on MDN. | +| data-background-repeat | no-repeat | See [background-repeat](https://developer.mozilla.org/docs/Web/CSS/background-repeat) on MDN. | +| data-background-opacity | 1 | Opacity of the background image on a 0-1 scale. 0 is transparent and 1 is fully opaque. | + +```html +
    +

    Image

    +
    +
    +

    This background image will be sized to 100px and repeated

    +
    +``` + +#### Video Backgrounds + +Automatically plays a full size video behind the slide. + +| Attribute | Default | Description | +| :--------------------------- | :------ | :---------- | +| data-background-video | | A single video source, or a comma separated list of video sources. | +| data-background-video-loop | false | Flags if the video should play repeatedly. | +| data-background-video-muted | false | Flags if the audio should be muted. | +| data-background-size | cover | Use `cover` for full screen and some cropping or `contain` for letterboxing. | +| data-background-opacity | 1 | Opacity of the background video on a 0-1 scale. 0 is transparent and 1 is fully opaque. | + +```html +
    +

    Video

    +
    +``` + +#### Iframe Backgrounds + +Embeds a web page as a slide background that covers 100% of the reveal.js width and height. The iframe is in the background layer, behind your slides, and as such it's not possible to interact with it by default. To make your background interactive, you can add the `data-background-interactive` attribute. + +```html +
    +

    Iframe

    +
    +``` + +#### Background Transitions + +Backgrounds transition using a fade animation by default. This can be changed to a linear sliding transition by passing `backgroundTransition: 'slide'` to the `Reveal.initialize()` call. Alternatively you can set `data-background-transition` on any section with a background to override that specific transition. + + +### Parallax Background + +If you want to use a parallax scrolling background, set the first two properties below when initializing reveal.js (the other two are optional). + +```javascript +Reveal.initialize({ + + // Parallax background image + parallaxBackgroundImage: '', // e.g. "https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - currently only pixels are supported (don't use % or auto) + + // Number of pixels to move the parallax background per slide + // - Calculated automatically unless specified + // - Set to 0 to disable movement along an axis + parallaxBackgroundHorizontal: 200, + parallaxBackgroundVertical: 50 + +}); +``` + +Make sure that the background size is much bigger than screen size to allow for some scrolling. [View example](http://revealjs.com/?parallaxBackgroundImage=https%3A%2F%2Fs3.amazonaws.com%2Fhakim-static%2Freveal-js%2Freveal-parallax-1.jpg¶llaxBackgroundSize=2100px%20900px). + +### Slide Transitions + +The global presentation transition is set using the `transition` config value. You can override the global transition for a specific slide by using the `data-transition` attribute: + +```html +
    +

    This slide will override the presentation transition and zoom!

    +
    + +
    +

    Choose from three transition speeds: default, fast or slow!

    +
    +``` + +You can also use different in and out transitions for the same slide: + +```html +
    + The train goes on … +
    +
    + and on … +
    +
    + and stops. +
    +
    + (Passengers entering and leaving) +
    +
    + And it starts again. +
    +``` +You can choose from `none`, `fade`, `slide`, `convex`, `concave` and `zoom`. +### Internal links + +It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (`
    `): + +```html +Link +Link +``` + +You can also add relative navigation links, similar to the built in reveal.js controls, by appending one of the following classes on any element. Note that each element is automatically given an `enabled` class when it's a valid navigation route based on the current slide. + +```html + + + + + + +``` + +### Fragments + +Fragments are used to highlight individual elements on a slide. Every element with the class `fragment` will be stepped through before moving on to the next slide. Here's an example: http://revealjs.com/#/fragments + +The default fragment style is to start out invisible and fade in. This style can be changed by appending a different class to the fragment: + +```html +
    +

    grow

    +

    shrink

    +

    fade-out

    +

    fade-up (also down, left and right!)

    +

    fades in, then out when we move to the next step

    +

    fades in, then obfuscate when we move to the next step

    +

    blue only once

    +

    highlight-red

    +

    highlight-green

    +

    highlight-blue

    +
    +``` + +Multiple fragments can be applied to the same element sequentially by wrapping it, this will fade in the text on the first step and fade it back out on the second. + +```html +
    + + I'll fade in, then out + +
    +``` + +The display order of fragments can be controlled using the `data-fragment-index` attribute. + +```html +
    +

    Appears last

    +

    Appears first

    +

    Appears second

    +
    +``` + +### Fragment events + +When a slide fragment is either shown or hidden reveal.js will dispatch an event. + +Some libraries, like MathJax (see #505), get confused by the initially hidden fragment elements. Often times this can be fixed by calling their update or render function from this callback. + +```javascript +Reveal.addEventListener( 'fragmentshown', function( event ) { + // event.fragment = the fragment DOM element +} ); +Reveal.addEventListener( 'fragmenthidden', function( event ) { + // event.fragment = the fragment DOM element +} ); +``` + +### Code syntax highlighting + +By default, Reveal is configured with [highlight.js](https://highlightjs.org/) for code syntax highlighting. To enable syntax highlighting, you'll have to load the highlight plugin ([plugin/highlight/highlight.js](plugin/highlight/highlight.js)) and a highlight.js CSS theme (Reveal comes packaged with the zenburn theme: [lib/css/zenburn.css](lib/css/zenburn.css)). + +```javascript +Reveal.initialize({ + // More info https://github.com/hakimel/reveal.js#dependencies + dependencies: [ + { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, + ] +}); +``` + +Below is an example with clojure code that will be syntax highlighted. When the `data-trim` attribute is present, surrounding whitespace is automatically removed. HTML will be escaped by default. To avoid this, for example if you are using `` to call out a line of code, add the `data-noescape` attribute to the `` element. + +```html +
    +
    
    +(def lazy-fib
    +  (concat
    +   [0 1]
    +   ((fn rfib [a b]
    +        (lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))
    +	
    +
    +``` + +### Slide number + +If you would like to display the page number of the current slide you can do so using the `slideNumber` and `showSlideNumber` configuration values. + +```javascript +// Shows the slide number using default formatting +Reveal.configure({ slideNumber: true }); + +// Slide number formatting can be configured using these variables: +// "h.v": horizontal . vertical slide number (default) +// "h/v": horizontal / vertical slide number +// "c": flattened slide number +// "c/t": flattened slide number / total slides +Reveal.configure({ slideNumber: 'c/t' }); + +// Control which views the slide number displays on using the "showSlideNumber" value: +// "all": show on all views (default) +// "speaker": only show slide numbers on speaker notes view +// "print": only show slide numbers when printing to PDF +Reveal.configure({ showSlideNumber: 'speaker' }); +``` + +### Overview mode + +Press »ESC« or »O« keys to toggle the overview mode on and off. While you're in this mode, you can still navigate between slides, +as if you were at 1,000 feet above your presentation. The overview mode comes with a few API hooks: + +```javascript +Reveal.addEventListener( 'overviewshown', function( event ) { /* ... */ } ); +Reveal.addEventListener( 'overviewhidden', function( event ) { /* ... */ } ); + +// Toggle the overview mode programmatically +Reveal.toggleOverview(); +``` + +### Fullscreen mode + +Just press »F« on your keyboard to show your presentation in fullscreen mode. Press the »ESC« key to exit fullscreen mode. + +### Embedded media + +Add `data-autoplay` to your media element if you want it to automatically start playing when the slide is shown: + +```html + +``` + +If you want to enable or disable autoplay globally, for all embedded media, you can use the `autoPlayMedia` configuration option. If you set this to `true` ALL media will autoplay regardless of individual `data-autoplay` attributes. If you initialize with `autoPlayMedia: false` NO media will autoplay. + +Note that embedded HTML5 `