From 20d4d16373c9ffc290907a22f49d80cbe663bbcb Mon Sep 17 00:00:00 2001 From: sjsdfg <736777445@qq.com> Date: Thu, 14 Mar 2019 13:10:17 +0800 Subject: [PATCH] docsify --- docs/.nojekyll | 0 docs/README.md | 66 + docs/_coverpage.md | 12 + docs/_media/LogoMakr_1J56bI.png | Bin 0 -> 57583 bytes docs/_media/logomakr-3sxxzw-128x128.png | Bin 0 -> 2318 bytes docs/_media/公众å·.jpg | Bin 0 -> 27415 bytes docs/_style/prism-master/.editorconfig | 14 + docs/_style/prism-master/.gitattributes | 4 + docs/_style/prism-master/.gitignore | 4 + docs/_style/prism-master/.npmignore | 27 + docs/_style/prism-master/.travis.yml | 23 + docs/_style/prism-master/CHANGELOG.md | 1334 +++++++++++++++++ docs/_style/prism-master/CNAME | 1 + docs/_style/prism-master/LICENSE | 21 + docs/_style/prism-master/README.md | 30 + docs/_style/prism-master/bower.json | 30 + docs/_style/prism-master/code.js | 213 +++ docs/_style/prism-master/components.js | 2 + docs/_style/prism-master/components.json | 913 +++++++++++ docs/_style/prism-master/components/index.js | 82 + .../prism-master/components/prism-abap.js | 48 + .../prism-master/components/prism-abap.min.js | 1 + .../components/prism-actionscript.js | 17 + .../components/prism-actionscript.min.js | 1 + .../prism-master/components/prism-ada.js | 19 + .../prism-master/components/prism-ada.min.js | 1 + .../components/prism-apacheconf.js | 47 + .../components/prism-apacheconf.min.js | 1 + .../prism-master/components/prism-apl.js | 32 + .../prism-master/components/prism-apl.min.js | 1 + .../components/prism-applescript.js | 20 + .../components/prism-applescript.min.js | 1 + .../prism-master/components/prism-arduino.js | 5 + .../components/prism-arduino.min.js | 1 + .../prism-master/components/prism-arff.js | 10 + .../prism-master/components/prism-arff.min.js | 1 + .../prism-master/components/prism-asciidoc.js | 271 ++++ .../components/prism-asciidoc.min.js | 1 + .../prism-master/components/prism-asm6502.js | 28 + .../components/prism-asm6502.min.js | 1 + .../prism-master/components/prism-aspnet.js | 36 + .../components/prism-aspnet.min.js | 1 + .../components/prism-autohotkey.js | 27 + .../components/prism-autohotkey.min.js | 1 + .../prism-master/components/prism-autoit.js | 34 + .../components/prism-autoit.min.js | 1 + .../prism-master/components/prism-bash.js | 84 ++ .../prism-master/components/prism-bash.min.js | 1 + .../prism-master/components/prism-basic.js | 17 + .../components/prism-basic.min.js | 1 + .../prism-master/components/prism-batch.js | 99 ++ .../components/prism-batch.min.js | 1 + .../prism-master/components/prism-bison.js | 39 + .../components/prism-bison.min.js | 1 + .../components/prism-brainfuck.js | 20 + .../components/prism-brainfuck.min.js | 1 + .../prism-master/components/prism-bro.js | 48 + .../prism-master/components/prism-bro.min.js | 1 + .../_style/prism-master/components/prism-c.js | 33 + .../prism-master/components/prism-c.min.js | 1 + .../prism-master/components/prism-cil.js | 27 + .../prism-master/components/prism-cil.min.js | 1 + .../prism-master/components/prism-clike.js | 30 + .../components/prism-clike.min.js | 1 + .../prism-master/components/prism-clojure.js | 13 + .../components/prism-clojure.min.js | 1 + .../components/prism-coffeescript.js | 92 ++ .../components/prism-coffeescript.min.js | 1 + .../prism-master/components/prism-core.js | 548 +++++++ .../prism-master/components/prism-core.min.js | 1 + .../prism-master/components/prism-cpp.js | 20 + .../prism-master/components/prism-cpp.min.js | 1 + .../prism-master/components/prism-crystal.js | 51 + .../components/prism-crystal.min.js | 1 + .../prism-master/components/prism-csharp.js | 81 + .../components/prism-csharp.min.js | 1 + .../prism-master/components/prism-csp.js | 25 + .../prism-master/components/prism-csp.min.js | 1 + .../components/prism-css-extras.js | 31 + .../components/prism-css-extras.min.js | 1 + .../prism-master/components/prism-css.js | 52 + .../prism-master/components/prism-css.min.js | 1 + .../_style/prism-master/components/prism-d.js | 64 + .../prism-master/components/prism-d.min.js | 1 + .../prism-master/components/prism-dart.js | 24 + .../prism-master/components/prism-dart.min.js | 1 + .../prism-master/components/prism-diff.js | 20 + .../prism-master/components/prism-diff.min.js | 1 + .../prism-master/components/prism-django.js | 41 + .../components/prism-django.min.js | 1 + .../prism-master/components/prism-docker.js | 11 + .../components/prism-docker.min.js | 1 + .../prism-master/components/prism-eiffel.js | 37 + .../components/prism-eiffel.min.js | 1 + .../prism-master/components/prism-elixir.js | 93 ++ .../components/prism-elixir.min.js | 1 + .../prism-master/components/prism-elm.js | 44 + .../prism-master/components/prism-elm.min.js | 1 + .../prism-master/components/prism-erb.js | 20 + .../prism-master/components/prism-erb.min.js | 1 + .../prism-master/components/prism-erlang.js | 44 + .../components/prism-erlang.min.js | 1 + .../prism-master/components/prism-flow.js | 35 + .../prism-master/components/prism-flow.min.js | 1 + .../prism-master/components/prism-fortran.js | 40 + .../components/prism-fortran.min.js | 1 + .../prism-master/components/prism-fsharp.js | 67 + .../components/prism-fsharp.min.js | 1 + .../prism-master/components/prism-gcode.js | 15 + .../components/prism-gcode.min.js | 1 + .../prism-master/components/prism-gedcom.js | 28 + .../components/prism-gedcom.min.js | 1 + .../prism-master/components/prism-gherkin.js | 79 + .../components/prism-gherkin.min.js | 1 + .../prism-master/components/prism-git.js | 68 + .../prism-master/components/prism-git.min.js | 1 + .../prism-master/components/prism-glsl.js | 16 + .../prism-master/components/prism-glsl.min.js | 1 + .../prism-master/components/prism-gml.js | 7 + .../prism-master/components/prism-gml.min.js | 1 + .../prism-master/components/prism-go.js | 12 + .../prism-master/components/prism-go.min.js | 1 + .../prism-master/components/prism-graphql.js | 24 + .../components/prism-graphql.min.js | 1 + .../prism-master/components/prism-groovy.js | 65 + .../components/prism-groovy.min.js | 1 + .../prism-master/components/prism-haml.js | 154 ++ .../prism-master/components/prism-haml.min.js | 1 + .../components/prism-handlebars.js | 37 + .../components/prism-handlebars.min.js | 1 + .../prism-master/components/prism-haskell.js | 36 + .../components/prism-haskell.min.js | 1 + .../prism-master/components/prism-haxe.js | 45 + .../prism-master/components/prism-haxe.min.js | 1 + .../prism-master/components/prism-hpkp.js | 20 + .../prism-master/components/prism-hpkp.min.js | 1 + .../prism-master/components/prism-hsts.js | 20 + .../prism-master/components/prism-hsts.min.js | 1 + .../prism-master/components/prism-http.js | 79 + .../prism-master/components/prism-http.min.js | 1 + .../components/prism-ichigojam.js | 15 + .../components/prism-ichigojam.min.js | 1 + .../prism-master/components/prism-icon.js | 20 + .../prism-master/components/prism-icon.min.js | 1 + .../prism-master/components/prism-inform7.js | 61 + .../components/prism-inform7.min.js | 1 + .../prism-master/components/prism-ini.js | 11 + .../prism-master/components/prism-ini.min.js | 1 + .../prism-master/components/prism-io.js | 31 + .../prism-master/components/prism-io.min.js | 1 + .../_style/prism-master/components/prism-j.js | 25 + .../prism-master/components/prism-j.min.js | 1 + .../prism-master/components/prism-java.js | 54 + .../prism-master/components/prism-java.min.js | 1 + .../components/prism-javascript.js | 91 ++ .../components/prism-javascript.min.js | 1 + .../components/prism-javastacktrace.js | 93 ++ .../components/prism-javastacktrace.min.js | 1 + .../prism-master/components/prism-jolie.js | 55 + .../components/prism-jolie.min.js | 1 + .../prism-master/components/prism-json.js | 18 + .../prism-master/components/prism-json.min.js | 1 + .../prism-master/components/prism-jsx.js | 126 ++ .../prism-master/components/prism-jsx.min.js | 1 + .../prism-master/components/prism-julia.js | 12 + .../components/prism-julia.min.js | 1 + .../prism-master/components/prism-keyman.js | 14 + .../components/prism-keyman.min.js | 1 + .../prism-master/components/prism-kotlin.js | 62 + .../components/prism-kotlin.min.js | 1 + .../prism-master/components/prism-latex.js | 61 + .../components/prism-latex.min.js | 1 + .../prism-master/components/prism-less.js | 54 + .../prism-master/components/prism-less.min.js | 1 + .../prism-master/components/prism-liquid.js | 12 + .../components/prism-liquid.min.js | 1 + .../prism-master/components/prism-lisp.js | 197 +++ .../prism-master/components/prism-lisp.min.js | 1 + .../components/prism-livescript.js | 119 ++ .../components/prism-livescript.min.js | 1 + .../prism-master/components/prism-lolcode.js | 55 + .../components/prism-lolcode.min.js | 1 + .../prism-master/components/prism-lua.js | 20 + .../prism-master/components/prism-lua.min.js | 1 + .../prism-master/components/prism-makefile.js | 34 + .../components/prism-makefile.min.js | 1 + .../prism-master/components/prism-markdown.js | 229 +++ .../components/prism-markdown.min.js | 1 + .../components/prism-markup-templating.js | 89 ++ .../components/prism-markup-templating.min.js | 1 + .../prism-master/components/prism-markup.js | 56 + .../components/prism-markup.min.js | 1 + .../prism-master/components/prism-matlab.js | 16 + .../components/prism-matlab.min.js | 1 + .../prism-master/components/prism-mel.js | 43 + .../prism-master/components/prism-mel.min.js | 1 + .../prism-master/components/prism-mizar.js | 12 + .../components/prism-mizar.min.js | 1 + .../prism-master/components/prism-monkey.js | 31 + .../components/prism-monkey.min.js | 1 + .../prism-master/components/prism-n4js.js | 14 + .../prism-master/components/prism-n4js.min.js | 1 + .../prism-master/components/prism-nasm.js | 24 + .../prism-master/components/prism-nasm.min.js | 1 + .../prism-master/components/prism-nginx.js | 11 + .../components/prism-nginx.min.js | 1 + .../prism-master/components/prism-nim.js | 33 + .../prism-master/components/prism-nim.min.js | 1 + .../prism-master/components/prism-nix.js | 40 + .../prism-master/components/prism-nix.min.js | 1 + .../prism-master/components/prism-nsis.js | 29 + .../prism-master/components/prism-nsis.min.js | 1 + .../components/prism-objectivec.js | 5 + .../components/prism-objectivec.min.js | 1 + .../prism-master/components/prism-ocaml.js | 27 + .../components/prism-ocaml.min.js | 1 + .../prism-master/components/prism-opencl.js | 49 + .../components/prism-opencl.min.js | 1 + .../prism-master/components/prism-oz.js | 25 + .../prism-master/components/prism-oz.min.js | 1 + .../prism-master/components/prism-parigp.js | 30 + .../components/prism-parigp.min.js | 1 + .../prism-master/components/prism-parser.js | 67 + .../components/prism-parser.min.js | 1 + .../prism-master/components/prism-pascal.js | 55 + .../components/prism-pascal.min.js | 1 + .../prism-master/components/prism-perl.js | 191 +++ .../prism-master/components/prism-perl.min.js | 1 + .../components/prism-php-extras.js | 11 + .../components/prism-php-extras.min.js | 1 + .../prism-master/components/prism-php.js | 122 ++ .../prism-master/components/prism-php.min.js | 1 + .../prism-master/components/prism-plsql.js | 20 + .../components/prism-plsql.min.js | 1 + .../components/prism-powershell.js | 55 + .../components/prism-powershell.min.js | 1 + .../components/prism-processing.js | 18 + .../components/prism-processing.min.js | 1 + .../prism-master/components/prism-prolog.js | 20 + .../components/prism-prolog.min.js | 1 + .../components/prism-properties.js | 9 + .../components/prism-properties.min.js | 1 + .../prism-master/components/prism-protobuf.js | 8 + .../components/prism-protobuf.min.js | 1 + .../prism-master/components/prism-pug.js | 198 +++ .../prism-master/components/prism-pug.min.js | 1 + .../prism-master/components/prism-puppet.js | 136 ++ .../components/prism-puppet.min.js | 1 + .../prism-master/components/prism-pure.js | 81 + .../prism-master/components/prism-pure.min.js | 1 + .../prism-master/components/prism-python.js | 64 + .../components/prism-python.min.js | 1 + .../_style/prism-master/components/prism-q.js | 51 + .../prism-master/components/prism-q.min.js | 1 + .../prism-master/components/prism-qore.js | 20 + .../prism-master/components/prism-qore.min.js | 1 + .../_style/prism-master/components/prism-r.js | 22 + .../prism-master/components/prism-r.min.js | 1 + .../prism-master/components/prism-reason.js | 32 + .../components/prism-reason.min.js | 1 + .../prism-master/components/prism-renpy.js | 29 + .../components/prism-renpy.min.js | 1 + .../prism-master/components/prism-rest.js | 205 +++ .../prism-master/components/prism-rest.min.js | 1 + .../prism-master/components/prism-rip.js | 32 + .../prism-master/components/prism-rip.min.js | 1 + .../prism-master/components/prism-roboconf.js | 27 + .../components/prism-roboconf.min.js | 1 + .../prism-master/components/prism-ruby.js | 143 ++ .../prism-master/components/prism-ruby.min.js | 1 + .../prism-master/components/prism-rust.js | 68 + .../prism-master/components/prism-rust.min.js | 1 + .../prism-master/components/prism-sas.js | 34 + .../prism-master/components/prism-sas.min.js | 1 + .../prism-master/components/prism-sass.js | 72 + .../prism-master/components/prism-sass.min.js | 1 + .../prism-master/components/prism-scala.js | 18 + .../components/prism-scala.min.js | 1 + .../prism-master/components/prism-scheme.js | 33 + .../components/prism-scheme.min.js | 1 + .../prism-master/components/prism-scss.js | 74 + .../prism-master/components/prism-scss.min.js | 1 + .../components/prism-smalltalk.js | 31 + .../components/prism-smalltalk.min.js | 1 + .../prism-master/components/prism-smarty.js | 96 ++ .../components/prism-smarty.min.js | 1 + .../prism-master/components/prism-soy.js | 96 ++ .../prism-master/components/prism-soy.min.js | 1 + .../prism-master/components/prism-sql.js | 24 + .../prism-master/components/prism-sql.min.js | 1 + .../prism-master/components/prism-stylus.js | 111 ++ .../components/prism-stylus.min.js | 1 + .../prism-master/components/prism-swift.js | 25 + .../components/prism-swift.min.js | 1 + .../prism-master/components/prism-tap.js | 20 + .../prism-master/components/prism-tap.min.js | 1 + .../prism-master/components/prism-tcl.js | 46 + .../prism-master/components/prism-tcl.min.js | 1 + .../prism-master/components/prism-textile.js | 257 ++++ .../components/prism-textile.min.js | 1 + .../prism-master/components/prism-toml.js | 43 + .../prism-master/components/prism-toml.min.js | 1 + .../prism-master/components/prism-tsx.js | 2 + .../prism-master/components/prism-tsx.min.js | 1 + .../prism-master/components/prism-tt2.js | 56 + .../prism-master/components/prism-tt2.min.js | 1 + .../prism-master/components/prism-twig.js | 46 + .../prism-master/components/prism-twig.min.js | 1 + .../components/prism-typescript.js | 7 + .../components/prism-typescript.min.js | 1 + .../prism-master/components/prism-vala.js | 74 + .../prism-master/components/prism-vala.min.js | 1 + .../prism-master/components/prism-vbnet.js | 15 + .../components/prism-vbnet.min.js | 1 + .../prism-master/components/prism-velocity.js | 72 + .../components/prism-velocity.min.js | 1 + .../prism-master/components/prism-verilog.js | 20 + .../components/prism-verilog.min.js | 1 + .../prism-master/components/prism-vhdl.js | 23 + .../prism-master/components/prism-vhdl.min.js | 1 + .../prism-master/components/prism-vim.js | 10 + .../prism-master/components/prism-vim.min.js | 1 + .../components/prism-visual-basic.js | 34 + .../components/prism-visual-basic.min.js | 1 + .../prism-master/components/prism-wasm.js | 31 + .../prism-master/components/prism-wasm.min.js | 1 + .../prism-master/components/prism-wiki.js | 81 + .../prism-master/components/prism-wiki.min.js | 1 + .../prism-master/components/prism-xeora.js | 114 ++ .../components/prism-xeora.min.js | 1 + .../prism-master/components/prism-xojo.js | 20 + .../prism-master/components/prism-xojo.min.js | 1 + .../prism-master/components/prism-xquery.js | 164 ++ .../components/prism-xquery.min.js | 1 + .../prism-master/components/prism-yaml.js | 47 + .../prism-master/components/prism-yaml.min.js | 1 + docs/_style/prism-master/composer.json | 20 + docs/_style/prism-master/download.html | 193 +++ docs/_style/prism-master/download.js | 598 ++++++++ docs/_style/prism-master/examples.html | 110 ++ docs/_style/prism-master/examples.js | 217 +++ .../prism-master/examples/prism-abap.html | 65 + .../examples/prism-actionscript.html | 133 ++ .../prism-master/examples/prism-ada.html | 35 + .../examples/prism-apacheconf.html | 54 + .../prism-master/examples/prism-apl.html | 26 + .../examples/prism-applescript.html | 41 + .../prism-master/examples/prism-arduino.html | 63 + .../prism-master/examples/prism-arff.html | 46 + .../prism-master/examples/prism-asciidoc.html | 104 ++ .../prism-master/examples/prism-asm6502.html | 39 + .../prism-master/examples/prism-aspnet.html | 36 + .../examples/prism-autohotkey.html | 68 + .../prism-master/examples/prism-autoit.html | 52 + .../prism-master/examples/prism-bash.html | 49 + .../prism-master/examples/prism-basic.html | 69 + .../prism-master/examples/prism-batch.html | 17 + .../prism-master/examples/prism-bison.html | 104 ++ .../examples/prism-brainfuck.html | 37 + .../prism-master/examples/prism-bro.html | 645 ++++++++ .../_style/prism-master/examples/prism-c.html | 22 + .../prism-master/examples/prism-clike.html | 28 + .../prism-master/examples/prism-clojure.html | 386 +++++ .../examples/prism-coffeescript.html | 61 + .../prism-master/examples/prism-cpp.html | 61 + .../prism-master/examples/prism-crystal.html | 16 + .../prism-master/examples/prism-csharp.html | 60 + .../prism-master/examples/prism-csp.html | 13 + .../prism-master/examples/prism-css.html | 34 + .../_style/prism-master/examples/prism-d.html | 267 ++++ .../prism-master/examples/prism-dart.html | 59 + .../prism-master/examples/prism-diff.html | 33 + .../prism-master/examples/prism-django.html | 31 + .../prism-master/examples/prism-docker.html | 49 + .../prism-master/examples/prism-eiffel.html | 72 + .../prism-master/examples/prism-elixir.html | 462 ++++++ .../prism-master/examples/prism-elm.html | 91 ++ .../prism-master/examples/prism-erb.html | 22 + .../prism-master/examples/prism-erlang.html | 47 + .../prism-master/examples/prism-flow.html | 18 + .../prism-master/examples/prism-fortran.html | 71 + .../prism-master/examples/prism-fsharp.html | 89 ++ .../prism-master/examples/prism-gcode.html | 22 + .../prism-master/examples/prism-gedcom.html | 50 + .../prism-master/examples/prism-gherkin.html | 74 + .../prism-master/examples/prism-git.html | 39 + .../prism-master/examples/prism-glsl.html | 65 + .../prism-master/examples/prism-gml.html | 29 + .../prism-master/examples/prism-go.html | 68 + .../prism-master/examples/prism-graphql.html | 31 + .../prism-master/examples/prism-groovy.html | 93 ++ .../prism-master/examples/prism-haml.html | 79 + .../examples/prism-handlebars.html | 41 + .../prism-master/examples/prism-haskell.html | 80 + .../prism-master/examples/prism-haxe.html | 37 + .../prism-master/examples/prism-hpkp.html | 11 + .../prism-master/examples/prism-hsts.html | 8 + .../prism-master/examples/prism-http.html | 33 + .../examples/prism-ichigojam.html | 29 + .../prism-master/examples/prism-icon.html | 172 +++ .../prism-master/examples/prism-inform7.html | 171 +++ .../prism-master/examples/prism-ini.html | 10 + .../prism-master/examples/prism-io.html | 31 + .../_style/prism-master/examples/prism-j.html | 59 + .../prism-master/examples/prism-java.html | 65 + .../examples/prism-javascript.html | 77 + .../examples/prism-javastacktrace.html | 63 + .../prism-master/examples/prism-jolie.html | 162 ++ .../prism-master/examples/prism-jsx.html | 18 + .../prism-master/examples/prism-julia.html | 29 + .../prism-master/examples/prism-keyman.html | 107 ++ .../prism-master/examples/prism-kotlin.html | 134 ++ .../prism-master/examples/prism-latex.html | 12 + .../prism-master/examples/prism-less.html | 70 + .../prism-master/examples/prism-liquid.html | 75 + .../prism-master/examples/prism-lisp.html | 46 + .../examples/prism-livescript.html | 84 ++ .../prism-master/examples/prism-lolcode.html | 62 + .../prism-master/examples/prism-lua.html | 89 ++ .../prism-master/examples/prism-makefile.html | 263 ++++ .../prism-master/examples/prism-markdown.html | 86 ++ .../prism-master/examples/prism-markup.html | 77 + .../prism-master/examples/prism-matlab.html | 52 + .../prism-master/examples/prism-mel.html | 137 ++ .../prism-master/examples/prism-mizar.html | 45 + .../prism-master/examples/prism-monkey.html | 74 + .../prism-master/examples/prism-n4js.html | 114 ++ .../prism-master/examples/prism-nasm.html | 74 + .../prism-master/examples/prism-nginx.html | 25 + .../prism-master/examples/prism-nim.html | 222 +++ .../prism-master/examples/prism-nix.html | 46 + .../prism-master/examples/prism-nsis.html | 18 + .../examples/prism-objectivec.html | 44 + .../prism-master/examples/prism-ocaml.html | 59 + .../prism-master/examples/prism-opencl.html | 83 + .../prism-master/examples/prism-oz.html | 89 ++ .../prism-master/examples/prism-parigp.html | 20 + .../prism-master/examples/prism-parser.html | 88 ++ .../prism-master/examples/prism-pascal.html | 65 + .../prism-master/examples/prism-perl.html | 71 + .../prism-master/examples/prism-php.html | 67 + .../prism-master/examples/prism-plsql.html | 40 + .../examples/prism-powershell.html | 19 + .../examples/prism-processing.html | 173 +++ .../prism-master/examples/prism-prolog.html | 44 + .../examples/prism-properties.html | 9 + .../prism-master/examples/prism-pug.html | 85 ++ .../prism-master/examples/prism-puppet.html | 152 ++ .../prism-master/examples/prism-pure.html | 115 ++ .../prism-master/examples/prism-python.html | 61 + .../_style/prism-master/examples/prism-q.html | 112 ++ .../prism-master/examples/prism-qore.html | 962 ++++++++++++ .../_style/prism-master/examples/prism-r.html | 38 + .../prism-master/examples/prism-reason.html | 35 + .../prism-master/examples/prism-renpy.html | 123 ++ .../prism-master/examples/prism-rest.html | 329 ++++ .../prism-master/examples/prism-rip.html | 12 + .../prism-master/examples/prism-roboconf.html | 49 + .../prism-master/examples/prism-ruby.html | 30 + .../prism-master/examples/prism-rust.html | 68 + .../prism-master/examples/prism-sas.html | 158 ++ .../prism-master/examples/prism-sass.html | 47 + .../prism-master/examples/prism-scala.html | 100 ++ .../prism-master/examples/prism-scheme.html | 35 + .../prism-master/examples/prism-scss.html | 31 + .../examples/prism-smalltalk.html | 92 ++ .../prism-master/examples/prism-smarty.html | 81 + .../prism-master/examples/prism-soy.html | 36 + .../prism-master/examples/prism-sql.html | 34 + .../prism-master/examples/prism-stylus.html | 72 + .../prism-master/examples/prism-swift.html | 80 + .../prism-master/examples/prism-tcl.html | 26 + .../prism-master/examples/prism-textile.html | 178 +++ .../prism-master/examples/prism-tsx.html | 31 + .../prism-master/examples/prism-tt2.html | 61 + .../prism-master/examples/prism-twig.html | 35 + .../examples/prism-typescript.html | 28 + .../prism-master/examples/prism-vala.html | 33 + .../prism-master/examples/prism-vbnet.html | 16 + .../prism-master/examples/prism-velocity.html | 47 + .../prism-master/examples/prism-verilog.html | 103 ++ .../prism-master/examples/prism-vhdl.html | 92 ++ .../prism-master/examples/prism-vim.html | 25 + .../examples/prism-visual-basic.html | 36 + .../prism-master/examples/prism-wasm.html | 43 + .../prism-master/examples/prism-wiki.html | 165 ++ .../prism-master/examples/prism-xeora.html | 111 ++ .../prism-master/examples/prism-xojo.html | 63 + .../prism-master/examples/prism-xquery.html | 47 + .../prism-master/examples/prism-yaml.html | 107 ++ docs/_style/prism-master/extending.html | 247 +++ docs/_style/prism-master/faq.html | 182 +++ docs/_style/prism-master/favicon.png | Bin 0 -> 209 bytes docs/_style/prism-master/gulpfile.js | 143 ++ docs/_style/prism-master/img/logo-ala.png | Bin 0 -> 1745 bytes .../prism-master/img/logo-css-tricks.png | Bin 0 -> 1735 bytes docs/_style/prism-master/img/logo-drupal.png | Bin 0 -> 2371 bytes docs/_style/prism-master/img/logo-mdn.png | Bin 0 -> 6677 bytes docs/_style/prism-master/img/logo-react.png | Bin 0 -> 4705 bytes .../prism-master/img/logo-sitepoint.png | Bin 0 -> 2703 bytes .../_style/prism-master/img/logo-smashing.png | Bin 0 -> 14160 bytes docs/_style/prism-master/img/logo-stripe.png | Bin 0 -> 3377 bytes docs/_style/prism-master/img/spectrum.png | Bin 0 -> 359393 bytes docs/_style/prism-master/index.html | 321 ++++ docs/_style/prism-master/logo.svg | 22 + docs/_style/prism-master/package.json | 47 + .../plugins/autolinker/index.html | 70 + .../plugins/autolinker/prism-autolinker.css | 3 + .../plugins/autolinker/prism-autolinker.js | 81 + .../autolinker/prism-autolinker.min.js | 1 + .../plugins/autoloader/index.html | 204 +++ .../plugins/autoloader/prism-autoloader.js | 209 +++ .../autoloader/prism-autoloader.min.js | 1 + .../plugins/command-line/index.html | 111 ++ .../command-line/prism-command-line.css | 33 + .../command-line/prism-command-line.js | 139 ++ .../command-line/prism-command-line.min.js | 1 + .../plugins/copy-to-clipboard/index.html | 48 + .../prism-copy-to-clipboard.js | 75 + .../prism-copy-to-clipboard.min.js | 1 + .../plugins/custom-class/index.html | 133 ++ .../custom-class/prism-custom-class.js | 31 + .../custom-class/prism-custom-class.min.js | 1 + .../plugins/data-uri-highlight/index.html | 60 + .../prism-data-uri-highlight.js | 98 ++ .../prism-data-uri-highlight.min.js | 1 + .../plugins/file-highlight/index.html | 75 + .../file-highlight/prism-file-highlight.js | 105 ++ .../prism-file-highlight.min.js | 1 + .../plugins/highlight-keywords/index.html | 51 + .../prism-highlight-keywords.js | 17 + .../prism-highlight-keywords.min.js | 1 + docs/_style/prism-master/plugins/index.html | 42 + .../plugins/jsonp-highlight/index.html | 174 +++ .../jsonp-highlight/prism-jsonp-highlight.js | 151 ++ .../prism-jsonp-highlight.min.js | 1 + .../plugins/keep-markup/index.html | 80 + .../plugins/keep-markup/prism-keep-markup.js | 99 ++ .../keep-markup/prism-keep-markup.min.js | 1 + .../plugins/line-highlight/index.html | 88 ++ .../line-highlight/prism-line-highlight.css | 49 + .../line-highlight/prism-line-highlight.js | 181 +++ .../prism-line-highlight.min.js | 1 + .../plugins/line-numbers/index.html | 69 + .../line-numbers/prism-line-numbers.css | 41 + .../line-numbers/prism-line-numbers.js | 159 ++ .../line-numbers/prism-line-numbers.min.js | 1 + .../plugins/normalize-whitespace/demo.html | 33 + .../plugins/normalize-whitespace/index.html | 180 +++ .../prism-normalize-whitespace.js | 190 +++ .../prism-normalize-whitespace.min.js | 1 + .../plugins/previewers/index.html | 233 +++ .../plugins/previewers/prism-previewers.css | 242 +++ .../plugins/previewers/prism-previewers.js | 708 +++++++++ .../previewers/prism-previewers.min.js | 1 + .../remove-initial-line-feed/index.html | 59 + .../prism-remove-initial-line-feed.js | 21 + .../prism-remove-initial-line-feed.min.js | 1 + .../plugins/show-invisibles/index.html | 46 + .../show-invisibles/prism-show-invisibles.css | 34 + .../show-invisibles/prism-show-invisibles.js | 21 + .../prism-show-invisibles.min.js | 1 + .../plugins/show-language/index.html | 54 + .../show-language/prism-show-language.js | 31 + .../show-language/prism-show-language.min.js | 1 + .../prism-master/plugins/toolbar/index.html | 134 ++ .../plugins/toolbar/prism-toolbar.css | 58 + .../plugins/toolbar/prism-toolbar.js | 137 ++ .../plugins/toolbar/prism-toolbar.min.js | 1 + .../plugins/unescaped-markup/index.html | 195 +++ .../prism-unescaped-markup.css | 10 + .../prism-unescaped-markup.js | 44 + .../prism-unescaped-markup.min.js | 1 + .../prism-master/plugins/wpd/index.html | 68 + .../prism-master/plugins/wpd/prism-wpd.css | 11 + .../prism-master/plugins/wpd/prism-wpd.js | 169 +++ .../prism-master/plugins/wpd/prism-wpd.min.js | 1 + docs/_style/prism-master/prefixfree.min.js | 5 + docs/_style/prism-master/prism.js | 917 +++++++++++ docs/_style/prism-master/style.css | 407 +++++ .../_style/prism-master/templates/footer.html | 15 + .../templates/header-download.html | 2 + .../prism-master/templates/header-main.html | 12 + .../templates/header-plugins.html | 8 + docs/_style/prism-master/test-suite.html | 167 +++ docs/_style/prism-master/test.html | 203 +++ .../prism-master/tests/helper/prism-loader.js | 131 ++ .../prism-master/tests/helper/test-case.js | 196 +++ .../tests/helper/test-discovery.js | 115 ++ .../tests/helper/token-stream-transformer.js | 32 + .../tests/languages/abap/comment_feature.test | Bin 0 -> 201 bytes .../languages/abap/eol-comment_feature.test | Bin 0 -> 215 bytes .../tests/languages/abap/keyword_feature.test | Bin 0 -> 31764 bytes .../tests/languages/abap/number_feature.test | Bin 0 -> 224 bytes .../languages/abap/operator_feature.test | Bin 0 -> 902 bytes .../abap/string-template_feature.test | Bin 0 -> 539 bytes .../tests/languages/abap/string_feature.test | Bin 0 -> 330 bytes .../actionscript/keyword_feature.test | Bin 0 -> 2895 bytes .../actionscript/operator_feature.test | Bin 0 -> 1107 bytes .../languages/ada/attr-name_feature.test | Bin 0 -> 275 bytes .../tests/languages/ada/boolean_feature.test | Bin 0 -> 201 bytes .../tests/languages/ada/char_feature.test | Bin 0 -> 186 bytes .../tests/languages/ada/comment_feature.test | Bin 0 -> 207 bytes .../tests/languages/ada/keyword_feature.test | Bin 0 -> 2409 bytes .../tests/languages/ada/number_feature.test | Bin 0 -> 368 bytes .../tests/languages/ada/operator_feature.test | Bin 0 -> 492 bytes .../tests/languages/ada/string_feature.test | Bin 0 -> 216 bytes .../tests/languages/ada/variable_feature.test | Bin 0 -> 212 bytes .../languages/apacheconf/comment_feature.test | Bin 0 -> 370 bytes .../apacheconf/directive-block_feature.test | Bin 0 -> 9557 bytes .../apacheconf/directive-flags_feature.test | Bin 0 -> 228 bytes .../apacheconf/directive-inline_feature.test | Bin 0 -> 35174 bytes .../languages/apacheconf/regex_feature.test | Bin 0 -> 223 bytes .../languages/apacheconf/string_feature.test | Bin 0 -> 370 bytes .../apacheconf/variable_feature.test | Bin 0 -> 266 bytes .../languages/apl/assignment_feature.test | Bin 0 -> 239 bytes .../tests/languages/apl/comment_feature.test | Bin 0 -> 272 bytes .../tests/languages/apl/constant_feature.test | Bin 0 -> 278 bytes .../tests/languages/apl/dfn_feature.test | Bin 0 -> 442 bytes .../apl/dyadic-operator_feature.test | Bin 0 -> 406 bytes .../tests/languages/apl/function_feature.test | Bin 0 -> 1668 bytes .../apl/monadic-operator_feature.test | Bin 0 -> 443 bytes .../tests/languages/apl/number_feature.test | Bin 0 -> 420 bytes .../languages/apl/statement_feature.test | Bin 0 -> 209 bytes .../tests/languages/apl/string_feature.test | Bin 0 -> 240 bytes .../apl/system-function_feature.test | Bin 0 -> 309 bytes .../languages/applescript/class_feature.test | Bin 0 -> 1955 bytes .../applescript/comment_feature.test | Bin 0 -> 405 bytes .../applescript/keyword_feature.test | Bin 0 -> 2742 bytes .../languages/applescript/number_feature.test | Bin 0 -> 258 bytes .../applescript/operator_feature.test | Bin 0 -> 2536 bytes .../languages/applescript/string_feature.test | Bin 0 -> 206 bytes .../tests/languages/arff/comment_feature.test | Bin 0 -> 285 bytes .../tests/languages/arff/keyword_feature.test | Bin 0 -> 285 bytes .../tests/languages/arff/number_feature.test | Bin 0 -> 192 bytes .../tests/languages/arff/string_feature.test | Bin 0 -> 294 bytes .../asciidoc/admonition_feature.test | Bin 0 -> 460 bytes .../asciidoc/attribute-entry_feature.test | Bin 0 -> 1006 bytes .../asciidoc/attributes_feature.test | Bin 0 -> 9311 bytes .../languages/asciidoc/callout_feature.test | Bin 0 -> 608 bytes .../asciidoc/comment-block_feature.test | Bin 0 -> 283 bytes .../languages/asciidoc/comment_feature.test | Bin 0 -> 601 bytes .../languages/asciidoc/entity_feature.js | 4 + .../languages/asciidoc/entity_feature.test | Bin 0 -> 916 bytes .../tests/languages/asciidoc/hr_feature.test | Bin 0 -> 195 bytes .../asciidoc/indented-block_feature.test | Bin 0 -> 599 bytes .../languages/asciidoc/inline_feature.test | Bin 0 -> 11872 bytes .../asciidoc/line-continuation_feature.test | Bin 0 -> 319 bytes .../asciidoc/list-label_feature.test | Bin 0 -> 1240 bytes .../asciidoc/list-punctuation_feature.test | Bin 0 -> 1673 bytes .../asciidoc/literal-block_feature.test | Bin 0 -> 959 bytes .../languages/asciidoc/macro_feature.test | Bin 0 -> 5621 bytes .../asciidoc/other-block_feature.test | Bin 0 -> 829 bytes .../asciidoc/page-break_feature.test | Bin 0 -> 226 bytes .../asciidoc/passthrough-block_feature.test | Bin 0 -> 633 bytes .../asciidoc/replacement_feature.test | Bin 0 -> 1040 bytes .../languages/asciidoc/table_feature.test | Bin 0 -> 1778 bytes .../languages/asciidoc/title_feature.test | Bin 0 -> 1135 bytes .../languages/asm6502/comment_feature.test | Bin 0 -> 146 bytes .../languages/asm6502/directive_feature.test | Bin 0 -> 134 bytes .../languages/asm6502/number_feature.test | Bin 0 -> 263 bytes .../languages/asm6502/opcode_feature.test | Bin 0 -> 201 bytes .../languages/asm6502/register_feature.test | Bin 0 -> 214 bytes .../languages/asm6502/string_feature.test | Bin 0 -> 160 bytes .../languages/aspnet/comment_feature.test | Bin 0 -> 292 bytes .../aspnet/page-directive_feature.test | Bin 0 -> 2105 bytes .../languages/autohotkey/boolean_feature.test | Bin 0 -> 200 bytes .../languages/autohotkey/builtin_feature.test | Bin 0 -> 2644 bytes .../languages/autohotkey/comment_feature.test | Bin 0 -> 201 bytes .../autohotkey/constant_feature.test | Bin 0 -> 6174 bytes .../autohotkey/function_feature.test | Bin 0 -> 256 bytes .../autohotkey/important_feature.test | Bin 0 -> 1602 bytes .../languages/autohotkey/keyword_feature.test | Bin 0 -> 9397 bytes .../languages/autohotkey/number_feature.test | Bin 0 -> 326 bytes .../autohotkey/operator_feature.test | Bin 0 -> 1153 bytes .../autohotkey/selector_feature.test | Bin 0 -> 8038 bytes .../languages/autohotkey/string_feature.test | Bin 0 -> 242 bytes .../languages/autohotkey/symbol_feature.test | Bin 0 -> 5662 bytes .../languages/autohotkey/tag_feature.test | Bin 0 -> 250 bytes .../autohotkey/variable_feature.test | Bin 0 -> 214 bytes .../languages/autoit/boolean_feature.test | Bin 0 -> 201 bytes .../languages/autoit/comment_feature.test | Bin 0 -> 689 bytes .../languages/autoit/directive_feature.test | Bin 0 -> 294 bytes .../languages/autoit/function_feature.test | Bin 0 -> 386 bytes .../languages/autoit/keyword_feature.test | Bin 0 -> 1312 bytes .../languages/autoit/number_feature.test | Bin 0 -> 328 bytes .../languages/autoit/operator_feature.test | Bin 0 -> 609 bytes .../languages/autoit/string_feature.test | Bin 0 -> 652 bytes .../tests/languages/autoit/url_feature.test | Bin 0 -> 298 bytes .../languages/autoit/variable_feature.test | Bin 0 -> 343 bytes .../bash/arithmetic_environment_feature.test | Bin 0 -> 924 bytes .../bash/command_substitution_feature.test | Bin 0 -> 752 bytes .../tests/languages/bash/comment_feature.test | Bin 0 -> 201 bytes .../languages/bash/function_feature.test | Bin 0 -> 7994 bytes .../tests/languages/bash/keyword_feature.test | Bin 0 -> 763 bytes .../tests/languages/bash/shebang_feature.test | Bin 0 -> 183 bytes .../tests/languages/bash/string_feature.test | Bin 0 -> 1300 bytes .../languages/bash/variable_feature.test | Bin 0 -> 240 bytes .../languages/basic/comment_feature.test | Bin 0 -> 240 bytes .../languages/basic/function_feature.test | Bin 0 -> 4922 bytes .../languages/basic/keyword_feature.test | Bin 0 -> 3307 bytes .../tests/languages/basic/number_feature.test | Bin 0 -> 290 bytes .../languages/basic/operator_feature.test | Bin 0 -> 566 bytes .../tests/languages/basic/string_feature.test | Bin 0 -> 210 bytes .../languages/batch/command_feature.test | Bin 0 -> 1992 bytes .../languages/batch/comment_feature.test | Bin 0 -> 295 bytes .../tests/languages/batch/label_feature.test | Bin 0 -> 201 bytes .../tests/languages/bison/c_feature.test | Bin 0 -> 1537 bytes .../languages/bison/comment_feature.test | Bin 0 -> 404 bytes .../languages/bison/keyword_feature.test | Bin 0 -> 373 bytes .../tests/languages/bison/number_feature.test | Bin 0 -> 224 bytes .../languages/bison/property_feature.test | Bin 0 -> 384 bytes .../tests/languages/bison/string_feature.test | Bin 0 -> 486 bytes .../languages/brainfuck/all_feature.test | Bin 0 -> 380 bytes .../tests/languages/bro/builtin_feature.test | Bin 0 -> 478 bytes .../tests/languages/bro/comment_feature.test | Bin 0 -> 344 bytes .../tests/languages/bro/function_feature.test | Bin 0 -> 524 bytes .../tests/languages/bro/keyword_feature.test | Bin 0 -> 1263 bytes .../tests/languages/bro/string_feature.test | Bin 0 -> 386 bytes .../tests/languages/bro/variable_feature.test | Bin 0 -> 577 bytes .../tests/languages/c+pure/c_inclusion.test | Bin 0 -> 543 bytes .../tests/languages/c/constant_feature.test | Bin 0 -> 656 bytes .../tests/languages/c/keyword_feature.test | Bin 0 -> 1533 bytes .../tests/languages/c/macro_feature.test | Bin 0 -> 1127 bytes .../tests/languages/c/number_feature.test | Bin 0 -> 544 bytes .../tests/languages/c/operator_feature.test | Bin 0 -> 1068 bytes .../tests/languages/cil/asm_reference.test | Bin 0 -> 189 bytes .../tests/languages/cil/boolean.test | Bin 0 -> 186 bytes .../tests/languages/cil/comment.test | Bin 0 -> 191 bytes .../tests/languages/cil/instructions.test | Bin 0 -> 7817 bytes .../tests/languages/cil/keywords.test | Bin 0 -> 2787 bytes .../tests/languages/cil/strings.test | Bin 0 -> 184 bytes .../languages/clike/boolean_feature.test | Bin 0 -> 246 bytes .../languages/clike/class-name_feature.test | Bin 0 -> 784 bytes .../languages/clike/comment_feature.test | Bin 0 -> 287 bytes .../languages/clike/function_feature.test | Bin 0 -> 388 bytes .../tests/languages/clike/issue1340.test | Bin 0 -> 242 bytes .../languages/clike/keyword_feature.test | Bin 0 -> 1044 bytes .../tests/languages/clike/number_feature.test | Bin 0 -> 388 bytes .../languages/clike/operator_feature.test | Bin 0 -> 692 bytes .../tests/languages/clike/string_feature.test | Bin 0 -> 638 bytes .../languages/clojure/boolean_feature.test | Bin 0 -> 214 bytes .../languages/clojure/comment_feature.test | Bin 0 -> 257 bytes .../languages/clojure/keyword_feature.test | Bin 0 -> 7093 bytes .../clojure/operator_and_punctuation.test | Bin 0 -> 399 bytes .../languages/clojure/string_feature.test | Bin 0 -> 198 bytes .../coffeescript_inclusion.test | Bin 0 -> 515 bytes .../coffeescript_inclusion.test | Bin 0 -> 322 bytes .../coffeescript/block-regex_feature.test | Bin 0 -> 618 bytes .../coffeescript/class-member_feature.test | Bin 0 -> 224 bytes .../coffeescript/comment_feature.test | Bin 0 -> 309 bytes .../inline-javascript_feature.test | Bin 0 -> 429 bytes .../coffeescript/keyword_feature.test | Bin 0 -> 1663 bytes .../coffeescript/property_feature.test | Bin 0 -> 265 bytes .../coffeescript/string_feature.test | Bin 0 -> 1321 bytes .../languages/cpp+pure/cpp_inclusion.test | Bin 0 -> 306 bytes .../tests/languages/cpp/boolean_feature.test | Bin 0 -> 201 bytes .../languages/cpp/class-name_feature.test | Bin 0 -> 268 bytes .../tests/languages/cpp/keyword_feature.test | Bin 0 -> 2699 bytes .../tests/languages/cpp/operator_feature.test | Bin 0 -> 1299 bytes .../languages/cpp/raw_string_feature.test | Bin 0 -> 370 bytes .../languages/crystal/attribute_feature.test | Bin 0 -> 462 bytes .../languages/crystal/expansion_feature.test | Bin 0 -> 648 bytes .../languages/crystal/keyword_feature.test | Bin 0 -> 1886 bytes .../languages/crystal/number_feature.test | Bin 0 -> 389 bytes .../csharp+aspnet/directive_feature.test | Bin 0 -> 1586 bytes .../languages/csharp/class-name_feature.test | Bin 0 -> 709 bytes .../languages/csharp/generic_feature.test | Bin 0 -> 717 bytes .../tests/languages/csharp/issue1091.test | Bin 0 -> 245 bytes .../tests/languages/csharp/issue1365.test | Bin 0 -> 899 bytes .../tests/languages/csharp/issue1371.test | Bin 0 -> 3408 bytes .../tests/languages/csharp/issue806.test | Bin 0 -> 229 bytes .../languages/csharp/keyword_feature.test | Bin 0 -> 3400 bytes .../languages/csharp/number_feature.test | Bin 0 -> 286 bytes .../languages/csharp/operator_feature.test | Bin 0 -> 1048 bytes .../csharp/preprocessor_feature.test | Bin 0 -> 931 bytes .../languages/csharp/punctuation_feature.test | Bin 0 -> 468 bytes .../languages/csharp/string_feature.test | Bin 0 -> 506 bytes .../csp/directive_no_value_feature.test | Bin 0 -> 254 bytes ...ective_with_source_expression_feature.test | Bin 0 -> 255 bytes .../tests/languages/csp/safe_feature.test | Bin 0 -> 547 bytes .../tests/languages/csp/unsafe_feature.test | Bin 0 -> 391 bytes .../css!+css-extras/entity_feature.test | Bin 0 -> 203 bytes .../css!+css-extras/hexcode_feature.test | Bin 0 -> 279 bytes .../css!+css-extras/number_feature.test | Bin 0 -> 256 bytes .../css!+css-extras/operator_feature.test | Bin 0 -> 1472 bytes .../css!+css-extras/selector_feature.test | Bin 0 -> 1024 bytes .../css!+css-extras/unit_feature.test | Bin 0 -> 400 bytes .../css!+css-extras/variable_feature.test | Bin 0 -> 1049 bytes .../languages/css+haml/css+haml_usage.test | Bin 0 -> 538 bytes .../languages/css+http/css_inclusion.test | Bin 0 -> 461 bytes .../languages/css+textile/css_inclusion.test | Bin 0 -> 3711 bytes .../tests/languages/css/atrule_feature.test | Bin 0 -> 966 bytes .../tests/languages/css/comment_feature.test | Bin 0 -> 309 bytes .../tests/languages/css/function_feature.test | Bin 0 -> 816 bytes .../languages/css/important_feature.test | Bin 0 -> 605 bytes .../tests/languages/css/property_feature.test | Bin 0 -> 585 bytes .../tests/languages/css/selector_feature.test | Bin 0 -> 495 bytes .../tests/languages/css/string_feature.test | Bin 0 -> 438 bytes .../tests/languages/css/url_feature.test | Bin 0 -> 436 bytes .../tests/languages/d/comment_feature.test | Bin 0 -> 576 bytes .../tests/languages/d/keyword_feature.test | Bin 0 -> 4293 bytes .../tests/languages/d/number_feature.test | Bin 0 -> 788 bytes .../tests/languages/d/operator_feature.test | Bin 0 -> 1446 bytes .../tests/languages/d/property_feature.test | Bin 0 -> 420 bytes .../tests/languages/d/register_feature.test | Bin 0 -> 3853 bytes .../tests/languages/d/string_feature.test | Bin 0 -> 1007 bytes .../languages/d/token-string_feature.test | Bin 0 -> 232 bytes .../tests/languages/dart/keyword_feature.test | Bin 0 -> 1755 bytes .../languages/dart/metadata_feature.test | Bin 0 -> 429 bytes .../languages/dart/operator_feature.test | Bin 0 -> 1059 bytes .../tests/languages/dart/string_feature.test | Bin 0 -> 621 bytes .../tests/languages/diff/coord_feature.test | Bin 0 -> 307 bytes .../tests/languages/diff/diff_feature.test | Bin 0 -> 418 bytes .../languages/django/comment_feature.test | Bin 0 -> 336 bytes .../languages/django/property_feature.test | Bin 0 -> 1177 bytes .../languages/docker/comment_feature.test | Bin 0 -> 201 bytes .../languages/docker/keyword_feature.test | Bin 0 -> 1433 bytes .../languages/docker/string_feature.test | Bin 0 -> 367 bytes .../languages/eiffel/boolean_feature.test | Bin 0 -> 201 bytes .../tests/languages/eiffel/char_feature.test | Bin 0 -> 222 bytes .../languages/eiffel/class-name_feature.test | Bin 0 -> 240 bytes .../languages/eiffel/comment_feature.test | Bin 0 -> 254 bytes .../languages/eiffel/keyword_feature.test | Bin 0 -> 1909 bytes .../languages/eiffel/number_feature.test | Bin 0 -> 545 bytes .../languages/eiffel/operator_feature.test | Bin 0 -> 539 bytes .../languages/eiffel/string_feature.test | Bin 0 -> 609 bytes .../tests/languages/elixir/atom_feature.test | Bin 0 -> 232 bytes .../languages/elixir/attr-name_feature.test | Bin 0 -> 573 bytes .../languages/elixir/attribute_feature.test | Bin 0 -> 375 bytes .../languages/elixir/boolean_feature.test | Bin 0 -> 236 bytes .../languages/elixir/capture_feature.test | Bin 0 -> 770 bytes .../languages/elixir/comment_feature.test | Bin 0 -> 262 bytes .../tests/languages/elixir/issue1392.test | Bin 0 -> 318 bytes .../tests/languages/elixir/issue775.test | Bin 0 -> 336 bytes .../languages/elixir/keyword_feature.test | Bin 0 -> 996 bytes .../languages/elixir/number_feature.test | Bin 0 -> 491 bytes .../languages/elixir/operator_feature.test | Bin 0 -> 918 bytes .../tests/languages/elixir/regex_feature.test | Bin 0 -> 629 bytes .../languages/elixir/string_feature.test | Bin 0 -> 1828 bytes .../tests/languages/elm/builtin_feature.test | Bin 0 -> 1273 bytes .../tests/languages/elm/char_feature.test | Bin 0 -> 276 bytes .../tests/languages/elm/comment_feature.test | Bin 0 -> 252 bytes .../tests/languages/elm/constant_feature.test | Bin 0 -> 254 bytes .../languages/elm/hvariable_feature.test | Bin 0 -> 258 bytes .../elm/import_statement_feature.test | Bin 0 -> 964 bytes .../tests/languages/elm/keyword_feature.test | Bin 0 -> 530 bytes .../tests/languages/elm/number_feature.test | Bin 0 -> 352 bytes .../tests/languages/elm/operator_feature.test | Bin 0 -> 956 bytes .../tests/languages/elm/string_feature.test | Bin 0 -> 404 bytes .../tests/languages/erb/erb_feature.test | Bin 0 -> 709 bytes .../languages/erb/erb_in_markup_feature.test | Bin 0 -> 940 bytes .../tests/languages/erlang/atom_feature.test | Bin 0 -> 299 bytes .../languages/erlang/boolean_feature.test | Bin 0 -> 201 bytes .../languages/erlang/comment_feature.test | Bin 0 -> 180 bytes .../languages/erlang/function_feature.test | Bin 0 -> 416 bytes .../languages/erlang/keyword_feature.test | Bin 0 -> 410 bytes .../languages/erlang/number_feature.test | Bin 0 -> 383 bytes .../languages/erlang/operator_feature.test | Bin 0 -> 920 bytes .../languages/erlang/string_feature.test | Bin 0 -> 206 bytes .../languages/erlang/variable_feature.test | Bin 0 -> 262 bytes .../flow/flow-punctuation_feature.test | Bin 0 -> 289 bytes .../flow/function-variable_feature.test | Bin 0 -> 690 bytes .../tests/languages/flow/keyword_feature.test | Bin 0 -> 656 bytes .../tests/languages/flow/type_feature.test | Bin 0 -> 460 bytes .../fortran+pure/fortran_inclusion.test | Bin 0 -> 327 bytes .../languages/fortran/boolean_feature.test | Bin 0 -> 208 bytes .../languages/fortran/comment_feature.test | Bin 0 -> 306 bytes .../languages/fortran/keyword_feature.test | Bin 0 -> 3315 bytes .../languages/fortran/number_feature.test | Bin 0 -> 702 bytes .../languages/fortran/operator_feature.test | Bin 0 -> 864 bytes .../languages/fortran/string_feature.test | Bin 0 -> 601 bytes .../languages/fsharp/annotation_feature.test | Bin 0 -> 670 bytes .../languages/fsharp/class-name_feature.test | Bin 0 -> 3602 bytes .../languages/fsharp/comment_feature.test | Bin 0 -> 287 bytes .../computation-expression_feature.test | Bin 0 -> 503 bytes .../tests/languages/fsharp/issue1480.test | Bin 0 -> 837 bytes .../languages/fsharp/keyword_feature.test | Bin 0 -> 3345 bytes .../languages/fsharp/number_feature.test | Bin 0 -> 1008 bytes .../languages/fsharp/operator_feature.test | Bin 0 -> 2059 bytes .../fsharp/preprocessor_feature.test | Bin 0 -> 516 bytes .../languages/fsharp/string_feature.test | Bin 0 -> 768 bytes .../languages/gcode/checksum_feature.test | Bin 0 -> 185 bytes .../languages/gcode/comment_feature.test | Bin 0 -> 347 bytes .../languages/gcode/keyword_feature.test | Bin 0 -> 304 bytes .../languages/gcode/property_feature.test | Bin 0 -> 338 bytes .../tests/languages/gcode/string_feature.test | Bin 0 -> 296 bytes .../tests/languages/gedcom/level_feature.test | Bin 0 -> 340 bytes .../languages/gedcom/line-value_feature.test | Bin 0 -> 839 bytes .../languages/gedcom/pointer_feature.test | Bin 0 -> 500 bytes .../tests/languages/gedcom/tag_feature.test | Bin 0 -> 410 bytes .../languages/gherkin/atrule_feature.test | Bin 0 -> 24704 bytes .../languages/gherkin/comment_feature.test | Bin 0 -> 241 bytes .../languages/gherkin/feature_feature.test | Bin 0 -> 9142 bytes .../languages/gherkin/outline_feature.test | Bin 0 -> 185 bytes .../languages/gherkin/pystring_feature.test | Bin 0 -> 278 bytes .../languages/gherkin/scenario_feature.test | Bin 0 -> 28671 bytes .../languages/gherkin/string_feature.test | Bin 0 -> 491 bytes .../languages/gherkin/table_feature.test | Bin 0 -> 950 bytes .../tests/languages/gherkin/tag_feature.test | Bin 0 -> 291 bytes .../tests/languages/git/command_feature.test | Bin 0 -> 430 bytes .../tests/languages/git/comment_feature.test | Bin 0 -> 415 bytes .../languages/git/commit_sha1_feature.test | Bin 0 -> 501 bytes .../tests/languages/git/coord_feature.test | Bin 0 -> 259 bytes .../tests/languages/git/diff_feature.test | Bin 0 -> 957 bytes .../tests/languages/git/string_feature.test | Bin 0 -> 284 bytes .../tests/languages/glsl/comment_feature.test | Bin 0 -> 327 bytes .../tests/languages/glsl/keyword_feature.test | Bin 0 -> 7520 bytes .../tests/languages/glsl/number_feature.test | Bin 0 -> 462 bytes .../languages/glsl/preprocessor_feature.test | Bin 0 -> 658 bytes .../tests/languages/go/boolean_feature.test | Bin 0 -> 290 bytes .../tests/languages/go/builtin_feature.test | Bin 0 -> 1250 bytes .../tests/languages/go/keyword_feature.test | Bin 0 -> 927 bytes .../tests/languages/go/number_feature.test | Bin 0 -> 771 bytes .../tests/languages/go/operator_feature.test | Bin 0 -> 1008 bytes .../tests/languages/go/string_feature.test | Bin 0 -> 617 bytes .../languages/graphql/attr-name_feature.test | Bin 0 -> 496 bytes .../languages/graphql/boolean_feature.test | Bin 0 -> 201 bytes .../languages/graphql/comment_feature.test | Bin 0 -> 201 bytes .../languages/graphql/directive_feature.test | Bin 0 -> 214 bytes .../languages/graphql/keyword_feature.test | Bin 0 -> 406 bytes .../languages/graphql/number_feature.test | Bin 0 -> 332 bytes .../languages/graphql/string_feature.test | Bin 0 -> 262 bytes .../languages/graphql/variable_feature.test | Bin 0 -> 214 bytes .../languages/groovy/annotation_feature.test | Bin 0 -> 368 bytes .../tests/languages/groovy/issue1049.js | 8 + .../languages/groovy/keyword_feature.test | Bin 0 -> 1958 bytes .../languages/groovy/number_feature.test | Bin 0 -> 824 bytes .../languages/groovy/operator_feature.test | Bin 0 -> 1410 bytes .../languages/groovy/shebang_feature.test | Bin 0 -> 248 bytes .../languages/groovy/spock-block_feature.test | Bin 0 -> 443 bytes .../groovy/string-interpolation_feature.js | 28 + .../languages/groovy/string_feature.test | Bin 0 -> 1062 bytes .../tests/languages/haml/code_feature.test | Bin 0 -> 453 bytes .../tests/languages/haml/doctype_feature.test | Bin 0 -> 242 bytes .../languages/haml/interpolation_feature.test | Bin 0 -> 384 bytes .../haml/multiline-code_feature.test | Bin 0 -> 1988 bytes .../haml/multiline-comment_feature.test | Bin 0 -> 747 bytes .../tests/languages/haml/tag_feature.test | Bin 0 -> 3134 bytes .../handlebars+pug/handlebars_inclusion.test | Bin 0 -> 284 bytes .../languages/handlebars/block_feature.test | Bin 0 -> 696 bytes .../languages/handlebars/boolean_feature.test | Bin 0 -> 355 bytes .../languages/handlebars/comment_feature.test | Bin 0 -> 437 bytes .../handlebars_in_markup_feature.test | Bin 0 -> 1071 bytes .../languages/handlebars/number_feature.test | Bin 0 -> 691 bytes .../languages/handlebars/string_feature.test | Bin 0 -> 559 bytes .../languages/haskell/builtin_feature.test | Bin 0 -> 7150 bytes .../tests/languages/haskell/char_feature.test | Bin 0 -> 249 bytes .../languages/haskell/comment_feature.test | Bin 0 -> 252 bytes .../languages/haskell/constant_feature.test | Bin 0 -> 254 bytes .../languages/haskell/hvariable_feature.test | Bin 0 -> 258 bytes .../haskell/import_statement_feature.test | Bin 0 -> 662 bytes .../languages/haskell/keyword_feature.test | Bin 0 -> 684 bytes .../languages/haskell/number_feature.test | Bin 0 -> 385 bytes .../languages/haskell/operator_feature.test | Bin 0 -> 1069 bytes .../languages/haskell/string_feature.test | Bin 0 -> 342 bytes .../tests/languages/haxe/keyword_feature.test | Bin 0 -> 1459 bytes .../languages/haxe/metadata_feature.test | Bin 0 -> 345 bytes .../languages/haxe/operator_feature.test | Bin 0 -> 723 bytes .../languages/haxe/preprocessor_feature.test | Bin 0 -> 298 bytes .../tests/languages/haxe/regex_feature.test | Bin 0 -> 344 bytes .../languages/haxe/reification_feature.test | Bin 0 -> 308 bytes .../tests/languages/haxe/string_feature.test | Bin 0 -> 642 bytes .../languages/hpkp/safe_maxage_feature.test | Bin 0 -> 232 bytes .../languages/hpkp/sha256_pin_feature.test | Bin 0 -> 296 bytes .../languages/hpkp/unsafe_maxage_feature.test | Bin 0 -> 227 bytes .../hsts/include_subdomains_feature.test | Bin 0 -> 233 bytes .../tests/languages/hsts/preload_feature.test | Bin 0 -> 203 bytes .../languages/hsts/safe_maxage_feature.test | Bin 0 -> 232 bytes .../languages/hsts/unsafe_maxage_feature.test | Bin 0 -> 227 bytes .../languages/http/header-name_feature.test | Bin 0 -> 662 bytes .../languages/http/request-line_feature.test | Bin 0 -> 1311 bytes .../http/response-status_feature.test | Bin 0 -> 554 bytes .../languages/ichigojam/comment_feature.test | Bin 0 -> 289 bytes .../languages/ichigojam/function_feature.test | Bin 0 -> 841 bytes .../languages/ichigojam/keyword_feature.test | Bin 0 -> 1615 bytes .../languages/ichigojam/label_feature.test | Bin 0 -> 206 bytes .../languages/ichigojam/number_feature.test | Bin 0 -> 378 bytes .../languages/ichigojam/operator_feature.test | Bin 0 -> 598 bytes .../languages/ichigojam/string_feature.test | Bin 0 -> 210 bytes .../icon/builtin-keyword_feature.test | Bin 0 -> 1890 bytes .../tests/languages/icon/comment_feature.test | Bin 0 -> 201 bytes .../languages/icon/directive_feature.test | Bin 0 -> 372 bytes .../languages/icon/function_feature.test | Bin 0 -> 406 bytes .../tests/languages/icon/keyword_feature.test | Bin 0 -> 1030 bytes .../tests/languages/icon/number_feature.test | Bin 0 -> 476 bytes .../languages/icon/operator_feature.test | Bin 0 -> 1881 bytes .../tests/languages/icon/string_feature.test | Bin 0 -> 347 bytes .../languages/inform7/comment_feature.test | Bin 0 -> 233 bytes .../languages/inform7/keyword_feature.test | Bin 0 -> 1509 bytes .../languages/inform7/number_feature.test | Bin 0 -> 572 bytes .../languages/inform7/position_feature.test | Bin 0 -> 1308 bytes .../languages/inform7/property_feature.test | Bin 0 -> 3063 bytes .../languages/inform7/string_feature.test | Bin 0 -> 1425 bytes .../languages/inform7/title_feature.test | Bin 0 -> 451 bytes .../languages/inform7/variable_feature.test | Bin 0 -> 2188 bytes .../tests/languages/inform7/verb_feature.test | Bin 0 -> 3406 bytes .../tests/languages/ini/comment_feature.test | Bin 0 -> 201 bytes .../languages/ini/key_value_feature.test | Bin 0 -> 342 bytes .../tests/languages/ini/selector_feature.test | Bin 0 -> 221 bytes .../tests/languages/io/comment_feature.test | Bin 0 -> 314 bytes .../tests/languages/io/number_feature.test | Bin 0 -> 321 bytes .../tests/languages/io/operator_feature.test | Bin 0 -> 1158 bytes .../tests/languages/io/string_feature.test | Bin 0 -> 484 bytes .../tests/languages/j/adverb_feature.test | Bin 0 -> 380 bytes .../tests/languages/j/comment_feature.test | Bin 0 -> 211 bytes .../languages/j/conjunction_feature.test | Bin 0 -> 892 bytes .../tests/languages/j/keyword_feature.test | Bin 0 -> 1240 bytes .../tests/languages/j/number_feature.test | Bin 0 -> 1227 bytes .../tests/languages/j/string_feature.test | Bin 0 -> 204 bytes .../tests/languages/j/verb_feature.test | Bin 0 -> 1971 bytes .../languages/java/function_featrue.test | Bin 0 -> 556 bytes .../languages/java/generics_feature.test | Bin 0 -> 1451 bytes .../tests/languages/java/issue1351.test | Bin 0 -> 682 bytes .../tests/languages/java/keyword_feature.test | Bin 0 -> 2045 bytes .../tests/languages/java/module_feature.test | Bin 0 -> 2906 bytes .../tests/languages/java/number_feature.test | Bin 0 -> 836 bytes .../languages/java/operator_feature.test | Bin 0 -> 1044 bytes .../tests/languages/java/package_feature.test | Bin 0 -> 1354 bytes .../javascript+haml/javascript_inclusion.test | Bin 0 -> 466 bytes .../javascript+http/javascript_inclusion.test | Bin 0 -> 419 bytes .../languages/javascript/boolean_feature.test | Bin 0 -> 201 bytes .../javascript/class-method_feature.test | Bin 0 -> 1066 bytes .../javascript/constant_feature.test | Bin 0 -> 399 bytes .../javascript/function-variable_feature.test | Bin 0 -> 2105 bytes .../javascript/function_feature.test | Bin 0 -> 987 bytes .../tests/languages/javascript/issue1337.test | Bin 0 -> 291 bytes .../tests/languages/javascript/issue1340.test | Bin 0 -> 369 bytes .../tests/languages/javascript/issue1397.test | Bin 0 -> 426 bytes .../tests/languages/javascript/issue1526.test | Bin 0 -> 813 bytes .../languages/javascript/keyword_feature.test | Bin 0 -> 2806 bytes .../languages/javascript/number_feature.test | Bin 0 -> 650 bytes .../javascript/operator_feature.test | Bin 0 -> 1138 bytes .../languages/javascript/regex_feature.test | Bin 0 -> 881 bytes .../javascript/supposed-classes_feature.test | Bin 0 -> 574 bytes .../javascript/supposed-function_feature.test | Bin 0 -> 781 bytes .../javascript/template-string_feature.test | Bin 0 -> 1131 bytes .../javascript/try-catch_feature.test | Bin 0 -> 453 bytes .../javastacktrace/more_feature.test | Bin 0 -> 393 bytes .../javastacktrace/stack-frame_feature.test | Bin 0 -> 1484 bytes .../javastacktrace/summary_feature.test | Bin 0 -> 3566 bytes .../languages/jolie/deployment_features.test | Bin 0 -> 1191 bytes .../languages/jolie/keyword_feature.test | Bin 0 -> 2384 bytes .../tests/languages/jolie/number_feature.test | Bin 0 -> 297 bytes .../languages/jolie/operator_feature.test | Bin 0 -> 786 bytes .../json+http/json-suffix_inclusion.test | Bin 0 -> 449 bytes .../languages/json+http/json_inclusion.test | Bin 0 -> 417 bytes .../tests/languages/json/boolean_feature.test | Bin 0 -> 201 bytes .../tests/languages/json/comment_feature.test | Bin 0 -> 531 bytes .../tests/languages/json/null_feature.test | Bin 0 -> 163 bytes .../tests/languages/json/number_feature.test | Bin 0 -> 420 bytes .../languages/json/operator_feature.test | Bin 0 -> 161 bytes .../languages/json/property_feature.test | Bin 0 -> 633 bytes .../languages/json/punctuation_feature.test | Bin 0 -> 407 bytes .../tests/languages/json/string_feature.test | Bin 0 -> 548 bytes .../tests/languages/jsx/issue1103.test | Bin 0 -> 565 bytes .../tests/languages/jsx/issue1235.test | Bin 0 -> 592 bytes .../tests/languages/jsx/issue1236.test | Bin 0 -> 511 bytes .../tests/languages/jsx/issue1294.test | Bin 0 -> 1416 bytes .../tests/languages/jsx/issue1335.test | Bin 0 -> 2728 bytes .../tests/languages/jsx/issue1342.test | Bin 0 -> 1090 bytes .../tests/languages/jsx/issue1356.test | Bin 0 -> 568 bytes .../tests/languages/jsx/issue1364.test | Bin 0 -> 498 bytes .../tests/languages/jsx/issue1408.test | Bin 0 -> 811 bytes .../tests/languages/jsx/issue1421.test | Bin 0 -> 1372 bytes .../languages/jsx/plain-text_feature.test | Bin 0 -> 991 bytes .../tests/languages/jsx/tag_feature.test | Bin 0 -> 1513 bytes .../languages/julia/boolean_feature.test | Bin 0 -> 201 bytes .../languages/julia/comment_feature.test | Bin 0 -> 201 bytes .../languages/julia/keyword_feature.test | Bin 0 -> 1204 bytes .../tests/languages/julia/number_feature.test | Bin 0 -> 551 bytes .../languages/julia/operator_feature.test | Bin 0 -> 1219 bytes .../tests/languages/julia/string_feature.test | Bin 0 -> 504 bytes .../languages/keyman/atrule_feature.test | Bin 0 -> 370 bytes .../tests/languages/keyman/bold_feature.test | Bin 0 -> 1676 bytes .../languages/keyman/comment_feature.test | Bin 0 -> 210 bytes .../languages/keyman/function_feature.test | Bin 0 -> 784 bytes .../languages/keyman/keyword_feature.test | Bin 0 -> 715 bytes .../languages/keyman/number_feature.test | Bin 0 -> 376 bytes .../languages/keyman/operator_feature.test | Bin 0 -> 282 bytes .../languages/keyman/string_feature.test | Bin 0 -> 284 bytes .../tests/languages/keyman/tag_feature.test | Bin 0 -> 320 bytes .../languages/kotlin/annotation_feature.test | Bin 0 -> 538 bytes .../languages/kotlin/function_feature.test | Bin 0 -> 426 bytes .../kotlin/interpolation_feature.test | Bin 0 -> 1038 bytes .../languages/kotlin/keyword_feature.test | Bin 0 -> 2201 bytes .../tests/languages/kotlin/label_feature.test | Bin 0 -> 288 bytes .../languages/kotlin/number_feature.test | Bin 0 -> 658 bytes .../languages/kotlin/operator_feature.test | Bin 0 -> 1045 bytes .../languages/kotlin/raw-string_feature.test | Bin 0 -> 343 bytes .../tests/languages/latex/cdata_feature.test | Bin 0 -> 719 bytes .../languages/latex/comment_feature.test | Bin 0 -> 201 bytes .../languages/latex/equation_feature.test | Bin 0 -> 3826 bytes .../languages/latex/headline_feature.test | Bin 0 -> 1382 bytes .../languages/latex/keyword_feature.test | Bin 0 -> 1035 bytes .../tests/languages/latex/url_feature.test | Bin 0 -> 265 bytes .../languages/less+haml/less_inclusion.test | Bin 0 -> 638 bytes .../languages/less+pug/less_inclusion.test | Bin 0 -> 326 bytes .../tests/languages/less/atrule_feature.test | Bin 0 -> 469 bytes .../tests/languages/less/comment_feature.test | Bin 0 -> 312 bytes .../languages/less/operator_feature.test | Bin 0 -> 235 bytes .../languages/less/property_feature.test | Bin 0 -> 487 bytes .../languages/less/selector_feature.test | Bin 0 -> 539 bytes .../languages/liquid/function_feature.test | Bin 0 -> 1991 bytes .../languages/liquid/keyword_feature.test | Bin 0 -> 985 bytes .../languages/liquid/number_feature.test | Bin 0 -> 470 bytes .../languages/liquid/operator_feature.test | Bin 0 -> 969 bytes .../tests/languages/lisp/boolean_feature.test | Bin 0 -> 444 bytes .../tests/languages/lisp/car_feature.test | Bin 0 -> 282 bytes .../tests/languages/lisp/comment_feature.test | Bin 0 -> 174 bytes .../tests/languages/lisp/declare_feature.test | Bin 0 -> 405 bytes .../tests/languages/lisp/defun_feature.test | Bin 0 -> 2491 bytes .../tests/languages/lisp/defvar_feature.test | Bin 0 -> 1099 bytes .../tests/languages/lisp/heading_feature.test | Bin 0 -> 176 bytes .../languages/lisp/interactive_feature.test | Bin 0 -> 441 bytes .../tests/languages/lisp/keyword_feature.test | Bin 0 -> 2597 bytes .../tests/languages/lisp/lambda-feature.test | Bin 0 -> 547 bytes .../languages/lisp/lisp-property_feature.test | Bin 0 -> 239 bytes .../tests/languages/lisp/number_boolean.test | Bin 0 -> 793 bytes .../languages/lisp/punctuation_feature.test | Bin 0 -> 323 bytes .../languages/lisp/quoted-symbol_feature.test | Bin 0 -> 275 bytes .../tests/languages/lisp/splice_feature.test | Bin 0 -> 253 bytes .../tests/languages/lisp/string_feature.test | Bin 0 -> 505 bytes .../livescript/argument_feature.test | Bin 0 -> 248 bytes .../languages/livescript/boolean_feature.test | Bin 0 -> 316 bytes .../languages/livescript/comment_feature.test | Bin 0 -> 281 bytes .../livescript/identifier_feature.test | Bin 0 -> 456 bytes .../livescript/interpolated-string.test | Bin 0 -> 1393 bytes .../livescript/keyword-operator_feature.test | Bin 0 -> 1064 bytes .../languages/livescript/keyword_feature.test | Bin 0 -> 1360 bytes .../languages/livescript/number_feature.test | Bin 0 -> 486 bytes .../livescript/operator_feature.test | Bin 0 -> 1763 bytes .../languages/livescript/regex_feature.test | Bin 0 -> 418 bytes .../languages/livescript/string_feature.test | Bin 0 -> 546 bytes .../languages/lolcode/boolean_feature.test | Bin 0 -> 197 bytes .../languages/lolcode/comment_feature.test | Bin 0 -> 269 bytes .../languages/lolcode/function_feature.test | Bin 0 -> 333 bytes .../languages/lolcode/keyword_feature.test | Bin 0 -> 1498 bytes .../languages/lolcode/label_feature.test | Bin 0 -> 280 bytes .../languages/lolcode/number_feature.test | Bin 0 -> 198 bytes .../languages/lolcode/operator_feature.test | Bin 0 -> 698 bytes .../languages/lolcode/string_feature.test | Bin 0 -> 608 bytes .../languages/lolcode/symbol_feature.test | Bin 0 -> 673 bytes .../languages/lolcode/variable_feature.test | Bin 0 -> 168 bytes .../tests/languages/lua/comment_feature.test | Bin 0 -> 422 bytes .../tests/languages/lua/function_feature.test | Bin 0 -> 468 bytes .../tests/languages/lua/keyword_feature.test | Bin 0 -> 783 bytes .../tests/languages/lua/number_feature.test | Bin 0 -> 558 bytes .../tests/languages/lua/operator_feature.test | Bin 0 -> 623 bytes .../tests/languages/lua/string_feature.test | Bin 0 -> 635 bytes .../languages/makefile/builtin_feature.test | Bin 0 -> 362 bytes .../languages/makefile/comment_feature.test | Bin 0 -> 249 bytes .../languages/makefile/keyword_feature.test | Bin 0 -> 4019 bytes .../languages/makefile/operator_feature.test | Bin 0 -> 331 bytes .../languages/makefile/string_feature.test | Bin 0 -> 387 bytes .../languages/makefile/symbol_feature.test | Bin 0 -> 368 bytes .../languages/makefile/variable_feature.test | Bin 0 -> 390 bytes .../markdown+haml/markdown_inclusion.test | Bin 0 -> 638 bytes .../markdown+pug/markdown_inclusion.test | Bin 0 -> 301 bytes .../markdown/blockquote_feature.test | Bin 0 -> 272 bytes .../languages/markdown/bold_feature.test | Bin 0 -> 1300 bytes .../languages/markdown/code_feature.test | Bin 0 -> 675 bytes .../tests/languages/markdown/hr_feature.test | Bin 0 -> 211 bytes .../languages/markdown/italic_feature.test | Bin 0 -> 694 bytes .../languages/markdown/list_feature.test | Bin 0 -> 375 bytes .../languages/markdown/strike_feature.test | Bin 0 -> 1104 bytes .../languages/markdown/title_feature.test | Bin 0 -> 917 bytes .../markdown/url-reference_feature.test | Bin 0 -> 1296 bytes .../tests/languages/markdown/url_feature.test | Bin 0 -> 419 bytes .../markup!+css+javascript/issue1240.test | Bin 0 -> 692 bytes .../languages/markup!+css/css_inclusion.test | Bin 0 -> 1188 bytes .../javascript_inclusion.test | Bin 0 -> 983 bytes .../markup+actionscript/xml_feature.test | Bin 0 -> 1070 bytes .../markup+css+wiki/table-tag_feature.test | Bin 0 -> 3086 bytes .../languages/markup+haml/markup_feature.test | Bin 0 -> 244 bytes .../languages/markup+http/html_inclusion.test | Bin 0 -> 471 bytes .../markup+http/xml-suffix_inclusion.test | Bin 0 -> 546 bytes .../languages/markup+http/xml_inclusion.test | Bin 0 -> 496 bytes .../script_feature.test | Bin 0 -> 1047 bytes .../markup+php/php_in_markup_feature.test | Bin 0 -> 2322 bytes .../languages/markup+pug/markup_feature.test | Bin 0 -> 475 bytes .../markup+tt2/tt2_in_markup_feature.test | Bin 0 -> 1475 bytes .../tests/languages/markup/cdata_feature.test | Bin 0 -> 321 bytes .../languages/markup/comment_feature.test | Bin 0 -> 343 bytes .../languages/markup/doctype_feature.test | Bin 0 -> 600 bytes .../tests/languages/markup/entity_feature.js | 4 + .../languages/markup/entity_feature.test | Bin 0 -> 304 bytes .../tests/languages/markup/issue585.test | Bin 0 -> 1154 bytes .../tests/languages/markup/issue888.test | Bin 0 -> 348 bytes .../languages/markup/prolog_feature.test | Bin 0 -> 482 bytes .../markup/tag_attribute_feature.test | Bin 0 -> 1790 bytes .../tests/languages/markup/tag_feature.test | Bin 0 -> 1255 bytes .../languages/matlab/comment_feature.test | Bin 0 -> 367 bytes .../languages/matlab/function_feature.test | Bin 0 -> 296 bytes .../languages/matlab/keyword_feature.test | Bin 0 -> 715 bytes .../languages/matlab/number_feature.test | Bin 0 -> 384 bytes .../languages/matlab/operator_feature.test | Bin 0 -> 735 bytes .../languages/matlab/string_feature.test | Bin 0 -> 232 bytes .../tests/languages/mel/code_feature.test | Bin 0 -> 268 bytes .../tests/languages/mel/comment_feature.test | Bin 0 -> 205 bytes .../tests/languages/mel/flag_feature.test | Bin 0 -> 216 bytes .../tests/languages/mel/function_feature.test | Bin 0 -> 56864 bytes .../tests/languages/mel/keyword_feature.test | Bin 0 -> 720 bytes .../tests/languages/mel/number_feature.test | Bin 0 -> 236 bytes .../tests/languages/mel/operator_feature.test | Bin 0 -> 664 bytes .../tests/languages/mel/string_feature.test | Bin 0 -> 210 bytes .../tests/languages/mel/variable_feature.test | Bin 0 -> 246 bytes .../languages/mizar/comment_feature.test | Bin 0 -> 180 bytes .../languages/mizar/keyword_feature.test | Bin 0 -> 4149 bytes .../tests/languages/mizar/number_feature.test | Bin 0 -> 210 bytes .../languages/mizar/operator_feature.test | Bin 0 -> 267 bytes .../languages/mizar/parameter_feature.test | Bin 0 -> 397 bytes .../languages/mizar/variable_feature.test | Bin 0 -> 362 bytes .../languages/monkey/comment_feature.test | Bin 0 -> 405 bytes .../languages/monkey/function_feature.test | Bin 0 -> 310 bytes .../languages/monkey/keyword_feature.test | Bin 0 -> 1971 bytes .../languages/monkey/number_feature.test | Bin 0 -> 280 bytes .../languages/monkey/operator_feature.test | Bin 0 -> 905 bytes .../monkey/preprocessor_feature.test | Bin 0 -> 274 bytes .../languages/monkey/string_feature.test | Bin 0 -> 214 bytes .../languages/monkey/type-char_feature.test | Bin 0 -> 301 bytes .../languages/n4js/annotation_feature.test | Bin 0 -> 1186 bytes .../tests/languages/n4js/keyword_feature.test | Bin 0 -> 2063 bytes .../tests/languages/nasm/comment_feature.test | Bin 0 -> 195 bytes .../tests/languages/nasm/keyword_feature.test | Bin 0 -> 672 bytes .../tests/languages/nasm/label_feature.test | Bin 0 -> 232 bytes .../tests/languages/nasm/number_feature.test | Bin 0 -> 1364 bytes .../languages/nasm/operator_feature.test | Bin 0 -> 448 bytes .../languages/nasm/register_feature.test | Bin 0 -> 1509 bytes .../tests/languages/nasm/string_feature.test | Bin 0 -> 322 bytes .../languages/nginx/comment_feature.test | Bin 0 -> 201 bytes .../languages/nginx/keyword_feature.test | Bin 0 -> 18094 bytes .../languages/nginx/variable_feature.test | Bin 0 -> 216 bytes .../tests/languages/nim/comment_feature.test | Bin 0 -> 201 bytes .../tests/languages/nim/function_feature.test | Bin 0 -> 397 bytes .../tests/languages/nim/keyword_feature.test | Bin 0 -> 1904 bytes .../tests/languages/nim/number_feature.test | Bin 0 -> 537 bytes .../tests/languages/nim/operator_feature.test | Bin 0 -> 964 bytes .../tests/languages/nim/string_feature.test | Bin 0 -> 631 bytes .../languages/nix/antiquotation_feature.test | Bin 0 -> 267 bytes .../tests/languages/nix/boolean_feature.test | Bin 0 -> 201 bytes .../tests/languages/nix/comment_feature.test | Bin 0 -> 281 bytes .../tests/languages/nix/function_feature.test | Bin 0 -> 2421 bytes .../tests/languages/nix/keyword_feature.test | Bin 0 -> 440 bytes .../tests/languages/nix/number_feature.test | Bin 0 -> 219 bytes .../tests/languages/nix/operator_feature.test | Bin 0 -> 541 bytes .../tests/languages/nix/string_feature.test | Bin 0 -> 1036 bytes .../tests/languages/nix/url_feature.test | Bin 0 -> 454 bytes .../tests/languages/nsis/comment_feature.test | Bin 0 -> 293 bytes .../languages/nsis/constant_feature.test | Bin 0 -> 515 bytes .../languages/nsis/important_feature.test | Bin 0 -> 1483 bytes .../tests/languages/nsis/keyword_feature.test | Bin 0 -> 9732 bytes .../tests/languages/nsis/number_feature.test | Bin 0 -> 322 bytes .../languages/nsis/operator_feature.test | Bin 0 -> 619 bytes .../languages/nsis/property_feature.test | Bin 0 -> 3456 bytes .../tests/languages/nsis/string_feature.test | Bin 0 -> 295 bytes .../languages/nsis/variable_feature.test | Bin 0 -> 240 bytes .../languages/objectivec/keyword_feature.test | Bin 0 -> 1837 bytes .../objectivec/operator_feature.test | Bin 0 -> 784 bytes .../languages/objectivec/string_feature.test | Bin 0 -> 480 bytes .../languages/ocaml/boolean_feature.test | Bin 0 -> 201 bytes .../languages/ocaml/comment_feature.test | Bin 0 -> 221 bytes .../languages/ocaml/directive_feature.test | Bin 0 -> 250 bytes .../languages/ocaml/keyword_feature.test | Bin 0 -> 1561 bytes .../tests/languages/ocaml/number_feature.test | Bin 0 -> 434 bytes .../languages/ocaml/operator_feature.test | Bin 0 -> 813 bytes .../tests/languages/ocaml/string_feature.test | Bin 0 -> 400 bytes .../tests/languages/ocaml/type_feature.test | Bin 0 -> 254 bytes .../languages/opencl+c/boolean_feature.test | Bin 0 -> 277 bytes .../languages/opencl+c/constant_feature.test | Bin 0 -> 33514 bytes .../languages/opencl+c/function_feature.test | Bin 0 -> 7784 bytes .../languages/opencl+c/type_feature.test | Bin 0 -> 5499 bytes .../languages/opencl+cpp/type_feature.test | Bin 0 -> 2094 bytes .../languages/opencl/constant_feature.test | Bin 0 -> 5031 bytes .../languages/opencl/function_feature.test | Bin 0 -> 16186 bytes .../languages/opencl/keyword_feature.test | Bin 0 -> 7452 bytes .../tests/languages/oz/atom_feature.test | Bin 0 -> 239 bytes .../tests/languages/oz/attr-name_feature.test | Bin 0 -> 397 bytes .../tests/languages/oz/comment_feature.test | Bin 0 -> 281 bytes .../tests/languages/oz/function_feature.test | Bin 0 -> 317 bytes .../tests/languages/oz/keyword_feature.test | Bin 0 -> 1528 bytes .../tests/languages/oz/number_feature.test | Bin 0 -> 512 bytes .../tests/languages/oz/operator_feature.test | Bin 0 -> 967 bytes .../tests/languages/oz/string_feature.test | Bin 0 -> 254 bytes .../tests/languages/oz/variable_feature.test | Bin 0 -> 232 bytes .../languages/parigp/comment_feature.test | Bin 0 -> 289 bytes .../languages/parigp/function_feature.test | Bin 0 -> 350 bytes .../languages/parigp/keyword_feature.test | Bin 0 -> 1789 bytes .../languages/parigp/number_feature.test | Bin 0 -> 652 bytes .../languages/parigp/operator_feature.test | Bin 0 -> 2185 bytes .../languages/parigp/string_feature.test | Bin 0 -> 210 bytes .../languages/parser/boolean_feature.test | Bin 0 -> 374 bytes .../languages/parser/escape_feature.test | Bin 0 -> 968 bytes .../languages/parser/expression_feature.test | Bin 0 -> 1123 bytes .../languages/parser/function_feature.test | Bin 0 -> 1383 bytes .../languages/parser/keyword_feature.test | Bin 0 -> 1338 bytes .../languages/parser/number_feature.test | Bin 0 -> 924 bytes .../languages/parser/operator_feature.test | Bin 0 -> 4744 bytes .../parser/parser-comment_feature.test | Bin 0 -> 343 bytes .../languages/parser/string_feature.test | Bin 0 -> 840 bytes .../languages/parser/variable_feature.test | Bin 0 -> 1294 bytes .../languages/pascal/comment_feature.test | Bin 0 -> 377 bytes .../languages/pascal/keyword_feature.test | Bin 0 -> 4306 bytes .../languages/pascal/number_feature.test | Bin 0 -> 427 bytes .../languages/pascal/operator_feature.test | Bin 0 -> 951 bytes .../languages/pascal/string_feature.test | Bin 0 -> 328 bytes .../tests/languages/perl/comment_feature.test | Bin 0 -> 268 bytes .../languages/perl/filehandle_feature.test | Bin 0 -> 277 bytes .../languages/perl/function_feature.test | Bin 0 -> 264 bytes .../tests/languages/perl/keyword_feature.test | Bin 0 -> 1095 bytes .../tests/languages/perl/number_feature.test | Bin 0 -> 520 bytes .../languages/perl/operator_feature.test | Bin 0 -> 2505 bytes .../tests/languages/perl/regex_feature.test | Bin 0 -> 1982 bytes .../tests/languages/perl/string_feature.test | Bin 0 -> 1923 bytes .../languages/perl/variable_feature.test | Bin 0 -> 588 bytes .../tests/languages/perl/vstring_feature.test | Bin 0 -> 201 bytes .../php!+php-extras/global_feature.test | Bin 0 -> 681 bytes .../php!+php-extras/scope_feature.test | Bin 0 -> 594 bytes .../php!+php-extras/this_feature.test | Bin 0 -> 166 bytes .../tests/languages/php/comment_feature.test | Bin 0 -> 377 bytes .../tests/languages/php/constant_feature.test | Bin 0 -> 240 bytes .../languages/php/delimiter_feature.test | Bin 0 -> 367 bytes .../tests/languages/php/keyword_feature.test | Bin 0 -> 2243 bytes .../tests/languages/php/package_feature.test | Bin 0 -> 643 bytes .../tests/languages/php/property_feature.test | Bin 0 -> 427 bytes .../languages/php/shell-comment_feature.test | Bin 0 -> 224 bytes .../php/string-interpolation_feature.test | Bin 0 -> 4371 bytes .../tests/languages/php/string_feature.test | Bin 0 -> 1178 bytes .../tests/languages/php/variable_feature.test | Bin 0 -> 368 bytes .../languages/plsql/comment_feature.test | Bin 0 -> 279 bytes .../languages/plsql/keyword_feature.test | Bin 0 -> 7282 bytes .../languages/plsql/operator_feature.test | Bin 0 -> 172 bytes .../languages/powershell/boolean_feature.test | Bin 0 -> 328 bytes .../languages/powershell/comment_feature.test | Bin 0 -> 439 bytes .../powershell/function_feature.test | Bin 0 -> 14316 bytes .../tests/languages/powershell/issue1407.test | Bin 0 -> 905 bytes .../languages/powershell/keyword_feature.test | Bin 0 -> 1230 bytes .../powershell/namespace_feature.test | Bin 0 -> 547 bytes .../powershell/operator_feature.test | Bin 0 -> 1325 bytes .../languages/powershell/string_feature.test | Bin 0 -> 1649 bytes .../powershell/variable_feature.test | Bin 0 -> 333 bytes .../processing/constant_feature.test | Bin 0 -> 218 bytes .../processing/function_feature.test | Bin 0 -> 259 bytes .../languages/processing/keyword_feature.test | Bin 0 -> 1018 bytes .../processing/operator_feature.test | Bin 0 -> 703 bytes .../languages/processing/type_feature.test | Bin 0 -> 428 bytes .../languages/prolog/builtin_feature.test | Bin 0 -> 313 bytes .../languages/prolog/comment_feature.test | Bin 0 -> 258 bytes .../languages/prolog/function_feature.test | Bin 0 -> 330 bytes .../languages/prolog/number_feature.test | Bin 0 -> 220 bytes .../languages/prolog/operator_feature.test | Bin 0 -> 655 bytes .../languages/prolog/string_feature.test | Bin 0 -> 451 bytes .../languages/prolog/variable_feature.test | Bin 0 -> 248 bytes .../languages/properties/comment_feature.test | Bin 0 -> 279 bytes .../properties/key_value_feature.test | Bin 0 -> 748 bytes .../languages/protobuf/keyword_feature.test | Bin 0 -> 691 bytes .../languages/protobuf/string_feature.test | Bin 0 -> 388 bytes .../tests/languages/pug/code_feature.test | Bin 0 -> 590 bytes .../tests/languages/pug/comment_feature.test | Bin 0 -> 333 bytes .../tests/languages/pug/doctype_feature.test | Bin 0 -> 358 bytes .../languages/pug/flow-control_feature.test | Bin 0 -> 1265 bytes .../tests/languages/pug/keyword_feature.test | Bin 0 -> 501 bytes .../tests/languages/pug/mixin_feature.test | Bin 0 -> 563 bytes .../pug/multiline-plain-text_feature.test | Bin 0 -> 446 bytes .../pug/multiline-script_feature.test | Bin 0 -> 1082 bytes .../languages/pug/plain-text_feature.test | Bin 0 -> 288 bytes .../tests/languages/pug/script_feature.test | Bin 0 -> 745 bytes .../tests/languages/pug/tag_feature.test | Bin 0 -> 1881 bytes .../languages/puppet/attr-name_feature.test | Bin 0 -> 399 bytes .../languages/puppet/boolean_feature.test | Bin 0 -> 201 bytes .../languages/puppet/comment_feature.test | Bin 0 -> 413 bytes .../languages/puppet/datatype_feature.test | Bin 0 -> 1079 bytes .../languages/puppet/function_feature.test | Bin 0 -> 681 bytes .../languages/puppet/heredoc_feature.test | Bin 0 -> 1202 bytes .../puppet/interpolation_feature.test | Bin 0 -> 1789 bytes .../languages/puppet/keyword_feature.test | Bin 0 -> 764 bytes .../languages/puppet/number_feature.test | Bin 0 -> 382 bytes .../languages/puppet/operator_feature.test | Bin 0 -> 869 bytes .../tests/languages/puppet/regex_feature.test | Bin 0 -> 685 bytes .../languages/puppet/string_feature.test | Bin 0 -> 805 bytes .../languages/puppet/variable_feature.test | Bin 0 -> 355 bytes .../tests/languages/pure/comment_feature.test | Bin 0 -> 332 bytes .../languages/pure/function_feature.test | Bin 0 -> 11298 bytes .../tests/languages/pure/keyword_feature.test | Bin 0 -> 1723 bytes .../tests/languages/pure/number_feature.test | Bin 0 -> 448 bytes .../languages/pure/operator_feature.test | Bin 0 -> 905 bytes .../tests/languages/pure/special_feature.test | Bin 0 -> 259 bytes .../tests/languages/pure/string_feature.test | Bin 0 -> 210 bytes .../languages/python/boolean_feature.test | Bin 0 -> 230 bytes .../languages/python/builtin_feature.test | Bin 0 -> 2629 bytes .../languages/python/class-name_feature.test | Bin 0 -> 326 bytes .../languages/python/comment_feature.test | Bin 0 -> 201 bytes .../languages/python/decorator_feature.test | Bin 0 -> 454 bytes .../languages/python/function_feature.test | Bin 0 -> 478 bytes .../tests/languages/python/issue1355.test | Bin 0 -> 523 bytes .../languages/python/keyword_feature.test | Bin 0 -> 1138 bytes .../languages/python/number_feature.test | Bin 0 -> 459 bytes .../languages/python/operator_feature.test | Bin 0 -> 800 bytes .../python/string-interpolation_feature.test | Bin 0 -> 2820 bytes .../languages/python/string_feature.test | Bin 0 -> 485 bytes .../python/triple-quoted-string_feature.test | Bin 0 -> 443 bytes .../tests/languages/q/adverb_feature.test | Bin 0 -> 331 bytes .../tests/languages/q/comment_feature.test | Bin 0 -> 381 bytes .../tests/languages/q/datetime_feature.test | Bin 0 -> 908 bytes .../tests/languages/q/keyword_feature.test | Bin 0 -> 5445 bytes .../tests/languages/q/number_feature.test | Bin 0 -> 665 bytes .../tests/languages/q/string_feature.test | Bin 0 -> 210 bytes .../tests/languages/q/symbol_feature.test | Bin 0 -> 290 bytes .../tests/languages/q/verb_feature.test | Bin 0 -> 1055 bytes .../tests/languages/qore/boolean_feature.test | Bin 0 -> 201 bytes .../tests/languages/qore/comment_feature.test | Bin 0 -> 355 bytes .../languages/qore/function_feature.test | Bin 0 -> 386 bytes .../tests/languages/qore/keyword_feature.test | Bin 0 -> 2458 bytes .../tests/languages/qore/number_feature.test | Bin 0 -> 342 bytes .../languages/qore/operator_feature.test | Bin 0 -> 1063 bytes .../tests/languages/qore/string_feature.test | Bin 0 -> 287 bytes .../languages/qore/variable_feature.test | Bin 0 -> 258 bytes .../tests/languages/r/boolean_feature.test | Bin 0 -> 201 bytes .../tests/languages/r/comment_feature.test | Bin 0 -> 201 bytes .../tests/languages/r/ellipsis_feature.test | Bin 0 -> 251 bytes .../tests/languages/r/keyword_feature.test | Bin 0 -> 615 bytes .../tests/languages/r/number_feature.test | Bin 0 -> 656 bytes .../tests/languages/r/operator_feature.test | Bin 0 -> 748 bytes .../languages/r/percent-operator_feature.test | Bin 0 -> 435 bytes .../tests/languages/r/string_feature.test | Bin 0 -> 307 bytes .../languages/reason/character_feature.test | Bin 0 -> 311 bytes .../languages/reason/class-name_feature.test | Bin 0 -> 351 bytes .../languages/reason/comment_feature.test | Bin 0 -> 377 bytes .../languages/reason/constructor_feature.test | Bin 0 -> 242 bytes .../languages/reason/keyword_feature.test | Bin 0 -> 1582 bytes .../tests/languages/reason/label_feature.test | Bin 0 -> 253 bytes .../languages/reason/operator_feature.test | Bin 0 -> 972 bytes .../languages/reason/string_feature.test | Bin 0 -> 210 bytes .../rest/command-line-option_feature.test | Bin 0 -> 1090 bytes .../tests/languages/rest/comment_feature.test | Bin 0 -> 374 bytes .../languages/rest/directive_feature.test | Bin 0 -> 555 bytes .../languages/rest/doctest-block_feature.test | Bin 0 -> 321 bytes .../tests/languages/rest/field_feature.test | Bin 0 -> 376 bytes .../tests/languages/rest/hr_feature.test | Bin 0 -> 1175 bytes .../tests/languages/rest/inline_feature.test | Bin 0 -> 1687 bytes .../languages/rest/link-target_feature.test | Bin 0 -> 1493 bytes .../tests/languages/rest/link_feature.test | Bin 0 -> 965 bytes .../languages/rest/list-bullet_feature.test | Bin 0 -> 880 bytes .../languages/rest/literal-block_feature.test | Bin 0 -> 424 bytes .../rest/quoted-literal-block_feature.test | Bin 0 -> 6548 bytes .../rest/substitution-def_feature.test | Bin 0 -> 1231 bytes .../tests/languages/rest/table_feature.test | Bin 0 -> 1573 bytes .../tests/languages/rest/title_feature.test | Bin 0 -> 6890 bytes .../tests/languages/rip/boolean_feature.test | Bin 0 -> 201 bytes .../tests/languages/rip/builtin_feature.test | Bin 0 -> 197 bytes .../languages/rip/character_feature.test | Bin 0 -> 222 bytes .../tests/languages/rip/comment_feature.test | Bin 0 -> 201 bytes .../languages/rip/date_time_feature.test | Bin 0 -> 427 bytes .../tests/languages/rip/keyword_feature.test | Bin 0 -> 503 bytes .../tests/languages/rip/number_feature.test | Bin 0 -> 314 bytes .../languages/rip/reference_feature.test | Bin 0 -> 208 bytes .../tests/languages/rip/regex_feature.test | Bin 0 -> 315 bytes .../tests/languages/rip/string_feature.test | Bin 0 -> 307 bytes .../tests/languages/rip/symbol_feature.test | Bin 0 -> 242 bytes .../languages/roboconf/comment_feature.test | Bin 0 -> 201 bytes .../languages/roboconf/component_feature.test | Bin 0 -> 362 bytes .../languages/roboconf/keyword_feature.test | Bin 0 -> 435 bytes .../languages/roboconf/optional_feature.test | Bin 0 -> 188 bytes .../languages/roboconf/property_feature.test | Bin 0 -> 408 bytes .../languages/roboconf/value_feature.test | Bin 0 -> 647 bytes .../languages/roboconf/wildcard_feature.test | Bin 0 -> 229 bytes .../tests/languages/ruby/builtin_feature.test | Bin 0 -> 1194 bytes .../tests/languages/ruby/comment_feature.test | Bin 0 -> 364 bytes .../languages/ruby/constant_feature.test | Bin 0 -> 330 bytes .../tests/languages/ruby/issue1336.test | Bin 0 -> 312 bytes .../tests/languages/ruby/keyword_feature.test | Bin 0 -> 1647 bytes .../ruby/method_definition_feature.test | Bin 0 -> 1643 bytes .../tests/languages/ruby/regex_feature.test | Bin 0 -> 1209 bytes .../tests/languages/ruby/string_feature.test | Bin 0 -> 6038 bytes .../tests/languages/ruby/symbol_feature.test | Bin 0 -> 258 bytes .../languages/ruby/variable_feature.test | Bin 0 -> 398 bytes .../languages/rust/attribute_feature.test | Bin 0 -> 239 bytes .../tests/languages/rust/char_feature.test | Bin 0 -> 190 bytes .../rust/closure-params_feature.test | Bin 0 -> 580 bytes .../tests/languages/rust/comment_feature.test | Bin 0 -> 285 bytes .../languages/rust/function_feature.test | Bin 0 -> 511 bytes .../tests/languages/rust/issue1339.test | Bin 0 -> 1145 bytes .../tests/languages/rust/issue1353.test | Bin 0 -> 316 bytes .../tests/languages/rust/keyword_feature.test | Bin 0 -> 1628 bytes .../rust/lifetime-annotation_feature.test | Bin 0 -> 308 bytes .../languages/rust/macro-rules_feature.test | Bin 0 -> 265 bytes .../tests/languages/rust/number_feature.test | Bin 0 -> 816 bytes .../languages/rust/operator_feature.test | Bin 0 -> 899 bytes .../tests/languages/rust/string_feature.test | Bin 0 -> 568 bytes .../tests/languages/sas/comment_feature.test | Bin 0 -> 310 bytes .../languages/sas/datalines_feature.test | Bin 0 -> 701 bytes .../tests/languages/sas/datetime_feature.test | Bin 0 -> 316 bytes .../tests/languages/sas/keyword_feature.test | Bin 0 -> 343 bytes .../tests/languages/sas/number_feature.test | Bin 0 -> 354 bytes .../tests/languages/sas/operator_feature.test | Bin 0 -> 928 bytes .../tests/languages/sas/string_feature.test | Bin 0 -> 380 bytes .../languages/sass/atrule-line_feature.test | Bin 0 -> 543 bytes .../tests/languages/sass/comment_feature.test | Bin 0 -> 348 bytes .../languages/sass/property-line_feature.test | Bin 0 -> 968 bytes .../languages/sass/selector_feature.test | Bin 0 -> 431 bytes .../languages/sass/variable-line_feature.test | Bin 0 -> 545 bytes .../languages/scala/builtin_feature.test | Bin 0 -> 545 bytes .../languages/scala/keyword_feature.test | Bin 0 -> 1291 bytes .../tests/languages/scala/number_feature.test | Bin 0 -> 412 bytes .../tests/languages/scala/string_feature.test | Bin 0 -> 606 bytes .../tests/languages/scala/symbol_feature.test | Bin 0 -> 238 bytes .../languages/scheme/boolean_feature.test | Bin 0 -> 191 bytes .../languages/scheme/builtin_feature.test | Bin 0 -> 1931 bytes .../languages/scheme/character_feature.test | Bin 0 -> 302 bytes .../languages/scheme/comment_feature.test | Bin 0 -> 201 bytes .../languages/scheme/function_feature.test | Bin 0 -> 758 bytes .../tests/languages/scheme/issue1331.test | Bin 0 -> 386 bytes .../languages/scheme/keyword_feature.test | Bin 0 -> 2131 bytes .../languages/scheme/number_feature.test | Bin 0 -> 665 bytes .../languages/scheme/operator_feature.test | Bin 0 -> 665 bytes .../languages/scheme/string_feature.test | Bin 0 -> 369 bytes .../languages/scss+haml/scss_inclusion.test | Bin 0 -> 780 bytes .../languages/scss+pug/scss_inclusion.test | Bin 0 -> 301 bytes .../tests/languages/scss/atrule_feature.test | Bin 0 -> 385 bytes .../tests/languages/scss/boolean_feature.test | Bin 0 -> 201 bytes .../tests/languages/scss/comment_feature.test | Bin 0 -> 287 bytes .../tests/languages/scss/keyword_feature.test | Bin 0 -> 736 bytes .../tests/languages/scss/null_feature.test | Bin 0 -> 163 bytes .../languages/scss/operator_feature.test | Bin 0 -> 1101 bytes .../languages/scss/placeholder_feature.test | Bin 0 -> 266 bytes .../languages/scss/property_feature.test | Bin 0 -> 840 bytes .../languages/scss/selector_feature.test | Bin 0 -> 860 bytes .../languages/scss/statement_feature.test | Bin 0 -> 427 bytes .../tests/languages/scss/url_feature.test | Bin 0 -> 365 bytes .../languages/scss/variable_feature.test | Bin 0 -> 372 bytes .../smalltalk/block-arguments_feature.test | Bin 0 -> 446 bytes .../smalltalk/character_feature.test | Bin 0 -> 251 bytes .../languages/smalltalk/comment_feature.test | Bin 0 -> 237 bytes .../languages/smalltalk/keyword_feature.test | Bin 0 -> 303 bytes .../languages/smalltalk/number_feature.test | Bin 0 -> 378 bytes .../languages/smalltalk/operator_feature.test | Bin 0 -> 658 bytes .../languages/smalltalk/string_feature.test | Bin 0 -> 228 bytes .../languages/smalltalk/symbol_feature.test | Bin 0 -> 319 bytes .../temporary-variables_feature.test | Bin 0 -> 488 bytes .../languages/smarty/attr-name_feature.test | Bin 0 -> 624 bytes .../languages/smarty/comment_feature.test | Bin 0 -> 249 bytes .../languages/smarty/function_feature.test | Bin 0 -> 775 bytes .../languages/smarty/keyword_feature.test | Bin 0 -> 875 bytes .../languages/smarty/number_feature.test | Bin 0 -> 742 bytes .../languages/smarty/operator_feature.test | Bin 0 -> 4032 bytes .../smarty/smarty_in_markup_feature.test | Bin 0 -> 951 bytes .../languages/smarty/string_feature.test | Bin 0 -> 551 bytes .../languages/smarty/variable_feature.test | Bin 0 -> 1057 bytes .../tests/languages/soy/boolean_feature.test | Bin 0 -> 525 bytes .../tests/languages/soy/command-arg.test | Bin 0 -> 1721 bytes .../tests/languages/soy/comment_feature.test | Bin 0 -> 551 bytes .../tests/languages/soy/function_feature.test | Bin 0 -> 1895 bytes .../tests/languages/soy/keyword_feature.test | Bin 0 -> 6261 bytes .../tests/languages/soy/literal_feature.test | Bin 0 -> 1368 bytes .../tests/languages/soy/number_feature.test | Bin 0 -> 1264 bytes .../tests/languages/soy/operator_feature.test | Bin 0 -> 2544 bytes .../languages/soy/parameter_feature.test | Bin 0 -> 1347 bytes .../tests/languages/soy/property_feature.test | Bin 0 -> 1332 bytes .../languages/soy/soy_in_markup_feature.test | Bin 0 -> 1164 bytes .../tests/languages/soy/string_feature.test | Bin 0 -> 1040 bytes .../tests/languages/soy/variable_feature.test | Bin 0 -> 1978 bytes .../tests/languages/sql/boolean_feature.test | Bin 0 -> 230 bytes .../tests/languages/sql/comment_feature.test | Bin 0 -> 391 bytes .../tests/languages/sql/function_feature.test | Bin 0 -> 936 bytes .../tests/languages/sql/keyword_feature.test | Bin 0 -> 12265 bytes .../tests/languages/sql/number_feature.test | Bin 0 -> 256 bytes .../tests/languages/sql/operator_feature.test | Bin 0 -> 1020 bytes .../tests/languages/sql/string_feature.test | Bin 0 -> 463 bytes .../tests/languages/sql/variable_feature.test | Bin 0 -> 448 bytes .../stylus+pug/stylus_inclusion.test | Bin 0 -> 363 bytes .../stylus/atrule-declaration_feature.test | Bin 0 -> 763 bytes .../languages/stylus/boolean_feature.test | Bin 0 -> 367 bytes .../languages/stylus/comment_feature.test | Bin 0 -> 285 bytes .../tests/languages/stylus/func_feature.test | Bin 0 -> 989 bytes .../languages/stylus/hexcode_feature.test | Bin 0 -> 647 bytes .../languages/stylus/important_feature.test | Bin 0 -> 435 bytes .../languages/stylus/keyword_feature.test | Bin 0 -> 1004 bytes .../languages/stylus/number_feature.test | Bin 0 -> 610 bytes .../languages/stylus/operator_feature.test | Bin 0 -> 4690 bytes .../stylus/property-declaration_feature.test | Bin 0 -> 1053 bytes .../languages/stylus/selector_feature.test | Bin 0 -> 1119 bytes .../languages/stylus/string_feature.test | Bin 0 -> 648 bytes .../tests/languages/stylus/url_feature.test | Bin 0 -> 447 bytes .../stylus/variable-declaration_feature.test | Bin 0 -> 600 bytes .../tests/languages/swift/atrule_feature.test | Bin 0 -> 649 bytes .../languages/swift/builtin_feature.test | Bin 0 -> 2410 bytes .../languages/swift/constant_feature.test | Bin 0 -> 298 bytes .../languages/swift/keyword_feature.test | Bin 0 -> 2763 bytes .../tests/languages/swift/number_feature.test | Bin 0 -> 471 bytes .../tests/languages/swift/string_feature.test | Bin 0 -> 882 bytes .../tests/languages/tap/bail_out_feature.test | Bin 0 -> 303 bytes .../languages/tap/directive_feature.test | Bin 0 -> 350 bytes .../languages/tap/pass_fail_feature.test | Bin 0 -> 410 bytes .../tests/languages/tap/plan_feature.test | Bin 0 -> 207 bytes .../tests/languages/tap/pragma_feature.test | Bin 0 -> 219 bytes .../tests/languages/tap/version_feature.test | Bin 0 -> 181 bytes .../tests/languages/tap/yamlish_feature.test | Bin 0 -> 1140 bytes .../tests/languages/tcl/builtin_feature.test | Bin 0 -> 598 bytes .../tests/languages/tcl/comment_feature.test | Bin 0 -> 201 bytes .../tests/languages/tcl/function_feature.test | Bin 0 -> 324 bytes .../tests/languages/tcl/keyword_feature.test | Bin 0 -> 3655 bytes .../tests/languages/tcl/operator_feature.test | Bin 0 -> 772 bytes .../tests/languages/tcl/scope_feature.test | Bin 0 -> 234 bytes .../tests/languages/tcl/string_feature.test | Bin 0 -> 263 bytes .../tests/languages/tcl/variable_feature.test | Bin 0 -> 678 bytes .../languages/textile/acronym_feature.test | Bin 0 -> 441 bytes .../languages/textile/block-tag_feature.test | Bin 0 -> 2408 bytes .../languages/textile/footnote_feature.test | Bin 0 -> 334 bytes .../languages/textile/image_feature.test | Bin 0 -> 1507 bytes .../languages/textile/inline_feature.test | Bin 0 -> 8150 bytes .../languages/textile/link-ref_feature.test | Bin 0 -> 495 bytes .../tests/languages/textile/link_feature.test | Bin 0 -> 1020 bytes .../tests/languages/textile/list_feature.test | Bin 0 -> 802 bytes .../tests/languages/textile/mark_feature.test | Bin 0 -> 423 bytes .../languages/textile/table_feature.test | Bin 0 -> 5885 bytes .../tests/languages/toml/boolean_feature.test | Bin 0 -> 190 bytes .../tests/languages/toml/comment_feature.test | Bin 0 -> 209 bytes .../tests/languages/toml/date_feature.test | Bin 0 -> 631 bytes .../tests/languages/toml/key_feature.test | Bin 0 -> 742 bytes .../tests/languages/toml/number_feature.test | Bin 0 -> 1019 bytes .../tests/languages/toml/string_feature.test | Bin 0 -> 399 bytes .../tests/languages/toml/table_feature.test | Bin 0 -> 331 bytes .../tests/languages/tsx/tag_feature.test | Bin 0 -> 2083 bytes .../tests/languages/tt2/comment_feature.test | Bin 0 -> 831 bytes .../languages/tt2/delimiter_feature.test | Bin 0 -> 414 bytes .../tests/languages/tt2/keyword_feature.test | Bin 0 -> 4967 bytes .../tests/languages/tt2/operator_feature.test | Bin 0 -> 2324 bytes .../tt2/string-interpolation_feature.test | Bin 0 -> 359 bytes .../tests/languages/tt2/string_feature.test | Bin 0 -> 893 bytes .../tests/languages/tt2/variable_feature.test | Bin 0 -> 613 bytes .../languages/twig+pug/twig_inclusion.test | Bin 0 -> 362 bytes .../tests/languages/twig/boolean_feature.test | Bin 0 -> 531 bytes .../tests/languages/twig/comment_feature.test | Bin 0 -> 260 bytes .../tests/languages/twig/keyword_feature.test | Bin 0 -> 1454 bytes .../tests/languages/twig/number_feature.test | Bin 0 -> 928 bytes .../languages/twig/operator_feature.test | Bin 0 -> 5147 bytes .../tests/languages/twig/string_feature.test | Bin 0 -> 815 bytes .../languages/typescript/builtin_feature.test | Bin 0 -> 506 bytes .../languages/typescript/keyword_feature.test | Bin 0 -> 2189 bytes .../languages/vala/class-name_feature.test | Bin 0 -> 769 bytes .../tests/languages/vala/keyword_feature.test | Bin 0 -> 3009 bytes .../tests/languages/vala/number_feature.test | Bin 0 -> 444 bytes .../languages/vala/operator_feature.test | Bin 0 -> 1099 bytes .../languages/vala/punctuation_feature.test | Bin 0 -> 388 bytes .../tests/languages/vala/string_feature.test | Bin 0 -> 899 bytes .../languages/vbnet/comment_feature.test | Bin 0 -> 297 bytes .../languages/vbnet/keyword_feature.test | Bin 0 -> 7170 bytes .../languages/velocity/directive_feature.test | Bin 0 -> 9619 bytes .../languages/velocity/unparsed_feature.test | Bin 0 -> 566 bytes .../languages/velocity/variable_feature.test | Bin 0 -> 3382 bytes .../velocity/velocity-comment_feature.test | Bin 0 -> 387 bytes .../languages/verilog/comment_feature.test | Bin 0 -> 285 bytes .../languages/verilog/constant_feature.test | Bin 0 -> 229 bytes .../languages/verilog/function_feature.test | Bin 0 -> 386 bytes .../languages/verilog/important_feature.test | Bin 0 -> 501 bytes .../languages/verilog/keyword_feature.test | Bin 0 -> 7508 bytes .../languages/verilog/number_feature.test | Bin 0 -> 556 bytes .../languages/verilog/operator_feature.test | Bin 0 -> 1333 bytes .../languages/verilog/property_feature.test | Bin 0 -> 233 bytes .../languages/verilog/string_feature.test | Bin 0 -> 257 bytes .../tests/languages/vhdl/boolean_feature.test | Bin 0 -> 201 bytes .../tests/languages/vhdl/comment_feature.test | Bin 0 -> 211 bytes .../languages/vhdl/constant_feature.test | Bin 0 -> 206 bytes .../languages/vhdl/function_feature.test | Bin 0 -> 877 bytes .../tests/languages/vhdl/keyword_feature.test | Bin 0 -> 4133 bytes .../tests/languages/vhdl/number_feature.test | Bin 0 -> 526 bytes .../languages/vhdl/operator_feature.test | Bin 0 -> 811 bytes .../tests/languages/vhdl/string_feature.test | Bin 0 -> 257 bytes .../languages/vhdl/vhdl-vectors_feature.test | Bin 0 -> 385 bytes .../tests/languages/vim/builtin_feature.test | Bin 0 -> 39853 bytes .../tests/languages/vim/comment_feature.test | Bin 0 -> 203 bytes .../tests/languages/vim/function_feature.test | Bin 0 -> 370 bytes .../tests/languages/vim/keyword_feature.test | Bin 0 -> 25627 bytes .../tests/languages/vim/number_feature.test | Bin 0 -> 236 bytes .../tests/languages/vim/operator_feature.test | Bin 0 -> 1116 bytes .../tests/languages/vim/string_feature.test | Bin 0 -> 303 bytes .../visual-basic/boolean_feature.test | Bin 0 -> 236 bytes .../visual-basic/comment_feature.test | Bin 0 -> 459 bytes .../languages/visual-basic/date_feature.test | Bin 0 -> 456 bytes .../visual-basic/directive_feature.test | Bin 0 -> 863 bytes .../visual-basic/keyword_feature.test | Bin 0 -> 5008 bytes .../visual-basic/number_feature.test | Bin 0 -> 584 bytes .../visual-basic/operator_feature.test | Bin 0 -> 845 bytes .../visual-basic/string_feature.test | Bin 0 -> 591 bytes .../tests/languages/wasm/comment_feature.test | Bin 0 -> 385 bytes .../tests/languages/wasm/keyword_feature.test | Bin 0 -> 11810 bytes .../tests/languages/wasm/number_feature.test | Bin 0 -> 1080 bytes .../tests/languages/wasm/string_feature.test | Bin 0 -> 448 bytes .../languages/wasm/variable_feature.test | Bin 0 -> 307 bytes .../languages/wiki/block-comment_feature.test | Bin 0 -> 278 bytes .../languages/wiki/emphasis_feature.test | Bin 0 -> 482 bytes .../tests/languages/wiki/heading_feature.test | Bin 0 -> 865 bytes .../tests/languages/wiki/hr_feature.test | Bin 0 -> 198 bytes .../tests/languages/wiki/nowiki_feature.test | Bin 0 -> 1101 bytes .../tests/languages/wiki/symbol_feature.test | Bin 0 -> 319 bytes .../tests/languages/wiki/url_feature.test | Bin 0 -> 670 bytes .../languages/wiki/variable_feature.test | Bin 0 -> 368 bytes .../languages/xeora/constant_feature.test | Bin 0 -> 354 bytes .../xeora/directive-block-close_feature.test | Bin 0 -> 283 bytes .../xeora/directive-block-open_feature.test | Bin 0 -> 1553 bytes .../directive-block-separator_feature.test | Bin 0 -> 310 bytes .../xeora/directive-inline_feature.test | Bin 0 -> 814 bytes .../xeora/function-block_feature.test | Bin 0 -> 963 bytes .../xeora/function-inline_feature.test | Bin 0 -> 721 bytes .../languages/xeora/variable_feature.test | Bin 0 -> 1191 bytes .../tests/languages/xojo/comment_feature.test | Bin 0 -> 293 bytes .../tests/languages/xojo/keyword_feature.test | Bin 0 -> 1957 bytes .../tests/languages/xojo/number_feature.test | Bin 0 -> 439 bytes .../languages/xojo/operator_feature.test | Bin 0 -> 735 bytes .../tests/languages/xojo/string_feature.test | Bin 0 -> 250 bytes .../tests/languages/xojo/symbol_feature.test | Bin 0 -> 323 bytes .../tests/languages/xquery/axis_feature.test | Bin 0 -> 1161 bytes .../languages/xquery/builtin_feature.test | Bin 0 -> 2640 bytes .../languages/xquery/extension_feature.test | Bin 0 -> 216 bytes .../languages/xquery/function_feature.test | Bin 0 -> 1026 bytes .../xquery/keyword-operator_feature.test | Bin 0 -> 802 bytes .../languages/xquery/keyword_feature.test | Bin 0 -> 2056 bytes .../languages/xquery/number_feature.test | Bin 0 -> 258 bytes .../languages/xquery/operator_feature.test | Bin 0 -> 531 bytes .../languages/xquery/plain-text_feature.test | Bin 0 -> 1485 bytes .../languages/xquery/string_feature.test | Bin 0 -> 399 bytes .../tests/languages/xquery/tag_feature.test | Bin 0 -> 2706 bytes .../languages/xquery/variable_feature.test | Bin 0 -> 264 bytes .../xquery/xquery-attribute_feature.test | Bin 0 -> 399 bytes .../xquery/xquery-comment_feature.test | Bin 0 -> 394 bytes .../xquery/xquery-element_feature.test | Bin 0 -> 382 bytes .../tests/languages/yaml/boolean_feature.test | Bin 0 -> 322 bytes .../tests/languages/yaml/comment_feature.test | Bin 0 -> 201 bytes .../languages/yaml/datetime_feature.test | Bin 0 -> 836 bytes .../languages/yaml/directive_feature.test | Bin 0 -> 215 bytes .../languages/yaml/important_feature.test | Bin 0 -> 283 bytes .../tests/languages/yaml/key_feature.test | Bin 0 -> 305 bytes .../tests/languages/yaml/null_feature.test | Bin 0 -> 310 bytes .../tests/languages/yaml/number_feature.test | Bin 0 -> 854 bytes .../tests/languages/yaml/scalar_feature.test | Bin 0 -> 427 bytes .../tests/languages/yaml/string_feature.test | Bin 0 -> 694 bytes .../tests/languages/yaml/tag_feature.test | Bin 0 -> 217 bytes docs/_style/prism-master/tests/run.js | 45 + .../prism-master/tests/testrunner-tests.js | 166 ++ docs/_style/prism-master/themes/prism-coy.css | 225 +++ .../_style/prism-master/themes/prism-dark.css | 128 ++ .../prism-master/themes/prism-funky.css | 116 ++ .../prism-master/themes/prism-okaidia.css | 122 ++ .../themes/prism-solarizedlight.css | 149 ++ .../prism-master/themes/prism-tomorrow.css | 121 ++ .../prism-master/themes/prism-twilight.css | 198 +++ docs/_style/prism-master/themes/prism.css | 138 ++ docs/_style/prism-master/utopia.js | 463 ++++++ .../prism-master/vendor/FileSaver.min.js | 2 + docs/_style/prism-master/vendor/jszip.min.js | 15 + docs/_style/prism-master/vendor/promise.js | 5 + docs/_style/style.css | 81 + docs/index.html | 397 +++++ .../01. 考虑使用é™æ€å·¥åŽ‚方法替代构造方法.md | 67 + ...02. 当构造方法å‚数过多时使用builder模å¼.md | 287 ++++ ...使用ç§æœ‰æž„造方法或枚类实现Singleton属性.md | 59 + .../notes/04. 使用ç§æœ‰æž„造方法执行éžå®žä¾‹åŒ–.md | 23 + ...赖注入å–代硬连接资æº(hardwiring resources).md | 62 + docs/notes/06. é¿å…创建ä¸å¿…è¦çš„对象.md | 77 + docs/notes/07. 消除过期的对象引用.md | 75 + .../08. é¿å…使用Finalizerå’ŒCleaner机制.md | 98 ++ ...try-with-resources语å¥æ›¿ä»£try-finally语å¥.md | 91 ++ .../notes/10. é‡å†™equals方法时éµå®ˆé€šç”¨çº¦å®š.md | 377 +++++ ...‡å†™equals方法时åŒæ—¶ä¹Ÿè¦é‡å†™hashcode方法.md | 128 ++ docs/notes/12. 始终é‡å†™ toString 方法.md | 74 + docs/notes/13. 谨慎地é‡å†™ clone 方法.md | 209 +++ docs/notes/14. 考虑实现Comparable接å£.md | 140 ++ docs/notes/15. 使类和æˆå‘˜çš„å¯è®¿é—®æ€§æœ€å°åŒ–.md | 69 + ...6. 在公共类中使用访问方法而ä¸æ˜¯å…¬å…±å±žæ€§.md | 69 + docs/notes/17. 最å°åŒ–å¯å˜æ€§.md | 175 +++ docs/notes/18. 组åˆä¼˜äºŽç»§æ‰¿.md | 198 +++ ...¿ç”¨ç»§æ‰¿åˆ™è®¾è®¡ï¼Œåº”当文档说明,å¦åˆ™ä¸è¯¥ä½¿ç”¨.md | 122 ++ docs/notes/20. 接å£ä¼˜äºŽæŠ½è±¡ç±».md | 123 ++ docs/notes/21. 为åŽä»£è®¾è®¡æŽ¥å£.md | 45 + docs/notes/22. 接å£ä»…用æ¥å®šä¹‰ç±»åž‹.md | 59 + docs/notes/23. 优先使用类层次而ä¸æ˜¯æ ‡ç­¾ç±».md | 95 ++ docs/notes/24. 优先考虑é™æ€æˆå‘˜ç±».md | 50 + docs/notes/25. å°†æºæ–‡ä»¶é™åˆ¶ä¸ºå•ä¸ªé¡¶çº§ç±».md | 67 + docs/notes/26. ä¸è¦ä½¿ç”¨åŽŸå§‹ç±»åž‹.md | 162 ++ docs/notes/27. 消除éžæ£€æŸ¥è­¦å‘Š.md | 84 ++ docs/notes/28. 列表优于数组.md | 133 ++ docs/notes/29. 优先考虑泛型.md | 173 +++ docs/notes/30. 优先使用泛型方法.md | 143 ++ .../31. 使用é™å®šé€šé…符æ¥å¢žåŠ APIçš„çµæ´»æ€§.md | 221 +++ docs/notes/32. åˆç†åœ°ç»“åˆæ³›åž‹å’Œå¯å˜å‚æ•°.md | 142 ++ docs/notes/33. 优先考虑类型安全的异构容器.md | 126 ++ docs/notes/34. 使用枚举类型替代整型常é‡.md | 328 ++++ docs/notes/35. 使用实例属性替代åºæ•°.md | 37 + docs/notes/36. 使用EnumSet替代ä½å±žæ€§.md | 52 + docs/notes/37. 使用EnumMap替代åºæ•°ç´¢å¼•.md | 170 +++ docs/notes/38. 使用接å£æ¨¡æ‹Ÿå¯æ‰©å±•çš„枚举.md | 128 ++ docs/notes/39. 注解优于命å模å¼.md | 280 ++++ docs/notes/40. 始终使用Override注解.md | 74 + docs/notes/41. 使用标记接å£å®šä¹‰ç±»åž‹.md | 25 + docs/notes/42. lambda表达å¼ä¼˜äºŽåŒ¿åç±».md | 108 ++ docs/notes/43. 方法引用优于lambda表达å¼.md | 48 + docs/notes/44. 优先使用标准的函数å¼æŽ¥å£.md | 63 + docs/notes/45. 明智审慎地使用Stream.md | 205 +++ docs/notes/46. 优先考虑æµä¸­æ— å‰¯ä½œç”¨çš„函数.md | 102 ++ ...¨Collection而ä¸æ˜¯Streamæ¥ä½œä¸ºæ–¹æ³•çš„返回类型.md | 153 ++ docs/notes/48. 谨慎使用æµå¹¶è¡Œ.md | 71 + docs/notes/49. 检查å‚数有效性.md | 67 + docs/notes/50. å¿…è¦æ—¶è¿›è¡Œé˜²å¾¡æ€§æ‹·è´.md | 110 ++ docs/notes/51. 仔细设计方法签å.md | 25 + docs/notes/52. 明智审慎地使用é‡è½½.md | 155 ++ .../notes/69. åªé’ˆå¯¹å¼‚常的情况下æ‰ä½¿ç”¨å¼‚常.md | 64 + ...š„情况使用å—检异常,对编程错误使用è¿è¡Œæ—¶å¼‚常.md | 24 + docs/notes/71. é¿å…ä¸å¿…è¦çš„使用å—检异常.md | 58 + docs/notes/72. 优先使用标准的异常.md | 33 + docs/notes/73. 抛出与抽象对应的异常.md | 62 + .../74. æ¯ä¸ªæ–¹æ³•æŠ›å‡ºçš„异常都需è¦åˆ›å»ºæ–‡æ¡£.md | 17 + .../75. 在细节消æ¯ä¸­åŒ…å«å¤±è´¥ä¸€æ•èŽ·ä¿¡æ¯.md | 38 + docs/notes/76. ä¿æŒå¤±è´¥åŽŸå­æ€§.md | 31 + docs/notes/77. ä¸è¦å¿½ç•¥å¼‚常.md | 27 + .../notes/88. ä¿æŠ¤æ€§çš„编写 readObject 方法.md | 197 +++ ... 对于实例控制,枚举类型优于 readResolve.md | 134 ++ .../90. 考虑用åºåˆ—化代ç†ä»£æ›¿åºåˆ—化实例.md | 97 ++ 1817 files changed, 42959 insertions(+) create mode 100644 docs/.nojekyll create mode 100644 docs/README.md create mode 100644 docs/_coverpage.md create mode 100644 docs/_media/LogoMakr_1J56bI.png create mode 100644 docs/_media/logomakr-3sxxzw-128x128.png create mode 100644 docs/_media/公众å·.jpg create mode 100644 docs/_style/prism-master/.editorconfig create mode 100644 docs/_style/prism-master/.gitattributes create mode 100644 docs/_style/prism-master/.gitignore create mode 100644 docs/_style/prism-master/.npmignore create mode 100644 docs/_style/prism-master/.travis.yml create mode 100644 docs/_style/prism-master/CHANGELOG.md create mode 100644 docs/_style/prism-master/CNAME create mode 100644 docs/_style/prism-master/LICENSE create mode 100644 docs/_style/prism-master/README.md create mode 100644 docs/_style/prism-master/bower.json create mode 100644 docs/_style/prism-master/code.js create mode 100644 docs/_style/prism-master/components.js create mode 100644 docs/_style/prism-master/components.json create mode 100644 docs/_style/prism-master/components/index.js create mode 100644 docs/_style/prism-master/components/prism-abap.js create mode 100644 docs/_style/prism-master/components/prism-abap.min.js create mode 100644 docs/_style/prism-master/components/prism-actionscript.js create mode 100644 docs/_style/prism-master/components/prism-actionscript.min.js create mode 100644 docs/_style/prism-master/components/prism-ada.js create mode 100644 docs/_style/prism-master/components/prism-ada.min.js create mode 100644 docs/_style/prism-master/components/prism-apacheconf.js create mode 100644 docs/_style/prism-master/components/prism-apacheconf.min.js create mode 100644 docs/_style/prism-master/components/prism-apl.js create mode 100644 docs/_style/prism-master/components/prism-apl.min.js create mode 100644 docs/_style/prism-master/components/prism-applescript.js create mode 100644 docs/_style/prism-master/components/prism-applescript.min.js create mode 100644 docs/_style/prism-master/components/prism-arduino.js create mode 100644 docs/_style/prism-master/components/prism-arduino.min.js create mode 100644 docs/_style/prism-master/components/prism-arff.js create mode 100644 docs/_style/prism-master/components/prism-arff.min.js create mode 100644 docs/_style/prism-master/components/prism-asciidoc.js create mode 100644 docs/_style/prism-master/components/prism-asciidoc.min.js create mode 100644 docs/_style/prism-master/components/prism-asm6502.js create mode 100644 docs/_style/prism-master/components/prism-asm6502.min.js create mode 100644 docs/_style/prism-master/components/prism-aspnet.js create mode 100644 docs/_style/prism-master/components/prism-aspnet.min.js create mode 100644 docs/_style/prism-master/components/prism-autohotkey.js create mode 100644 docs/_style/prism-master/components/prism-autohotkey.min.js create mode 100644 docs/_style/prism-master/components/prism-autoit.js create mode 100644 docs/_style/prism-master/components/prism-autoit.min.js create mode 100644 docs/_style/prism-master/components/prism-bash.js create mode 100644 docs/_style/prism-master/components/prism-bash.min.js create mode 100644 docs/_style/prism-master/components/prism-basic.js create mode 100644 docs/_style/prism-master/components/prism-basic.min.js create mode 100644 docs/_style/prism-master/components/prism-batch.js create mode 100644 docs/_style/prism-master/components/prism-batch.min.js create mode 100644 docs/_style/prism-master/components/prism-bison.js create mode 100644 docs/_style/prism-master/components/prism-bison.min.js create mode 100644 docs/_style/prism-master/components/prism-brainfuck.js create mode 100644 docs/_style/prism-master/components/prism-brainfuck.min.js create mode 100644 docs/_style/prism-master/components/prism-bro.js create mode 100644 docs/_style/prism-master/components/prism-bro.min.js create mode 100644 docs/_style/prism-master/components/prism-c.js create mode 100644 docs/_style/prism-master/components/prism-c.min.js create mode 100644 docs/_style/prism-master/components/prism-cil.js create mode 100644 docs/_style/prism-master/components/prism-cil.min.js create mode 100644 docs/_style/prism-master/components/prism-clike.js create mode 100644 docs/_style/prism-master/components/prism-clike.min.js create mode 100644 docs/_style/prism-master/components/prism-clojure.js create mode 100644 docs/_style/prism-master/components/prism-clojure.min.js create mode 100644 docs/_style/prism-master/components/prism-coffeescript.js create mode 100644 docs/_style/prism-master/components/prism-coffeescript.min.js create mode 100644 docs/_style/prism-master/components/prism-core.js create mode 100644 docs/_style/prism-master/components/prism-core.min.js create mode 100644 docs/_style/prism-master/components/prism-cpp.js create mode 100644 docs/_style/prism-master/components/prism-cpp.min.js create mode 100644 docs/_style/prism-master/components/prism-crystal.js create mode 100644 docs/_style/prism-master/components/prism-crystal.min.js create mode 100644 docs/_style/prism-master/components/prism-csharp.js create mode 100644 docs/_style/prism-master/components/prism-csharp.min.js create mode 100644 docs/_style/prism-master/components/prism-csp.js create mode 100644 docs/_style/prism-master/components/prism-csp.min.js create mode 100644 docs/_style/prism-master/components/prism-css-extras.js create mode 100644 docs/_style/prism-master/components/prism-css-extras.min.js create mode 100644 docs/_style/prism-master/components/prism-css.js create mode 100644 docs/_style/prism-master/components/prism-css.min.js create mode 100644 docs/_style/prism-master/components/prism-d.js create mode 100644 docs/_style/prism-master/components/prism-d.min.js create mode 100644 docs/_style/prism-master/components/prism-dart.js create mode 100644 docs/_style/prism-master/components/prism-dart.min.js create mode 100644 docs/_style/prism-master/components/prism-diff.js create mode 100644 docs/_style/prism-master/components/prism-diff.min.js create mode 100644 docs/_style/prism-master/components/prism-django.js create mode 100644 docs/_style/prism-master/components/prism-django.min.js create mode 100644 docs/_style/prism-master/components/prism-docker.js create mode 100644 docs/_style/prism-master/components/prism-docker.min.js create mode 100644 docs/_style/prism-master/components/prism-eiffel.js create mode 100644 docs/_style/prism-master/components/prism-eiffel.min.js create mode 100644 docs/_style/prism-master/components/prism-elixir.js create mode 100644 docs/_style/prism-master/components/prism-elixir.min.js create mode 100644 docs/_style/prism-master/components/prism-elm.js create mode 100644 docs/_style/prism-master/components/prism-elm.min.js create mode 100644 docs/_style/prism-master/components/prism-erb.js create mode 100644 docs/_style/prism-master/components/prism-erb.min.js create mode 100644 docs/_style/prism-master/components/prism-erlang.js create mode 100644 docs/_style/prism-master/components/prism-erlang.min.js create mode 100644 docs/_style/prism-master/components/prism-flow.js create mode 100644 docs/_style/prism-master/components/prism-flow.min.js create mode 100644 docs/_style/prism-master/components/prism-fortran.js create mode 100644 docs/_style/prism-master/components/prism-fortran.min.js create mode 100644 docs/_style/prism-master/components/prism-fsharp.js create mode 100644 docs/_style/prism-master/components/prism-fsharp.min.js create mode 100644 docs/_style/prism-master/components/prism-gcode.js create mode 100644 docs/_style/prism-master/components/prism-gcode.min.js create mode 100644 docs/_style/prism-master/components/prism-gedcom.js create mode 100644 docs/_style/prism-master/components/prism-gedcom.min.js create mode 100644 docs/_style/prism-master/components/prism-gherkin.js create mode 100644 docs/_style/prism-master/components/prism-gherkin.min.js create mode 100644 docs/_style/prism-master/components/prism-git.js create mode 100644 docs/_style/prism-master/components/prism-git.min.js create mode 100644 docs/_style/prism-master/components/prism-glsl.js create mode 100644 docs/_style/prism-master/components/prism-glsl.min.js create mode 100644 docs/_style/prism-master/components/prism-gml.js create mode 100644 docs/_style/prism-master/components/prism-gml.min.js create mode 100644 docs/_style/prism-master/components/prism-go.js create mode 100644 docs/_style/prism-master/components/prism-go.min.js create mode 100644 docs/_style/prism-master/components/prism-graphql.js create mode 100644 docs/_style/prism-master/components/prism-graphql.min.js create mode 100644 docs/_style/prism-master/components/prism-groovy.js create mode 100644 docs/_style/prism-master/components/prism-groovy.min.js create mode 100644 docs/_style/prism-master/components/prism-haml.js create mode 100644 docs/_style/prism-master/components/prism-haml.min.js create mode 100644 docs/_style/prism-master/components/prism-handlebars.js create mode 100644 docs/_style/prism-master/components/prism-handlebars.min.js create mode 100644 docs/_style/prism-master/components/prism-haskell.js create mode 100644 docs/_style/prism-master/components/prism-haskell.min.js create mode 100644 docs/_style/prism-master/components/prism-haxe.js create mode 100644 docs/_style/prism-master/components/prism-haxe.min.js create mode 100644 docs/_style/prism-master/components/prism-hpkp.js create mode 100644 docs/_style/prism-master/components/prism-hpkp.min.js create mode 100644 docs/_style/prism-master/components/prism-hsts.js create mode 100644 docs/_style/prism-master/components/prism-hsts.min.js create mode 100644 docs/_style/prism-master/components/prism-http.js create mode 100644 docs/_style/prism-master/components/prism-http.min.js create mode 100644 docs/_style/prism-master/components/prism-ichigojam.js create mode 100644 docs/_style/prism-master/components/prism-ichigojam.min.js create mode 100644 docs/_style/prism-master/components/prism-icon.js create mode 100644 docs/_style/prism-master/components/prism-icon.min.js create mode 100644 docs/_style/prism-master/components/prism-inform7.js create mode 100644 docs/_style/prism-master/components/prism-inform7.min.js create mode 100644 docs/_style/prism-master/components/prism-ini.js create mode 100644 docs/_style/prism-master/components/prism-ini.min.js create mode 100644 docs/_style/prism-master/components/prism-io.js create mode 100644 docs/_style/prism-master/components/prism-io.min.js create mode 100644 docs/_style/prism-master/components/prism-j.js create mode 100644 docs/_style/prism-master/components/prism-j.min.js create mode 100644 docs/_style/prism-master/components/prism-java.js create mode 100644 docs/_style/prism-master/components/prism-java.min.js create mode 100644 docs/_style/prism-master/components/prism-javascript.js create mode 100644 docs/_style/prism-master/components/prism-javascript.min.js create mode 100644 docs/_style/prism-master/components/prism-javastacktrace.js create mode 100644 docs/_style/prism-master/components/prism-javastacktrace.min.js create mode 100644 docs/_style/prism-master/components/prism-jolie.js create mode 100644 docs/_style/prism-master/components/prism-jolie.min.js create mode 100644 docs/_style/prism-master/components/prism-json.js create mode 100644 docs/_style/prism-master/components/prism-json.min.js create mode 100644 docs/_style/prism-master/components/prism-jsx.js create mode 100644 docs/_style/prism-master/components/prism-jsx.min.js create mode 100644 docs/_style/prism-master/components/prism-julia.js create mode 100644 docs/_style/prism-master/components/prism-julia.min.js create mode 100644 docs/_style/prism-master/components/prism-keyman.js create mode 100644 docs/_style/prism-master/components/prism-keyman.min.js create mode 100644 docs/_style/prism-master/components/prism-kotlin.js create mode 100644 docs/_style/prism-master/components/prism-kotlin.min.js create mode 100644 docs/_style/prism-master/components/prism-latex.js create mode 100644 docs/_style/prism-master/components/prism-latex.min.js create mode 100644 docs/_style/prism-master/components/prism-less.js create mode 100644 docs/_style/prism-master/components/prism-less.min.js create mode 100644 docs/_style/prism-master/components/prism-liquid.js create mode 100644 docs/_style/prism-master/components/prism-liquid.min.js create mode 100644 docs/_style/prism-master/components/prism-lisp.js create mode 100644 docs/_style/prism-master/components/prism-lisp.min.js create mode 100644 docs/_style/prism-master/components/prism-livescript.js create mode 100644 docs/_style/prism-master/components/prism-livescript.min.js create mode 100644 docs/_style/prism-master/components/prism-lolcode.js create mode 100644 docs/_style/prism-master/components/prism-lolcode.min.js create mode 100644 docs/_style/prism-master/components/prism-lua.js create mode 100644 docs/_style/prism-master/components/prism-lua.min.js create mode 100644 docs/_style/prism-master/components/prism-makefile.js create mode 100644 docs/_style/prism-master/components/prism-makefile.min.js create mode 100644 docs/_style/prism-master/components/prism-markdown.js create mode 100644 docs/_style/prism-master/components/prism-markdown.min.js create mode 100644 docs/_style/prism-master/components/prism-markup-templating.js create mode 100644 docs/_style/prism-master/components/prism-markup-templating.min.js create mode 100644 docs/_style/prism-master/components/prism-markup.js create mode 100644 docs/_style/prism-master/components/prism-markup.min.js create mode 100644 docs/_style/prism-master/components/prism-matlab.js create mode 100644 docs/_style/prism-master/components/prism-matlab.min.js create mode 100644 docs/_style/prism-master/components/prism-mel.js create mode 100644 docs/_style/prism-master/components/prism-mel.min.js create mode 100644 docs/_style/prism-master/components/prism-mizar.js create mode 100644 docs/_style/prism-master/components/prism-mizar.min.js create mode 100644 docs/_style/prism-master/components/prism-monkey.js create mode 100644 docs/_style/prism-master/components/prism-monkey.min.js create mode 100644 docs/_style/prism-master/components/prism-n4js.js create mode 100644 docs/_style/prism-master/components/prism-n4js.min.js create mode 100644 docs/_style/prism-master/components/prism-nasm.js create mode 100644 docs/_style/prism-master/components/prism-nasm.min.js create mode 100644 docs/_style/prism-master/components/prism-nginx.js create mode 100644 docs/_style/prism-master/components/prism-nginx.min.js create mode 100644 docs/_style/prism-master/components/prism-nim.js create mode 100644 docs/_style/prism-master/components/prism-nim.min.js create mode 100644 docs/_style/prism-master/components/prism-nix.js create mode 100644 docs/_style/prism-master/components/prism-nix.min.js create mode 100644 docs/_style/prism-master/components/prism-nsis.js create mode 100644 docs/_style/prism-master/components/prism-nsis.min.js create mode 100644 docs/_style/prism-master/components/prism-objectivec.js create mode 100644 docs/_style/prism-master/components/prism-objectivec.min.js create mode 100644 docs/_style/prism-master/components/prism-ocaml.js create mode 100644 docs/_style/prism-master/components/prism-ocaml.min.js create mode 100644 docs/_style/prism-master/components/prism-opencl.js create mode 100644 docs/_style/prism-master/components/prism-opencl.min.js create mode 100644 docs/_style/prism-master/components/prism-oz.js create mode 100644 docs/_style/prism-master/components/prism-oz.min.js create mode 100644 docs/_style/prism-master/components/prism-parigp.js create mode 100644 docs/_style/prism-master/components/prism-parigp.min.js create mode 100644 docs/_style/prism-master/components/prism-parser.js create mode 100644 docs/_style/prism-master/components/prism-parser.min.js create mode 100644 docs/_style/prism-master/components/prism-pascal.js create mode 100644 docs/_style/prism-master/components/prism-pascal.min.js create mode 100644 docs/_style/prism-master/components/prism-perl.js create mode 100644 docs/_style/prism-master/components/prism-perl.min.js create mode 100644 docs/_style/prism-master/components/prism-php-extras.js create mode 100644 docs/_style/prism-master/components/prism-php-extras.min.js create mode 100644 docs/_style/prism-master/components/prism-php.js create mode 100644 docs/_style/prism-master/components/prism-php.min.js create mode 100644 docs/_style/prism-master/components/prism-plsql.js create mode 100644 docs/_style/prism-master/components/prism-plsql.min.js create mode 100644 docs/_style/prism-master/components/prism-powershell.js create mode 100644 docs/_style/prism-master/components/prism-powershell.min.js create mode 100644 docs/_style/prism-master/components/prism-processing.js create mode 100644 docs/_style/prism-master/components/prism-processing.min.js create mode 100644 docs/_style/prism-master/components/prism-prolog.js create mode 100644 docs/_style/prism-master/components/prism-prolog.min.js create mode 100644 docs/_style/prism-master/components/prism-properties.js create mode 100644 docs/_style/prism-master/components/prism-properties.min.js create mode 100644 docs/_style/prism-master/components/prism-protobuf.js create mode 100644 docs/_style/prism-master/components/prism-protobuf.min.js create mode 100644 docs/_style/prism-master/components/prism-pug.js create mode 100644 docs/_style/prism-master/components/prism-pug.min.js create mode 100644 docs/_style/prism-master/components/prism-puppet.js create mode 100644 docs/_style/prism-master/components/prism-puppet.min.js create mode 100644 docs/_style/prism-master/components/prism-pure.js create mode 100644 docs/_style/prism-master/components/prism-pure.min.js create mode 100644 docs/_style/prism-master/components/prism-python.js create mode 100644 docs/_style/prism-master/components/prism-python.min.js create mode 100644 docs/_style/prism-master/components/prism-q.js create mode 100644 docs/_style/prism-master/components/prism-q.min.js create mode 100644 docs/_style/prism-master/components/prism-qore.js create mode 100644 docs/_style/prism-master/components/prism-qore.min.js create mode 100644 docs/_style/prism-master/components/prism-r.js create mode 100644 docs/_style/prism-master/components/prism-r.min.js create mode 100644 docs/_style/prism-master/components/prism-reason.js create mode 100644 docs/_style/prism-master/components/prism-reason.min.js create mode 100644 docs/_style/prism-master/components/prism-renpy.js create mode 100644 docs/_style/prism-master/components/prism-renpy.min.js create mode 100644 docs/_style/prism-master/components/prism-rest.js create mode 100644 docs/_style/prism-master/components/prism-rest.min.js create mode 100644 docs/_style/prism-master/components/prism-rip.js create mode 100644 docs/_style/prism-master/components/prism-rip.min.js create mode 100644 docs/_style/prism-master/components/prism-roboconf.js create mode 100644 docs/_style/prism-master/components/prism-roboconf.min.js create mode 100644 docs/_style/prism-master/components/prism-ruby.js create mode 100644 docs/_style/prism-master/components/prism-ruby.min.js create mode 100644 docs/_style/prism-master/components/prism-rust.js create mode 100644 docs/_style/prism-master/components/prism-rust.min.js create mode 100644 docs/_style/prism-master/components/prism-sas.js create mode 100644 docs/_style/prism-master/components/prism-sas.min.js create mode 100644 docs/_style/prism-master/components/prism-sass.js create mode 100644 docs/_style/prism-master/components/prism-sass.min.js create mode 100644 docs/_style/prism-master/components/prism-scala.js create mode 100644 docs/_style/prism-master/components/prism-scala.min.js create mode 100644 docs/_style/prism-master/components/prism-scheme.js create mode 100644 docs/_style/prism-master/components/prism-scheme.min.js create mode 100644 docs/_style/prism-master/components/prism-scss.js create mode 100644 docs/_style/prism-master/components/prism-scss.min.js create mode 100644 docs/_style/prism-master/components/prism-smalltalk.js create mode 100644 docs/_style/prism-master/components/prism-smalltalk.min.js create mode 100644 docs/_style/prism-master/components/prism-smarty.js create mode 100644 docs/_style/prism-master/components/prism-smarty.min.js create mode 100644 docs/_style/prism-master/components/prism-soy.js create mode 100644 docs/_style/prism-master/components/prism-soy.min.js create mode 100644 docs/_style/prism-master/components/prism-sql.js create mode 100644 docs/_style/prism-master/components/prism-sql.min.js create mode 100644 docs/_style/prism-master/components/prism-stylus.js create mode 100644 docs/_style/prism-master/components/prism-stylus.min.js create mode 100644 docs/_style/prism-master/components/prism-swift.js create mode 100644 docs/_style/prism-master/components/prism-swift.min.js create mode 100644 docs/_style/prism-master/components/prism-tap.js create mode 100644 docs/_style/prism-master/components/prism-tap.min.js create mode 100644 docs/_style/prism-master/components/prism-tcl.js create mode 100644 docs/_style/prism-master/components/prism-tcl.min.js create mode 100644 docs/_style/prism-master/components/prism-textile.js create mode 100644 docs/_style/prism-master/components/prism-textile.min.js create mode 100644 docs/_style/prism-master/components/prism-toml.js create mode 100644 docs/_style/prism-master/components/prism-toml.min.js create mode 100644 docs/_style/prism-master/components/prism-tsx.js create mode 100644 docs/_style/prism-master/components/prism-tsx.min.js create mode 100644 docs/_style/prism-master/components/prism-tt2.js create mode 100644 docs/_style/prism-master/components/prism-tt2.min.js create mode 100644 docs/_style/prism-master/components/prism-twig.js create mode 100644 docs/_style/prism-master/components/prism-twig.min.js create mode 100644 docs/_style/prism-master/components/prism-typescript.js create mode 100644 docs/_style/prism-master/components/prism-typescript.min.js create mode 100644 docs/_style/prism-master/components/prism-vala.js create mode 100644 docs/_style/prism-master/components/prism-vala.min.js create mode 100644 docs/_style/prism-master/components/prism-vbnet.js create mode 100644 docs/_style/prism-master/components/prism-vbnet.min.js create mode 100644 docs/_style/prism-master/components/prism-velocity.js create mode 100644 docs/_style/prism-master/components/prism-velocity.min.js create mode 100644 docs/_style/prism-master/components/prism-verilog.js create mode 100644 docs/_style/prism-master/components/prism-verilog.min.js create mode 100644 docs/_style/prism-master/components/prism-vhdl.js create mode 100644 docs/_style/prism-master/components/prism-vhdl.min.js create mode 100644 docs/_style/prism-master/components/prism-vim.js create mode 100644 docs/_style/prism-master/components/prism-vim.min.js create mode 100644 docs/_style/prism-master/components/prism-visual-basic.js create mode 100644 docs/_style/prism-master/components/prism-visual-basic.min.js create mode 100644 docs/_style/prism-master/components/prism-wasm.js create mode 100644 docs/_style/prism-master/components/prism-wasm.min.js create mode 100644 docs/_style/prism-master/components/prism-wiki.js create mode 100644 docs/_style/prism-master/components/prism-wiki.min.js create mode 100644 docs/_style/prism-master/components/prism-xeora.js create mode 100644 docs/_style/prism-master/components/prism-xeora.min.js create mode 100644 docs/_style/prism-master/components/prism-xojo.js create mode 100644 docs/_style/prism-master/components/prism-xojo.min.js create mode 100644 docs/_style/prism-master/components/prism-xquery.js create mode 100644 docs/_style/prism-master/components/prism-xquery.min.js create mode 100644 docs/_style/prism-master/components/prism-yaml.js create mode 100644 docs/_style/prism-master/components/prism-yaml.min.js create mode 100644 docs/_style/prism-master/composer.json create mode 100644 docs/_style/prism-master/download.html create mode 100644 docs/_style/prism-master/download.js create mode 100644 docs/_style/prism-master/examples.html create mode 100644 docs/_style/prism-master/examples.js create mode 100644 docs/_style/prism-master/examples/prism-abap.html create mode 100644 docs/_style/prism-master/examples/prism-actionscript.html create mode 100644 docs/_style/prism-master/examples/prism-ada.html create mode 100644 docs/_style/prism-master/examples/prism-apacheconf.html create mode 100644 docs/_style/prism-master/examples/prism-apl.html create mode 100644 docs/_style/prism-master/examples/prism-applescript.html create mode 100644 docs/_style/prism-master/examples/prism-arduino.html create mode 100644 docs/_style/prism-master/examples/prism-arff.html create mode 100644 docs/_style/prism-master/examples/prism-asciidoc.html create mode 100644 docs/_style/prism-master/examples/prism-asm6502.html create mode 100644 docs/_style/prism-master/examples/prism-aspnet.html create mode 100644 docs/_style/prism-master/examples/prism-autohotkey.html create mode 100644 docs/_style/prism-master/examples/prism-autoit.html create mode 100644 docs/_style/prism-master/examples/prism-bash.html create mode 100644 docs/_style/prism-master/examples/prism-basic.html create mode 100644 docs/_style/prism-master/examples/prism-batch.html create mode 100644 docs/_style/prism-master/examples/prism-bison.html create mode 100644 docs/_style/prism-master/examples/prism-brainfuck.html create mode 100644 docs/_style/prism-master/examples/prism-bro.html create mode 100644 docs/_style/prism-master/examples/prism-c.html create mode 100644 docs/_style/prism-master/examples/prism-clike.html create mode 100644 docs/_style/prism-master/examples/prism-clojure.html create mode 100644 docs/_style/prism-master/examples/prism-coffeescript.html create mode 100644 docs/_style/prism-master/examples/prism-cpp.html create mode 100644 docs/_style/prism-master/examples/prism-crystal.html create mode 100644 docs/_style/prism-master/examples/prism-csharp.html create mode 100644 docs/_style/prism-master/examples/prism-csp.html create mode 100644 docs/_style/prism-master/examples/prism-css.html create mode 100644 docs/_style/prism-master/examples/prism-d.html create mode 100644 docs/_style/prism-master/examples/prism-dart.html create mode 100644 docs/_style/prism-master/examples/prism-diff.html create mode 100644 docs/_style/prism-master/examples/prism-django.html create mode 100644 docs/_style/prism-master/examples/prism-docker.html create mode 100644 docs/_style/prism-master/examples/prism-eiffel.html create mode 100644 docs/_style/prism-master/examples/prism-elixir.html create mode 100644 docs/_style/prism-master/examples/prism-elm.html create mode 100644 docs/_style/prism-master/examples/prism-erb.html create mode 100644 docs/_style/prism-master/examples/prism-erlang.html create mode 100644 docs/_style/prism-master/examples/prism-flow.html create mode 100644 docs/_style/prism-master/examples/prism-fortran.html create mode 100644 docs/_style/prism-master/examples/prism-fsharp.html create mode 100644 docs/_style/prism-master/examples/prism-gcode.html create mode 100644 docs/_style/prism-master/examples/prism-gedcom.html create mode 100644 docs/_style/prism-master/examples/prism-gherkin.html create mode 100644 docs/_style/prism-master/examples/prism-git.html create mode 100644 docs/_style/prism-master/examples/prism-glsl.html create mode 100644 docs/_style/prism-master/examples/prism-gml.html create mode 100644 docs/_style/prism-master/examples/prism-go.html create mode 100644 docs/_style/prism-master/examples/prism-graphql.html create mode 100644 docs/_style/prism-master/examples/prism-groovy.html create mode 100644 docs/_style/prism-master/examples/prism-haml.html create mode 100644 docs/_style/prism-master/examples/prism-handlebars.html create mode 100644 docs/_style/prism-master/examples/prism-haskell.html create mode 100644 docs/_style/prism-master/examples/prism-haxe.html create mode 100644 docs/_style/prism-master/examples/prism-hpkp.html create mode 100644 docs/_style/prism-master/examples/prism-hsts.html create mode 100644 docs/_style/prism-master/examples/prism-http.html create mode 100644 docs/_style/prism-master/examples/prism-ichigojam.html create mode 100644 docs/_style/prism-master/examples/prism-icon.html create mode 100644 docs/_style/prism-master/examples/prism-inform7.html create mode 100644 docs/_style/prism-master/examples/prism-ini.html create mode 100644 docs/_style/prism-master/examples/prism-io.html create mode 100644 docs/_style/prism-master/examples/prism-j.html create mode 100644 docs/_style/prism-master/examples/prism-java.html create mode 100644 docs/_style/prism-master/examples/prism-javascript.html create mode 100644 docs/_style/prism-master/examples/prism-javastacktrace.html create mode 100644 docs/_style/prism-master/examples/prism-jolie.html create mode 100644 docs/_style/prism-master/examples/prism-jsx.html create mode 100644 docs/_style/prism-master/examples/prism-julia.html create mode 100644 docs/_style/prism-master/examples/prism-keyman.html create mode 100644 docs/_style/prism-master/examples/prism-kotlin.html create mode 100644 docs/_style/prism-master/examples/prism-latex.html create mode 100644 docs/_style/prism-master/examples/prism-less.html create mode 100644 docs/_style/prism-master/examples/prism-liquid.html create mode 100644 docs/_style/prism-master/examples/prism-lisp.html create mode 100644 docs/_style/prism-master/examples/prism-livescript.html create mode 100644 docs/_style/prism-master/examples/prism-lolcode.html create mode 100644 docs/_style/prism-master/examples/prism-lua.html create mode 100644 docs/_style/prism-master/examples/prism-makefile.html create mode 100644 docs/_style/prism-master/examples/prism-markdown.html create mode 100644 docs/_style/prism-master/examples/prism-markup.html create mode 100644 docs/_style/prism-master/examples/prism-matlab.html create mode 100644 docs/_style/prism-master/examples/prism-mel.html create mode 100644 docs/_style/prism-master/examples/prism-mizar.html create mode 100644 docs/_style/prism-master/examples/prism-monkey.html create mode 100644 docs/_style/prism-master/examples/prism-n4js.html create mode 100644 docs/_style/prism-master/examples/prism-nasm.html create mode 100644 docs/_style/prism-master/examples/prism-nginx.html create mode 100644 docs/_style/prism-master/examples/prism-nim.html create mode 100644 docs/_style/prism-master/examples/prism-nix.html create mode 100644 docs/_style/prism-master/examples/prism-nsis.html create mode 100644 docs/_style/prism-master/examples/prism-objectivec.html create mode 100644 docs/_style/prism-master/examples/prism-ocaml.html create mode 100644 docs/_style/prism-master/examples/prism-opencl.html create mode 100644 docs/_style/prism-master/examples/prism-oz.html create mode 100644 docs/_style/prism-master/examples/prism-parigp.html create mode 100644 docs/_style/prism-master/examples/prism-parser.html create mode 100644 docs/_style/prism-master/examples/prism-pascal.html create mode 100644 docs/_style/prism-master/examples/prism-perl.html create mode 100644 docs/_style/prism-master/examples/prism-php.html create mode 100644 docs/_style/prism-master/examples/prism-plsql.html create mode 100644 docs/_style/prism-master/examples/prism-powershell.html create mode 100644 docs/_style/prism-master/examples/prism-processing.html create mode 100644 docs/_style/prism-master/examples/prism-prolog.html create mode 100644 docs/_style/prism-master/examples/prism-properties.html create mode 100644 docs/_style/prism-master/examples/prism-pug.html create mode 100644 docs/_style/prism-master/examples/prism-puppet.html create mode 100644 docs/_style/prism-master/examples/prism-pure.html create mode 100644 docs/_style/prism-master/examples/prism-python.html create mode 100644 docs/_style/prism-master/examples/prism-q.html create mode 100644 docs/_style/prism-master/examples/prism-qore.html create mode 100644 docs/_style/prism-master/examples/prism-r.html create mode 100644 docs/_style/prism-master/examples/prism-reason.html create mode 100644 docs/_style/prism-master/examples/prism-renpy.html create mode 100644 docs/_style/prism-master/examples/prism-rest.html create mode 100644 docs/_style/prism-master/examples/prism-rip.html create mode 100644 docs/_style/prism-master/examples/prism-roboconf.html create mode 100644 docs/_style/prism-master/examples/prism-ruby.html create mode 100644 docs/_style/prism-master/examples/prism-rust.html create mode 100644 docs/_style/prism-master/examples/prism-sas.html create mode 100644 docs/_style/prism-master/examples/prism-sass.html create mode 100644 docs/_style/prism-master/examples/prism-scala.html create mode 100644 docs/_style/prism-master/examples/prism-scheme.html create mode 100644 docs/_style/prism-master/examples/prism-scss.html create mode 100644 docs/_style/prism-master/examples/prism-smalltalk.html create mode 100644 docs/_style/prism-master/examples/prism-smarty.html create mode 100644 docs/_style/prism-master/examples/prism-soy.html create mode 100644 docs/_style/prism-master/examples/prism-sql.html create mode 100644 docs/_style/prism-master/examples/prism-stylus.html create mode 100644 docs/_style/prism-master/examples/prism-swift.html create mode 100644 docs/_style/prism-master/examples/prism-tcl.html create mode 100644 docs/_style/prism-master/examples/prism-textile.html create mode 100644 docs/_style/prism-master/examples/prism-tsx.html create mode 100644 docs/_style/prism-master/examples/prism-tt2.html create mode 100644 docs/_style/prism-master/examples/prism-twig.html create mode 100644 docs/_style/prism-master/examples/prism-typescript.html create mode 100644 docs/_style/prism-master/examples/prism-vala.html create mode 100644 docs/_style/prism-master/examples/prism-vbnet.html create mode 100644 docs/_style/prism-master/examples/prism-velocity.html create mode 100644 docs/_style/prism-master/examples/prism-verilog.html create mode 100644 docs/_style/prism-master/examples/prism-vhdl.html create mode 100644 docs/_style/prism-master/examples/prism-vim.html create mode 100644 docs/_style/prism-master/examples/prism-visual-basic.html create mode 100644 docs/_style/prism-master/examples/prism-wasm.html create mode 100644 docs/_style/prism-master/examples/prism-wiki.html create mode 100644 docs/_style/prism-master/examples/prism-xeora.html create mode 100644 docs/_style/prism-master/examples/prism-xojo.html create mode 100644 docs/_style/prism-master/examples/prism-xquery.html create mode 100644 docs/_style/prism-master/examples/prism-yaml.html create mode 100644 docs/_style/prism-master/extending.html create mode 100644 docs/_style/prism-master/faq.html create mode 100644 docs/_style/prism-master/favicon.png create mode 100644 docs/_style/prism-master/gulpfile.js create mode 100644 docs/_style/prism-master/img/logo-ala.png create mode 100644 docs/_style/prism-master/img/logo-css-tricks.png create mode 100644 docs/_style/prism-master/img/logo-drupal.png create mode 100644 docs/_style/prism-master/img/logo-mdn.png create mode 100644 docs/_style/prism-master/img/logo-react.png create mode 100644 docs/_style/prism-master/img/logo-sitepoint.png create mode 100644 docs/_style/prism-master/img/logo-smashing.png create mode 100644 docs/_style/prism-master/img/logo-stripe.png create mode 100644 docs/_style/prism-master/img/spectrum.png create mode 100644 docs/_style/prism-master/index.html create mode 100644 docs/_style/prism-master/logo.svg create mode 100644 docs/_style/prism-master/package.json create mode 100644 docs/_style/prism-master/plugins/autolinker/index.html create mode 100644 docs/_style/prism-master/plugins/autolinker/prism-autolinker.css create mode 100644 docs/_style/prism-master/plugins/autolinker/prism-autolinker.js create mode 100644 docs/_style/prism-master/plugins/autolinker/prism-autolinker.min.js create mode 100644 docs/_style/prism-master/plugins/autoloader/index.html create mode 100644 docs/_style/prism-master/plugins/autoloader/prism-autoloader.js create mode 100644 docs/_style/prism-master/plugins/autoloader/prism-autoloader.min.js create mode 100644 docs/_style/prism-master/plugins/command-line/index.html create mode 100644 docs/_style/prism-master/plugins/command-line/prism-command-line.css create mode 100644 docs/_style/prism-master/plugins/command-line/prism-command-line.js create mode 100644 docs/_style/prism-master/plugins/command-line/prism-command-line.min.js create mode 100644 docs/_style/prism-master/plugins/copy-to-clipboard/index.html create mode 100644 docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.js create mode 100644 docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js create mode 100644 docs/_style/prism-master/plugins/custom-class/index.html create mode 100644 docs/_style/prism-master/plugins/custom-class/prism-custom-class.js create mode 100644 docs/_style/prism-master/plugins/custom-class/prism-custom-class.min.js create mode 100644 docs/_style/prism-master/plugins/data-uri-highlight/index.html create mode 100644 docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.js create mode 100644 docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.min.js create mode 100644 docs/_style/prism-master/plugins/file-highlight/index.html create mode 100644 docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.js create mode 100644 docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.min.js create mode 100644 docs/_style/prism-master/plugins/highlight-keywords/index.html create mode 100644 docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.js create mode 100644 docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.min.js create mode 100644 docs/_style/prism-master/plugins/index.html create mode 100644 docs/_style/prism-master/plugins/jsonp-highlight/index.html create mode 100644 docs/_style/prism-master/plugins/jsonp-highlight/prism-jsonp-highlight.js create mode 100644 docs/_style/prism-master/plugins/jsonp-highlight/prism-jsonp-highlight.min.js create mode 100644 docs/_style/prism-master/plugins/keep-markup/index.html create mode 100644 docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.js create mode 100644 docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.min.js create mode 100644 docs/_style/prism-master/plugins/line-highlight/index.html create mode 100644 docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.css create mode 100644 docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.js create mode 100644 docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.min.js create mode 100644 docs/_style/prism-master/plugins/line-numbers/index.html create mode 100644 docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.css create mode 100644 docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.js create mode 100644 docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.min.js create mode 100644 docs/_style/prism-master/plugins/normalize-whitespace/demo.html create mode 100644 docs/_style/prism-master/plugins/normalize-whitespace/index.html create mode 100644 docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.js create mode 100644 docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.min.js create mode 100644 docs/_style/prism-master/plugins/previewers/index.html create mode 100644 docs/_style/prism-master/plugins/previewers/prism-previewers.css create mode 100644 docs/_style/prism-master/plugins/previewers/prism-previewers.js create mode 100644 docs/_style/prism-master/plugins/previewers/prism-previewers.min.js create mode 100644 docs/_style/prism-master/plugins/remove-initial-line-feed/index.html create mode 100644 docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js create mode 100644 docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js create mode 100644 docs/_style/prism-master/plugins/show-invisibles/index.html create mode 100644 docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.css create mode 100644 docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.js create mode 100644 docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.min.js create mode 100644 docs/_style/prism-master/plugins/show-language/index.html create mode 100644 docs/_style/prism-master/plugins/show-language/prism-show-language.js create mode 100644 docs/_style/prism-master/plugins/show-language/prism-show-language.min.js create mode 100644 docs/_style/prism-master/plugins/toolbar/index.html create mode 100644 docs/_style/prism-master/plugins/toolbar/prism-toolbar.css create mode 100644 docs/_style/prism-master/plugins/toolbar/prism-toolbar.js create mode 100644 docs/_style/prism-master/plugins/toolbar/prism-toolbar.min.js create mode 100644 docs/_style/prism-master/plugins/unescaped-markup/index.html create mode 100644 docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.css create mode 100644 docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.js create mode 100644 docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.min.js create mode 100644 docs/_style/prism-master/plugins/wpd/index.html create mode 100644 docs/_style/prism-master/plugins/wpd/prism-wpd.css create mode 100644 docs/_style/prism-master/plugins/wpd/prism-wpd.js create mode 100644 docs/_style/prism-master/plugins/wpd/prism-wpd.min.js create mode 100644 docs/_style/prism-master/prefixfree.min.js create mode 100644 docs/_style/prism-master/prism.js create mode 100644 docs/_style/prism-master/style.css create mode 100644 docs/_style/prism-master/templates/footer.html create mode 100644 docs/_style/prism-master/templates/header-download.html create mode 100644 docs/_style/prism-master/templates/header-main.html create mode 100644 docs/_style/prism-master/templates/header-plugins.html create mode 100644 docs/_style/prism-master/test-suite.html create mode 100644 docs/_style/prism-master/test.html create mode 100644 docs/_style/prism-master/tests/helper/prism-loader.js create mode 100644 docs/_style/prism-master/tests/helper/test-case.js create mode 100644 docs/_style/prism-master/tests/helper/test-discovery.js create mode 100644 docs/_style/prism-master/tests/helper/token-stream-transformer.js create mode 100644 docs/_style/prism-master/tests/languages/abap/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/eol-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/string-template_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/actionscript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/actionscript/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/directive-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/directive-flags_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/directive-inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/assignment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/dfn_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/dyadic-operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/monadic-operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/statement_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/system-function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/class_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/arff/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/arff/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/arff/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/arff/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/admonition_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/attribute-entry_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/attributes_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/callout_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/comment-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/entity_feature.js create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/entity_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/hr_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/indented-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/line-continuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/list-label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/list-punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/literal-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/macro_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/other-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/page-break_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/passthrough-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/replacement_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/table_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/title_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/opcode_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/register_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/aspnet/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/aspnet/page-directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/arithmetic_environment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/command_substitution_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/shebang_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/batch/command_feature.test create mode 100644 docs/_style/prism-master/tests/languages/batch/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/batch/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/c_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/brainfuck/all_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/c+pure/c_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/c/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/c/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/c/macro_feature.test create mode 100644 docs/_style/prism-master/tests/languages/c/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/c/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cil/asm_reference.test create mode 100644 docs/_style/prism-master/tests/languages/cil/boolean.test create mode 100644 docs/_style/prism-master/tests/languages/cil/comment.test create mode 100644 docs/_style/prism-master/tests/languages/cil/instructions.test create mode 100644 docs/_style/prism-master/tests/languages/cil/keywords.test create mode 100644 docs/_style/prism-master/tests/languages/cil/strings.test create mode 100644 docs/_style/prism-master/tests/languages/clike/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/issue1340.test create mode 100644 docs/_style/prism-master/tests/languages/clike/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clojure/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clojure/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clojure/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clojure/operator_and_punctuation.test create mode 100644 docs/_style/prism-master/tests/languages/clojure/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript+haml/coffeescript_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript+pug/coffeescript_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/block-regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/class-member_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/inline-javascript_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cpp+pure/cpp_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/cpp/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cpp/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cpp/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cpp/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cpp/raw_string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/crystal/attribute_feature.test create mode 100644 docs/_style/prism-master/tests/languages/crystal/expansion_feature.test create mode 100644 docs/_style/prism-master/tests/languages/crystal/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/crystal/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp+aspnet/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/generic_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/issue1091.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/issue1365.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/issue1371.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/issue806.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/preprocessor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csp/directive_no_value_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csp/directive_with_source_expression_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csp/safe_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csp/unsafe_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/entity_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/hexcode_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/unit_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css+haml/css+haml_usage.test create mode 100644 docs/_style/prism-master/tests/languages/css+http/css_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/css+textile/css_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/css/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/register_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/token-string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/dart/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/dart/metadata_feature.test create mode 100644 docs/_style/prism-master/tests/languages/dart/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/dart/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/diff/coord_feature.test create mode 100644 docs/_style/prism-master/tests/languages/diff/diff_feature.test create mode 100644 docs/_style/prism-master/tests/languages/django/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/django/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/docker/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/docker/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/docker/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/atom_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/attribute_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/capture_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/issue1392.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/issue775.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/hvariable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/import_statement_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erb/erb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erb/erb_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/atom_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/flow/flow-punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/flow/function-variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/flow/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/flow/type_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran+pure/fortran_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/annotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/computation-expression_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/issue1480.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/preprocessor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gcode/checksum_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gcode/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gcode/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gcode/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gcode/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gedcom/level_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gedcom/line-value_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gedcom/pointer_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gedcom/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/feature_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/outline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/pystring_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/scenario_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/table_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/command_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/commit_sha1_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/coord_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/diff_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/glsl/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/glsl/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/glsl/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/glsl/preprocessor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/annotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/issue1049.js create mode 100644 docs/_style/prism-master/tests/languages/groovy/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/shebang_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/spock-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/string-interpolation_feature.js create mode 100644 docs/_style/prism-master/tests/languages/groovy/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/code_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/doctype_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/multiline-code_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/multiline-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars+pug/handlebars_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/handlebars_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/hvariable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/import_statement_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/metadata_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/preprocessor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/reification_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hpkp/safe_maxage_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hpkp/sha256_pin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hpkp/unsafe_maxage_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hsts/include_subdomains_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hsts/preload_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hsts/safe_maxage_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hsts/unsafe_maxage_feature.test create mode 100644 docs/_style/prism-master/tests/languages/http/header-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/http/request-line_feature.test create mode 100644 docs/_style/prism-master/tests/languages/http/response-status_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/builtin-keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/position_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/title_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/verb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ini/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ini/key_value_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ini/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/io/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/io/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/io/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/io/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/adverb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/conjunction_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/verb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/function_featrue.test create mode 100644 docs/_style/prism-master/tests/languages/java/generics_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/issue1351.test create mode 100644 docs/_style/prism-master/tests/languages/java/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/module_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/package_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript+haml/javascript_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/javascript+http/javascript_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/class-method_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/function-variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/issue1337.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/issue1340.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/issue1397.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/issue1526.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/supposed-classes_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/supposed-function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/template-string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/try-catch_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javastacktrace/more_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javastacktrace/stack-frame_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javastacktrace/summary_feature.test create mode 100644 docs/_style/prism-master/tests/languages/jolie/deployment_features.test create mode 100644 docs/_style/prism-master/tests/languages/jolie/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/jolie/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/jolie/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json+http/json-suffix_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/json+http/json_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/json/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/null_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1103.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1235.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1236.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1294.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1335.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1342.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1356.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1364.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1408.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1421.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/plain-text_feature.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/bold_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/annotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/raw-string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/cdata_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/equation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/headline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/less+haml/less_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/less+pug/less_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/less/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/less/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/less/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/less/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/less/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/liquid/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/liquid/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/liquid/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/liquid/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/car_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/declare_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/defun_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/defvar_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/heading_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/interactive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/lambda-feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/lisp-property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/number_boolean.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/quoted-symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/splice_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/argument_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/identifier_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/interpolated-string.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/keyword-operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown+haml/markdown_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markdown+pug/markdown_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/blockquote_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/bold_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/code_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/hr_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/italic_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/list_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/strike_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/title_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/url-reference_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup!+css+javascript/issue1240.test create mode 100644 docs/_style/prism-master/tests/languages/markup!+css/css_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markup!+javascript/javascript_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markup+actionscript/xml_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+css+wiki/table-tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+haml/markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+http/html_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markup+http/xml-suffix_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markup+http/xml_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markup+javascript+csharp+aspnet/script_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+php/php_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+pug/markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+tt2/tt2_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/cdata_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/doctype_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/entity_feature.js create mode 100644 docs/_style/prism-master/tests/languages/markup/entity_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/issue585.test create mode 100644 docs/_style/prism-master/tests/languages/markup/issue888.test create mode 100644 docs/_style/prism-master/tests/languages/markup/prolog_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/tag_attribute_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/code_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/flag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/parameter_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/preprocessor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/type-char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/n4js/annotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/n4js/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/register_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nginx/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nginx/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nginx/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/antiquotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/objectivec/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/objectivec/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/objectivec/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/type_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl+c/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl+c/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl+c/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl+c/type_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl+cpp/type_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/atom_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/escape_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/expression_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/parser-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pascal/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pascal/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pascal/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pascal/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pascal/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/filehandle_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/vstring_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php!+php-extras/global_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php!+php-extras/scope_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php!+php-extras/this_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/delimiter_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/package_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/shell-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/string-interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/plsql/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/plsql/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/plsql/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/issue1407.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/namespace_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/processing/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/processing/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/processing/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/processing/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/processing/type_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/properties/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/properties/key_value_feature.test create mode 100644 docs/_style/prism-master/tests/languages/protobuf/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/protobuf/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/code_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/doctype_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/flow-control_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/mixin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/multiline-plain-text_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/multiline-script_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/plain-text_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/script_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/datatype_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/heredoc_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/special_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/decorator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/issue1355.test create mode 100644 docs/_style/prism-master/tests/languages/python/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/string-interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/triple-quoted-string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/adverb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/datetime_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/verb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/ellipsis_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/percent-operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/character_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/constructor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/command-line-option_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/doctest-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/field_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/hr_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/link-target_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/link_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/list-bullet_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/literal-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/quoted-literal-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/substitution-def_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/table_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/title_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/character_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/date_time_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/reference_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/component_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/optional_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/value_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/wildcard_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/issue1336.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/method_definition_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/attribute_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/closure-params_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/issue1339.test create mode 100644 docs/_style/prism-master/tests/languages/rust/issue1353.test create mode 100644 docs/_style/prism-master/tests/languages/rust/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/lifetime-annotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/macro-rules_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/datalines_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/datetime_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sass/atrule-line_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sass/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sass/property-line_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sass/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sass/variable-line_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scala/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scala/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scala/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scala/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scala/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/character_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/issue1331.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss+haml/scss_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/scss+pug/scss_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/scss/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/null_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/placeholder_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/statement_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/block-arguments_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/character_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/temporary-variables_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/smarty_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/command-arg.test create mode 100644 docs/_style/prism-master/tests/languages/soy/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/literal_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/parameter_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/soy_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus+pug/stylus_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/atrule-declaration_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/func_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/hexcode_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/property-declaration_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/variable-declaration_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/bail_out_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/pass_fail_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/plan_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/pragma_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/version_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/yamlish_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/scope_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/acronym_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/block-tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/footnote_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/image_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/link-ref_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/link_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/list_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/mark_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/table_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/date_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/key_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/table_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tsx/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/delimiter_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/string-interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig+pug/twig_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/twig/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/typescript/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/typescript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vbnet/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vbnet/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/velocity/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/velocity/unparsed_feature.test create mode 100644 docs/_style/prism-master/tests/languages/velocity/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/velocity/velocity-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/vhdl-vectors_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/date_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wasm/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wasm/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wasm/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wasm/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wasm/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/block-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/emphasis_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/heading_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/hr_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/nowiki_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/directive-block-close_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/directive-block-open_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/directive-block-separator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/directive-inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/function-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/function-inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/axis_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/extension_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/keyword-operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/plain-text_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/xquery-attribute_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/xquery-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/xquery-element_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/datetime_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/key_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/null_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/scalar_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/tag_feature.test create mode 100644 docs/_style/prism-master/tests/run.js create mode 100644 docs/_style/prism-master/tests/testrunner-tests.js create mode 100644 docs/_style/prism-master/themes/prism-coy.css create mode 100644 docs/_style/prism-master/themes/prism-dark.css create mode 100644 docs/_style/prism-master/themes/prism-funky.css create mode 100644 docs/_style/prism-master/themes/prism-okaidia.css create mode 100644 docs/_style/prism-master/themes/prism-solarizedlight.css create mode 100644 docs/_style/prism-master/themes/prism-tomorrow.css create mode 100644 docs/_style/prism-master/themes/prism-twilight.css create mode 100644 docs/_style/prism-master/themes/prism.css create mode 100644 docs/_style/prism-master/utopia.js create mode 100644 docs/_style/prism-master/vendor/FileSaver.min.js create mode 100644 docs/_style/prism-master/vendor/jszip.min.js create mode 100644 docs/_style/prism-master/vendor/promise.js create mode 100644 docs/_style/style.css create mode 100644 docs/index.html create mode 100644 docs/notes/01. 考虑使用é™æ€å·¥åŽ‚方法替代构造方法.md create mode 100644 docs/notes/02. 当构造方法å‚数过多时使用builder模å¼.md create mode 100644 docs/notes/03. 使用ç§æœ‰æž„造方法或枚类实现Singleton属性.md create mode 100644 docs/notes/04. 使用ç§æœ‰æž„造方法执行éžå®žä¾‹åŒ–.md create mode 100644 docs/notes/05. 使用ä¾èµ–注入å–代硬连接资æº(hardwiring resources).md create mode 100644 docs/notes/06. é¿å…创建ä¸å¿…è¦çš„对象.md create mode 100644 docs/notes/07. 消除过期的对象引用.md create mode 100644 docs/notes/08. é¿å…使用Finalizerå’ŒCleaner机制.md create mode 100644 docs/notes/09. 使用try-with-resources语å¥æ›¿ä»£try-finally语å¥.md create mode 100644 docs/notes/10. é‡å†™equals方法时éµå®ˆé€šç”¨çº¦å®š.md create mode 100644 docs/notes/11. é‡å†™equals方法时åŒæ—¶ä¹Ÿè¦é‡å†™hashcode方法.md create mode 100644 docs/notes/12. 始终é‡å†™ toString 方法.md create mode 100644 docs/notes/13. 谨慎地é‡å†™ clone 方法.md create mode 100644 docs/notes/14. 考虑实现Comparable接å£.md create mode 100644 docs/notes/15. 使类和æˆå‘˜çš„å¯è®¿é—®æ€§æœ€å°åŒ–.md create mode 100644 docs/notes/16. 在公共类中使用访问方法而ä¸æ˜¯å…¬å…±å±žæ€§.md create mode 100644 docs/notes/17. 最å°åŒ–å¯å˜æ€§.md create mode 100644 docs/notes/18. 组åˆä¼˜äºŽç»§æ‰¿.md create mode 100644 docs/notes/19. 如使用继承则设计,应当文档说明,å¦åˆ™ä¸è¯¥ä½¿ç”¨.md create mode 100644 docs/notes/20. 接å£ä¼˜äºŽæŠ½è±¡ç±».md create mode 100644 docs/notes/21. 为åŽä»£è®¾è®¡æŽ¥å£.md create mode 100644 docs/notes/22. 接å£ä»…用æ¥å®šä¹‰ç±»åž‹.md create mode 100644 docs/notes/23. 优先使用类层次而ä¸æ˜¯æ ‡ç­¾ç±».md create mode 100644 docs/notes/24. 优先考虑é™æ€æˆå‘˜ç±».md create mode 100644 docs/notes/25. å°†æºæ–‡ä»¶é™åˆ¶ä¸ºå•ä¸ªé¡¶çº§ç±».md create mode 100644 docs/notes/26. ä¸è¦ä½¿ç”¨åŽŸå§‹ç±»åž‹.md create mode 100644 docs/notes/27. 消除éžæ£€æŸ¥è­¦å‘Š.md create mode 100644 docs/notes/28. 列表优于数组.md create mode 100644 docs/notes/29. 优先考虑泛型.md create mode 100644 docs/notes/30. 优先使用泛型方法.md create mode 100644 docs/notes/31. 使用é™å®šé€šé…符æ¥å¢žåŠ APIçš„çµæ´»æ€§.md create mode 100644 docs/notes/32. åˆç†åœ°ç»“åˆæ³›åž‹å’Œå¯å˜å‚æ•°.md create mode 100644 docs/notes/33. 优先考虑类型安全的异构容器.md create mode 100644 docs/notes/34. 使用枚举类型替代整型常é‡.md create mode 100644 docs/notes/35. 使用实例属性替代åºæ•°.md create mode 100644 docs/notes/36. 使用EnumSet替代ä½å±žæ€§.md create mode 100644 docs/notes/37. 使用EnumMap替代åºæ•°ç´¢å¼•.md create mode 100644 docs/notes/38. 使用接å£æ¨¡æ‹Ÿå¯æ‰©å±•çš„枚举.md create mode 100644 docs/notes/39. 注解优于命å模å¼.md create mode 100644 docs/notes/40. 始终使用Override注解.md create mode 100644 docs/notes/41. 使用标记接å£å®šä¹‰ç±»åž‹.md create mode 100644 docs/notes/42. lambda表达å¼ä¼˜äºŽåŒ¿åç±».md create mode 100644 docs/notes/43. 方法引用优于lambda表达å¼.md create mode 100644 docs/notes/44. 优先使用标准的函数å¼æŽ¥å£.md create mode 100644 docs/notes/45. 明智审慎地使用Stream.md create mode 100644 docs/notes/46. 优先考虑æµä¸­æ— å‰¯ä½œç”¨çš„函数.md create mode 100644 docs/notes/47. 优先使用Collection而ä¸æ˜¯Streamæ¥ä½œä¸ºæ–¹æ³•çš„返回类型.md create mode 100644 docs/notes/48. 谨慎使用æµå¹¶è¡Œ.md create mode 100644 docs/notes/49. 检查å‚数有效性.md create mode 100644 docs/notes/50. å¿…è¦æ—¶è¿›è¡Œé˜²å¾¡æ€§æ‹·è´.md create mode 100644 docs/notes/51. 仔细设计方法签å.md create mode 100644 docs/notes/52. 明智审慎地使用é‡è½½.md create mode 100644 docs/notes/69. åªé’ˆå¯¹å¼‚常的情况下æ‰ä½¿ç”¨å¼‚常.md create mode 100644 docs/notes/70. 对å¯æ¢å¤çš„情况使用å—检异常,对编程错误使用è¿è¡Œæ—¶å¼‚常.md create mode 100644 docs/notes/71. é¿å…ä¸å¿…è¦çš„使用å—检异常.md create mode 100644 docs/notes/72. 优先使用标准的异常.md create mode 100644 docs/notes/73. 抛出与抽象对应的异常.md create mode 100644 docs/notes/74. æ¯ä¸ªæ–¹æ³•æŠ›å‡ºçš„异常都需è¦åˆ›å»ºæ–‡æ¡£.md create mode 100644 docs/notes/75. 在细节消æ¯ä¸­åŒ…å«å¤±è´¥ä¸€æ•èŽ·ä¿¡æ¯.md create mode 100644 docs/notes/76. ä¿æŒå¤±è´¥åŽŸå­æ€§.md create mode 100644 docs/notes/77. ä¸è¦å¿½ç•¥å¼‚常.md create mode 100644 docs/notes/88. ä¿æŠ¤æ€§çš„编写 readObject 方法.md create mode 100644 docs/notes/89. 对于实例控制,枚举类型优于 readResolve.md create mode 100644 docs/notes/90. 考虑用åºåˆ—化代ç†ä»£æ›¿åºåˆ—化实例.md diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..7a29f49 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,66 @@ +## 💻 高效 Java 第三版 + +- [01. 考虑使用é™æ€å·¥åŽ‚方法替代构造方法.md](nodes/01.%20考虑使用é™æ€å·¥åŽ‚方法替代构造方法.md)
+- [02. 当构造方法å‚数过多时使用builder模å¼.md](nodes/02.%20当构造方法å‚数过多时使用builder模å¼.md)
+- [03. 使用ç§æœ‰æž„造方法或枚类实现Singleton属性.md](nodes/03.%20使用ç§æœ‰æž„造方法或枚类实现Singleton属性.md)
+- [04. 使用ç§æœ‰æž„造方法执行éžå®žä¾‹åŒ–.md](nodes/04.%20使用ç§æœ‰æž„造方法执行éžå®žä¾‹åŒ–.md)
+- [05. 使用ä¾èµ–注入å–代硬连接资æº(hardwiring resources).md](nodes/05.%20使用ä¾èµ–注入å–代硬连接资æº(hardwiring%20resources).md)
+- [06. é¿å…创建ä¸å¿…è¦çš„对象.md](nodes/06.%20é¿å…创建ä¸å¿…è¦çš„对象.md)
+- [07. 消除过期的对象引用.md](nodes/07.%20消除过期的对象引用.md)
+- [08. é¿å…使用Finalizerå’ŒCleaner机制.md](nodes/08.%20é¿å…使用Finalizerå’ŒCleaner机制.md)
+- [09. 使用try-with-resources语å¥æ›¿ä»£try-finally语å¥.md](nodes/09.%20使用try-with-resources语å¥æ›¿ä»£try-finally语å¥.md)
+- [10. é‡å†™equals方法时éµå®ˆé€šç”¨çº¦å®š.md](nodes/10.%20é‡å†™equals方法时éµå®ˆé€šç”¨çº¦å®š.md)
+- [11. é‡å†™equals方法时åŒæ—¶ä¹Ÿè¦é‡å†™hashcode方法.md](nodes/11.%20é‡å†™equals方法时åŒæ—¶ä¹Ÿè¦é‡å†™hashcode方法.md)
+- [12. 始终é‡å†™ toString 方法.md](nodes/12.%20始终é‡å†™%20toString%20方法.md)
+- [13. 谨慎地é‡å†™ clone 方法.md](nodes/13.%20谨慎地é‡å†™%20clone%20方法.md)
+- [14. 考虑实现Comparable接å£.md](nodes/14.%20考虑实现Comparable接å£.md)
+- [15. 使类和æˆå‘˜çš„å¯è®¿é—®æ€§æœ€å°åŒ–.md](nodes/15.%20使类和æˆå‘˜çš„å¯è®¿é—®æ€§æœ€å°åŒ–.md)
+- [16. 在公共类中使用访问方法而ä¸æ˜¯å…¬å…±å±žæ€§.md](nodes/16.%20在公共类中使用访问方法而ä¸æ˜¯å…¬å…±å±žæ€§.md)
+- [17. 最å°åŒ–å¯å˜æ€§.md](nodes/17.%20最å°åŒ–å¯å˜æ€§.md)
+- [18. 组åˆä¼˜äºŽç»§æ‰¿.md](nodes/18.%20组åˆä¼˜äºŽç»§æ‰¿.md)
+- [19. 如使用继承则设计,应当文档说明,å¦åˆ™ä¸è¯¥ä½¿ç”¨.md](nodes/19.%20如使用继承则设计,应当文档说明,å¦åˆ™ä¸è¯¥ä½¿ç”¨.md)
+- [20. 接å£ä¼˜äºŽæŠ½è±¡ç±».md](nodes/20.%20接å£ä¼˜äºŽæŠ½è±¡ç±».md)
+- [21. 为åŽä»£è®¾è®¡æŽ¥å£.md](nodes/21.%20为åŽä»£è®¾è®¡æŽ¥å£.md)
+- [22. 接å£ä»…用æ¥å®šä¹‰ç±»åž‹.md](nodes/22.%20接å£ä»…用æ¥å®šä¹‰ç±»åž‹.md)
+- [23. 优先使用类层次而ä¸æ˜¯æ ‡ç­¾ç±».md](nodes/23.%20优先使用类层次而ä¸æ˜¯æ ‡ç­¾ç±».md)
+- [24. 优先考虑é™æ€æˆå‘˜ç±».md](nodes/24.%20优先考虑é™æ€æˆå‘˜ç±».md)
+- [25. å°†æºæ–‡ä»¶é™åˆ¶ä¸ºå•ä¸ªé¡¶çº§ç±».md](nodes/25.%20å°†æºæ–‡ä»¶é™åˆ¶ä¸ºå•ä¸ªé¡¶çº§ç±».md)
+- [26. ä¸è¦ä½¿ç”¨åŽŸå§‹ç±»åž‹.md](nodes/26.%20ä¸è¦ä½¿ç”¨åŽŸå§‹ç±»åž‹.md)
+- [27. 消除éžæ£€æŸ¥è­¦å‘Š.md](nodes/27.%20消除éžæ£€æŸ¥è­¦å‘Š.md)
+- [28. 列表优于数组.md](nodes/28.%20列表优于数组.md)
+- [29. 优先考虑泛型.md](nodes/29.%20优先考虑泛型.md)
+- [30. 优先使用泛型方法.md](nodes/30.%20优先使用泛型方法.md)
+- [31. 使用é™å®šé€šé…符æ¥å¢žåŠ APIçš„çµæ´»æ€§.md](nodes/31.%20使用é™å®šé€šé…符æ¥å¢žåŠ APIçš„çµæ´»æ€§.md)
+- [32. åˆç†åœ°ç»“åˆæ³›åž‹å’Œå¯å˜å‚æ•°.md](nodes/32.%20åˆç†åœ°ç»“åˆæ³›åž‹å’Œå¯å˜å‚æ•°.md)
+- [33. 优先考虑类型安全的异构容器.md](nodes/33.%20优先考虑类型安全的异构容器.md)
+- [34. 使用枚举类型替代整型常é‡.md](nodes/34.%20使用枚举类型替代整型常é‡.md)
+- [35. 使用实例属性替代åºæ•°.md](nodes/35.%20使用实例属性替代åºæ•°.md)
+- [36. 使用EnumSet替代ä½å±žæ€§.md](nodes/36.%20使用EnumSet替代ä½å±žæ€§.md)
+- [37. 使用EnumMap替代åºæ•°ç´¢å¼•.md](nodes/37.%20使用EnumMap替代åºæ•°ç´¢å¼•.md)
+- [38. 使用接å£æ¨¡æ‹Ÿå¯æ‰©å±•çš„枚举.md](nodes/38.%20使用接å£æ¨¡æ‹Ÿå¯æ‰©å±•çš„枚举.md)
+- [39. 注解优于命å模å¼.md](nodes/39.%20注解优于命å模å¼.md)
+- [40. 始终使用Override注解.md](nodes/40.%20始终使用Override注解.md)
+- [41. 使用标记接å£å®šä¹‰ç±»åž‹.md](nodes/41.%20使用标记接å£å®šä¹‰ç±»åž‹.md)
+- [42. lambda表达å¼ä¼˜äºŽåŒ¿åç±».md](nodes/42.%20lambda表达å¼ä¼˜äºŽåŒ¿åç±».md)
+- [43. 方法引用优于lambda表达å¼.md](nodes/43.%20方法引用优于lambda表达å¼.md)
+- [44. 优先使用标准的函数å¼æŽ¥å£.md](nodes/44.%20优先使用标准的函数å¼æŽ¥å£.md)
+- [45. 明智审慎地使用Stream.md](nodes/45.%20明智审慎地使用Stream.md)
+- [46. 优先考虑æµä¸­æ— å‰¯ä½œç”¨çš„函数.md](nodes/46.%20优先考虑æµä¸­æ— å‰¯ä½œç”¨çš„函数.md)
+- [47. 优先使用Collection而ä¸æ˜¯Streamæ¥ä½œä¸ºæ–¹æ³•çš„返回类型.md](nodes/47.%20优先使用Collection而ä¸æ˜¯Streamæ¥ä½œä¸ºæ–¹æ³•çš„返回类型.md)
+- [48. 谨慎使用æµå¹¶è¡Œ.md](nodes/48.%20谨慎使用æµå¹¶è¡Œ.md)
+- [49. 检查å‚数有效性.md](nodes/49.%20检查å‚数有效性.md)
+- [50. å¿…è¦æ—¶è¿›è¡Œé˜²å¾¡æ€§æ‹·è´.md](nodes/50.%20å¿…è¦æ—¶è¿›è¡Œé˜²å¾¡æ€§æ‹·è´.md)
+- [51. 仔细设计方法签å.md](nodes/51.%20仔细设计方法签å.md)
+- [52. 明智审慎地使用é‡è½½.md](nodes/52.%20明智审慎地使用é‡è½½.md)
+- [69. åªé’ˆå¯¹å¼‚常的情况下æ‰ä½¿ç”¨å¼‚常.md](nodes/69.%20åªé’ˆå¯¹å¼‚常的情况下æ‰ä½¿ç”¨å¼‚常.md)
+- [70. 对å¯æ¢å¤çš„情况使用å—检异常,对编程错误使用è¿è¡Œæ—¶å¼‚常.md](nodes/70.%20对å¯æ¢å¤çš„情况使用å—检异常,对编程错误使用è¿è¡Œæ—¶å¼‚常.md)
+- [71. é¿å…ä¸å¿…è¦çš„使用å—检异常.md](nodes/71.%20é¿å…ä¸å¿…è¦çš„使用å—检异常.md)
+- [72. 优先使用标准的异常.md](nodes/72.%20优先使用标准的异常.md)
+- [73. 抛出与抽象对应的异常.md](nodes/73.%20抛出与抽象对应的异常.md)
+- [74. æ¯ä¸ªæ–¹æ³•æŠ›å‡ºçš„异常都需è¦åˆ›å»ºæ–‡æ¡£.md](nodes/74.%20æ¯ä¸ªæ–¹æ³•æŠ›å‡ºçš„异常都需è¦åˆ›å»ºæ–‡æ¡£.md)
+- [75. 在细节消æ¯ä¸­åŒ…å«å¤±è´¥ä¸€æ•èŽ·ä¿¡æ¯.md](nodes/75.%20在细节消æ¯ä¸­åŒ…å«å¤±è´¥ä¸€æ•èŽ·ä¿¡æ¯.md)
+- [76. ä¿æŒå¤±è´¥åŽŸå­æ€§.md](nodes/76.%20ä¿æŒå¤±è´¥åŽŸå­æ€§.md)
+- [77. ä¸è¦å¿½ç•¥å¼‚常.md](nodes/77.%20ä¸è¦å¿½ç•¥å¼‚常.md)
+- [88. ä¿æŠ¤æ€§çš„编写 readObject 方法.md](nodes/88.%20ä¿æŠ¤æ€§çš„编写%20readObject%20方法.md)
+- [89. 对于实例控制,枚举类型优于 readResolve.md](nodes/89.%20对于实例控制,枚举类型优于%20readResolve.md)
+- [90. 考虑用åºåˆ—化代ç†ä»£æ›¿åºåˆ—化实例.md](nodes/90.%20考虑用åºåˆ—化代ç†ä»£æ›¿åºåˆ—化实例.md)
\ No newline at end of file diff --git a/docs/_coverpage.md b/docs/_coverpage.md new file mode 100644 index 0000000..6906cd0 --- /dev/null +++ b/docs/_coverpage.md @@ -0,0 +1,12 @@ + + +# CS-Notes + +- 本项目包å«äº†æŠ€æœ¯é¢è¯•å¿…备的基础知识,内容浅显易懂,你ä¸éœ€è¦èŠ±å¾ˆé•¿çš„时间去阅读和ç†è§£æˆå †çš„技术书ç±å°±å¯ä»¥å¿«é€ŸæŽŒæ¡è¿™äº›çŸ¥è¯†ï¼Œä»Žè€ŒèŠ‚çœå®è´µçš„é¢è¯•å¤ä¹ æ—¶é—´ã€‚ + + + +[![stars](https://badgen.net/github/stars/CyC2018/CS-Notes?icon=github&color=4ab8a1)](https://github.com/CyC2018/CS-Notes) [![forks](https://badgen.net/github/forks/CyC2018/CS-Notes?icon=github&color=4ab8a1)](https://github.com/CyC2018/CS-Notes) + +[Get Started](README.md) + diff --git a/docs/_media/LogoMakr_1J56bI.png b/docs/_media/LogoMakr_1J56bI.png new file mode 100644 index 0000000000000000000000000000000000000000..8fdee22a7fe293b688e13a99b9ebd6c1c13fad65 GIT binary patch literal 57583 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 literal 0 HcmV?d00001 diff --git a/docs/_media/logomakr-3sxxzw-128x128.png b/docs/_media/logomakr-3sxxzw-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..80092a9453cbc1b9652139e87ccd5c1492daf64b GIT binary patch literal 2318 zcmV+p3Gw!cP)C00001b5ch_0olnc ze*gdhM^H>uMF0Q*qSW47Pd{8xL7~&#qSW1ht*xQa+MmwXq14@+%F?3K-l5dqUR6e+ z(cXianW5C(q151tsH%#-(tM4Hh@+&Fz}2GE-lNstq14`bh=i8X+?&VGT~kDHd2ylE z-(gxzqSW4Pac7~_-C|u(lexWedvu}H-lEmuqSe)9Vpd>RNubl+evyuKe|dqHl%&?+ zWMEU0wz_Y1ZKBlPqSfDPZDXL*+>NfVqSf7`)ZU@f-J#UonZ(O!X)83-f-k#Rqpwio-)7_!c;E>VSg`S?G)83%d z+?~(aq14`?)ZU}i-l5aqqSW4?)7_)h-=WjotJmP4*59et;i1#rkFm6^+2Nwp-lEjq zq1E2F?gz2D}b)!@P8=%(1>UqIpt0001ObW%=J0RR90{`mv{|M&m&{Qn;R z@OS?P|NjW&p4$Hp|Ns9&|Lyib{p-((g~3e1`+c*PL8uWiGPPIVz4oyuOX*uTjU2*# z+xV2UgWY>k%NvnHmH~5kcQVrfPxS z`_zN-;RrmLc1+V(;^w@X4n6ZzEu+2Wz(IUl*}8Hh<)sz5J4N%S==D&+X=y zr1O1-05|sYOVSOUzhWx!v4;g&Bu<0znByFPn!`n^^kU}>L4w@hYVv74V zB%ww~X@k-$=lLb+mBt4M-v#hsrRxhu9rXba?(VkvgUE4xe%{yl0Qo-(i~_#Ir2MX* zuWb;XV~JG3f~yI6kgqXR!vk^rWw|AQYm#pj4%8J8at_i)PT_aSZ@F4~+G}tmj(=BH z1?b~zepj%`h-5%!I#0&rTP z)HcMLVXM6;-;_pG{w1ICb3M9e*d^T*!00eEJJeL|Ar5}uk}5z{`Pp0#dFQo3pRWL% zvi-1saaOUbDPsW!RsLCj>(`!Qk+buDW}o0GSYs)SyMIOuSqzd)jlIu3K*yz2+F%;OhmsGYE%k8CP5Gw0|yl`^q`GHpW4n^29$M zc4@F+#6JbS@NWC}j<)y65Y0E&0eMH}9-MR`FbwepwP8;Ey^i)Di~5M&J_F*R%<~r7 z-BmF1ZEv9$F2h$?z=oLVCyj9q2wSqfoQ(FRiLb$s+H|$^kMC>@9Yr1|*m4HwwnYA+ z5v(J10lVmf3Zq@Bz63tfLKg414e(=`>^rOzLxsD5R{sv2s<#DfE|>63B?j<=(Hz=i z>zRXI^26Ca!=JptvSpx=E3P6 zK3-g@`>2T2NNjcno&}_sA?Gy7Jj!0BTA+tgS3+k6_>tAaM242bl8TFu&7>~HH zuIPaLY_a=>D!@skIVo2!9@GXWIF#p`16|T zuHyd?ps4w16|u2&hXxN)OhQUcZN|NpAAEOw3Ov{s{It^oq)~ow>|psq3qf6Zp>=<3 z2^%;+IJLcoN{er&Isw3(gP%{`#Hu>MWvnb*k@!Jm!YTdw%ec!g} z+eQ(gMZVV-F1{sy3yaR7-`4JXjUI~OKeT+=YxqV$Z1UV#yy>N&+OsBHTe;??f%mAV zGNaT>@0U-9)1lbqef&a<)^i{ksa7^0 oijCUiW35qq*sN3|7O(gI1F3MsB12evkpKVy07*qoM6N<$g3xNwRR910 literal 0 HcmV?d00001 diff --git a/docs/_media/公众å·.jpg b/docs/_media/公众å·.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab57e6b2ddd91610e6fa1d865068782ccddc69ca GIT binary patch literal 27415 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
L-V>1ELXrEVE^*$$GR2pL(l8mlQ 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/.editorconfig b/docs/_style/prism-master/.editorconfig new file mode 100644 index 0000000..b2e4603 --- /dev/null +++ b/docs/_style/prism-master/.editorconfig @@ -0,0 +1,14 @@ +root = true + +[*] +insert_final_newline = false +charset = utf-8 +indent_style = tab +indent_size = 4 + +[tests/languages/**.test] +end_of_line = crlf + +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/docs/_style/prism-master/.gitattributes b/docs/_style/prism-master/.gitattributes new file mode 100644 index 0000000..1d598bd --- /dev/null +++ b/docs/_style/prism-master/.gitattributes @@ -0,0 +1,4 @@ +* text=auto + +# Test files should not have their line endings modified by git +/tests/languages/**/*.test binary \ No newline at end of file diff --git a/docs/_style/prism-master/.gitignore b/docs/_style/prism-master/.gitignore new file mode 100644 index 0000000..3b16b7d --- /dev/null +++ b/docs/_style/prism-master/.gitignore @@ -0,0 +1,4 @@ +hide-*.js +node_modules +.idea/ +.DS_Store diff --git a/docs/_style/prism-master/.npmignore b/docs/_style/prism-master/.npmignore new file mode 100644 index 0000000..2ff075c --- /dev/null +++ b/docs/_style/prism-master/.npmignore @@ -0,0 +1,27 @@ +.idea +*.iml + +hide-*.js + +CNAME +examples/ +img/ +templates/ +tests/ +vendor/ +*.tgz +*.html +style.css +favicon.png +logo.svg +bower.json +composer.json +download.js +examples.js +gulpfile.js +prefixfree.min.js +utopia.js +code.js +.editorconfig +.gitattributes +.travis.yml \ No newline at end of file diff --git a/docs/_style/prism-master/.travis.yml b/docs/_style/prism-master/.travis.yml new file mode 100644 index 0000000..3d0c7d1 --- /dev/null +++ b/docs/_style/prism-master/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +node_js: +- '4' +- '6' +- '8' +- '9' +# Build all branches +branches: + only: + - gh-pages + - /.*/ +before_script: +- npm install -g gulp +- gulp +script: npm test +deploy: + provider: npm + email: lea@verou.me + api_key: + secure: TjRcXEr7Y/9KRJ4EOEQbd2Ij8hxKj8c/yOpEROy2lTYv6QH9x46nFDgZEE3VHfp/nnBUYpC47dRaSxiUj8H5rtkMNCZrREZu1n1zahmzP6dI6kCj+H3GiY7yw/Jhdx3uvQZHwknW2TJ/YRsLeQsmMSG2HnJobY9Zn4REX5ccP2E= + on: + tags: true + repo: PrismJS/prism diff --git a/docs/_style/prism-master/CHANGELOG.md b/docs/_style/prism-master/CHANGELOG.md new file mode 100644 index 0000000..14c6405 --- /dev/null +++ b/docs/_style/prism-master/CHANGELOG.md @@ -0,0 +1,1334 @@ +# Prism Changelog + +## 1.15.0 (2018-06-16) + +### New components + +* __Template Tookit 2__ ([#1418](https://github.com/PrismJS/prism/issues/1418)) [[`e063992`](https://github.com/PrismJS/prism/commit/e063992)] +* __XQuery__ ([#1411](https://github.com/PrismJS/prism/issues/1411)) [[`e326cb0`](https://github.com/PrismJS/prism/commit/e326cb0)] +* __TAP__ ([#1430](https://github.com/PrismJS/prism/issues/1430)) [[`8c2b71f`](https://github.com/PrismJS/prism/commit/8c2b71f)] + +### Updated components + +* __HTTP__ + * Absolute path is a valid request uri ([#1388](https://github.com/PrismJS/prism/issues/1388)) [[`f6e81cb`](https://github.com/PrismJS/prism/commit/f6e81cb)] +* __Kotlin__ + * Add keywords of Kotlin and modify it's number pattern. ([#1389](https://github.com/PrismJS/prism/issues/1389)) [[`1bf73b0`](https://github.com/PrismJS/prism/commit/1bf73b0)] + * Add `typealias` keyword ([#1437](https://github.com/PrismJS/prism/issues/1437)) [[`a21fdee`](https://github.com/PrismJS/prism/commit/a21fdee)] +* __JavaScript + * Improve Regexp pattern [[`5b043cf`](https://github.com/PrismJS/prism/commit/5b043cf)] + * Add support for one level of nesting inside template strings. Fix [#1397](https://github.com/PrismJS/prism/issues/1397) [[`db2d0eb`](https://github.com/PrismJS/prism/commit/db2d0eb)] +* __Elixir__ + * Elixir: Fix attributes consuming punctuation. Fix [#1392](https://github.com/PrismJS/prism/issues/1392) [[`dac0485`](https://github.com/PrismJS/prism/commit/dac0485)] +* __Bash__ + * Change reserved keyword reference ([#1396](https://github.com/PrismJS/prism/issues/1396)) [[`b94f01f`](https://github.com/PrismJS/prism/commit/b94f01f)] +* __PowerShell__ + * Allow for one level of nesting in expressions inside strings. Fix [#1407](https://github.com/PrismJS/prism/issues/1407) [[`9272d6f`](https://github.com/PrismJS/prism/commit/9272d6f)] +* __JSX__ + * Allow for two levels of nesting inside JSX tags. Fix [#1408](https://github.com/PrismJS/prism/issues/1408) [[`f1cd7c5`](https://github.com/PrismJS/prism/commit/f1cd7c5)] + * Add support for fragments short syntax. Fix [#1421](https://github.com/PrismJS/prism/issues/1421) [[`38ce121`](https://github.com/PrismJS/prism/commit/38ce121)] +* __Pascal__ + * Add `objectpascal` as an alias to `pascal` ([#1426](https://github.com/PrismJS/prism/issues/1426)) [[`a0bfc84`](https://github.com/PrismJS/prism/commit/a0bfc84)] +* __Swift__ + * Fix Swift 'protocol' keyword ([#1440](https://github.com/PrismJS/prism/issues/1440)) [[`081e318`](https://github.com/PrismJS/prism/commit/081e318)] + +### Updated plugins + +* __File Highlight__ + * Fix issue causing the Download button to show up on every code blocks. [[`cd22499`](https://github.com/PrismJS/prism/commit/cd22499)] + * Simplify lang regex on File Highlight plugin ([#1399](https://github.com/PrismJS/prism/issues/1399)) [[`7bc9a4a`](https://github.com/PrismJS/prism/commit/7bc9a4a)] +* __Show Language__ + * Don't process language if block language not set ([#1410](https://github.com/PrismJS/prism/issues/1410)) [[`c111869`](https://github.com/PrismJS/prism/commit/c111869)] +* __Autoloader__ + * ASP.NET should require C# [[`fa328bb`](https://github.com/PrismJS/prism/commit/fa328bb)] +* __Line Numbers__ + * Make line-numbers styles more specific ([#1434](https://github.com/PrismJS/prism/issues/1434), [#1435](https://github.com/PrismJS/prism/issues/1435)) [[`9ee4f54`](https://github.com/PrismJS/prism/commit/9ee4f54)] + +### Updated themes + +* Add .token.class-name to rest of themes ([#1360](https://github.com/PrismJS/prism/issues/1360)) [[`f356dfe`](https://github.com/PrismJS/prism/commit/f356dfe)] + +### Other changes + +* __Website__ + * Site now loads over HTTPS! + * Use HTTPS / canonical URLs ([#1390](https://github.com/PrismJS/prism/issues/1390)) [[`95146c8`](https://github.com/PrismJS/prism/commit/95146c8)] + * Added Angular tutorial link [[`c436a7c`](https://github.com/PrismJS/prism/commit/c436a7c)] + * Use rel="icon" instead of rel="shortcut icon" ([#1398](https://github.com/PrismJS/prism/issues/1398)) [[`d95f8fb`](https://github.com/PrismJS/prism/commit/d95f8fb)] + * Fix Download page not handling multiple dependencies when from Redownload URL [[`c2ff248`](https://github.com/PrismJS/prism/commit/c2ff248)] + * Update documentation for node & webpack usage [[`1e99e96`](https://github.com/PrismJS/prism/commit/1e99e96)] +* Handle optional dependencies in `loadLanguages()` ([#1417](https://github.com/PrismJS/prism/issues/1417)) [[`84935ac`](https://github.com/PrismJS/prism/commit/84935ac)] +* Add Chinese translation [[`f2b1964`](https://github.com/PrismJS/prism/commit/f2b1964)] + +## 1.14.0 (2018-04-11) + +### New components +* __GEDCOM__ ([#1385](https://github.com/PrismJS/prism/issues/1385)) [[`6e0b20a`](https://github.com/PrismJS/prism/commit/6e0b20a)] +* __Lisp__ ([#1297](https://github.com/PrismJS/prism/issues/1297)) [[`46468f8`](https://github.com/PrismJS/prism/commit/46468f8)] +* __Markup Templating__ ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)] +* __Soy__ ([#1387](https://github.com/PrismJS/prism/issues/1387)) [[`b4509bf`](https://github.com/PrismJS/prism/commit/b4509bf)] +* __Velocity__ ([#1378](https://github.com/PrismJS/prism/issues/1378)) [[`5a524f7`](https://github.com/PrismJS/prism/commit/5a524f7)] +* __Visual Basic__ ([#1382](https://github.com/PrismJS/prism/issues/1382)) [[`c673ec2`](https://github.com/PrismJS/prism/commit/c673ec2)] +* __WebAssembly__ ([#1386](https://github.com/PrismJS/prism/issues/1386)) [[`c28d8c5`](https://github.com/PrismJS/prism/commit/c28d8c5)] + +### Updated components +* __Bash__: + * Add curl to the list of common functions. Close [#1160](https://github.com/PrismJS/prism/issues/1160) [[`1bfc084`](https://github.com/PrismJS/prism/commit/1bfc084)] +* __C-like__: + * Make single-line comments greedy. Fix [#1337](https://github.com/PrismJS/prism/issues/1337). Make sure [#1340](https://github.com/PrismJS/prism/issues/1340) stays fixed. [[`571f2c5`](https://github.com/PrismJS/prism/commit/571f2c5)] +* __C#__: + * More generic class-name highlighting. Fix [#1365](https://github.com/PrismJS/prism/issues/1365) [[`a6837d2`](https://github.com/PrismJS/prism/commit/a6837d2)] + * More specific class-name highlighting. Fix [#1371](https://github.com/PrismJS/prism/issues/1371) [[`0a95f69`](https://github.com/PrismJS/prism/commit/0a95f69)] +* __Eiffel__: + * Fix verbatim strings. Fix [#1379](https://github.com/PrismJS/prism/issues/1379) [[`04df41b`](https://github.com/PrismJS/prism/commit/04df41b)] +* __Elixir__ + * Make regexps greedy, remove comment hacks. Update known failures and tests. [[`e93d61f`](https://github.com/PrismJS/prism/commit/e93d61f)] +* __ERB__: + * Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)] +* __Fortran__: + * Make single-line comments greedy. Update known failures and tests. [[`c083b78`](https://github.com/PrismJS/prism/commit/c083b78)] +* __Handlebars__: + * Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)] +* __Java__: + * Add support for generics. Fix [#1351](https://github.com/PrismJS/prism/issues/1351) [[`a5cf302`](https://github.com/PrismJS/prism/commit/a5cf302)] +* __JavaScript__: + * Add support for constants. Fix [#1348](https://github.com/PrismJS/prism/issues/1348) [[`9084481`](https://github.com/PrismJS/prism/commit/9084481)] + * Improve Regex matching [[`172d351`](https://github.com/PrismJS/prism/commit/172d351)] +* __JSX__: + * Fix highlighting of empty objects. Fix [#1364](https://github.com/PrismJS/prism/issues/1364) [[`b26bbb8`](https://github.com/PrismJS/prism/commit/b26bbb8)] +* __Monkey__: + * Make comments greedy. Update known failures and tests. [[`d7b2b43`](https://github.com/PrismJS/prism/commit/d7b2b43)] +* __PHP__: + * Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)] +* __Puppet__: + * Make heredoc, comments, regexps and strings greedy. Update known failures and tests. [[`0c139d1`](https://github.com/PrismJS/prism/commit/0c139d1)] +* __Q__: + * Make comments greedy. Update known failures and tests. [[`a0f5081`](https://github.com/PrismJS/prism/commit/a0f5081)] +* __Ruby__: + * Make multi-line comments greedy, remove single-line comment hack. Update known failures and tests. [[`b0e34fb`](https://github.com/PrismJS/prism/commit/b0e34fb)] +* __SQL__: + * Add missing keywords. Fix [#1374](https://github.com/PrismJS/prism/issues/1374) [[`238b195`](https://github.com/PrismJS/prism/commit/238b195)] + +### Updated plugins +* __Command Line__: + * Command Line: Allow specifying output prefix using data-filter-output attribute. ([#856](https://github.com/PrismJS/prism/issues/856)) [[`094d546`](https://github.com/PrismJS/prism/commit/094d546)] +* __File Highlight__: + * Add option to provide a download button, when used with the Toolbar plugin. Fix [#1030](https://github.com/PrismJS/prism/issues/1030) [[`9f22952`](https://github.com/PrismJS/prism/commit/9f22952)] + +### Updated themes +* __Default__: + * Reach AA contrast ratio level ([#1296](https://github.com/PrismJS/prism/issues/1296)) [[`8aea939`](https://github.com/PrismJS/prism/commit/8aea939)] + +### Other changes +* Website: Remove broken third-party tutorials from homepage [[`0efd6e1`](https://github.com/PrismJS/prism/commit/0efd6e1)] +* Docs: Mention `loadLanguages()` function on homepage in the nodeJS section. Close [#972](https://github.com/PrismJS/prism/issues/972), close [#593](https://github.com/PrismJS/prism/issues/593) [[`4a14d20`](https://github.com/PrismJS/prism/commit/4a14d20)] +* Core: Greedy patterns should always be matched against the full string. Fix [#1355](https://github.com/PrismJS/prism/issues/1355) [[`294efaa`](https://github.com/PrismJS/prism/commit/294efaa)] +* Crystal: Update known failures. [[`e1d2d42`](https://github.com/PrismJS/prism/commit/e1d2d42)] +* D: Update known failures and tests. [[`13d9991`](https://github.com/PrismJS/prism/commit/13d9991)] +* Markdown: Update known failures. [[`5b6c76d`](https://github.com/PrismJS/prism/commit/5b6c76d)] +* Matlab: Update known failures. [[`259b6fc`](https://github.com/PrismJS/prism/commit/259b6fc)] +* Website: Remove non-existent anchor to failures. Reword on homepage to make is less misleading. [[`8c0911a`](https://github.com/PrismJS/prism/commit/8c0911a)] +* Website: Add link to Keep Markup plugin in FAQ [[`e8cb6d4`](https://github.com/PrismJS/prism/commit/e8cb6d4)] +* Test suite: Memory leak in vm.runInNewContext() seems fixed. Revert [[`9a4b6fa`](https://github.com/PrismJS/prism/commit/9a4b6fa)] to drastically improve tests execution time. [[`9bceece`](https://github.com/PrismJS/prism/commit/9bceece), [`7c7602b`](https://github.com/PrismJS/prism/commit/7c7602b)] +* Gulp: Don't minify `components/index.js` [[`689227b`](https://github.com/PrismJS/prism/commit/689227b)] +* Website: Fix theme selection on Download page, when theme is in query string or hash. [[`b4d3063`](https://github.com/PrismJS/prism/commit/b4d3063)] +* Update JSPM config to also include unminified components. Close [#995](https://github.com/PrismJS/prism/issues/995) [[`218f160`](https://github.com/PrismJS/prism/commit/218f160)] +* Core: Fix support for language alias containing dash `-` [[`659ea31`](https://github.com/PrismJS/prism/commit/659ea31)] + +## 1.13.0 (2018-03-21) + +### New components +* __ERB__ [[`e6213ac`](https://github.com/PrismJS/prism/commit/e6213ac)] +* __PL/SQL__ ([#1338](https://github.com/PrismJS/prism/issues/1338)) [[`3599e6a`](https://github.com/PrismJS/prism/commit/3599e6a)] + +### Updated components +* __JSX__: + * Add support for plain text inside tags ([#1357](https://github.com/PrismJS/prism/issues/1357)) [[`2b8321d`](https://github.com/PrismJS/prism/commit/2b8321d)] +* __Markup__: + * Make tags greedy. Fix [#1356](https://github.com/PrismJS/prism/issues/1356) [[`af834be`](https://github.com/PrismJS/prism/commit/af834be)] +* __Powershell__: + * Add lookbehind to fix function interpolation inside strings. Fix [#1361](https://github.com/PrismJS/prism/issues/1361) [[`d2c026e`](https://github.com/PrismJS/prism/commit/d2c026e)] +* __Rust__: + * Improve char pattern so that lifetime annotations are matched better. Fix [#1353](https://github.com/PrismJS/prism/issues/1353) [[`efdccbf`](https://github.com/PrismJS/prism/commit/efdccbf)] + +### Updated themes +* __Default__: + * Add color for class names [[`8572474`](https://github.com/PrismJS/prism/commit/8572474)] +* __Coy__: + * Inherit pre's height on code, so it does not break on Download page. [[`c6c7fd1`](https://github.com/PrismJS/prism/commit/c6c7fd1)] + +### Other changes +* Website: Auto-generate example headers [[`c3ed5b5`](https://github.com/PrismJS/prism/commit/c3ed5b5)] +* Core: Allow cloning of circular structures. ([#1345](https://github.com/PrismJS/prism/issues/1345)) [[`f90d555`](https://github.com/PrismJS/prism/commit/f90d555)] +* Core: Generate components.js from components.json and make it exportable to nodeJS. ([#1354](https://github.com/PrismJS/prism/issues/1354)) [[`ba60df0`](https://github.com/PrismJS/prism/commit/ba60df0)] +* Website: Improve appearance of theme selector [[`0460cad`](https://github.com/PrismJS/prism/commit/0460cad)] +* Website: Check stored theme by default + link both theme selectors together. Close [#1038](https://github.com/PrismJS/prism/issues/1038) [[`212dd4e`](https://github.com/PrismJS/prism/commit/212dd4e)] +* Tests: Use the new components.js file directly [[`0e1a8b7`](https://github.com/PrismJS/prism/commit/0e1a8b7)] +* Update .npmignore Close [#1274](https://github.com/PrismJS/prism/issues/1274) [[`a52319a`](https://github.com/PrismJS/prism/commit/a52319a)] +* Add a loadLanguages() function for easy component loading on NodeJS ([#1359](https://github.com/PrismJS/prism/issues/1359)) [[`a5331a6`](https://github.com/PrismJS/prism/commit/a5331a6)] + +## 1.12.2 (2018-03-08) + +### Other changes +* Test against NodeJS 4, 6, 8 and 9 ([#1329](https://github.com/PrismJS/prism/issues/1329)) [[`97b7d0a`](https://github.com/PrismJS/prism/commit/97b7d0a)] +* Stop testing against NodeJS 0.10 and 0.12 [[`df01b1b`](https://github.com/PrismJS/prism/commit/df01b1b)] + +## 1.12.1 (2018-03-08) + +### Updated components +* __C-like__: + * Revert [[`b98e5b9`](https://github.com/PrismJS/prism/commit/b98e5b9)] to fix [#1340](https://github.com/PrismJS/prism/issues/1340). Reopened [#1337](https://github.com/PrismJS/prism/issues/1337). [[`cebacdf`](https://github.com/PrismJS/prism/commit/cebacdf)] +* __JSX__: + * Allow for one level of nested curly braces inside tag attribute value. Fix [#1335](https://github.com/PrismJS/prism/issues/1335) [[`05bf67d`](https://github.com/PrismJS/prism/commit/05bf67d)] +* __Ruby__: + * Ensure module syntax is not confused with symbols. Fix [#1336](https://github.com/PrismJS/prism/issues/1336) [[`31a2a69`](https://github.com/PrismJS/prism/commit/31a2a69)] + +## 1.12.0 (2018-03-07) + +### New components +* __ARFF__ ([#1327](https://github.com/PrismJS/prism/issues/1327)) [[`0bc98ac`](https://github.com/PrismJS/prism/commit/0bc98ac)] +* __Clojure__ ([#1311](https://github.com/PrismJS/prism/issues/1311)) [[`8b4d3bd`](https://github.com/PrismJS/prism/commit/8b4d3bd)] +* __Liquid__ ([#1326](https://github.com/PrismJS/prism/issues/1326)) [[`f0b2c9e`](https://github.com/PrismJS/prism/commit/f0b2c9e)] + +### Updated components +* __Bash__: + * Add shell as an alias ([#1321](https://github.com/PrismJS/prism/issues/1321)) [[`67e16a2`](https://github.com/PrismJS/prism/commit/67e16a2)] + * Add support for quoted command substitution. Fix [#1287](https://github.com/PrismJS/prism/issues/1287) [[`63fc215`](https://github.com/PrismJS/prism/commit/63fc215)] +* __C#__: + * Add "dotnet" alias. [[`405867c`](https://github.com/PrismJS/prism/commit/405867c)] +* __C-like__: + * Change order of comment patterns and make multi-line one greedy. Fix [#1337](https://github.com/PrismJS/prism/issues/1337) [[`b98e5b9`](https://github.com/PrismJS/prism/commit/b98e5b9)] +* __NSIS__: + * Add support for NSIS 3.03 ([#1288](https://github.com/PrismJS/prism/issues/1288)) [[`bd1e98b`](https://github.com/PrismJS/prism/commit/bd1e98b)] + * Add missing NSIS commands ([#1289](https://github.com/PrismJS/prism/issues/1289)) [[`ad2948f`](https://github.com/PrismJS/prism/commit/ad2948f)] +* __PHP__: + * Add support for string interpolation inside double-quoted strings. Fix [#1146](https://github.com/PrismJS/prism/issues/1146) [[`9f1f8d6`](https://github.com/PrismJS/prism/commit/9f1f8d6)] + * Add support for Heredoc and Nowdoc strings [[`5d7223c`](https://github.com/PrismJS/prism/commit/5d7223c)] + * Fix shell-comment failure now that strings are greedy [[`ad25d22`](https://github.com/PrismJS/prism/commit/ad25d22)] +* __PowerShell__: + * Add support for two levels of nested brackets inside namespace pattern. Fixes [#1317](https://github.com/PrismJS/prism/issues/1317) [[`3bc3e9c`](https://github.com/PrismJS/prism/commit/3bc3e9c)] +* __Ruby__: + * Add keywords "protected", "private" and "public" [[`4593837`](https://github.com/PrismJS/prism/commit/4593837)] +* __Rust__: + * Add support for lifetime-annotation and => operator. Fix [#1339](https://github.com/PrismJS/prism/issues/1339) [[`926f6f8`](https://github.com/PrismJS/prism/commit/926f6f8)] +* __Scheme__: + * Don't highlight first number of a list as a function. Fix [#1331](https://github.com/PrismJS/prism/issues/1331) [[`51bff80`](https://github.com/PrismJS/prism/commit/51bff80)] +* __SQL__: + * Add missing keywords and functions, fix numbers [[`de29d4a`](https://github.com/PrismJS/prism/commit/de29d4a)] + +### Updated plugins +* __Autolinker__: + * Allow more chars in query string and hash to match more URLs. Fix [#1142](https://github.com/PrismJS/prism/issues/1142) [[`109bd6f`](https://github.com/PrismJS/prism/commit/109bd6f)] +* __Copy to Clipboard__: + * Bump ClipboardJS to 2.0.0 and remove hack ([#1314](https://github.com/PrismJS/prism/issues/1314)) [[`e9f410e`](https://github.com/PrismJS/prism/commit/e9f410e)] +* __Toolbar__: + * Prevent scrolling toolbar with content ([#1305](https://github.com/PrismJS/prism/issues/1305), [#1314](https://github.com/PrismJS/prism/issues/1314)) [[`84eeb89`](https://github.com/PrismJS/prism/commit/84eeb89)] +* __Unescaped Markup__: + * Use msMatchesSelector for IE11 and below. Fix [#1302](https://github.com/PrismJS/prism/issues/1302) [[`c246c1a`](https://github.com/PrismJS/prism/commit/c246c1a)] +* __WebPlatform Docs__: + * WebPlatform Docs plugin: Fix links. Fixes [#1290](https://github.com/PrismJS/prism/issues/1290) [[`7a9dbe0`](https://github.com/PrismJS/prism/commit/7a9dbe0)] + +### Other changes +* Fix Autoloader's demo page [[`3dddac9`](https://github.com/PrismJS/prism/commit/3dddac9)] +* Download page: Use hash instead of query-string for redownload URL. Fix [#1263](https://github.com/PrismJS/prism/issues/1263) [[`b03c02a`](https://github.com/PrismJS/prism/commit/b03c02a)] +* Core: Don't thow an error if lookbehing is used without anything matching. [[`e0cd47f`](https://github.com/PrismJS/prism/commit/e0cd47f)] +* Docs: Fix link to the `` element specification in HTML5 [[`a84263f`](https://github.com/PrismJS/prism/commit/a84263f)] +* Docs: Mention support for `lang-xxxx` class. Close [#1312](https://github.com/PrismJS/prism/issues/1312) [[`a9e76db`](https://github.com/PrismJS/prism/commit/a9e76db)] +* Docs: Add note on `async` parameter to clarify the requirement of using a single bundled file. Closes [#1249](https://github.com/PrismJS/prism/issues/1249) [[`eba0235`](https://github.com/PrismJS/prism/commit/eba0235)] + +## 1.11.0 (2018-02-05) + +### New components +* __Content-Security-Policy (CSP)__ ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)] +* __HTTP Public-Key-Pins (HPKP)__ ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)] +* __HTTP String-Transport-Security (HSTS)__ ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)] +* __React TSX__ ([#1280](https://github.com/PrismJS/prism/issues/1280)) [[`fbe82b8`](https://github.com/PrismJS/prism/commit/fbe82b8)] + +### Updated components +* __C++__: + * Add C++ platform-independent types ([#1271](https://github.com/PrismJS/prism/issues/1271)) [[`3da238f`](https://github.com/PrismJS/prism/commit/3da238f)] +* __TypeScript__: + * Improve typescript with builtins ([#1277](https://github.com/PrismJS/prism/issues/1277)) [[`5de1b1f`](https://github.com/PrismJS/prism/commit/5de1b1f)] + +### Other changes +* Fix passing of non-enumerable Error properties from the child test runner ([#1276](https://github.com/PrismJS/prism/issues/1276)) [[`38df653`](https://github.com/PrismJS/prism/commit/38df653)] + +## 1.10.0 (2018-01-17) + +### New components +* __6502 Assembly__ ([#1245](https://github.com/PrismJS/prism/issues/1245)) [[`2ece18b`](https://github.com/PrismJS/prism/commit/2ece18b)] +* __Elm__ ([#1174](https://github.com/PrismJS/prism/issues/1174)) [[`d6da70e`](https://github.com/PrismJS/prism/commit/d6da70e)] +* __IchigoJam BASIC__ ([#1246](https://github.com/PrismJS/prism/issues/1246)) [[`cf840be`](https://github.com/PrismJS/prism/commit/cf840be)] +* __Io__ ([#1251](https://github.com/PrismJS/prism/issues/1251)) [[`84ed3ed`](https://github.com/PrismJS/prism/commit/84ed3ed)] + +### Updated components +* __BASIC__: + * Make strings greedy [[`60114d0`](https://github.com/PrismJS/prism/commit/60114d0)] +* __C++__: + * Add C++11 raw string feature ([#1254](https://github.com/PrismJS/prism/issues/1254)) [[`71595be`](https://github.com/PrismJS/prism/commit/71595be)] + +### Updated plugins +* __Autoloader__: + * Add support for `data-autoloader-path` ([#1242](https://github.com/PrismJS/prism/issues/1242)) [[`39360d6`](https://github.com/PrismJS/prism/commit/39360d6)] +* __Previewers__: + * New plugin combining previous plugins Previewer: Base, Previewer: Angle, Previewer: Color, Previewer: Easing, Previewer: Gradient and Previewer: Time. ([#1244](https://github.com/PrismJS/prism/issues/1244)) [[`28e4b4c`](https://github.com/PrismJS/prism/commit/28e4b4c)] +* __Unescaped Markup__: + * Make it work with any language ([#1265](https://github.com/PrismJS/prism/issues/1265)) [[`7bcdae7`](https://github.com/PrismJS/prism/commit/7bcdae7)] + +### Other changes +* Add attribute `style` in `package.json` ([#1256](https://github.com/PrismJS/prism/issues/1256)) [[`a9b6785`](https://github.com/PrismJS/prism/commit/a9b6785)] + +## 1.9.0 (2017-12-06) + +### New components +* __Flow__ [[`d27b70d`](https://github.com/PrismJS/prism/commit/d27b70d)] + +### Updated components +* __CSS__: + * Unicode characters in CSS properties ([#1227](https://github.com/PrismJS/prism/issues/1227)) [[`f234ea4`](https://github.com/PrismJS/prism/commit/f234ea4)] +* __JSX__: + * JSX: Improve highlighting support. Fix [#1235](https://github.com/PrismJS/prism/issues/1235) and [#1236](https://github.com/PrismJS/prism/issues/1236) [[`f41c5cd`](https://github.com/PrismJS/prism/commit/f41c5cd)] +* __Markup__: + * Make CSS and JS inclusions in Markup greedy. Fix [#1240](https://github.com/PrismJS/prism/issues/1240) [[`7dc1e45`](https://github.com/PrismJS/prism/commit/7dc1e45)] +* __PHP__: + * Add support for multi-line strings. Fix [#1233](https://github.com/PrismJS/prism/issues/1233) [[`9a542a0`](https://github.com/PrismJS/prism/commit/9a542a0)] + +### Updated plugins +* __Copy to clipboard__: + * Fix test for native Clipboard. Fix [#1241](https://github.com/PrismJS/prism/issues/1241) [[`e7b5e82`](https://github.com/PrismJS/prism/commit/e7b5e82)] + * Copy to clipboard: Update to v1.7.1. Fix [#1220](https://github.com/PrismJS/prism/issues/1220) [[`a1b85e3`](https://github.com/PrismJS/prism/commit/a1b85e3), [`af50e44`](https://github.com/PrismJS/prism/commit/af50e44)] +* __Line highlight__: + * Fixes to compatibility of line number and line higlight plugins ([#1194](https://github.com/PrismJS/prism/issues/1194)) [[`e63058f`](https://github.com/PrismJS/prism/commit/e63058f), [`3842a91`](https://github.com/PrismJS/prism/commit/3842a91)] +* __Unescaped Markup__: + * Fix ambiguity in documentation by improving examples. Fix [#1197](https://github.com/PrismJS/prism/issues/1197) [[`924784a`](https://github.com/PrismJS/prism/commit/924784a)] + +### Other changes +* Allow any element being root instead of document. ([#1230](https://github.com/PrismJS/prism/issues/1230)) [[`69f2e2c`](https://github.com/PrismJS/prism/commit/69f2e2c), [`6e50d44`](https://github.com/PrismJS/prism/commit/6e50d44)] +* Coy Theme: The 'height' element makes code blocks the height of the browser canvas. ([#1224](https://github.com/PrismJS/prism/issues/1224)) [[`ac219d7`](https://github.com/PrismJS/prism/commit/ac219d7)] +* Download page: Fix implicitly declared variable [[`f986551`](https://github.com/PrismJS/prism/commit/f986551)] +* Download page: Add version number at the beginning of the generated files. Fix [#788](https://github.com/PrismJS/prism/issues/788) [[`928790d`](https://github.com/PrismJS/prism/commit/928790d)] + +## 1.8.4 (2017-11-05) + +### Updated components + +* __ABAP__: + * Regexp optimisation [[`7547f83`](https://github.com/PrismJS/prism/commit/7547f83)] +* __ActionScript__: + * Fix XML regex + optimise [[`75d00d7`](https://github.com/PrismJS/prism/commit/75d00d7)] +* __Ada__: + * Regexp simplification [[`e881fe3`](https://github.com/PrismJS/prism/commit/e881fe3)] +* __Apacheconf__: + * Regexp optimisation [[`a065e61`](https://github.com/PrismJS/prism/commit/a065e61)] +* __APL__: + * Regexp simplification [[`33297c4`](https://github.com/PrismJS/prism/commit/33297c4)] +* __AppleScript__: + * Regexp optimisation [[`d879f36`](https://github.com/PrismJS/prism/commit/d879f36)] +* __Arduino__: + * Don't use captures if not needed [[`16b338f`](https://github.com/PrismJS/prism/commit/16b338f)] +* __ASP.NET__: + * Regexp optimisation [[`438926c`](https://github.com/PrismJS/prism/commit/438926c)] +* __AutoHotkey__: + * Regexp simplification + don't use captures if not needed [[`5edfd2f`](https://github.com/PrismJS/prism/commit/5edfd2f)] +* __Bash__: + * Regexp optimisation and simplification [[`75b9b29`](https://github.com/PrismJS/prism/commit/75b9b29)] +* __Bro__: + * Regexp simplification + don't use captures if not needed [[`d4b9003`](https://github.com/PrismJS/prism/commit/d4b9003)] +* __C__: + * Regexp optimisation + don't use captures if not needed [[`f61d487`](https://github.com/PrismJS/prism/commit/f61d487)] +* __C++__: + * Fix operator regexp + regexp simplification + don't use captures if not needed [[`ffeb26e`](https://github.com/PrismJS/prism/commit/ffeb26e)] +* __C#__: + * Remove duplicates in keywords + regexp optimisation + don't use captures if not needed [[`d28d178`](https://github.com/PrismJS/prism/commit/d28d178)] +* __C-like__: + * Regexp simplification + don't use captures if not needed [[`918e0ff`](https://github.com/PrismJS/prism/commit/918e0ff)] +* __CoffeeScript__: + * Regexp optimisation + don't use captures if not needed [[`5895978`](https://github.com/PrismJS/prism/commit/5895978)] +* __Crystal__: + * Remove trailing comma [[`16979a3`](https://github.com/PrismJS/prism/commit/16979a3)] +* __CSS__: + * Regexp simplification + don't use captures if not needed + handle multi-line style attributes [[`43d9f36`](https://github.com/PrismJS/prism/commit/43d9f36)] +* __CSS Extras__: + * Regexp simplification [[`134ed70`](https://github.com/PrismJS/prism/commit/134ed70)] +* __D__: + * Regexp optimisation [[`fbe39c9`](https://github.com/PrismJS/prism/commit/fbe39c9)] +* __Dart__: + * Regexp optimisation [[`f24e919`](https://github.com/PrismJS/prism/commit/f24e919)] +* __Django__: + * Regexp optimisation [[`a95c51d`](https://github.com/PrismJS/prism/commit/a95c51d)] +* __Docker__: + * Regexp optimisation [[`27f99ff`](https://github.com/PrismJS/prism/commit/27f99ff)] +* __Eiffel__: + * Regexp optimisation [[`b7cdea2`](https://github.com/PrismJS/prism/commit/b7cdea2)] +* __Elixir__: + * Regexp optimisation + uniform behavior between ~r and ~s [[`5d12e80`](https://github.com/PrismJS/prism/commit/5d12e80)] +* __Erlang__: + * Regexp optimisation [[`e7b411e`](https://github.com/PrismJS/prism/commit/e7b411e)] +* __F#__: + * Regexp optimisation + don't use captures if not needed [[`7753fc4`](https://github.com/PrismJS/prism/commit/7753fc4)] +* __Gherkin__: + * Regexp optimisation + don't use captures if not needed + added explanation comment on table-body regexp [[`f26197a`](https://github.com/PrismJS/prism/commit/f26197a)] +* __Git__: + * Regexp optimisation [[`b9483b9`](https://github.com/PrismJS/prism/commit/b9483b9)] +* __GLSL__: + * Regexp optimisation [[`e66d21b`](https://github.com/PrismJS/prism/commit/e66d21b)] +* __Go__: + * Regexp optimisation + don't use captures if not needed [[`88caabb`](https://github.com/PrismJS/prism/commit/88caabb)] +* __GraphQL__: + * Regexp optimisation and simplification [[`2474f06`](https://github.com/PrismJS/prism/commit/2474f06)] +* __Groovy__: + * Regexp optimisation + don't use captures if not needed [[`e74e00c`](https://github.com/PrismJS/prism/commit/e74e00c)] +* __Haml__: + * Regexp optimisation + don't use captures if not needed + fix typo in comment [[`23e3b43`](https://github.com/PrismJS/prism/commit/23e3b43)] +* __Handlebars__: + * Regexp optimisation + don't use captures if not needed [[`09dbfce`](https://github.com/PrismJS/prism/commit/09dbfce)] +* __Haskell__: + * Regexp simplification + don't use captures if not needed [[`f11390a`](https://github.com/PrismJS/prism/commit/f11390a)] +* __HTTP__: + * Regexp simplification + don't use captures if not needed [[`37ef24e`](https://github.com/PrismJS/prism/commit/37ef24e)] +* __Icon__: + * Regexp optimisation [[`9cf64a0`](https://github.com/PrismJS/prism/commit/9cf64a0)] +* __J__: + * Regexp simplification [[`de15150`](https://github.com/PrismJS/prism/commit/de15150)] +* __Java__: + * Don't use captures if not needed [[`96b35c8`](https://github.com/PrismJS/prism/commit/96b35c8)] +* __JavaScript__: + * Regexp optimisation + don't use captures if not needed [[`93d4002`](https://github.com/PrismJS/prism/commit/93d4002)] +* __Jolie__: + * Regexp optimisation + don't use captures if not needed + remove duplicates in keywords [[`a491f9e`](https://github.com/PrismJS/prism/commit/a491f9e)] +* __JSON__: + * Make strings greedy, remove negative look-ahead for ":". Fix [#1204](https://github.com/PrismJS/prism/issues/1204) [[`98acd2d`](https://github.com/PrismJS/prism/commit/98acd2d)] + * Regexp optimisation + don't use captures if not needed [[`8fc1b03`](https://github.com/PrismJS/prism/commit/8fc1b03)] +* __JSX__: + * Regexp optimisation + handle spread operator as a whole [[`28de4e2`](https://github.com/PrismJS/prism/commit/28de4e2)] +* __Julia__: + * Regexp optimisation and simplification [[`12684c0`](https://github.com/PrismJS/prism/commit/12684c0)] +* __Keyman__: + * Regexp optimisation + don't use captures if not needed [[`9726087`](https://github.com/PrismJS/prism/commit/9726087)] +* __Kotlin__: + * Regexp simplification [[`12ff8dc`](https://github.com/PrismJS/prism/commit/12ff8dc)] +* __LaTeX__: + * Regexp optimisation and simplification [[`aa426b0`](https://github.com/PrismJS/prism/commit/aa426b0)] +* __LiveScript__: + * Make interpolated strings greedy + fix variable and identifier regexps [[`c581049`](https://github.com/PrismJS/prism/commit/c581049)] +* __LOLCODE__: + * Don't use captures if not needed [[`52903af`](https://github.com/PrismJS/prism/commit/52903af)] +* __Makefile__: + * Regexp optimisation [[`20ae2e5`](https://github.com/PrismJS/prism/commit/20ae2e5)] +* __Markdown__: + * Don't use captures if not needed [[`f489a1e`](https://github.com/PrismJS/prism/commit/f489a1e)] +* __Markup__: + * Regexp optimisation + fix punctuation inside attr-value [[`ea380c6`](https://github.com/PrismJS/prism/commit/ea380c6)] +* __MATLAB__: + * Make strings greedy + handle line feeds better [[`4cd4f01`](https://github.com/PrismJS/prism/commit/4cd4f01)] +* __Monkey__: + * Don't use captures if not needed [[`7f47140`](https://github.com/PrismJS/prism/commit/7f47140)] +* __N4JS__: + * Don't use captures if not needed [[`2d3f9df`](https://github.com/PrismJS/prism/commit/2d3f9df)] +* __NASM__: + * Regexp optimisation and simplification + don't use captures if not needed [[`9937428`](https://github.com/PrismJS/prism/commit/9937428)] +* __nginx__: + * Remove trailing comma + remove duplicates in keywords [[`c6e7195`](https://github.com/PrismJS/prism/commit/c6e7195)] +* __NSIS__: + * Regexp optimisation + don't use captures if not needed [[`beeb107`](https://github.com/PrismJS/prism/commit/beeb107)] +* __Objective-C__: + * Don't use captures if not needed [[`9be0f88`](https://github.com/PrismJS/prism/commit/9be0f88)] +* __OCaml__: + * Regexp simplification [[`5f5f38c`](https://github.com/PrismJS/prism/commit/5f5f38c)] +* __OpenCL__: + * Don't use captures if not needed [[`5e70f1d`](https://github.com/PrismJS/prism/commit/5e70f1d)] +* __Oz__: + * Fix atom regexp [[`9320e92`](https://github.com/PrismJS/prism/commit/9320e92)] +* __PARI/GP__: + * Regexp optimisation [[`2c7b59b`](https://github.com/PrismJS/prism/commit/2c7b59b)] +* __Parser__: + * Regexp simplification [[`569d511`](https://github.com/PrismJS/prism/commit/569d511)] +* __Perl__: + * Regexp optimisation and simplification + don't use captures if not needed [[`0fe4cf6`](https://github.com/PrismJS/prism/commit/0fe4cf6)] +* __PHP__: + * Don't use captures if not needed Golmote [[`5235f18`](https://github.com/PrismJS/prism/commit/5235f18)] +* __PHP Extras__: + * Add word boundary after global keywords + don't use captures if not needed [[`9049a2a`](https://github.com/PrismJS/prism/commit/9049a2a)] +* __PowerShell__: + * Regexp optimisation + don't use captures if not needed [[`0d05957`](https://github.com/PrismJS/prism/commit/0d05957)] +* __Processing__: + * Regexp simplification [[`8110d38`](https://github.com/PrismJS/prism/commit/8110d38)] +* __.properties__: + * Regexp optimisation [[`678b621`](https://github.com/PrismJS/prism/commit/678b621)] +* __Protocol Buffers__: + * Don't use captures if not needed [[`3e256d8`](https://github.com/PrismJS/prism/commit/3e256d8)] +* __Pug__: + * Don't use captures if not needed [[`76dc925`](https://github.com/PrismJS/prism/commit/76dc925)] +* __Pure__: + * Make inline-lang greedy [[`92318b0`](https://github.com/PrismJS/prism/commit/92318b0)] +* __Python__: + * Add Python builtin function highlighting ([#1205](https://github.com/PrismJS/prism/issues/1205)) [[`2169c99`](https://github.com/PrismJS/prism/commit/2169c99)] + * Python: Add highlighting to functions with space between name and parentheses ([#1207](https://github.com/PrismJS/prism/issues/1207)) [[`3badd8a`](https://github.com/PrismJS/prism/commit/3badd8a)] + * Make triple-quoted strings greedy + regexp optimisation and simplification [[`f09f9f5`](https://github.com/PrismJS/prism/commit/f09f9f5)] +* __Qore__: + * Regexp simplification [[`69459f0`](https://github.com/PrismJS/prism/commit/69459f0)] +* __R__: + * Regexp optimisation [[`06a9da4`](https://github.com/PrismJS/prism/commit/06a9da4)] +* __Reason__: + * Regexp optimisation + don't use capture if not needed [[`19d79b4`](https://github.com/PrismJS/prism/commit/19d79b4)] +* __Ren'py__: + * Make strings greedy + don't use captures if not needed [[`91d84d9`](https://github.com/PrismJS/prism/commit/91d84d9)] +* __reST__: + * Regexp simplification + don't use captures if not needed [[`1a8b3e9`](https://github.com/PrismJS/prism/commit/1a8b3e9)] +* __Rip__: + * Regexp optimisation [[`d7f0ee8`](https://github.com/PrismJS/prism/commit/d7f0ee8)] +* __Ruby__: + * Regexp optimisation and simplification + don't use captures if not needed [[`4902ed4`](https://github.com/PrismJS/prism/commit/4902ed4)] +* __Rust__: + * Regexp optimisation and simplification + don't use captures if not needed [[`cc9d874`](https://github.com/PrismJS/prism/commit/cc9d874)] +* __Sass__: + * Regexp simplification Golmote [[`165d957`](https://github.com/PrismJS/prism/commit/165d957)] +* __Scala__: + * Regexp optimisation Golmote [[`5f50c12`](https://github.com/PrismJS/prism/commit/5f50c12)] +* __Scheme__: + * Regexp optimisation [[`bd19b04`](https://github.com/PrismJS/prism/commit/bd19b04)] +* __SCSS__: + * Regexp simplification [[`c60b7d4`](https://github.com/PrismJS/prism/commit/c60b7d4)] +* __Smalltalk__: + * Regexp simplification [[`41a2c76`](https://github.com/PrismJS/prism/commit/41a2c76)] +* __Smarty__: + * Regexp optimisation and simplification [[`e169be9`](https://github.com/PrismJS/prism/commit/e169be9)] +* __SQL__: + * Regexp optimisation [[`a6244a4`](https://github.com/PrismJS/prism/commit/a6244a4)] +* __Stylus__: + * Regexp optimisation [[`df9506c`](https://github.com/PrismJS/prism/commit/df9506c)] +* __Swift__: + * Don't use captures if not needed [[`a2d737a`](https://github.com/PrismJS/prism/commit/a2d737a)] +* __Tcl__: + * Regexp simplification + don't use captures if not needed [[`f0b8a33`](https://github.com/PrismJS/prism/commit/f0b8a33)] +* __Textile__: + * Regexp optimisation + don't use captures if not needed [[`08139ad`](https://github.com/PrismJS/prism/commit/08139ad)] +* __Twig__: + * Regexp optimisation and simplification + don't use captures if not needed [[`0b10fd0`](https://github.com/PrismJS/prism/commit/0b10fd0)] +* __TypeScript__: + * Don't use captures if not needed [[`e296caf`](https://github.com/PrismJS/prism/commit/e296caf)] +* __Verilog__: + * Regexp simplification [[`1b24b34`](https://github.com/PrismJS/prism/commit/1b24b34)] +* __VHDL__: + * Regexp optimisation and simplification [[`7af36df`](https://github.com/PrismJS/prism/commit/7af36df)] +* __vim__: + * Remove duplicates in keywords [[`700505e`](https://github.com/PrismJS/prism/commit/700505e)] +* __Wiki markup__: + * Fix escaping consistency [[`1fd690d`](https://github.com/PrismJS/prism/commit/1fd690d)] +* __YAML__: + * Regexp optimisation + don't use captures if not needed [[`1fd690d`](https://github.com/PrismJS/prism/commit/1fd690d)] + +### Other changes +* Remove comments spellcheck for AMP validation ([#1106](https://github.com/PrismJS/prism/issues/1106)) [[`de996d7`](https://github.com/PrismJS/prism/commit/de996d7)] +* Prevent error from throwing when element does not have a parentNode in highlightElement. [[`c33be19`](https://github.com/PrismJS/prism/commit/c33be19)] +* Provide a way to load Prism from inside a Worker without listening to messages. ([#1188](https://github.com/PrismJS/prism/issues/1188)) [[`d09982d`](https://github.com/PrismJS/prism/commit/d09982d)] + +## 1.8.3 (2017-10-19) + +### Other changes + +* Fix inclusion tests for Pug [[`955c2ab`](https://github.com/PrismJS/prism/commit/955c2ab)] + +## 1.8.2 (2017-10-19) + +### Updated components +* __Jade__: + * Jade has been renamed to __Pug__ ([#1201](https://github.com/PrismJS/prism/issues/1201)) [[`bcfef7c`](https://github.com/PrismJS/prism/commit/bcfef7c)] +* __JavaScript__: + * Better highlighting of functions ([#1190](https://github.com/PrismJS/prism/issues/1190)) [[`8ee2cd3`](https://github.com/PrismJS/prism/commit/8ee2cd3)] + +### Update plugins +* __Copy to clipboard__: + * Fix error occurring when using in Chrome 61+ ([#1206](https://github.com/PrismJS/prism/issues/1206)) [[`b41d571`](https://github.com/PrismJS/prism/commit/b41d571)] +* __Show invisibles__: + * Prevent error when using with Autoloader plugin ([#1195](https://github.com/PrismJS/prism/issues/1195)) [[`ed8bdb5`](https://github.com/PrismJS/prism/commit/ed8bdb5)] + +## 1.8.1 (2017-09-16) + +### Other changes + +* Add Arduino to components.js [[`290a3c6`](https://github.com/PrismJS/prism/commit/290a3c6)] + +## 1.8.0 (2017-09-16) + +### New components + +* __Arduino__ ([#1184](https://github.com/PrismJS/prism/issues/1184)) [[`edf2454`](https://github.com/PrismJS/prism/commit/edf2454)] +* __OpenCL__ ([#1175](https://github.com/PrismJS/prism/issues/1175)) [[`131e8fa`](https://github.com/PrismJS/prism/commit/131e8fa)] + +### Updated plugins + +* __Autolinker__: + * Silently catch any error thrown by decodeURIComponent. Fixes [#1186](https://github.com/PrismJS/prism/issues/1186) [[`2e43fcf`](https://github.com/PrismJS/prism/commit/2e43fcf)] + +## 1.7.0 (2017-09-09) + +### New components + +* __Django/Jinja2__ ([#1085](https://github.com/PrismJS/prism/issues/1085)) [[`345b1b2`](https://github.com/PrismJS/prism/commit/345b1b2)] +* __N4JS__ ([#1141](https://github.com/PrismJS/prism/issues/1141)) [[`eaa8ebb`](https://github.com/PrismJS/prism/commit/eaa8ebb)] +* __Ren'py__ ([#658](https://github.com/PrismJS/prism/issues/658)) [[`7ab4013`](https://github.com/PrismJS/prism/commit/7ab4013)] +* __VB.Net__ ([#1122](https://github.com/PrismJS/prism/issues/1122)) [[`5400651`](https://github.com/PrismJS/prism/commit/5400651)] + +### Updated components + +* __APL__: + * Add left shoe underbar and right shoe underbar ([#1072](https://github.com/PrismJS/prism/issues/1072)) [[`12238c5`](https://github.com/PrismJS/prism/commit/12238c5)] + * Update prism-apl.js ([#1126](https://github.com/PrismJS/prism/issues/1126)) [[`a5f3cdb`](https://github.com/PrismJS/prism/commit/a5f3cdb)] +* __C__: + * Add more keywords and constants for C. ([#1029](https://github.com/PrismJS/prism/issues/1029)) [[`43a388e`](https://github.com/PrismJS/prism/commit/43a388e)] +* __C#__: + * Fix wrong highlighting when three slashes appear inside string. Fix [#1091](https://github.com/PrismJS/prism/issues/1091) [[`dfb6f17`](https://github.com/PrismJS/prism/commit/dfb6f17)] +* __C-like__: + * Add support for unclosed block comments. Close [#828](https://github.com/PrismJS/prism/issues/828) [[`3426ed1`](https://github.com/PrismJS/prism/commit/3426ed1)] +* __Crystal__: + * Update Crystal keywords ([#1092](https://github.com/PrismJS/prism/issues/1092)) [[`125bff1`](https://github.com/PrismJS/prism/commit/125bff1)] +* __CSS Extras__: + * Support CSS #RRGGBBAA ([#1139](https://github.com/PrismJS/prism/issues/1139)) [[`07a6806`](https://github.com/PrismJS/prism/commit/07a6806)] +* __Docker__: + * Add dockerfile alias for docker language ([#1164](https://github.com/PrismJS/prism/issues/1164)) [[`601c47f`](https://github.com/PrismJS/prism/commit/601c47f)] + * Update the list of keywords for dockerfiles ([#1180](https://github.com/PrismJS/prism/issues/1180)) [[`f0d73e0`](https://github.com/PrismJS/prism/commit/f0d73e0)] +* __Eiffel__: + * Add class-name highlighting for Eiffel ([#471](https://github.com/PrismJS/prism/issues/471)) [[`cd03587`](https://github.com/PrismJS/prism/commit/cd03587)] +* __Handlebars__: + * Check for possible pre-existing marker strings in Handlebars [[`7a1a404`](https://github.com/PrismJS/prism/commit/7a1a404)] +* __JavaScript__: + * Properly match every operator as a whole token. Fix [#1133](https://github.com/PrismJS/prism/issues/1133) [[`9f649fb`](https://github.com/PrismJS/prism/commit/9f649fb)] + * Allows uppercase prefixes in JS number literals ([#1151](https://github.com/PrismJS/prism/issues/1151)) [[`d4ee904`](https://github.com/PrismJS/prism/commit/d4ee904)] + * Reduced backtracking in regex pattern. Fix [#1159](https://github.com/PrismJS/prism/issues/1159) [[`ac09e97`](https://github.com/PrismJS/prism/commit/ac09e97)] +* __JSON__: + * Fix property and string patterns performance. Fix [#1080](https://github.com/PrismJS/prism/issues/1080) [[`0ca1353`](https://github.com/PrismJS/prism/commit/0ca1353)] +* __JSX__: + * JSX spread operator break. Fixes [#1061](https://github.com/PrismJS/prism/issues/1061) ([#1094](https://github.com/PrismJS/prism/issues/1094)) [[`561bceb`](https://github.com/PrismJS/prism/commit/561bceb)] + * Fix highlighting of attributes containing spaces [[`867ea42`](https://github.com/PrismJS/prism/commit/867ea42)] + * Improved performance for tags (when not matching) Fix [#1152](https://github.com/PrismJS/prism/issues/1152) [[`b0fe103`](https://github.com/PrismJS/prism/commit/b0fe103)] +* __LOLCODE__: + * Make strings greedy Golmote [[`1a5e7a4`](https://github.com/PrismJS/prism/commit/1a5e7a4)] +* __Markup__: + * Support HTML entities in attribute values ([#1143](https://github.com/PrismJS/prism/issues/1143)) [[`1d5047d`](https://github.com/PrismJS/prism/commit/1d5047d)] +* __NSIS__: + * Update patterns ([#1033](https://github.com/PrismJS/prism/issues/1033)) [[`01a59d8`](https://github.com/PrismJS/prism/commit/01a59d8)] + * Add support for NSIS 3.02 ([#1169](https://github.com/PrismJS/prism/issues/1169)) [[`393b5f7`](https://github.com/PrismJS/prism/commit/393b5f7)] +* __PHP__: + * Fix the PHP language ([#1100](https://github.com/PrismJS/prism/issues/1100)) [[`1453fa7`](https://github.com/PrismJS/prism/commit/1453fa7)] + * Check for possible pre-existing marker strings in PHP [[`36bc560`](https://github.com/PrismJS/prism/commit/36bc560)] +* __Ruby__: + * Fix slash regex performance. Fix [#1083](https://github.com/PrismJS/prism/issues/1083) [[`a708730`](https://github.com/PrismJS/prism/commit/a708730)] + * Add support for =begin =end comments. Manual merge of [#1121](https://github.com/PrismJS/prism/issues/1121). [[`62cdaf8`](https://github.com/PrismJS/prism/commit/62cdaf8)] +* __Smarty__: + * Check for possible pre-existing marker strings in Smarty [[`5df26e2`](https://github.com/PrismJS/prism/commit/5df26e2)] +* __TypeScript__: + * Update typescript keywords ([#1064](https://github.com/PrismJS/prism/issues/1064)) [[`52020a0`](https://github.com/PrismJS/prism/commit/52020a0)] + * Chmod -x prism-typescript component ([#1145](https://github.com/PrismJS/prism/issues/1145)) [[`afe0542`](https://github.com/PrismJS/prism/commit/afe0542)] +* __YAML__: + * Make strings greedy (partial fix for [#1075](https://github.com/PrismJS/prism/issues/1075)) [[`565a2cc`](https://github.com/PrismJS/prism/commit/565a2cc)] + +### Updated plugins + +* __Autolinker__: + * Fixed an rendering issue for encoded urls ([#1173](https://github.com/PrismJS/prism/issues/1173)) [[`abc007f`](https://github.com/PrismJS/prism/commit/abc007f)] +* __Custom Class__: + * Add missing noCSS property for the Custom Class plugin [[`ba64f8d`](https://github.com/PrismJS/prism/commit/ba64f8d)] + * Added a default for classMap. Fixes [#1137](https://github.com/PrismJS/prism/issues/1137). ([#1157](https://github.com/PrismJS/prism/issues/1157)) [[`5400af9`](https://github.com/PrismJS/prism/commit/5400af9)] +* __Keep Markup__: + * Store highlightedCode after reinserting markup. Fix [#1127](https://github.com/PrismJS/prism/issues/1127) [[`6df2ceb`](https://github.com/PrismJS/prism/commit/6df2ceb)] +* __Line Highlight__: + * Cleanup left-over line-highlight tags before other plugins run [[`79b723d`](https://github.com/PrismJS/prism/commit/79b723d)] + * Avoid conflict between line-highlight and other plugins [[`224fdb8`](https://github.com/PrismJS/prism/commit/224fdb8)] +* __Line Numbers__: + * Support soft wrap for line numbers plugin ([#584](https://github.com/PrismJS/prism/issues/584)) [[`849f1d6`](https://github.com/PrismJS/prism/commit/849f1d6)] + * Plugins fixes (unescaped-markup, line-numbers) ([#1012](https://github.com/PrismJS/prism/issues/1012)) [[`3fb7cf8`](https://github.com/PrismJS/prism/commit/3fb7cf8)] +* __Normalize Whitespace__: + * Add Node.js support for the normalize-whitespace plugin [[`6c7dae2`](https://github.com/PrismJS/prism/commit/6c7dae2)] +* __Unescaped Markup__: + * Plugins fixes (unescaped-markup, line-numbers) ([#1012](https://github.com/PrismJS/prism/issues/1012)) [[`3fb7cf8`](https://github.com/PrismJS/prism/commit/3fb7cf8)] + +### Updated themes +* __Coy__: + * Scroll 'Coy' background with contents ([#1163](https://github.com/PrismJS/prism/issues/1163)) [[`310990b`](https://github.com/PrismJS/prism/commit/310990b)] + +### Other changes + +* Initial implementation of manual highlighting ([#1087](https://github.com/PrismJS/prism/issues/1087)) [[`bafc4cb`](https://github.com/PrismJS/prism/commit/bafc4cb)] +* Remove dead link in Third-party tutorials section. Fixes [#1028](https://github.com/PrismJS/prism/issues/1028) [[`dffadc6`](https://github.com/PrismJS/prism/commit/dffadc6)] +* Most languages now use the greedy flag for better highlighting [[`7549ecc`](https://github.com/PrismJS/prism/commit/7549ecc)] +* .npmignore: Unignore components.js ([#1108](https://github.com/PrismJS/prism/issues/1108)) [[`1f699e7`](https://github.com/PrismJS/prism/commit/1f699e7)] +* Run before-highlight and after-highlight hooks even when no grammar is found. Fix [#1134](https://github.com/PrismJS/prism/issues/1134) [[`70cb472`](https://github.com/PrismJS/prism/commit/70cb472)] +* Replace [\w\W] with [\s\S] and [0-9] with \d in regexes ([#1107](https://github.com/PrismJS/prism/issues/1107)) [[`8aa2cc4`](https://github.com/PrismJS/prism/commit/8aa2cc4)] +* Fix corner cases for the greedy flag ([#1095](https://github.com/PrismJS/prism/issues/1095)) [[`6530709`](https://github.com/PrismJS/prism/commit/6530709)] +* Add Third Party Tutorial ([#1156](https://github.com/PrismJS/prism/issues/1156)) [[`c34e57b`](https://github.com/PrismJS/prism/commit/c34e57b)] +* Add Composer support ([#648](https://github.com/PrismJS/prism/issues/648)) [[`2989633`](https://github.com/PrismJS/prism/commit/2989633)] +* Remove IE8 plugin ([#992](https://github.com/PrismJS/prism/issues/992)) [[`25788eb`](https://github.com/PrismJS/prism/commit/25788eb)] +* Website: remove width and height on logo.svg, so it becomes scalable. Close [#1005](https://github.com/PrismJS/prism/issues/1005) [[`0621ff7`](https://github.com/PrismJS/prism/commit/0621ff7)] +* Remove yarn.lock ([#1098](https://github.com/PrismJS/prism/issues/1098)) [[`11eed25`](https://github.com/PrismJS/prism/commit/11eed25)] + +## 1.6.0 (2016-12-03) + +### New components + +* __.properties__ ([#980](https://github.com/PrismJS/prism/issues/980)) [[`be6219a`](https://github.com/PrismJS/prism/commit/be6219a)] +* __Ada__ ([#949](https://github.com/PrismJS/prism/issues/949)) [[`65619f7`](https://github.com/PrismJS/prism/commit/65619f7)] +* __GraphQL__ ([#971](https://github.com/PrismJS/prism/issues/971)) [[`e018087`](https://github.com/PrismJS/prism/commit/e018087)] +* __Jolie__ ([#1014](https://github.com/PrismJS/prism/issues/1014)) [[`dfc1941`](https://github.com/PrismJS/prism/commit/dfc1941)] +* __LiveScript__ ([#982](https://github.com/PrismJS/prism/issues/982)) [[`62e258c`](https://github.com/PrismJS/prism/commit/62e258c)] +* __Reason__ (Fixes [#1046](https://github.com/PrismJS/prism/issues/1046)) [[`3cae6ce`](https://github.com/PrismJS/prism/commit/3cae6ce)] +* __Xojo__ ([#994](https://github.com/PrismJS/prism/issues/994)) [[`0224b7c`](https://github.com/PrismJS/prism/commit/0224b7c)] + +### Updated components + +* __APL__: + * Add iota underbar ([#1024](https://github.com/PrismJS/prism/issues/1024)) [[`3c5c89a`](https://github.com/PrismJS/prism/commit/3c5c89a), [`ac21d33`](https://github.com/PrismJS/prism/commit/ac21d33)] +* __AsciiDoc__: + * Optimized block regexps to prevent struggling on large files. Fixes [#1001](https://github.com/PrismJS/prism/issues/1001). [[`1a86d34`](https://github.com/PrismJS/prism/commit/1a86d34)] +* __Bash__: + * Add `npm` to function list ([#969](https://github.com/PrismJS/prism/issues/969)) [[`912bdfe`](https://github.com/PrismJS/prism/commit/912bdfe)] +* __CSS__: + * Make CSS strings greedy. Fix [#1013](https://github.com/PrismJS/prism/issues/1013). [[`e57e26d`](https://github.com/PrismJS/prism/commit/e57e26d)] +* __CSS Extras__: + * Match attribute inside selectors [[`13fed76`](https://github.com/PrismJS/prism/commit/13fed76)] +* _Groovy__: + * Fix order of decoding entities in groovy. Fixes [#1049](https://github.com/PrismJS/prism/issues/1049) ([#1050](https://github.com/PrismJS/prism/issues/1050)) [[`d75da8e`](https://github.com/PrismJS/prism/commit/d75da8e)] +* __Ini__: + * Remove important token in ini definition ([#1047](https://github.com/PrismJS/prism/issues/1047)) [[`fe8ad8b`](https://github.com/PrismJS/prism/commit/fe8ad8b)] +* __JavaScript__: + * Add exponentiation & spread/rest operator ([#991](https://github.com/PrismJS/prism/issues/991)) [[`b2de65a`](https://github.com/PrismJS/prism/commit/b2de65a), [`268d01e`](https://github.com/PrismJS/prism/commit/268d01e)] +* __JSON_: + * JSON: Fixed issues with properties and strings + added tests. Fix [#1025](https://github.com/PrismJS/prism/issues/1025) [[`25a541d`](https://github.com/PrismJS/prism/commit/25a541d)] +* __Markup__: + * Allow for dots in Markup tag names, but not in HTML tags included in Textile. Fixes [#888](https://github.com/PrismJS/prism/issues/888). [[`31ea66b`](https://github.com/PrismJS/prism/commit/31ea66b)] + * Make doctype case-insensitive ([#1009](https://github.com/PrismJS/prism/issues/1009)) [[`3dd7219`](https://github.com/PrismJS/prism/commit/3dd7219)] +* __NSIS__: + * Updated patterns ([#1032](https://github.com/PrismJS/prism/issues/1032)) [[`76ba1b8`](https://github.com/PrismJS/prism/commit/76ba1b8)] +* __PHP__: + * Make comments greedy. Fix [#197](https://github.com/PrismJS/prism/issues/197) [[`318aab3`](https://github.com/PrismJS/prism/commit/318aab3)] +* __PowerShell__: + * Fix highlighting of empty comments ([#977](https://github.com/PrismJS/prism/issues/977)) [[`4fda477`](https://github.com/PrismJS/prism/commit/4fda477)] +* __Puppet__: + * Fix over-greedy regexp detection ([#978](https://github.com/PrismJS/prism/issues/978)) [[`105be25`](https://github.com/PrismJS/prism/commit/105be25)] +* __Ruby__: + * Fix typo `Fload` to `Float` in prism-ruby.js ([#1023](https://github.com/PrismJS/prism/issues/1023)) [[`22cb018`](https://github.com/PrismJS/prism/commit/22cb018)] + * Make strings greedy. Fixes [#1048](https://github.com/PrismJS/prism/issues/1048) [[`8b0520a`](https://github.com/PrismJS/prism/commit/8b0520a)] +* __SCSS__: + * Alias statement as keyword. Fix [#246](https://github.com/PrismJS/prism/issues/246) [[`fd09391`](https://github.com/PrismJS/prism/commit/fd09391)] + * Highlight variables inside selectors and properties. [[`d6b5c2f`](https://github.com/PrismJS/prism/commit/d6b5c2f)] + * Highlight parent selector [[`8f5f1fa`](https://github.com/PrismJS/prism/commit/8f5f1fa)] +* __TypeScript__: + * Add missing `from` keyword to typescript & set `ts` as alias. ([#1042](https://github.com/PrismJS/prism/issues/1042)) [[`cba78f3`](https://github.com/PrismJS/prism/commit/cba78f3)] + +### New plugins + +* __Copy to Clipboard__ ([#891](https://github.com/PrismJS/prism/issues/891)) [[`07b81ac`](https://github.com/PrismJS/prism/commit/07b81ac)] +* __Custom Class__ ([#950](https://github.com/PrismJS/prism/issues/950)) [[`a0bd686`](https://github.com/PrismJS/prism/commit/a0bd686)] +* __Data-URI Highlight__ ([#996](https://github.com/PrismJS/prism/issues/996)) [[`bdca61b`](https://github.com/PrismJS/prism/commit/bdca61b)] +* __Toolbar__ ([#891](https://github.com/PrismJS/prism/issues/891)) [[`07b81ac`](https://github.com/PrismJS/prism/commit/07b81ac)] + +### Updated plugins + +* __Autoloader__: + * Updated documentation for Autoloader plugin [[`b4f3423`](https://github.com/PrismJS/prism/commit/b4f3423)] + * Download all grammars as a zip from Autoloader plugin page ([#981](https://github.com/PrismJS/prism/issues/981)) [[`0d0a007`](https://github.com/PrismJS/prism/commit/0d0a007), [`5c815d3`](https://github.com/PrismJS/prism/commit/5c815d3)] + * Removed duplicated script on Autoloader plugin page [[`9671996`](https://github.com/PrismJS/prism/commit/9671996)] + * Don't try to load "none" component. Fix [#1000](https://github.com/PrismJS/prism/issues/1000) [[`f89b0b9`](https://github.com/PrismJS/prism/commit/f89b0b9)] +* __WPD__: + * Fix at-rule detection + don't process if language is not handled [[`2626728`](https://github.com/PrismJS/prism/commit/2626728)] + +### Other changes + +* Improvement to greedy-flag ([#967](https://github.com/PrismJS/prism/issues/967)) [[`500121b`](https://github.com/PrismJS/prism/commit/500121b), [`9893489`](https://github.com/PrismJS/prism/commit/9893489)] +* Add setTimeout fallback for requestAnimationFrame. Fixes [#987](https://github.com/PrismJS/prism/issues/987). ([#988](https://github.com/PrismJS/prism/issues/988)) [[`c9bdcd3`](https://github.com/PrismJS/prism/commit/c9bdcd3)] +* Added aria-hidden attributes on elements created by the Line Highlight and Line Numbers plugins. Fixes [#574](https://github.com/PrismJS/prism/issues/574). [[`e5587a7`](https://github.com/PrismJS/prism/commit/e5587a7)] +* Don't insert space before ">" when there is no attributes [[`3dc8c9e`](https://github.com/PrismJS/prism/commit/3dc8c9e)] +* Added missing hooks-related tests for AsciiDoc, Groovy, Handlebars, Markup, PHP and Smarty [[`c1a0c1b`](https://github.com/PrismJS/prism/commit/c1a0c1b)] +* Fix issue when using Line numbers plugin and Normalise whitespace plugin together with Handlebars, PHP or Smarty. Fix [#1018](https://github.com/PrismJS/prism/issues/1018), [#997](https://github.com/PrismJS/prism/issues/997), [#935](https://github.com/PrismJS/prism/issues/935). Revert [#998](https://github.com/PrismJS/prism/issues/998). [[`86aa3d2`](https://github.com/PrismJS/prism/commit/86aa3d2)] +* Optimized logo ([#990](https://github.com/PrismJS/prism/issues/990)) ([#1002](https://github.com/PrismJS/prism/issues/1002)) [[`f69e570`](https://github.com/PrismJS/prism/commit/f69e570), [`218fd25`](https://github.com/PrismJS/prism/commit/218fd25)] +* Remove unneeded prefixed CSS ([#989](https://github.com/PrismJS/prism/issues/989)) [[`5e56833`](https://github.com/PrismJS/prism/commit/5e56833)] +* Optimize images ([#1007](https://github.com/PrismJS/prism/issues/1007)) [[`b2fa6d5`](https://github.com/PrismJS/prism/commit/b2fa6d5)] +* Add yarn.lock to .gitignore ([#1035](https://github.com/PrismJS/prism/issues/1035)) [[`03ecf74`](https://github.com/PrismJS/prism/commit/03ecf74)] +* Fix greedy flag bug. Fixes [#1039](https://github.com/PrismJS/prism/issues/1039) [[`32cd99f`](https://github.com/PrismJS/prism/commit/32cd99f)] +* Ruby: Fix test after [#1023](https://github.com/PrismJS/prism/issues/1023) [[`b15d43b`](https://github.com/PrismJS/prism/commit/b15d43b)] +* Ini: Fix test after [#1047](https://github.com/PrismJS/prism/issues/1047) [[`25cdd3f`](https://github.com/PrismJS/prism/commit/25cdd3f)] +* Reduce risk of XSS ([#1051](https://github.com/PrismJS/prism/issues/1051)) [[`17e33bc`](https://github.com/PrismJS/prism/commit/17e33bc)] +* env.code can be modified by before-sanity-check hook even when using language-none. Fix [#1066](https://github.com/PrismJS/prism/issues/1066) [[`83bafbd`](https://github.com/PrismJS/prism/commit/83bafbd)] + + +## 1.5.1 (2016-06-05) + +### Updated components + +* __Normalize Whitespace__: + * Add class that disables the normalize whitespace plugin [[`9385c54`](https://github.com/PrismJS/prism/commit/9385c54)] +* __JavaScript Language__: + * Rearrange the `string` and `template-string` token in JavaScript [[`1158e46`](https://github.com/PrismJS/prism/commit/1158e46)] +* __SQL Language__: + * add delimeter and delimeters keywords to sql ([#958](https://github.com/PrismJS/prism/pull/958)) [[`a9ef24e`](https://github.com/PrismJS/prism/commit/a9ef24e)] + * add AUTO_INCREMENT and DATE keywords to sql ([#954](https://github.com/PrismJS/prism/pull/954)) [[`caea2af`](https://github.com/PrismJS/prism/commit/caea2af)] +* __Diff Language__: + * Highlight diff lines with only + or - ([#952](https://github.com/PrismJS/prism/pull/952)) [[`4d0526f`](https://github.com/PrismJS/prism/commit/4d0526f)] + +### Other changes + +* Allow for asynchronous loading of prism.js ([#959](https://github.com/PrismJS/prism/pull/959)) +* Use toLowerCase on language names ([#957](https://github.com/PrismJS/prism/pull/957)) [[`acd9508`](https://github.com/PrismJS/prism/commit/acd9508)] +* link to index for basic usage - fixes [#945](https://github.com/PrismJS/prism/issues/945) ([#946](https://github.com/PrismJS/prism/pull/946)) [[`6c772d8`](https://github.com/PrismJS/prism/commit/6c772d8)] +* Fixed monospace typo ([#953](https://github.com/PrismJS/prism/pull/953)) [[`e6c3498`](https://github.com/PrismJS/prism/commit/e6c3498)] + +## 1.5.0 (2016-05-01) + +### New components + +* __Bro Language__ ([#925](https://github.com/PrismJS/prism/pull/925)) +* __Protocol Buffers Language__ ([#938](https://github.com/PrismJS/prism/pull/938)) [[`ae4a4f2`](https://github.com/PrismJS/prism/commit/ae4a4f2)] + +### Updated components + +* __Keep Markup__: + * Fix Keep Markup plugin incorrect highlighting ([#880](https://github.com/PrismJS/prism/pull/880)) [[`24841ef`](https://github.com/PrismJS/prism/commit/24841ef)] +* __Groovy Language__: + * Fix double HTML-encoding bug in Groovy language [[`24a0936`](https://github.com/PrismJS/prism/commit/24a0936)] +* __Java Language__: + * Adding annotation token for Java ([#905](https://github.com/PrismJS/prism/pull/905)) [[`367ace6`](https://github.com/PrismJS/prism/commit/367ace6)] +* __SAS Language__: + * Add missing keywords for SAS ([#922](https://github.com/PrismJS/prism/pull/922)) +* __YAML Language__: + * fix hilighting of YAML keys on first line of code block ([#943](https://github.com/PrismJS/prism/pull/943)) [[`f19db81`](https://github.com/PrismJS/prism/commit/f19db81)] +* __C# Language__: + * Support for generic methods in csharp [[`6f75735`](https://github.com/PrismJS/prism/commit/6f75735)] + +### New plugins + +* __Unescaped Markup__ [[`07d77e5`](https://github.com/PrismJS/prism/commit/07d77e5)] +* __Normalize Whitespace__ ([#847](https://github.com/PrismJS/prism/pull/847)) [[`e86ec01`](https://github.com/PrismJS/prism/commit/e86ec01)] + +### Other changes + +* Add JSPM support [[`ad048ab`](https://github.com/PrismJS/prism/commit/ad048ab)] +* update linear-gradient syntax from `left` to `to right` [[`cd234dc`](https://github.com/PrismJS/prism/commit/cd234dc)] +* Add after-property to allow ordering of plugins [[`224b7a1`](https://github.com/PrismJS/prism/commit/224b7a1)] +* Partial solution for the "Comment-like substrings"-problem [[`2705c50`](https://github.com/PrismJS/prism/commit/2705c50)] +* Add property 'aliasTitles' to components.js [[`54400fb`](https://github.com/PrismJS/prism/commit/54400fb)] +* Add before-highlightall hook [[`70a8602`](https://github.com/PrismJS/prism/commit/70a8602)] +* Fix catastrophic backtracking regex issues in JavaScript [[`ab65be2`](https://github.com/PrismJS/prism/commit/ab65be2)] + +## 1.4.1 (2016-02-03) + +### Other changes + +* Fix DFS bug in Prism core [[`b86c727`](https://github.com/PrismJS/prism/commit/b86c727)] + +## 1.4.0 (2016-02-03) + +### New components + +* __Solarized Light__ ([#855](https://github.com/PrismJS/prism/pull/855)) [[`70846ba`](https://github.com/PrismJS/prism/commit/70846ba)] +* __JSON__ ([#370](https://github.com/PrismJS/prism/pull/370)) [[`ad2fcd0`](https://github.com/PrismJS/prism/commit/ad2fcd0)] + +### Updated components + +* __Show Language__: + * Remove data-language attribute ([#840](https://github.com/PrismJS/prism/pull/840)) [[`eb9a83c`](https://github.com/PrismJS/prism/commit/eb9a83c)] + * Allow custom label without a language mapping ([#837](https://github.com/PrismJS/prism/pull/837)) [[`7e74aef`](https://github.com/PrismJS/prism/commit/7e74aef)] +* __JSX__: + * Better Nesting in JSX attributes ([#842](https://github.com/PrismJS/prism/pull/842)) [[`971dda7`](https://github.com/PrismJS/prism/commit/971dda7)] +* __File Highlight__: + * Defer File Highlight until the full DOM has loaded. ([#844](https://github.com/PrismJS/prism/pull/844)) [[`6f995ef`](https://github.com/PrismJS/prism/commit/6f995ef)] +* __Coy Theme__: + * Fix coy theme shadows ([#865](https://github.com/PrismJS/prism/pull/865)) [[`58d2337`](https://github.com/PrismJS/prism/commit/58d2337)] +* __Show Invisibles__: + * Ensure show-invisibles compat with autoloader ([#874](https://github.com/PrismJS/prism/pull/874)) [[`c3cfb1f`](https://github.com/PrismJS/prism/commit/c3cfb1f)] + * Add support for the space character for the show-invisibles plugin ([#876](https://github.com/PrismJS/prism/pull/876)) [[`05442d3`](https://github.com/PrismJS/prism/commit/05442d3)] + +### New plugins + +* __Command Line__ ([#831](https://github.com/PrismJS/prism/pull/831)) [[`8378906`](https://github.com/PrismJS/prism/commit/8378906)] + +### Other changes + +* Use document.currentScript instead of document.getElementsByTagName() [[`fa98743`](https://github.com/PrismJS/prism/commit/fa98743)] +* Add prefix for Firefox selection and move prefixed rule first [[`6d54717`](https://github.com/PrismJS/prism/commit/6d54717)] +* No background for `` in `
` [[`8c310bc`](https://github.com/PrismJS/prism/commit/8c310bc)]
+* Fixing to initial copyright year [[`69cbf7a`](https://github.com/PrismJS/prism/commit/69cbf7a)]
+* Simplify the “lang†regex [[`417f54a`](https://github.com/PrismJS/prism/commit/417f54a)]
+* Fix broken heading links [[`a7f9e62`](https://github.com/PrismJS/prism/commit/a7f9e62)]
+* Prevent infinite recursion in DFS [[`02894e1`](https://github.com/PrismJS/prism/commit/02894e1)]
+* Fix incorrect page title [[`544b56f`](https://github.com/PrismJS/prism/commit/544b56f)]
+* Link scss to webplatform wiki [[`08d979a`](https://github.com/PrismJS/prism/commit/08d979a)]
+* Revert white-space to normal when code is inline instead of in a pre [[`1a971b5`](https://github.com/PrismJS/prism/commit/1a971b5)]
+
+## 1.3.0 (2015-10-26)
+
+### New components
+
+* __AsciiDoc__ ([#800](https://github.com/PrismJS/prism/issues/800)) [[`6803ca0`](https://github.com/PrismJS/prism/commit/6803ca0)]
+* __Haxe__ ([#811](https://github.com/PrismJS/prism/issues/811)) [[`bd44341`](https://github.com/PrismJS/prism/commit/bd44341)]
+* __Icon__ ([#803](https://github.com/PrismJS/prism/issues/803)) [[`b43c5f3`](https://github.com/PrismJS/prism/commit/b43c5f3)]
+* __Kotlin ([#814](https://github.com/PrismJS/prism/issues/814)) [[`e8a31a5`](https://github.com/PrismJS/prism/commit/e8a31a5)]
+* __Lua__ ([#804](https://github.com/PrismJS/prism/issues/804)) [[`a36bc4a`](https://github.com/PrismJS/prism/commit/a36bc4a)]
+* __Nix__ ([#795](https://github.com/PrismJS/prism/issues/795)) [[`9b275c8`](https://github.com/PrismJS/prism/commit/9b275c8)]
+* __Oz__ ([#805](https://github.com/PrismJS/prism/issues/805)) [[`388c53f`](https://github.com/PrismJS/prism/commit/388c53f)]
+* __PARI/GP__ ([#802](https://github.com/PrismJS/prism/issues/802)) [[`253c035`](https://github.com/PrismJS/prism/commit/253c035)]
+* __Parser__ ([#808](https://github.com/PrismJS/prism/issues/808)) [[`a953b3a`](https://github.com/PrismJS/prism/commit/a953b3a)]
+* __Puppet__ ([#813](https://github.com/PrismJS/prism/issues/813)) [[`81933ee`](https://github.com/PrismJS/prism/commit/81933ee)]
+* __Roboconf__ ([#812](https://github.com/PrismJS/prism/issues/812)) [[`f5db346`](https://github.com/PrismJS/prism/commit/f5db346)]
+
+### Updated components
+
+* __C__:
+	* Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
+* __C#__:
+	* Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
+	* Fix detection of float numbers ([#806](https://github.com/PrismJS/prism/issues/806)) [[`1dae72b`](https://github.com/PrismJS/prism/commit/1dae72b)]
+* __F#__:
+	* Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
+* __JavaScript__:
+	* Highlight true and false as booleans ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
+* __Python__:
+	* Highlight triple-quoted strings before comments. Fix [#815](https://github.com/PrismJS/prism/issues/815) [[`90fbf0b`](https://github.com/PrismJS/prism/commit/90fbf0b)]
+
+### New plugins
+
+* __Previewer: Time__ ([#790](https://github.com/PrismJS/prism/issues/790)) [[`88173de`](https://github.com/PrismJS/prism/commit/88173de)]
+* __Previewer: Angle__ ([#791](https://github.com/PrismJS/prism/issues/791)) [[`a434c86`](https://github.com/PrismJS/prism/commit/a434c86)]
+
+### Other changes
+
+* Increase mocha's timeout [[`f1c41db`](https://github.com/PrismJS/prism/commit/f1c41db)]
+* Prevent most errors in IE8. Fix [#9](https://github.com/PrismJS/prism/issues/9) [[`9652d75`](https://github.com/PrismJS/prism/commit/9652d75)]
+* Add U.S. Web Design Standards on homepage. Fix [#785](https://github.com/PrismJS/prism/issues/785) [[`e10d48b`](https://github.com/PrismJS/prism/commit/e10d48b), [`79ebbf8`](https://github.com/PrismJS/prism/commit/79ebbf8), [`2f7088d`](https://github.com/PrismJS/prism/commit/2f7088d)]
+* Added gulp task to autolink PRs and commits in changelog [[`5ec4e4d`](https://github.com/PrismJS/prism/commit/5ec4e4d)]
+* Use child processes to run each set of tests, in order to deal with the memory leak in vm.runInNewContext() [[`9a4b6fa`](https://github.com/PrismJS/prism/commit/9a4b6fa)]
+
+## 1.2.0 (2015-10-07)
+
+### New components
+
+* __Batch__ ([#781](https://github.com/PrismJS/prism/issues/781)) [[`eab5b06`](https://github.com/PrismJS/prism/commit/eab5b06)]
+
+### Updated components
+
+* __ASP.NET__:
+	* Simplified pattern for `
+
+
+
+
+
+
+
+
+ +

Customize your download

+

Select your compression level, as well as the languages and plugins you need.

+
+ +
+
+

+ Compression level: + + +

+ +
+ +

+ Total filesize: ( JavaScript + CSS) +

+

Note: The filesizes displayed refer to non-gizipped files and include any CSS code required. The CSS code is not minified.

+ +
+
+
+
+ Download JS +
+ +
+
+ Download CSS +
+
+ +
+ +
+ +
+ + + + + + + + + + diff --git a/docs/_style/prism-master/download.js b/docs/_style/prism-master/download.js new file mode 100644 index 0000000..054da79 --- /dev/null +++ b/docs/_style/prism-master/download.js @@ -0,0 +1,598 @@ +/** + * Manage downloads + */ + +(function() { + +var cache = {}; +var form = $('form'); +var minified = true; + +var dependencies = {}; + +var treeURL = 'https://api.github.com/repos/PrismJS/prism/git/trees/gh-pages?recursive=1'; +var treePromise = new Promise(function(resolve) { + $u.xhr({ + url: treeURL, + callback: function(xhr) { + if (xhr.status < 400) { + resolve(JSON.parse(xhr.responseText).tree); + } + } + }); +}); + +var hstr = window.location.hash.match(/(?:languages|plugins)=[-+\w]+|themes=[-\w]+/g); +if (hstr) { + hstr.forEach(function(str) { + var kv = str.split('=', 2), + category = kv[0], + ids = kv[1].split('+'); + if (category !== 'meta' && category !== 'core' && components[category]) { + for (var id in components[category]) { + if (components[category][id].option) { + delete components[category][id].option; + } + } + if (category === 'themes' && ids.length) { + var themeInput = $('#theme input[value="' + ids[0] + '"]'); + if (themeInput) { + themeInput.checked = true; + } + setTheme(ids[0]); + } + var makeDefault = function (id) { + if (id !== 'meta') { + if (components[category][id]) { + if (components[category][id].option !== 'default') { + if (typeof components[category][id] === 'string') { + components[category][id] = { title: components[category][id] } + } + components[category][id].option = 'default'; + } + if (components[category][id].require) { + var deps = components[category][id].require; + if ($u.type(deps) !== 'array') { + deps = [deps]; + } + deps.forEach(makeDefault); + } + } + } + }; + ids.forEach(makeDefault); + } + }); +} + +// Stay compatible with old querystring feature +var qstr = window.location.search.match(/(?:languages|plugins)=[-+\w]+|themes=[-\w]+/g); +if (qstr && !hstr) { + window.location.hash = window.location.search.replace(/^\?/, ''); + window.location.search = ''; +} + +var storedTheme = localStorage.getItem('theme'); + +for (var category in components) { + var all = components[category]; + + all.meta.section = $u.element.create('section', { + className: 'options', + id: 'category-' + category, + contents: { + tag: 'h1', + contents: category.charAt(0).toUpperCase() + category.slice(1) + }, + inside: '#components' + }); + + if (all.meta.addCheckAll) { + $u.element.create('label', { + attributes: { + 'data-id': 'check-all-' + category + }, + contents: [ + { + tag: 'input', + properties: { + type: 'checkbox', + name: 'check-all-' + category, + value: '', + checked: false, + onclick: (function(category, all){ + return function () { + var checkAll = this; + $$('input[name="download-' + category + '"]').forEach(function(input) { + all[input.value].enabled = input.checked = checkAll.checked; + }); + + update(category); + }; + })(category, all) + } + }, + 'Select/unselect all' + ], + inside: all.meta.section + }); + } + + for (var id in all) { + if(id === 'meta') { + continue; + } + + var checked = false, disabled = false; + var option = all[id].option || all.meta.option; + + switch (option) { + case 'mandatory': disabled = true; // fallthrough + case 'default': checked = true; + } + if (category === 'themes' && storedTheme) { + checked = id === storedTheme; + } + + var filepath = all.meta.path.replace(/\{id}/g, id); + + var info = all[id] = { + title: all[id].title || all[id], + aliasTitles: all[id].aliasTitles, + noCSS: all[id].noCSS || all.meta.noCSS, + noJS: all[id].noJS || all.meta.noJS, + enabled: checked, + require: $u.type(all[id].require) === 'string' ? [all[id].require] : all[id].require, + after: $u.type(all[id].after) === 'string' ? [all[id].after] : all[id].after, + peerDependencies: $u.type(all[id].peerDependencies) === 'string' ? [all[id].peerDependencies] : all[id].peerDependencies, + owner: all[id].owner, + files: { + minified: { + paths: [], + size: 0 + }, + dev: { + paths: [], + size: 0 + } + } + }; + + if (info.require) { + info.require.forEach(function (v) { + dependencies[v] = (dependencies[v] || []).concat(id); + }); + } + + if (!all[id].noJS && !/\.css$/.test(filepath)) { + info.files.minified.paths.push(filepath.replace(/(\.js)?$/, '.min.js')); + info.files.dev.paths.push(filepath.replace(/(\.js)?$/, '.js')); + } + + + if ((!all[id].noCSS && !/\.js$/.test(filepath)) || /\.css$/.test(filepath)) { + var cssFile = filepath.replace(/(\.css)?$/, '.css'); + + info.files.minified.paths.push(cssFile); + info.files.dev.paths.push(cssFile); + } + + function getLanguageTitle(lang) { + if (!lang.aliasTitles) + return lang.title; + + var titles = [lang.title]; + for (var alias in lang.aliasTitles) + if (lang.aliasTitles.hasOwnProperty(alias)) + titles.push(lang.aliasTitles[alias]); + return titles.join(" + "); + } + + var label = $u.element.create('label', { + attributes: { + 'data-id': id + }, + contents: [ + { + tag: 'input', + properties: { + type: all.meta.exclusive? 'radio' : 'checkbox', + name: 'download-' + category, + value: id, + checked: checked, + disabled: disabled, + onclick: (function(id, category, all){ + return function () { + $$('input[name="' + this.name + '"]').forEach(function(input) { + all[input.value].enabled = input.checked; + }); + + if (all[id].require && this.checked) { + all[id].require.forEach(function(v) { + var input = $('label[data-id="' + v + '"] > input'); + input.checked = true; + + input.onclick(); + }); + } + + if (dependencies[id] && !this.checked) { // It’s required by others + dependencies[id].forEach(function(dependent) { + var input = $('label[data-id="' + dependent + '"] > input'); + input.checked = false; + + input.onclick(); + }); + } + + update(category, id); + }; + })(id, category, all) + } + }, + all.meta.link? { + tag: 'a', + properties: { + href: all.meta.link.replace(/\{id}/g, id), + className: 'name' + }, + contents: info.title + } : { + tag: 'span', + properties: { + className: 'name' + }, + contents: getLanguageTitle(info) + }, + ' ', + all[id].owner? { + tag: 'a', + properties: { + href: 'https://github.com/' + all[id].owner, + className: 'owner', + target: '_blank' + }, + contents: all[id].owner + } : ' ', + { + tag: 'strong', + className: 'filesize' + } + ], + inside: all.meta.section + }); + + // Add click events on main theme selector too. + (function (label) { + if (category === 'themes') { + var themeInput = $('#theme input[value="' + id + '"]'); + var input = $('input', label); + if (themeInput) { + var themeInputOnclick = themeInput.onclick; + themeInput.onclick = function () { + input.checked = true; + input.onclick(); + themeInputOnclick && themeInputOnclick.call(themeInput); + }; + } + } + }(label)); + } +} + +form.elements.compression[0].onclick = +form.elements.compression[1].onclick = function() { + minified = !!+this.value; + + getFilesSizes(); +}; + +function getFileSize(filepath) { + return treePromise.then(function(tree) { + for(var i=0, l=tree.length; i i) { + notNow = true; + break; + } + } + if (notNow) { + var tmp = sorted[i]; + sorted[i] = sorted[indexOfRequirement]; + sorted[indexOfRequirement] = tmp; + } + else { + i++; + } + } + return sorted; +} + +function getSortedComponentsByRequirements(components, afterName) { + var sorted = getSortedComponents(components, afterName); + return getSortedComponents(components, "require", sorted); +} + +function generateCode(){ + var promises = []; + var redownload = {}; + + for (var category in components) { + var all = components[category]; + + // In case if one component requires other, required component should go first. + var sorted = getSortedComponentsByRequirements(all, category === 'languages' ? 'peerDependencies' : 'after'); + + for (var i = 0; i < sorted.length; i++) { + var id = sorted[i]; + + if(id === 'meta') { + continue; + } + + var info = all[id]; + if (info.enabled) { + if (category !== 'core') { + redownload[category] = redownload[category] || []; + redownload[category].push(id); + } + info.files[minified? 'minified' : 'dev'].paths.forEach(function (path) { + if (cache[path]) { + var type = path.match(/\.(\w+)$/)[1]; + + promises.push({ + contentsPromise: cache[path].contentsPromise, + path: path, + type: type + }); + } + }); + } + } + } + + // Hide error message if visible + var error = $('#download .error'); + error.style.display = ''; + + Promise.all([buildCode(promises), getVersion()]).then(function(arr) { + var res = arr[0]; + var version = arr[1]; + var code = res.code; + var errors = res.errors; + + if(errors.length) { + error.style.display = 'block'; + error.innerHTML = ''; + $u.element.contents(error, errors); + } + + var redownloadUrl = window.location.href.split("#")[0] + "#"; + for (var category in redownload) { + redownloadUrl += category + "=" + redownload[category].join('+') + "&"; + } + redownloadUrl = redownloadUrl.replace(/&$/,""); + window.location.replace(redownloadUrl); + + var versionComment = "/* PrismJS " + version + "\n" + redownloadUrl + " */"; + + for (var type in code) { + var codeElement = $('#download-' + type + ' code'); + + codeElement.textContent = versionComment + "\n" + code[type]; + Prism.highlightElement(codeElement, true); + + $('#download-' + type + ' .download-button').href = 'data:application/octet-stream;charset=utf-8,' + encodeURIComponent(versionComment + "\n" + code[type]); + } + }); +} + +function buildCode(promises) { + var i = 0, + l = promises.length; + var code = {js: '', css: ''}; + var errors = []; + + var f = function(resolve) { + if(i < l) { + var p = promises[i]; + p.contentsPromise.then(function(contents) { + code[p.type] += contents + (p.type === 'js' && !/;\s*$/.test(contents) ? ';' : '') + '\n'; + i++; + f(resolve); + }); + p.contentsPromise['catch'](function() { + errors.push($u.element.create({ + tag: 'p', + prop: { + textContent: 'An error occurred while fetching the file "' + p.path + '".' + } + })); + i++; + f(resolve); + }); + } else { + resolve({code: code, errors: errors}); + } + }; + + return new Promise(f); +} + +function getVersion() { + return getFileContents('./package.json').then(function (jsonStr) { + return JSON.parse(jsonStr).version; + }); +} + +})(); diff --git a/docs/_style/prism-master/examples.html b/docs/_style/prism-master/examples.html new file mode 100644 index 0000000..b7dce55 --- /dev/null +++ b/docs/_style/prism-master/examples.html @@ -0,0 +1,110 @@ + + + + + + +Examples ▲ Prism + + + + + + + + + + +
+
+ +

Examples

+

The examples in this page serve a dual purpose: They act as unit tests, making it easy to spot bugs, and at the same time demonstrate what Prism can do, on simple and on edge cases.

+
+ +
+

Different markup

+ +

code.language-css

+ p { color: red; } + +

pre.language-css > code

+
p { color: red; }
+ +

pre > code.language-css

+
p { color: red; }
+ +

pre.language-css > code.language-*

+
p { color: red; }
+ +

code.lang-css

+ p { color: red; } + +

pre.lang-css > code

+
p { color: red; }
+ +

pre > code

+

No language, should inherit .language-markup

+
<p>hi!</p>
+ +

code.language-*

+

No language, should inherit .language-markup

+ <p>hi!</p> + +

code.language-none

+

Should not be highlighted.

+ <p>hi!</p> +
+ +
+

Per language examples

+
+
+
+ +
+ + + + + + + + + + diff --git a/docs/_style/prism-master/examples.js b/docs/_style/prism-master/examples.js new file mode 100644 index 0000000..ba275c5 --- /dev/null +++ b/docs/_style/prism-master/examples.js @@ -0,0 +1,217 @@ +/** + * Manage examples + */ + +(function() { + +var examples = {}; + +var treeURL = 'https://api.github.com/repos/PrismJS/prism/git/trees/gh-pages?recursive=1'; +var treePromise = new Promise(function (resolve) { + $u.xhr({ + url: treeURL, + callback: function (xhr) { + if (xhr.status < 400) { + resolve(JSON.parse(xhr.responseText).tree); + } + } + }); +}); + +var languages = components.languages; + +for (var id in languages) { + if (id === 'meta') { + continue; + } + + (function (id) { + var language = languages[id]; + var checked = false; + + if (language.option === 'default') { + checked = true; + } + + language.enabled = checked; + language.path = languages.meta.path.replace(/\{id}/g, id) + '.js'; + language.examplesPath = languages.meta.examplesPath.replace(/\{id}/g, id) + '.html'; + + fileExists(language.examplesPath).then(function (exists) { + $u.element.create('label', { + attributes: { + 'data-id': id, + 'title': !exists ? 'No examples are available for this language.' : '' + }, + className: !exists ? 'unavailable' : '', + contents: [ + { + tag: 'input', + properties: { + type: 'checkbox', + name: 'language', + value: id, + checked: checked && exists, + disabled: !exists, + onclick: function () { + $$('input[name="' + this.name + '"]').forEach(function (input) { + languages[input.value].enabled = input.checked; + }); + + update(id); + } + } + }, + language.title + ], + inside: '#languages' + }); + examples[id] = $u.element.create('section', { + 'id': 'language-' + id, + 'className': 'language-' + id, + inside: '#examples' + }); + if (checked) { + update(id); + } + }); + }(id)); +} + +function fileExists(filepath) { + return treePromise.then(function (tree) { + for (var i = 0, l = tree.length; i < l; i++) { + if (tree[i].path === filepath) { + return true; + } + } + return false; + }); +} + +function getFileContents(filepath) { + return new Promise(function (resolve, reject) { + $u.xhr({ + url: filepath, + callback: function (xhr) { + if (xhr.status < 400 && xhr.responseText) { + resolve(xhr.responseText); + } else { + reject(); + } + } + }); + }); +} + +function buildContentsHeader(id) { + var language = languages[id]; + var header = '

' + language.title + '

'; + if (language.overrideExampleHeader) { + return header; + } + if (language.alias) { + var alias = language.alias; + if (Prism.util.type(alias) !== 'Array') { + alias = [alias]; + } + + header += '

To use this language, use one of the following classes:

'; + header += '
  • "language-' + id + '"
  • '; + alias.forEach(function (alias) { + header += '
  • "language-' + alias + '"
  • '; + }); + header += '
'; + } else { + header += '

To use this language, use the class "language-' + id + '".

'; + } + if (language.require) { + var require = language.require; + if (Prism.util.type(require) !== 'Array') { + require = [require]; + } + + header += '

Dependencies: The following dependencies need to be loaded before this component: '; + header += require.map(function (dep) { + return '' + dep + ''; + }).join(', '); + header += '.

'; + } + return header; +} + +function update(id) { + var language = languages[id]; + if (language.enabled) { + if (!language.examplesPromise) { + language.examplesPromise = getFileContents(language.examplesPath); + } + language.examplesPromise.then(function (contents) { + examples[id].innerHTML = buildContentsHeader(id) + contents; + + loadLanguage(id).then(function () { + var elements = examples[id].querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'); + + for (var i=0, element; element = elements[i++];) { + Prism.highlightElement(element); + } + }); + }); + } else { + examples[id].innerHTML = ''; + } +} + +/** + * Loads a language, including all dependencies + * + * @param {string} lang the language to load + * @type {Promise} the promise which resolves as soon as everything is loaded + */ +function loadLanguage (lang) +{ + // at first we need to fetch all dependencies for the main language + // Note: we need to do this, even if the main language already is loaded (just to be sure..) + // + // We load an array of all dependencies and call recursively this function on each entry + // + // dependencies is now an (possibly empty) array of loading-promises + var dependencies = getDependenciesOfLanguage(lang).map(loadLanguage); + + // We create a promise, which will resolve, as soon as all dependencies are loaded. + // They need to be fully loaded because the main language may extend them. + return Promise.all(dependencies) + .then(function () { + + // If the main language itself isn't already loaded, load it now + // and return the newly created promise (we chain the promises). + // If the language is already loaded, just do nothing - the next .then() + // will immediately be called + if (!Prism.languages[lang]) { + return new Promise(function (resolve) { + $u.script('components/prism-' + lang + '.js', resolve); + }); + } + }); +} + + +/** + * Returns all dependencies (as identifiers) of a specific language + * + * @param {string} lang + * @returns {Array.} the list of dependencies. Empty if the language has none. + */ +function getDependenciesOfLanguage (lang) +{ + if (!components.languages[lang] || !components.languages[lang].require) + { + return []; + } + + return ($u.type(components.languages[lang].require) === "array") + ? components.languages[lang].require + : [components.languages[lang].require]; +} + +}()); diff --git a/docs/_style/prism-master/examples/prism-abap.html b/docs/_style/prism-master/examples/prism-abap.html new file mode 100644 index 0000000..dfda1f7 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-abap.html @@ -0,0 +1,65 @@ +

Comments

+

+* Line Comments
+" End of line comment used as line comment.
+value = 1. " End of line comment
+
+DATA:
+  "! ABAPDoc comment
+  value TYPE i.
+
+ +

Strings

+ +

+my_string = 'Simple string'.
+my_string = 'String with an escaped '' inside'.
+my_string = |A string template: { nvalue } times|.
+my_string = |A string template: { nvalue } times|.
+my_string = |Characters \|, \{, and \} have to be escaped by \\ in literal text.|. 
+
+ +

Numbers and Operators

+ +

+value = 001 + 2 - 3 * 4 / 5 ** 6.
+
+IF value < 1 OR
+   value = 2 OR
+   value > 3 OR
+   value <> 4 OR
+   value <= 5 OR
+   value >= 6.
+ENDIF.
+
+" Dynamic object assignment (with type cast check)
+lo_interface ?= lo_class.
+
+ +

Structures and Classes

+ +

+DATA:
+  BEGIN OF my_structure,
+    scomponent TYPE i,
+  END OF my_structure.
+
+CLASS lcl_my_class DEFINITION.
+  PUBLIC SECTION.
+    METHODS my_method
+      RETURNING
+        VALUE(ret_value) TYPE i.
+ENDCLASS.
+
+CLASS lcl_my_class IMPLEMENTATION.
+  METHOD my_method.
+    ret_value = 1.
+  ENDMETHOD
+ENDCLASS.
+
+DATA lo_instace TYPE REF TO lcl_my_class.
+
+CREATE OBJECT lo_instace.
+
+my_structure-component = lo_instace->my_method( ).
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-actionscript.html b/docs/_style/prism-master/examples/prism-actionscript.html new file mode 100644 index 0000000..abb5804 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-actionscript.html @@ -0,0 +1,133 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Literal values

+
17
+"hello"
+-3
+9.4
+null
+true
+false
+ +

Classes

+
class A {}
+class B extends A {}
+ +

Inline XML

+
var employees:XML =
+    <employees>
+        <employee ssn="123-123-1234">
+            <name first="John" last="Doe"/>
+            <address>
+                <city>San Francisco</city>
+                <state>CA</state>
+                <zip>98765</zip>
+            </address>
+        </employee>
+        <employee ssn="789-789-7890">
+            <name first="Mary" last="Roe"/>
+            <address>
+                <city>Newton</city>
+                <state>MA</state>
+                <zip>01234</zip>
+            </address>
+        </employee>
+    </employees>;
+ +

Full example

+
package {
+  import flash.display.*;
+  import flash.events.*;
+  import flash.filters.BlurFilter;
+  import flash.geom.*;
+  import flash.ui.*;
+  public class ch23ex2 extends Sprite {
+    protected const BMP_SCALE:Number = 1/2;
+    protected const D:Number = 1.015;
+    protected const DIM_EFFECT:ColorTransform = new ColorTransform(D, D, D);
+    protected const B:int = 16;
+    protected const BLUR_EFFECT:BlurFilter = new BlurFilter(B, B, 1);
+    protected var RLUT:Array, GLUT:Array, BLUT:Array;
+    protected var sourceBmp:BitmapData;
+    protected var colorBmp:BitmapData;
+    protected var touches:Array = new Array();
+    protected var fingerShape:Shape = new Shape();
+    public function ch23ex2() {
+      try {
+        var test:Class = Multitouch;
+        if (Multitouch.supportsTouchEvents) {
+          Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
+          init();
+        } else {
+          trace("Sorry, this example requires multitouch.");
+        }
+      } catch (error:ReferenceError) {
+        trace("Sorry, but multitouch is not supported in this runtime.");
+      }
+    }
+    protected function init():void {
+      //create a black-and-white bitmap and a color bitmap, only show the color
+      sourceBmp = new BitmapData(
+        stage.stageWidth*BMP_SCALE, stage.stageHeight*BMP_SCALE, false, 0);
+      colorBmp = sourceBmp.clone();
+      var bitmap:Bitmap = new Bitmap(colorBmp, PixelSnapping.ALWAYS, true);
+      bitmap.width = stage.stageWidth; bitmap.height = stage.stageHeight;
+      addChild(bitmap);
+
+      //create finger shape to paste onto the bitmap under your touches
+      fingerShape.graphics.beginFill(0xffffff, 0.1);
+      fingerShape.graphics.drawEllipse(-15, -20, 30, 40);
+      fingerShape.graphics.endFill();
+
+      //create the palette map from a gradient
+      var gradient:Shape = new Shape();
+      var m:Matrix = new Matrix();
+      m.createGradientBox(256, 10);
+      gradient.graphics.beginGradientFill(GradientType.LINEAR,
+        [0x313ad8, 0x2dce4a, 0xdae234, 0x7a1c1c, 0x0f0303],
+        [1, 1, 1, 1, 1], [0, 0.4*256, 0.75*256, 0.9*256, 255], m);
+      gradient.graphics.drawRect(0, 0, 256, 10);
+      var gradientBmp:BitmapData = new BitmapData(256, 10, false, 0);
+      gradientBmp.draw(gradient);
+      RLUT = new Array(); GLUT = new Array(); BLUT = new Array();
+      for (var i:int = 0; i < 256; i++) {
+        var pixelColor:uint = gradientBmp.getPixel(i, 0);
+        //I drew the gradient backwards, so sue me
+        RLUT[256-i] = pixelColor & 0xff0000;
+        GLUT[256-i] = pixelColor & 0x00ff00;
+        BLUT[256-i] = pixelColor & 0x0000ff;
+      }
+
+      stage.addEventListener(TouchEvent.TOUCH_BEGIN, assignTouch);
+      stage.addEventListener(TouchEvent.TOUCH_MOVE, assignTouch);
+      stage.addEventListener(TouchEvent.TOUCH_END, removeTouch);
+      stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
+    }
+    protected function assignTouch(event:TouchEvent):void {
+      touches[event.touchPointID] = event;
+    }
+    protected function removeTouch(event:TouchEvent):void {
+      delete touches[event.touchPointID];
+    }
+    protected function onEnterFrame(event:Event):void {
+      for (var key:String in touches) {
+        var touch:TouchEvent = touches[key] as TouchEvent;
+        if (touch) {
+          //plaster the finger image under your finger
+          var m:Matrix = new Matrix();
+          m.translate(touch.stageX*BMP_SCALE, touch.stageY*BMP_SCALE);
+          sourceBmp.draw(fingerShape, m, null, BlendMode.ADD);
+        }
+      }
+      var O:Point = new Point(0, 0);
+      //blur and ever-so-slightly brighten the image to make the color last
+      sourceBmp.applyFilter(sourceBmp, sourceBmp.rect, O, BLUR_EFFECT);
+      sourceBmp.colorTransform(sourceBmp.rect, DIM_EFFECT);
+      //we've calculated the image in grayscale brightnesses, now make it color
+      colorBmp.paletteMap(sourceBmp, sourceBmp.rect, O, RLUT, GLUT, BLUT, null);
+    }
+  }
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-ada.html b/docs/_style/prism-master/examples/prism-ada.html new file mode 100644 index 0000000..1783027 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-ada.html @@ -0,0 +1,35 @@ +

Strings

+
"foo ""bar"" baz"
+"Multi-line strings are appended with a " &
+"ampersand symbole."
+ +

Ada83 example

+
WITH ADA.TEXT_IO;
+
+--  Comments look like this.
+
+PROCEDURE TEST IS
+BEGIN
+   ADA.TEXT_IO.PUT_LINE ("Hello");   --  Comments look like this.
+END TEST;
+ +

Ada 2012 full example

+
with Ada.Text_IO; Use Ada.Text_IO;
+
+--  Comments look like this.
+procedure Test is
+   procedure Bah with
+    Import        => True,   --  Shows the new aspect feature of the language.
+    Convention    => C,
+    External_Name => "bah";
+
+   type Things is range 1 .. 10;
+begin
+   Put_Line ("Hello");   --  Comments look like this.
+
+   Bah;  -- Call C function.
+
+   for Index in Things'Range loop
+      null;
+   end loop;
+end Test;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-apacheconf.html b/docs/_style/prism-master/examples/prism-apacheconf.html new file mode 100644 index 0000000..f6953e1 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-apacheconf.html @@ -0,0 +1,54 @@ +

Comments

+
# This is a comment
+# <VirtualHost *:80>
+
+ +

Directives

+
<Files .htaccess>
+	Order allow,deny
+	Deny from all
+</Files>
+
+ +

Variables

+
RewriteCond %{REQUEST_FILENAME}.php -f
+ +

Regex

+
^(.*)$
+!^www\.
+ +

Directive flags

+
[NC]
+[RC=301,L]
+ +

Strings

+
AuthName "Fichiers réservés"
+ +

Full example

+
## BASIC PASSWORD PROTECTION
+AuthType basic
+AuthName "prompt"
+AuthUserFile /.htpasswd
+AuthGroupFile /dev/null
+Require valid-user
+
+## ALLOW FROM IP OR VALID PASSWORD
+Require valid-user
+Allow from 192.168.1.23
+Satisfy Any
+
+## PROTECT FILES
+Order Allow,Deny
+Deny from all
+
+## REQUIRE SUBDOMAIN
+RewriteCond %{HTTP_HOST} !^$
+RewriteCond %{HTTP_HOST} !^subdomain\.domain\.tld$ [NC]
+RewriteRule ^/(.*)$ http://subdomain.domain.tld/$1 [L,R=301]
+
+ErrorDocument 403 http://www.example.com/logo.gif
+ErrorDocument 403 /images/you_bad_hotlinker.gif
+
+## REDIRECT UPLOADS
+RewriteCond %{REQUEST_METHOD} ^(PUT|POST)$ [NC]
+RewriteRule ^(.*)$ /cgi-bin/form-upload-processor.cgi?p=$1 [L,QSA]
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-apl.html b/docs/_style/prism-master/examples/prism-apl.html new file mode 100644 index 0000000..61a7e46 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-apl.html @@ -0,0 +1,26 @@ +

Comments

+
#!/usr/bin/env runapl
+aâ†1 2 3 â this is a comment
+ +

Strings

+
''
+'foobar'
+'foo''bar''baz'
+ +

Numbers

+
42
+3.14159
+¯2
+∞
+2.8e¯4
+2j3
+¯4.3e2J1.9e¯4
+ +

Primitive functions

+
a+b×câ´â³10
+ +

Operators

+
+/ fâ£2
+ +

Dfns

+
{0=â´â´âº:'hello' â‹„ ∇¨âµ}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-applescript.html b/docs/_style/prism-master/examples/prism-applescript.html new file mode 100644 index 0000000..c88390e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-applescript.html @@ -0,0 +1,41 @@ +

Comments

+
-- Single line comment
+#!/usr/bin/osascript
+(* Here is
+a block
+comment *)
+ +

Strings

+
"foo \"bar\" baz"
+ +

Operators

+
a ≠ b
+12 + 2 * 5
+"DUMPtruck" is equal to "dumptruck"
+"zebra" comes after "aardvark"
+{ "this", "is", 2, "cool" } starts with "this"
+{ "is", 2} is contained by { "this", "is", 2, "cool" }
+set docRef to a reference to the first document
+
+ +

Classes and units

+
tell application "Finder"
+text 1 thru 5 of "Bring me the mouse."
+set averageTemp to 63 as degrees Fahrenheit
+set circleArea to (pi * 7 * 7) as square yards
+
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Comments only support one level of nesting

+
(* Nested block
+	(* comments
+		(* on more than
+		2 levels *)
+	are *)
+not supported *)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-arduino.html b/docs/_style/prism-master/examples/prism-arduino.html new file mode 100644 index 0000000..915f700 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-arduino.html @@ -0,0 +1,63 @@ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+"Multi-line strings ending with a \
+are supported too."
+ +

Macro statements

+
#include <Bridge.h>
+#define SOME_PIN 11
+
+ +

Booleans

+
true;
+false;
+ +

Operators

+
a < b;
+c && d;
+ +

Full example

+
#include <Bridge.h>
+
+// pin of the piezo speaker
+int piezo = 8;
+
+/**
+ * setups
+ * runs once before everyhing else
+ */
+void setup() {
+    pinMode(piezo, OUTPUT);     
+}
+
+/**
+ * loop
+ * this will run forever and do what we want
+ */
+void loop() {
+    playMelody(1);
+    delay(1000);
+}
+
+/**
+ * playMelody
+ * will play a simple melody on piezo speaker
+ */
+void playMelody(int times) {
+    int melody[] = { 4699, 4699, 3520, 4699 };
+    int duration = 6;
+
+    for( int t = 0; t < times; t++ ) {
+        for( int i = 0; i < 4; i++ ) {
+            // pass tone to selected pin
+            tone(piezoPin, melody[i], 1000/duration);
+
+            // get a bit of time between the tones
+            delay(1000 / duration * 1.30 + 80);
+
+            // and don't forget to switch of the tone afterwards
+            noTone(piezoPin);
+        }
+    }
+}
diff --git a/docs/_style/prism-master/examples/prism-arff.html b/docs/_style/prism-master/examples/prism-arff.html new file mode 100644 index 0000000..4181209 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-arff.html @@ -0,0 +1,46 @@ +

Comments

+
%
+% Some comments
+%
+%
+ +

Keywords

+
@attribute
+@data
+@relation
+ +

Numbers

+
42
+0.14
+ +

Strings

+
'Single \'quoted\' string'
+"Double \"quoted\" string"
+ +

Full example

+
% 1. Title: Iris Plants Database
+%
+% 2. Sources:
+%      (a) Creator: R.A. Fisher
+%      (b) Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
+%      (c) Date: July, 1988
+%
+@RELATION iris
+
+@ATTRIBUTE sepallength  NUMERIC
+@ATTRIBUTE sepalwidth   NUMERIC
+@ATTRIBUTE petallength  NUMERIC
+@ATTRIBUTE petalwidth   NUMERIC
+@ATTRIBUTE class        {Iris-setosa,Iris-versicolor,Iris-virginica}
+
+@DATA
+5.1,3.5,1.4,0.2,Iris-setosa
+4.9,3.0,1.4,0.2,Iris-setosa
+4.7,3.2,1.3,0.2,Iris-setosa
+4.6,3.1,1.5,0.2,Iris-setosa
+5.0,3.6,1.4,0.2,Iris-setosa
+5.4,3.9,1.7,0.4,Iris-setosa
+4.6,3.4,1.4,0.3,Iris-setosa
+5.0,3.4,1.5,0.2,Iris-setosa
+4.4,2.9,1.4,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
diff --git a/docs/_style/prism-master/examples/prism-asciidoc.html b/docs/_style/prism-master/examples/prism-asciidoc.html new file mode 100644 index 0000000..d6df302 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-asciidoc.html @@ -0,0 +1,104 @@ +

Comments

+
/////
+Comment block
+/////
+
+// Comment line
+ +

Titles

+
Level 0
+========
+Level 1
+--------
+Level 2
+~~~~~~~~
+Level 3
+^^^^^^^^
+Level 4
+++++++++
+
+= Document Title (level 0) =
+== Section title (level 1) ==
+=== Section title (level 2) ===
+==== Section title (level 3) ====
+===== Section title (level 4) =====
+
+.Notes
+ +

Blocks

+
++++++++++++++++++++++++++
+Passthrough block
+++++++++++++++++++++++++++
+
+--------------------------
+Listing block
+--------------------------
+
+..........................
+Literal block
+No *highlighting* _here_
+..........................
+
+**************************
+Sidebar block
+**************************
+
+[quote,'http://en.wikipedia.org/wiki/Samuel_Johnson[Samuel Johnson]']
+_____________________________________________________________________
+Sir, a woman's preaching is like a dog's walking on his hind legs. It
+is not done well; but you are surprised to find it done at all.
+_____________________________________________________________________
+
+==========================
+Example block
+==========================
+ +

Lists

+
- List item.
+* List item.
+** List item.
+*** List item.
+**** List item.
+***** List item.
+
+1.   Arabic (decimal) numbered list item.
+a.   Lower case alpha (letter) numbered list item.
+F.   Upper case alpha (letter) numbered list item.
+iii) Lower case roman numbered list item.
+IX)  Upper case roman numbered list item.
+
+. Arabic (decimal) numbered list item.
+.. Lower case alpha (letter) numbered list item.
+... Lower case roman numbered list item.
+.... Upper case alpha (letter) numbered list item.
+..... Upper case roman numbered list item.
+
+Dolor::
+  Donec eget arcu bibendum nunc consequat lobortis.
+  Suspendisse;;
+    A massa id sem aliquam auctor.
+  Morbi;;
+    Pretium nulla vel lorem.
+  In;;
+    Dictum mauris in urna.
+    Vivamus::: Fringilla mi eu lacus.
+    Donec:::   Eget arcu bibendum nunc consequat lobortis.
+ +

Tables

+
[cols="e,m,^,>s",width="25%"]
+|============================
+|1 >s|2 |3 |4
+^|5 2.2+^.^|6 .3+<.>m|7
+^|8
+|9 2+>|10
+|============================
+ +

Inline styles

+
*Some bold text*
+This is an _emphasis_
+[[[walsh-muellner]]]
+ +

Attribute entries

+
:Author Initials: JB
+{authorinitials}
+:Author Initials!:
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-asm6502.html b/docs/_style/prism-master/examples/prism-asm6502.html new file mode 100644 index 0000000..21f4b68 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-asm6502.html @@ -0,0 +1,39 @@ +

Comments

+
; This is a comment
+ +

Labels

+
label1:   ; a label
+ +

Opcodes

+

+SEI
+CLC
+
+; lowercase
+inx
+bne label1
+
+ +

Assembler directives

+

+.segment CODE
+.word $07d3
+
+ +

Registers

+

+ASL A  ; "A"
+LDA label1,x  ; "x"
+
+ +

Strings

+

+.include "header.asm"
+
+ +

Numbers

+

+LDA #127
+STA $80f0
+LDY #%01011000
+
diff --git a/docs/_style/prism-master/examples/prism-aspnet.html b/docs/_style/prism-master/examples/prism-aspnet.html new file mode 100644 index 0000000..d9c30fc --- /dev/null +++ b/docs/_style/prism-master/examples/prism-aspnet.html @@ -0,0 +1,36 @@ +

Comments

+
<%-- This is a comment --%>
+<%-- This is a
+multi-line comment --%>
+ +

Page directives

+
<%@ Page Title="Products" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"  CodeBehind="ProductList.aspx.cs" Inherits="WingtipToys.ProductList" %>
+
+ +

Directive tag

+
<%: Page.Title %>
+<a href="ProductDetails.aspx?productID=<%#:Item.ProductID%>">
+<span>
+    <%#:Item.ProductName%>
+</span>
+ +

Highlighted C# inside scripts

+

This requires the C# component to be loaded. + On this page, check C# before checking ASP.NET should make + the example below work properly.

+
<script runat="server">
+    // The following variables are visible to all procedures
+    // within the script block.
+    String str;
+    int i;
+    int i2;
+
+    int DoubleIt(int inpt)
+    {
+        // The following variable is visible only within
+        // the DoubleIt procedure.
+        int factor = 2;
+
+        return inpt * factor;
+    }
+</script>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-autohotkey.html b/docs/_style/prism-master/examples/prism-autohotkey.html new file mode 100644 index 0000000..620edb2 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-autohotkey.html @@ -0,0 +1,68 @@ +

Comments

+
; This is a comment
+ +

Strings

+
"foo ""bar"" baz"
+ +

Numbers

+
123
+123.456
+123.456e789
+0xAF
+ +

Full example

+
;----Open the selected favorite
+f_OpenFavorite:
+; Fetch the array element that corresponds to the selected menu item:
+StringTrimLeft, f_path, f_path%A_ThisMenuItemPos%, 0
+if f_path =
+    return
+if f_class = #32770    ; It's a dialog.
+{
+    if f_Edit1Pos <>   ; And it has an Edit1 control.
+    {
+        ; Activate the window so that if the user is middle-clicking
+        ; outside the dialog, subsequent clicks will also work:
+        WinActivate ahk_id %f_window_id%
+        ; Retrieve any filename that might already be in the field so
+        ; that it can be restored after the switch to the new folder:
+        ControlGetText, f_text, Edit1, ahk_id %f_window_id%
+        ControlSetText, Edit1, %f_path%, ahk_id %f_window_id%
+        ControlSend, Edit1, {Enter}, ahk_id %f_window_id%
+        Sleep, 100  ; It needs extra time on some dialogs or in some cases.
+        ControlSetText, Edit1, %f_text%, ahk_id %f_window_id%
+        return
+    }
+    ; else fall through to the bottom of the subroutine to take standard action.
+}
+else if f_class in ExploreWClass,CabinetWClass  ; In Explorer, switch folders.
+{
+    if f_Edit1Pos <>   ; And it has an Edit1 control.
+    {
+        ControlSetText, Edit1, %f_path%, ahk_id %f_window_id%
+        ; Tekl reported the following: "If I want to change to Folder L:\folder
+        ; then the addressbar shows http://www.L:\folder.com. To solve this,
+        ; I added a {right} before {Enter}":
+        ControlSend, Edit1, {Right}{Enter}, ahk_id %f_window_id%
+        return
+    }
+    ; else fall through to the bottom of the subroutine to take standard action.
+}
+else if f_class = ConsoleWindowClass ; In a console window, CD to that directory
+{
+    WinActivate, ahk_id %f_window_id% ; Because sometimes the mclick deactivates it.
+    SetKeyDelay, 0  ; This will be in effect only for the duration of this thread.
+    IfInString, f_path, :  ; It contains a drive letter
+    {
+        StringLeft, f_path_drive, f_path, 1
+        Send %f_path_drive%:{enter}
+    }
+    Send, cd %f_path%{Enter}
+    return
+}
+; Since the above didn't return, one of the following is true:
+; 1) It's an unsupported window type but f_AlwaysShowMenu is y (yes).
+; 2) It's a supported type but it lacks an Edit1 control to facilitate the custom
+;    action, so instead do the default action below.
+Run, Explorer %f_path%  ; Might work on more systems without double quotes.
+return
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-autoit.html b/docs/_style/prism-master/examples/prism-autoit.html new file mode 100644 index 0000000..51220b4 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-autoit.html @@ -0,0 +1,52 @@ +

Comments

+
; Single-line comment
+#comments-start
+	Multi-line
+	comment
+#comments-end
+#cs
+	Multi-line
+	comment
+#ce
+;#comments-start
+	foo()
+;#comments-end
+ +

Strings

+
"foo'bar'baz"
+"foo""bar""baz"
+'foo"bar"baz'
+'foo''bar''baz'
+ +

Numbers

+
2
+4.566
+1.5e3
+0x4fff
+ +

Booleans

+
True
+False
+ +

Keywords and variables

+
; Display all the numbers for 1 to 10 but skip displaying  7.
+For $i = 1 To 10
+    If $i = 7 Then
+        ContinueLoop ; Skip displaying the message box when $i is equal to 7.
+    EndIf
+    MsgBox($MB_SYSTEMMODAL, "", "The value of $i is: " & $i)
+Next
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Nested block comments

+
#cs
+	#cs
+		foo()
+	#ce
+#ce
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-bash.html b/docs/_style/prism-master/examples/prism-bash.html new file mode 100644 index 0000000..3e0febf --- /dev/null +++ b/docs/_style/prism-master/examples/prism-bash.html @@ -0,0 +1,49 @@ +

Shebang

+
#!/bin/bash
+ +

Comments

+
# This is a comment
+ +

Strings

+
STRING="Hello World"
+'Single and
+multi-line strings are supported.'
+"Single and
+multi-line strings are supported."
+cat << EOF
+Here-Documents
+are also supported
+EOF
+ +

Variables

+
echo $STRING
+args=("$@")
+echo ${args[0]} ${args[1]} ${args[2]}
+ +

Keywords

+
for (( i=0;i<$ELEMENTS;i++)); do
+	echo ${ARRAY[${i}]}
+done
+while read LINE; do
+    ARRAY[$count]=$LINE
+    ((count++))
+done
+if [ -d $directory ]; then
+	echo "Directory exists"
+else
+	echo "Directory does not exists"
+fi
+
+ +

Some well-known commands

+
crontab -l -u USER | grep -v 'YOUR JOB COMMAND or PATTERN' | crontab -u USER -
+
+groups user1 user2|cut -d: -f2|xargs -n1|sort|uniq -d
+
+wget -q -O - http://www.example.com/automation/remotescript.sh | bash /dev/stdin parameter1 parameter2
+
+sudo dpkg -i vagrant_1.7.2_x86_64.deb
+
+git pull origin master
+
+sudo gpg --refresh-keys; sudo apt-key update; sudo rm -rf /var/lib/apt/{lists,lists.old}; sudo mkdir -p /var/lib/apt/lists/partial; sudo apt-get clean all; sudo apt-get update
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-basic.html b/docs/_style/prism-master/examples/prism-basic.html new file mode 100644 index 0000000..3630a8a --- /dev/null +++ b/docs/_style/prism-master/examples/prism-basic.html @@ -0,0 +1,69 @@ +

Note: this component focuses on first and second-generation BASICs (such as MSX BASIC, GW-BASIC, SuperBASIC, QuickBASIC, PowerBASIC...).

+ +

Comments

+
! This is a comment
+REM This is a remark
+ +

Strings

+
"This a string."
+"This is a string with ""quotes"" in it."
+ +

Numbers

+
42
+3.14159
+-42
+-3.14159
+.5
+10.
+2E10
+4.2E-14
+-3E+2
+ +

Dartmouth Basic example

+
5 LET S = 0
+10 MAT INPUT V
+20 LET N = NUM
+30 IF N = 0 THEN 99
+40 FOR I = 1 TO N
+45 LET S = S + V(I)
+50 NEXT I
+60 PRINT S/N
+70 GO TO 5
+99 END
+ +

GW-BASIC example

+
10 INPUT "What is your name: ", U$
+20 PRINT "Hello "; U$
+30 INPUT "How many stars do you want: ", N
+40 S$ = ""
+50 FOR I = 1 TO N
+60 S$ = S$ + "*"
+70 NEXT I
+80 PRINT S$
+90 INPUT "Do you want more stars? ", A$
+100 IF LEN(A$) = 0 THEN GOTO 90
+110 A$ = LEFT$(A$, 1)
+120 IF A$ = "Y" OR A$ = "y" THEN GOTO 30
+130 PRINT "Goodbye "; U$
+140 END
+ +

QuickBASIC example

+
DECLARE SUB PrintSomeStars (StarCount!)
+REM QuickBASIC example
+INPUT "What is your name: ", UserName$
+PRINT "Hello "; UserName$
+DO
+   INPUT "How many stars do you want: ", NumStars
+   CALL PrintSomeStars(NumStars)
+   DO
+      INPUT "Do you want more stars? ", Answer$
+   LOOP UNTIL Answer$ <> ""
+   Answer$ = LEFT$(Answer$, 1)
+LOOP WHILE UCASE$(Answer$) = "Y"
+PRINT "Goodbye "; UserName$
+
+SUB PrintSomeStars (StarCount)
+   REM This procedure uses a local variable called Stars$
+   Stars$ = STRING$(StarCount, "*")
+   PRINT Stars$
+END SUB
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-batch.html b/docs/_style/prism-master/examples/prism-batch.html new file mode 100644 index 0000000..13f9018 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-batch.html @@ -0,0 +1,17 @@ +

Comments

+
::
+:: Foo bar
+REM This is a comment too
+REM Multi-line ^
+comment
+ +

Labels

+
:foobar
+GOTO :EOF
+ +

Commands

+
@ECHO OFF
+FOR /l %%a in (5,-1,1) do (TITLE %title% -- closing in %%as)
+SET title=%~n0
+if /i "%InstSize:~0,1%"=="M" set maxcnt=3
+ping -n 2 -w 1 127.0.0.1
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-bison.html b/docs/_style/prism-master/examples/prism-bison.html new file mode 100644 index 0000000..9c7edeb --- /dev/null +++ b/docs/_style/prism-master/examples/prism-bison.html @@ -0,0 +1,104 @@ +

Comments

+
// Single-line comment
+/* Multi-line
+comment */
+ +

C prologue and Bison declarations

+
%{
+  #include <stdio.h>
+  #include <math.h>
+  int yylex (void);
+  void yyerror (char const *);
+%}
+
+%define api.value.type {double}
+%token NUM
+%union { char *string; }
+%%
+%%
+ +

Grammar rules

+
%%
+exp:
+  NUM           { $$ = $1;           }
+| exp exp '+'   { $$ = $1 + $2;      }
+| exp exp '-'   { $$ = $1 - $2;      }
+| exp exp '*'   { $$ = $1 * $2;      }
+| exp exp '/'   { $$ = $1 / $2;      }
+| exp exp '^'   { $$ = pow($1, $2);  }  /* Exponentiation */
+| exp 'n'       { $$ = -$1;          }  /* Unary minus    */
+;
+
+$@1: %empty { a(); };
+$@2: %empty { c(); };
+$@3: %empty { d(); };
+exp: $@1 "b" $@2 $@3 "e" { f(); };
+%%
+ +

Full example

+
/* Mini Calculator */
+/* calc.y */
+
+%{
+#include "heading.h"
+int yyerror(char *s);
+int yylex(void);
+%}
+
+%union{
+  int		int_val;
+  string*	op_val;
+}
+
+%start	input 
+
+%token	<int_val>	INTEGER_LITERAL
+%type	<int_val>	exp
+%left	PLUS
+%left	MULT
+
+%%
+
+input:		/* empty */
+		| exp	{ cout << "Result: " << $1 << endl; }
+		;
+
+exp:		INTEGER_LITERAL	{ $$ = $1; }
+		| exp PLUS exp	{ $$ = $1 + $3; }
+		| exp MULT exp	{ $$ = $1 * $3; }
+		;
+
+%%
+
+int yyerror(string s)
+{
+  extern int yylineno;	// defined and maintained in lex.c
+  extern char *yytext;	// defined and maintained in lex.c
+  
+  cerr << "ERROR: " << s << " at symbol \"" << yytext;
+  cerr << "\" on line " << yylineno << endl;
+  exit(1);
+}
+
+int yyerror(char *s)
+{
+  return yyerror(string(s));
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Two levels of nesting inside C section

+
{
+	if($1) {
+		if($2) {
+
+		}
+	}
+} // <- Broken
+%%
+%%
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-brainfuck.html b/docs/_style/prism-master/examples/prism-brainfuck.html new file mode 100644 index 0000000..89a435c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-brainfuck.html @@ -0,0 +1,37 @@ +

Full example

+
+++++ +++               Set Cell #0 to 8
+[
+    >++++               Add 4 to Cell #1; this will always set Cell #1 to 4
+    [                   as the cell will be cleared by the loop
+        >++             Add 2 to Cell #2
+        >+++            Add 3 to Cell #3
+        >+++            Add 3 to Cell #4
+        >+              Add 1 to Cell #5
+        <<<<-           Decrement the loop counter in Cell #1
+    ]                   Loop till Cell #1 is zero; number of iterations is 4
+    >+                  Add 1 to Cell #2
+    >+                  Add 1 to Cell #3
+    >-                  Subtract 1 from Cell #4
+    >>+                 Add 1 to Cell #6
+    [<]                 Move back to the first zero cell you find; this will
+                        be Cell #1 which was cleared by the previous loop
+    <-                  Decrement the loop Counter in Cell #0
+]                       Loop till Cell #0 is zero; number of iterations is 8
+
+The result of this is:
+Cell No :   0   1   2   3   4   5   6
+Contents:   0   0  72 104  88  32   8
+Pointer :   ^
+
+>>.                     Cell #2 has value 72 which is 'H'
+>---.                   Subtract 3 from Cell #3 to get 101 which is 'e'
++++++++..+++.           Likewise for 'llo' from Cell #3
+>>.                     Cell #5 is 32 for the space
+<-.                     Subtract 1 from Cell #4 for 87 to give a 'W'
+<.                      Cell #3 was set to 'o' from the end of 'Hello'
++++.------.--------.    Cell #3 for 'rl' and 'd'
+>>+.                    Add 1 to Cell #5 gives us an exclamation point
+>++.                    And finally a newline from Cell #6
+ +

One-line example

+
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
diff --git a/docs/_style/prism-master/examples/prism-bro.html b/docs/_style/prism-master/examples/prism-bro.html new file mode 100644 index 0000000..83d6374 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-bro.html @@ -0,0 +1,645 @@ +

Comments

+
# Single line comment
+
+ +

Strings

+

+"a", "b"
+
+ +

Numbers

+
123
+123.456
+-123.456
+
+ +

Misc

+

+@ifndef ourexp
+@load-sigs somesigs
+
+ +

Full example

+

+##! Scan detector ported from Bro 1.x.
+##!
+##! This script has evolved over many years and is quite a mess right now. We
+##! have adapted it to work with Bro 2.x, but eventually Bro 2.x will
+##! get its own rewritten and generalized scan detector.
+
+@load base/frameworks/notice/main
+
+module Scan;
+
+export {
+	redef enum Notice::Type += {
+		## The source has scanned a number of ports.
+		PortScan,
+		## The source has scanned a number of addresses.
+		AddressScan,
+		## Apparent flooding backscatter seen from source.
+		BackscatterSeen,
+
+		## Summary of scanning activity.
+		ScanSummary,
+		## Summary of distinct ports per scanner.
+		PortScanSummary,
+		## Summary of distinct low ports per scanner.
+		LowPortScanSummary,
+
+		## Source reached :bro:id:`Scan::shut_down_thresh`
+		ShutdownThresh,
+		## Source touched privileged ports.
+		LowPortTrolling,
+	};
+
+	# Whether to consider UDP "connections" for scan detection.
+	# Can lead to false positives due to UDP fanout from some P2P apps.
+	const suppress_UDP_scan_checks = F &redef;
+
+	const activate_priv_port_check = T &redef;
+	const activate_landmine_check = F &redef;
+	const landmine_thresh_trigger = 5 &redef;
+
+	const landmine_address: set[addr] &redef;
+
+	const scan_summary_trigger = 25 &redef;
+	const port_summary_trigger = 20 &redef;
+	const lowport_summary_trigger = 10 &redef;
+
+	# Raise ShutdownThresh after this many failed attempts
+	const shut_down_thresh = 100 &redef;
+
+	# Which services should be analyzed when detecting scanning
+	# (not consulted if analyze_all_services is set).
+	const analyze_services: set[port] &redef;
+	const analyze_all_services = T &redef;
+
+	# Track address scaners only if at least these many hosts contacted.
+	const addr_scan_trigger = 0 &redef;
+
+	# Ignore address scanners for further scan detection after
+	# scanning this many hosts.
+	# 0 disables.
+	const ignore_scanners_threshold = 0 &redef;
+
+	# Report a scan of peers at each of these points.
+	const report_peer_scan: vector of count = {
+		20, 100, 1000, 10000, 50000, 100000, 250000, 500000, 1000000,
+	} &redef;
+
+	const report_outbound_peer_scan: vector of count = {
+		100, 1000, 10000,
+	} &redef;
+
+	# Report a scan of ports at each of these points.
+	const report_port_scan: vector of count = {
+		50, 250, 1000, 5000, 10000, 25000, 65000,
+	} &redef;
+
+	# Once a source has scanned this many different ports (to however many
+	# different remote hosts), start tracking its per-destination access.
+	const possible_port_scan_thresh = 20 &redef;
+
+	# Threshold for scanning privileged ports.
+	const priv_scan_trigger = 5 &redef;
+	const troll_skip_service = {
+		25/tcp, 21/tcp, 22/tcp, 20/tcp, 80/tcp,
+	} &redef;
+
+	const report_accounts_tried: vector of count = {
+		20, 100, 1000, 10000, 100000, 1000000,
+	} &redef;
+
+	const report_remote_accounts_tried: vector of count = {
+		100, 500,
+	} &redef;
+
+	# Report a successful password guessing if the source attempted
+	# at least this many.
+	const password_guessing_success_threshhold = 20 &redef;
+
+	const skip_accounts_tried: set[addr] &redef;
+
+	const addl_web = {
+		81/tcp, 443/tcp, 8000/tcp, 8001/tcp, 8080/tcp, }
+	&redef;
+
+	const skip_services = { 113/tcp, } &redef;
+	const skip_outbound_services = { 21/tcp, addl_web, }
+		&redef;
+
+	const skip_scan_sources = {
+		255.255.255.255,	# who knows why we see these, but we do
+	} &redef;
+
+	const skip_scan_nets: set[subnet] = {} &redef;
+
+	# List of well known local server/ports to exclude for scanning
+	# purposes.
+	const skip_dest_server_ports: set[addr, port] = {} &redef;
+
+	# Reverse (SYN-ack) scans seen from these ports are considered
+	# to reflect possible SYN-flooding backscatter, and not true
+	# (stealth) scans.
+	const backscatter_ports = {
+		80/tcp, 8080/tcp, 53/tcp, 53/udp, 179/tcp, 6666/tcp, 6667/tcp,
+	} &redef;
+
+	const report_backscatter: vector of count = {
+		20,
+	} &redef;
+
+	global check_scan:
+		function(c: connection, established: bool, reverse: bool): bool;
+
+	# The following tables are defined here so that we can redef
+	# the expire timeouts.
+	# FIXME: should we allow redef of attributes on IDs which
+	# are not exported?
+
+	# How many different hosts connected to with a possible
+	# backscatter signature.
+	global distinct_backscatter_peers: table[addr] of table[addr] of count
+		&read_expire = 15 min;
+
+	# Expire functions that trigger summaries.
+	global scan_summary:
+		function(t: table[addr] of set[addr], orig: addr): interval;
+	global port_summary:
+		function(t: table[addr] of set[port], orig: addr): interval;
+	global lowport_summary:
+		function(t: table[addr] of set[port], orig: addr): interval;
+
+	# Indexed by scanner address, yields # distinct peers scanned.
+	# pre_distinct_peers tracks until addr_scan_trigger hosts first.
+	global pre_distinct_peers: table[addr] of set[addr]
+		&read_expire = 15 mins &redef;
+
+	global distinct_peers: table[addr] of set[addr]
+		&read_expire = 15 mins &expire_func=scan_summary &redef;
+	global distinct_ports: table[addr] of set[port]
+		&read_expire = 15 mins &expire_func=port_summary &redef;
+	global distinct_low_ports: table[addr] of set[port]
+		&read_expire = 15 mins &expire_func=lowport_summary &redef;
+
+	# Indexed by scanner address, yields a table with scanned hosts
+	# (and ports).
+	global scan_triples: table[addr] of table[addr] of set[port];
+
+	global remove_possible_source:
+		function(s: set[addr], idx: addr): interval;
+	global possible_scan_sources: set[addr]
+		&expire_func=remove_possible_source &read_expire = 15 mins;
+
+	# Indexed by source address, yields user name & password tried.
+	global accounts_tried: table[addr] of set[string, string]
+		&read_expire = 1 days;
+
+	global ignored_scanners: set[addr] &create_expire = 1 day &redef;
+
+	# These tables track whether a threshold has been reached.
+	# More precisely, the counter is the next index of threshold vector.
+	global shut_down_thresh_reached: table[addr] of bool &default=F;
+	global rb_idx: table[addr] of count
+			&default=1 &read_expire = 1 days &redef;
+	global rps_idx: table[addr] of count
+			&default=1 &read_expire = 1 days &redef;
+	global rops_idx: table[addr] of count
+			&default=1 &read_expire = 1 days &redef;
+	global rpts_idx: table[addr,addr] of count
+			&default=1 &read_expire = 1 days &redef;
+	global rat_idx: table[addr] of count
+			&default=1 &read_expire = 1 days &redef;
+	global rrat_idx: table[addr] of count
+			&default=1 &read_expire = 1 days &redef;
+}
+
+global thresh_check: function(v: vector of count, idx: table[addr] of count,
+				orig: addr, n: count): bool;
+global thresh_check_2: function(v: vector of count,
+				idx: table[addr,addr] of count, orig: addr,
+				resp: addr, n: count): bool;
+
+function scan_summary(t: table[addr] of set[addr], orig: addr): interval
+	{
+	local num_distinct_peers = orig in t ? |t[orig]| : 0;
+
+	if ( num_distinct_peers >= scan_summary_trigger )
+		NOTICE([$note=ScanSummary, $src=orig, $n=num_distinct_peers,
+			$identifier=fmt("%s", orig),
+			$msg=fmt("%s scanned a total of %d hosts",
+					orig, num_distinct_peers)]);
+
+	return 0 secs;
+	}
+
+function port_summary(t: table[addr] of set[port], orig: addr): interval
+	{
+	local num_distinct_ports = orig in t ? |t[orig]| : 0;
+
+	if ( num_distinct_ports >= port_summary_trigger )
+		NOTICE([$note=PortScanSummary, $src=orig, $n=num_distinct_ports,
+			$identifier=fmt("%s", orig),
+			$msg=fmt("%s scanned a total of %d ports",
+					orig, num_distinct_ports)]);
+
+	return 0 secs;
+	}
+
+function lowport_summary(t: table[addr] of set[port], orig: addr): interval
+	{
+	local num_distinct_lowports = orig in t ? |t[orig]| : 0;
+
+	if ( num_distinct_lowports >= lowport_summary_trigger )
+		NOTICE([$note=LowPortScanSummary, $src=orig,
+			$n=num_distinct_lowports,
+			$identifier=fmt("%s", orig),
+			$msg=fmt("%s scanned a total of %d low ports",
+					orig, num_distinct_lowports)]);
+
+	return 0 secs;
+	}
+
+function clear_addr(a: addr)
+	{
+	delete distinct_peers[a];
+	delete distinct_ports[a];
+	delete distinct_low_ports[a];
+	delete scan_triples[a];
+	delete possible_scan_sources[a];
+	delete distinct_backscatter_peers[a];
+	delete pre_distinct_peers[a];
+	delete rb_idx[a];
+	delete rps_idx[a];
+	delete rops_idx[a];
+	delete rat_idx[a];
+	delete rrat_idx[a];
+	delete shut_down_thresh_reached[a];
+	delete ignored_scanners[a];
+	}
+
+function ignore_addr(a: addr)
+	{
+	clear_addr(a);
+	add ignored_scanners[a];
+	}
+
+function check_scan(c: connection, established: bool, reverse: bool): bool
+	{
+	local id = c$id;
+
+	local service = "ftp-data" in c$service ? 20/tcp
+			: (reverse ? id$orig_p : id$resp_p);
+	local rev_service = reverse ? id$resp_p : id$orig_p;
+	local orig = reverse ? id$resp_h : id$orig_h;
+	local resp = reverse ? id$orig_h : id$resp_h;
+	local outbound = Site::is_local_addr(orig);
+
+	# The following works better than using get_conn_transport_proto()
+	# because c might not correspond to an active connection (which
+	# causes the function to fail).
+	if ( suppress_UDP_scan_checks &&
+	     service >= 0/udp && service <= 65535/udp )
+		return F;
+
+	if ( service in skip_services && ! outbound )
+		return F;
+
+	if ( outbound && service in skip_outbound_services )
+		return F;
+
+	if ( orig in skip_scan_sources )
+		return F;
+
+	if ( orig in skip_scan_nets )
+		return F;
+
+	# Don't include well known server/ports for scanning purposes.
+	if ( ! outbound && [resp, service] in skip_dest_server_ports )
+		return F;
+
+	if ( orig in ignored_scanners)
+		return F;
+
+	if ( ! established &&
+		# not established, service not expressly allowed
+
+		# not known peer set
+		(orig !in distinct_peers || resp !in distinct_peers[orig]) &&
+
+		# want to consider service for scan detection
+		(analyze_all_services || service in analyze_services) )
+		{
+		if ( reverse && rev_service in backscatter_ports &&
+		     # reverse, non-priv backscatter port
+		     service >= 1024/tcp )
+			{
+			if ( orig !in distinct_backscatter_peers )
+				{
+				local empty_bs_table:
+					table[addr] of count &default=0;
+				distinct_backscatter_peers[orig] =
+					empty_bs_table;
+				}
+
+			if ( ++distinct_backscatter_peers[orig][resp] <= 2 &&
+			     # The test is <= 2 because we get two check_scan()
+			     # calls, once on connection attempt and once on
+			     # tear-down.
+
+			     distinct_backscatter_peers[orig][resp] == 1 &&
+
+			     # Looks like backscatter, and it's not scanning
+			     # a privileged port.
+
+			     thresh_check(report_backscatter, rb_idx, orig,
+					|distinct_backscatter_peers[orig]|)
+			   )
+				{
+				NOTICE([$note=BackscatterSeen, $src=orig,
+					$p=rev_service,
+					$identifier=fmt("%s", orig),
+					$msg=fmt("backscatter seen from %s (%d hosts; %s)",
+						orig, |distinct_backscatter_peers[orig]|, rev_service)]);
+				}
+
+			if ( ignore_scanners_threshold > 0 &&
+			     |distinct_backscatter_peers[orig]| >
+					ignore_scanners_threshold )
+				ignore_addr(orig);
+			}
+
+		else
+			{ # done with backscatter check
+			local ignore = F;
+
+			if ( orig !in distinct_peers && addr_scan_trigger > 0 )
+				{
+				if ( orig !in pre_distinct_peers )
+					pre_distinct_peers[orig] = set();
+
+				add pre_distinct_peers[orig][resp];
+				if ( |pre_distinct_peers[orig]| < addr_scan_trigger )
+					ignore = T;
+				}
+
+			if ( ! ignore )
+				{ # XXXXX
+
+				if ( orig !in distinct_peers )
+					distinct_peers[orig] = set() &mergeable;
+
+				if ( resp !in distinct_peers[orig] )
+					add distinct_peers[orig][resp];
+
+				local n = |distinct_peers[orig]|;
+
+				# Check for threshold if not outbound.
+				if ( ! shut_down_thresh_reached[orig] &&
+				     n >= shut_down_thresh &&
+				     ! outbound && orig !in Site::neighbor_nets )
+					{
+					shut_down_thresh_reached[orig] = T;
+					local msg = fmt("shutdown threshold reached for %s", orig);
+					NOTICE([$note=ShutdownThresh, $src=orig,
+						$identifier=fmt("%s", orig),
+						$p=service, $msg=msg]);
+					}
+
+				else
+					{
+					local address_scan = F;
+					if ( outbound &&
+					     # inside host scanning out?
+					     thresh_check(report_outbound_peer_scan, rops_idx, orig, n) )
+						address_scan = T;
+
+					if ( ! outbound &&
+					     thresh_check(report_peer_scan, rps_idx, orig, n) )
+						address_scan = T;
+
+					if ( address_scan )
+						NOTICE([$note=AddressScan,
+							$src=orig, $p=service,
+							$n=n,
+							$identifier=fmt("%s-%d", orig, n),
+							$msg=fmt("%s has scanned %d hosts (%s)",
+								orig, n, service)]);
+
+					if ( address_scan &&
+					     ignore_scanners_threshold > 0 &&
+					     n > ignore_scanners_threshold )
+						ignore_addr(orig);
+					}
+				}
+			} # XXXX
+		}
+
+	if ( established )
+		# Don't consider established connections for port scanning,
+		# it's too easy to be mislead by FTP-like applications that
+		# legitimately gobble their way through the port space.
+		return F;
+
+	# Coarse search for port-scanning candidates: those that have made
+	# connections (attempts) to possible_port_scan_thresh or more
+	# distinct ports.
+	if ( orig !in distinct_ports || service !in distinct_ports[orig] )
+		{
+		if ( orig !in distinct_ports )
+			distinct_ports[orig] = set() &mergeable;
+
+		if ( service !in distinct_ports[orig] )
+			add distinct_ports[orig][service];
+
+		if ( |distinct_ports[orig]| >= possible_port_scan_thresh &&
+			orig !in scan_triples )
+			{
+			scan_triples[orig] = table() &mergeable;
+			add possible_scan_sources[orig];
+			}
+		}
+
+	# Check for low ports.
+	if ( activate_priv_port_check && ! outbound && service < 1024/tcp &&
+	     service !in troll_skip_service )
+		{
+		if ( orig !in distinct_low_ports ||
+		     service !in distinct_low_ports[orig] )
+			{
+			if ( orig !in distinct_low_ports )
+				distinct_low_ports[orig] = set() &mergeable;
+
+			add distinct_low_ports[orig][service];
+
+			if ( |distinct_low_ports[orig]| == priv_scan_trigger &&
+			     orig !in Site::neighbor_nets )
+				{
+				local svrc_msg = fmt("low port trolling %s %s", orig, service);
+				NOTICE([$note=LowPortTrolling, $src=orig,
+					$identifier=fmt("%s", orig),
+					$p=service, $msg=svrc_msg]);
+				}
+
+			if ( ignore_scanners_threshold > 0 &&
+			     |distinct_low_ports[orig]| >
+					ignore_scanners_threshold )
+				ignore_addr(orig);
+			}
+		}
+
+	# For sources that have been identified as possible scan sources,
+	# keep track of per-host scanning.
+	if ( orig in possible_scan_sources )
+		{
+		if ( orig !in scan_triples )
+			scan_triples[orig] = table() &mergeable;
+
+		if ( resp !in scan_triples[orig] )
+			scan_triples[orig][resp] = set() &mergeable;
+
+		if ( service !in scan_triples[orig][resp] )
+			{
+			add scan_triples[orig][resp][service];
+
+			if ( thresh_check_2(report_port_scan, rpts_idx,
+					    orig, resp,
+					    |scan_triples[orig][resp]|) )
+				{
+				local m = |scan_triples[orig][resp]|;
+				NOTICE([$note=PortScan, $n=m, $src=orig,
+					$p=service,
+					$identifier=fmt("%s-%d", orig, n),
+					$msg=fmt("%s has scanned %d ports of %s",
+					orig, m, resp)]);
+				}
+			}
+		}
+
+	return T;
+	}
+
+
+# Hook into the catch&release dropping. When an address gets restored, we reset
+# the source to allow dropping it again.
+event Drop::address_restored(a: addr)
+	{
+	clear_addr(a);
+	}
+
+event Drop::address_cleared(a: addr)
+	{
+	clear_addr(a);
+	}
+
+# When removing a possible scan source, we automatically delete its scanned
+# hosts and ports.  But we do not want the deletion propagated, because every
+# peer calls the expire_function on its own (and thus applies the delete
+# operation on its own table).
+function remove_possible_source(s: set[addr], idx: addr): interval
+	{
+	suspend_state_updates();
+	delete scan_triples[idx];
+	resume_state_updates();
+
+	return 0 secs;
+	}
+
+# To recognize whether a certain threshhold vector (e.g. report_peer_scans)
+# has been transgressed, a global variable containing the next vector index
+# (idx) must be incremented.  This cumbersome mechanism is necessary because
+# values naturally don't increment by one (e.g. replayed table merges).
+function thresh_check(v: vector of count, idx: table[addr] of count,
+			orig: addr, n: count): bool
+	{
+	if ( ignore_scanners_threshold > 0 && n > ignore_scanners_threshold )
+		{
+		ignore_addr(orig);
+		return F;
+		}
+
+	if ( idx[orig] <= |v| && n >= v[idx[orig]] )
+		{
+		++idx[orig];
+		return T;
+		}
+	else
+		return F;
+	}
+
+# Same as above, except the index has a different type signature.
+function thresh_check_2(v: vector of count, idx: table[addr, addr] of count,
+			orig: addr, resp: addr, n: count): bool
+	{
+	if ( ignore_scanners_threshold > 0 && n > ignore_scanners_threshold )
+		{
+		ignore_addr(orig);
+		return F;
+		}
+
+	if ( idx[orig,resp] <= |v| && n >= v[idx[orig, resp]] )
+		{
+		++idx[orig,resp];
+		return T;
+		}
+	else
+		return F;
+	}
+
+event connection_established(c: connection)
+	{
+	local is_reverse_scan = (c$orig$state == TCP_INACTIVE);
+	Scan::check_scan(c, T, is_reverse_scan);
+	}
+
+event partial_connection(c: connection)
+	{
+	Scan::check_scan(c, T, F);
+	}
+
+event connection_attempt(c: connection)
+	{
+	Scan::check_scan(c, F, c$orig$state == TCP_INACTIVE);
+	}
+
+event connection_half_finished(c: connection)
+	{
+	# Half connections never were "established", so do scan-checking here.
+	Scan::check_scan(c, F, F);
+	}
+
+event connection_rejected(c: connection)
+	{
+	local is_reverse_scan = c$orig$state == TCP_RESET;
+
+	Scan::check_scan(c, F, is_reverse_scan);
+	}
+
+event connection_reset(c: connection)
+	{
+	if ( c$orig$state == TCP_INACTIVE || c$resp$state == TCP_INACTIVE )
+		# We never heard from one side - that looks like a scan.
+		Scan::check_scan(c, c$orig$size + c$resp$size > 0,
+				c$orig$state == TCP_INACTIVE);
+	}
+
+event connection_pending(c: connection)
+	{
+	if ( c$orig$state == TCP_PARTIAL && c$resp$state == TCP_INACTIVE )
+		Scan::check_scan(c, F, F);
+	}
+
+# Report the remaining entries in the tables.
+event bro_done()
+	{
+	for ( orig in distinct_peers )
+		scan_summary(distinct_peers, orig);
+
+	for ( orig in distinct_ports )
+		port_summary(distinct_ports, orig);
+
+	for ( orig in distinct_low_ports )
+		lowport_summary(distinct_low_ports, orig);
+	}
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-c.html b/docs/_style/prism-master/examples/prism-c.html new file mode 100644 index 0000000..aee1c06 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-c.html @@ -0,0 +1,22 @@ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+"Multi-line strings ending with a \
+are supported too."
+ +

Macro statements

+
# include <stdio.h>
+#define PG_locked   0
+#define PG_error    1
+
+ +

Full example

+
#include <stdio.h>
+main(int argc, char *argv[])
+{
+   int c;
+   printf("Number of command line arguments passed: %d\n", argc);
+   for ( c = 0 ; c < argc ; c++)
+      printf("%d. Command line argument passed is %s\n", c+1, argv[c]);
+   return 0;
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-clike.html b/docs/_style/prism-master/examples/prism-clike.html new file mode 100644 index 0000000..79a8076 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-clike.html @@ -0,0 +1,28 @@ +

The C-like component is not really a language on its own, + it is the basis of many other components. To use it directly, however, + use the class "language-clike".

+ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz";
+'foo \'bar\' baz';
+ +

Numbers

+
123
+123.456
+-123.456
+1e-23
+123.456E789
+0xaf
+0xAF
+
+ +

Functions

+
foo();
+Bar();
+_456();
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-clojure.html b/docs/_style/prism-master/examples/prism-clojure.html new file mode 100644 index 0000000..abc5019 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-clojure.html @@ -0,0 +1,386 @@ +

Full example

+

+; This code is copied from https://learnxinyminutes.com/docs/clojure/
+
+; Comments start with semicolons.
+
+; Clojure is written in "forms", which are just
+; lists of things inside parentheses, separated by whitespace.
+;
+; The clojure reader assumes that the first thing is a
+; function or macro to call, and the rest are arguments.
+
+; The first call in a file should be ns, to set the namespace
+(ns learnclojure)
+
+; More basic examples:
+
+; str will create a string out of all its arguments
+(str "Hello" " " "World") ; => "Hello World"
+
+; Math is straightforward
+(+ 1 1) ; => 2
+(- 2 1) ; => 1
+(* 1 2) ; => 2
+(/ 2 1) ; => 2
+
+; Equality is =
+(= 1 1) ; => true
+(= 2 1) ; => false
+
+; You need not for logic, too
+(not true) ; => false
+
+; Nesting forms works as you expect
+(+ 1 (- 3 2)) ; = 1 + (3 - 2) => 2
+
+; Types
+;;;;;;;;;;;;;
+
+; Clojure uses Java's object types for booleans, strings and numbers.
+; Use `class` to inspect them.
+(class 1) ; Integer literals are java.lang.Long by default
+(class 1.); Float literals are java.lang.Double
+(class ""); Strings always double-quoted, and are java.lang.String
+(class false) ; Booleans are java.lang.Boolean
+(class nil); The "null" value is called nil
+
+; If you want to create a literal list of data, use ' to stop it from
+; being evaluated
+'(+ 1 2) ; => (+ 1 2)
+; (shorthand for (quote (+ 1 2)))
+
+; You can eval a quoted list
+(eval '(+ 1 2)) ; => 3
+
+; Collections & Sequences
+;;;;;;;;;;;;;;;;;;;
+
+; Lists are linked-list data structures, while Vectors are array-backed.
+; Vectors and Lists are java classes too!
+(class [1 2 3]); => clojure.lang.PersistentVector
+(class '(1 2 3)); => clojure.lang.PersistentList
+
+; A list would be written as just (1 2 3), but we have to quote
+; it to stop the reader thinking it's a function.
+; Also, (list 1 2 3) is the same as '(1 2 3)
+
+; "Collections" are just groups of data
+; Both lists and vectors are collections:
+(coll? '(1 2 3)) ; => true
+(coll? [1 2 3]) ; => true
+
+; "Sequences" (seqs) are abstract descriptions of lists of data.
+; Only lists are seqs.
+(seq? '(1 2 3)) ; => true
+(seq? [1 2 3]) ; => false
+
+; A seq need only provide an entry when it is accessed.
+; So, seqs which can be lazy -- they can define infinite series:
+(range 4) ; => (0 1 2 3)
+(range) ; => (0 1 2 3 4 ...) (an infinite series)
+(take 4 (range)) ;  (0 1 2 3)
+
+; Use cons to add an item to the beginning of a list or vector
+(cons 4 [1 2 3]) ; => (4 1 2 3)
+(cons 4 '(1 2 3)) ; => (4 1 2 3)
+
+; Conj will add an item to a collection in the most efficient way.
+; For lists, they insert at the beginning. For vectors, they insert at the end.
+(conj [1 2 3] 4) ; => [1 2 3 4]
+(conj '(1 2 3) 4) ; => (4 1 2 3)
+
+; Use concat to add lists or vectors together
+(concat [1 2] '(3 4)) ; => (1 2 3 4)
+
+; Use filter, map to interact with collections
+(map inc [1 2 3]) ; => (2 3 4)
+(filter even? [1 2 3]) ; => (2)
+
+; Use reduce to reduce them
+(reduce + [1 2 3 4])
+; = (+ (+ (+ 1 2) 3) 4)
+; => 10
+
+; Reduce can take an initial-value argument too
+(reduce conj [] '(3 2 1))
+; = (conj (conj (conj [] 3) 2) 1)
+; => [3 2 1]
+
+; Functions
+;;;;;;;;;;;;;;;;;;;;;
+
+; Use fn to create new functions. A function always returns
+; its last statement.
+(fn [] "Hello World") ; => fn
+
+; (You need extra parens to call it)
+((fn [] "Hello World")) ; => "Hello World"
+
+; You can create a var using def
+(def x 1)
+x ; => 1
+
+; Assign a function to a var
+(def hello-world (fn [] "Hello World"))
+(hello-world) ; => "Hello World"
+
+; You can shorten this process by using defn
+(defn hello-world [] "Hello World")
+
+; The [] is the list of arguments for the function.
+(defn hello [name]
+  (str "Hello " name))
+(hello "Steve") ; => "Hello Steve"
+
+; You can also use this shorthand to create functions:
+(def hello2 #(str "Hello " %1))
+(hello2 "Fanny") ; => "Hello Fanny"
+
+; You can have multi-variadic functions, too
+(defn hello3
+  ([] "Hello World")
+  ([name] (str "Hello " name)))
+(hello3 "Jake") ; => "Hello Jake"
+(hello3) ; => "Hello World"
+
+; Functions can pack extra arguments up in a seq for you
+(defn count-args [& args]
+  (str "You passed " (count args) " args: " args))
+(count-args 1 2 3) ; => "You passed 3 args: (1 2 3)"
+
+; You can mix regular and packed arguments
+(defn hello-count [name & args]
+  (str "Hello " name ", you passed " (count args) " extra args"))
+(hello-count "Finn" 1 2 3)
+; => "Hello Finn, you passed 3 extra args"
+
+
+; Maps
+;;;;;;;;;;
+
+; Hash maps and array maps share an interface. Hash maps have faster lookups
+; but don't retain key order.
+(class {:a 1 :b 2 :c 3}) ; => clojure.lang.PersistentArrayMap
+(class (hash-map :a 1 :b 2 :c 3)) ; => clojure.lang.PersistentHashMap
+
+; Arraymaps will automatically become hashmaps through most operations
+; if they get big enough, so you don't need to worry.
+
+; Maps can use any hashable type as a key, but usually keywords are best
+; Keywords are like strings with some efficiency bonuses
+(class :a) ; => clojure.lang.Keyword
+
+(def stringmap {"a" 1, "b" 2, "c" 3})
+stringmap  ; => {"a" 1, "b" 2, "c" 3}
+
+(def keymap {:a 1, :b 2, :c 3})
+keymap ; => {:a 1, :c 3, :b 2}
+
+; By the way, commas are always treated as whitespace and do nothing.
+
+; Retrieve a value from a map by calling it as a function
+(stringmap "a") ; => 1
+(keymap :a) ; => 1
+
+; Keywords can be used to retrieve their value from a map, too!
+(:b keymap) ; => 2
+
+; Don't try this with strings.
+;("a" stringmap)
+; => Exception: java.lang.String cannot be cast to clojure.lang.IFn
+
+; Retrieving a non-present key returns nil
+(stringmap "d") ; => nil
+
+; Use assoc to add new keys to hash-maps
+(def newkeymap (assoc keymap :d 4))
+newkeymap ; => {:a 1, :b 2, :c 3, :d 4}
+
+; But remember, clojure types are immutable!
+keymap ; => {:a 1, :b 2, :c 3}
+
+; Use dissoc to remove keys
+(dissoc keymap :a :b) ; => {:c 3}
+
+; Sets
+;;;;;;
+
+(class #{1 2 3}) ; => clojure.lang.PersistentHashSet
+(set [1 2 3 1 2 3 3 2 1 3 2 1]) ; => #{1 2 3}
+
+; Add a member with conj
+(conj #{1 2 3} 4) ; => #{1 2 3 4}
+
+; Remove one with disj
+(disj #{1 2 3} 1) ; => #{2 3}
+
+; Test for existence by using the set as a function:
+(#{1 2 3} 1) ; => 1
+(#{1 2 3} 4) ; => nil
+
+; There are more functions in the clojure.sets namespace.
+
+; Useful forms
+;;;;;;;;;;;;;;;;;
+
+; Logic constructs in clojure are just macros, and look like
+; everything else
+(if false "a" "b") ; => "b"
+(if false "a") ; => nil
+
+; Use let to create temporary bindings
+(let [a 1 b 2]
+  (> a b)) ; => false
+
+; Group statements together with do
+(do
+  (print "Hello")
+  "World") ; => "World" (prints "Hello")
+
+; Functions have an implicit do
+(defn print-and-say-hello [name]
+  (print "Saying hello to " name)
+  (str "Hello " name))
+(print-and-say-hello "Jeff") ;=> "Hello Jeff" (prints "Saying hello to Jeff")
+
+; So does let
+(let [name "Urkel"]
+  (print "Saying hello to " name)
+  (str "Hello " name)) ; => "Hello Urkel" (prints "Saying hello to Urkel")
+
+
+; Use the threading macros (-> and ->>) to express transformations of
+; data more clearly.
+
+; The "Thread-first" macro (->) inserts into each form the result of
+; the previous, as the first argument (second item)
+(->  
+   {:a 1 :b 2} 
+   (assoc :c 3) ;=> (assoc {:a 1 :b 2} :c 3)
+   (dissoc :b)) ;=> (dissoc (assoc {:a 1 :b 2} :c 3) :b)
+
+; This expression could be written as:
+; (dissoc (assoc {:a 1 :b 2} :c 3) :b)
+; and evaluates to {:a 1 :c 3}
+
+; The double arrow does the same thing, but inserts the result of
+; each line at the *end* of the form. This is useful for collection
+; operations in particular:
+(->>
+   (range 10)
+   (map inc)     ;=> (map inc (range 10)
+   (filter odd?) ;=> (filter odd? (map inc (range 10))
+   (into []))    ;=> (into [] (filter odd? (map inc (range 10)))
+                 ; Result: [1 3 5 7 9]
+
+; When you are in a situation where you want more freedom as where to
+; put the result of previous data transformations in an 
+; expression, you can use the as-> macro. With it, you can assign a
+; specific name to transformations' output and use it as a
+; placeholder in your chained expressions:
+
+(as-> [1 2 3] input
+  (map inc input);=> You can use last transform's output at the last position
+  (nth input 2) ;=>  and at the second position, in the same expression
+  (conj [4 5 6] input [8 9 10])) ;=> or in the middle !
+
+
+
+; Modules
+;;;;;;;;;;;;;;;
+
+; Use "use" to get all functions from the module
+(use 'clojure.set)
+
+; Now we can use set operations
+(intersection #{1 2 3} #{2 3 4}) ; => #{2 3}
+(difference #{1 2 3} #{2 3 4}) ; => #{1}
+
+; You can choose a subset of functions to import, too
+(use '[clojure.set :only [intersection]])
+
+; Use require to import a module
+(require 'clojure.string)
+
+; Use / to call functions from a module
+; Here, the module is clojure.string and the function is blank?
+(clojure.string/blank? "") ; => true
+
+; You can give a module a shorter name on import
+(require '[clojure.string :as str])
+(str/replace "This is a test." #"[a-o]" str/upper-case) ; => "THIs Is A tEst."
+; (#"" denotes a regular expression literal)
+
+; You can use require (and use, but don't) from a namespace using :require.
+; You don't need to quote your modules if you do it this way.
+(ns test
+  (:require
+    [clojure.string :as str]
+    [clojure.set :as set]))
+
+; Java
+;;;;;;;;;;;;;;;;;
+
+; Java has a huge and useful standard library, so
+; you'll want to learn how to get at it.
+
+; Use import to load a java module
+(import java.util.Date)
+
+; You can import from an ns too.
+(ns test
+  (:import java.util.Date
+           java.util.Calendar))
+
+; Use the class name with a "." at the end to make a new instance
+(Date.) ; 
+
+; Use . to call methods. Or, use the ".method" shortcut
+(. (Date.) getTime) ; 
+(.getTime (Date.)) ; exactly the same thing.
+
+; Use / to call static methods
+(System/currentTimeMillis) ;  (system is always present)
+
+; Use doto to make dealing with (mutable) classes more tolerable
+(import java.util.Calendar)
+(doto (Calendar/getInstance)
+  (.set 2000 1 1 0 0 0)
+  .getTime) ; => A Date. set to 2000-01-01 00:00:00
+
+; STM
+;;;;;;;;;;;;;;;;;
+
+; Software Transactional Memory is the mechanism clojure uses to handle
+; persistent state. There are a few constructs in clojure that use this.
+
+; An atom is the simplest. Pass it an initial value
+(def my-atom (atom {}))
+
+; Update an atom with swap!.
+; swap! takes a function and calls it with the current value of the atom
+; as the first argument, and any trailing arguments as the second
+(swap! my-atom assoc :a 1) ; Sets my-atom to the result of (assoc {} :a 1)
+(swap! my-atom assoc :b 2) ; Sets my-atom to the result of (assoc {:a 1} :b 2)
+
+; Use '@' to dereference the atom and get the value
+my-atom  ;=> Atom<#...> (Returns the Atom object)
+@my-atom ; => {:a 1 :b 2}
+
+; Here's a simple counter using an atom
+(def counter (atom 0))
+(defn inc-counter []
+  (swap! counter inc))
+
+(inc-counter)
+(inc-counter)
+(inc-counter)
+(inc-counter)
+(inc-counter)
+
+@counter ; => 5
+
+; Other STM constructs are refs and agents.
+; Refs: http://clojure.org/refs
+; Agents: http://clojure.org/agents
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-coffeescript.html b/docs/_style/prism-master/examples/prism-coffeescript.html new file mode 100644 index 0000000..a710aa9 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-coffeescript.html @@ -0,0 +1,61 @@ +

Comments

+
# This is a comment
+### This is a
+multi-line comment###
+ +

Strings

+
'foo \'bar\' baz'
+"foo \"bar\" baz"
+'Multi-line
+strings are supported'
+"Multi-line
+strings are supported"
+''' 'Block strings'
+are supported too'''
+""" "Block strings"
+are supported too"""
+ +

String interpolation

+
"String #{interpolation} is supported"
+'This works #{only} between double-quoted strings'
+ +

Object properties

+
kids =
+  brother:
+    name: "Max"
+    age:  11
+  sister:
+    name: "Ida"
+    age:  9
+ +

Regexps

+
/normal [r]egexp?/;
+/// ^(
+  mul\t[i-l]ine
+  regexp          # with embedded comment
+) ///
+ +

Classes

+
class Animal
+  constructor: (@name) ->
+  move: (meters) ->
+    alert @name + " moved #{meters}m."
+
+class Snake extends Animal
+  move: ->
+    alert "Slithering..."
+    super 5
+
+class Horse extends Animal
+  move: ->
+    alert "Galloping..."
+    super 45
+
+sam = new Snake "Sammy the Python"
+tom = new Horse "Tommy the Palomino"
+
+sam.move()
+tom.move()
+ +

Inline JavaScript

+
`alert("foo")`
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-cpp.html b/docs/_style/prism-master/examples/prism-cpp.html new file mode 100644 index 0000000..32bdcbd --- /dev/null +++ b/docs/_style/prism-master/examples/prism-cpp.html @@ -0,0 +1,61 @@ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+"Multi-line strings ending with a \
+are supported too."
+ +

Macro statements

+
# include <stdio.h>
+#define PG_locked   0
+#define PG_error    1
+
+ +

Booleans

+
true;
+false;
+ +

Operators

+
a and b;
+c bitand d;
+ +

Full example

+
/*
+David Cary 2010-09-14
+quick demo for wikibooks
+public domain
+*/
+#include <iostream>
+#include <vector>
+using namespace std;
+
+vector<int> pick_vector_with_biggest_fifth_element(
+    vector<int> left,
+    vector<int> right
+){
+    if( (left[5]) < (right[5]) ){
+        return( right );
+    };
+    // else
+    return( left );
+}
+
+int vector_demo(void){
+    cout << "vector demo" << endl;
+    vector<int> left(7);
+    vector<int> right(7);
+
+    left[5] = 7;
+    right[5] = 8;
+    cout << left[5] << endl;
+    cout << right[5] << endl;
+    vector<int> biggest(
+        pick_vector_with_biggest_fifth_element( left, right )
+    );
+    cout << biggest[5] << endl;
+
+    return 0;
+}
+
+int main(void){
+    vector_demo();
+}
diff --git a/docs/_style/prism-master/examples/prism-crystal.html b/docs/_style/prism-master/examples/prism-crystal.html new file mode 100644 index 0000000..c3cad16 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-crystal.html @@ -0,0 +1,16 @@ +

Number literals with underscores and postfix

+
1_u32
+123_456.789e-10_f64
+ +

Attributes

+
@[AlwaysInline]
+def foo
+	1
+end
+ +

Macro expansions

+
{% for key, value in {foo: 100, bar: 20} %}
+	def {{ key.id }}
+		{{ value }}
+	end
+{% end %}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-csharp.html b/docs/_style/prism-master/examples/prism-csharp.html new file mode 100644 index 0000000..c6d76c2 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-csharp.html @@ -0,0 +1,60 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+@"Verbatim strings"
+@"Luis: ""Patrick, where did you get that overnight bag?""
+    Patrick: ""Jean Paul Gaultier.""";
+@'Luis: ''Patrick, where did you get that overnight bag?''
+    Patrick: ''Jean Paul Gaultier.''';
+
+ +

Full example

+
using System.Windows.Forms;
+using System.Drawing;
+
+public static DialogResult InputBox(string title, string promptText, ref string value)
+{
+  Form form = new Form();
+  Label label = new Label();
+  TextBox textBox = new TextBox();
+  Button buttonOk = new Button();
+  Button buttonCancel = new Button();
+
+  form.Text = title;
+  label.Text = promptText;
+  textBox.Text = value;
+
+  buttonOk.Text = "OK";
+  buttonCancel.Text = "Cancel";
+  buttonOk.DialogResult = DialogResult.OK;
+  buttonCancel.DialogResult = DialogResult.Cancel;
+
+  label.SetBounds(9, 20, 372, 13);
+  textBox.SetBounds(12, 36, 372, 20);
+  buttonOk.SetBounds(228, 72, 75, 23);
+  buttonCancel.SetBounds(309, 72, 75, 23);
+
+  label.AutoSize = true;
+  textBox.Anchor = textBox.Anchor | AnchorStyles.Right;
+  buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
+  buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
+
+  form.ClientSize = new Size(396, 107);
+  form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });
+  form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height);
+  form.FormBorderStyle = FormBorderStyle.FixedDialog;
+  form.StartPosition = FormStartPosition.CenterScreen;
+  form.MinimizeBox = false;
+  form.MaximizeBox = false;
+  form.AcceptButton = buttonOk;
+  form.CancelButton = buttonCancel;
+
+  DialogResult dialogResult = form.ShowDialog();
+  value = textBox.Text;
+  return dialogResult;
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-csp.html b/docs/_style/prism-master/examples/prism-csp.html new file mode 100644 index 0000000..e10a416 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-csp.html @@ -0,0 +1,13 @@ +

A complete policy

+
default-src 'none';
+script-src my.cdn.com;
+img-src 'self' data:;
+child-src 'self' data: ms-appx-web:;
+block-all-mixed-content;
+report-uri https://my-reports.com/submit;
+
+ +

An policy with unsafe source expressions

+
script-src 'self' 'unsafe-eval' 'unsafe-inline';
+style-src 'unsafe-inline' 'unsafe-hashed-attributes' 'self';
+
diff --git a/docs/_style/prism-master/examples/prism-css.html b/docs/_style/prism-master/examples/prism-css.html new file mode 100644 index 0000000..a36f196 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-css.html @@ -0,0 +1,34 @@ +

Empty rule

+
*{} * {} p {}
+
ul,
+ol {}
+ +

Simple rule

+
p { color: red; }
+ +

Important rule

+

+p {
+    color: red !important;
+    line-height: normal!important;
+}
+p{position:absolute!important}
+
+ +

@ rule

+
@media screen and (min-width: 100px) {}
+ +

LESS variable

+
@main-color: red;
+.foo {
+	background: @main-color;
+}
+ +

Comment

+
/* Simple comment here */
+ +

String

+
content: 'foo';
+ +

URL

+
content: url(foo.png);
diff --git a/docs/_style/prism-master/examples/prism-d.html b/docs/_style/prism-master/examples/prism-d.html new file mode 100644 index 0000000..d4bf34c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-d.html @@ -0,0 +1,267 @@ +

Comments

+
// Single line comment
+/* Multi-line
+	comment */
+/+ Mutli-line
+	/+ nestable +/
+	comment +/
+ +

Numbers

+
0 .. 2_147_483_647
+2_147_483_648 .. 9_223_372_036_854_775_807
+0L .. 9_223_372_036_854_775_807L
+0U .. 4_294_967_296U
+4_294_967_296U .. 18_446_744_073_709_551_615U
+0UL .. 18_446_744_073_709_551_615UL
+0x0 .. 0x7FFF_FFFF
+0x8000_0000 .. 0xFFFF_FFFF
+0x1_0000_0000 .. 0x7FFF_FFFF_FFFF_FFFF
+0x8000_0000_0000_0000 .. 0xFFFF_FFFF_FFFF_FFFF
+0x0L .. 0x7FFF_FFFF_FFFF_FFFFL
+0x8000_0000_0000_0000L .. 0xFFFF_FFFF_FFFF_FFFFL
+0x0U .. 0xFFFF_FFFFU
+0x1_0000_0000U .. 0xFFFF_FFFF_FFFF_FFFFU
+0x0UL .. 0xFFFF_FFFF_FFFF_FFFFUL
+
+123_456.567_8          // 123456.5678
+1_2_3_4_5_6_.5_6_7_8   // 123456.5678
+1_2_3_4_5_6_.5e-6_     // 123456.5e-6
+0x1.FFFFFFFFFFFFFp1023 // double.max
+0x1p-52                // double.epsilon
+1.175494351e-38F       // float.min
+6.3i                   // idouble 6.3
+6.3fi                  // ifloat 6.3
+6.3Li                  // ireal 6.3
+4.5 + 6.2i             // complex number (phased out)
+ +

Strings

+
// WYSIWYG strings
+r"hello"
+r"c:\root\foo.exe"
+r"ab\n"
+`hello`
+`c:\root\foo.exe`
+`ab\n`
+
+// Double-quoted strings
+"hello"
+"c:\\root\\foo.exe"
+"ab\n"
+"ab
+"
+
+// Hex strings
+x"0A"
+x"00 FBCD 32FD 0A"
+
+// String postfix characters
+"hello"c  // string
+"hello"w  // wstring
+"hello"d  // dstring
+
+// Delimited strings
+q"(foo(xxx))"
+q"[foo{]"
+q"EOS
+This
+is a multi-line
+heredoc string
+EOS"
+q"/foo]/"
+
+// Token strings
+q{foo}
+q{/*}*/ }
+q{ foo(q{hello}); }
+q{ __TIME__ }
+
+// Character literals
+'a'
+'\u000A'
+ +

Iasm registers

+
AL AH AX EAX
+BL BH BX EBX
+CL CH CX ECX
+DL DH DX EDX
+BP EBP
+SP ESP
+DI EDI
+SI ESI
+ES CS SS DS GS FS
+CR0 CR2 CR3 CR4
+DR0 DR1 DR2 DR3 DR6 DR7
+TR3 TR4 TR5 TR6 TR7
+ST
+ST(0) ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
+MM0  MM1  MM2  MM3  MM4  MM5  MM6  MM7
+XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7
+
+RAX  RBX  RCX  RDX
+BPL  RBP
+SPL  RSP
+DIL  RDI
+SIL  RSI
+R8B  R8W  R8D  R8
+R9B  R9W  R9D  R9
+R10B R10W R10D R10
+R11B R11W R11D R11
+R12B R12W R12D R12
+R13B R13W R13D R13
+R14B R14W R14D R14
+R15B R15W R15D R15
+XMM8 XMM9 XMM10 XMM11 XMM12 XMM13 XMM14 XMM15
+YMM0 YMM1 YMM2  YMM3  YMM4  YMM5  YMM6  YMM7
+YMM8 YMM9 YMM10 YMM11 YMM12 YMM13 YMM14 YMM15
+ +

Full example

+
#!/usr/bin/dmd -run
+/* sh style script syntax is supported! */
+/* Hello World in D
+   To compile:
+     dmd hello.d
+   or to optimize:
+     dmd -O -inline -release hello.d
+   or to get generated documentation:
+     dmd hello.d -D
+  */
+import std.stdio;  // References to  commonly used I/O routines.
+void main(char[][] args)   // 'void' here means return 0 by default.
+{
+    // Write-Formatted-Line
+     writefln("Hello World, "   // automatic concatenation of string literals
+              "Reloaded");
+     // Strings are denoted as a dynamic array of chars 'char[]'
+     // auto type inference and built-in foreach
+     foreach(argc, argv; args)
+    {
+        // OOP is supported, of course! And automatic type inference.
+         auto cl = new CmdLin(argc, argv);
+
+        // 'writefln' is the improved 'printf' !!
+         // user-defined class properties.
+         writefln(cl.argnum, cl.suffix, " arg: %s", cl.argv);
+        // Garbage Collection or explicit memory management - your choice!!!
+         delete cl;
+    }
+     // Nested structs, classes and functions!
+     struct specs
+    {
+        // all vars. automatically initialized
+         int count, allocated;
+    }
+
+    // Note that declarations read right-to-left.
+    // So that 'char[][]' reads as an array of an array of chars.
+
+    specs argspecs(char[][] args)
+    // Optional (built-in) function contracts.
+     in{
+        assert (args.length > 0); // assert built in
+     }
+    out(result){
+        assert(result.count == CmdLin.total);
+        assert(result.allocated > 0);
+    }
+    body{
+        specs* s = new specs;
+        // no need for '->'
+         s.count = args.length;  // The 'length' property is number of elements.
+         s.allocated = typeof(args).sizeof; // built-in properties for native types
+         foreach(argv; args)
+            s.allocated += argv.length * typeof(argv[0]).sizeof;
+        return *s;
+    }
+
+    // built-in string and common string operations, e.g. '~' is concatenate.
+     char[] argcmsg  = "argc = %d";
+    char[] allocmsg = "allocated = %d";
+    writefln(argcmsg ~ ", " ~ allocmsg,
+         argspecs(args).count,argspecs(args).allocated);
+}
+/**
+   Stores a single command line argument.
+ */
+ class CmdLin
+{
+    private {
+     int _argc;
+     char[] _argv;
+     static uint _totalc;
+    }
+
+ public:
+/************
+      Object constructor.
+      params:
+        argc = ordinal count of this argument.
+        argv = text of the parameter
+  *********/
+     this(int argc, char[] argv)
+    {
+        _argc = argc + 1;
+        _argv = argv;
+        _totalc++;
+    }
+
+    ~this() /// Object destructor
+     {
+        // Doesn't actually do anything for this example.
+     }
+
+     int argnum() /// A property that returns arg number
+     {
+        return _argc;
+    }
+     char[] argv() /// A property  that returns arg text
+     {
+        return _argv;
+    }
+     wchar[] suffix() /// A property  that returns ordinal suffix
+     {
+        wchar[] suffix;  // Built in  Unicode strings (utf8,utf16, utf32)
+         switch(_argc)
+        {
+        case 1:
+            suffix = "st";
+            break;
+        case 2:
+            suffix = "nd";
+            break;
+        case 3:
+            suffix = "rd";
+            break;
+        default:  // 'default' is mandatory with "-w" compile switch.
+             suffix = "th";
+        }
+        return suffix;
+    }
+
+/* **************
+      * A property of the whole class, not just an instance.
+      * returns: The total number of commandline args added.
+      *************/
+     static typeof(_totalc) total()
+    {
+        return _totalc;
+    }
+     // Class invariant, things that must be true after any method is run.
+     invariant
+     {
+         assert(_argc > 0);
+         assert(_totalc >= _argc);
+     }
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Comments only support one level of nesting

+
/+ /+ /+ this does not work +/ +/ +/
+ +

Token strings only support one level of nesting

+
q{ q{ q{ this does not work } } }
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-dart.html b/docs/_style/prism-master/examples/prism-dart.html new file mode 100644 index 0000000..e38d85e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-dart.html @@ -0,0 +1,59 @@ +

Comments

+
// Single line comment
+/// Documentation single line comment
+/* Block comment
+on several lines */
+/** Multi-line
+doc comment */
+ +

Annotations

+
@todo('seth', 'make this do something')
+@deprecated // Metadata; makes Dart Editor warn about using activate().
+ +

Numbers

+
var x = 1;
+var hex = 0xDEADBEEF;
+var bigInt = 346534658346524376592384765923749587398457294759347029438709349347;
+var y = 1.1;
+var exponents = 1.42e5;
+
+ +

Strings

+
var s1 = 'Single quotes work well for string literals.';
+var s2 = "Double quotes work just as well.";
+var s3 = 'It\'s easy to escape the string delimiter.';
+var s4 = "It's even easier to just use the other string delimiter.";
+var s1 = '''
+You can create
+multi-line strings like this one.
+''';
+var s2 = """This is also a
+multi-line string.""";
+var s = r"In a raw string, even \n isn't special.";
+ +

Full example

+
class Logger {
+  final String name;
+  bool mute = false;
+
+  // _cache is library-private, thanks to the _ in front of its name.
+  static final Map<String, Logger> _cache = <String, Logger>{};
+
+  factory Logger(String name) {
+    if (_cache.containsKey(name)) {
+      return _cache[name];
+    } else {
+      final logger = new Logger._internal(name);
+      _cache[name] = logger;
+      return logger;
+    }
+  }
+
+  Logger._internal(this.name);
+
+  void log(String msg) {
+    if (!mute) {
+      print(msg);
+    }
+  }
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-diff.html b/docs/_style/prism-master/examples/prism-diff.html new file mode 100644 index 0000000..b9229a1 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-diff.html @@ -0,0 +1,33 @@ +

Normal Diff

+
7c7
+< qt: core
+---
+> qt: core quick
+ +

Context Diff

+
*** qcli.yml	2014-12-16 11:43:41.000000000 +0800
+--- /Users/uranusjr/Desktop/qcli.yml	2014-12-31 11:28:08.000000000 +0800
+***************
+*** 4,8 ****
+  project:
+      sources: "src/*.cpp"
+      headers: "src/*.h"
+!     qt: core
+  public_headers: "src/*.h"
+--- 4,8 ----
+  project:
+      sources: "src/*.cpp"
+      headers: "src/*.h"
+!     qt: core gui
+  public_headers: "src/*.h"
+ +

Unified Diff

+
--- qcli.yml	2014-12-16 11:43:41.000000000 +0800
++++ /Users/uranusjr/Desktop/qcli.yml	2014-12-31 11:28:08.000000000 +0800
+@@ -4,5 +4,5 @@
+ project:
+     sources: "src/*.cpp"
+     headers: "src/*.h"
+-    qt: core
++    qt: core gui
+ public_headers: "src/*.h"
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-django.html b/docs/_style/prism-master/examples/prism-django.html new file mode 100644 index 0000000..ac9cf0d --- /dev/null +++ b/docs/_style/prism-master/examples/prism-django.html @@ -0,0 +1,31 @@ +

Comment

+
{# This is a comment #}
+ +

Variable

+
{{ some_variable }}
+ +

Template Tag

+
{% if some_condition %}
+Conditional block
+{% endif %}
+
+ +

Full Example

+
{# This a Django template example #}
+{% extends "base_generic.html" %}
+
+{% block title %}{{ section.title }}{% endblock %}
+
+{% block content %}
+<h1>{{ section.title }}</h1>
+
+{% for story in story_list %}
+<h2>
+  <a href="{{ story.get_absolute_url }}">
+    {{ story.headline|upper }}
+  </a>
+</h2>
+<p>{{ story.tease|truncatewords:"100" }}</p>
+{% endfor %}
+{% endblock %}
+
diff --git a/docs/_style/prism-master/examples/prism-docker.html b/docs/_style/prism-master/examples/prism-docker.html new file mode 100644 index 0000000..86511b3 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-docker.html @@ -0,0 +1,49 @@ +

Comments

+
# These are the comments for a dockerfile.
+# I want to make sure $(variables) don't break out,
+# and we shouldn't see keywords like ADD or ENTRYPOINT
+
+ +

Full example

+
# Nginx
+#
+# VERSION               0.0.1
+
+FROM      ubuntu
+MAINTAINER Victor Vieux 
+
+LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0"
+RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
+
+# Firefox over VNC
+#
+# VERSION               0.3
+
+FROM ubuntu
+
+# Install vnc, xvfb in order to create a 'fake' display and firefox
+RUN apt-get update && apt-get install -y x11vnc xvfb firefox
+RUN mkdir ~/.vnc
+# Setup a password
+RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
+# Autostart firefox (might not be the best way, but it does the trick)
+RUN bash -c 'echo "firefox" >> /.bashrc'
+
+EXPOSE 5900
+CMD    ["x11vnc", "-forever", "-usepw", "-create"]
+
+# Multiple images example
+#
+# VERSION               0.1
+
+FROM ubuntu
+RUN echo foo > bar
+# Will output something like ===> 907ad6c2736f
+
+FROM ubuntu
+RUN echo moo > oink
+# Will output something like ===> 695d7793cbe4
+
+# You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
+# /oink.
+
diff --git a/docs/_style/prism-master/examples/prism-eiffel.html b/docs/_style/prism-master/examples/prism-eiffel.html new file mode 100644 index 0000000..94c18b2 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-eiffel.html @@ -0,0 +1,72 @@ +

Comments

+
-- A comment
+
+ +

Simple string and character

+
"A simple string with %"double quotes%""
+'a'
+
+ +

Verbatim-strings

+
"[
+  A aligned verbatim string
+]"
+"{
+  A non-aligned verbatim string
+}"
+
+ +

Numbers

+
1_000
+1_000.
+1_000.e+1_000
+1_000.1_000e-1_000
+.1
+0b1010_0001
+0xAF_5B
+0c75_22
+
+ +

Class names

+
deferred class
+    A [G]
+
+feature
+    items: G
+        deferred  end
+
+end
+
+ +

Full example

+
note
+  description: "Represents a person."
+
+class
+  PERSON
+
+create
+  make, make_unknown
+
+feature {NONE} -- Creation
+
+  make (a_name: like name)
+      -- Create a person with `a_name' as `name'.
+    do
+      name := a_name
+    ensure
+      name = a_name
+    end
+
+    make_unknown
+    do ensure
+      name = Void
+      end
+
+feature -- Access
+
+  name: detachable STRING
+      -- Full name or Void if unknown.
+
+end
+
diff --git a/docs/_style/prism-master/examples/prism-elixir.html b/docs/_style/prism-master/examples/prism-elixir.html new file mode 100644 index 0000000..7112fbc --- /dev/null +++ b/docs/_style/prism-master/examples/prism-elixir.html @@ -0,0 +1,462 @@ +

Comments

+
# This is a comment
+ +

Atoms

+
:foo
+:bar
+ +

Numbers

+
42
+0b1010
+0o777
+0x1F
+3.14159
+5.2e10
+100_000
+ +

Strings and heredoc

+
'A string with \'quotes\'!'
+"A string with \"quotes\"!"
+"Multi-line
+strings are supported"
+""" "Heredoc" strings are
+also supported.
+"""
+ +

Sigils

+
~s"""This is a sigil
+using heredoc delimiters"""
+~r/a [reg]exp/
+~r(another|regexp)
+~w[some words]s
+~c<a char list>
+ +

Interpolation

+
"This is an #{:atom}"
+~s/#{40+2} is the answer/
+ +

Function capturing

+
fun = &Math.zero?/1
+(&is_function/1).(fun)
+fun = &(&1 + 1)
+fun.(1)
+fun = &List.flatten(&1, &2)
+fun.([1, [[2], 3]], [4, 5])
+ +

Module attributes

+
defmodule MyServer do
+  @vsn 2
+end
+
+defmodule Math do
+  @moduledoc """
+  Provides math-related functions.
+
+      iex> Math.sum(1, 2)
+      3
+
+  """
+
+  @doc """
+  Calculates the sum of two numbers.
+  """
+  def sum(a, b), do: a + b
+end
+ +

Full example

+
# Example from http://learnxinyminutes.com/docs/elixir/
+
+# Single line comments start with a number symbol.
+
+# There's no multi-line comment,
+# but you can stack multiple comments.
+
+# To use the elixir shell use the `iex` command.
+# Compile your modules with the `elixirc` command.
+
+# Both should be in your path if you installed elixir correctly.
+
+## ---------------------------
+## -- Basic types
+## ---------------------------
+
+# There are numbers
+3    # integer
+0x1F # integer
+3.0  # float
+
+# Atoms, that are literals, a constant with name. They start with `:`.
+:hello # atom
+
+# Tuples that are stored contiguously in memory.
+{1,2,3} # tuple
+
+# We can access a tuple element with the `elem` function:
+elem({1, 2, 3}, 0) #=> 1
+
+# Lists that are implemented as linked lists.
+[1,2,3] # list
+
+# We can access the head and tail of a list as follows:
+[head | tail] = [1,2,3]
+head #=> 1
+tail #=> [2,3]
+
+# In elixir, just like in Erlang, the `=` denotes pattern matching and
+# not an assignment.
+#
+# This means that the left-hand side (pattern) is matched against a
+# right-hand side.
+#
+# This is how the above example of accessing the head and tail of a list works.
+
+# A pattern match will error when the sides don't match, in this example
+# the tuples have different sizes.
+# {a, b, c} = {1, 2} #=> ** (MatchError) no match of right hand side value: {1,2}
+
+# There are also binaries
+<<1,2,3>> # binary
+
+# Strings and char lists
+"hello" # string
+'hello' # char list
+
+# Multi-line strings
+"""
+I'm a multi-line
+string.
+"""
+#=> "I'm a multi-line\nstring.\n"
+
+# Strings are all encoded in UTF-8:
+"héllò" #=> "héllò"
+
+# Strings are really just binaries, and char lists are just lists.
+<<?a, ?b, ?c>> #=> "abc"
+[?a, ?b, ?c]   #=> 'abc'
+
+# `?a` in elixir returns the ASCII integer for the letter `a`
+?a #=> 97
+
+# To concatenate lists use `++`, for binaries use `<>`
+[1,2,3] ++ [4,5]     #=> [1,2,3,4,5]
+'hello ' ++ 'world'  #=> 'hello world'
+
+<<1,2,3>> <> <<4,5>> #=> <<1,2,3,4,5>>
+"hello " <> "world"  #=> "hello world"
+
+# Ranges are represented as `start..end` (both inclusive)
+1..10 #=> 1..10
+lower..upper = 1..10 # Can use pattern matching on ranges as well
+[lower, upper] #=> [1, 10]
+
+## ---------------------------
+## -- Operators
+## ---------------------------
+
+# Some math
+1 + 1  #=> 2
+10 - 5 #=> 5
+5 * 2  #=> 10
+10 / 2 #=> 5.0
+
+# In elixir the operator `/` always returns a float.
+
+# To do integer division use `div`
+div(10, 2) #=> 5
+
+# To get the division remainder use `rem`
+rem(10, 3) #=> 1
+
+# There are also boolean operators: `or`, `and` and `not`.
+# These operators expect a boolean as their first argument.
+true and true #=> true
+false or true #=> true
+# 1 and true    #=> ** (ArgumentError) argument error
+
+# Elixir also provides `||`, `&&` and `!` which accept arguments of any type.
+# All values except `false` and `nil` will evaluate to true.
+1 || true  #=> 1
+false && 1 #=> false
+nil && 20  #=> nil
+!true #=> false
+
+# For comparisons we have: `==`, `!=`, `===`, `!==`, `<=`, `>=`, `<` and `>`
+1 == 1 #=> true
+1 != 1 #=> false
+1 < 2  #=> true
+
+# `===` and `!==` are more strict when comparing integers and floats:
+1 == 1.0  #=> true
+1 === 1.0 #=> false
+
+# We can also compare two different data types:
+1 < :hello #=> true
+
+# The overall sorting order is defined below:
+# number < atom < reference < functions < port < pid < tuple < list < bit string
+
+# To quote Joe Armstrong on this: "The actual order is not important,
+# but that a total ordering is well defined is important."
+
+## ---------------------------
+## -- Control Flow
+## ---------------------------
+
+# `if` expression
+if false do
+  "This will never be seen"
+else
+  "This will"
+end
+
+# There's also `unless`
+unless true do
+  "This will never be seen"
+else
+  "This will"
+end
+
+# Remember pattern matching? Many control-flow structures in elixir rely on it.
+
+# `case` allows us to compare a value against many patterns:
+case {:one, :two} do
+  {:four, :five} ->
+    "This won't match"
+  {:one, x} ->
+    "This will match and bind `x` to `:two`"
+  _ ->
+    "This will match any value"
+end
+
+# It's common to bind the value to `_` if we don't need it.
+# For example, if only the head of a list matters to us:
+[head | _] = [1,2,3]
+head #=> 1
+
+# For better readability we can do the following:
+[head | _tail] = [:a, :b, :c]
+head #=> :a
+
+# `cond` lets us check for many conditions at the same time.
+# Use `cond` instead of nesting many `if` expressions.
+cond do
+  1 + 1 == 3 ->
+    "I will never be seen"
+  2 * 5 == 12 ->
+    "Me neither"
+  1 + 2 == 3 ->
+    "But I will"
+end
+
+# It is common to set the last condition equal to `true`, which will always match.
+cond do
+  1 + 1 == 3 ->
+    "I will never be seen"
+  2 * 5 == 12 ->
+    "Me neither"
+  true ->
+    "But I will (this is essentially an else)"
+end
+
+# `try/catch` is used to catch values that are thrown, it also supports an
+# `after` clause that is invoked whether or not a value is caught.
+try do
+  throw(:hello)
+catch
+  message -> "Got #{message}."
+after
+  IO.puts("I'm the after clause.")
+end
+#=> I'm the after clause
+# "Got :hello"
+
+## ---------------------------
+## -- Modules and Functions
+## ---------------------------
+
+# Anonymous functions (notice the dot)
+square = fn(x) -> x * x end
+square.(5) #=> 25
+
+# They also accept many clauses and guards.
+# Guards let you fine tune pattern matching,
+# they are indicated by the `when` keyword:
+f = fn
+  x, y when x > 0 -> x + y
+  x, y -> x * y
+end
+
+f.(1, 3)  #=> 4
+f.(-1, 3) #=> -3
+
+# Elixir also provides many built-in functions.
+# These are available in the current scope.
+is_number(10)    #=> true
+is_list("hello") #=> false
+elem({1,2,3}, 0) #=> 1
+
+# You can group several functions into a module. Inside a module use `def`
+# to define your functions.
+defmodule Math do
+  def sum(a, b) do
+    a + b
+  end
+
+  def square(x) do
+    x * x
+  end
+end
+
+Math.sum(1, 2)  #=> 3
+Math.square(3) #=> 9
+
+# To compile our simple Math module save it as `math.ex` and use `elixirc`
+# in your terminal: elixirc math.ex
+
+# Inside a module we can define functions with `def` and private functions with `defp`.
+# A function defined with `def` is available to be invoked from other modules,
+# a private function can only be invoked locally.
+defmodule PrivateMath do
+  def sum(a, b) do
+    do_sum(a, b)
+  end
+
+  defp do_sum(a, b) do
+    a + b
+  end
+end
+
+PrivateMath.sum(1, 2)    #=> 3
+# PrivateMath.do_sum(1, 2) #=> ** (UndefinedFunctionError)
+
+# Function declarations also support guards and multiple clauses:
+defmodule Geometry do
+  def area({:rectangle, w, h}) do
+    w * h
+  end
+
+  def area({:circle, r}) when is_number(r) do
+    3.14 * r * r
+  end
+end
+
+Geometry.area({:rectangle, 2, 3}) #=> 6
+Geometry.area({:circle, 3})       #=> 28.25999999999999801048
+# Geometry.area({:circle, "not_a_number"})
+#=> ** (FunctionClauseError) no function clause matching in Geometry.area/1
+
+# Due to immutability, recursion is a big part of elixir
+defmodule Recursion do
+  def sum_list([head | tail], acc) do
+    sum_list(tail, acc + head)
+  end
+
+  def sum_list([], acc) do
+    acc
+  end
+end
+
+Recursion.sum_list([1,2,3], 0) #=> 6
+
+# Elixir modules support attributes, there are built-in attributes and you
+# may also add custom ones.
+defmodule MyMod do
+  @moduledoc """
+  This is a built-in attribute on a example module.
+  """
+
+  @my_data 100 # This is a custom attribute.
+  IO.inspect(@my_data) #=> 100
+end
+
+## ---------------------------
+## -- Structs and Exceptions
+## ---------------------------
+
+# Structs are extensions on top of maps that bring default values,
+# compile-time guarantees and polymorphism into Elixir.
+defmodule Person do
+  defstruct name: nil, age: 0, height: 0
+end
+
+joe_info = %Person{ name: "Joe", age: 30, height: 180 }
+#=> %Person{age: 30, height: 180, name: "Joe"}
+
+# Access the value of name
+joe_info.name #=> "Joe"
+
+# Update the value of age
+older_joe_info = %{ joe_info | age: 31 }
+#=> %Person{age: 31, height: 180, name: "Joe"}
+
+# The `try` block with the `rescue` keyword is used to handle exceptions
+try do
+  raise "some error"
+rescue
+  RuntimeError -> "rescued a runtime error"
+  _error -> "this will rescue any error"
+end
+
+# All exceptions have a message
+try do
+  raise "some error"
+rescue
+  x in [RuntimeError] ->
+    x.message
+end
+
+## ---------------------------
+## -- Concurrency
+## ---------------------------
+
+# Elixir relies on the actor model for concurrency. All we need to write
+# concurrent programs in elixir are three primitives: spawning processes,
+# sending messages and receiving messages.
+
+# To start a new process we use the `spawn` function, which takes a function
+# as argument.
+f = fn -> 2 * 2 end #=> #Function<erl_eval.20.80484245>
+spawn(f) #=> #PID<0.40.0>
+
+# `spawn` returns a pid (process identifier), you can use this pid to send
+# messages to the process. To do message passing we use the `send` operator.
+# For all of this to be useful we need to be able to receive messages. This is
+# achieved with the `receive` mechanism:
+defmodule Geometry do
+  def area_loop do
+    receive do
+      {:rectangle, w, h} ->
+        IO.puts("Area = #{w * h}")
+        area_loop()
+      {:circle, r} ->
+        IO.puts("Area = #{3.14 * r * r}")
+        area_loop()
+    end
+  end
+end
+
+# Compile the module and create a process that evaluates `area_loop` in the shell
+pid = spawn(fn -> Geometry.area_loop() end) #=> #PID<0.40.0>
+
+# Send a message to `pid` that will match a pattern in the receive statement
+send pid, {:rectangle, 2, 3}
+#=> Area = 6
+#   {:rectangle,2,3}
+
+send pid, {:circle, 2}
+#=> Area = 12.56000000000000049738
+#   {:circle,2}
+
+# The shell is also a process, you can use `self` to get the current pid
+self() #=> #PID<0.27.0>
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

String interpolation in single-quoted strings

+
'#{:atom} <- this should not be highligted'
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-elm.html b/docs/_style/prism-master/examples/prism-elm.html new file mode 100644 index 0000000..00d0e33 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-elm.html @@ -0,0 +1,91 @@ +

Comments

+
-- Single line comment
+{- Multi-line
+comment -}
+ +

Strings and characters

+
'a'
+'\n'
+'\x03'
+"foo \" bar"
+"""
+"multiline strings" are also
+supported!
+"""
+ +

Full example

+
module Main exposing (..)
+
+import Html exposing (Html)
+import Svg exposing (..)
+import Svg.Attributes exposing (..)
+import Time exposing (Time, second)
+
+
+main =
+    Html.program
+        { init = init
+        , view = view
+        , update = update
+        , subscriptions = subscriptions
+        }
+
+
+
+-- MODEL
+
+
+type alias Model =
+    Time
+
+
+init : ( Model, Cmd Msg )
+init =
+    ( 0, Cmd.none )
+
+
+
+-- UPDATE
+
+
+type Msg
+    = Tick Time
+
+
+update : Msg -> Model -> ( Model, Cmd Msg )
+update msg model =
+    case msg of
+        Tick newTime ->
+            ( newTime, Cmd.none )
+
+
+
+-- SUBSCRIPTIONS
+
+
+subscriptions : Model -> Sub Msg
+subscriptions model =
+    Time.every second (\time -> Tick time)
+
+
+
+-- VIEW
+
+
+view : Model -> Html Msg
+view model =
+    let
+        angle =
+            turns (Time.inMinutes model)
+
+        handX =
+            toString (50 + 40 * cos angle)
+
+        handY =
+            toString (50 + 40 * sin angle)
+    in
+    svg [ viewBox "0 0 100 100", width "300px" ]
+        [ circle [ cx "50", cy "50", r "45", fill "#0B79CE" ] []
+        , line [ x1 "50", y1 "50", x2 handX, y2 handY, stroke "#023963" ] []
+        ]
+
diff --git a/docs/_style/prism-master/examples/prism-erb.html b/docs/_style/prism-master/examples/prism-erb.html new file mode 100644 index 0000000..46c0143 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-erb.html @@ -0,0 +1,22 @@ +

Full example

+
<%# index.erb %>
+<h1>Listing Books</h1>
+<table>
+  <tr>
+    <th>Title</th>
+    <th>Summary</th>
+    <th></th>
+    <th></th>
+    <th></th>
+  </tr>
+
+<% @books.each do |book| %>
+  <tr>
+    <td><%= book.title %></td>
+    <td><%= book.content %></td>
+    <td><%= link_to "Show", book %></td>
+    <td><%= link_to "Edit", edit_book_path(book) %></td>
+    <td><%= link_to "Remove", book, method: :delete, data: { confirm: "Are you sure?" } %></td>
+  </tr>
+<% end %>
+</table>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-erlang.html b/docs/_style/prism-master/examples/prism-erlang.html new file mode 100644 index 0000000..05445ad --- /dev/null +++ b/docs/_style/prism-master/examples/prism-erlang.html @@ -0,0 +1,47 @@ +

Comments

+
% This is a comment
+%% coding: utf-8
+ +

Strings

+
"foo \"bar\" baz"
+ +

Numbers

+
42.
+$A.
+$\n.
+2#101.
+16#1f.
+2.3.
+2.3e3.
+2.3e-3.
+ +

Functions

+
P = spawn(m, loop, []).
+io:format("I am ~p~n", [self()]).
+'weird function'().
+
+ +

Variables

+
P = {adam,24,{july,29}}.
+M1 = #{name=>adam,age=>24,date=>{july,29}}.
+M2 = maps:update(age,25,M1).
+io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X]).
+ +

Operators

+
1==1.0.
+1=:=1.0.
+1 > a.
++1.
+-1.
+1+1.
+4/2.
+5 div 2.
+5 rem 2.
+2#10 band 2#01.
+2#10 bor 2#01.
+a + 10.
+1 bsl (1 bsl 64).
+not true.
+true and false.
+true xor false.
+true or garbage.
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-flow.html b/docs/_style/prism-master/examples/prism-flow.html new file mode 100644 index 0000000..76f3e14 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-flow.html @@ -0,0 +1,18 @@ +

Primitive types

+
function method(x: number, y: string, z: boolean) {}
+function stringifyBasicValue(value: string | number) {}
+function add(one: any, two: any): number {
+  return one + two;
+}
+
+const bar: number = 2;
+var barVar: number = 2;
+let barLet: number = 2;
+let isOneOf: number | boolean | string = foo;
+ +

Keywords

+
type UnionAlias = 1 | 2 | 3;
+opaque type ID = string;
+declare opaque type PositiveNumber: number;
+type Country = $Keys<typeof countries>;
+type RequiredProps = $Diff<Props, DefaultProps>;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-fortran.html b/docs/_style/prism-master/examples/prism-fortran.html new file mode 100644 index 0000000..00b23f5 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-fortran.html @@ -0,0 +1,71 @@ +

Comments

+
! This is a comment
+ +

Strings

+
"foo 'bar' baz"
+'foo ''bar'' baz'
+''
+ITALICS_'This is in italics'
+"test &
+	! Some "tricky comment" here
+	&test"
+ +

Numbers

+
473
++56
+-101
+21_2
+21_SHORT
+1976354279568241_8
+B'01110'
+B"010"
+O'047'
+O"642"
+Z'F41A'
+Z"00BC"
+-12.78
++1.6E3
+2.1
+-16.E4_8
+0.45E-4
+10.93E7_QUAD
+.123
+3E4
+ +

Full example

+
MODULE MOD1
+TYPE INITIALIZED_TYPE
+	INTEGER :: I = 1 ! Default initialization
+END TYPE INITIALIZED_TYPE
+SAVE :: SAVED1, SAVED2
+INTEGER :: SAVED1, UNSAVED1
+TYPE(INITIALIZED_TYPE) :: SAVED2, UNSAVED2
+ALLOCATABLE :: SAVED1(:), SAVED2(:), UNSAVED1(:), UNSAVED2(:)
+END MODULE MOD1
+
+PROGRAM MAIN
+CALL SUB1 ! The values returned by the ALLOCATED intrinsic calls
+          ! in the PRINT statement are:
+          ! .FALSE., .FALSE., .FALSE., and .FALSE.
+          ! Module MOD1 is used, and its variables are allocated.
+          ! After return from the subroutine, whether the variables
+          ! which were not specified with the SAVE attribute
+          ! retain their allocation status is processor dependent.
+CALL SUB1 ! The values returned by the first two ALLOCATED intrinsic
+	      ! calls in the PRINT statement are:
+	      ! .TRUE., .TRUE.
+	      ! The values returned by the second two ALLOCATED
+	      ! intrinsic calls in the PRINT statement are
+	      ! processor dependent and each could be either
+	      ! .TRUE. or .FALSE.
+CONTAINS
+	SUBROUTINE SUB1
+	USE MOD1 ! Brings in saved and not saved variables.
+	PRINT *, ALLOCATED(SAVED1), ALLOCATED(SAVED2), &
+	         ALLOCATED(UNSAVED1), ALLOCATED(UNSAVED2)
+	IF (.NOT. ALLOCATED(SAVED1)) ALLOCATE(SAVED1(10))
+	IF (.NOT. ALLOCATED(SAVED2)) ALLOCATE(SAVED2(10))
+	IF (.NOT. ALLOCATED(UNSAVED1)) ALLOCATE(UNSAVED1(10))
+	IF (.NOT. ALLOCATED(UNSAVED2)) ALLOCATE(UNSAVED2(10))
+	END SUBROUTINE SUB1
+END PROGRAM MAIN
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-fsharp.html b/docs/_style/prism-master/examples/prism-fsharp.html new file mode 100644 index 0000000..6a4330b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-fsharp.html @@ -0,0 +1,89 @@ +

Comments

+
// Single line comment
+(* Multi-line
+comment *)
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+@"Verbatim strings"
+"""Alternate "verbatim" strings"""
+
+ +

Numbers

+
//8 bit Int
+86y
+0b00000101y
+//Unsigned 8 bit Int
+86uy
+0b00000101uy
+//16 bit Int
+86s
+//Unsigned 16 bit Int
+86us
+//Int
+86
+86l
+0b10000
+0x2A6
+//Unsigned Int
+86u
+86ul
+//unativeint
+0x00002D3Fun
+//Long
+86L
+//Unsigned Long
+86UL
+//Float
+4.14F
+4.14f
+4.f
+4.F
+0x0000000000000000lf
+//Double
+4.14
+2.3E+32
+2.3e+32
+2.3e-32
+2.3e32
+0x0000000000000000LF
+//BigInt
+9999999999999999999999999999I
+//Decimal
+0.7833M
+0.7833m
+3.m
+3.M
+
+ +

Full example

+
// The declaration creates a constructor that takes two values, name and age. 
+type Person(name:string, age:int) =
+    // A Person object's age can be changed. The mutable keyword in the 
+    // declaration makes that possible. 
+    let mutable internalAge = age
+
+    // Declare a second constructor that takes only one argument, a name. 
+    // This constructor calls the constructor that requires two arguments, 
+    // sending 0 as the value for age. 
+    new(name:string) = Person(name, 0)
+
+    // A read-only property. 
+    member this.Name = name
+    // A read/write property. 
+    member this.Age
+        with get() = internalAge
+        and set(value) = internalAge <- value
+
+    // Instance methods. 
+    // Increment the person's age. 
+    member this.HasABirthday () = internalAge <- internalAge + 1
+
+    // Check current age against some threshold. 
+    member this.IsOfAge targetAge = internalAge >= targetAge
+
+    // Display the person's name and age. 
+    override this.ToString () = 
+        "Name:  " + name + "\n" + "Age:   " + (string)internalAge
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-gcode.html b/docs/_style/prism-master/examples/prism-gcode.html new file mode 100644 index 0000000..ebc1561 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-gcode.html @@ -0,0 +1,22 @@ +

Comments

+
; comment
+(some more comments)
+G28 (even in here) X0
+
+ +

Quoted strings

+
"foo""bar"
+ +

Full example

+
M190 S60 ; Heat bed to 60°C
+G21 ; Set units to millimeters
+G28 ; Move to Origin (Homing)
+G29 ; Auto Bed Leveling
+G28 X0 Y0 ; Home X and Y to min endstops
+M107 ; Fan off
+M109 S200 ; Heat hotend to 200°C
+G92 E0 ; Set current extruder position as zero
+G1 F200 E15 ; Extrude 15mm filament with 200mm/min
+G92 E0 ; Set current extruder position as zero
+G1 F500
+
diff --git a/docs/_style/prism-master/examples/prism-gedcom.html b/docs/_style/prism-master/examples/prism-gedcom.html new file mode 100644 index 0000000..3fee6ab --- /dev/null +++ b/docs/_style/prism-master/examples/prism-gedcom.html @@ -0,0 +1,50 @@ +

Full example

+
0 HEAD
+1 CHAR ASCII
+1 SOUR ID_OF_CREATING_FILE
+1 GEDC
+2 VERS 5.5
+2 FORM Lineage-Linked
+1 SUBM @SUBMITTER@
+0 @SUBMITTER@ SUBM
+1 NAME /Submitter/
+1 ADDR Submitters address
+2 CONT address continued here
+0 @FATHER@ INDI
+1 NAME /Father/
+1 SEX M
+1 BIRT
+2 PLAC birth place
+2 DATE 1 JAN 1899
+1 DEAT
+2 PLAC death place
+2 DATE 31 DEC 1990
+1 FAMS @FAMILY@
+0 @MOTHER@ INDI
+1 NAME /Mother/
+1 SEX F
+1 BIRT
+2 PLAC birth place
+2 DATE 1 JAN 1899
+1 DEAT
+2 PLAC death place
+2 DATE 31 DEC 1990
+1 FAMS @FAMILY@
+0 @CHILD@ INDI
+1 NAME /Child/
+1 BIRT
+2 PLAC birth place
+2 DATE 31 JUL 1950
+1 DEAT
+2 PLAC death place
+2 DATE 29 FEB 2000
+1 FAMC @FAMILY@
+0 @FAMILY@ FAM
+1 MARR
+2 PLAC marriage place
+2 DATE 1 APR 1950
+1 HUSB @FATHER@
+1 WIFE @MOTHER@
+1 CHIL @CHILD@
+0 TRLR
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-gherkin.html b/docs/_style/prism-master/examples/prism-gherkin.html new file mode 100644 index 0000000..f38446e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-gherkin.html @@ -0,0 +1,74 @@ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+
+"""
+Some Title, Eh?
+===============
+Here is the first paragraph of my blog post.
+Lorem ipsum dolor sit amet, consectetur adipiscing
+elit.
+"""
+
+ +

Keywords

+
Feature: Some terse yet descriptive text of what is desired
+    In order to realize a named business value
+    As an explicit system actor
+    I want to gain some beneficial outcome which furthers the goal
+
+    Additional text...
+
+    Scenario: Some determinable business situation
+    Given some precondition
+    And some other precondition
+    When some action by the actor
+    And some other action
+    And yet another action
+    Then some testable outcome is achieved
+    And something else we can check happens too
+
+    Scenario: A different situation
+    ...
+ +

Comments and tags

+
# user.feature
+@users
+Feature: Sign in to the store
+  In order to view my orders list
+  As a visitor
+  I need to be able to log in to the store
+
+  @javascript @login
+  Scenario: Trying to login without credentials
+      Given I am on the store homepage
+        And I follow "Login"
+       When I press "Login"
+       Then I should be on login page
+       # And I should see "Invalid credentials"
+
+ +

Tables and parameters

+
Scenario Outline: Eating
+  Given there are <start> cucumbers
+  When I eat <eat> cucumbers
+  Then I should have <left> cucumbers
+
+  Examples:
+    | start | eat | left |
+    |  12   |  5  |  7   |
+    |  20   |  5  |  15  |
+ +

Localized keywords

+
#language: fr
+Fonctionnalité: Contrôle le format de la valeur saisie d'un champ d'une révision
+  En tant qu'expert ou analyste
+  Je ne dois pas pouvoir soumettre des données au mauvais format
+
+  Contexte:
+    Etant donné que je suis connecté avec le pseudo "p_flore" et le mot de passe "p4flore"
+    Et que la gamme du contrat 27156 supporte les révisions
+    Etant donné que le contrat ayant l'id "27156" a une révision
+    Et je suis sur "/contrat/27156/revision/1"
+    Et que j'attends quelques secondes
+    ...
diff --git a/docs/_style/prism-master/examples/prism-git.html b/docs/_style/prism-master/examples/prism-git.html new file mode 100644 index 0000000..cd5668d --- /dev/null +++ b/docs/_style/prism-master/examples/prism-git.html @@ -0,0 +1,39 @@ +

Comments

+
# On branch prism-examples
+# Changes to be committed:
+#   (use "git reset HEAD <file>..." to unstage)
+#
+#       new file:   examples/prism-git.html
+ +

Inserted and deleted lines

+
- Some deleted line
++ Some added line
+ +

Diff

+
$ git diff
+diff --git file.txt file.txt
+index 6214953..1d54a52 100644
+--- file.txt
++++ file.txt
+@@ -1 +1,2 @@
+-Here's my tetx file
++Here's my text file
++And this is the second line
+ +

Logs

+
$ git log
+commit a11a14ef7e26f2ca62d4b35eac455ce636d0dc09
+Author: lgiraudel
+Date:   Mon Feb 17 11:18:34 2014 +0100
+
+    Add of a new line
+
+commit 87edc4ad8c71b95f6e46f736eb98b742859abd95
+Author: lgiraudel
+Date:   Mon Feb 17 11:18:15 2014 +0100
+
+    Typo fix
+
+commit 3102416a90c431400d2e2a14e707fb7fd6d9e06d
+Author: lgiraudel
+Date:   Mon Feb 17 10:58:11 2014 +0100
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-glsl.html b/docs/_style/prism-master/examples/prism-glsl.html new file mode 100644 index 0000000..7492a42 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-glsl.html @@ -0,0 +1,65 @@ +

Vertex shader example

+
attribute vec3 vertex;
+attribute vec3 normal;
+
+uniform mat4 _mvProj;
+uniform mat3 _norm;
+
+varying vec3 vColor;
+varying vec3 localPos;
+
+#pragma include "light.glsl"
+
+// constants
+vec3 materialColor = vec3(1.0,0.7,0.8);
+vec3 specularColor = vec3(1.0,1.0,1.0);
+
+void main(void) {
+    // compute position
+    gl_Position = _mvProj * vec4(vertex, 1.0);
+    
+    localPos = vertex;
+    
+    // compute light info
+    vec3 n = normalize(_norm * normal);
+    vec3 diffuse;
+    float specular;
+    float glowingSpecular = 50.0;
+    getDirectionalLight(n, _dLight, glowingSpecular, diffuse, specular);
+    vColor = max(diffuse,_ambient.xyz)*materialColor+specular*specularColor+_ambient;
+}
+ +

Fragment shader example

+
#ifdef GL_ES
+precision highp float;
+#endif
+
+uniform vec3 BrickColor, MortarColor;
+uniform vec3 BrickSize;
+uniform vec3 BrickPct;
+
+varying vec3 vColor;
+varying vec3 localPos;
+void main()
+{
+    vec3 color;
+	vec3 position, useBrick;
+	
+
+	position = localPos / BrickSize.xyz;
+
+	if (fract(position.y * 0.5) > 0.5){
+		position.x += 0.5;
+        position.z += 0.5;
+	}
+    
+	position = fract(position);
+
+	useBrick = step(position, BrickPct.xyz);
+
+	color = mix(MortarColor, BrickColor, useBrick.x * useBrick.y * useBrick.z);
+	color *= vColor;
+
+	gl_FragColor = vec4(color, 1.0);
+}
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-gml.html b/docs/_style/prism-master/examples/prism-gml.html new file mode 100644 index 0000000..a1649f6 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-gml.html @@ -0,0 +1,29 @@ +

Comments

+
// This is a comment
+/* This is a comment
+on multiple lines */
+ +

Functions

+
variable_instance_set(_inst,_var_name,_start+_change);
+ +

Full example

+
if(instance_exists(_inst) || _inst==global){
+	if(_delay<=0){
+		_time+=1;
+		if(_time<_duration){
+			event_user(0);
+		}else{
+			if(_inst!=global){
+				variable_instance_set(_inst,_var_name,_start+_change);
+			}else{
+				variable_global_set(_var_name,_start+_change);
+			}
+			instance_destroy();
+		}
+	}else{
+		_delay-=1;
+	}
+}else{
+	instance_destroy();
+}
+
diff --git a/docs/_style/prism-master/examples/prism-go.html b/docs/_style/prism-master/examples/prism-go.html new file mode 100644 index 0000000..205a1a7 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-go.html @@ -0,0 +1,68 @@ +

Comments

+
// This is a comment
+/* This is a comment
+on multiple lines */
+ +

Numbers

+
42
+0600
+0xBadFace
+170141183460469231731687303715884105727
+0.
+72.40
+072.40
+2.71828
+1.e+0
+6.67428e-11
+1E6
+.25
+.12345E+5
+0i
+011i
+0.i
+2.71828i
+1.e+0i
+6.67428e-11i
+1E6i
+.25i
+.12345E+5i
+ +

Runes and strings

+
'\t'
+'\000'
+'\x07'
+'\u12e4'
+'\U00101234'
+`abc`
+`multi-line
+string`
+"Hello, world!"
+"multi-line
+string"
+ +

Functions

+
func(a, b int, z float64) bool { return a*b < int(z) }
+ +

Full example

+
package main
+import "fmt"
+
+func sum(a []int, c chan int) {
+	sum := 0
+	for _, v := range a {
+		sum += v
+	}
+	c <- sum // send sum to c
+}
+
+func main() {
+	a := []int{7, 2, 8, -9, 4, 0}
+
+	c := make(chan int)
+	go sum(a[:len(a)/2], c)
+	go sum(a[len(a)/2:], c)
+	x, y := <-c, <-c // receive from c
+
+	fmt.Println(x, y, x+y)
+}
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-graphql.html b/docs/_style/prism-master/examples/prism-graphql.html new file mode 100644 index 0000000..12113a9 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-graphql.html @@ -0,0 +1,31 @@ +

Comments

+
# This is a comment
+ +

Strings

+
""
+"foo \"bar\" baz"
+ +

Numbers

+
0
+42
+3.14159
+-9e-5
+0.9E+7
+ +

Keywords

+
query withFragments {
+  user(id: 4) {
+    friends(first: 10) {
+      ...friendFields
+    }
+    mutualFriends(first: 10) {
+      ...friendFields
+    }
+  }
+}
+
+fragment friendFields on User {
+  id
+  name
+  profilePic(size: 50)
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-groovy.html b/docs/_style/prism-master/examples/prism-groovy.html new file mode 100644 index 0000000..3ec1d6d --- /dev/null +++ b/docs/_style/prism-master/examples/prism-groovy.html @@ -0,0 +1,93 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo 'bar' baz"
+'foo "bar" baz'
+"""Multi-line
+string"""
+'''Multi-line
+string'''
+"String /containing/ slashes"
+
+ +

Slashy strings (regex)

+
/.*foo.*/
+/regex"containing quotes"/
+$/.*"(.*)".*/(.*)/$
+ +

Interpolation inside GStrings and regex

+
"The answer is ${21*2}"
+"The $foxtype ${foxcolor.join()} fox"
+/foo${21*2}baz/
+'No interpolation here : ${21*2}'
+ +

Full example

+
#!/usr/bin/env groovy
+package model
+
+import groovy.transform.CompileStatic
+import java.util.List as MyList
+
+trait Distributable {
+    void distribute(String version) {}
+}
+
+@CompileStatic
+class Distribution implements Distributable {
+    double number = 1234.234 / 567
+    def otherNumber = 3 / 4
+    boolean archivable = condition ?: true
+    def ternary = a ? b : c
+    String name = "Guillaume"
+    Closure description = null
+    List<DownloadPackage> packages = []
+    String regex = ~/.*foo.*/
+    String multi = '''
+        multi line string
+    ''' + """
+        now with double quotes and ${gstring}
+    """ + $/
+        even with dollar slashy strings
+    /$
+
+    /**
+     * description method
+     * @param cl the closure
+     */
+    void description(Closure cl) { this.description = cl }
+
+    void version(String name, Closure versionSpec) {
+        def closure = { println "hi" } as Runnable
+
+        MyList ml = [1, 2, [a: 1, b:2,c :3]]
+        for (ch in "name") {}
+
+        // single line comment
+        DownloadPackage pkg = new DownloadPackage(version: name)
+
+        check that: true
+
+        label:
+        def clone = versionSpec.rehydrate(pkg, pkg, pkg)
+        /*
+            now clone() in a multiline comment
+        */
+        clone()
+        packages.add(pkg)
+
+        assert 4 / 2 == 2
+    }
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Two divisions on the same line

+
2 / 3 / 4
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-haml.html b/docs/_style/prism-master/examples/prism-haml.html new file mode 100644 index 0000000..c2cc670 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-haml.html @@ -0,0 +1,79 @@ +

Comments

+

+/ This is comment
+    on multiple lines
+/ This is a comment
+but this is not
+-# This is another comment
+    on multiple lines
+ +

Doctype

+
!!! XML
+!!!
+!!! 5
+ +

Tags

+
%div
+	%span
+%span(class="widget_#{@widget.number}")
+%div{:id => [@item.type, @item.number], :class => [@item.type, @item.urgency]}
+%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
+%html{html_attrs('fr-fr')}
+%div[@user, :greeting]
+%img
+%pre><
+  foo
+  bar
+%img
+
+ +

Markup

+
%div
+  <p id="blah">Blah!</p>
+ +

Inline Ruby

+
= ['hi', 'there', 'reader!'].join " "
+- foo = "hello"
+= link_to_remote "Add to cart",
+    :url => { :action => "add", :id => product.id },
+    :update => { :success => "cart", :failure => "error" }
+~ "Foo\n<pre>Bar\nBaz</pre>"
+%p
+  - case 2
+  - when 1
+    = "1!"
+  - when 2
+    = "2?"
+  - when 3
+    = "3."
+- (42...47).each do |i|
+  %p= i
+%p See, I can count!
+
+ +

Filters

+ +
%head
+	:css
+		#content: {
+			background: url('img/background.jpg');
+		}
+		div {
+			color: #333;
+		}
+	:javascript
+		(function() {
+			var test = "Do you like Prism?";
+			if(confirm(test)) {
+				do_something_great();
+			}
+		}());
+%body
+
+ +

Filters require the desired language to be loaded. +On this page, check CoffeeScript before checking Haml should make +the example below work properly.

+
%script
+  :coffee
+    console.log 'This is coffee script'
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-handlebars.html b/docs/_style/prism-master/examples/prism-handlebars.html new file mode 100644 index 0000000..c39c8b7 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-handlebars.html @@ -0,0 +1,41 @@ +

Comments

+
{{! This is a comment with <p>some markup</p> in it }}
+{{! This is a comment }} {{ this_is_not }}
+ +

Variables

+
<p>{{ text }}</p>
+<h1>{{article.title}}</h1>
+{{{ triple_stash_is_supported }}}
+{{articles.[10].[#comments]}}
+ +

Strings, numbers and booleans

+
{{{link "See more..." story.url}}}
+{{ true }}
+{{ custom_helper 42 href="somepage.html" false }}
+ +

Block helpers

+
<div class="body">
+	{{#bold}}{{body}}{{/bold}}
+</div>
+{{#with story}}
+	<div class="intro">{{{intro}}}</div>
+	<div class="body">{{{body}}}</div>
+{{/with}}
+<div class="{{#if test}}foo{{else}}bar{{/if}}"></div>
+{{#list array}}
+	{{@index}}. {{title}}
+{{/list}}
+{{#block-with-hyphens args=yep}}
+	This should probably work...
+{{/block-with-hyphens}}
+
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Handlebars tag in the middle of an HTML tag

+
<div{{#if test}} class="test"{{/if}}></div>
diff --git a/docs/_style/prism-master/examples/prism-haskell.html b/docs/_style/prism-master/examples/prism-haskell.html new file mode 100644 index 0000000..de58eb7 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-haskell.html @@ -0,0 +1,80 @@ +

Comments

+
-- Single line comment
+{- Multi-line
+comment -}
+ +

Strings and characters

+
'a'
+'\n'
+'\^A'
+'\^]'
+'\NUL'
+'\23'
+'\o75'
+'\xFE'
+"Here is a backslant \\ as well as \137, \
+    \a numeric escape character, and \^X, a control character."
+ +

Numbers

+
42
+123.456
+123.456e-789
+1e+3
+0o74
+0XAF
+ +

Full example

+
hGetLine h =
+  wantReadableHandle_ "Data.ByteString.hGetLine" h $
+    \ h_@Handle__{haByteBuffer} -> do
+      flushCharReadBuffer h_
+      buf <- readIORef haByteBuffer
+      if isEmptyBuffer buf
+         then fill h_ buf 0 []
+         else haveBuf h_ buf 0 []
+ where
+
+  fill h_@Handle__{haByteBuffer,haDevice} buf len xss =
+    len `seq` do
+    (r,buf') <- Buffered.fillReadBuffer haDevice buf
+    if r == 0
+       then do writeIORef haByteBuffer buf{ bufR=0, bufL=0 }
+               if len > 0
+                  then mkBigPS len xss
+                  else ioe_EOF
+       else haveBuf h_ buf' len xss
+
+  haveBuf h_@Handle__{haByteBuffer}
+          buf@Buffer{ bufRaw=raw, bufR=w, bufL=r }
+          len xss =
+    do
+        off <- findEOL r w raw
+        let new_len = len + off - r
+        xs <- mkPS raw r off
+
+      -- if eol == True, then off is the offset of the '\n'
+      -- otherwise off == w and the buffer is now empty.
+        if off /= w
+            then do if (w == off + 1)
+                            then writeIORef haByteBuffer buf{ bufL=0, bufR=0 }
+                            else writeIORef haByteBuffer buf{ bufL = off + 1 }
+                    mkBigPS new_len (xs:xss)
+            else do
+                 fill h_ buf{ bufL=0, bufR=0 } new_len (xs:xss)
+
+  -- find the end-of-line character, if there is one
+  findEOL r w raw
+        | r == w = return w
+        | otherwise =  do
+            c <- readWord8Buf raw r
+            if c == fromIntegral (ord '\n')
+                then return r -- NB. not r+1: don't include the '\n'
+                else findEOL (r+1) w raw
+
+mkPS :: RawBuffer Word8 -> Int -> Int -> IO ByteString
+mkPS buf start end =
+ create len $ \p ->
+   withRawBuffer buf $ \pbuf -> do
+   copyBytes p (pbuf `plusPtr` start) len
+ where
+   len = end - start
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-haxe.html b/docs/_style/prism-master/examples/prism-haxe.html new file mode 100644 index 0000000..61fbf0e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-haxe.html @@ -0,0 +1,37 @@ +

Strings and string interpolation

+
"Foo
+bar $baz"
+'Foo
+bar'
+"${4 + 2}"
+ +

Regular expressions

+
~/haxe/i
+~/[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z][A-Z][A-Z]?/i
+~/(dog|fox)/g
+ +

Conditional compilation

+
#if !debug
+  trace("ok");
+#elseif (debug_level > 3)
+  trace(3);
+#else
+  trace("debug level too low");
+#end
+ +

Metadata

+
@author("Nicolas")
+@debug
+class MyClass {
+  @range(1, 8)
+  var value:Int;
+
+  @broken
+  @:noCompletion
+  static function method() { }
+}
+ +

Reification

+
macro static function add(e:Expr) {
+  return macro $e + $e;
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-hpkp.html b/docs/_style/prism-master/examples/prism-hpkp.html new file mode 100644 index 0000000..ced16eb --- /dev/null +++ b/docs/_style/prism-master/examples/prism-hpkp.html @@ -0,0 +1,11 @@ +

Pin for one year with report-uri

+
pin-sha256="EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4=";
+max-age=31536000;
+includeSubDomains;
+report-uri="https://my-reports.com/submit"
+
+ +

Pin for a short time (considered unsafe)

+
pin-sha256="EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4=";
+max-age=123
+
diff --git a/docs/_style/prism-master/examples/prism-hsts.html b/docs/_style/prism-master/examples/prism-hsts.html new file mode 100644 index 0000000..f7d0e45 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-hsts.html @@ -0,0 +1,8 @@ +

Policy with far-future max-age

+
max-age=31536000
+ +

Policy with near-future max-age, considered unsafe

+
max-age=123
+ +

Policy with extra directives

+
max-age=31536000; includeSubdomains; preload
diff --git a/docs/_style/prism-master/examples/prism-http.html b/docs/_style/prism-master/examples/prism-http.html new file mode 100644 index 0000000..a209176 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-http.html @@ -0,0 +1,33 @@ +

Request header

+
GET http://localhost:9999/foo.html HTTP/1.1
+Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
+Accept-Encoding: gzip, deflate
+ +

Response header

+
HTTP/1.1 200 OK
+Server: GitHub.com
+Date: Mon, 22 Dec 2014 18:25:30 GMT
+Content-Type: text/html; charset=utf-8
+ +

Response body highlighted based on Content-Type

+

This currently supports the following content types : + "application/json", + "application/xml", + "text/xml" and + "text/html".

+
HTTP/1.1 200 OK
+Server: GitHub.com
+Date: Mon, 22 Dec 2014 18:25:30 GMT
+Content-Type: text/html; charset=utf-8
+Last-Modified: Sun, 21 Dec 2014 20:29:48 GMT
+Transfer-Encoding: chunked
+Expires: Mon, 22 Dec 2014 18:35:30 GMT
+Cache-Control: max-age=600
+Vary: Accept-Encoding
+Content-Encoding: gzip
+
+<!DOCTYPE html>
+<html lang="en">
+<head></head>
+<body></body>
+</html>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-ichigojam.html b/docs/_style/prism-master/examples/prism-ichigojam.html new file mode 100644 index 0000000..24bcbf2 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-ichigojam.html @@ -0,0 +1,29 @@ +

Note: this component focuses on IchigoJam, which uses a small subset of basic and introduces its own markers.

+ +

Comments

+
' This is a comment
+REM This is a remark
+'NoSpaceIsOK
+REMNOSPACE
+ +

Strings

+
"This a string."
+"This is a string with ""quotes"" in it."
+ +

Numbers

+
42
+3.14159
+-42
+-3.14159
+.5
+10.
+2E10
+4.2E-14
+-3E+2
+#496F726953756B69
+`11100010
+ +

IchigoJam Basic example

+
A=0
+FOR I=1 TO 100 : A=A+I : NEXT
+PRINT A
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-icon.html b/docs/_style/prism-master/examples/prism-icon.html new file mode 100644 index 0000000..1dce690 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-icon.html @@ -0,0 +1,172 @@ +

Comments

+
#
+# Foobar
+ +

Strings and csets

+
""
+"Foo\"bar"
+''
+'a\'bcdefg'
+ +

Numbers

+
42
+3.14159
+5.2E+8
+16rface
+2r1101
+ +

Full example

+
# Author: Robert J. Alexander
+global GameObject, Tree, Learn
+record Question(question, yes, no)
+procedure main()
+   GameObject := "animal"
+   Tree := Question("Does it live in water", "goldfish", "canary")
+   Get()                                  # Recall prior knowledge
+   Game()                                 # Play a game
+   return
+end
+#  Game() -- Conducts a game.
+#
+procedure Game()
+   while Confirm("Are you thinking of ", Article(GameObject), " ",
+      GameObject) do Ask(Tree)
+   write("Thanks for a great game.")
+   if \Learn &Confirm("Want to save knowledge learned this session")
+   then Save()
+   return
+end
+#  Confirm() -- Handles yes/no questions and answers.
+#
+procedure Confirm(q[])
+   local answer, s
+   static ok
+   initial {
+      ok := table()
+      every ok["y" | "yes" | "yeah" | "uh huh"] := "yes"
+      every ok["n" | "no"  | "nope" | "uh uh" ] := "no"
+      }
+   while /answer do {
+      every writes(!q)
+      write("?")
+      case s := read() | exit(1) of {
+         #  Commands recognized at a yes/no prompt.
+         #
+         "save":    Save()
+         "get":     Get()
+         "list":    List()
+         "dump":    Output(Tree)
+         default:   {
+            (answer := \ok[map(s, &ucase, &lcase)]) |
+               write("This is a \"yes\" or \"no\" question.")
+            }
+         }
+      }
+   return answer == "yes"
+end
+#  Ask() -- Navigates through the barrage of questions leading to a
+#  guess.
+#
+procedure Ask(node)
+   local guess, question
+   case type(node) of {
+      "string":        {
+         if not Confirm("It must be ", Article(node), " ", node, ", right") then {
+            Learn := "yes"
+            write("What were you thinking of?")
+            guess := read() | exit(1)
+            write("What question would distinguish ", Article(guess), " ",
+               guess, " from ", Article(node), " ", node, "?")
+            question := read() | exit(1)
+            if question[-1] == "?" then question[-1] := ""
+            question[1] := map(question[1], &lcase, &ucase)
+            if Confirm("For ", Article(guess), " ", guess, ", what would the answer be")
+            then return Question(question, guess, node)
+         else return Question(question, node, guess)
+         }
+      }
+      "Question":  {
+         if Confirm(node.question) then node.yes := Ask(node.yes)
+         else node.no := Ask(node.no)
+         }
+      }
+end
+#  Article() -- Come up with the appropriate indefinite article.
+#
+procedure Article(word)
+   return if any('aeiouAEIOU', word) then "an" else "a"
+end
+#  Save() -- Store our acquired knowledge in a disk file name
+#  based on the GameObject.
+#
+procedure Save()
+   local f
+   f := open(GameObject || "s", "w")
+   Output(Tree, f)
+   close(f)
+   return
+end
+#  Output() -- Recursive procedure used to output the knowledge tree.
+#
+procedure Output(node, f, sense)
+   static indent
+   initial indent := 0
+   /f := &output
+   /sense := " "
+   case type(node) of {
+      "string":        write(f, repl(" ", indent), sense, "A: ", node)
+      "Question":  {
+         write(f, repl(" ", indent), sense, "Q: ", node.question)
+         indent +:= 1
+         Output(node.yes, f, "y")
+         Output(node.no, f, "n")
+         indent -:= 1
+         }
+      }
+   return
+end
+#  Get() -- Read in a knowledge base from a file.
+#
+procedure Get()
+   local f
+   f := open(GameObject || "s", "r") | fail
+   Tree := Input(f)
+   close(f)
+   return
+end
+#  Input() -- Recursive procedure used to input the knowledge tree.
+#
+procedure Input(f)
+   local nodetype, s
+   read(f) ? (tab(upto(~' \t')) & =("y" | "n" | "") &
+      nodetype := move(1) & move(2) & s := tab(0))
+   return if nodetype == "Q" then Question(s, Input(f), Input(f)) else s
+end
+#  List() -- Lists the objects in the knowledge base.
+#
+$define Length           78
+procedure List()
+   local lst, line, item
+   lst := Show(Tree, [ ])
+   line := ""
+   every item := !sort(lst) do {
+      if *line + *item > Length then {
+         write(trim(line))
+         line := ""
+         }
+      line ||:= item || ", "
+      }
+   write(line[1:-2])
+   return
+end
+#
+#  Show() -- Recursive procedure used to navigate the knowledge tree.
+#
+procedure Show(node, lst)
+   if type(node) == "Question" then {
+      lst := Show(node.yes, lst)
+      lst := Show(node.no, lst)
+      }
+   else put(lst, node)
+   return lst
+end
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-inform7.html b/docs/_style/prism-master/examples/prism-inform7.html new file mode 100644 index 0000000..9e2214f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-inform7.html @@ -0,0 +1,171 @@ +

Comments

+
[This is a comment]
+[This is a
+multi-line comment]
+ +

Texts

+
"This is a string"
+"This is a
+multi-line string"
+ +

Numbers

+
42
+3.14159
+50kg
+100m
+one
+three
+twelve
+ +

Titles

+
Section 2 - Flamsteed's Balloon
+
+Part SR1 - The Physical World Model
+
+Table of Floors
+ +

Standard kinds, verbs and keywords

+
In the Treehouse is a container called the cardboard box.
+The cardboard box is a closed container. The glass bottle is a transparent open container. The box is fixed in place and openable.
+
+Check photographing:
+    if the noun is the camera, say "Sadly impossible." instead.
+ +

Text substitution

+
"[if the player is in Center Ring]A magician's booth stands in the corner, painted dark blue with glittering gold stars.[otherwise if the magician's booth is closed]A crack of light indicates the way back out to the center ring.[otherwise]The door stands open to the outside.[end if]".
+ +

Full example

+
"Lakeside Living"
+
+A volume is a kind of value. 15.9 fl oz specifies a volume with parts ounces and tenths (optional, preamble optional).
+
+A fluid container is a kind of container. A fluid container has a volume called a fluid capacity. A fluid container has a volume called current volume.
+
+The fluid capacity of a fluid container is usually 12.0 fl oz. The current volume of a fluid container is usually 0.0 fl oz.
+
+Liquid is a kind of value. The liquids are water, absinthe, and iced tea. A fluid container has a liquid.
+
+Instead of examining a fluid container:
+    if the noun is empty,
+        say "You catch just a hint of [the liquid of the noun] at the bottom.";
+    otherwise
+        say "[The noun] contains [current volume of the noun in rough terms] of [liquid of the noun]."
+
+To say (amount - a volume) in rough terms:
+    if the amount is less than 0.5 fl oz:
+        say "a swallow or two";
+    otherwise if tenths part of amount is greater than 3 and tenths part of amount is less than 7:
+        let estimate be ounces part of amount;
+        say "[estimate in words] or [estimate plus 1 in words] fluid ounces";
+    otherwise:
+        if tenths part of amount is greater than 6, increase amount by 1.0 fl oz;
+        say "about [ounces part of amount in words] fluid ounce[s]".
+
+Before printing the name of a fluid container (called the target) while not drinking or pouring:
+    if the target is empty:
+        say "empty ";
+    otherwise:
+        do nothing.
+
+After printing the name of a fluid container (called the target) while not examining or pouring:
+    unless the target is empty:
+        say " of [liquid of the target]";
+        omit contents in listing.
+
+Instead of inserting something into a fluid container:
+    say "[The second noun] has too narrow a mouth to accept anything but liquids."
+
+Definition: a fluid container is empty if the current volume of it is 0.0 fl oz. Definition: a fluid container is full if the current volume of it is the fluid capacity of it.
+
+Understand "drink from [fluid container]" as drinking.
+
+Instead of drinking a fluid container:
+    if the noun is empty:
+        say "There is no more [liquid of the noun] within." instead;
+    otherwise:
+        decrease the current volume of the noun by 0.2 fl oz;
+        if the current volume of the noun is less than 0.0 fl oz, now the current volume of the noun is 0.0 fl oz;
+        say "You take a sip of [the liquid of the noun][if the noun is empty], leaving [the noun] empty[end if]."
+
+Part 2 - Filling
+
+Understand the command "fill" as something new.
+
+Understand "fill [fluid container] with/from [full liquid source]" as filling it with. Understand "fill [fluid container] with/from [fluid container]" as filling it with.
+
+Understand "fill [something] with/from [something]" as filling it with.
+
+Filling it with is an action applying to two things. Carry out filling it with: try pouring the second noun into the noun instead.
+
+Understand "pour [fluid container] in/into/on/onto [fluid container]" as pouring it into. Understand "empty [fluid container] into [fluid container]" as pouring it into.
+
+Understand "pour [something] in/into/on/onto [something]" as pouring it into. Understand "empty [something] into [something]" as pouring it into.
+
+Pouring it into is an action applying to two things.
+
+Check pouring it into:
+    if the noun is not a fluid container, say "You can't pour [the noun]." instead;
+    if the second noun is not a fluid container, say "You can't pour liquids into [the second noun]." instead;
+    if the noun is the second noun, say "You can hardly pour [the noun] into itself." instead;
+    if the liquid of the noun is not the liquid of the second noun:
+        if the second noun is empty, now the liquid of the second noun is the liquid of the noun;
+        otherwise say "Mixing [the liquid of the noun] with [the liquid of the second noun] would give unsavory results." instead;
+    if the noun is empty, say "No more [liquid of the noun] remains in [the noun]." instead;
+    if the second noun is full, say "[The second noun] cannot contain any more than it already holds." instead.
+
+Carry out pouring it into:
+    let available capacity be the fluid capacity of the second noun minus the current volume of the second noun;
+    if the available capacity is greater than the current volume of the noun, now the available capacity is the current volume of the noun;
+    increase the current volume of the second noun by available capacity;
+    decrease the current volume of the noun by available capacity.
+
+Report pouring it into:
+    say "[if the noun is empty][The noun] is now empty;[otherwise][The noun] now contains [current volume of the noun in rough terms] of [liquid of the noun]; [end if]";
+    say "[the second noun] contains [current volume of the second noun in rough terms] of [liquid of the second noun][if the second noun is full], and is now full[end if]."
+
+Understand the liquid property as describing a fluid container. Understand "of" as a fluid container.
+
+A liquid source is a kind of fluid container. A liquid source has a liquid. A liquid source is usually scenery. The fluid capacity of a liquid source is usually 3276.7 fl oz. The current volume of a liquid source is usually 3276.7 fl oz. Instead of examining a liquid source: say "[The noun] is full of [liquid of the noun]."
+
+Carry out pouring a liquid source into something: now the current volume of the noun is 3276.7 fl oz.
+
+After pouring a liquid source into a fluid container:
+    say "You fill [the second noun] up with [liquid of the noun] from [the noun]."
+
+Instead of pouring a fluid container into a liquid source:
+    if the noun is empty, say "[The noun] is already empty." instead;
+    now the current volume of the noun is 0.0 fl oz;
+    say "You dump out [the noun] into [the second noun]."
+
+Swimming is an action applying to nothing. Understand "swim" or "dive" as swimming.
+
+Instead of swimming in the presence of a liquid source:
+    say "You don't feel like a dip just now."
+
+Before inserting something into a liquid source: say "[The noun] would get lost and never be seen again." instead.
+
+Part 3 - Scenario
+
+The Lakeside is a room. The Lakeside swing is an enterable supporter in the Lakeside. "Here you are by the lake, enjoying a summery view."
+
+The glass is a fluid container carried by the player. The liquid of the glass is absinthe. The current volume of the glass is 0.8 fl oz.
+
+The pitcher is a fluid container in the Lakeside. The fluid capacity of the pitcher is 32.0 fl oz. The current volume of the pitcher is 20.0 fl oz. The liquid of the pitcher is absinthe.
+
+The lake is a liquid source. It is in the Lakeside.
+
+The player wears a bathing outfit. The description of the bathing outfit is "Stylishly striped in blue and white, and daringly cut to reveal almost all of your calves, and quite a bit of upper arm, as well. You had a moral struggle, purchasing it; but mercifully the lakeshore is sufficiently secluded that no one can see you in this immodest apparel."
+
+Instead of taking off the outfit: say "What odd ideas come into your head sometimes!"
+
+Test me with "fill glass / empty absinthe into lake / fill glass / swim / drink lake / drink / x water / x lake". 
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Names starting with a number

+
The box 1A is a container
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-ini.html b/docs/_style/prism-master/examples/prism-ini.html new file mode 100644 index 0000000..284fbe4 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-ini.html @@ -0,0 +1,10 @@ +

Comments

+
; This is a comment
+ +

Section title

+
[owner]
+[database]
+ +

Properties

+
name=prism
+file="somefile.txt"
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-io.html b/docs/_style/prism-master/examples/prism-io.html new file mode 100644 index 0000000..ff5160a --- /dev/null +++ b/docs/_style/prism-master/examples/prism-io.html @@ -0,0 +1,31 @@ +

Comments

+
//
+// Foobar
+#!/usr/bin/env io
+/* multiline
+comment
+*/
+ +

Strings

+
"this is a \"test\".\nThis is only a test."
+"""this is a "test".
+This is only a test."""
+ +

Numbers

+
123
+123.456
+0.456
+123e-4
+123e4
+123.456e-7
+123.456e2
+
+ +

Full example

+
"Hello, world!" println
+A := Object clone    // creates a new, empty object named "A"
+factorial := method(n,
+    if(n == 0, return 1)
+    res := 1
+    Range 1 to(n) foreach(i, res = res * i)
+)
diff --git a/docs/_style/prism-master/examples/prism-j.html b/docs/_style/prism-master/examples/prism-j.html new file mode 100644 index 0000000..cf4c109 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-j.html @@ -0,0 +1,59 @@ +

Comments

+
NB. This is a comment
+ +

Strings

+
'This is a string.'
+'This is a string with ''quotes'' in it.'
+ +

Numbers

+
2.3e2 2.3e_2 2j3
+2p1 1p_1
+1x2 2x1 1x_1
+2e2j_2e2 2e2j2p1 2ad45 2ar0.785398
+16b1f 10b23 _10b23 1e2b23 2b111.111
+ +

Verbs

+
%4
+3%4
+,b
+'I';'was';'here'
+3 5$'wake read lamp '
+ +

Adverbs

+
1 2 3 */ 4 5 6 7
+'%*'(1 3;2 _1)} y
+ +

Conjunctions

+
10&^. 2 3 10 100 200
++`*
++:@*: +/ -:@%:
+ +

Examples

+
NB. The following functions E1, E2 and E3
+NB. interchange two rows of a matrix,
+NB. multiply a row by a constant,
+NB. and add a multiple of one row to another:
+
+E1=: <@] C. [
+E2=: f`g`[}
+E3=: F`g`[}
+f=: {:@] * {.@] { [
+F=: [: +/ (1:,{:@]) * (}:@] { [)
+g=: {.@]
+M=: i. 4 5
+M;(M E1 1 3);(M E2 1 10);(M E3 1 3 10)
+ +
NB. Implementation of quicksort
+
+sel=: adverb def 'u # ['
+
+quicksort=: verb define
+  if. 1 >: #y do. y
+  else.
+    (quicksort y <sel e),(y =sel e),quicksort y >sel e=.y{~?#y
+  end.
+)
+ +
NB. Implementation of quicksort (tacit programming)
+
+quicksort=: (($:@(<#[), (=#[), $:@(>#[)) ({~ ?@#)) ^: (1<#)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-java.html b/docs/_style/prism-master/examples/prism-java.html new file mode 100644 index 0000000..691a6b1 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-java.html @@ -0,0 +1,65 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz";
+'foo \'bar\' baz';
+ +

Numbers

+
123
+123.456
+-123.456
+.3f
+1.3e9d
+0xaf
+0xAF
+0xFF.AEP-4
+
+ +

Full example

+
import java.util.Scanner;
+
+public class Life {
+
+    @Override @Bind("One")
+    public void show(boolean[][] grid){
+        String s = "";
+        for(boolean[] row : grid){
+            for(boolean val : row)
+                if(val)
+                    s += "*";
+                else
+                    s += ".";
+            s += "\n";
+        }
+        System.out.println(s);
+    }
+
+    public static boolean[][] gen(){
+        boolean[][] grid = new boolean[10][10];
+        for(int r = 0; r < 10; r++)
+            for(int c = 0; c < 10; c++)
+                if( Math.random() > 0.7 )
+                    grid[r][c] = true;
+        return grid;
+    }
+
+    public static void main(String[] args){
+        boolean[][] world = gen();
+        show(world);
+        System.out.println();
+        world = nextGen(world);
+        show(world);
+        Scanner s = new Scanner(System.in);
+        while(s.nextLine().length() == 0){
+            System.out.println();
+            world = nextGen(world);
+            show(world);
+
+        }
+    }
+
+	// [...]
+}
diff --git a/docs/_style/prism-master/examples/prism-javascript.html b/docs/_style/prism-master/examples/prism-javascript.html new file mode 100644 index 0000000..51fe483 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-javascript.html @@ -0,0 +1,77 @@ +

Variable assignment

+
var foo = "bar", baz = 5;
+ +

Operators

+
(1 + 2 * 3)/4 >= 3 && 4 < 5 || 6 > 7
+ +

Indented code

+
if (true) {
+	while (true) {
+		doSomething();
+	}
+}
+ +

Regex with slashes

+
var foo = /([^/])\/(\\?.|\[.+?])+?\/[gim]{0,3}/g;
+ +

Regex that ends with double slash

+
var bar = /\/\*[\w\W]*?\*\//g;
+ +

Single line comments & regexes

+
// http://lea.verou.me
+var comment = /\/\*[\w\W]*?\*\//g;
+ +

Link in comment

+
// http://lea.verou.me
+/* http://lea.verou.me */
+ +

Nested strings

+
var foo = "foo", bar = "He \"said\" 'hi'!"
+ +

Strings inside comments

+
// "foo"
+/* "foo" */
+ +

Strings with slashes

+
env.content + '</' + env.tag + '>'
+var foo = "/" + "/";
+var foo = "http://prismjs.com"; // Strings are strings and comments are comments ;)
+ +

Regex inside single line comment

+
// hey, /this doesn’t fail!/ :D
+ +

Two or more division operators on the same line

+
var foo = 5 / 6 / 7;
+ +

A division operator on the same line as a regex

+
var foo = 1/2, bar = /a/g;
+var foo = /a/, bar = 3/4;
+ +

ES6 features

+
// Regex "y" and "u" flags
+var a = /[a-zA-Z]+/gimyu;
+
+// for..of loops
+for(let x of y) { }
+
+// Modules: import
+import { foo as bar } from "file.js"
+
+// Template strings
+`Only on ${y} one line`
+`This template string ${x} is on
+
+multiple lines.`
+`40 + 2 = ${ 40 + 2 }`
+`The squares of the first 3 natural integers are ${[for (x of [1,2,3]) x*x].join(', ')}`
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

String interpolation containing a closing brace

+
`${ {foo:'bar'}.foo }`
+`${ '}' }`
diff --git a/docs/_style/prism-master/examples/prism-javastacktrace.html b/docs/_style/prism-master/examples/prism-javastacktrace.html new file mode 100644 index 0000000..3511aa6 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-javastacktrace.html @@ -0,0 +1,63 @@ +

Full example

+
javax.servlet.ServletException: Something bad happened
+    at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:60)
+    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
+    at com.example.myproject.ExceptionHandlerFilter.doFilter(ExceptionHandlerFilter.java:28)
+    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
+    at com.example.myproject.OutputBufferFilter.doFilter(OutputBufferFilter.java:33)
+    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
+    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
+    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
+    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
+    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
+    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
+    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
+    at org.mortbay.jetty.Server.handle(Server.java:326)
+    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
+    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
+    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
+    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
+    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
+    at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
+    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
+Caused by: com.example.myproject.MyProjectServletException
+    at com.example.myproject.MyServlet.doPost(MyServlet.java:169)
+    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
+    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
+    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
+    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
+    at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:30)
+    ... 27 more
+Suppressed: org.hibernate.exception.ConstraintViolationException: could not insert: [com.example.myproject.MyEntity]
+    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
+    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
+    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:64)
+    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
+    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2822)
+    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
+    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
+    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
+    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
+    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
+    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
+    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
+    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
+    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
+    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
+    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705)
+    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693)
+    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:689)
+    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
+    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+    at java.lang.reflect.Method.invoke(Method.java:597)
+    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)
+    at $Proxy19.save(Unknown Source)
+    at com.example.myproject.MyEntityService.save(MyEntityService.java:59) <-- relevant call (see notes below)
+    at com.example.myproject.MyServlet.doPost(MyServlet.java:164)
+    ... 32 more
+Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
+    at org.hsqldb.jdbc.Util.throwError(Unknown Source)
+    at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
+    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
+    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
+    ... 54 more
diff --git a/docs/_style/prism-master/examples/prism-jolie.html b/docs/_style/prism-master/examples/prism-jolie.html new file mode 100644 index 0000000..8d23d99 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-jolie.html @@ -0,0 +1,162 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz";
+'foo \'bar\' baz'
+ +

Numbers

+
42
+42L
+1.2e3
+0.1E-4
+0.2e+1
+
+ +

Full example

+
include "console.iol"
+
+type HubType: void {
+  .sid: undefined
+  .nodes[1,*] : NodeType
+}
+
+type NodeType: void {
+  .sid: string
+  .node: string
+  .load?: int
+}
+
+type NetType: HubType | NodeType
+
+interface NetInterface {
+  OneWay: start( string ), addElement( NetType ), removeElement( NetType ), quit( void )
+  RequestResponse: showElements( void )( NetType ) throws SomeFault
+}
+
+type LogType: void {
+  .message: string
+}
+
+interface LoggerInterface {
+  RequestResponse: log( LogType )( void )
+}
+
+outputPort LoggerService {
+    Interfaces: LoggerInterface
+}
+
+embedded {
+  Jolie: "logger.ol" in LoggerService
+}
+
+type AuthenticationData: void {
+    .key:string
+}
+
+interface extender AuthInterfaceExtender {
+    OneWay: *(AuthenticationData)
+}
+
+service SubService 
+{
+  Interfaces: NetInterface
+
+  main
+  {
+     println@Console( "I do nothing" )()
+  }
+}
+
+inputPort ExtLogger {
+  Location: "socket://localhost:9000"
+  Protocol: sodep
+  Interfaces: LoggerInterface
+  Aggregates: LoggerService with AuthInterfaceExtender
+}
+
+courier ExtLogger {
+  [interface LoggerInterface( request )] {
+    if ( key == "secret" ){
+      forward ( request )
+    }
+  }
+}
+
+inputPort In {
+  Location: "socket://localhost:8000"
+  Protocol: http {
+    .debug = true;
+    .debug.showContent = true
+  }
+  Interfaces: NetInterface
+  Aggregates: SubService, 
+              LoggerService
+  Redirects: A => SubService, 
+             B => SubService
+}
+
+cset {
+  sid: HubType.sid NodeType.sid
+}
+
+execution{ concurrent }
+
+define netmodule {
+  if( request.load == 0 || request.load < 1 && 
+      request.load <= 2 || request.load >= 3 && 
+      request.load > 4  || request.load%4 == 2
+  ) {
+    scope( scopeName ) {   
+      // inline comment
+      install( MyFault => println@Console( "Something \"Went\" Wrong" + ' but it\'s ok' )() );
+      /*
+      * Multi-line
+      * Comment
+      */
+      install( this => cH; println@Console( "Something went wrong: " + ^load )() );
+      install( default => comp( scopeName ); println@Console( "Something went wrong" )() );
+      load -> request.( "load" );
+      { ++load | load++ | --load | load-- };
+      throw( MyFault )
+    }
+  } else {
+    foreach ( node -> request.nodes ) {
+      with( node ){
+        while( .load != 100 ) {
+          .load++
+        }   
+      }
+    } 
+  }
+}
+
+main
+{
+  start( sid );
+  synchronized( unneededSync ){
+    csets.sid = sid;
+    undef( sid )
+  };
+  provide
+    [ addElement( request ) ]{
+      if( request instanceof NodeType ) {
+        netmodule
+      }
+    }
+    [ removeElement() ]
+    [ showElements()( response ){
+       /*
+       * assemble response
+       */
+       nullProcess
+     }]{
+       // log the request
+       log@LoggerService( new )();
+       log @ LoggerService( new )()
+     }
+  until
+   [ quit() ]{ exit }
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-jsx.html b/docs/_style/prism-master/examples/prism-jsx.html new file mode 100644 index 0000000..faff492 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-jsx.html @@ -0,0 +1,18 @@ +

Full example

+
var ExampleApplication = React.createClass({
+    render: function() {
+      var elapsed = Math.round(this.props.elapsed  / 100);
+      var seconds = elapsed / 10 + (elapsed % 10 ? '' : '.0' );
+      var message =
+        'React has been successfully running for ' + seconds + ' seconds.';
+
+      return <p>{message}</p>;
+    }
+  });
+  var start = new Date().getTime();
+  setInterval(function() {
+    React.render(
+      <ExampleApplication elapsed={new Date().getTime() - start} />,
+      document.getElementById('container')
+    );
+  }, 50);
diff --git a/docs/_style/prism-master/examples/prism-julia.html b/docs/_style/prism-master/examples/prism-julia.html new file mode 100644 index 0000000..b69d045 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-julia.html @@ -0,0 +1,29 @@ +

Full example

+
function mandel(z)
+    c = z
+    maxiter = 80
+    for n = 1:maxiter
+        if abs(z) > 2
+            return n-1
+        end
+        z = z^2 + c
+    end
+    return maxiter
+end
+
+function randmatstat(t)
+    n = 5
+    v = zeros(t)
+    w = zeros(t)
+    for i = 1:t
+        a = randn(n,n)
+        b = randn(n,n)
+        c = randn(n,n)
+        d = randn(n,n)
+        P = [a b c d]
+        Q = [a b; c d]
+        v[i] = trace((P.'*P)^4)
+        w[i] = trace((Q.'*Q)^4)
+    end
+    std(v)/mean(v), std(w)/mean(w)
+end
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-keyman.html b/docs/_style/prism-master/examples/prism-keyman.html new file mode 100644 index 0000000..770827d --- /dev/null +++ b/docs/_style/prism-master/examples/prism-keyman.html @@ -0,0 +1,107 @@ +

Comments

+
c This is a comment
+ +

Strings, numbers and characters

+
"'this' is a string"
+'and so is "this"'
+U+0041 d65 x41   c these are all the letter A
+
+ +

Prefixes and Virtual Keys

+ +

+c Match RAlt+E on desktops, Ctrl+Alt+E on web because L/R Alt not consistently supported in browsers.
+$KeymanOnly: + [RALT K_E] > "€"
+$KeymanWeb: + [CTRL ALT K_E] > "€"
+
+ +

Example Code

+ +
c =====================Begin Identity Section===================================================
+c 
+c Mnemonic input method for Amharic script on US-QWERTY
+c keyboards for Keyman version 7.1, compliant with Unicode 4.1 and later.
+c 
+
+store(&VERSION) '9.0'
+store(&Name) "Amharic"
+c store(&MnemonicLayout) "1"
+store(&CapsAlwaysOff) "1"
+store(&Copyright) "Creative Commons Attribution 3.0"
+store(&Message) "This is an Amharic language mnemonic input method for Ethiopic script that requires Unicode 4.1 support."
+store(&WINDOWSLANGUAGES) 'x045E x045E'
+store(&LANGUAGE) 'x045E'
+store(&EthnologueCode) "amh"
+store(&VISUALKEYBOARD) 'gff-amh-7.kvk'
+store(&KMW_EMBEDCSS) 'gff-amh-7.css'
+HOTKEY "^%A"
+c 
+c =====================End Identity Section=====================================================
+
+c =====================Begin Data Section=======================================================
+
+c ---------------------Maps for Numbers---------------------------------------------------------
+store(ArabOnes) '23456789'
+store(ones)     'áªá«á¬á­á®á¯á°á±'
+store(tens)     'á³á´áµá¶á·á¸á¹áº'
+store(arabNumbers) '123456789'
+store(ethNumbers) 'á©áªá«á¬á­á®á¯á°á±á²á³á´áµá¶á·á¸á¹áºá»á¼'
+store(arabNumbersWithZero) '0123456789'
+store(ColonOrComma) ':,'
+store(ethWordspaceOrComma) 'á¡á£'
+c ---------------------End Numbers--------------------------------------------------------------
+
+c =====================End Data Section=========================================================
+
+c =====================Begin Functional Section=================================================
+c 
+store(&LAYOUTFILE) 'gff-amh-7_layout.js'
+store(&BITMAP) 'amharic.bmp'
+store(&TARGETS) 'any windows'
+begin Unicode > use(main)
+group(main) using keys    
+
+c ---------------------Input of Numbers---------------------------------------------------------
+
+c Special Rule for Arabic Numerals
+c 
+c The following attempts to auto-correct the use of Ethiopic wordspace and
+c Ethiopic comma within an Arabic numeral context.  Ethiopic wordspace gets
+c used erroneously in time formats and Ethiopic commas as an order of thousands
+c delimiter. The correction context is not known until numerals appear on _both_
+c sides of the punctuation.
+c 
+  any(arabNumbersWithZero) any(ethWordspaceOrComma) + any(arabNumbers) > index(arabNumbersWithZero,1) index(ColonOrComma,2) index(arabNumbers,3)
+
+c Ethiopic Numerals
+
+  "'" + '1' > 'á©'
+  "'" + any(ArabOnes) > index(ones,2)
+
+c special cases for multiples of one
+  'á©'  + '0' > 'á²'
+  'á²'  + '0' > 'á»'
+  'á»'  + '0' > 'á²á»'
+  'á²á»' + '0' > 'á¼'
+  'á¼'  + '0' > 'á²á¼'    
+  'á²á¼' + '0' > 'á»á¼' 
+  'á»á¼'  + '0' > 'á²á»á¼'
+  'á²á»á¼' + '0' > 'á¼á¼'
+  'á¼á¼' + '0' > context beep  c do not go any higher, we could beep here
+
+c upto the order of 100 million
+  any(ones)     + '0' > index(tens,1)
+  any(tens)     + '0' > index(ones,1) 'á»'  c Hundreds
+  any(ones)  'á» '+ '0' > index(tens,1) 'á»'  c Thousands
+  any(tens)  'á»' + '0' > index(ones,1) 'á¼'  c Ten Thousands
+  any(ones)  'á¼' + '0' > index(tens,1) 'á¼'  c Hundred Thousands
+  any(tens)  'á¼' + '0' > index(ones,1) 'á»á¼' c Millions
+  any(ones) 'á»á¼' + '0' > index(tens,1) 'á»á¼' c Ten Millions
+  any(tens) 'á»á¼' + '0' > index(ones,1) 'á¼á¼' c Hundred Millions
+
+c enhance this later, look for something that can copy a match over
+  any(ethNumbers) + any(arabNumbers) > index(ethNumbers,1)  index(ethNumbers,2)
+c ---------------------End Input of Numbers-----------------------------------------------------
+                                            
+c =====================End Functional Section===================================================
+
diff --git a/docs/_style/prism-master/examples/prism-kotlin.html b/docs/_style/prism-master/examples/prism-kotlin.html new file mode 100644 index 0000000..7c8f7b4 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-kotlin.html @@ -0,0 +1,134 @@ +

Numbers

+
123
+123L
+0x0F
+0b00001011
+123.5
+123.5e10
+123.5f
+123.5F
+ +

Strings and interpolation

+
'2'
+'\uFF00'
+'\''
+
+"foo $bar \"baz"
+"""
+foo ${40 + 2}
+baz${bar()}
+"""
+ +

Labels

+
loop@ for (i in 1..100) {
+  for (j in 1..100) {
+    if (...)
+      break@loop
+  }
+}
+ +

Annotations

+
public class MyTest {
+    lateinit var subject: TestSubject
+
+    @SetUp fun setup() {
+        subject = TestSubject()
+    }
+
+    @Test fun test() {
+        subject.method()  // dereference directly
+    }
+}
+ +

Full example

+
package com.example.html
+
+interface Element {
+    fun render(builder: StringBuilder, indent: String)
+
+    override fun toString(): String {
+        val builder = StringBuilder()
+        render(builder, "")
+        return builder.toString()
+    }
+}
+
+class TextElement(val text: String): Element {
+    override fun render(builder: StringBuilder, indent: String) {
+        builder.append("$indent$text\n")
+    }
+}
+
+abstract class Tag(val name: String): Element {
+    val children = arrayListOf<Element>()
+    val attributes = hashMapOf<String, String>()
+
+    protected fun initTag<T: Element>(tag: T, init: T.() -> Unit): T {
+        tag.init()
+        children.add(tag)
+        return tag
+    }
+
+    override fun render(builder: StringBuilder, indent: String) {
+        builder.append("$indent<$name${renderAttributes()}>\n")
+        for (c in children) {
+            c.render(builder, indent + "  ")
+        }
+        builder.append("$indent</$name>\n")
+    }
+
+    private fun renderAttributes(): String? {
+        val builder = StringBuilder()
+        for (a in attributes.keySet()) {
+            builder.append(" $a=\"${attributes[a]}\"")
+        }
+        return builder.toString()
+    }
+}
+
+abstract class TagWithText(name: String): Tag(name) {
+    operator fun String.plus() {
+        children.add(TextElement(this))
+    }
+}
+
+class HTML(): TagWithText("html") {
+    fun head(init: Head.() -> Unit) = initTag(Head(), init)
+
+    fun body(init: Body.() -> Unit) = initTag(Body(), init)
+}
+
+class Head(): TagWithText("head") {
+    fun title(init: Title.() -> Unit) = initTag(Title(), init)
+}
+
+class Title(): TagWithText("title")
+
+abstract class BodyTag(name: String): TagWithText(name) {
+    fun b(init: B.() -> Unit) = initTag(B(), init)
+    fun p(init: P.() -> Unit) = initTag(P(), init)
+    fun h1(init: H1.() -> Unit) = initTag(H1(), init)
+    fun a(href: String, init: A.() -> Unit) {
+        val a = initTag(A(), init)
+        a.href = href
+    }
+}
+
+class Body(): BodyTag("body")
+
+class B(): BodyTag("b")
+class P(): BodyTag("p")
+class H1(): BodyTag("h1")
+class A(): BodyTag("a") {
+    public var href: String
+        get() = attributes["href"]!!
+        set(value) {
+            attributes["href"] = value
+        }
+}
+
+fun html(init: HTML.() -> Unit): HTML {
+    val html = HTML()
+    html.init()
+    return html
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-latex.html b/docs/_style/prism-master/examples/prism-latex.html new file mode 100644 index 0000000..137df36 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-latex.html @@ -0,0 +1,12 @@ +

Comments

+
% This is a comment
+ +

Commands

+
\begin{document}
+\documentstyle[twoside,epsfig]{article}
+\usepackage{epsfig,multicol}
+ +

Math mode

+
$\alpha$
+H$_{2}$O
+45$^{\circ}$C
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-less.html b/docs/_style/prism-master/examples/prism-less.html new file mode 100644 index 0000000..db8a5e6 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-less.html @@ -0,0 +1,70 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Variables

+
@nice-blue: #5B83AD;
+@light-blue: @nice-blue + #111;
+ +

At-rules

+
@media screen and (min-width: 320px) {}
+ +

Mixins

+
.bordered {
+  border-top: dotted 1px black;
+  border-bottom: solid 2px black;
+}
+#menu a {
+  .bordered;
+}
+#header a {
+  color: orange;
+  #bundle > .button;
+}
+ +

Mixins with parameters

+
.foo (@bg: #f5f5f5, @color: #900) {
+  background: @bg;
+  color: @color;
+}
+.bar {
+  .foo();
+}
+.class1 {
+  .mixin(@margin: 20px; @color: #33acfe);
+}
+.class2 {
+  .mixin(#efca44; @padding: 40px);
+}
+ +

Interpolation

+
@mySelector: banner;
+.@{mySelector} {
+  font-weight: bold;
+}
+@property: color;
+.widget {
+  @{property}: #0ee;
+  background-@{property}: #999;
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

At-rules looking like variables

+
@import "some file.less";
+ +

At-rules containing interpolation

+
@import "@{themes}/tidal-wave.less";
+ +

extend is not highlighted consistently

+
nav ul {
+  &:extend(.inline);
+  background: blue;
+}
+.a:extend(.b) {}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-liquid.html b/docs/_style/prism-master/examples/prism-liquid.html new file mode 100644 index 0000000..7497197 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-liquid.html @@ -0,0 +1,75 @@ +

Comments

+
{% comment %}This is a comment{% endcomment %}
+ +

Control Flow

+ +Liquid provides multiple control flow statements. + +

if

+

+{% if customer.name == 'kevin' %}
+  Hey Kevin!
+{% elsif customer.name == 'anonymous' %}
+  Hey Anonymous!
+{% else %}
+  Hi Stranger!
+{% endif %}
+
+ +

unless

+ +The opposite of if – executes a block of code only if a certain condition is not met. + +

+{% unless product.title == 'Awesome Shoes' %}
+These shoes are not awesome.
+{% endunless %}
+
+ +

case

+ +Creates a switch statement to compare a variable with different values. case initializes the switch statement, and when compares its values. + +

+{% assign handle = 'cake' %}
+{% case handle %}
+  {% when 'cake' %}
+    This is a cake
+  {% when 'cookie' %}
+    This is a cookie
+  {% else %}
+    This is not a cake nor a cookie
+{% endcase %}
+
+ +

for

+ +Repeatedly executes a block of code. + +break = Causes the loop to stop iterating when it encounters the break tag. +continue = Causes the loop to skip the current iteration when it encounters the continue tag. + +

+{% for i in (1..10) %}
+  {% if i == 4 %}
+    {% break %}
+  {% elsif i == 6 %}
+    {% continue %}
+  {% else %}
+    {{ i }}
+  {% endif %}
+{% endfor %}
+
+ +

range

+ +

+{% for i in (3..5) %}
+  {{ i }}
+{% endfor %}
+
+{% assign num = 4 %}
+{% for i in (1..num) %}
+  {{ i }}
+{% endfor %}
+
diff --git a/docs/_style/prism-master/examples/prism-lisp.html b/docs/_style/prism-master/examples/prism-lisp.html new file mode 100644 index 0000000..436d5c9 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-lisp.html @@ -0,0 +1,46 @@ +

Comments

+
;; (foo bar)
+ +

Strings

+
(foo "bar")
+ +

With nested symbols

+
(foo "A string with a `symbol ")
+ +

With nested arguments

+
(foo "A string with an ARGUMENT ")
+ +

Quoted symbols

+
(foo #'bar)
+ +

Lisp properties

+
(foo :bar)
+ +

Splices

+
(foo ,bar ,@bar)
+ +

Keywords

+
(let foo (bar arg))
+ +

Declarations

+
(declare foo)
+ +

Booleans

+
(foo t)
+
(foo nil)
+ +

Numbers

+
(foo 1)
+
(foo -1.5)
+ +

Definitions

+
(defvar bar 23)
+
(defcustom bar 23)
+ +

Function definitions

+
(defun multiply-by-seven (number)
+       "Multiply NUMBER by seven."
+       (* 7 number))
+ +

Lambda expressions

+
(lambda (number) (* 7 number))
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-livescript.html b/docs/_style/prism-master/examples/prism-livescript.html new file mode 100644 index 0000000..e9194d3 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-livescript.html @@ -0,0 +1,84 @@ +

Comments

+
# This is a single line comment
+/* This is a
+multi line comment */
+ +

Numbers

+
42
+42km
+3.754km_2
+16~BadFace
+36~azertyuiop0123456789
+ +

Strings and interpolation

+
''
+''''''
+""
+""""""
+'Foo \' bar
+	baz'
+'''Foo \''' bar
+	bar'''
+"Foo #bar \"
+	#{2 + 2}\""
+"""#foobar \""" #{ if /test/ == 'test' then 3 else 4}
+	baz"""
+ +

Regex

+
/foobar/ig
+//
+^foo # foo
+[bar]*bA?z # barbaz
+//m
+ +

Full example

+
# example from Str.ls
+
+split = (sep, str) -->
+  str.split sep
+
+join = (sep, xs) -->
+  xs.join sep
+
+lines = (str) ->
+  return [] unless str.length
+  str.split '\n'
+
+unlines = (.join '\n')
+
+words = (str) ->
+  return [] unless str.length
+  str.split /[ ]+/
+
+unwords = (.join ' ')
+
+chars = (.split '')
+
+unchars = (.join '')
+
+reverse = (str) ->
+  str.split '' .reverse!.join ''
+
+repeat = (n, str) -->
+  result = ''
+  for til n
+    result += str
+  result
+
+capitalize = (str) ->
+  (str.char-at 0).to-upper-case! + str.slice 1
+
+camelize = (.replace /[-_]+(.)?/g, (, c) -> (c ? '').to-upper-case!)
+
+# convert camelCase to camel-case, and setJSON to set-JSON
+dasherize = (str) ->
+    str
+      .replace /([^-A-Z])([A-Z]+)/g, (, lower, upper) ->
+         "#{lower}-#{if upper.length > 1 then upper else upper.to-lower-case!}"
+      .replace /^([A-Z]+)/, (, upper) ->
+         if upper.length > 1 then "#upper-" else upper.to-lower-case!
+
+module.exports = {
+  split, join, lines, unlines, words, unwords, chars, unchars, reverse,
+  repeat, capitalize, camelize, dasherize,
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-lolcode.html b/docs/_style/prism-master/examples/prism-lolcode.html new file mode 100644 index 0000000..3830832 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-lolcode.html @@ -0,0 +1,62 @@ +

Comments

+
BTW Single line comment
+OBTW Multi-line
+comment TLDR
+ +

Strings and special characters

+
"foo :"bar:" baz"
+"foo:)bar:>baz"
+"Interpolation :{works} too!"
+ +

Numbers

+
42
+-42
+123.456
+ +

Variable declaration

+
I HAS A var
+var R "THREE"
+var R 3
+ +

Types

+
MAEK some_expr A YARN
+some_var IS NOW A NUMBR
+ +

Full example

+
OBTW Convert a number to hexadecimal. This
+     is returned as a string.
+TLDR
+HOW IZ I decimal_to_hex YR num
+    I HAS A i ITZ 0
+    I HAS A rem
+    I HAS A hex_num ITZ A BUKKIT
+    I HAS A decimal_num ITZ num
+    IM IN YR num_loop
+        rem R MOD OF decimal_num AN 16
+        I HAS A hex_digit
+        rem, WTF?
+            OMG 10, hex_digit R "A", GTFO
+            OMG 11, hex_digit R "B", GTFO
+            OMG 12, hex_digit R "C", GTFO
+            OMG 13, hex_digit R "D", GTFO
+            OMG 14, hex_digit R "E", GTFO
+            OMG 15, hex_digit R "F", GTFO
+            OMGWTF, hex_digit R rem
+        OIC
+        hex_num HAS A SRS i ITZ hex_digit
+        decimal_num R QUOSHUNT OF decimal_num AN 16
+        BOTH SAEM decimal_num AN 0, O RLY?
+            YA RLY, GTFO
+            NO WAI, i R SUM OF i AN 1
+        OIC
+    IM OUTTA YR num_loop
+    I HAS A hex_string ITZ A YARN
+    IM IN YR string_reverse
+        DIFFRINT i AN BIGGR OF i AN 0, O RLY?
+            YA RLY, GTFO
+        OIC
+        hex_string R SMOOSH hex_string AN hex_num'Z SRS i MKAY
+        i R DIFF OF i AN 1
+    IM OUTTA YR string_reverse
+    FOUND YR hex_string
+IF U SAY SO
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-lua.html b/docs/_style/prism-master/examples/prism-lua.html new file mode 100644 index 0000000..288b767 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-lua.html @@ -0,0 +1,89 @@ +

Comments

+
#!/usr/local/bin/lua
+--
+-- Single line comment
+--[[ Multi line
+comment ]]
+--[====[ Multi line
+comment ]====]
+ +

Strings

+
""
+"Foo\"bar"
+"Foo\
+bar \z
+baz"
+''
+'Foo\'bar'
+'Foo\
+bar \z
+baz'
+[[Multi "line"
+string]]
+[==[Multi [["line"]]
+string]==]
+ +

Numbers

+
3
+345
+0xff
+0xBEBADA
+3, 3., 3.1, .3,
+3e12, 3.e-41, 3.1E+1, .3e1
+0x0.1E
+0xA23p-4
+0X1.921FB54442D18P+1
+ +

Full example

+
function To_Functable(t, fn)
+  return setmetatable(t,
+    {
+     __index = function(t, k) return fn(k) end,
+     __call = function(t, k) return t[k] end
+    })
+end
+
+-- Functable bottles of beer implementation
+
+spell_out = {
+  "One", "Two", "Three", "Four", "Five",
+  "Six", "Seven", "Eight", "Nine", "Ten",
+  [0] = "No more",
+  [-1] = "Lots more"
+}
+
+spell_out = To_Functable(spell_out, function(i) return i end)
+
+bottles = To_Functable({"Just one bottle of beer"},
+                       function(i)
+                         return spell_out(i) .. " bottles of beer"
+                       end)
+
+function line1(i)
+  return bottles(i) .. " on the wall, " .. bottles(i) .. "\n"
+end
+
+line2 = To_Functable({[0] = "Go to the store, Buy some more,\n"},
+                     function(i)
+                       return "Take one down and pass it around,\n"
+                     end)
+
+function line3(i)
+  return bottles(i) .. " on the wall.\n"
+end
+
+function song(n)
+  for i = n, 0, -1 do
+    io.write(line1(i), line2(i), line3(i - 1), "\n")
+  end
+end
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Functions with a single string parameter not using parentheses are not highlighted

+
foobar"param";
diff --git a/docs/_style/prism-master/examples/prism-makefile.html b/docs/_style/prism-master/examples/prism-makefile.html new file mode 100644 index 0000000..45f6f42 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-makefile.html @@ -0,0 +1,263 @@ +

Comments

+
# This is a comment
+include foo # This is another comment
+ +

Targets

+
kbd.o command.o files.o : command.h
+display.o insert.o search.o files.o : buffer.h
+
+.PHONY: clean
+clean:
+        rm *.o temp
+ +

Variables

+
objects = main.o kbd.o command.o display.o \
+          insert.o search.o files.o utils.o
+
+edit : $(objects)
+        cc -o edit $(objects)
+
+$(objects) : defs.h
+
+%oo: $$< $$^ $$+ $$*
+
+foo : bar/lose
+        cd $(@D) && gobble $(@F) > ../$@
+ +

Strings

+
STR = 'A string!'
+
+HELLO = 'hello \
+world'
+
+HELLO2 = "hello \
+world"
+ +

Directives

+
include foo *.mk $(bar)
+
+vpath %.c foo
+
+override define two-lines =
+foo
+$(bar)
+endef
+
+ifeq ($(CC),gcc)
+  libs=$(libs_for_gcc)
+else
+  libs=$(normal_libs)
+endif
+ +

Functions

+
whoami    := $(shell whoami)
+host-type := $(shell arch)
+
+y = $(subst 1,2,$(x))
+
+dirs := a b c d
+files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))
+
+reverse = $(2) $(1)
+foo = $(call reverse,a,b)
+
+$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
+ +

Complete example

+
#!/usr/bin/make -f
+# Generated automatically from Makefile.in by configure.
+# Un*x Makefile for GNU tar program.
+# Copyright (C) 1991 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute
+# it and/or modify it under the terms of the GNU
+# General Public License …
+…
+…
+
+SHELL = /bin/sh
+
+#### Start of system configuration section. ####
+
+srcdir = .
+
+# If you use gcc, you should either run the
+# fixincludes script that comes with it or else use
+# gcc with the -traditional option.  Otherwise ioctl
+# calls will be compiled incorrectly on some systems.
+CC = gcc -O
+YACC = bison -y
+INSTALL = /usr/local/bin/install -c
+INSTALLDATA = /usr/local/bin/install -c -m 644
+
+# Things you might add to DEFS:
+# -DSTDC_HEADERS        If you have ANSI C headers and
+#                       libraries.
+# -DPOSIX               If you have POSIX.1 headers and
+#                       libraries.
+# -DBSD42               If you have sys/dir.h (unless
+#                       you use -DPOSIX), sys/file.h,
+#                       and st_blocks in `struct stat'.
+# -DUSG                 If you have System V/ANSI C
+#                       string and memory functions
+#                       and headers, sys/sysmacros.h,
+#                       fcntl.h, getcwd, no valloc,
+#                       and ndir.h (unless
+#                       you use -DDIRENT).
+# -DNO_MEMORY_H         If USG or STDC_HEADERS but do not
+#                       include memory.h.
+# -DDIRENT              If USG and you have dirent.h
+#                       instead of ndir.h.
+# -DSIGTYPE=int         If your signal handlers
+#                       return int, not void.
+# -DNO_MTIO             If you lack sys/mtio.h
+#                       (magtape ioctls).
+# -DNO_REMOTE           If you do not have a remote shell
+#                       or rexec.
+# -DUSE_REXEC           To use rexec for remote tape
+#                       operations instead of
+#                       forking rsh or remsh.
+# -DVPRINTF_MISSING     If you lack vprintf function
+#                       (but have _doprnt).
+# -DDOPRNT_MISSING      If you lack _doprnt function.
+#                       Also need to define
+#                       -DVPRINTF_MISSING.
+# -DFTIME_MISSING       If you lack ftime system call.
+# -DSTRSTR_MISSING      If you lack strstr function.
+# -DVALLOC_MISSING      If you lack valloc function.
+# -DMKDIR_MISSING       If you lack mkdir and
+#                       rmdir system calls.
+# -DRENAME_MISSING      If you lack rename system call.
+# -DFTRUNCATE_MISSING   If you lack ftruncate
+#                       system call.
+# -DV7                  On Version 7 Unix (not
+#                       tested in a long time).
+# -DEMUL_OPEN3          If you lack a 3-argument version
+#                       of open, and want to emulate it
+#                       with system calls you do have.
+# -DNO_OPEN3            If you lack the 3-argument open
+#                       and want to disable the tar -k
+#                       option instead of emulating open.
+# -DXENIX               If you have sys/inode.h
+#                       and need it 94 to be included.
+
+DEFS =  -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \
+        -DVPRINTF_MISSING -DBSD42
+# Set this to rtapelib.o unless you defined NO_REMOTE,
+# in which case make it empty.
+RTAPELIB = rtapelib.o
+LIBS =
+DEF_AR_FILE = /dev/rmt8
+DEFBLOCKING = 20
+
+CDEBUG = -g
+CFLAGS = $(CDEBUG) -I. -I$(srcdir) $(DEFS) \
+        -DDEF_AR_FILE=\"$(DEF_AR_FILE)\" \
+        -DDEFBLOCKING=$(DEFBLOCKING)
+LDFLAGS = -g
+
+prefix = /usr/local
+# Prefix for each installed program,
+# normally empty or `g'.
+binprefix =
+
+# The directory to install tar in.
+bindir = $(prefix)/bin
+
+# The directory to install the info files in.
+infodir = $(prefix)/info
+
+#### End of system configuration section. ####
+
+SRCS_C  = tar.c create.c extract.c buffer.c   \
+          getoldopt.c update.c gnu.c mangle.c \
+          version.c list.c names.c diffarch.c \
+          port.c wildmat.c getopt.c getopt1.c \
+          regex.c
+SRCS_Y  = getdate.y
+SRCS    = $(SRCS_C) $(SRCS_Y)
+OBJS    = $(SRCS_C:.c=.o) $(SRCS_Y:.y=.o) $(RTAPELIB)
+
+AUX =   README COPYING ChangeLog Makefile.in  \
+        makefile.pc configure configure.in \
+        tar.texinfo tar.info* texinfo.tex \
+        tar.h port.h open3.h getopt.h regex.h \
+        rmt.h rmt.c rtapelib.c alloca.c \
+        msd_dir.h msd_dir.c tcexparg.c \
+        level-0 level-1 backup-specs testpad.c
+
+.PHONY: all
+all:    tar rmt tar.info
+
+tar:    $(OBJS)
+        $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
+
+rmt:    rmt.c
+        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ rmt.c
+
+tar.info: tar.texinfo
+        makeinfo tar.texinfo
+
+.PHONY: install
+install: all
+        $(INSTALL) tar $(bindir)/$(binprefix)tar
+        -test ! -f rmt || $(INSTALL) rmt /etc/rmt
+        $(INSTALLDATA) $(srcdir)/tar.info* $(infodir)
+
+$(OBJS): tar.h port.h testpad.h
+regex.o buffer.o tar.o: regex.h
+# getdate.y has 8 shift/reduce conflicts.
+
+testpad.h: testpad
+        ./testpad
+
+testpad: testpad.o
+        $(CC) -o $@ testpad.o
+
+TAGS:   $(SRCS)
+        etags $(SRCS)
+
+.PHONY: clean
+clean:
+        rm -f *.o tar rmt testpad testpad.h core
+
+.PHONY: distclean
+distclean: clean
+        rm -f TAGS Makefile config.status
+
+.PHONY: realclean
+realclean: distclean
+        rm -f tar.info*
+
+.PHONY: shar
+shar: $(SRCS) $(AUX)
+        shar $(SRCS) $(AUX) | compress \
+          > tar-`sed -e '/version_string/!d' \
+                     -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
+                     -e q
+                     version.c`.shar.Z
+
+.PHONY: dist
+dist: $(SRCS) $(AUX)
+        echo tar-`sed \
+             -e '/version_string/!d' \
+             -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
+             -e q
+             version.c` > .fname
+        -rm -rf `cat .fname`
+        mkdir `cat .fname`
+        ln $(SRCS) $(AUX) `cat .fname`
+        tar chZf `cat .fname`.tar.Z `cat .fname`
+        -rm -rf `cat .fname` .fname
+
+tar.zoo: $(SRCS) $(AUX)
+        -rm -rf tmp.dir
+        -mkdir tmp.dir
+        -rm tar.zoo
+        for X in $(SRCS) $(AUX) ; do \
+            echo $$X ; \
+            sed 's/$$/^M/' $$X \
+            > tmp.dir/$$X ; done
+        cd tmp.dir ; zoo aM ../tar.zoo *
+        -rm -rf tmp.dir
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-markdown.html b/docs/_style/prism-master/examples/prism-markdown.html new file mode 100644 index 0000000..a57eaea --- /dev/null +++ b/docs/_style/prism-master/examples/prism-markdown.html @@ -0,0 +1,86 @@ +

Titles

+
Title 1
+==
+
+Title 2
+-------
+
+# Title 1
+## Title 2
+### Title 3
+#### Title 4
+##### Title 5
+###### Title 6
+
+ +

Bold and italic

+
*Italic*
+**Bold on
+multiple lines**
+*Italic on
+multiple lines too*
+__It also works with underscores__
+_It also works with underscores_
+
+__An empty line
+
+is not allowed__
+
+ +

Links

+
[Prism](http://www.prismjs.com)
+[Prism](http://www.prismjs.com "Prism")
+
+[prism link]: http://www.prismjs.com (Prism)
+[Prism] [prism link]
+
+ +

Lists and quotes

+
* This is
+* an unordered list
+
+1. This is an
+2. ordered list
+
+* *List item in italic*
+* **List item in bold**
+* [List item as a link](http://example.com "This is an example")
+
+> This is a quotation
+>> With another quotation inside
+> _italic here_, __bold there__
+> And a [link](http://example.com)
+
+ +

Code

+
Inline code between backticks `<p>Paragraph</p>`
+
+    some_code(); /* Indented
+    with four spaces */
+
+	some_code(); /* Indented
+	with a tab */
+
+ +

Raw HTML

+
> This is a quotation
+> Containing <strong>raw HTML</strong>
+
+<p>*Italic text inside HTML tag*</p>
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Nesting of elements is not fully supported

+
_ **bold** inside italic DOESN'T work _
+__ but *italic* inside bold DOES work __
+
+[Link partially *italic* DOESN'T work](http://example.com)
+_ [But link inside italic DOES work](http://example.com) _
+
+[Link partially **bold** DOESN'T work](http://example.com)
+__ [But link inside bold DOES work](http://example.com) __
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-markup.html b/docs/_style/prism-master/examples/prism-markup.html new file mode 100644 index 0000000..ac00e7f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-markup.html @@ -0,0 +1,77 @@ +

Empty tag

+
<p></p>
+ +

Tag that spans multiple lines

+
<p
+>hello!
+</p>
+ +

Name-attribute pair

+
<p></p>
+ +

Name-attribute pair without quotes

+
<p class=prism></p>
+ +

Attribute without value

+
<p data-foo></p>
+<p data-foo ></p>
+
+ +

Namespaces

+
<html:p foo:bar="baz" foo:weee></html:p>
+ +

XML prolog

+
<?xml version="1.0" encoding="utf-8"?>
+<svg></svg>
+ +

DOCTYPE

+
<!DOCTYPE html>
+<html></html>
+ +

CDATA section

+
<ns1:description><![CDATA[
+  CDATA is <not> magical.
+]]></ns1:description>
+ +

Comment

+
<!-- I'm a comment -->
+And i'm not
+ +

Entities

+
&amp; &#x2665; &#160; &#x152;
+ +

Embedded JS and CSS

+
<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8" />
+	<title>I can haz embedded CSS and JS</title>
+	<style>
+		@media print {
+			p { color: red !important; }
+		}
+	</style>
+</head>
+<body>
+	<h1>I can haz embedded CSS and JS</h1>
+	<script>
+	if (true) {
+		console.log('foo');
+	}
+	</script>
+
+</body>
+</html>
+ +

Invalid HTML

+
<l </ul>
+ +

Multi-line attribute values

+
<p title="foo
+bar
+baz">
+ +

XML tags with non-ASCII characters

+
<Läufer>foo</Läufer>
+<tag läufer="läufer">bar</tag>
+<läufer:tag>baz</läufer:tag>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-matlab.html b/docs/_style/prism-master/examples/prism-matlab.html new file mode 100644 index 0000000..e78abe3 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-matlab.html @@ -0,0 +1,52 @@ +

Strings

+
myString = 'Hello, world';
+otherString = 'You''re right';
+ +

Comments

+
% Single line comment
+%{ Multi-line
+comment }%
+ +

Numbers

+
x = 325.499
+realmax + .0001e+308
+e = 1 - 3*(4/3 - 1)
+b = 1e-16 + 1 - 1e-16;
+x = 2 + 3i;
+z =
+   4.7842 -1.0921i   0.8648 -1.5931i   1.2616 -2.2753i
+   2.6130 -0.0941i   4.8987 -2.3898i   4.3787 -3.7538i
+   4.4007 -7.1512i   1.3572 -5.2915i   3.6865 -0.5182i
+
+ +

Control flow

+
if rem(a, 2) == 0
+    disp('a is even')
+    b = a/2;
+end
+switch dayString
+   case 'Monday'
+      disp('Start of the work week')
+   case 'Tuesday'
+      disp('Day 2')
+   case 'Wednesday'
+      disp('Day 3')
+   case 'Thursday'
+      disp('Day 4')
+   case 'Friday'
+      disp('Last day of the work week')
+   otherwise
+      disp('Weekend!')
+end
+n = 1;
+nFactorial = 1;
+while nFactorial < 1e100
+    n = n + 1;
+    nFactorial = nFactorial * n;
+end
+ +

Functions

+
q = integral(sqr,0,1);
+y = parabola(x)
+mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y));
+[x,y] = mygrid(pi,2*pi);
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-mel.html b/docs/_style/prism-master/examples/prism-mel.html new file mode 100644 index 0000000..e887975 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-mel.html @@ -0,0 +1,137 @@ +

Comments

+
// This is a comment
+ +

Strings

+
"This is a string"
+"foo \"bar\" baz"
+ +

Numbers

+
42
+3.14159
+0xA2F
+ +

Variables

+
$x
+$floaty5000
+$longDescriptiveName
+$name_with_underscores
+$_line
+
+float $param;
+int $counter;
+string $name;
+vector $position;
+ +

Arrays, vectors and matrices

+
string $array[3] = {"first\n", "second\n", "third\n"};
+print($array[0]); // Prints "first\n"
+print($array[1]); // Prints "second\n"
+print($array[2]); // Prints "third\n"
+
+vector $roger = <<3.0, 7.7, 9.1>>;
+vector $more = <<4.5, 6.789, 9.12356>>;
+// Assign a vector to variable $test:
+vector $test = <<3.0, 7.7, 9.1>>;
+$test = <<$test.x, 5.5, $test.z>>
+// $test is now <<3.0, 5.5, 9.1>>
+
+matrix $a3[3][4] = <<2.5, 4.5, 3.25, 8.05;
+ 1.12, 1.3, 9.5, 5.2;
+ 7.23, 6.006, 2.34, 4.67>>
+ +

Commands

+
pickWalk -d down;
+string $mySelection[] = `ls -selection`;
+
+setAttr ($mySelection[0]+".particleRenderType") 5;
+
+addAttr -is true -ln "spriteTwist" -at "float" -min -180 -max 180 -dv 0.0 blue_nParticleShape;
+ +

Full example

+
// From http://help.autodesk.com/view/MAYAUL/2015/ENU/?guid=Example_scripts_Dynamics_Time_Playback
+// Alias Script File
+// MODIFY THIS AT YOUR OWN RISK
+//
+// Creation Date: 8 May 1996
+// Author: rh
+//
+// Description:
+// Playback from frame 0 to frame <n> and return the
+// 		the playback rate in frames/sec. If a negative frame
+// count is given, this indicates silent mode. In silent
+// mode, no output is printed.
+//
+// This version is intended for use in batch tests of dynamics.
+// It requests particle and rigid body positions every frame.
+//
+// RETURN
+// Frame rate in frames/sec
+//
+global proc float dynTimePlayback( float $frames )
+{
+ int $silent;
+ // Get the list of particle shapes.
+ //
+ string $particleObjects[] = `ls -type particle`;
+ int $particleCount = size( $particleObjects );
+ // Get the list of transforms.
+ // This will include rigid bodies.
+ //
+ string $transforms[] = `ls -tr`;
+ int $trCount = size( $transforms );
+ 	// Check for negative $frames. This indicates
+ // $silent mode.
+ //
+ if ($frames < 0)
+ {
+ $silent = 1;
+ $frames = -$frames;
+ }
+ else
+ {
+ $silent = 0;
+ }
+ // Setup the playback options.
+ //
+ playbackOptions -min 1 -max $frames -loop "once";
+ currentTime -edit 0;
+ // Playback the animation using the timerX command
+ // to compute the $elapsed time.
+ //
+ float $startTime, $elapsed;
+ $startTime = `timerX`;
+// play -wait;
+ int $i;
+ for ($i = 1; $i < $frames; $i++ )
+ {
+ // Set time
+ //
+ currentTime -e $i;
+ int $obj;
+ // Request count for every particle object.
+ //
+ for ($obj = 0; $obj < $particleCount; $obj++)
+ {
+			string $cmd = "getAttr " + $particleObjects[$obj]+".count";
+ eval( $cmd );
+ }
+ // Request position for every transform
+		// (includes every rigid body).
+ //
+ for ($obj = 0; $obj < $trCount; $obj++)
+ {
+ string $cmd = "getAttr " + $transforms[$obj]+".translate";
+ eval ($cmd);
+ }
+ }
+ $elapsed = `timerX -st $startTime`;
+ // Compute the playback frame $rate. Print results.
+ //
+ float $rate = ($elapsed == 0 ? 0.0 : $frames / $elapsed) ;
+ if ( ! $silent)
+ {
+ print( "Playback time: " + $elapsed + " secs\n" );
+ print( "Playback $rate: " + $rate + " $frames/sec\n" );
+ }
+ return ( $rate );
+} // timePlayback //
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-mizar.html b/docs/_style/prism-master/examples/prism-mizar.html new file mode 100644 index 0000000..98d626c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-mizar.html @@ -0,0 +1,45 @@ +

Full example

+ +
:: Example from http://webdocs.cs.ualberta.ca/~piotr/Mizar/Dagstuhl97/
+environ
+vocabulary SCM;
+constructors ARYTHM, PRE_FF, NAT_1, REAL_1;
+notation ARYTHM, PRE_FF, NAT_1;
+requirements ARYTHM;
+theorems REAL_1, PRE_FF, NAT_1, AXIOMS, CQC_THE1;
+schemes NAT_1;
+begin
+
+P: for k being Nat
+	st for n being Nat st n < k holds Fib (n+1) ≥ n
+		holds Fib (k+1) ≥ k
+proof let k be Nat; assume
+IH: for n being Nat st n < k holds Fib (n+1) ≥ n;
+	per cases;
+		suppose k ≤ 1; then k = 0 or k = 0+1 by CQC_THE1:2;
+			hence Fib (k+1) ≥ k by PRE_FF:1;
+		suppose 1 < k; then
+			1+1 ≤ k by NAT_1:38; then
+			consider m being Nat such that
+		A: k = 1+1+m by NAT_1:28;
+			thus Fib (k+1) ≥ k proof
+				per cases by NAT_1:19;
+				suppose S1: m = 0;
+					Fib (0+1+1+1) = Fib(0+1) + Fib(0+1+1) by PRE_FF:1
+					              = 1 + 1 by PRE_FF:1;
+					hence Fib (k+1) ≥ k by A, S1;
+				suppose m > 0; then
+					m+1 > 0+1 by REAL_1:59; then
+					m ≥ 1 by NAT_1:38; then
+				B: m+(m+1) ≥ m+1+1 by REAL_1:49;
+				C: k = m+1+1 by A, AXIOMS:13;
+				   m < m+1 & m+1 < m+1+1 by REAL_1:69; then
+				   m < k & m+1 < k by C, AXIOMS:22; then
+				D: Fib (m+1) ≥ m & Fib (m+1+1) ≥ m+1 by IH;
+				   Fib (m+1+1+1) = Fib (m+1) + Fib (m+1+1) by PRE_FF:1; then
+				   Fib (m+1+1+1) ≥ m+(m+1) by D, REAL_1:55;
+		hence Fib(k+1) ≥ k by C, B, AXIOMS:22;
+	end;
+end;
+
+for n being Nat holds Fib(n+1) ≥ n from Comp_Ind(P);
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-monkey.html b/docs/_style/prism-master/examples/prism-monkey.html new file mode 100644 index 0000000..6716a9a --- /dev/null +++ b/docs/_style/prism-master/examples/prism-monkey.html @@ -0,0 +1,74 @@ +

Comments

+
' This is a comment
+
+#Rem            ' This is the start of a comment block
+Some comment    ' We are inside the comment block
+#End
+ +

Strings

+
"Hello World"
+"~qHello World~q"
+"~tIndented~n"
+ +

Numbers

+
0
+1234
+$3D0DEAD
+$CAFEBABE
+
+.0
+0.0
+.5
+0.5
+1.0
+1.5
+1.00001
+3.14159265
+ +

Variable types

+
Local myVariable:Bool = True
+Local myVariable? = True
+Local myVariable:Int = 1024
+Local myVariable% = 1024
+Local myVariable:Float = 3.141516
+Local myVariable# = 3.141516
+Local myVariable:String = "Hello world"
+Local myVariable$ = "Hello world"
+ +

Full example

+
Import mojo
+
+Class MyApp Extends App
+
+    Method OnCreate()
+
+        SetUpdateRate 60
+
+    End
+
+    Method OnRender()
+
+        Local date:=GetDate()
+
+        Local months:=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
+
+        Local day:=("0"+date[2])[-2..]
+        Local month:=months[date[1]-1]
+        Local year:=date[0]
+        Local hour:=("0"+date[3])[-2..]
+        Local min:=("0"+date[4])[-2..]
+        Local sec:=("0"+date[5])[-2..] + "." + ("00"+date[6])[-3..]
+
+        Local now:=hour+":"+min+":"+sec+"  "+day+" "+month+" "+year
+
+        Cls
+        DrawText now,DeviceWidth/2,DeviceHeight/2,.5,.5
+    End
+
+End
+
+Function Main()
+
+    New MyApp
+
+End
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-n4js.html b/docs/_style/prism-master/examples/prism-n4js.html new file mode 100644 index 0000000..19e5a6d --- /dev/null +++ b/docs/_style/prism-master/examples/prism-n4js.html @@ -0,0 +1,114 @@ +

Keywords

+

+class C {..}
+interface I {..}
+
+foo(c: C, i: I) {
+    c instanceof C; // ok
+    c instanceof I; // ok
+}
+
+ +

Annotations

+

+// Final Methods
+@Final
+private tasks = new Map<string,Task>();
+
+// Redefinition of Members
+@Override
+public async size(): int {
+  …
+}
+
+// Dependency Injection
+@Binder
+@Bind(Storage,StorageInMemory)
+class InMemoryBinder {}
+
+@GenerateInjector @UseBinder(InMemoryBinder)
+export public class TaskManagerTest {
+  …
+}
+
+ +

Full example

+

+// A Web User Interface in HTML
+// NOTE: requires full example project bundled with N4JS IDE to run.
+
+import { TaskManager } from "TaskManager";
+import {Application, Response } from "express";
+import express from "express";
+import { Todo } from "model";
+
+
+export class WebUI {
+
+     private app: Application;
+
+     @Inject
+     private manager: TaskManager;
+
+     public start() {
+
+          this.app = express();
+
+          this.app.get('/', async (req, res) => {
+               let page = await this.renderHomePage();
+               res.send(page);
+          });
+
+          this.app.get("/clear", async (req, res) => {
+               await this.manager.clear();
+               redirect(res, '/');
+          });
+
+          this.app.get("/create", async (req, res) => {
+               let values = req.query as ~Object with {type: string, label: string};
+               if (values && values.type === 'Todo' && values.label && values.label.length > 0) {
+                    await this.manager.createTodo(values.label);
+               }
+               redirect(res, '/');
+          });
+
+          this.app.listen(4000, '0.0.0.0', 511, function() {
+               console.log("HTML server listening on http://localhost:4000/");
+          });
+     }
+
+     protected async renderHomePage(): string {
+          let tasks = await this.manager.getTasks();
+          let todos = tasks.filter((task) => task instanceof Todo);
+          return `
+
+<html>
+<body>
+     Your to-do's:
+     <ul>
+     ${
+          todos.length === 0 ? '<li><em>none</em></li>\n'
+          : todos.map((task) =>
+               '<li>' + task.label + ' <small>(id: ' + task.id + ')</small></li>'
+          ).join('\n')
+     }
+     </ul>
+     <hr/>
+     <form action="/create" method="get">
+     <input type="hidden" name="type" value="Todo">
+     Label: <input type="text" name="label"><br>
+     <input type="submit" value="Create Todo">
+     </form>
+     <hr/>
+     <a href="/clear">[Clear All]</a>
+</body>
+</html>
+`;
+     }
+}
+
+function redirect(res: Response, url: string) {
+     res.header('Cache-Control', 'no-cache');
+     res.redirect(301, url);
+}
+
diff --git a/docs/_style/prism-master/examples/prism-nasm.html b/docs/_style/prism-master/examples/prism-nasm.html new file mode 100644 index 0000000..c1b7c92 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-nasm.html @@ -0,0 +1,74 @@ +

Comments

+
; This is a comment
+ +

Labels

+
label1:     ; a non-local label
+.local:     ; this is really label1.local
+..@foo:     ; this is a special symbol
+label2:     ; another non-local label
+.local:     ; this is really label2.local
+
+ +

Registers

+
st0
+st1
+ax
+rax
+zmm4
+ +

Strings

+

+mov eax,'abcd'
+
+db    'hello'               ; string constant
+db    'h','e','l','l','o'   ; equivalent character constants
+dd    'ninechars'           ; doubleword string constant
+dd    'nine','char','s'     ; becomes three doublewords
+db    'ninechars',0,0,0     ; and really looks like this
+
+db `\u263a`            ; UTF-8 smiley face
+db `\xe2\x98\xba`      ; UTF-8 smiley face
+db 0E2h, 098h, 0BAh    ; UTF-8 smiley face
+
+ +

Numbers

+
mov     ax,200          ; decimal
+mov     ax,0200         ; still decimal
+mov     ax,0200d        ; explicitly decimal
+mov     ax,0d200        ; also decimal
+mov     ax,0c8h         ; hex
+mov     ax,$0c8         ; hex again: the 0 is required
+mov     ax,0xc8         ; hex yet again
+mov     ax,0hc8         ; still hex
+mov     ax,310q         ; octal
+mov     ax,310o         ; octal again
+mov     ax,0o310        ; octal yet again
+mov     ax,0q310        ; octal yet again
+mov     ax,11001000b    ; binary
+
+db    -0.2                    ; "Quarter precision"
+dw    -0.5                    ; IEEE 754r/SSE5 half precision
+dd    1.2                     ; an easy one
+dd    0x1p+2                  ; 1.0x2^2 = 4.0
+dq    0x1p+32                 ; 1.0x2^32 = 4 294 967 296.0
+dq    1.e10                   ; 10 000 000 000.0
+dq    1.e+10                  ; synonymous with 1.e10
+dq    1.e-10                  ; 0.000 000 000 1
+dt    3.141592653589793238462 ; pi
+do    1.e+4000                ; IEEE 754r quad precision
+
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Numbers with underscores

+
mov     ax,1100_1000b
+mov     ax,1100_1000y
+mov     ax,0b1100_1000
+mov     ax,0y1100_1000
+
+dd    1.222_222_222
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-nginx.html b/docs/_style/prism-master/examples/prism-nginx.html new file mode 100644 index 0000000..49d1466 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-nginx.html @@ -0,0 +1,25 @@ +

Comments

+
# This is a comment
+ +

Variables

+
fastcgi_param SERVER_NAME $server_name;
+ +

Server Block

+

+server { # simple reverse-proxy
+  listen       80;
+  server_name  domain2.com www.domain2.com;
+  access_log   logs/domain2.access.log  main;
+  
+  # serve static files
+  
+  location ~ ^/(images|javascript|js|css|flash|media|static)/  {
+    root    /var/www/virtual/big.server.com/htdocs;
+    expires 30d;
+  }
+
+  # pass requests for dynamic content to rails/turbogears/zope, et al
+  location / {
+    proxy_pass      http://127.0.0.1:8080;
+  }
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-nim.html b/docs/_style/prism-master/examples/prism-nim.html new file mode 100644 index 0000000..c661125 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-nim.html @@ -0,0 +1,222 @@ +

Comments

+
# This is a comment
+ +

Strings

+
"This is a string."
+"This is a string with \"quotes\" in it."
+"""This is
+a "multi-line"
+string."""
+""""A long string within quotes.""""
+R"This is a raw string."
+r"Some ""quotes"" inside a raw string."
+r"""Raw strings
+can also be multi-line."""
+foo"This is a generalized raw string literal."
+bar"""This is also
+a generalized raw string literal."""
+ +

Characters

+
'a'
+'\''
+'\t'
+'\15'
+'\xFC'
+ +

Numbers

+
42
+0xaf
+0xf_2_c
+0o07
+0b1111_0000
+0B0_10001110100_0000101001000111101011101111111011000101001101001001'f64
+9_000'u
+32.
+32.1f32
+32.e-5
+32.2e+2
+2'i16
+2i16
+0xfe'f32
+ +

Full example

+
# Example from http://nim-by-example.github.io/oop_macro/
+import macros
+
+macro class*(head: expr, body: stmt): stmt {.immediate.} =
+  # The macro is immediate so that it doesn't
+  # resolve identifiers passed to it
+
+  var typeName, baseName: NimNode
+
+  if head.kind == nnkIdent:
+    # `head` is expression `typeName`
+    # echo head.treeRepr
+    # --------------------
+    # Ident !"Animal"
+    typeName = head
+
+  elif head.kind == nnkInfix and $head[0] == "of":
+    # `head` is expression `typeName of baseClass`
+    # echo head.treeRepr
+    # --------------------
+    # Infix
+    #   Ident !"of"
+    #   Ident !"Animal"
+    #   Ident !"RootObj"
+    typeName = head[1]
+    baseName = head[2]
+
+  else:
+    quit "Invalid node: " & head.lispRepr
+
+  # echo treeRepr(body)
+  # --------------------
+  # StmtList
+  #   VarSection
+  #     IdentDefs
+  #       Ident !"name"
+  #       Ident !"string"
+  #       Empty
+  #     IdentDefs
+  #       Ident !"age"
+  #       Ident !"int"
+  #       Empty
+  #   MethodDef
+  #     Ident !"vocalize"
+  #     Empty
+  #     Empty
+  #     FormalParams
+  #       Ident !"string"
+  #     Empty
+  #     Empty
+  #     StmtList
+  #       StrLit ...
+  #   MethodDef
+  #     Ident !"age_human_yrs"
+  #     Empty
+  #     Empty
+  #     FormalParams
+  #       Ident !"int"
+  #     Empty
+  #     Empty
+  #     StmtList
+  #       DotExpr
+  #         Ident !"this"
+  #         Ident !"age"
+
+  # create a new stmtList for the result
+  result = newStmtList()
+
+  # var declarations will be turned into object fields
+  var recList = newNimNode(nnkRecList)
+
+  # Iterate over the statements, adding `this: T`
+  # to the parameters of functions
+  for node in body.children:
+    case node.kind:
+
+      of nnkMethodDef, nnkProcDef:
+        # inject `this: T` into the arguments
+        let p = copyNimTree(node.params)
+        p.insert(1, newIdentDefs(ident"this", typeName))
+        node.params = p
+        result.add(node)
+
+      of nnkVarSection:
+        # variables get turned into fields of the type.
+        for n in node.children:
+          recList.add(n)
+
+      else:
+        result.add(node)
+
+  # The following prints out the AST structure:
+  #
+  # import macros
+  # dumptree:
+  #   type X = ref object of Y
+  #     z: int
+  # --------------------
+  # TypeSection
+  #   TypeDef
+  #     Ident !"X"
+  #     Empty
+  #     RefTy
+  #       ObjectTy
+  #         Empty
+  #         OfInherit
+  #           Ident !"Y"
+  #         RecList
+  #           IdentDefs
+  #             Ident !"z"
+  #             Ident !"int"
+  #             Empty
+
+  result.insert(0,
+    if baseName == nil:
+      quote do:
+        type `typeName` = ref object of RootObj
+    else:
+      quote do:
+        type `typeName` = ref object of `baseName`
+  )
+  # Inspect the tree structure:
+  #
+  # echo result.treeRepr
+  # --------------------
+  # StmtList
+  #   StmtList
+  #     TypeSection
+  #       TypeDef
+  #         Ident !"Animal"
+  #         Empty
+  #         RefTy
+  #           ObjectTy
+  #             Empty
+  #             OfInherit
+  #               Ident !"RootObj"
+  #             Empty   <= We want to replace this
+  #   MethodDef
+  #   ...
+
+  result[0][0][0][2][0][2] = recList
+
+  # Lets inspect the human-readable version of the output
+  # echo repr(result)
+  # Output:
+  #  type
+  #    Animal = ref object of RootObj
+  #      name: string
+  #      age: int
+  #
+  #  method vocalize(this: Animal): string =
+  #    "..."
+  #
+  #  method age_human_yrs(this: Animal): int =
+  #    this.age
+
+# ---
+
+class Animal of RootObj:
+  var name: string
+  var age: int
+  method vocalize: string = "..."
+  method age_human_yrs: int = this.age # `this` is injected
+
+class Dog of Animal:
+  method vocalize: string = "woof"
+  method age_human_yrs: int = this.age * 7
+
+class Cat of Animal:
+  method vocalize: string = "meow"
+
+# ---
+
+var animals: seq[Animal] = @[]
+animals.add(Dog(name: "Sparky", age: 10))
+animals.add(Cat(name: "Mitten", age: 10))
+
+for a in animals:
+  echo a.vocalize()
+  echo a.age_human_yrs()
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-nix.html b/docs/_style/prism-master/examples/prism-nix.html new file mode 100644 index 0000000..9015776 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-nix.html @@ -0,0 +1,46 @@ +

Comments

+
#
+# Single line comment
+/* Multi-line
+comment */
+ +

String

+
""
+"foo\"bar"
+"foo
+bar"
+
+''''
+''foo'''bar''
+''
+foo
+bar
+''
+ +

String interpolation

+
"foo${42}bar"
+"foo\${42}bar" # This is not interpolated
+''foo${42}bar''
+''foo''${42}bar'' # This is not interpolated
+ +

URLs and paths

+
ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz
+http://example.org/foo.tar.bz2
+/bin/sh
+./builder.sh
+~/foo.bar
+ +

Integers, booleans and null

+
0
+42
+
+true
+false
+
+null
+ +

Builtin functions

+
name = baseNameOf (toString url);
+imap =
+	if builtins ? genList then
+		f: list: genList (n: f (n + 1) (elemAt list n)) (length list)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-nsis.html b/docs/_style/prism-master/examples/prism-nsis.html new file mode 100644 index 0000000..193791b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-nsis.html @@ -0,0 +1,18 @@ +

Comments

+
; Single line comment
+# Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+ +

Variables

+
LicenseLangString myLicenseData ${LANG_ENGLISH} "bigtest.nsi"
+LicenseData $(myLicenseData)
+StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
+ +

Compiler commands

+
!define VERSION "1.0.3"
+!insertmacro MyFunc ""
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-objectivec.html b/docs/_style/prism-master/examples/prism-objectivec.html new file mode 100644 index 0000000..025a8d7 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-objectivec.html @@ -0,0 +1,44 @@ +

Full example

+
#import <UIKit/UIKit.h>
+#import "Dependency.h"
+
+@protocol WorldDataSource
+@optional
+- (NSString*)worldName;
+@required
+- (BOOL)allowsToLive;
+@end
+
+@interface Test : NSObject <HelloDelegate, WorldDataSource> {
+  NSString *_greeting;
+}
+
+@property (nonatomic, readonly) NSString *greeting;
+- (IBAction) show;
+@end
+
+@implementation Test
+
+@synthesize test=_test;
+
++ (id) test {
+  return [self testWithGreeting:@"Hello, world!\nFoo bar!"];
+}
+
++ (id) testWithGreeting:(NSString*)greeting {
+  return [[[self alloc] initWithGreeting:greeting] autorelease];
+}
+
+- (id) initWithGreeting:(NSString*)greeting {
+  if ( (self = [super init]) ) {
+    _greeting = [greeting retain];
+  }
+  return self;
+}
+
+- (void) dealloc {
+  [_greeting release];
+  [super dealloc];
+}
+
+@end
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-ocaml.html b/docs/_style/prism-master/examples/prism-ocaml.html new file mode 100644 index 0000000..0534b1d --- /dev/null +++ b/docs/_style/prism-master/examples/prism-ocaml.html @@ -0,0 +1,59 @@ +

Comments

+
(* Simple comment *)
+(* Multi-line
+comment *)
+ +

Numbers

+
42
+3.14159
+42.
+2.4E+2
+10_452_102
+0xf4 0xff_10_41
+0o427
+0b1100_1111_0000
+ +

Strings and characters

+
"Simple string."
+"String with \"quotes\" in it."
+'c' `c`
+'\'' `\``
+'\123' `\123`
+'\xf4'
+ +

Full example

+
module Make_interval(Endpoint : Comparable) = struct
+
+    type t = | Interval of Endpoint.t * Endpoint.t
+             | Empty
+
+    (** [create low high] creates a new interval from [low] to
+        [high].  If [low > high], then the interval is empty *)
+    let create low high =
+      if Endpoint.compare low high > 0 then Empty
+      else Interval (low,high)
+
+    (** Returns true iff the interval is empty *)
+    let is_empty = function
+      | Empty -> true
+      | Interval _ -> false
+
+    (** [contains t x] returns true iff [x] is contained in the
+        interval [t] *)
+    let contains t x =
+      match t with
+      | Empty -> false
+      | Interval (l,h) ->
+        Endpoint.compare x l >= 0 && Endpoint.compare x h <= 0
+
+    (** [intersect t1 t2] returns the intersection of the two input
+        intervals *)
+    let intersect t1 t2 =
+      let min x y = if Endpoint.compare x y <= 0 then x else y in
+      let max x y = if Endpoint.compare x y >= 0 then x else y in
+      match t1,t2 with
+      | Empty, _ | _, Empty -> Empty
+      | Interval (l1,h1), Interval (l2,h2) ->
+        create (max l1 l2) (min h1 h2)
+
+  end ;;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-opencl.html b/docs/_style/prism-master/examples/prism-opencl.html new file mode 100644 index 0000000..f901230 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-opencl.html @@ -0,0 +1,83 @@ +

+ To use this language, use the class "language-opencl" for OpenCL kernel code. + Host code is automatically highlighted in "language-c" + respectively "language-cpp" classes. +

+ +

OpenCL host code

+
// OpenCL functions, constants, etc. are also highlighted in OpenCL host code in the c or cpp language
+cl::Event KernelFilterImages::runSingle(const cl::Image2D& imgSrc, SPImage2D& imgDst)
+{
+	const size_t rows = imgSrc.getImageInfo();
+	const size_t cols = imgSrc.getImageInfo();
+
+	ASSERT(rows > 0 && cols > 0, "The image object seems to be invalid, no rows/cols set");
+	ASSERT(imgSrc.getImageInfo().image_channel_data_type == CL_FLOAT, "Only float type images are supported");
+	ASSERT(imgSrc.getInfo() == CL_MEM_READ_ONLY || imgSrc.getInfo() == CL_MEM_READ_WRITE, "Can't read the input image");
+
+	imgDst = std::make_shared(*context, CL_MEM_READ_WRITE, cl::ImageFormat(CL_R, CL_FLOAT), cols, rows);
+
+	cl::Kernel kernel(*program, "filter_single");
+	kernel.setArg(0, imgSrc);
+	kernel.setArg(1, *imgDst);
+	kernel.setArg(2, bufferKernel1);
+	kernel.setArg(3, kernel1.rows);
+	kernel.setArg(4, kernel1.rows / 2);
+	kernel.setArg(5, kernel1.cols);
+	kernel.setArg(6, kernel1.cols / 2);
+	kernel.setArg(7, border);
+
+	cl::Event eventFilter;
+	const cl::NDRange global(cols, rows);
+	queue->enqueueNDRangeKernel(kernel, cl::NullRange, global, cl::NullRange, &events, &eventFilter);
+}
+ +

OpenCL kernel code

+
// CLK_ADDRESS_CLAMP_TO_EDGE = aaa|abcd|ddd
+constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
+typedef float type_single;
+
+type_single filter_sum_single_3x3(read_only image2d_t imgIn,
+                                  constant float* filterKernel,
+                                  const int2 coordBase,
+                                  const int border)
+{
+    type_single sum = (type_single)(0.0f);
+    const int rows = get_image_height(imgIn);
+    const int cols = get_image_width(imgIn);
+    int2 coordCurrent;
+    int2 coordBorder;
+    float color;
+
+    // Image patch is row-wise accessed
+    // Filter kernel is centred in the middle
+    #pragma unroll
+    for (int y = -ROWS_HALF_3x3; y <= ROWS_HALF_3x3; ++y)       // Start at the top left corner of the filter
+    {
+        coordCurrent.y = coordBase.y + y;
+        #pragma unroll
+        for (int x = -COLS_HALF_3x3; x <= COLS_HALF_3x3; ++x)   // And end at the bottom right corner
+        {
+            coordCurrent.x = coordBase.x + x;
+            coordBorder = borderCoordinate(coordCurrent, rows, cols, border);
+            color = read_imagef(imgIn, sampler, coordBorder).x;
+
+            const int idx = (y + ROWS_HALF_3x3) * COLS_3x3 + x + COLS_HALF_3x3;
+            sum += color * filterKernel[idx];
+        }
+    }
+
+    return sum;
+}
+
+kernel void filter_single_3x3(read_only image2d_t imgIn,
+                              write_only image2d_t imgOut,
+                              constant float* filterKernel,
+                              const int border)
+{
+    int2 coordBase = (int2)(get_global_id(0), get_global_id(1));
+
+    type_single sum = filter_sum_single_3x3(imgIn, filterKernel, coordBase, border);
+
+    write_imagef(imgOut, coordBase, sum);
+}
diff --git a/docs/_style/prism-master/examples/prism-oz.html b/docs/_style/prism-master/examples/prism-oz.html new file mode 100644 index 0000000..d70ec2e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-oz.html @@ -0,0 +1,89 @@ +

Comments

+
%
+% Foobar
+
+/* Foo
+bar */
+ +

Strings

+
""
+"Foo \"bar\" baz"
+ +

Numbers

+
0
+42
+0154
+0xBadFace
+0B0101
+3.14159
+2e8
+3.E~7
+4.8E12
+&0
+&a
+&\n
+&\124
+ +

Functions and procedures

+
proc {Max X Y Z}
+{Browse Z}
+f(M Y)
+ +

Full example

+
proc {DisMember X Ys}
+   dis Ys = X|_ [] Yr in Ys = _|Yr {DisMember X Yr} end
+end
+
+class DataBase from BaseObject
+   attr d
+   meth init
+      d := {NewDictionary}
+   end
+   meth dic($) @d end
+   meth tell(I)
+      case {IsFree I.1} then
+         raise database(nonground(I)) end
+      else
+         Is = {Dictionary.condGet @d I.1 nil} in
+         {Dictionary.put @d I.1 {Append Is [I]}}
+      end
+   end
+   meth ask(I)
+      case {IsFree I} orelse {IsFree I.1} then
+         {DisMember I {Flatten {Dictionary.items @d}}}
+      else
+         {DisMember I {Dictionary.condGet @d I.1 nil}}
+      end
+   end
+   meth entries($)
+      {Dictionary.entries @d}
+   end
+end
+
+declare
+proc {Dynamic ?Pred}
+   Pred = {New DataBase init}
+end
+proc {Assert P I}
+   {P tell(I)}
+end
+proc {Query P I}
+   {P ask(I)}
+end
+
+EdgeP = {Dynamic}
+{ForAll
+[edge(1 2)
+ edge(2 1)   % Cycle
+ edge(2 3)
+ edge(3 4)
+ edge(2 5)
+ edge(5 6)
+ edge(4 6)
+ edge(6 7)
+ edge(6 8)
+ edge(1 5)
+ edge(5 1)  % Cycle
+]
+proc {$ I} {Assert EdgeP I} end
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-parigp.html b/docs/_style/prism-master/examples/prism-parigp.html new file mode 100644 index 0000000..029302b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-parigp.html @@ -0,0 +1,20 @@ +

Comments

+
\\ Single line comment
+/* Multi line
+comment */
+ +

Strings

+
""
+"Foo \"bar\" baz"
+ +

Numbers

+
0.
+42
+3 . 14 15 9
+5.2 E +12
+.89
+ +

Ignored whitespaces

+
p r i n t ("hello")
+if err(1/i, E, print (E))
+a + = b \ / c
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-parser.html b/docs/_style/prism-master/examples/prism-parser.html new file mode 100644 index 0000000..4b4e9c0 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-parser.html @@ -0,0 +1,88 @@ +

Comments

+
$foo[bar] # Some comment
+ +

Variables and functions

+
@navigation[]
+$sections[^table::load[sections.cfg]]
+$sections.uri
+ +

Literals

+
$foo(3+$bar)
+^switch[$sMode]{
+	^case[def]{$result(true)}
+}
+^if(in "/news/"){}
+ +

Escape sequences

+
^^
+^"
+^;
+ +

Embedded in markup

+
<nav>
+	<ul>
+	^sections.menu{
+		<li>
+			<a href="$sections.uri">$sections.name</a>
+		</li>
+	}
+	</ul>
+</nav>
+ +

Full example

+
@CLASS
+MyTable
+
+@create[uParam]
+^switch[$uParam.CLASS_NAME]{
+   ^case[string;void]{$t[^table::create{$uParam}]}
+   ^case[table;MyTable]{$t[^table::create[$uParam]]}
+   ^case[DEFAULT]{^throw[MyTable;Unsupported type $uParam.CLASS_NAME]}
+}
+
+# method will return value in different calling contexts
+@GET[sMode]
+^switch[$sMode]{
+   ^case[table]{$result[$t]}
+   ^case[bool]{$result($t!=0)}
+   ^case[def]{$result(true)}
+   ^case[expression;double]{$result($t)}
+   ^case[DEFAULT]{^throw[MyTable;Unsupported mode '$sMode']}
+}
+
+
+# method will handle access to the "columns"
+@GET_DEFAULT[sName]
+$result[$t.$sName]
+
+
+# wrappers for all existing methods are required
+@count[]
+^t.count[]
+
+@menu[jCode;sSeparator]
+^t.menu{$jCode}[$sSeparator]
+
+
+# new functionality
+@remove[iOffset;iLimit]
+$iLimit(^iLimit.int(0))
+$t[^t.select(^t.offset[]<$iOffset || ^t.offset[]>=$iOffset+$iLimit)]
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Code block starting with a comment

+
# Doesn't work
+# Does work
+
 # Does work when prefixed with a space
+ +

Comments inside expressions break literals and operators

+
^if(
+    $age>=4  # not too young
+    && $age<=80  # and not too old
+)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-pascal.html b/docs/_style/prism-master/examples/prism-pascal.html new file mode 100644 index 0000000..dfea11a --- /dev/null +++ b/docs/_style/prism-master/examples/prism-pascal.html @@ -0,0 +1,65 @@ +

Comments

+
(* This is an
+old style comment *)
+{ This is a
+Turbo Pascal comment }
+// This is a Delphi comment.
+ +

Strings and characters

+
'This is a pascal string'
+''
+'a'
+^G
+#7
+#$f4
+'A tabulator character: '#9' is easy to embed'
+ +

Numbers

+
123
+123.456
+132.456e-789
+132.456e+789
+$7aff
+&17
+%11110101
+ +

Full example

+
Type
+    Str25    = String[25];
+    TBookRec = Record
+                Title, Author,
+                ISBN  : Str25;
+                Price : Real;
+               End;
+
+Procedure EnterNewBook(var newBook : TBookRec);
+Begin
+ Writeln('Please enter the book details: ');
+ Write('Book Name: ');
+ Readln(newBook.Title);
+ Write('Author: ');
+ Readln(newBook.Author);
+ Write('ISBN: ');
+ Readln(newBook.ISBN);
+ Write('Price: ');
+ Readln(newBook.Price);
+End;
+
+Var
+    bookRecArray : Array[1..10] of TBookRec;
+    i            : 1..10;
+
+Begin
+ For i := 1 to 10 do
+  EnterNewBook(bookRecArray[i]);
+ Writeln('Thanks for entering the book details');
+ Write('Now choose a record to display from 1 to 10: ');
+ Readln(i);
+ Writeln('Here are the book details of record #',i,':');
+ Writeln;
+ Writeln('Title:  ', bookRecArray[i].Title);
+ Writeln('Author: ', bookRecArray[i].Author);
+ Writeln('ISBN:   ', bookRecArray[i].ISBN);
+ Writeln('Price:  ', bookRecArray[i].Price);
+ Readln;
+End.
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-perl.html b/docs/_style/prism-master/examples/prism-perl.html new file mode 100644 index 0000000..85c3681 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-perl.html @@ -0,0 +1,71 @@ +

Comments

+
# Single line comment
+=head1 Here There
+	Be Pods!
+=cut
+ +

Strings

+
q/foo bar baz/;
+q awhy not ?a;
+qw(foo bar baz) q{foo bar baz}
+q[foo bar baz] qq<foo bar baz>
+"foo bar baz" 'foo bar baz' `foo bar baz`
+ +

Regex

+
m/foo/ s/foo/bar/
+m zfooz s zfoozbarz
+qr(foo) m{foo} s(foo)(bar) s{foo}{bar}
+m[foo] m<foo> tr[foo][bar] s<foo><bar>
+/foo/i
+
+ +

Variables

+
${^POSTMATCH}
+$^V
+$element_count = scalar(@whatever);
+keys(%users) = 1000;
+$1, $_, %!;
+ +

Numbers

+
12345
+12345.67
+.23E-10 # a very small number
+3.14_15_92 # a very important number
+4_294_967_296 # underscore for legibility
+0xff # hex
+0xdead_beef # more hex
+0377 # octal (only numbers, begins with 0)
+0b011011 # binary
+ +

Full example

+
sub read_config_file {
+  my ($class, $filename) = @_;
+
+  unless (defined $filename) {
+    my $home  = File::HomeDir->my_home || '.';
+    $filename = File::Spec->catfile($home, '.pause');
+
+    return {} unless -e $filename and -r _;
+  }
+
+  my %conf;
+  if ( eval { require Config::Identity } ) {
+    %conf = Config::Identity->load($filename);
+    $conf{user} = delete $conf{username} unless $conf{user};
+  }
+  else { # Process .pause manually
+    open my $pauserc, '<', $filename
+      or die "can't open $filename for reading: $!";
+
+    while (<$pauserc>) {
+      chomp;
+      next unless $_ and $_ !~ /^\s*#/;
+
+      my ($k, $v) = /^\s*(\w+)\s+(.+)$/;
+      Carp::croak "multiple enties for $k" if $conf{$k};
+      $conf{$k} = $v;
+    }
+  }
+
+  return \%conf;
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-php.html b/docs/_style/prism-master/examples/prism-php.html new file mode 100644 index 0000000..1a25589 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-php.html @@ -0,0 +1,67 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+# Shell-like comment
+ +

Strings

+
'foo \'bar\' baz'
+"foo \"bar\" baz"
+"a string # containing an hash"
+$foo = <<<FOO
+    Heredoc strings are supported too!
+FOO;
+$bar = <<<'BAR'
+    And also Nowdoc strings
+BAR;
+ +

Variables

+
$some_var = 5;
+$otherVar = "Some text";
+$null = null;
+$false = false;
+ +

Functions

+
$json = json_encode($my_object);
+$array1 = array("a" => "green", "red", "blue", "red");
+$array2 = array("b" => "green", "yellow", "red");
+$result = array_diff($array1, $array2);
+ +

Constants

+
define('MAXSIZE', 42);
+echo MAXSIZE;
+json_decode($json, false, 512, JSON_BIGINT_AS_STRING)
+ +

PHP 5.3+ support

+
namespace my\name;
+$c = new \my\name\MyClass;
+$arr = [1,2,3];
+trait ezcReflectionReturnInfo {
+    function getReturnType() { /*1*/ }
+    function getReturnDescription() { /*2*/ }
+}
+function gen_one_to_three() {
+    for ($i = 1; $i <= 3; $i++) {
+        // Note that $i is preserved between yields.
+        yield $i;
+    }
+}
+ +

PHP embedded in HTML

+
<div class="<?php echo $a ? 'foo' : 'bar'; ?>">
+<?php if($var < 42) {
+    echo "Something";
+} else {
+    echo "Something else";
+} ?>
+</div>
+ +

String interpolation

+
$str = "This is $great!";
+$foobar = "Another example: {${$foo->bar()}}";
+$a = <<<FOO
+    Hello $world!
+FOO;
+$b = <<<"FOOBAR"
+    Interpolation inside Heredoc strings {$obj->values[3]->name}
+FOOBAR;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-plsql.html b/docs/_style/prism-master/examples/prism-plsql.html new file mode 100644 index 0000000..2212b14 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-plsql.html @@ -0,0 +1,40 @@ +

Comments

+
-- Single line comment
+/* Multi-line
+comment */
+ +

Operators

+
l_message  := 'Hello ' || place_in;
+ +

Keywords

+
CREATE OR REPLACE PROCEDURE
+hello_place (place_in IN VARCHAR2)
+IS
+  l_message  VARCHAR2 (100);
+BEGIN
+  l_message  := 'Hello ' || place_in;
+  DBMS_OUTPUT.put_line (l_message);
+END hello_place;
+
+DECLARE
+  l_dept_id
+  employees.department_id%TYPE := 10;
+BEGIN
+  DELETE FROM employees
+       WHERE department_id = l_dept_id;
+
+  DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
+END;
+
+DECLARE
+  l_message   VARCHAR2 (100) := 'Hello';
+  l_message2  VARCHAR2 (100) := ' World!';
+BEGIN
+  IF SYSDATE >= TO_DATE ('01-JAN-2011')
+  THEN
+    l_message2 := l_message || l_message2;
+    DBMS_OUTPUT.put_line (l_message2);
+  ELSE
+    DBMS_OUTPUT.put_line (l_message);
+  END IF;
+END;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-powershell.html b/docs/_style/prism-master/examples/prism-powershell.html new file mode 100644 index 0000000..e5dba2e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-powershell.html @@ -0,0 +1,19 @@ +

Comments

+
# This is a comment
+<# This is a
+multi-line comment #>
+ +

Variable Interpolation

+
$Name = "Alice"
+Write-Host "Hello, my name is $Name."
+ +

Full Example

+
Function SayHello([string]$name) {
+    Write-Host "Hello, $name."
+}
+$Names = @("Bob", "Alice")
+
+$Names | ForEach {
+    SayHello $_
+}
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-processing.html b/docs/_style/prism-master/examples/prism-processing.html new file mode 100644 index 0000000..3c74ba3 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-processing.html @@ -0,0 +1,173 @@ +

Full example

+
// Processing implementation of Game of Life by Joan Soler-Adillon
+// from https://processing.org/examples/gameoflife.html
+
+// Size of cells
+int cellSize = 5;
+
+// How likely for a cell to be alive at start (in percentage)
+float probabilityOfAliveAtStart = 15;
+
+// Variables for timer
+int interval = 100;
+int lastRecordedTime = 0;
+
+// Colors for active/inactive cells
+color alive = color(0, 200, 0);
+color dead = color(0);
+
+// Array of cells
+int[][] cells; 
+// Buffer to record the state of the cells and use this while changing the others in the interations
+int[][] cellsBuffer; 
+
+// Pause
+boolean pause = false;
+
+void setup() {
+  size (640, 360);
+
+  // Instantiate arrays 
+  cells = new int[width/cellSize][height/cellSize];
+  cellsBuffer = new int[width/cellSize][height/cellSize];
+
+  // This stroke will draw the background grid
+  stroke(48);
+
+  noSmooth();
+
+  // Initialization of cells
+  for (int x=0; x<width/cellSize; x++) {
+    for (int y=0; y<height/cellSize; y++) {
+      float state = random (100);
+      if (state > probabilityOfAliveAtStart) { 
+        state = 0;
+      }
+      else {
+        state = 1;
+      }
+      cells[x][y] = int(state); // Save state of each cell
+    }
+  }
+  background(0); // Fill in black in case cells don't cover all the windows
+}
+
+
+void draw() {
+
+  //Draw grid
+  for (int x=0; x<width/cellSize; x++) {
+    for (int y=0; y<height/cellSize; y++) {
+      if (cells[x][y]==1) {
+        fill(alive); // If alive
+      }
+      else {
+        fill(dead); // If dead
+      }
+      rect (x*cellSize, y*cellSize, cellSize, cellSize);
+    }
+  }
+  // Iterate if timer ticks
+  if (millis()-lastRecordedTime>interval) {
+    if (!pause) {
+      iteration();
+      lastRecordedTime = millis();
+    }
+  }
+
+  // Create  new cells manually on pause
+  if (pause && mousePressed) {
+    // Map and avoid out of bound errors
+    int xCellOver = int(map(mouseX, 0, width, 0, width/cellSize));
+    xCellOver = constrain(xCellOver, 0, width/cellSize-1);
+    int yCellOver = int(map(mouseY, 0, height, 0, height/cellSize));
+    yCellOver = constrain(yCellOver, 0, height/cellSize-1);
+
+    // Check against cells in buffer
+    if (cellsBuffer[xCellOver][yCellOver]==1) { // Cell is alive
+      cells[xCellOver][yCellOver]=0; // Kill
+      fill(dead); // Fill with kill color
+    }
+    else { // Cell is dead
+      cells[xCellOver][yCellOver]=1; // Make alive
+      fill(alive); // Fill alive color
+    }
+  } 
+  else if (pause && !mousePressed) { // And then save to buffer once mouse goes up
+    // Save cells to buffer (so we opeate with one array keeping the other intact)
+    for (int x=0; x<width/cellSize; x++) {
+      for (int y=0; y<height/cellSize; y++) {
+        cellsBuffer[x][y] = cells[x][y];
+      }
+    }
+  }
+}
+
+
+
+void iteration() { // When the clock ticks
+  // Save cells to buffer (so we opeate with one array keeping the other intact)
+  for (int x=0; x<width/cellSize; x++) {
+    for (int y=0; y<height/cellSize; y++) {
+      cellsBuffer[x][y] = cells[x][y];
+    }
+  }
+
+  // Visit each cell:
+  for (int x=0; x<width/cellSize; x++) {
+    for (int y=0; y<height/cellSize; y++) {
+      // And visit all the neighbours of each cell
+      int neighbours = 0; // We'll count the neighbours
+      for (int xx=x-1; xx<=x+1;xx++) {
+        for (int yy=y-1; yy<=y+1;yy++) {  
+          if (((xx>=0)&&(xx<width/cellSize))&&((yy>=0)&&(yy<height/cellSize))) { // Make sure you are not out of bounds
+            if (!((xx==x)&&(yy==y))) { // Make sure to to check against self
+              if (cellsBuffer[xx][yy]==1){
+                neighbours ++; // Check alive neighbours and count them
+              }
+            } // End of if
+          } // End of if
+        } // End of yy loop
+      } //End of xx loop
+      // We've checked the neigbours: apply rules!
+      if (cellsBuffer[x][y]==1) { // The cell is alive: kill it if necessary
+        if (neighbours < 2 || neighbours > 3) {
+          cells[x][y] = 0; // Die unless it has 2 or 3 neighbours
+        }
+      } 
+      else { // The cell is dead: make it live if necessary      
+        if (neighbours == 3 ) {
+          cells[x][y] = 1; // Only if it has 3 neighbours
+        }
+      } // End of if
+    } // End of y loop
+  } // End of x loop
+} // End of function
+
+void keyPressed() {
+  if (key=='r' || key == 'R') {
+    // Restart: reinitialization of cells
+    for (int x=0; x<width/cellSize; x++) {
+      for (int y=0; y<height/cellSize; y++) {
+        float state = random (100);
+        if (state > probabilityOfAliveAtStart) {
+          state = 0;
+        }
+        else {
+          state = 1;
+        }
+        cells[x][y] = int(state); // Save state of each cell
+      }
+    }
+  }
+  if (key==' ') { // On/off of pause
+    pause = !pause;
+  }
+  if (key=='c' || key == 'C') { // Clear all
+    for (int x=0; x<width/cellSize; x++) {
+      for (int y=0; y<height/cellSize; y++) {
+        cells[x][y] = 0; // Save all to zero
+      }
+    }
+  }
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-prolog.html b/docs/_style/prism-master/examples/prism-prolog.html new file mode 100644 index 0000000..b231bca --- /dev/null +++ b/docs/_style/prism-master/examples/prism-prolog.html @@ -0,0 +1,44 @@ +

Comments

+
% This is a comment
+/* This is a
+multi-line comment */
+ +

Numbers

+
42
+3.1415
+ +

Strings

+
"This is a string."
+"This is a string \
+on multiple lines."
+"A string with \"quotes\" in it."
+"Another string with ""quotes"" in it."
+ +

Example

+
:- dynamic fibo/2.
+fibo(0, 1). fibo(1, 1).
+fibo(N, F) :-
+N >= 2, N1 is N - 1, N2 is N - 2,
+fibo(N1, F1), fibo(N2, F2), F is F1 + F2,
+assert(fibo(N,F):-!). % assert as first clause
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Null-ary predicates are not highlighted

+
halt.
+trace.
+
+:- if(test1).
+section_1.
+:- elif(test2).
+section_2.
+:- elif(test3).
+section_3.
+:- else.
+section_else.
+:- endif.
diff --git a/docs/_style/prism-master/examples/prism-properties.html b/docs/_style/prism-master/examples/prism-properties.html new file mode 100644 index 0000000..bbc81f9 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-properties.html @@ -0,0 +1,9 @@ +

Comments

+
# This is a comment
+! This is a comment too
+ +

Properties

+
some_key some_value
+some\ key\ with\ spaces : some value
+some_key = some \
+multiline value
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-pug.html b/docs/_style/prism-master/examples/prism-pug.html new file mode 100644 index 0000000..d37de5c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-pug.html @@ -0,0 +1,85 @@ +

Comments

+
// Some
+  multiline
+  comment !
+
+// This is a comment
+But this is not
+ +

Doctype

+
doctype html
+doctype 1.1
+doctype html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN"
+ +

Tags

+
ul
+  li Item A
+  li Item B
+  li Item C
+foo(bar='baz')/
+input(type='checkbox', checked=true.toString())
+#content
+div#foo(data-bar="foo")&attributes({'data-foo': 'bar'})
+ +

Markup

+
<div class="foo bar"></div>
+ +

Control flow

+
#user
+  if user.description
+    p.description= user.description
+  else if authorised
+    p.description.
+      User has no description,
+      why not add one...
+  else
+    p.description User has no description
+ul
+  each val in [1, 2, 3, 4, 5]
+    li= val
+case friends
+  when 0
+    p you have no friends
+  when 1
+    p you have a friend
+  default
+    p you have #{friends} friends
+
+ +

Inline JavaScript

+
script alert('test');
+script(type="text/javascript").
+  alert('foo');
+  alert('bar');
+- var classes = ['foo', 'bar', 'baz']
+- for (var x = 0; x < 3; x++)
+  li item
+
+ +

Keywords

+
include ./includes/head.pug
+extends ./layout.pug
+block content
+append head
+ +

Mixins

+
mixin list
+  ul
+    li foo
+    li bar
+    li baz
++list
+mixin pet(name)
+  li.pet= name
+ul
+  +pet('cat')
+  +pet('dog')
+
+ +

Filters

+

Filters require the desired language to be loaded. +On this page, check CoffeeScript before checking Pug should make +the example below work properly.

+
script
+  :coffee
+    console.log 'This is coffee script'
diff --git a/docs/_style/prism-master/examples/prism-puppet.html b/docs/_style/prism-master/examples/prism-puppet.html new file mode 100644 index 0000000..4892ab8 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-puppet.html @@ -0,0 +1,152 @@ +

Comments

+
#
+# Foobar
+/* Foo
+bar */
+ +

Strings and interpolation

+
'foo \'bar\' baz'
+"$foo \"bar\" ${baz}"
+
+@(FOOBAR) # Unquoted heredoc string
+Foo bar baz
+FOOBAR
+
+@("BARBAZ"/$L) # Quoted heredoc string
+	$foo bar ${baz}
+	|-BARBAZ
+ +

Regular expressions

+
if $host =~ /^www(\d+)\./ {}
+$foo = /foo
+	bar # Extended regexes can include comments
+baz/x
+ +

Variables

+
$foo
+$::foobar
+$foo::bar::baz
+ +

Functions

+
require apache
+template('apache/vhost-default.conf.erb')
+[1,20,3].filter |$value| { $value < 10 }
+ +

All-in-one example

+
file {'ntp.conf':
+  path    => '/etc/ntp.conf',
+  ensure  => file,
+  content => template('ntp/ntp.conf'),
+  owner   => 'root',
+  mode    => '0644',
+}
+package {'ntp':
+  ensure => installed,
+  before => File['ntp.conf'],
+}
+service {'ntpd':
+  ensure    => running,
+  subscribe => File['ntp.conf'],
+}
+Package['ntp'] -> File['ntp.conf'] ~> Service['ntpd']
+
+$package_list = ['ntp', 'apache2', 'vim-nox', 'wget']
+$myhash = { key => { subkey => 'b' }}
+
+include ntp
+require ntp
+class {'ntp':}
+
+define apache::vhost ($port, $docroot, $servername = $title, $vhost_name = '*') {
+  include apache
+  include apache::params
+  $vhost_dir = $apache::params::vhost_dir
+  file { "${vhost_dir}/${servername}.conf":
+      content => template('apache/vhost-default.conf.erb'),
+      owner   => 'www',
+      group   => 'www',
+      mode    => '644',
+      require => Package['httpd'],
+      notify  => Service['httpd'],
+  }
+}
+
+apache::vhost {'homepages':
+  port    => 8081,
+  docroot => '/var/www-testhost',
+}
+Apache::Vhost['homepages']
+
+node 'www1.example.com' {
+  include common
+  include apache
+  include squid
+}
+node /^www\d+$/ {
+  include common
+}
+
+# comment
+/* comment */
+
+if $is_virtual {
+  warning( 'Tried to include class ntp on virtual machine; this node may be misclassified.' )
+}
+elsif $operatingsystem == 'Darwin' {
+  warning( 'This NTP module does not yet work on our Mac laptops.' )
+else {
+  include ntp
+}
+
+if $hostname =~ /^www(\d+)\./ {
+  notify { "Welcome web server $1": }
+}
+
+case $operatingsystem {
+  'Solaris':          { include role::solaris }
+  'RedHat', 'CentOS': { include role::redhat  }
+  /^(Debian|Ubuntu)$/:{ include role::debian  }
+  default:            { include role::generic }
+}
+$rootgroup = $osfamily ? {
+    'Solaris'          => 'wheel',
+    /(Darwin|FreeBSD)/ => 'wheel',
+    default            => 'root',
+}
+
+User <| groups == 'admin' |>
+Concat::Fragment <<| tag == "bacula-storage-dir-${bacula_director}" |>>
+
+Exec <| title == 'update_migrations' |> {
+  environment => 'RUBYLIB=/usr/lib/ruby/site_ruby/1.8/',
+}
+
+@user {'deploy':
+  uid     => 2004,
+  comment => 'Deployment User',
+  group   => www-data,
+  groups  => ["enterprise"],
+  tag     => [deploy, web],
+}
+
+@@nagios_service { "check_zfs${hostname}":
+  use                 => 'generic-service',
+  host_name           => "$fqdn",
+  check_command       => 'check_nrpe_1arg!check_zfs',
+  service_description => "check_zfs${hostname}",
+  target              => '/etc/nagios3/conf.d/nagios_service.cfg',
+  notify              => Service[$nagios::params::nagios_service],
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

More than one level of nested braces inside interpolation

+
"Foobar ${foo({
+    bar => {baz => 42}
+    baz => 42
+})} <- broken"
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-pure.html b/docs/_style/prism-master/examples/prism-pure.html new file mode 100644 index 0000000..d7a0129 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-pure.html @@ -0,0 +1,115 @@ +

Comments

+
#! shebang
+// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"This is a string."
+"This is a string with \"quotes\" in it."
+ +

Numbers

+
4711
+4711L
+1.2e-3
+.14
+1000
+0x3e8
+01750
+0b1111101000
+inf
+nan
+ +

Inline code

+

Inline code requires the desired language to be loaded. +On this page, check C, C++ and Fortran before checking Pure should make +the examples below work properly.

+
%<
+int mygcd(int x, int y)
+{
+  if (y == 0)
+    return x;
+  else
+    return mygcd(y, x%y);
+}
+%>
+
+%< -*- Fortran90 -*-
+function fact(n) result(p)
+  integer n, p
+  p = 1
+  do i = 1, n
+     p = p*i
+  end do
+end function fact
+%>
+
+%< -*- C++ -*-
+
+#include <pure/runtime.h>
+#include <string>
+#include <map>
+
+// An STL map mapping strings to Pure expressions.
+
+using namespace std;
+typedef map<string,pure_expr*> exprmap;
+
+// Since we can't directly deal with C++ classes in Pure, provide some C
+// functions to create, destroy and manipulate these objects.
+
+extern "C" exprmap *map_create()
+{
+  return new exprmap;
+}
+
+extern "C" void map_add(exprmap *m, const char *key, pure_expr *x)
+{
+  exprmap::iterator it = m->find(string(key));
+  if (it != m->end()) pure_free(it->second);
+  (*m)[key] = pure_new(x);
+}
+
+extern "C" void map_del(exprmap *m, const char *key)
+{
+  exprmap::iterator it = m->find(key);
+  if (it != m->end()) {
+    pure_free(it->second);
+    m->erase(it);
+  }
+}
+
+extern "C" pure_expr *map_get(exprmap *m, const char *key)
+{
+  exprmap::iterator it = m->find(key);
+  return (it != m->end())?it->second:0;
+}
+
+extern "C" pure_expr *map_keys(exprmap *m)
+{
+  size_t i = 0, n = m->size();
+  pure_expr **xs = new pure_expr*[n];
+  for (exprmap::iterator it = m->begin(); it != m->end(); ++it)
+    xs[i++] = pure_string_dup(it->first.c_str());
+  pure_expr *x = pure_listv(n, xs);
+  delete[] xs;
+  return x;
+}
+
+extern "C" void map_destroy(exprmap *m)
+{
+  for (exprmap::iterator it = m->begin(); it != m->end(); ++it)
+    pure_free(it->second);
+  delete m;
+}
+
+%>
+ +

Example

+
queens n       = catch reverse (search n 1 []) with
+  search n i p = throw p if i>n;
+               = void [search n (i+1) ((i,j):p) | j = 1..n; safe (i,j) p];
+  safe (i,j) p = ~any (check (i,j)) p;
+  check (i1,j1) (i2,j2)
+               = i1==i2 || j1==j2 || i1+j1==i2+j2 || i1-j1==i2-j2;
+end;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-python.html b/docs/_style/prism-master/examples/prism-python.html new file mode 100644 index 0000000..ce6efc0 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-python.html @@ -0,0 +1,61 @@ +

Comments

+
# This is a comment
+# -*- coding: <encoding-name> -*-
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+""" "Multi-line" strings
+are supported."""
+''' 'Multi-line' strings
+are supported.'''
+ +

Numbers

+
7
+2147483647
+0o177
+0b100110111
+3
+79228162514264337593543950336
+0o377
+0x100000000
+0xdeadbeef
+3.14
+10.
+.001
+1e100
+3.14e-10
+0e0
+3.14j
+10.j
+10j
+.001j
+1e100j
+3.14e-10j
+
+ +

Full example

+
def median(pool):
+    '''Statistical median to demonstrate doctest.
+    >>> median([2, 9, 9, 7, 9, 2, 4, 5, 8])
+    7
+    '''
+    copy = sorted(pool)
+    size = len(copy)
+    if size % 2 == 1:
+        return copy[(size - 1) / 2]
+    else:
+        return (copy[size/2 - 1] + copy[size/2]) / 2
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Interpolation expressions containing strings with { or }

+
f"{'}'}"
diff --git a/docs/_style/prism-master/examples/prism-q.html b/docs/_style/prism-master/examples/prism-q.html new file mode 100644 index 0000000..58d674f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-q.html @@ -0,0 +1,112 @@ +

Comments

+
foo / This is a comment
+/ This is a comment too
+
+/
+Some multi-line
+comment here
+\
+
+\
+This comment will
+continue until the
+end of code
+ +

Character data and strings

+
"q"
+"\""
+"\\"
+"\142"
+"foo bar baz"
+ +

Symbols

+
`
+`q
+`zaphod
+`:198.162.0.2:5042
+`:www.yourco.com:5042
+`.new
+ +

Numbers

+
42
+b:-123h
+c:1234567890j
+pi:3.14159265
+float1:1f
+r:1.4142e
+2.0
+4.00e
+f:1.23456789e-10
+r:1.2345678e-10e
+bit:0b
+byte:0x2a
+a:42
+bit:1b
+
+0w 0n 0W 0Wh 0Wj
+ +

Dates

+
d:2006.07.04
+t:09:04:59.000
+dt:2006.07.04T09:04:59.000
+mon:2006.07m
+mm:09:04
+sec:09:04:59
+d:2006.07.04
+
+0Nm 0Nd 0Nz 0Nu 0Nv 0Wd 0Wt 0Wz
+ +

Verbs

+
99+L
+x<42|x>98
+(x<42)|x>98
+42~(4 2;(1 0))
+(4 2)~(4; 2*1)
+ +

Adverbs

+
" ," ,/: ("Now";"is";"the";"time")
+L1,/:\:L2
+0+/10 20 30
+(1#) each 1001 1002 1004 1003
+ +

Built-in functions and q-sql

+
string 42
+L1 cross L2
+type c
+select from t where price=(max;price) fby ([]sym;ex)
+ungroup `p xgroup sp
+`instrument insert (`g; `$"Google"; `$"Internet")
+ +

Example

+
/ Example from http://code.kx.com/wiki/Cookbook/CorporateActions
+getCAs:{[caTypes]
+    / handles multiplie corporate actions on one date
+    t:0!select factor:prd factor by date-1,sym from ca where caType in caTypes;
+    t,:update date:1901.01.01,factor:1.0 from ([]sym:distinct t`sym);
+    t:`date xasc t;
+    t:update factor:reverse prds reverse 1 rotate factor by sym from t;
+    :update `g#sym from 0!t;
+  };
+
+adjust:{[t;caTypes]
+    t:0!t;
+    factors:enlist 1.0^aj[`sym`date;([] date:t`date;sym:t`sym);getCAs caTypes]`factor;
+    mc:c where (lower c:cols t) like "*price"; / find columns to multiply
+    dc:c where lower[c] like "*size"; / find columns to divide
+    :![t;();0b;(mc,dc)!((*),/:mc,\:factors),((%),/:dc,\:factors)]; / multiply or divide out the columns
+  };
+
+/ get the adjustment factors considering all corporate actions
+getCAs exec distinct caType from ca
+
+adjust[t;`dividend] / adjust trades for dividends only
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

The global context is highlighted as a verb

+
\d .
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-qore.html b/docs/_style/prism-master/examples/prism-qore.html new file mode 100644 index 0000000..710e161 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-qore.html @@ -0,0 +1,962 @@ +

Full example

+
#!/usr/bin/env qore
+
+# database test script
+# databases users must be able to create and destroy tables and procedures, etc
+# in order to execute all tests
+
+%require-our
+%enable-all-warnings
+
+our ($o, $errors, $test_count);
+
+const opts =
+	( "help"    : "h,help",
+	  "host"    : "H,host=s",
+	  "pass"    : "p,pass=s",
+	  "db"      : "d,db=s",
+	  "user"    : "u,user=s",
+	  "type"    : "t,type=s",
+	  "enc"     : "e,encoding=s",
+	  "verbose" : "v,verbose:i+",
+	  "leave"   : "l,leave"
+ );
+
+sub usage()
+{
+	printf("usage: %s [options]
+ -h,--help          this help text
+ -u,--user=ARG      set username
+ -p,--pass=ARG      set password
+ -d,--db=ARG        set database name
+ -e,--encoding=ARG  set database character set encoding (i.e. \"utf8\")
+ -H,--host=ARG      set hostname (for MySQL and PostgreSQL connections)
+ -t,--type          set database driver (default mysql)
+ -v,--verbose       more v's = more information
+ -l,--leave         leave test tables in schema at end\n",
+	   basename($ENV."_"));
+	exit();
+}
+
+const object_map =
+ ( "oracle" :
+   ( "tables" : ora_tables ),
+   "mysql"  :
+   ( "tables" : mysql_tables ),
+   "pgsql"  :
+   ( "tables" : pgsql_tables ),
+   "sybase" :
+   ( "tables" : syb_tables,
+	 "procs"  : sybase_procs ),
+   "freetds"  :
+   ( "tables" : freetds_sybase_tables,
+	 "procs"  : sybase_procs ) );
+
+const ora_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar2(80) not null
+)",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar2(250) not null,
+   dob date not null
+)",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar2(80) not null,
+   value varchar2(160) not null
+)" );
+
+const mysql_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar(80) not null
+) type = innodb",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar(250) not null,
+   dob date not null
+) type = innodb",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar(80) not null,
+   value varchar(160) not null
+) type = innodb" );
+
+const pgsql_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar(80) not null )",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar(250) not null,
+   dob date not null )",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar(80) not null,
+   value varchar(160) not null)",
+	"data_test" : "create table data_test (
+		int2_f smallint not null,
+		int4_f integer not null,
+		int8_f int8 not null,
+		bool_f boolean not null,
+
+		float4_f real not null,
+		float8_f double precision not null,
+
+		number_f numeric(16,3) not null,
+		money_f money not null,
+
+		text_f text not null,
+		varchar_f varchar(40) not null,
+		char_f char(40) not null,
+		name_f name not null,
+
+		date_f date not null,
+		abstime_f abstime not null,
+		reltime_f reltime not null,
+		interval_f interval not null,
+		time_f time not null,
+		timetz_f time with time zone not null,
+		timestamp_f timestamp not null,
+		timestamptz_f timestamp with time zone not null,
+		tinterval_f tinterval not null,
+
+		bytea_f bytea not null
+		--bit_f bit(11) not null,
+		--varbit_f bit varying(11) not null
+)" );
+
+const syb_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar(80) not null
+)",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar(250) not null,
+   dob date not null
+)",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar(80) not null,
+   value varchar(160) not null
+)",
+	"data_test" : "create table data_test (
+	null_f char(1) null,
+
+	varchar_f varchar(40) not null,
+	char_f char(40) not null,
+	unichar_f unichar(40) not null,
+	univarchar_f univarchar(40) not null,
+	text_f text not null,
+	unitext_f unitext not null, -- note that unitext is stored as 'image'
+
+		bit_f bit not null,
+	tinyint_f tinyint not null,
+	smallint_f smallint not null,
+	int_f int not null,
+		int_f2 int not null,
+
+	decimal_f decimal(10,4) not null,
+
+	float_f float not null,     -- 8-bytes
+	real_f real not null,       -- 4-bytes
+	money_f money not null,
+	smallmoney_f smallmoney not null,
+
+	date_f date not null,
+	time_f time not null,
+	datetime_f datetime not null,
+	smalldatetime_f smalldatetime not null,
+
+	binary_f binary(4) not null,
+	varbinary_f varbinary(4) not null,
+	image_f image not null
+)" );
+
+const sybase_procs = (
+	"find_family" :
+"create procedure find_family @name varchar(80)
+as
+select * from family where name = @name
+commit -- to maintain transaction count
+",
+	"get_values" :
+"create procedure get_values @string varchar(80) output, @int int output
+as
+select @string = 'hello there'
+select @int = 150
+commit -- to maintain transaction count
+",
+	"get_values_and_select" :
+"create procedure get_values_and_select @string varchar(80) output, @int int output
+as
+select @string = 'hello there'
+select @int = 150
+select * from family where family_id = 1
+commit -- to maintain transaction count
+",
+	"get_values_and_multiple_select" :
+"create procedure get_values_and_multiple_select @string varchar(80) output, @int int output
+as
+select @string = 'hello there'
+select @int = 150
+select * from family where family_id = 1
+select * from people where person_id = 1
+commit -- to maintain transaction count
+",
+	"just_select" :
+"create procedure just_select
+as
+select * from family where family_id = 1
+commit -- to maintain transaction count
+",
+	"multiple_select" :
+"create procedure multiple_select
+as
+select * from family where family_id = 1
+select * from people where person_id = 1
+commit -- to maintain transaction count
+"
+ );
+
+const freetds_sybase_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar(80) not null
+)",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar(250) not null,
+   dob date not null
+)",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar(80) not null,
+   value varchar(160) not null
+)",
+	"data_test" : "create table data_test (
+	null_f char(1) null,
+
+	varchar_f varchar(40) not null,
+	char_f char(40) not null,
+	text_f text not null,
+	unitext_f unitext not null, -- note that unitext is stored as 'image'
+
+		bit_f bit not null,
+	tinyint_f tinyint not null,
+	smallint_f smallint not null,
+	int_f int not null,
+		int_f2 int not null,
+
+	decimal_f decimal(10,4) not null,
+
+	float_f float not null,     -- 8-bytes
+	real_f real not null,       -- 4-bytes
+	money_f money not null,
+	smallmoney_f smallmoney not null,
+
+	date_f date not null,
+	time_f time not null,
+	datetime_f datetime not null,
+	smalldatetime_f smalldatetime not null,
+
+	binary_f binary(4) not null,
+	varbinary_f varbinary(4) not null,
+	image_f image not null
+)" );
+
+const freetds_mssql_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar(80) not null
+)",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar(250) not null,
+   dob datetime not null
+)",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar(80) not null,
+   value varchar(160) not null
+)",
+	"data_test" : "create table data_test (
+	null_f char(1) null,
+
+	varchar_f varchar(40) not null,
+	char_f char(40) not null,
+	text_f text not null,
+
+		bit_f bit not null,
+	tinyint_f tinyint not null,
+	smallint_f smallint not null,
+	int_f int not null,
+		int_f2 int not null,
+
+	decimal_f decimal(10,4) not null,
+
+	float_f float not null,     -- 8-bytes
+	real_f real not null,       -- 4-bytes
+	money_f money not null,
+	smallmoney_f smallmoney not null,
+
+	datetime_f datetime not null,
+	smalldatetime_f smalldatetime not null,
+
+	binary_f binary(4) not null,
+	varbinary_f varbinary(4) not null,
+	image_f image not null
+)" );
+
+sub parse_command_line()
+{
+	my $g = new GetOpt(opts);
+	$o = $g.parse(\$ARGV);
+	if ($o.help)
+	usage();
+
+	if (!strlen($o.db))
+	{
+	stderr.printf("set the login parameters with -u,-p,-d, etc (-h for help)\n");
+	exit(1);
+	}
+	if (elements $ARGV)
+	{
+	stderr.printf("excess arguments on command-line (%n): -h for help\n", $ARGV);
+	exit(1);
+	}
+	if (!strlen($o.type))
+	$o.type = "mysql";
+}
+
+sub create_datamodel($db)
+{
+	drop_test_datamodel($db);
+
+	my $driver = $db.getDriverName();
+	# create tables
+	my $tables = object_map.$driver.tables;
+	if ($driver == "freetds")
+	if ($db.is_sybase)
+		$tables = freetds_sybase_tables;
+		else
+		$tables = freetds_mssql_tables;
+
+	foreach my $table in (keys $tables)
+	{
+	tprintf(2, "creating table %n\n", $table);
+	$db.exec($tables.$table);
+	}
+
+	# create procedures if any
+	foreach my $proc in (keys object_map.$driver.procs)
+	{
+	tprintf(2, "creating procedure %n\n", $proc);
+	$db.exec(object_map.$driver.procs.$proc);
+	}
+
+	# create functions if any
+	foreach my $func in (keys object_map.$driver.funcs)
+	{
+	tprintf(2, "creating function %n\n", $func);
+	$db.exec(object_map.$driver.funcs.$func);
+	}
+
+	$db.exec("insert into family values ( 1, 'Smith' )");
+	$db.exec("insert into family values ( 2, 'Jones' )");
+
+	# we insert the dates here using binding by value so we don't have
+	# to worry about each database's specific date format
+	$db.exec("insert into people values ( 1, 1, 'Arnie', %v)", 1983-05-13);
+	$db.exec("insert into people values ( 2, 1, 'Sylvia', %v)", 1994-11-10);
+	$db.exec("insert into people values ( 3, 1, 'Carol', %v)", 2003-07-23);
+	$db.exec("insert into people values ( 4, 1, 'Bernard', %v)", 1979-02-27);
+	$db.exec("insert into people values ( 5, 1, 'Isaac', %v)", 2000-04-04);
+	$db.exec("insert into people values ( 6, 2, 'Alan', %v)", 1992-06-04);
+	$db.exec("insert into people values ( 7, 2, 'John', %v)", 1995-03-23);
+
+	$db.exec("insert into attributes values ( 1, 'hair', 'blond' )");
+	$db.exec("insert into attributes values ( 1, 'eyes', 'hazel' )");
+	$db.exec("insert into attributes values ( 2, 'hair', 'blond' )");
+	$db.exec("insert into attributes values ( 2, 'eyes', 'blue' )");
+	$db.exec("insert into attributes values ( 3, 'hair', 'brown' )");
+	$db.exec("insert into attributes values ( 3, 'eyes', 'grey')");
+	$db.exec("insert into attributes values ( 4, 'hair', 'brown' )");
+	$db.exec("insert into attributes values ( 4, 'eyes', 'brown' )");
+	$db.exec("insert into attributes values ( 5, 'hair', 'red' )");
+	$db.exec("insert into attributes values ( 5, 'eyes', 'green' )");
+	$db.exec("insert into attributes values ( 6, 'hair', 'black' )");
+	$db.exec("insert into attributes values ( 6, 'eyes', 'blue' )");
+	$db.exec("insert into attributes values ( 7, 'hair', 'brown' )");
+	$db.exec("insert into attributes values ( 7, 'eyes', 'brown' )");
+	$db.commit();
+}
+
+sub drop_test_datamodel($db)
+{
+	my $driver = $db.getDriverName();
+	# drop the tables and ignore exceptions
+	# the commits are needed for databases like postgresql, where errors will prohibit and further
+	# actions from being taken on the Datasource
+	foreach my $table in (keys object_map.$driver.tables)
+	try {
+		$db.exec("drop table " + $table);
+		$db.commit();
+		tprintf(2, "dropped table %n\n", $table);
+	}
+		catch ()
+	{
+		$db.commit();
+	}
+
+	# drop procedures and ignore exceptions
+	foreach my $proc in (keys object_map.$driver.procs)
+	{
+	my $cmd = object_map.$driver.drop_proc_cmd;
+	if (!exists $cmd)
+		$cmd = "drop procedure";
+	try {
+		$db.exec($cmd + " " + $proc);
+		$db.commit();
+		tprintf(2, "dropped procedure %n\n", $proc);
+	}
+	catch ()
+	{
+		$db.commit();
+	}
+	}
+
+	# drop functions and ignore exceptions
+	foreach my $func in (keys object_map.$driver.funcs)
+	{
+	my $cmd = object_map.$driver.drop_func_cmd;
+	if (!exists $cmd)
+		$cmd = "drop function";
+	try {
+		$db.exec($cmd + " " + $func);
+		$db.commit();
+		tprintf(2, "dropped function %n\n", $func);
+	}
+	catch ()
+	{
+		$db.commit();
+	}
+	}
+}
+
+sub getDS()
+{
+	my $ds = new Datasource($o.type, $o.user, $o.pass, $o.db, $o.enc);
+	if (strlen($o.host))
+	$ds.setHostName($o.host);
+	return $ds;
+}
+
+sub tprintf($v, $msg)
+{
+	if ($v <= $o.verbose)
+	vprintf($msg, $argv);
+}
+
+sub test_value($v1, $v2, $msg)
+{
+	++$test_count;
+	if ($v1 == $v2)
+	tprintf(1, "OK: %s test\n", $msg);
+	else
+	{
+		tprintf(0, "ERROR: %s test failed! (%n != %n)\n", $msg, $v1, $v2);
+		$errors++;
+	}
+}
+
+const family_hash = (
+  "Jones" : (
+	  "people" : (
+	  "John" : (
+		  "dob" : 1995-03-23,
+		  "eyes" : "brown",
+		  "hair" : "brown" ),
+	  "Alan" : (
+		  "dob" : 1992-06-04,
+		  "eyes" : "blue",
+		  "hair" : "black" ) ) ),
+	"Smith" : (
+	"people" : (
+		"Arnie" : (
+		"dob" : 1983-05-13,
+		"eyes" : "hazel",
+		"hair" : "blond" ),
+		"Carol" : (
+		"dob" : 2003-07-23,
+		"eyes" : "grey",
+		"hair" : "brown" ),
+		"Isaac" : (
+		"dob" : 2000-04-04,
+		"eyes" : "green",
+		"hair" : "red" ),
+		"Bernard" : (
+		"dob" : 1979-02-27,
+		"eyes" : "brown",
+		"hair" : "brown" ),
+		"Sylvia" : (
+		"dob" : 1994-11-10,
+		"eyes" : "blue",
+		"hair" : "blond" ) ) ) );
+
+sub context_test($db)
+{
+	# first we select all the data from the tables and then use
+	# context statements to order the output hierarchically
+
+	# context statements are most useful when a set of queries can be executed once
+	# and the results processed many times by creating "views" with context statements
+
+	my $people = $db.select("select * from people");
+	my $attributes = $db.select("select * from attributes");
+
+	my $today = format_date("YYYYMMDD", now());
+
+	# in this test, we create a big hash structure out of the queries executed above
+	# and compare it at the end to the expected result
+
+	# display each family sorted by family name
+	my $fl;
+	context family ($db.select("select * from family")) sortBy (%name)
+	{
+	my $pl;
+	tprintf(2, "Family %d: %s\n", %family_id, %name);
+
+	# display people, sorted by eye color, descending
+	context people ($people)
+		sortDescendingBy (find %value in $attributes
+				  where (%attribute == "eyes"
+					 && %person_id == %people:person_id))
+		where (%family_id == %family:family_id)
+	{
+		my $al;
+		tprintf(2, "  %s, born %s\n", %name, format_date("Month DD, YYYY", %dob));
+		context ($attributes) sortBy (%attribute) where (%person_id == %people:person_id)
+		{
+		$al.%attribute = %value;
+		tprintf(2, "    has %s %s\n", %value, %attribute);
+		}
+		# leave out the ID fields and name from hash under name; subtracting a
+		# string from a hash removes that key from the result
+		# this is "doing it the hard way", there is only one key left,
+		# "dob", then attributes are added directly into the person hash
+		$pl.%name = %% - "family_id" - "person_id" - "name" + $al;
+	}
+	# leave out family_id and name fields (leaving an empty hash)
+	$fl.%name = %% - "family_id" - "name" + ( "people" : $pl );
+	}
+
+	# test context ordering
+	test_value(keys $fl, ("Jones", "Smith"), "first context");
+	test_value(keys $fl.Smith.people, ("Arnie", "Carol", "Isaac", "Bernard", "Sylvia"), "second context");
+	# test entire context value
+	test_value($fl, family_hash, "third context");
+}
+
+
+sub test_timeout($db, $c)
+{
+	$db.setTransactionLockTimeout(1ms);
+	try {
+	# this should cause a TRANSACTION-LOCK-TIMEOUT exception to be thrown
+	$db.exec("insert into family values (3, 'Test')\n");
+	test_value(True, False, "transaction timeout");
+	$db.exec("delete from family where name = 'Test'");
+	}
+	catch ($ex)
+	{
+	test_value(True, True, "transaction timeout");
+	}
+	# signal parent thread to continue
+	$c.dec();
+}
+
+sub transaction_test($db)
+{
+	my $ndb = getDS();
+	my $r;
+	tprintf(2, "db.autocommit=%N, ndb.autocommit=%N\n", $db.getAutoCommit(), $ndb.getAutoCommit());
+
+	# first, we insert a new row into "family" but do not commit it
+	my $rows = $db.exec("insert into family values (3, 'Test')\n");
+	if ($rows !== 1)
+	printf("FAILED INSERT, rows=%N\n", $rows);
+
+	# now we verify that the new row is not visible to the other datasource
+	# unless it's a sybase/ms sql server datasource, in which case this would deadlock :-(
+	if ($o.type != "sybase" && $o.type != "freetds")
+	{
+	$r = $ndb.selectRow("select name from family where family_id = 3").name;
+	test_value($r, NOTHING, "first transaction");
+	}
+
+	# now we verify that the new row is visible to the inserting datasource
+	$r = $db.selectRow("select name from family where family_id = 3").name;
+	test_value($r, "Test", "second transaction");
+
+	# test datasource timeout
+	# this Counter variable will allow the parent thread to sleep
+	# until the child thread times out
+	my $c = new Counter(1);
+	background test_timeout($db, $c);
+
+	# wait for child thread to time out
+	$c.waitForZero();
+
+	# now, we commit the transaction
+	$db.commit();
+
+	# now we verify that the new row is visible in the other datasource
+	$r = $ndb.selectRow("select name from family where family_id = 3").name;
+	test_value($r, "Test", "third transaction");
+
+	# now we delete the row we inserted (so we can repeat the test)
+	$r = $ndb.exec("delete from family where family_id = 3");
+	test_value($r, 1, "delete row count");
+	$ndb.commit();
+}
+
+sub oracle_test()
+{
+}
+
+# here we use a little workaround for modules that provide functions,
+# namespace additions (constants, classes, etc) needed by test functions
+# at parse time.  To avoid parse errors (as database modules are loaded
+# in this script at run-time when the Datasource class is instantiated)
+# we use a Program object that we parse and run on demand to return the
+# value required
+sub get_val($code)
+{
+	my $p = new Program();
+
+	my $str = sprintf("return %s;", $code);
+	$p.parse($str, "code");
+	return $p.run();
+}
+
+sub pgsql_test($db)
+{
+	my $args = ( "int2_f"          : 258,
+		 "int4_f"          : 233932,
+		 "int8_f"          : 239392939458,
+		 "bool_f"          : True,
+		 "float4_f"        : 21.3444,
+		 "float8_f"        : 49394.23423491,
+		 "number_f"        : get_val("pgsql_bind(PG_TYPE_NUMERIC, '7235634215.3250')"),
+		 "money_f"         : get_val("pgsql_bind(PG_TYPE_CASH, \"400.56\")"),
+		 "text_f"          : 'some text  ',
+		 "varchar_f"       : 'varchar ',
+		 "char_f"          : 'char text',
+		 "name_f"          : 'name',
+		 "date_f"          : 2004-01-05,
+		 "abstime_f"       : 2005-12-03T10:00:01,
+		 "reltime_f"       : 5M + 71D + 19h + 245m + 51s,
+		 "interval_f"      : 6M + 3D + 2h + 45m + 15s,
+		 "time_f"          : 11:35:00,
+		 "timetz_f"        : get_val("pgsql_bind(PG_TYPE_TIMETZ, \"11:38:21 CST\")"),
+		 "timestamp_f"     : 2005-04-01T11:35:26,
+		 "timestamptz_f"   : 2005-04-01T11:35:26.259,
+		 "tinterval_f"     : get_val("pgsql_bind(PG_TYPE_TINTERVAL, '[\"May 10, 1947 23:59:12\" \"Jan 14, 1973 03:14:21\"]')"),
+		 "bytea_f"         : <bead>
+		 #bit_f             :
+		 #varbit_f          :
+	);
+
+	$db.vexec("insert into data_test values (%v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v)", hash_values($args));
+
+	my $q = $db.selectRow("select * from data_test");
+	if ($o.verbose > 1)
+	foreach my $k in (keys $q)
+		tprintf(2, " %-16s= %-10s %N\n", $k, type($q.$k), $q.$k);
+
+	# fix values where we know the return type is different
+	$args.money_f = 400.56;
+	$args.timetz_f = 11:38:21;
+	$args.tinterval_f = '["1947-05-10 21:59:12" "1973-01-14 02:14:21"]';
+	$args.number_f = "7235634215.3250";
+	$args.reltime_f = 19177551s;
+	$args.interval_f = 6M + 3D + 9915s;
+
+	# rounding errors can happen in float4
+	$q.float4_f = round($q.float4_f);
+	$args.float4_f = round($args.float4_f);
+
+	# remove values where we know they won't match
+	# abstime and timestamptz are converted to GMT by the server
+	delete $q.abstime_f;
+	delete $q.timestamptz_f;
+
+	# compare each value
+	foreach my $k in (keys $q)
+	test_value($q.$k, $args.$k, sprintf("%s bind and retrieve", $k));
+
+	$db.commit();
+}
+
+sub mysql_test()
+{
+}
+
+const family_q = ( "family_id" : 1,
+		   "name" : "Smith" );
+const person_q = ( "person_id" : 1,
+		   "family_id" : 1,
+		   "name" : "Arnie",
+		   "dob" : 1983-05-13 );
+const params = ( "string" : "hello there",
+		 "int" : 150 );
+
+sub sybase_test($db)
+{
+	# simple stored proc test, bind by name
+	my $x = $db.exec("exec find_family %v", "Smith");
+	test_value($x, ("name": list("Smith"), "family_id" : list(1)), "simple stored proc");
+
+	# stored proc execute with output params
+	$x = $db.exec("declare @string varchar(40), @int int
+exec get_values :string output, :int output");
+	test_value($x, params + ("rowcount":1), "get_values");
+
+	# we use Datasource::selectRows() in the following queries because we
+	# get hash results instead of a hash of lists as with exec in the queries
+	# normally we should not use selectRows to execute a stored procedure,
+	# as the Datasource::selectRows() method will not grab the transaction lock,
+	# but we already called Datasource::exec() above, so we have it already.
+	# the other alternative would be to call Datasource::beginTransaction() before
+	# Datasource::selectRows()
+
+	# simple stored proc test, bind by name, returns hash
+	$x = $db.selectRows("exec find_family %v", "Smith");
+	test_value($x, family_q, "simple stored proc");
+
+	# stored proc execute with output params and select results
+	$x = $db.selectRows("declare @string varchar(40), @int int
+exec get_values_and_select :string output, :int output");
+	test_value($x, ("query":family_q,"params":params), "get_values_and_select");
+
+	# stored proc execute with output params and multiple select results
+	$x = $db.selectRows("declare @string varchar(40), @int int
+exec get_values_and_multiple_select :string output, :int output");
+	test_value($x, ("query":("query0":family_q,"query1":person_q),"params":params), "get_values_and_multiple_select");
+
+	# stored proc execute with just select results
+	$x = $db.selectRows("exec just_select");
+	test_value($x, family_q, "just_select");
+
+	# stored proc execute with multiple select results
+	$x = $db.selectRows("exec multiple_select");
+	test_value($x, ("query0":family_q,"query1":person_q), "multiple_select");
+
+	my $args = ( "null_f"          : NULL,
+		 "varchar_f"       : "varchar",
+		 "char_f"          : "char",
+		 "unichar_f"       : "unichar",
+		 "univarchar_f"    : "univarchar",
+		 "text_f"          : "test",
+		 "unitext_f"       : "test",
+		 "bit_f"           : True,
+		 "tinyint_f"       : 55,
+		 "smallint_f"      : 4285,
+		 "int_f"           : 405402,
+		 "int_f2"          : 214123498,
+		 "decimal_f"       : 500.1231,
+		 "float_f"         : 23443.234324234,
+		 "real_f"          : 213.123,
+		 "money_f"         : 3434234250.2034,
+		 "smallmoney_f"    : 211100.1012,
+		 "date_f"          : 2007-05-01,
+			 "time_f"          : 10:30:01,
+		 "datetime_f"      : 3459-01-01T11:15:02.250,
+		 "smalldatetime_f" : 2007-12-01T12:01:00,
+		 "binary_f"        : <0badbeef>,
+		 "varbinary_f"     : <feedface>,
+		 "image_f"         : <cafebead> );
+
+	# insert data
+	my $rows = $db.vexec("insert into data_test values (%v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %d, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v)", hash_values($args));
+
+	my $q = $db.selectRow("select * from data_test");
+	if ($o.verbose > 1)
+	foreach my $k in (keys $q)
+		tprintf(2, " %-16s= %-10s %N\n", $k, type($q.$k), $q.$k);
+
+	# remove values where we know they won't match
+	# unitext_f is returned as IMAGE by the server
+	delete $q.unitext_f;
+	delete $args.unitext_f;
+	# rounding errors can happen in real
+	$q.real_f = round($q.real_f);
+	$args.real_f = round($args.real_f);
+
+	# compare each value
+	foreach my $k in (keys $q)
+	test_value($q.$k, $args.$k, sprintf("%s bind and retrieve", $k));
+
+	$db.commit();
+}
+
+sub freetds_test($db)
+{
+	# simple stored proc test, bind by name
+	my $x = $db.exec("exec find_family %v", "Smith");
+	test_value($x, ("name": list("Smith"), "family_id" : list(1)), "simple stored proc");
+
+	# we cannot retrieve parameters from newer SQL Servers with the approach we use;
+	# Microsoft changed the handling of the protocol and require us to use RPC calls,
+	# this will be implemented in the next version of qore where the "freetds" driver will
+	# be able to add custom methods to the Datasource class.  For now, we skip these tests
+
+	if ($db.is_sybase)
+	{
+	$x = $db.exec("declare @string varchar(40), @int int
+exec get_values :string output, :int output");
+	test_value($x, params, "get_values");
+	}
+
+	# we use Datasource::selectRows() in the following queries because we
+	# get hash results instead of a hash of lists as with exec in the queries
+	# normally we should not use selectRows to execute a stored procedure,
+	# as the Datasource::selectRows() method will not grab the transaction lock,
+	# but we already called Datasource::exec() above, so we have it already.
+	# the other alternative would be to call Datasource::beginTransaction() before
+	# Datasource::selectRows()
+
+	# simple stored proc test, bind by name, returns hash
+	$x = $db.selectRows("exec find_family %v", "Smith");
+	test_value($x, family_q, "simple stored proc");
+
+	# stored proc execute with output params and select results
+	if ($db.is_sybase)
+	{
+	$x = $db.selectRows("declare @string varchar(40), @int int
+exec get_values_and_select :string output, :int output");
+	test_value($x, ("query":family_q,"params":params), "get_values_and_select");
+
+	# stored proc execute with output params and multiple select results
+	$x = $db.selectRows("declare @string varchar(40), @int int
+exec get_values_and_multiple_select :string output, :int output");
+	test_value($x, ("query":("query0":family_q,"query1":person_q),"params":params), "get_values_and_multiple_select");
+	}
+
+	# stored proc execute with just select results
+	$x = $db.selectRows("exec just_select");
+	test_value($x, family_q, "just_select");
+
+	# stored proc execute with multiple select results
+	$x = $db.selectRows("exec multiple_select");
+	test_value($x, ("query0":family_q,"query1":person_q), "multiple_select");
+
+	# the freetds driver does not work with the following sybase column types:
+	# unichar, univarchar
+
+	my $args = ( "null_f"          : NULL,
+		 "varchar_f"       : "test",
+		 "char_f"          : "test",
+		 "text_f"          : "test",
+		 "unitext_f"       : "test",
+		 "bit_f"           : True,
+		 "tinyint_f"       : 55,
+		 "smallint_f"      : 4285,
+		 "int_f"           : 405402,
+		 "int_f2"          : 214123498,
+		 "decimal_f"       : 500.1231,
+		 "float_f"         : 23443.234324234,
+		 "real_f"          : 213.123,
+		 "money_f"         : 3434234250.2034,
+		 "smallmoney_f"    : 211100.1012,
+		 "date_f"          : 2007-05-01,
+			 "time_f"          : 10:30:01,
+		 "datetime_f"      : 3459-01-01T11:15:02.250,
+		 "smalldatetime_f" : 2007-12-01T12:01:00,
+		 "binary_f"        : <0badbeef>,
+		 "varbinary_f"     : <feedface>,
+		 "image_f"         : <cafebead> );
+
+	# remove fields not supported by sql server
+	if (!$db.is_sybase)
+	{
+	delete $args.unitext_f;
+	delete $args.date_f;
+	delete $args.time_f;
+	}
+
+	my $sql = "insert into data_test values (";
+	for (my $i; $i < elements $args; ++$i)
+	$sql += "%v, ";
+	$sql = substr($sql, 0, -2) + ")";
+
+	# insert data, using the values from the hash above
+	my $rows = $db.vexec($sql, hash_values($args));
+
+	my $q = $db.selectRow("select * from data_test");
+	if ($o.verbose > 1)
+	foreach my $k in (keys $q)
+		tprintf(2, " %-16s= %-10s %N\n", $k, type($q.$k), $q.$k);
+
+	# remove values where we know they won't match
+	# unitext_f is returned as IMAGE by the server
+	delete $q.unitext_f;
+	delete $args.unitext_f;
+	# rounding errors can happen in real
+	$q.real_f = round($q.real_f);
+	$args.real_f = round($args.real_f);
+
+	# compare each value
+	foreach my $k in (keys $q)
+	test_value($q.$k, $args.$k, sprintf("%s bind and retrieve", $k));
+
+	$db.commit();
+}
+
+sub main()
+{
+	my $test_map =
+	( "sybase" : \sybase_test(),
+	  "freetds"  : \freetds_test(),
+	  "mysql"  : \mysql_test(),
+	  "pgsql"  : \pgsql_test(),
+	  "oracle" : \oracle_test());
+
+	parse_command_line();
+	my $db = getDS();
+
+	my $driver = $db.getDriverName();
+	printf("testing %s driver\n", $driver);
+	my $sv = $db.getServerVersion();
+	if ($o.verbose > 1)
+	tprintf(2, "client version=%n\nserver version=%n\n", $db.getClientVersion(), $sv);
+
+	# determine if the server is a sybase or sql server dataserver
+	if ($driver == "freetds")
+	if ($sv !~ /microsoft/i)
+		$db.is_sybase = True;
+
+	create_datamodel($db);
+
+	context_test($db);
+	transaction_test($db);
+	my $test = $test_map.($db.getDriverName());
+	if (exists $test)
+	$test($db);
+
+	if (!$o.leave)
+	drop_test_datamodel($db);
+	printf("%d/%d tests OK\n", $test_count - $errors, $test_count);
+}
+
+main();
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-r.html b/docs/_style/prism-master/examples/prism-r.html new file mode 100644 index 0000000..3c69418 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-r.html @@ -0,0 +1,38 @@ +

Comments

+
# This is a comment
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+ +

Full example

+
# Goal: To make a latex table with results of an OLS regression.
+
+# Get an OLS --
+x1 = runif(100)
+x2 = runif(100, 0, 2)
+y = 2 + 3*x1 + 4*x2 + rnorm(100)
+m = lm(y ~ x1 + x2)
+
+# and print it out prettily --
+library(xtable)
+# Bare --
+xtable(m)
+xtable(anova(m))
+
+# Better --
+print.xtable(xtable(m, caption="My regression",
+                    label="t:mymodel",
+                    digits=c(0,3,2,2,3)),
+             type="latex",
+             file="xtable_demo_ols.tex",
+             table.placement = "tp",
+             latex.environments=c("center", "footnotesize"))
+
+print.xtable(xtable(anova(m),
+                    caption="ANOVA of my regression",
+                    label="t:anova_mymodel"),
+             type="latex",
+             file="xtable_demo_anova.tex",
+             table.placement = "tp",
+             latex.environments=c("center", "footnotesize"))
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-reason.html b/docs/_style/prism-master/examples/prism-reason.html new file mode 100644 index 0000000..8842f24 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-reason.html @@ -0,0 +1,35 @@ +

Comments

+
/* This is a comment */
+ +

Strings and characters

+
"This is a \"string\""
+'a'
+'\\'
+'\o123'
+'\x4a'
+ +

Constructors

+
type response =
+  | Yes
+  | No
+  | PrettyMuch;
+ +

Example

+
type car = {maker: string, model: string};
+type carList =
+  | List car carList
+  | NoMore;
+
+let chevy = {maker: "Chevy", model: "Suburban"};
+let toyota = {maker: "Toyota", model: "Tacoma"};
+let myCarList = List chevy (List toyota NoMore);
+
+let hasExactlyTwoCars = fun lst =>
+  switch lst {
+    | NoMore => false                              /* 0 */
+    | List p NoMore => false                       /* 1 */
+    | List p (List p2 NoMore) => true              /* 2 */
+    | List p (List p2 (List p3 theRest)) => false  /* 3+ */
+  };
+
+let justTwo = hasExactlyTwoCars myCarList;  /* true! */
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-renpy.html b/docs/_style/prism-master/examples/prism-renpy.html new file mode 100644 index 0000000..dffac07 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-renpy.html @@ -0,0 +1,123 @@ +

Comments

+
+    # This is a comment
+
+ +

Strings

+
+    "foo \"bar\" baz"
+'foo \'bar\' baz'
+""" "Multi-line" strings
+are supported."""
+''' 'Multi-line' strings
+are supported.'''
+
+ +

Python

+
+    class Dog:
+
+    tricks = []             # mistaken use of a class variable
+
+    def __init__(self, name):
+        self.name = name
+
+    def add_trick(self, trick):
+        self.tricks.append(trick)
+
+ +

Properties

+
+    style my_text is text:
+    size 40
+    font "gentium.ttf"
+
+ +

Configuration

+
+    init -1:
+    python hide:
+
+        ## Should we enable the use of developer tools? This should be
+        ## set to False before the game is released, so the user can't
+        ## cheat using developer tools.
+
+        config.developer = True
+
+        ## These control the width and height of the screen.
+
+        config.screen_width = 800
+        config.screen_height = 600
+
+        ## This controls the title of the window, when Ren'Py is
+        ## running in a window.
+
+        config.window_title = u"The Question"
+
+ + +

Full example

+
# Declare images used by this game.
+image bg lecturehall = "lecturehall.jpg"
+image bg uni = "uni.jpg"
+image bg meadow = "meadow.jpg"
+image bg club = "club.jpg"
+
+image sylvie normal = "sylvie_normal.png"
+image sylvie giggle = "sylvie_giggle.png"
+image sylvie smile = "sylvie_smile.png"
+image sylvie surprised = "sylvie_surprised.png"
+
+image sylvie2 normal = "sylvie2_normal.png"
+image sylvie2 giggle = "sylvie2_giggle.png"
+image sylvie2 smile = "sylvie2_smile.png"
+image sylvie2 surprised = "sylvie2_surprised.png"
+
+# Define characters used by this game.
+define s = Character('Sylvie', color="#c8ffc8")
+define m = Character('Me', color="#c8c8ff")
+
+
+# The game starts here.
+label start:
+
+    $ bl_game = False
+
+    play music "illurock.ogg"
+
+    scene bg lecturehall
+    with fade
+
+    "Well, professor Eileen's lecture was interesting."
+    "But to be honest, I couldn't concentrate on it very much."
+    "I had a lot of other thoughts on my mind."
+    "And they all ended up with a question."
+    "A question, I've been meaning to ask someone."
+
+    scene bg uni
+    with fade
+
+    "When we came out of the university, I saw her."
+
+    show sylvie normal
+    with dissolve
+
+    "She was a wonderful person."
+    "I've known her ever since we were children."
+    "And she's always been a good friend."
+    "But..."
+    "Recently..."
+    "I think..."
+    "... that I wanted more."
+    "More just talking... more than just walking home together when our classes ended."
+    "And I decided..."
+
+    menu:
+
+        "... to ask her right away.":
+
+            jump rightaway
+
+        "... to ask her later.":
+
+            jump later
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-rest.html b/docs/_style/prism-master/examples/prism-rest.html new file mode 100644 index 0000000..511e87c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-rest.html @@ -0,0 +1,329 @@ +

Titles

+
===============
+ Section Title
+===============
+
+---------------
+ Section Title
+---------------
+
+Section Title
+=============
+
+Section Title
+-------------
+
+Section Title
+`````````````
+
+Section Title
+'''''''''''''
+
+Section Title
+.............
+
+Section Title
+~~~~~~~~~~~~~
+
+Section Title
+*************
+
+Section Title
++++++++++++++
+
+Section Title
+^^^^^^^^^^^^^
+ +

Lists

+
- This is the first bullet list item.
+- This is the first paragraph in the second item in the list.
+
+  This is the second paragraph in the second item in the list.
+
+  - This is a sublist.  The bullet lines up with the left edge of
+    the text blocks above.
+
+- This is the third item of the main list.
+
+This paragraph is not part of the list.
+
+1. Item 1 initial text.
+
+   a) Item 1a.
+   b) Item 1b.
+
+2. a) Item 2a.
+   b) Item 2b.
+ +

Field lists

+
:Date: 2001-08-16
+:Version: 1
+:Authors: - Me
+          - Myself
+          - I
+:Indentation: Since the field marker may be quite long, the second
+   and subsequent lines of the field body do not have to line up
+   with the first line, but they must be indented relative to the
+   field name marker, and they must line up with each other.
+:Parameter i: integer
+ +

Option lists

+
-a         Output all.
+-b         Output both (this description is
+           quite long).
+-c arg     Output just arg.
+--long     Output all day long.
+
+-p         This option has two paragraphs in the description.
+           This is the first.
+
+           This is the second.  Blank lines may be omitted between
+           options (as above) or left in (as here and below).
+
+--very-long-option  A VMS-style option.  Note the adjustment for
+                    the required two spaces.
+
+--an-even-longer-option
+           The description can also start on the next line.
+
+-2, --two  This option has two variants.
+
+-f FILE, --file=FILE  These two options are synonyms; both have
+                      arguments.
+
+/V         A VMS/DOS-style option.
+ +

Literal blocks

+
::
+
+    for a in [5,4,3,2,1]:   # this is program code, shown as-is
+        print a
+    print "it's..."
+    # a literal block continues until the indentation ends
+
+John Doe wrote::
+
+>> *Great* idea!
+>
+> Why didn't I think of that?
+
+You just did!  ;-)
+ +

Line blocks

+
| Lend us a couple of bob till Thursday.
+| I'm absolutely skint.
+| But I'm expecting a postal order and I can pay you back
+  as soon as it comes.
+| Love, Ewan.
+
+Take it away, Eric the Orchestra Leader!
+
+    | A one, two, a one two three four
+    |
+    | Half a bee, philosophically,
+    |     must, *ipso facto*, half not be.
+    | But half the bee has got to be,
+    |     *vis a vis* its entity.  D'you see?
+    |
+    | But can a bee be said to be
+    |     or not to be an entire bee,
+    |         when half the bee is not a bee,
+    |             due to some ancient injury?
+    |
+    | Singing...
+ +

Grid tables and simple tables

+
+------------------------+------------+----------+----------+
+| Header row, column 1   | Header 2   | Header 3 | Header 4 |
+| (header rows optional) |            |          |          |
++========================+============+==========+==========+
+| body row 1, column 1   | column 2   | column 3 | column 4 |
++------------------------+------------+----------+----------+
+| body row 2             | Cells may span columns.          |
++------------------------+------------+---------------------+
+| body row 3             | Cells may  | - Table cells       |
++------------------------+ span rows. | - contain           |
+| body row 4             |            | - body elements.    |
++------------------------+------------+---------------------+
+
+	+--------------+----------+-----------+-----------+
+	| row 1, col 1 | column 2 | column 3  | column 4  |
+	+--------------+----------+-----------+-----------+
+	| row 2        |                                  |
+	+--------------+----------+-----------+-----------+
+	| row 3        |          |           |           |
+	+--------------+----------+-----------+-----------+
+
+=====  =====  =======
+  A      B    A and B
+=====  =====  =======
+False  False  False
+True   False  False
+False  True   False
+True   True   True
+=====  =====  =======
+
+	=====  =====  ======
+	   Inputs     Output
+	------------  ------
+	  A      B    A or B
+	=====  =====  ======
+	False  False  False
+	True   False  True
+	False  True   True
+	True   True   True
+	=====  =====  ======
+ +

Footnotes and links

+
.. [1] Body elements go here.
+
+If [#note]_ is the first footnote reference, it will show up as
+"[1]".  We can refer to it again as [#note]_ and again see
+"[1]".  We can also refer to it as note_ (an ordinary internal
+hyperlink reference).
+
+.. [#note] This is the footnote labeled "note".
+
+Here is a symbolic footnote reference: [*]_.
+
+.. [*] This is the footnote.
+
+[2]_ will be "2" (manually numbered),
+[#]_ will be "3" (anonymous auto-numbered), and
+[#label]_ will be "1" (labeled auto-numbered).
+
+.. [2] This footnote is labeled manually, so its number is fixed.
+
+.. [#label] This autonumber-labeled footnote will be labeled "1".
+   It is the first auto-numbered footnote and no other footnote
+   with label "1" exists.  The order of the footnotes is used to
+   determine numbering, not the order of the footnote references.
+
+.. [#] This footnote will be labeled "3".  It is the second
+   auto-numbered footnote, but footnote label "2" is already used.
+
+Here is a citation reference: [CIT2002]_.
+
+.. [CIT2002] This is the citation.  It's just like a footnote,
+   except the label is textual.
+
+.. _hyperlink-name: link-block
+
+.. __: anonymous-hyperlink-target-link-block
+
+__ anonymous-hyperlink-target-link-block
+
+Clicking on this internal hyperlink will take us to the target_
+below.
+
+.. _target:
+
+The hyperlink target above points to this paragraph.
+ +

Directives

+
.. image:: mylogo.jpeg
+
+.. figure:: larch.png
+
+   The larch.
+
+.. note:: This is a paragraph
+
+   - Here is a bullet list.
+
+.. figure:: picture.png
+   :scale: 50 %
+   :alt: map to buried treasure
+
+   This is the caption of the figure (a simple paragraph).
+
+   The legend consists of all elements after the caption.  In this
+   case, the legend consists of this paragraph and the following
+   table:
+
+   +-----------------------+-----------------------+
+   | Symbol                | Meaning               |
+   +=======================+=======================+
+   | .. image:: tent.png   | Campground            |
+   +-----------------------+-----------------------+
+   | .. image:: waves.png  | Lake                  |
+   +-----------------------+-----------------------+
+   | .. image:: peak.png   | Mountain              |
+   +-----------------------+-----------------------+
+ +

Substitutions

+
The |biohazard| symbol must be used on containers used to
+dispose of medical waste.
+
+.. |biohazard| image:: biohazard.png
+
+|Michael| and |Jon| are our widget-wranglers.
+
+.. |Michael| user:: mjones
+.. |Jon|     user:: jhl
+
+West led the |H| 3, covered by dummy's |H| Q, East's |H| K,
+and trumped in hand with the |S| 2.
+
+.. |H| image:: /images/heart.png
+   :height: 11
+   :width: 11
+.. |S| image:: /images/spade.png
+   :height: 11
+   :width: 11
+
+* |Red light| means stop.
+* |Green light| means go.
+* |Yellow light| means go really fast.
+
+.. |Red light|    image:: red_light.png
+.. |Green light|  image:: green_light.png
+.. |Yellow light| image:: yellow_light.png
+ +

Comments

+
.. This is a comment
+
+..
+   _so: is this!
+
+..
+   [and] this!
+
+..
+   this:: too!
+
+..
+   |even| this:: !
+ +

Inline markup

+
This is *emphasized text*.
+This is **strong text**.
+This is `interpreted text`.
+:role:`interpreted text`
+`interpreted text`:role:
+This text is an example of ``inline literals``.
+The regular expression ``[+-]?(\d+(\.\d*)?|\.\d+)`` matches
+floating-point numbers (without exponents).
+
+See the `Python home page <http://www.python.org>`_ for info.
+
+Oh yes, the _`Norwegian Blue`.  What's, um, what's wrong with it?
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Nothing is highlighted inside table cells

+
+---------------+----------+
+| column 1     | column 2  |
++--------------+-----------+
+| **bold**?    | *italic*? |
++--------------+-----------+
+ +

The inline markup recognition rules are not as strict as they are in the spec

+

No inline markup should be highlighted in the following code.

+
2 * x a ** b (* BOM32_* ` `` _ __ |
+"*" '|' (*) [*] {*} <*> ‘*’ ‚*‘ ‘*‚ ’*’ ‚*’ “*†„*“ “*„ â€*†„*†»*« ›*‹ «*» »*» ›*›
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-rip.html b/docs/_style/prism-master/examples/prism-rip.html new file mode 100644 index 0000000..99769c3 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-rip.html @@ -0,0 +1,12 @@ +

Comments

+
# This is a comment
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+ +

Regex

+
regular_expression = /abc/
+ +

Symbols

+
string_symbol = :rip 
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-roboconf.html b/docs/_style/prism-master/examples/prism-roboconf.html new file mode 100644 index 0000000..ca57221 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-roboconf.html @@ -0,0 +1,49 @@ +

Full example

+
ApacheServer {
+    # Apache instances will be deployed by Roboconf's Puppet extension
+    installer: puppet;
+
+    # Web applications could be deployed over this Apache server
+    children: My-Dash-Board, Marketing-Suite;
+
+    # Properties exported by this component.
+    # 'port' should have a default value, or we will have to set it when we create an instance.
+    exports: port = 19099;
+
+    # 'ip' is a special variable. It will be updated at runtime by a Roboconf agent.
+    exports: ip;
+
+    # Other components properties that this server needs to have so that it can start.
+    imports: LB.port (optional), LB.ip (optional);
+
+    # Here, the Apache may also be notified about components instances of type LB.
+    # The imports are marked as optional. It means that if there is no LB instance, an
+    # Apache instance will be able to start anyway.
+    #
+    # If the import was not optional, e.g.
+    #
+    # imports: LB.port, LB.ip;
+    # or even
+    # imports: LB.port (optional), LB.ip;
+    #
+    # ... then an Apache instance would need at least one LB instance somewhere.
+
+    # Imports may also reference variables from other applications
+    imports: external Lamp.lb-ip;
+}
+
+facet LoadBalanced {
+    exports: ip, port;  # Define we export two variables.
+}
+
+instance of VM {
+
+    # This will create 5 VM instances, called VM 1, VM 2, VM3, VM 4 and VM 5.
+    name: VM ;  # Yes, there is a space at the end... :)
+    count: 5;
+
+    # On every VM instance, we will deploy...
+    instance of Tomcat {
+        name: Tomcat;
+    }
+}
diff --git a/docs/_style/prism-master/examples/prism-ruby.html b/docs/_style/prism-master/examples/prism-ruby.html new file mode 100644 index 0000000..4f1e390 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-ruby.html @@ -0,0 +1,30 @@ +

Comments

+
# This is a comment
+=begin
+Multi-line
+comment
+=end
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+ +

Regular expressions

+
/foo?[ ]*bar/
+ +

Variables

+
$foo = 5;
+class InstTest
+  def set_foo(n)
+    @foo = n
+  end
+  def set_bar(n)
+    @bar = n
+  end
+end
+ +

Symbols

+
mystring = :steveT;
+ +

String Interpolation

+
"foo #{'bar'+my_variable}"
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-rust.html b/docs/_style/prism-master/examples/prism-rust.html new file mode 100644 index 0000000..d447968 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-rust.html @@ -0,0 +1,68 @@ +

Comments

+
// Single line comment
+/// Doc comments
+/* Multiline
+comment */
+ +

Strings

+
'C'; '\''; '\n'; '\u7FFF'; // Characters
+"foo \"bar\" baz"; // String
+r##"foo #"bar"# baz"##; // Raw string with # pairs
+b'C'; b'\''; b'\n'; // Bytes
+b"foo \"bar\" baz"; // Byte string
+br##"foo #"bar"# baz"##; // Raw byte string with # pairs
+
+ +

Numbers

+
123i;                              // type int
+123u;                              // type uint
+123_u;                             // type uint
+0xff_u8;                           // type u8
+0o70_i16;                          // type i16
+0b1111_1111_1001_0000_i32;         // type i32
+
+123.0f64;        // type f64
+0.1f64;          // type f64
+0.1f32;          // type f32
+12E+99_f64;      // type f64
+
+ +

Booleans

+
true; false;
+ +

Functions and macros

+
println!("x is {}", x);
+fn next_two(x: int) -> (int, int) { (x + 1i, x + 2i) }
+next_two(5i);
+vec![1i, 2, 3];
+
+ +

Attributes

+
#![warn(unstable)]
+#[test]
+fn a_test() {
+	// ...
+}
+ +

Closure parameters and bitwise OR

+
let x = a | b;
+let y = c || d;
+let add_one = |x: int| -> int { 1i + x };
+let printer = || { println!("x is: {}", x); };
+
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Nested block comments

+
/* Nested block
+	/* comments
+	are */
+not supported */
+ +

Delimiters of parameters for closures that don't use braces

+
|x| x + 1i;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-sas.html b/docs/_style/prism-master/examples/prism-sas.html new file mode 100644 index 0000000..8932ebb --- /dev/null +++ b/docs/_style/prism-master/examples/prism-sas.html @@ -0,0 +1,158 @@ +

Comments

+
/* This is a
+multi-line comment */
+
+* This is a comment too;
+ +

Numbers, dates and times

+
42; 4.5; 4.5e-10; -3; -3.5e2; -4.2e-23;
+0afx; 0123x; abcdefx;
+'1jan2013'd; '01jan09'd;
+'9:25't; '9:25:19pm't;
+'01may12:9:30:00'dt; '18jan2003:9:27:05am'dt;
+'2013-05-17T09:15:30–05:00'dt; '2013-05-17T09:15:30–05'dt;
+'2013-07-20T12:00:00+00:00'dt; '2013-07-20T12:00:00Z'dt;
+ +

Strings

+
'Single quoted string';
+"Double quoted string";
+'String ''quoted'' string "containing" quote';
+"Double ""quoted"" string 'containing' quote";
+ +

Operators

+
A**B;
+'foo'||'bar'!!'baz'¦¦'test';
+A<>B><C;
+A~=B¬=C^=D>=E<=F;
+a*b/c+d-e<f>g&h|i!j¦k;
+~a;¬b;^c;
+(a eq b) ne (c gt d) lt e ge f le h;
+state in ('NY','NJ','PA');
+not a;
+ +

More examples

+
/* Some examples adapted from the documentation (http://support.sas.com/documentation/cdl/en/basess/64003/PDF/default/basess.pdf) */
+
+data city; * another inline comment;
+
+	input Year 4. @7 ServicesPolice comma6.
+		@15 ServicesFire comma6. @22 ServicesWater_Sewer comma6.
+		@30 AdminLabor comma6. @39 AdminSupplies comma6.
+		@45 AdminUtilities comma6.;
+	ServicesTotal=ServicesPolice+ServicesFire+ServicesWater_Sewer;
+	AdminTotal=AdminLabor+AdminSupplies+AdminUtilities;
+	Total=ServicesTotal+AdminTotal;
+
+	Test='A string '' whith a quote';
+	Test2 = "A string "" whith a quote";
+
+	label   Total='Total Outlays'
+			ServicesTotal='Services: Total'
+			ServicesPolice='Services: Police'
+			ServicesFire='Services: Fire'
+			ServicesWater_Sewer='Services: Water & Sewer'
+			AdminTotal='Administration: Total'
+			AdminLabor='Administration: Labor'
+			AdminSupplies='Administration: Supplies'
+			AdminUtilities='Administration: Utilities';
+	datalines;
+1993 2,819 1,120 422 391 63 98
+1994 2,477 1,160 500 172 47 70
+1995 2,028 1,061 510 269 29 79
+1996 2,754 893 540 227 21 67
+1997 2,195 963 541 214 21 59
+1998 1,877 926 535 198 16 80
+1999 1,727 1,111 535 213 27 70
+2000 1,532 1,220 519 195 11 69
+2001 1,448 1,156 577 225 12 58
+2002 1,500 1,076 606 235 19 62
+2003 1,934 969 646 266 11 63
+2004 2,195 1,002 643 256 24 55
+2005 2,204 964 692 256 28 70
+2006 2,175 1,144 735 241 19 83
+2007 2,556 1,341 813 238 25 97
+2008 2,026 1,380 868 226 24 97
+2009 2,526 1,454 946 317 13 89
+2010 2,027 1,486 1,043 226 . 82
+2011 2,037 1,667 1,152 244 20 88
+2012 2,852 1,834 1,318 270 23 74
+2013 2,787 1,701 1,317 307 26 66
+;
+proc datasets library=work nolist
+;
+contents data=city
+;
+run;
+
+
+data city3;
+	set city(firstobs=10 obs=15);
+run;
+
+data services (keep=ServicesTotal ServicesPolice ServicesFire
+				ServicesWater_Sewer)
+	admin (keep=AdminTotal AdminLabor AdminSupplies
+			AdminUtilities);
+	set city(drop=Total);
+run;
+proc print data=services;
+	title 'City Expenditures: Services';
+run;
+
+data newlength;
+	set mylib.internationaltours;
+	length Remarks $ 30;
+	if Vendor = 'Hispania' then Remarks = 'Bonus for 10+ people';
+	else if Vendor = 'Mundial' then Remarks = 'Bonus points';
+	else if Vendor = 'Major' then Remarks = 'Discount for 30+ people';
+run;
+proc print data=newlength;
+	var Country Vendor Remarks;
+	title 'Information About Vendors';
+run;
+
+libname mylib 'permanent-data-library';
+data mylib.departures;
+	input Country $ 1-9 CitiesInTour 11-12 USGate $ 14-26
+	ArrivalDepartureGates $ 28-48;
+	datalines;
+Japan 5 San Francisco Tokyo, Osaka
+Italy 8 New York Rome, Naples
+Australia 12 Honolulu Sydney, Brisbane
+Venezuela 4 Miami Caracas, Maracaibo
+Brazil 4 Rio de Janeiro, Belem
+;
+proc print data=mylib.departures;
+	title 'Data Set AIR.DEPARTURES';
+run;
+
+data missingval;
+	length Country $ 10 TourGuide $ 10;
+	input Country TourGuide;
+	* lines is an alias for datalines;
+	lines;
+Japan Yamada
+Italy Militello
+Australia Edney
+Venezuela .
+Brazil Cardoso
+;
+
+data inventory_tool;
+	input PartNumber $ Description $ InStock @17
+		ReceivedDate date9. @27 Price;
+	format ReceivedDate date9.;
+	* cards is an alias for datalines;
+	cards;
+K89R seal 34 27jul2010 245.00
+M4J7 sander 98 20jun2011 45.88
+LK43 filter 121 19may2011 10.99
+MN21 brace 43 10aug2012 27.87
+BC85 clamp 80 16aug2012 9.55
+NCF3 valve 198 20mar2012 24.50
+KJ66 cutter 6 18jun2010 19.77
+UYN7 rod 211 09sep2010 11.55
+JD03 switch 383 09jan2013 13.99
+BV1E timer 26 03aug2013 34.50
+;
+run;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-sass.html b/docs/_style/prism-master/examples/prism-sass.html new file mode 100644 index 0000000..7200e78 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-sass.html @@ -0,0 +1,47 @@ +

Comments

+
/* This comment will appear in the CSS output.
+  This is nested beneath the comment,
+  so it's part of it
+
+// This comment will not appear in the CSS output.
+  This is nested beneath the comment as well,
+  so it also won't appear
+ +

At-rules and shortcuts

+
@mixin large-text
+  color: #ff0000
+
+@media (min-width: 600px)
+  h1
+    @include large-text
+
+=large-text
+  color: #ff0000
+
+h1
+  +large-text
+ +

Variables

+
$width: 5em
+#main
+  width: $width
+
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Deprecated Sass syntax is not supported

+
.page
+  color = 5px + 9px
+
+!width = 13px
+.icon
+  width = !width
+ +

Selectors with pseudo classes are highlighted as property/value pairs

+
a:hover
+  text-decoration: underline
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-scala.html b/docs/_style/prism-master/examples/prism-scala.html new file mode 100644 index 0000000..1dc56f8 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-scala.html @@ -0,0 +1,100 @@ +

Comments

+
// Single line comment
+/* Mutli-line
+comment */
+ +

Strings and characters

+
'a'
+"foo bar baz"
+"""Multi-line
+string"""
+ +

Numbers

+
0
+21
+0xFFFFFFFF
+-42L
+0.0
+1e30f
+3.14159f
+1.0e-100
+.1
+
+ +

Symbols

+
'x
+'identifier
+ +

Full example

+
// Contributed by John Williams
+package examples
+
+object lazyLib {
+
+  /** Delay the evaluation of an expression until it is needed. */
+  def delay[A](value: => A): Susp[A] = new SuspImpl[A](value)
+
+  /** Get the value of a delayed expression. */
+  implicit def force[A](s: Susp[A]): A = s()
+
+  /**
+   * Data type of suspended computations. (The name froms from ML.)
+   */
+  abstract class Susp[+A] extends Function0[A]
+
+  /**
+   * Implementation of suspended computations, separated from the
+   * abstract class so that the type parameter can be invariant.
+   */
+  class SuspImpl[A](lazyValue: => A) extends Susp[A] {
+    private var maybeValue: Option[A] = None
+
+    override def apply() = maybeValue match {
+      case None =>
+        val value = lazyValue
+        maybeValue = Some(value)
+        value
+	  case Some(value) =>
+        value
+    }
+
+    override def toString() = maybeValue match {
+      case None => "Susp(?)"
+      case Some(value) => "Susp(" + value + ")"
+    }
+  }
+}
+
+object lazyEvaluation {
+  import lazyLib._
+
+  def main(args: Array[String]) = {
+    val s: Susp[Int] = delay { println("evaluating..."); 3 }
+
+    println("s     = " + s)       // show that s is unevaluated
+    println("s()   = " + s())     // evaluate s
+    println("s     = " + s)       // show that the value is saved
+    println("2 + s = " + (2 + s)) // implicit call to force()
+
+    val sl = delay { Some(3) }
+    val sl1: Susp[Some[Int]] = sl
+    val sl2: Susp[Option[Int]] = sl1   // the type is covariant
+
+    println("sl2   = " + sl2)
+    println("sl2() = " + sl2())
+    println("sl2   = " + sl2)
+  }
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Nested block comments

+
/* Nested block
+	/* comments
+	are */
+not supported */
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-scheme.html b/docs/_style/prism-master/examples/prism-scheme.html new file mode 100644 index 0000000..de50f22 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-scheme.html @@ -0,0 +1,35 @@ +

Comments

+
; This is a comment
+ +

Booleans

+
#t
+#f
+ +

Strings

+
"two \"quotes\" within"
+ +

Functions

+
(lambda (x) (+ x 3))
+(apply vector 'a 'b '(c d e))
+
+ +

Full example

+
;; Calculation of Hofstadter's male and female sequences as a list of pairs
+
+(define (hofstadter-male-female n)
+  (letrec ((female (lambda (n)
+		     (if (= n 0)
+			 1
+			 (- n (male (female (- n 1)))))))
+	   (male (lambda (n)
+		   (if (= n 0)
+		       0
+		       (- n (female (male (- n 1))))))))
+    (let loop ((i 0))
+      (if (> i n)
+	  '()
+	  (cons (cons (female i)
+		      (male i))
+		(loop (+ i 1)))))))
+
+(hofstadter-male-female 8)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-scss.html b/docs/_style/prism-master/examples/prism-scss.html new file mode 100644 index 0000000..f0daaf5 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-scss.html @@ -0,0 +1,31 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

At-rules

+
@import "foo.scss";
+@media (min-width: 600px) {}
+.seriousError {
+    @extend .error;
+}
+@for $i from 1 through 3 {}
+
+ +

Compass URLs

+
@font-face {
+	font-family: "opensans";
+	src: font-url("opensans.ttf");
+}
+ +

Variables

+
$width: 5em;
+#main {
+    width: $width;
+}
+ +

Interpolations are highlighted in property names

+
p.#{$name} {
+    #{$attr}-color: blue;
+}
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-smalltalk.html b/docs/_style/prism-master/examples/prism-smalltalk.html new file mode 100644 index 0000000..7fb70f8 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-smalltalk.html @@ -0,0 +1,92 @@ +

Numbers

+
3
+30.45
+-3
+0.005
+-14.0
+13772
+8r377
+8r153
+8r34.1
+8r-37
+16r106
+16rFF
+16rAC.DC
+16r-1.C
+1.586e5
+1.586e-3
+8r3e2
+2r11e6
+ +

Strings and characters

+
$a
+$M
+$-
+$$
+$1
+'hi'
+'food'
+'the Smalltalk-80 system'
+'can''t'
+ +

Symbols

+
#bill
+#M63
+#+
+#*
+ +

Arrays

+
#(1 2 3)
+#('food' 'utilities' 'rent' 'household' 'transportation' 'taxes' 'recreation')
+#(('one' 1) ('not' 'negative') 0 -1)
+#(9 'nine' $9 (0 'zero' $0 ( ) 'e' $f 'g' $h 'i'))
+ +

Blocks

+
sum := 0.
+#(2 3 5 7 11) do: [ :primel | sum := sum + (prime * prime)]
+
+sizeAdder := [ :array | total := total + array size].
+
+[ :x :y | (x * x) + (y * y)]
+[ :frame :clippingBox | frame intersect: clippingBox]
+ +

Full example

+
Object>>method: num
+    "comment 123"
+    | var1 var2 |
+    (1 to: num) do: [:i | |var| ^i].
+    Klass with: var1.
+    Klass new.
+    arr := #('123' 123.345 #hello Transcript var $@).
+    arr := #().
+    var2 = arr at: 3.
+    ^ self abc
+
+heapExample
+    "HeapTest new heapExample"
+    "Multiline
+    decription"
+    | n rnd array time sorted |
+    n := 5000.
+    "# of elements to sort"
+    rnd := Random new.
+    array := (1 to: n)
+                collect: [:i | rnd next].
+    "First, the heap version"
+    time := Time
+                millisecondsToRun: [sorted := Heap withAll: array.
+    1
+        to: n
+        do: [:i |
+            sorted removeFirst.
+            sorted add: rnd next]].
+    Transcript cr; show: 'Time for Heap: ' , time printString , ' msecs'.
+    "The quicksort version"
+    time := Time
+                millisecondsToRun: [sorted := SortedCollection withAll: array.
+    1
+        to: n
+        do: [:i |
+            sorted removeFirst.
+            sorted add: rnd next]].
+    Transcript cr; show: 'Time for SortedCollection: ' , time printString , ' msecs'
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-smarty.html b/docs/_style/prism-master/examples/prism-smarty.html new file mode 100644 index 0000000..5e57922 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-smarty.html @@ -0,0 +1,81 @@ +

Comments

+
{* This is a comment with <p>some markup</p> in it *}
+{* Multi-line
+comment *}
+ +

Variables

+
{$foo}
+{$foo.bar}
+{$foo.$bar}
+{$foo[$bar]}
+{$foo->bar}
+{$foo->bar()}
+{#foo#}
+{$smarty.config.foo}
+{$foo[bar]}
+
+ +

Strings and numbers

+
{$foo[4]}
+{$foo['bar']}
+ +

Tags and filters

+
{assign var=foo value='baa'}
+{include file='header.tpl'}
+{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}
+{$title|truncate:40:'...'}
+{$myArray|@count}
+
+{math equation="height * width / division"
+   height=$row_height
+   width=$row_width
+   division=#col_div#}
+ +

Control flow

+ +
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
+   ...
+{/if}
+{if count($var) gt 0}{/if}
+{if $var is even by 3}
+   ...
+{/if}
+
+{foreach from=$myArray item=i name=foo}
+	{$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
+{/foreach}
+
+<ul>
+{foreach from=$items key=myId item=i}
+  <li><a href="item.php?id={$myId}">{$i.no}: {$i.label}</li>
+{/foreach}
+</ul>
+
+ +

Literal section

+
{literal}
+	<script>
+		(function() { /* This is JS, not Smarty */ } ());
+	</script>
+{/literal}
+
+<style type="text/css">
+{literal}
+/* this is an intersting idea for this section */
+.madIdea{
+    border: 3px outset #ffffff;
+    margin: 2 3 4 5px;
+    background-color: #001122;
+}
+{/literal}
+</style>
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Smarty tag in the middle of an HTML tag

+
<div{if $test} class="test"{/if}></div>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-soy.html b/docs/_style/prism-master/examples/prism-soy.html new file mode 100644 index 0000000..648b8e5 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-soy.html @@ -0,0 +1,36 @@ +

Comments

+
/* Multi-line
+comment */
+// This is a comment with <p>some markup</p> in it
+ +

Variable

+
{$name}
+{$folders[0]['name']}
+{$aaa?.bbb.ccc?[0]}
+ +

Commands

+
{template .helloNames}
+  // Greet the person.
+  {call .helloName data="all" /}
+ // Greet the additional people. + {foreach $additionalName in $additionalNames} + {call .helloName} + {param name: $additionalName /} + {/call} + {if not isLast($additionalName)} + <br> // break after every line except the last + {/if} + {ifempty} + No additional people to greet. + {/foreach} +{/template}
+ +

Functions and print directives

+
{if length($items) > 5}
+{$foo|changeNewlineToBr}
+{$bar|truncate: 4, false}
+ +

Literal section

+
{literal}
+This is not a {$variable}
+{/literal}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-sql.html b/docs/_style/prism-master/examples/prism-sql.html new file mode 100644 index 0000000..6fe9977 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-sql.html @@ -0,0 +1,34 @@ +

Comments

+
# Single line comment
+-- Single line comment
+// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+"Multi-line strings
+are supported"
+'Multi-line strings
+are supported'
+ +

Variables

+
SET @variable = 1;
+SET @$_ = 2;
+SET @"quoted-variable" = 3;
+SET @'quoted-variable' = 3;
+SET @`quoted-variable` = 3;
+ +

Operators

+
SELECT 1 && 1;
+SELECT 1 OR NULL;
+SELECT 5 & 2*3;
+SELECT 2 BETWEEN 1 AND 3;
+ +

Functions and keywords

+
SELECT COUNT(*) AS cpt, MAX(t.pos) AS max_pos
+FROM `my_table`
+LEFT JOIN `other_table` AS t
+WHERE `somecol` IS NOT NULL
+ORDER BY t.other_col DESC
diff --git a/docs/_style/prism-master/examples/prism-stylus.html b/docs/_style/prism-master/examples/prism-stylus.html new file mode 100644 index 0000000..2b8ffdc --- /dev/null +++ b/docs/_style/prism-master/examples/prism-stylus.html @@ -0,0 +1,72 @@ +

Full Example

+
/*!
+ * Adds the given numbers together.
+ */
+/*
+ * Adds the given numbers together.
+ */
+// I'm a comment!
+body {
+	font: 12px Helvetica, Arial, sans-serif;
+}
+a.button {
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	border-radius: 5px;
+}
+
+body
+	font: 12px Helvetica, Arial, sans-serif;
+
+a.button:after
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	border-radius: 5px;
+
+body
+	font: 12px Helvetica, Arial, sans-serif
+
+a.link > button#test, input[type=button], a:after
+	-webkit-border-radius: 5px
+	-moz-border-radius: 5px
+	border-radius: 5px
+
+font-size = 14px
+font = font-size "Lucida Grande", Arial
+
+body {
+	padding: 50px;
+	font: 14px/1.4 fonts;
+}
+
+border-radius()
+	-webkit-border-radius arguments
+	-moz-border-radius arguments
+	border-radius arguments
+
+body
+	font 12px Helvetica, Arial, sans-serif
+
+a.button
+	border-radius(5px)
+
+@media (max-width: 30em) {
+	body {
+		color: #fff;
+	}
+}
+
+@media (max-width: 500px)
+	.foo
+		color: #000
+
+	@media (min-width: 100px), (min-height: 200px)
+		.foo
+			color: #100
+
+sum(nums...)
+	sum = 0
+	sum += n for n in nums
+
+sum(1 2 3 4)
+// => 10
diff --git a/docs/_style/prism-master/examples/prism-swift.html b/docs/_style/prism-master/examples/prism-swift.html new file mode 100644 index 0000000..98d6eb5 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-swift.html @@ -0,0 +1,80 @@ +

Comments

+
// this is a comment
+/* this is also a comment,
+but written over multiple lines */
+
+ +

Numbers

+
42
+-23
+3.14159
+0.1
+-273.15
+1.25e-2
+0xC.3p0
+1_000_000
+1_000_000.000_000_1
+ +

Strings

+
let someString = "Some string literal value"
+var emptyString = ""
+// String interpolation
+let multiplier = 3
+"\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
+ +

Control flow

+
for index in 1...5 {
+	println("\(index) times 5 is \(index * 5)")
+}
+for _ in 1...power {
+	answer *= base
+}
+while square < finalSquare {
+	// roll the dice
+	if ++diceRoll == 7 { diceRoll = 1 }
+	// move by the rolled amount
+	square += diceRoll
+	if square < board.count {
+		// if we're still on the board, move up or down for a snake or a ladder
+		square += board[square]
+	}
+}
+switch someCharacter {
+	case "a", "e", "i", "o", "u":
+		println("\(someCharacter) is a vowel")
+	case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
+		"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
+		println("\(someCharacter) is a consonant")
+	default:
+		println("\(someCharacter) is not a vowel or a consonant")
+}
+
+ +

Classes and attributes

+
class MyViewController: UIViewController {
+    @IBOutlet weak var button: UIButton!
+    @IBOutlet var textFields: [UITextField]!
+    @IBAction func buttonTapped(AnyObject) {
+	    println("button tapped!")
+	}
+}
+
+@IBDesignable
+class MyCustomView: UIView {
+    @IBInspectable var textColor: UIColor
+    @IBInspectable var iconHeight: CGFloat
+    /* ... */
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Nested block comments

+
/* Nested block
+	/* comments
+	are */
+not supported */
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-tcl.html b/docs/_style/prism-master/examples/prism-tcl.html new file mode 100644 index 0000000..080d817 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-tcl.html @@ -0,0 +1,26 @@ +

Comments

+
# This is a comment
+ +

Strings

+
"foo \"bar\" baz"
+"foo\
+bar\
+baz"
+ +

Variables

+
$foo
+$foo::bar_42
+$::baz
+${foobar}
+set foo::bar "baz"
+ +

Functions

+
proc foobar {baz} {
+	puts $baz
+}
+
+proc RESTORE/post/:post_id/comment/:comment_id {post_id comment_id} {
+    #| Restore a comment handler
+    comment_restore $comment_id
+    qc::actions redirect [url "/post/$post_id" show_deleted_comment_ids $comment_id]
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-textile.html b/docs/_style/prism-master/examples/prism-textile.html new file mode 100644 index 0000000..4ff4d12 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-textile.html @@ -0,0 +1,178 @@ +

HTML

+
I am <b>very</b> serious.
+
+<div style="background:#fff">Foo bar</div>
+ +

Blocks

+
h1. Header 1
+
+h2. Header 2
+
+h3. Header 3 written on
+multiple lines
+
+bq. A block quotation
+on multiple lines.
+ +

Footnotes

+
This is covered elsewhere[1].
+
+fn1. Down here, in fact.
+ +

Structural emphasis

+
I _believe_ every word.
+And then? She *fell*!
+
+I __know__.
+I **really** __know__.
+
+??Cat's Cradle?? by Vonnegut
+
+Convert with @r.to_html@
+
+I'm -sure- not sure.
+
+You are a +pleasant+ child.
+
+a ^2^ + b ^2^ = c ^2^
+log ~2~ x
+ +

Block attributes

+
p(example1). An example
+
+p(#big-red). Red here
+
+p(example1#big-red2). Red here
+
+p{color:blue;margin:30px}. Spacey blue
+
+p[fr]. rouge
+ +

Phrase attributes

+
I seriously *{color:red}blushed*
+when I _(big)sprouted_ that
+corn stalk from my
+%[es]cabeza%.
+ +

Phrase alignments and indentation

+
p<. align left
+
+p>. align right
+
+p=. centered
+
+p<>. justified
+
+p(. left ident 1em
+
+p((. left ident 2em
+
+p))). right ident 3em
+ +

Attributes and alignments combined

+
h2()>. Bingo.
+
+h3()>[no]{color:red}. Bingo
+ +

Lists

+
# First item
+# Second item
+# Third
+
+# Fuel could be:
+## Coal
+## Gasoline
+## Electricity
+# Humans need only:
+## Water
+## Protein
+
+* First item
+* Second item
+* Third
+
+* Fuel could be:
+** Coal
+** Gasoline
+** Electricity
+* Humans need only:
+** Water
+** Protein
+
+#(foo) List can have attributes too
+#{background: red} Red item
+ +

Links and images

+
I searched "Google":http://google.com.
+
+I am crazy about "Hobix":hobix
+and "it's":hobix "all":hobix I ever
+"link to":hobix!
+
+[hobix]http://hobix.com
+
+And "(some-link)[en]links":# can have attributes too!
+
+!http://redcloth.org/hobix.com/textile/sample.jpg!
+!openwindow1.gif(Bunny.)!
+!openwindow1.gif!:http://hobix.com/
+
+!>obake.gif!
+
+And others sat all round the small
+machine and paid it to sing to them.
+ +

Tables

+
| name | age | sex |
+| joan | 24 | f |
+| archie | 29 | m |
+| bella | 45 | f |
+
+|_. name |_. age |_. sex |
+| joan | 24 | f |
+| archie | 29 | m |
+| bella | 45 | f |
+
+|_. attribute list |
+|<. align left |
+|>. align right|
+|=. center |
+|<>. justify |
+|^. valign top |
+|~. bottom |
+
+|\2. spans two cols |
+| col 1 | col 2 |
+
+|/3. spans 3 rows | a |
+| b |
+| c |
+
+|{background:#ddd}. Grey cell|
+
+table{border:1px solid black}.
+|This|is|a|row|
+|This|is|a|row|
+
+|This|is|a|row|
+{background:#ddd}. |This|is|grey|row|
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Nested styles are only partially supported

+ +

Only one level of nesting is supported.

+ +
*A bold paragraph %containing a span with broken _italic_ inside%!*
+ +

HTML inside Textile is not supported

+ +

But Textile inside HTML should be just fine.

+ +
<strong>This _should_ work properly.</strong>
+*But this is <em>definitely</em> broken.*
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-tsx.html b/docs/_style/prism-master/examples/prism-tsx.html new file mode 100644 index 0000000..d83d1dd --- /dev/null +++ b/docs/_style/prism-master/examples/prism-tsx.html @@ -0,0 +1,31 @@ +

Full example

+
import * as React from 'react';
+
+interface IState {
+	clicks: number;
+}
+
+export class Clicker extends React.Component<any, IState> {
+	constructor(props) {
+		super(props);
+
+		this.state = {
+			clicks: 0,
+		};
+	}
+
+	public clickHandler = () => {
+		this.setState({ clicks: this.state.clicks + 1 });
+	}
+
+	public render() {
+		return (
+			<div>
+				<p>You have clicked the button {this.state.clicks} time(s).</p>
+				<p>
+					<button onClick={this.clickHandler}>click me</button>
+				</p>
+			</div>
+		);
+	}
+}
diff --git a/docs/_style/prism-master/examples/prism-tt2.html b/docs/_style/prism-master/examples/prism-tt2.html new file mode 100644 index 0000000..1a6711f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-tt2.html @@ -0,0 +1,61 @@ +

Comments

+
[%# this entire directive is ignored no
+    matter how many lines it wraps onto
+%]
+[% # this is a comment
+   theta = 20      # so is this
+   rho   = 30      # <aol>me too!</aol>
+%]
+
+ +

Variables

+
[% text %]
+[% article.title %]
+[%= eat.whitespace.left %]
+[% eat.whitespace.right =%]
+[%= eat.whitespace.both =%]
+[% object.method() %]
+ + +

Conditionals and Loops

+
[% IF foo = bar %]
+this
+[% ELSE %]
+that
+[% END %]
+[% FOREACH post IN q.listPosts(lingua = "de") %]
+  <a href="[% post.permalink %]">[% post.title | html %]</a>
+[% END %]
+ +

Multiple Directives

+
[% IF title;
+      INCLUDE header;
+   ELSE;
+      INCLUDE other/header  title="Some Other Title";
+   END
+%]
+ +

Operators

+
[% FOREACH post IN q.listPosts(lingua => 'de') %]
+  [% post.title | myfilter(foo = "bar") %]
+[% END %]
+ +

Known Limitations

+
    +
  • + Outline tags are not supported.
  • +
  • The arguments to + TAGS + are usually misinterpreted
  • +
  • In TT2, you can use keywords as identifiers where this is + unambiguous. But these keywords will be highlighted as keywords, not + as variables here.
  • +
  • The + ANYCASE + option is not supported.
  • +
  • + Any number of backslashes in front of dollar signs inside of double quoted + strings are ignored since the behavior of Template Toolkit 2.26 seems to be + inconsistent. +
  • +
diff --git a/docs/_style/prism-master/examples/prism-twig.html b/docs/_style/prism-master/examples/prism-twig.html new file mode 100644 index 0000000..0a70781 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-twig.html @@ -0,0 +1,35 @@ +

Comments

+
{# Some comment
+on multiple lines
+with <html></html>
+inside #}
+ +

Keywords

+
{% if foo %} bar {% endif %}
+{% for key, value in arr if value %} {{ do_something() }} {% endfor %}
+{% include 'header.html' %}
+{% include 'template.html' with {'foo': 'bar'} %}
+ +

Operators

+
{{ not a }}
+{{ 20 // 7 }}
+{{ b b-and c }}
+{% if phone matches '/^[\\d\\.]+$/' %} ... {% endif %}
+ +

Twig embedded in HTML

+
<div>
+{% if foo %}
+	<p>Foo!</p>
+{% else %}
+	<p>Not foo...</p>
+{% endif %}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Tag containing Twig is not highlighted

+
<div{% if foo %} class="bar"{% endif %}></div>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-typescript.html b/docs/_style/prism-master/examples/prism-typescript.html new file mode 100644 index 0000000..561c4dc --- /dev/null +++ b/docs/_style/prism-master/examples/prism-typescript.html @@ -0,0 +1,28 @@ +

Full example

+
interface SearchFunc {
+  (source: string, subString: string): boolean;
+}
+
+var mySearch: SearchFunc;
+mySearch = function(source: string, subString: string) {
+  var result = source.search(subString);
+  if (result == -1) {
+    return false;
+  }
+  else {
+    return true;
+  }
+}
+
+class Greeter {
+    greeting: string;
+    constructor(message: string) {
+        this.greeting = message;
+    }
+    greet() {
+        return "Hello, " + this.greeting;
+    }
+}
+
+var greeter = new Greeter("world");
+
diff --git a/docs/_style/prism-master/examples/prism-vala.html b/docs/_style/prism-master/examples/prism-vala.html new file mode 100644 index 0000000..ef5e98a --- /dev/null +++ b/docs/_style/prism-master/examples/prism-vala.html @@ -0,0 +1,33 @@ +

Comments

+
// Single line comment
+/** Multi-line
+doc comment */
+ +

Strings

+
"foo \"bar\" baz"
+"Multi-line strings ending with a \
+are supported too."
+"""Verbatim strings
+You can create
+multi-line strings like this too."""
+@"Template string with variables $var1 $(var2 * 2)"
+ +

Regex

+
/foo?[ ]*bar/
+ +

Full example

+
using Gtk;
+
+int main (string[] args) {
+	Gtk.init(ref args);
+
+	var window = new Window();
+
+	var button = new Button.with_label("Click me!");
+
+	window.add(button);
+	window.show_all();
+
+	Gtk.main();
+	return 0;
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-vbnet.html b/docs/_style/prism-master/examples/prism-vbnet.html new file mode 100644 index 0000000..bc2a376 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-vbnet.html @@ -0,0 +1,16 @@ +

Comments

+
!foobar
+REM foobar
+'foobar
+ +

Example

+
Public Function findValue(ByVal arr() As Double,
+    ByVal searchValue As Double) As Double
+    Dim i As Integer = 0
+    While i <= UBound(arr) AndAlso arr(i) <> searchValue
+        ' If i is greater than UBound(arr), searchValue is not checked.
+        i += 1
+    End While
+    If i > UBound(arr) Then i = -1
+    Return i
+End Function
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-velocity.html b/docs/_style/prism-master/examples/prism-velocity.html new file mode 100644 index 0000000..a97fa05 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-velocity.html @@ -0,0 +1,47 @@ +

Comments

+
## Single line comment
+#* Multi-line
+comment *#
+ +

Unparsed sections

+
## Section below is not parsed
+#[[
+	## This is not a comment
+]]#
+ +

Variables

+
$mud
+$customer.Name
+$flogger.getPromo( $mud )
+$!{mudSlinger_9}
+$foo[0]
+$foo[$i]
+$foo["bar"]
+$foo.bar[1].junk
+$foo.callMethod()[1]
+ +

Directives

+
#set($foo.bar[1] = 3)
+#if($a==1)true enough#{else}no way!#end
+#macro( d )
+<tr><td>$!bodyContent</td></tr>
+#end
+#@d()Hello!#end
+ +

Integration with HTML

+
<html>
+  <body>
+    Hello $customer.Name!
+    <table>
+    #foreach( $mud in $mudsOnSpecial )
+      #if ( $customer.hasPurchased($mud) )
+        <tr>
+          <td>
+            $flogger.getPromo( $mud )
+          </td>
+        </tr>
+      #end
+    #end
+    </table>
+  </body>
+</html>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-verilog.html b/docs/_style/prism-master/examples/prism-verilog.html new file mode 100644 index 0000000..d7c9a0b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-verilog.html @@ -0,0 +1,103 @@ +

Note that this package supports syntax highlighting for both Verilog and System Verilog.

+ +

Comments

+
/* Multiline comments in Verilog
+   look like C comments and // is OK in here. */
+// Single-line comment in Verilog.
+ +

Literals

+
// example code from: http://iroi.seu.edu.cn/books/asics/Book2/CH11/CH11.02.htm
+module declarations;
+  parameter H12_UNSIZED = 'h 12;
+  parameter H12_SIZED = 6'h 12;
+  parameter D42 = 8'B0010_1010;
+  parameter D123 = 123;
+  parameter D63 = 8'o 77;
+  parameter A = 'h x, B = 'o x, C = 8'b x, D = 'h z, E = 16'h ????;
+  reg [3:0] B0011,Bxxx1,Bzzz1;
+  real R1,R2,R3;
+  integer I1,I3,I_3;
+  parameter BXZ = 8'b1x0x1z0z;
+
+  initial begin
+    B0011 = 4'b11; Bxxx1 = 4'bx1; Bzzz1 = 4'bz1;
+    R1 = 0.1e1; R2 = 2.0; R3 = 30E-01;
+    I1 = 1.1; I3 = 2.5; I_3 = -2.5;
+  end
+
+  initial begin #1;
+    $display("H12_UNSIZED, H12_SIZED (hex) = %h, %h",H12_UNSIZED, H12_SIZED);
+    $display("D42 (bin) = %b",D42," (dec) = %d",D42);
+    $display("D123 (hex) = %h",D123," (dec) = %d",D123);
+    $display("D63 (oct) = %o",D63);
+    $display("A (hex) = %h",A," B (hex) = %h",B);
+    $display("C (hex) = %h",C," D (hex) = %h",D," E (hex) = %h",E);
+    $display("BXZ (bin) = %b",BXZ," (hex) = %h",BXZ);
+    $display("B0011, Bxxx1, Bzzz1 (bin) = %b, %b, %b",B0011,Bxxx1,Bzzz1);
+    $display("R1, R2, R3 (e, f, g) = %e, %f, %g", R1, R2, R3);
+    $display("I1, I3, I_3 (d) = %d, %d, %d", I1, I3, I_3);
+  end
+endmodule
+ +

Full example

+
`include "internal_defines.vh"
+
+//*****************************************************************************
+// memory_decoder: a custom module used to handle memory transactions
+//*****************************************************************************
+//
+// out_mem (output) - The output to memory
+// out_reg (output) - The output to the register file
+// mem_we  (output) - Which byte in the word to write too
+// mem_in  (input)  - The input from memory
+// addr_in (input)  - The lowest 2 bits of byte offset to store in memory
+// data_in (input)  - The input from the register file to be stored
+// l_bit   (input)  - The load bit signal (control)
+// b_bit   (input)  - The byte bit signal (control)
+//
+module memory_decoder(out_mem, out_reg, mem_in, data_in, l_bit, b_bit, addr_in,
+                      mem_we);
+
+  output reg  [31:0]  out_mem, out_reg;
+  output reg  [3:0]   mem_we;
+  input       [31:0]  mem_in, data_in;
+  input       [1:0]   addr_in;
+  input               l_bit, b_bit;
+
+  always_comb begin
+    mem_we = 4'b0000;     // dont write memory by default
+    if (l_bit == 1) begin // ldr and ldrb
+      out_mem = mem_in;   // dont change memory!
+      if (b_bit == 1) begin
+        /* figure out which byte to load from memory */
+        case (addr_in)
+          2'b00: out_reg = {24'b00, mem_in[7:0]};
+          2'b01: out_reg = {24'b00, mem_in[15:8]};
+          2'b10: out_reg = {24'b00, mem_in[23:16]};
+          2'b11: out_reg = {24'b00, mem_in[31:24]};
+        endcase
+      end
+      else begin
+        out_reg = mem_in;
+      end
+    end
+    else begin            // str and strb
+      out_reg = `UNKNOWN; // We are not reading from mem
+      if (b_bit == 1) begin
+        /* figure out which byte to write to in memory */
+        out_mem = {4{data_in[7:0]}};
+        case (addr_in)
+          2'b00: mem_we = 4'b1000;
+          2'b01: mem_we = 4'b0100;
+          2'b10: mem_we = 4'b0010;
+          2'b11: mem_we = 4'b0001;
+        endcase
+      end
+      else begin
+        mem_we = 4'b1111; // write to all channels
+        out_mem = data_in;
+      end
+    end
+  end
+
+endmodule
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-vhdl.html b/docs/_style/prism-master/examples/prism-vhdl.html new file mode 100644 index 0000000..b495085 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-vhdl.html @@ -0,0 +1,92 @@ +

Comments

+
-- I am a comment
+I am not
+ +

Literals

+
constant FREEZE : integer := 32;
+constant TEMP : real := 32.0;
+A_INT <= 16#FF#;
+B_INT <= 2#1010_1010#;
+MONEY := 1_000_000.0;
+FACTOR := 2.2E-6;
+constant DEL1 :time := 10 ns;
+constant DEL2 :time := 2.27 us;
+type MY_LOGIC is ('X','0','1','Z');
+type T_STATE is (IDLE, READ, END_CYC);
+signal CLK : MY_LOGIC := '0';
+signal STATE : T_STATE := IDLE;
+constant FLAG :bit_vector(0 to 7) := "11111111";
+constant MSG : string := "Hello";
+BIT_8_BUS <= B"1111_1111";
+BIT_9_BUS <= O"353";
+BIT_16_BUS <= X"AA55";
+constant TWO_LINE_MSG : string := "Hello" & CR & "World";
+ +

Full example

+
-- example code from: http://www.csee.umbc.edu/portal/help/VHDL/samples/samples.html
+library IEEE;
+use IEEE.std_logic_1164.all;
+
+entity fadd is               -- full adder stage, interface
+  port(a    : in  std_logic;
+       b    : in  std_logic;
+       cin  : in  std_logic;
+       s    : out std_logic;
+       cout : out std_logic);
+end entity fadd;
+
+architecture circuits of fadd is  -- full adder stage, body
+begin  -- circuits of fadd
+  s <= a xor b xor cin after 1 ns;
+  cout <= (a and b) or (a and cin) or (b and cin) after 1 ns;
+end architecture circuits; -- of fadd
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+entity add32 is             -- simple 32 bit ripple carry adder
+  port(a    : in  std_logic_vector(31 downto 0);
+       b    : in  std_logic_vector(31 downto 0);
+       cin  : in  std_logic;
+       sum  : out std_logic_vector(31 downto 0);
+       cout : out std_logic);
+end entity add32;
+
+architecture circuits of add32 is
+  signal c : std_logic_vector(0 to 30); -- internal carry signals
+begin  -- circuits of add32
+  a0: entity WORK.fadd port map(a(0), b(0), cin, sum(0), c(0));
+  stage: for I in 1 to 30 generate
+             as: entity WORK.fadd port map(a(I), b(I), c(I-1) , sum(I), c(I));
+         end generate stage;
+  a31: entity WORK.fadd port map(a(31), b(31), c(30) , sum(31), cout);
+end architecture circuits;  -- of add32
+
+use STD.textio.all;
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_textio.all;
+
+entity signal_trace is
+end signal_trace;
+
+architecture circuits of signal_trace is
+  signal a:    std_logic_vector(31 downto 0) := x"00000000";
+  signal b:    std_logic_vector(31 downto 0) := x"FFFFFFFF";
+  signal cin:  std_logic := '1';
+  signal cout: std_logic;
+  signal sum:  std_logic_vector(31 downto 0);
+begin  -- circuits of signal_trace
+  adder: entity WORK.add32 port map(a, b, cin, sum, cout); -- parallel circuit
+
+  prtsum: process (sum)
+            variable my_line : LINE;
+            alias swrite is write [line, string, side, width] ;
+          begin
+            swrite(my_line, "sum=");
+            write(my_line, sum);
+            swrite(my_line, ",  at=");
+            write(my_line, now);
+            writeline(output, my_line);
+          end process prtsum;
+
+end architecture circuits; -- of signal_trace
diff --git a/docs/_style/prism-master/examples/prism-vim.html b/docs/_style/prism-master/examples/prism-vim.html new file mode 100644 index 0000000..567b820 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-vim.html @@ -0,0 +1,25 @@ +

Comments

+
" This is a comment
+ +

Variables

+

+set softab = 2
+map <leader>tn :tabnew
+
+ +

Map

+
mystring = :steveT;
+ +

Functions

+

+func! DeleteTrailingWS()
+  exe "normal mz"
+  %s/\s\+$//ge
+  exe "normal `z"
+endfunc
+ +

Logic

+

+if has("mac")
+  nmap <D-j> <M-j>
+endif
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-visual-basic.html b/docs/_style/prism-master/examples/prism-visual-basic.html new file mode 100644 index 0000000..733faa8 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-visual-basic.html @@ -0,0 +1,36 @@ +

Comments

+
' Comment
+REM This is a comment too
+ +

Strings and characters

+
"Foo""bar"
+“â€
+"a"c
+ +

Dates and times

+
# 8/23/1970 3:45:39AM #
+#8/23/1970 #
+# 3:45:39AM #
+# 3:45:39#
+# 13:45:39 #
+# 1AM #
+# 13:45:39PM #
+ +

Numbers

+
42S
+.369E+14
+3.1415R
+ +

Preprocessing directives

+
#ExternalChecksum("c:\wwwroot\inetpub\test.aspx", _
+    "{12345678-1234-1234-1234-123456789abc}", _
+    "1a2b3c4e5f617239a49b9a9c0391849d34950f923fab9484")
+ +

Keywords

+
Function AddNumbers(ByVal X As Integer, ByVal Y As Integer)
+    AddNumbers = X + Y
+End Function
+Module Test
+    Sub Main()
+    End Sub
+End Module
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-wasm.html b/docs/_style/prism-master/examples/prism-wasm.html new file mode 100644 index 0000000..5cc1b65 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-wasm.html @@ -0,0 +1,43 @@ +

Comments

+
;; Single line comment
+(; Multi-line
+comment ;)
+ +

Strings

+
""
+"Foobar"
+"Foo\"ba\\r"
+ +

Numbers

+
42
+3.1415
+0.4E-4
+-3.1_41_5
+0xBADFACE
+0xB_adF_a_c_e
++0x4E.F7
+0xFFp+4
+inf
+nan
+nan:0xf4
+ +

Keywords

+
(func (param i32) (param f32) (local f64)
+  get_local 0
+  get_local 1
+  get_local 2)
+ +

Identifiers

+
$p
+$getAnswer
+$return_i32
+ +

Full example

+
(module
+  (import "js" "memory" (memory 1))
+  (import "js" "table" (table 1 anyfunc))
+  (elem (i32.const 0) $shared0func)
+  (func $shared0func (result i32)
+   i32.const 0
+   i32.load)
+)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-wiki.html b/docs/_style/prism-master/examples/prism-wiki.html new file mode 100644 index 0000000..295eb3f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-wiki.html @@ -0,0 +1,165 @@ +

Embedded markup

+
Paragraphs can be forced in lists by using HTML tags.
+Two line break symbols, <code><nowiki><br /><br /></nowiki></code>, will create the desired effect. So will enclosing all but the first paragraph with <code><nowiki><p>...</p></nowiki></code>
+ +

Headings

+
= Header 1 =
+== Header 2 ==
+=== Header 3 ===
+==== Header 4 ====
+===== Header 5 =====
+====== Header 6 ======
+ +

Bold and italic

+
'''''Both bold and italic'''''
+'''Only bold'''
+''Only italic''
+ +

Links and Magic links

+
[[w:en:Formal_grammar|Formal grammar]]
+[http://www.cl.cam.ac.uk/~mgk25/iso-ebnf.html EBNF help]
+
+ISBN 1234567890
+ISBN 123456789x
+ISBN      1 2 3-4-5 6789 X
+ISBN 978-9999999999
+
+RFC 822
+PMID 822
+ +

Magic words and special symbols

+
#REDIRECT [[somewhere]]
+
+{{SITENAME}}
+{{PAGESINCATEGORY:category}}
+{{#dateformat:2009-12-25|mdy}}
+
+__NOTOC__
+
+{{!}}
+
+~~~ ~~~~ ~~~~~
+ +

Lists

+
* Lists are easy to do:
+** start every line
+* with a star
+** more stars mean
+*** deeper levels
+
+# Numbered lists are good
+## very organized
+## easy to follow
+
+; Definition lists
+; item : definition
+; semicolon plus term
+: colon plus definition
+
+* Or create mixed lists
+*# and nest them
+*#* like this
+*#*; definitions
+*#*: work:
+*#*; apple
+*#*; banana
+*#*: fruits
+ +

Tables

+
{|
+|Orange
+|Apple
+|-
+|Bread
+|Pie
+|-
+|Butter
+|Ice cream
+|}
+
+{|
+|Lorem ipsum dolor sit amet,
+consetetur sadipscing elitr,
+sed diam nonumy eirmod tempor invidunt
+ut labore et dolore magna aliquyam erat,
+sed diam voluptua.
+
+At vero eos et accusam et justo duo dolores
+et ea rebum. Stet clita kasd gubergren,
+no sea takimata sanctus est Lorem ipsum
+dolor sit amet.
+|
+* Lorem ipsum dolor sit amet
+* consetetur sadipscing elitr
+* sed diam nonumy eirmod tempor invidunt
+|}
+
+{|
+|  Orange    ||   Apple   ||   more
+|-
+|   Bread    ||   Pie     ||   more
+|-
+|   Butter   || Ice cream ||  and more
+|}
+
+{|
+! style="text-align:left;"| Item
+! Amount
+! Cost
+|-
+|Orange
+|10
+|7.00
+|-
+|Bread
+|4
+|3.00
+|-
+|Butter
+|1
+|5.00
+|-
+!Total
+|
+|15.00
+|}
+
+{|
+! style="text-align:left;"| Item !! style="color:red;"| Amount !! Cost
+|-
+|Orange
+|10
+|7.00
+|-
+| style="text-align:right;"| Bread
+|4
+|3.00
+|-
+|Butter
+|1
+|5.00
+|-
+!Total
+|
+|15.00
+|}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs†list, just with a certain type of bug. +

+ +

Nested magic words are not supported

+ +
{{#switch:{{PAGENAME}}
+| L'Aquila = No translation
+| L = Not OK
+| L'Aquila = Entity escaping
+| L'Aquila = Numeric char encoding
+}}
+ +

Nesting of bold and italic is not supported

+
''Italic with '''bold''' inside''
+ diff --git a/docs/_style/prism-master/examples/prism-xeora.html b/docs/_style/prism-master/examples/prism-xeora.html new file mode 100644 index 0000000..541a916 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-xeora.html @@ -0,0 +1,111 @@ +

Special Constants

+
$DomainContents$
+$PageRenderDuration$
+ +

Operators & Variables

+
$SearchKey$
+$^SearchKey$
+$~SearchKey$
+$-SearchKey$
+$+SearchKey$
+$=SearchKey$
+$#SearchKey$
+$##SearchKey$
+
+$*SearchKey$
+
+$@SearchObject.SearchProperty$
+$@#SearchObject.SearchProperty$
+$@-SearchObject.SearchProperty$
+ +

Controls

+
$C:ControlID$
+$C:ControlID:{ <!-- Something --> }:ControlID$
+$C:ControlID:{ <!-- Something --> }:ControlID:{ <!-- Something (Alternative) --> }:ControlID$
+
+Control with Parent
+$C[Control1]:Control2$
+$C[Control2]:Control3:{ <!-- Something --> }:Control3$
+$C[Control2]:Control3:{ <!-- Something --> }:Control3:{ <!-- Something (Alternative) --> }:Control3$
+
+Control with Parent & Leveling
+$C#1[ParentControlID]:ControlID:{ <!-- Something --> }:ControlID$
+
+All Control Tags has leveling specification;
+$C:LoopControl1:{
+	$#FirstLoopSQLField1$
+
+	$C:ControlID:{ <!-- Something --> }:ControlID$
+
+	$C:LoopControl2:{
+		$##FirstLoopSQLField1$
+		$#SecondLoopSQLField1$
+
+		$C#1:ControlID:{ <!-- Something --> }:ControlID$
+	}:LoopControl2$
+}:LoopControl1$
+
+XML setup on a Control in Controls.xml
+<Control id="[ControlID]">
+	<Type>[ControlType]</Type>
+
+	<Bind>[ThemeID|AddonID]?[ControlClass].[FunctionName],SomeOperatorTags(seperated with |)</Bind>
+
+	<BlockIDsToUpdate localupdate="True|False">
+		<BlockID>[BlockID]</BlockID>
+		<BlockID>[BlockID]</BlockID>
+		<BlockID>[BlockID]</BlockID>
+	</BlockIDsToUpdate>
+
+	<DefaultButtonID>[ControlID]</DefaultButtonID>
+
+	<Text>[TextBox, Password value or Button Text]</Text>
+
+	<Content>[Textarea Content]</Content>
+
+	<Source>[Image URL]</Source>
+
+	<Url>[Link URL]</Url>
+
+	<Attributes>
+		<Attribute key="[HTMLAttributeKey]">[AttributeValue]</Attributes>
+	</Attributes>
+</Control>
+ +

Directives

+
$T:TemplateID$
+$L:TranslationID$
+$P:TemplateID$
+ +

Executable Functions

+
$F:AddonLib1?GlobalControls.PrintOutSums$
+$F:AddonLib1?GlobalControls.PrintOut,~FormField$
+$F:AddonLib1?GlobalControls.SumNumbers,~FormField|=5$
+ +

Client Side Function Binding

+
$XF:{AddonLib1?GlobalControls.SumNumbers,~FormField|=5}:XF$
+ +

Inline Statements

+
$S:StatementID:{ <!-- C# Code --> }:StatementID$
+$S:StatementID:{!NOCACHE <!-- C# Code --> }:StatementID$
+
+$S:Statement1:{
+	int intvalue1 = 5;
+	int intvalue2 = Integer.Parse("0" + $~FormValue$);
+
+	return intvalue1 * intvalue2;
+}:Statement1$
+ +

Request Blocks

+
$H:RequestBlockID:{ <!-- Something --> }:RequestBlockID$
+$H:RequestBlockID:{!RENDERONREQUEST <!-- Something --> }:RequestBlockID$
+ +

Cache Block

+
$PC:{ <!-- Page Content Part --> }:PC$
+ +

Message Handling Block

+
$MB:{ <!-- Message Output Content --> }:MB$
+$MB:{
+	$#Message$
+	$#MessageType$
+}:MB$
diff --git a/docs/_style/prism-master/examples/prism-xojo.html b/docs/_style/prism-master/examples/prism-xojo.html new file mode 100644 index 0000000..3548074 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-xojo.html @@ -0,0 +1,63 @@ +

Comments

+
' This is a comment
+// This is a comment too
+Rem This is a remark
+ +

Strings

+
""
+"foo ""bar"" baz"
+ +

Numbers and colors

+
42
+3.14159
+3E4
+&b0110
+&cAABBCCDD
+&hBadFace
+&o777
+&u9
+ +

Example

+
Dim g As Graphics
+Dim yOffSet As Integer
+g = OpenPrinterDialog()
+If g <> Nil Then
+  If MainDishMenu.ListIndex <> -1 Then
+    g.Bold = True
+    g.DrawString("Main Dish:",20,20)
+    g.Bold = False
+    g.DrawString(MainDishMenu.Text,100,20)
+    g.Bold = True
+    g.DrawString("Side Order:",20,40)
+    g.Bold = False
+    If FriesRadio.Value Then
+      g.DrawString(FriesRadio.Caption,100,40)
+    End If
+    If PotatoRadio.Value Then
+      g.DrawString(PotatoRadio.Caption,100,40)
+    End If
+    If OnionRingRadio.Value Then
+      g.DrawString(OnionRingRadio.Caption,100,40)
+    End If
+    yOffSet = 60
+    If CheeseCheckBox.Value Then
+      g.Bold = True
+      g.DrawString("Extra:",20,yOffSet)
+      g.Bold = False
+      g.DrawString(CheeseCheckBox.Caption,100,yOffSet)
+      yOffSet = yOffSet + 20
+    End If
+    If BaconCheckBox.Value Then
+      g.Bold = True
+      g.DrawString("Extra:",20,yOffSet)
+      g.Bold = False
+      g.DrawString(BaconCheckBox.Caption,100,yOffSet)
+      yOffSet = yOffSet + 20
+    End If
+    g.Bold = True
+    g.DrawString("Notes:",20,yOffSet)
+    g.Bold = False
+    g.DrawString(NotesField.Text,100,yOffSet,(g.Width-40))
+  End If
+End If
+
diff --git a/docs/_style/prism-master/examples/prism-xquery.html b/docs/_style/prism-master/examples/prism-xquery.html new file mode 100644 index 0000000..8166d77 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-xquery.html @@ -0,0 +1,47 @@ +

Comments

+
(::)
+(: Comment :)
+(: Multi-line
+comment :)
+(:~
+: The <b>functx:substring-after-last</b> function returns the part
+: of <b>$string</b> that appears after the last occurrence of
+: <b>$delim</b>. If <b>$string</b> does not contain
+: <b>$delim</b>, the entire string is returned.
+:
+: @param $string the string to substring
+: @param $delim the delimiter
+: @return the substring
+:)
+ +

Variables

+
$myProduct
+$foo-bar
+$strings:LetterA
+ +

Functions

+
document-node(schema-element(catalog))
+strings:trim($arg as xs:string?)
+false()
+ +

Keywords

+
xquery version "1.0";
+declare default element namespace "http://datypic.com/cat";
+declare boundary-space preserve;
+declare default collation "http://datypic.com/collation/custom";
+ +

Types

+
xs:anyAtomicType
+element
+xs:double
+ +

Full example

+
<report xmlns="http://datypic.com/report"
+xmlns:cat="http://datypic.com/cat"
+xmlns:prod="http://datypic.com/prod"> {
+for $product in doc("prod_ns.xml")/prod:product
+return <lineItem>
+{$product/prod:number}
+{$product/prod:name}
+</lineItem>
+} </report>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-yaml.html b/docs/_style/prism-master/examples/prism-yaml.html new file mode 100644 index 0000000..bea52f8 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-yaml.html @@ -0,0 +1,107 @@ +

Null and Boolean

+
---
+A null: null
+A null: ~
+Also a null: # Empty
+Not a null: ""
+Booleans: [ true, True, false, FALSE ]
+
+ +

Numbers and timestamps

+
---
+Integers: [ 0, -0, 3, 0o7, 0x3A, -19 ]
+Floats: [ 0., -0.0, .5, 12e03, +12e03, -2E+05 ]
+Also floats: [ .inf, -.Inf, +.INF, .NAN ]
+Timestamps:
+  canonical: 2001-12-15T02:59:43.1Z
+  iso8601: 2001-12-14t21:59:43.10-05:00
+  spaced: 2001-12-14 21:59:43.10 -5
+  date: 2002-12-14
+  times:
+    - 10:53
+    - 10:53:20.53
+
+ +

Strings

+
---
+product: High Heeled "Ruby" Slippers
+description: "Putting on these \"slippers\" is easy."
+address:
+  city:   East Centerville
+  street: !!str |
+    123 Tornado Alley
+    Suite 16
+
+  specialDelivery:  >
+    Follow the Yellow Brick
+    Road to the Emerald City.
+    #Pay no attention to the
+    man behind the curtain.
+
+ +

Sequences and maps

+
---
+- Casablanca
+- North by Northwest
+- {
+    name: John Smith, age: 33}
+- name: Mary Smith
+  age: 27
+---
+"name": John Smith
+age: 33
+men: [ John Smith,
+    "Bill Jones" ]
+women:
+ - Mary Smith
+ - "Susan Williams"
+
+ +

Tags

+
---
+!!map {
+  ? !!str friends: !!seq [
+    !!map {
+      ? !!str "age"
+      : !!int 33,
+      ? !!str "name"
+      : !!str "John Smith",
+    }
+  ],
+  men:
+    [ !!str "John Smith", !!str "Bill Jones"]
+}
+
+ +

Full example

+
%YAML 1.2
+--- !<tag:clarkevans.com,2002:invoice>
+invoice: 34843
+date   : 2001-01-23
+bill-to: &id001
+  given  : Chris
+  family : Dumars
+  address:
+    lines: |
+      458 Walkman Dr.
+      Suite #292
+    city    : Royal Oak
+    state   : MI
+    postal  : 48046
+ship-to:
+  <<: *id001
+  product:
+    - sku         : BL394D
+      quantity    : 4
+      description : Basketball
+      price       : 450.00
+    - sku         : BL4438H
+      quantity    : 1
+      description : Super Hoop
+      price       : 2392.00
+tax  : 251.42
+total: 4443.52
+comments:
+    Late afternoon is best.
+    Backup contact is Nancy
+
diff --git a/docs/_style/prism-master/extending.html b/docs/_style/prism-master/extending.html new file mode 100644 index 0000000..59101b6 --- /dev/null +++ b/docs/_style/prism-master/extending.html @@ -0,0 +1,247 @@ + + + + + + +Extending Prism â–² Prism + + + + + + + + + +
+
+ +

Extending Prism

+

Prism is awesome out of the box, but it’s even awesomer when it’s customized to your own needs. This section will help you write new language definitions, plugins and all-around Prism hacking.

+
+ +
+

Language definitions

+ +

Every language is defined as a set of tokens, which are expressed as regular expressions. For example, this is the language definition for CSS:

+

+
+	

A regular expression literal is the simplest way to express a token. An alternative way, with more options, is by using an object literal. With that notation, the regular expression describing the token would be the pattern attribute:

+
...
+'tokenname': {
+	pattern: /regex/
+}
+...
+

So far the functionality is exactly the same between the short and extended notations. However, the extended notation allows for additional options:

+ +
+
inside
+
This property accepts another object literal, with tokens that are allowed to be nested in this token. + This makes it easier to define certain languages. However, keep in mind that they’re slower and if coded poorly, can even result in infinite recursion. + For an example of nested tokens, check out the Markup language definition: +
+ +
lookbehind
+
This option mitigates JavaScript’s lack of lookbehind. When set to true, + the first capturing group in the regex pattern is discarded when matching this token, so it effectively behaves + as if it was lookbehind. For an example of this, check out the C-like language definition, in particular the comment and class-name tokens: +
+ +
rest
+
Accepts an object literal with tokens and appends them to the end of the current object literal. Useful for referring to tokens defined elsewhere. For an example where rest is useful, check the Markup definitions above.
+ +
alias
+
This option can be used to define one or more aliases for the matched token. The result will be, that + the styles of the token and its aliases are combined. This can be useful, to combine the styling of a well known + token, which is already supported by most of the themes, with a semantically correct token name. The option + can be set to a string literal or an array of string literals. In the following example the token + name latex-equation is not supported by any theme, but it will be highlighted the same as a string. +
{
+	'latex-equation': {
+		pattern: /\$(\\?.)*?\$/g,
+		alias: 'string'
+	}
+}
+ +
greedy
+
This is a boolean attribute. It is intended to solve a common problem with + patterns that match long strings like comments, regex or string literals. For example, + comments are parsed first, but if the string /* foo */ + appears inside a string, you would not want it to be highlighted as a comment. + The greedy-property allows a pattern to ignore previous matches of other patterns, and + overwrite them when necessary. Use this flag with restraint, as it incurs a small performance overhead. + The following example demonstrates its usage: +
'string': {
+	pattern: /(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
+	greedy: true
+}
+
+ +

Unless explicitly allowed through the inside property, each token cannot contain other tokens, so their order is significant. Although per the ECMAScript specification, objects are not required to have a specific ordering of their properties, in practice they do in every modern browser.

+ +

In most languages there are multiple different ways of declaring the same constructs (e.g. comments, strings, ...) and sometimes it is difficult or unpractical to match all of them with one single regular expression. To add multiple regular expressions for one token name an array can be used:

+ +
...
+'tokenname': [ /regex0/, /regex1/, { pattern: /regex2/ } ]
+...
+ +
+

Prism.languages.insertBefore(inside, before, insert, root)

+ +

This is a helper method to ease modifying existing languages. For example, the CSS language definition not only defines CSS highlighting for CSS documents, + but also needs to define highlighting for CSS embedded in HTML through <style> elements. To do this, it needs to modify + Prism.languages.markup and add the appropriate tokens. However, Prism.languages.markup + is a regular JavaScript object literal, so if you do this:

+ +
Prism.languages.markup.style = {
+	/* tokens */
+};
+ +

then the style token will be added (and processed) at the end. Prism.languages.insertBefore allows you to insert + tokens before existing tokens. For the CSS example above, you would use it like this:

+ +
Prism.languages.insertBefore('markup', 'cdata', {
+	'style': {
+		/* tokens */
+	}
+});
+ +

Parameters

+
+
inside
+
The property of root that contains the object to be modified.
+ +
before
+
Key to insert before (String)
+ +
insert
+
An object containing the key-value pairs to be inserted
+ +
root
+
The root object, i.e. the object that contains the object that will be modified. Optional, default value is Prism.languages.
+
+
+
+ +
+

Writing plugins

+ +

Prism’s plugin architecture is fairly simple. To add a callback, you use Prism.hooks.add(hookname, callback). + hookname is a string with the hook id, that uniquely identifies the hook your code should run at. + callback is a function that accepts one parameter: an object with various variables that can be modified, since objects in JavaScript are passed by reference. + For example, here’s a plugin from the Markup language definition that adds a tooltip to entity tokens which shows the actual character encoded: +

Prism.hooks.add('wrap', function(env) {
+	if (env.token === 'entity') {
+		env.attributes['title'] = env.content.replace(/&amp;/, '&');
+	}
+});
+

Of course, to understand which hooks to use you would have to read Prism’s source. Imagine where you would add your code and then find the appropriate hook. + If there is no hook you can use, you may request one to be added, detailing why you need it there. +

+ +
+

API documentation

+ +
+

Prism.highlightAll(async, callback)

+

This is the most high-level function in Prism’s API. It fetches all the elements that have a .language-xxxx class + and then calls Prism.highlightElement() on each one of them.

+ +

Parameters

+
+
async
+
+ Whether to use Web Workers to improve performance and avoid blocking the UI when highlighting very large + chunks of code. False by default + (why?).
+ Note: All language definitions required to highlight the code must be included in the main prism.js + file for the async highlighting to work. You can build your own bundle on the Download page. +
+ +
callback
+
+ An optional callback to be invoked after the highlighting is done. Mostly useful when async + is true, since in that case, the highlighting is done asynchronously. +
+
+
+ +
+

Prism.highlightAllUnder(element, async, callback)

+

Fetches all the descendants of element that have a .language-xxxx class + and then calls Prism.highlightElement() on each one of them.

+ +

Parameters

+
+
element
+
The root element, whose descendants that have a .language-xxxx class will be highlighted.
+ +
async
+
Same as in Prism.highlightAll()
+ +
callback
+
Same as in Prism.highlightAll()
+
+
+ +
+

Prism.highlightElement(element, async, callback)

+

Highlights the code inside a single element.

+ +

Parameters

+
+
element
+
The element containing the code. It must have a class of language-xxxx to be processed, where xxxx is a valid language identifier.
+ +
async
+
Same as in Prism.highlightAll()
+
callback
+
Same as in Prism.highlightAll()
+
+
+ +
+

Prism.highlight(text, grammar)

+

Low-level function, only use if you know what you’re doing. + It accepts a string of text as input and the language definitions to use, and returns a string with the HTML produced.

+ +

Parameters

+
+
text
+
A string with the code to be highlighted.
+
grammar
+
An object containing the tokens to use. Usually a language definition like Prism.languages.markup
+
+ +

Returns

+

The highlighted HTML

+
+ +
+

Prism.tokenize(text, grammar)

+

This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input and the language definitions to use, and returns an array with the tokenized code. + When the language definition includes nested tokens, the function is called recursively on each of these tokens. This method could be useful in other contexts as well, as a very crude parser.

+ +

Parameters

+
+
text
+
A string with the code to be highlighted.
+
grammar
+
An object containing the tokens to use. Usually a language definition like Prism.languages.markup
+
+ +

Returns

+

An array of strings, tokens (class Prism.Token) and other arrays.

+
+
+ +
+ + + + + + + + diff --git a/docs/_style/prism-master/faq.html b/docs/_style/prism-master/faq.html new file mode 100644 index 0000000..ae32cb6 --- /dev/null +++ b/docs/_style/prism-master/faq.html @@ -0,0 +1,182 @@ + + + + + + +FAQ â–² Prism + + + + + + + + + + +
+
+ +

FAQ

+

Frequently Asked Questions, with a few Questions I want people to Frequently Ask.

+
+ +
+

This page doesn’t work in Opera!

+ +

Prism works fine in Opera. However, this page might sometimes appear to not be working in Opera, due to the theme switcher triggering an Opera bug. + This will be fixed soon.

+
+ +
+

Isn’t it bad to do syntax highlighting with regular expressions?

+ +

It is true that to correctly handle every possible case of syntax found in the wild, one would need to write a full-blown parser. + However, in most web applications and websites a small error margin is usually acceptable and a rare highlighting failure is not the end of the world. + A syntax highlighter based on regular expressions might only be accurate 99% of the time (the actual percentage is just a guess), + but in exchange for the small error margin, it offers some very important benefits: + +

    +
  • Smaller filesize. Proper parsers are very big.
  • +
  • Extensibility. Authors can define new languages simply by knowing how to code regular expressions. + Writing a correct, unambiguous BNF grammar is a task at least an order of magnitude harder.
  • +
  • Graceful error recovery. Parsers fail on incorrect syntax, where regular expressions keep matching.
  • +
+ +

For this reason, most syntax highlighters on the web and on desktop, are powered by regular expressions. This includes the internal syntax + highlighters used by popular native applications like Espresso and Sublime Text, at the time of writing. + Of course, not every regex-powered syntax highlighter is created equal. The number and type of failures can be vastly different, depending on + the exact algorithm used. Prism’s known failures are documented in the Examples section.

+
+ +
+

Why is asynchronous highlighting disabled by default?

+ +

Web Workers are good for preventing syntax highlighting of really large code blocks from blocking the main UI thread. + In most cases, you will want to highlight reasonably sized chunks of code, and this will not be needed. + Furthermore, using Web Workers is actually slower than synchronously highlighting, due to the overhead of creating and terminating + the Worker. It just appears faster in these cases because it doesn’t block the main thread. + In addition, since Web Workers operate on files instead of objects, plugins that hook on core parts of Prism (e.g. modify language definitions) + will not work unless included in the same file (using the builder in the Download page will protect you from this pitfall). + Lastly, Web Workers cannot interact with the DOM and most other APIs (e.g. the console), so they are notoriously hard to debug. +

+
+ +
+

Why is pre-existing HTML stripped off?

+ +

Because it would complicate the code a lot, although it’s not a crucial feature for most people. + If it’s very important to you, you can use the Keep Markup plugin.

+
+ +
+

If pre-existing HTML is stripped off, how can I highlight certain parts of the code?

+ +

There is a number of ways around it. You can always break the block of code into multiple parts, and wrap the HTML around it (or just use a .highlight class). + You can see an example of this in action at the “Basic usage†section of the homepage.

+

Another way around the limitation is to use the Line Highlght plugin, to highlight and link to specific lines and/or line ranges. +

+ +
+

How do I know which tokens I can style for every language?

+ +

Every token that is highlighted gets two classes: token and a class with the token type (e.g. comment). + You can find the different types of tokens either by looking at the keys of the object defining the language or by running this snippet in the console: +

function printTokens(o, prefix) { for (var i in o) { console.log((prefix? prefix + ' > ' : '') + i); if (o[i].inside) printTokens(o[i].inside, (prefix? prefix + ' > ' : '') + i); } };
+

Then you can use the function for every language you want to examine. For example, markup:

+
printTokens(Prism.languages.markup);
+

which outputs:

+
comment
+prolog
+doctype
+script
+script > tag
+script > tag > tag
+script > tag > tag > punctuation
+script > tag > tag > namespace
+script > tag > attr-value
+script > tag > attr-value > punctuation
+script > tag > punctuation
+script > tag > attr-name
+script > tag > attr-name > namespace
+script > rest
+style
+style > tag
+style > tag > tag
+style > tag > tag > punctuation
+style > tag > tag > namespace
+style > tag > attr-value
+style > tag > attr-value > punctuation
+style > tag > punctuation
+style > tag > attr-name
+style > tag > attr-name > namespace
+style > rest
+cdata
+tag
+tag > tag
+tag > tag > punctuation
+tag > tag > namespace
+tag > attr-value
+tag > attr-value > punctuation
+tag > punctuation
+tag > attr-name
+tag > attr-name > namespace
+entity
+
+ +
+

How can I use different highlighting for tokens with the same name in different languages?

+

Just use a descendant selector, that includes the language class. The default prism.css does this, to have different colors for + JavaScript strings (which are very common) and CSS strings (which are relatively rare). Here’s that code, simplified to illustrate the technique: +


+.token.string {
+	color: #690;
+}
+
+.language-css .token.string,
+.style .token.string {
+	color: #a67f59;
+}
+ +

Abbreviated language classes (e.g. lang-css) will be converted to their extended forms, so you don’t need to account for them.

+

The same technique can be used to differentiate XML tag namespaces from attribute namespaces:

+
.tag > .token.namespace {
+	color: #b37298;
+}
+.attr-name > .token.namespace {
+	color: #ab6;
+}
+
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/favicon.png b/docs/_style/prism-master/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..11838d355486c147ded60afcf81aa67e3c69cce1 GIT binary patch literal 209 zcmV;?051QDP)\n' + + '********************************************** */\n\n')) + .pipe(concat('prism.js')) + .pipe(gulp.dest('./')); +}); + +gulp.task('plugins', ['languages-plugins'], function() { + return gulp.src(paths.plugins) + .pipe(uglify()) + .pipe(rename({ suffix: '.min' })) + .pipe(gulp.dest('plugins')); +}); + +gulp.task('components-json', function (cb) { + componentsPromise.then(function (data) { + data = 'var components = ' + JSON.stringify(data) + ';\n' + + 'if (typeof module !== \'undefined\' && module.exports) { module.exports = components; }'; + fs.writeFile(paths.componentsFileJS, data, cb); + }); +}); + +gulp.task('watch', function() { + gulp.watch(paths.components, ['components', 'build']); + gulp.watch(paths.plugins, ['plugins', 'build']); +}); + +gulp.task('languages-plugins', function (cb) { + componentsPromise.then(function (data) { + var languagesMap = {}; + var dependenciesMap = {}; + for (var p in data.languages) { + if (p !== 'meta') { + var title = data.languages[p].displayTitle || data.languages[p].title; + var ucfirst = p.substring(0, 1).toUpperCase() + p.substring(1); + if (title !== ucfirst) { + languagesMap[p] = title; + } + + for (var name in data.languages[p].aliasTitles) { + languagesMap[name] = data.languages[p].aliasTitles[name]; + } + + if(data.languages[p].require) { + dependenciesMap[p] = data.languages[p].require; + } + } + } + + var jsonLanguagesMap = JSON.stringify(languagesMap); + var jsonDependenciesMap = JSON.stringify(dependenciesMap); + + var tasks = [ + {plugin: paths.showLanguagePlugin, map: jsonLanguagesMap}, + {plugin: paths.autoloaderPlugin, map: jsonDependenciesMap} + ]; + + var cpt = 0; + var l = tasks.length; + var done = function() { + cpt++; + if(cpt === l) { + cb && cb(); + } + }; + + tasks.forEach(function(task) { + var stream = gulp.src(task.plugin) + .pipe(replace( + /\/\*languages_placeholder\[\*\/[\s\S]*?\/\*\]\*\//, + '/*languages_placeholder[*/' + task.map + '/*]*/' + )) + .pipe(gulp.dest(task.plugin.substring(0, task.plugin.lastIndexOf('/')))); + + stream.on('error', done); + stream.on('end', done); + }); + }); +}); + +gulp.task('changelog', function (cb) { + return gulp.src(paths.changelog) + .pipe(replace( + /#(\d+)(?![\d\]])/g, + '[#$1](https://github.com/PrismJS/prism/issues/$1)' + )) + .pipe(replace( + /\[[\da-f]+(?:, *[\da-f]+)*\]/g, + function (match) { + return match.replace(/([\da-f]{7})[\da-f]*/g, '[`$1`](https://github.com/PrismJS/prism/commit/$1)'); + } + )) + .pipe(gulp.dest('.')); +}); + +gulp.task('default', ['components', 'components-json', 'plugins', 'build']); diff --git a/docs/_style/prism-master/img/logo-ala.png b/docs/_style/prism-master/img/logo-ala.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd3f129a98eb5c16ee5b7559c994beba3c81e8e GIT binary patch literal 1745 zcmV;?1}^!DP)lkTK^ux1Xxk}OLY{^s4a zZQHhO+qP}nxVDY6w!M38n`>M3PE1TxRQ5D?C;mWpW_ESv*EMyr>X3q-^rLS?1IX_9 zSUm(ZMlL{U4Gw@@af=4w$jqFzc&?K_5OT#YWZ*6T$V=PI!MU+Q zPC|}bXJb@>P59L{-F49>lG!}7IS_Ki5kd+Y+jzPMM6Q^@E4~*NrrHF2N+?Fin+eNd znp2pDyk>mn%M4`;Kk^MTp$%=B#&5#@HP7)g-|#ixamTQq=1aceM-CV^j-jG-jeIdeK1x{H>Bu!G{@@J; zkzPRp5|U8Ccq8@>r4+>5dBi4@$51wE8VpGEy09BOW>?FG1D*l$okx11*OIZ=H%qxI#}JZXe(hzW8%zSeDi z0^?4Tuy9|-vheL0)-Ts2&cY>~fBZi-Tj?w0lp_LCzxa*mp7E1wyzw``H$<4(M+o!J-E z(cn&!f)aAo4%D%<@QK{`u7|_-2SsZZo4&jtzquy+Iaz}tr-HsbMP>z$iViuc?tWe3-s`KYU+XX5|z4qY8HD zyWYBw(!T)`_(J{-Z52L|la@cVYZFW3wNY*eVuM^k0&4LFe{k1fXO`YSasldNmau{s zxFb<|AivKK^iWXLSdZUj8B5t9;_CWBK3w4+c`J{>o{AN6eY8-HNo?giZd(wP_K%!A zTyxF(gbnh)*}oLwpgzUCLlonIwKDB%zCk4NFCg0f=d3^;Tw4#u| zN?$P}ryC<}6G@i|fP8~z*5mBALQ-Vog6Bvz?YBZ46}FfBB5#WF)Dy1Af8rB9)B1r` zR1^N!sBCG~cF>b5G~gMrs-Gp3U*zQEl4sTj6}0h0-UQ{TNe;;6l60Qj{*cczdXrYv zre3^i(@Z?@7pViB9dDp2N^ZZ|i}KSu_(tBsJRzZaIP1Dpx6HeuH1ie ze%3ed2v1!R_yH~5k&92#MtB|-ft@UH+dBLa@92$uvT^K~SG=+iH^ui$VEEPtLcTuo zRAJt;?Z_{&LiR+A^FZE6^bXGd+d3VoPaoMSqzsUM$rDY>-?-hZw>y3&8Q%!|HUs%d zd*qARN?g1)vzq^jS0>X1ONa4-ZQD6000J#Nkl0Z@Y-g|Oqa!%tWd5UXM zm0|4V1%BcfU+@^K=}uu(ApXfBp5lAWTu=Li%*u@CZa(E0Kl2j%7)*6kvPjE6X=MjF z41Uf)MhhyEKCpf|T2af4MAV`cf3{Tlk7S+nFlpu4#U)}s{KP79`bs_=!2FqI0bh9$ z=Y7m8JWNxR1(|q6b8YyLf|_5FFA{Lh@*XRF(r4pIFWX5XQM5?OCNDlJ!6kL4mz_fj zS3QJAJASuJ{A2!v5|rfIgv{@0U@%j&KOyrnQ{;>KQJ0t#`e^=0?7Z`FqWx3H-<3!d zEvo9+88Z8-WZ`k0{ex7ldg#H7#Y}z0A-3}pXN=ex3TbXe-Z$jGo9#TsX@mK=c{ND% z5>K(6yZN4&fnulx$jR3ZcATN6=FfIu&p-*<>)6{8iK0alxeK$$Rms7d!r$YrhezYT zM(8dY=_hkKN-!N6AXD!qk)`C;z87K;Z|mp|ltz9|>DY7BBefUH#XmTpqbJC1eTFY) z4J(qcoF%-d$9%>jR(M#=8kz}vs?NVbC;DmhNy0kbB_^mS{MI`1nna>#(SR%7|BsUm zWgsJu3->{?yX&D)6ylf+?&*^yKRdk4-K5o#Lz=tB$L-Ji+)q*Dg(f0qh+{VA0p8+2 zC})f?uQor#kiEW4N(RgPme~z)*TQN@7G9AmyGa>F4~1g84DO8zL@PQOoyzN)-6DXQ z6=h(GX6_8Eni=H|5&TG`{AQhflhjs2oVBnRlFn#&HigwgQH(2^w#!kPx9wlqz%1mg zV#iH4q#jqj>}j%F3~|=NVn|k=7dw`R*F(wee3=R;Cp@S}d_-03%&t_Yv{e#9A+`~|+k?JNIayTGYP=s14HZofC0#`alr#R!xq$WXzJRY$h&N1@G<{&DHYL> zgT8OjoloSGt6B`n8eR)A-inN{HGL(WXN&e#>9_C%{eHGA=$%gA%+~~V`2v0MY^tVdMJLi_e>W2o$Y+%D|~|L z0ng5byo7Lk&)Ix|=C+Muhy`;|RztFc*Fp@D*~`D~H+k-QC|*F8Oc9We#*F7telyCx z6S%vYma24TFJBTfP{+%qk;SHfA1Qgm3^~C8{)WPCNJ_gF4ulF^-?4Y#R$RBi(pLm|NvW9>-!#REziyIm$DWwPA6H1h+}+~6+jP88{qkcJFQl!-p(WQbi0yCEM_ zKsH$9AV7{7ob^!T;jI5lN5p(x>Aqx{jrGd;964^VA^S0-_lPuW91IDqg&1-HbCKLo zKJ^>vw;c6QD7MJ(`3Wccw9$DC-~jDx8-OB8J@zm;aMe*!Pvkc;-_(U+I^LGqb;oW< z6fLC7ikoF$sq;2zQ0{to%Y9>qbGDCKLSJQ9sEK)wu))91lr8d!cy;;3``;5(^)YA5 znmENxUa42$G;(%gHzceUmhE@Na;dWu<*tYS4B$2TQiRN;BNw$;ZuHEpJnlNdBbSu6kU%MZG(a_Abmr4Kt002ovPDHLkV1k*9U-AF| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/img/logo-drupal.png b/docs/_style/prism-master/img/logo-drupal.png new file mode 100644 index 0000000000000000000000000000000000000000..6f2b026b7c26e66455a02de72b2ba17f949455d4 GIT binary patch literal 2371 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/img/logo-sitepoint.png b/docs/_style/prism-master/img/logo-sitepoint.png new file mode 100644 index 0000000000000000000000000000000000000000..cf275f6eca9f4cbd7c3b46e79c034de121c295da GIT binary patch literal 2703 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 JPDHLkV1g(N_A~$h literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/img/logo-smashing.png b/docs/_style/prism-master/img/logo-smashing.png new file mode 100644 index 0000000000000000000000000000000000000000..8d34f6f38d345c08fc3263b3bd8573d8a07fff65 GIT binary patch literal 14160 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/img/spectrum.png b/docs/_style/prism-master/img/spectrum.png new file mode 100644 index 0000000000000000000000000000000000000000..5954bd46ff3f78b6c101148f6475165c9392fcf6 GIT binary patch literal 359393 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

  • Um-~ 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

    EL7`ns6- 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 z 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

    aUzBd&FnTy%XLNK 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 + + + + + + +Prism + + + + + + + + + +

    +
    + +
      +
    • + Dead simple + Include prism.css and prism.js, use proper HTML5 code tags (code.language-xxxx), done! +
    • +
    • + Intuitive + Language classes are inherited so you can only define the language once for multiple code snippets. +
    • +
    • + Light as a feather + The core is 2KB minified & gzipped. Languages add 0.3-0.5KB each, themes are around 1KB. +
    • +
    • + Blazing fast + Supports parallelism with Web Workers, if available. +
    • +
    • + Extensible + Define new languages or extend existing ones. + Add new features thanks to Prism’s plugin architecture. +
    • +
    • + Easy styling + All styling is done through CSS, with sensible class names like .comment, .string, .property etc +
    • +
    + +
    + +
    +

    Used By

    + +

    Prism is used on several websites, small and large. Some of them are:

    + +
    + Smashing Magazine + A List Apart + Mozilla Developer Network (MDN) + CSS-Tricks + SitePoint + Drupal + React + Stripe +
    +
    + +
    +

    Examples

    + +

    The Prism source, highlighted with Prism (don’t you just love how meta this is?):

    +
    
    +
    +	

    This page’s CSS code, highlighted with Prism:

    +
    
    +
    +	

    This page’s HTML, highlighted with Prism:

    +
    
    +
    +	

    This page’s logo (SVG), highlighted with Prism:

    +
    
    +
    +	

    If you’re still not sold, you can view more examples or try it out for yourself.

    +
    + +
    +

    Full list of features

    +
      +
    • Only 2KB minified & gzipped (core). Each language definition adds roughly 300-500 bytes.
    • +
    • Encourages good author practices. Other highlighters encourage or even force you to use elements that are semantically wrong, + like <pre> (on its own) or <script>. + Prism forces you to use the correct element for marking up code: <code>. + On its own for inline code, or inside a <pre> for blocks of code. + In addition, the language is defined through the way recommended in the HTML5 draft: through a language-xxxx class.
    • +
    • The language definition is inherited. This means that if multiple code snippets have the same language, you can just define it once, in one of their common ancestors.
    • +
    • Supports parallelism with Web Workers, if available. Disabled by default (why?).
    • +
    • Very easy to extend without modifying the code, due to Prism’s plugin architecture. Multiple hooks are scattered throughout the source.
    • +
    • Very easy to define new languages. Only thing you need is a good understanding of regular expressions
    • +
    • All styling is done through CSS, with sensible class names rather than ugly namespaced abbreviated nonsense.
    • +
    • Wide browser support: IE9+, Firefox, Chrome, Safari, Opera, most Mobile browsers
    • +
    • Highlights embedded languages (e.g. CSS inside HTML, JavaScript inside HTML)
    • +
    • Highlights inline code as well, not just code blocks
    • +
    • Highlights nested languages (CSS in HTML, JavaScript in HTML)
    • +
    • It doesn’t force you to use any Prism-specific markup, not even a Prism-specific class name, only standard markup you should be using anyway. So, you can just try it for a while, remove it if you don’t like it and leave no traces behind.
    • +
    • Highlight specific lines and/or line ranges (requires plugin)
    • +
    • Show invisible characters like tabs, line breaks etc (requires plugin)
    • +
    • Autolink URLs and emails, use Markdown links in comments (requires plugin)
    • +
    +
    + +
    +

    Limitations

    +
      +
    • Any pre-existing HTML in the code will be stripped off. There are ways around it though.
    • +
    • Regex-based so it *will* fail on certain edge cases, which are documented in the Examples section.
    • +
    • No IE 6-8 support. If someone can read code, they are probably in the 85% of the population with a modern browser.
    • +
    +
    + +
    +

    Basic usage

    + +

    You will need to include the prism.css and prism.js files you downloaded in your page. Example: +

    <!DOCTYPE html>
    +<html>
    +<head>
    +	...
    +	<link href="themes/prism.css" rel="stylesheet" />
    +</head>
    +<body>
    +	...
    +	<script src="prism.js"></script>
    +</body>
    +</html>
    + +

    Prism does its best to encourage good authoring practices. Therefore, it only works with <code> elements, since marking up code without a <code> element is semantically invalid. + According to the HTML5 spec, the recommended way to define a code language is a language-xxxx class, which is what Prism uses. + Alternatively, Prism also supports a shorter version: lang-xxxx.

    +

    To make things easier however, Prism assumes that this language definition is inherited. Therefore, if multiple <code> elements have the same language, you can add the language-xxxx class on one of their common ancestors. + This way, you can also define a document-wide default language, by adding a language-xxxx class on the <body> or <html> element.

    + +

    If you want to opt-out of highlighting for a <code> element that is a descendant of an element with a declared code language, you can add the class language-none to it (or any non-existing language, really).

    + +

    The recommended way to mark up a code block + (both for semantics and for Prism) is a <pre> element with a <code> element inside, like so:

    +
    <pre><code class="language-css">p { color: red }</code></pre>
    +

    If you use that pattern, the <pre> will automatically get the language-xxxx class (if it doesn’t already have it) and will be styled as a code block.

    + +

    If you want to prevent any elements from being automatically highlighted, you can use the attribute data-manual on the <script> element you used for prism and use the API. + Example:

    +
    <script src="prism.js" data-manual></script>
    + +

    Usage with Webpack, Browserify, & Other Bundlers

    + +

    If you want to use Prism with a bundler, install Prism with npm:

    + +
    $ npm install prismjs
    + +

    You can then import into your bundle:

    + +
    import Prism from 'prismjs';
    + +

    To make it easy to configure your Prism instance with only the languages and plugins you need, use the babel plugin, + babel-plugin-prismjs. This will allow you to load + the minimum number of languages and plugins to satisfy your needs. + See that plugin's documentation for configuration details.

    + +

    Usage with Node

    + +

    If you want to use Prism on the server or through the command line, Prism can be used with Node.js as well. + This might be useful if you're trying to generate static HTML pages with highlighted code for environments that don't support browser-side JS, like AMP pages.

    + +

    Example:

    +
    var Prism = require('prismjs');
    +
    +// The code snippet you want to highlight, as a string
    +var code = "var data = 1;";
    +
    +// Returns a highlighted HTML string
    +var html = Prism.highlight(code, Prism.languages.javascript, 'javascript');
    + +

    Requiring prismjs will load the default languages: markup, css, + clike and javascript. You can load more languages with the + loadLanguages() utility, which will automatically handle any required dependencies.

    +

    Example:

    + +
    var Prism = require('prismjs');
    +var loadLanguages = require('prismjs/components/');
    +loadLanguages(['haml']);
    +
    +// The code snippet you want to highlight, as a string
    +var code = "= ['hi', 'there', 'reader!'].join \" \"";
    +
    +// Returns a highlighted HTML string
    +var html = Prism.highlight(code, Prism.languages.haml, 'haml');
    + +

    Note: Do not use loadLanguages() with Webpack or another bundler, as this will cause Webpack to include all languages and plugins. Use the babel plugin described above.

    + +
    + +
    +

    Supported languages

    +

    This is the list of all languages currently supported by Prism, with + their corresponding alias, to use in place of xxxx in the language-xxxx (or lang-xxxx) class:

    +
    + +
    +

    Plugins

    +

    Plugins are additional scripts (and CSS code) that extend Prism’s functionality. Many of the following plugins are official, but are released as plugins to keep the Prism Core small for those who don’t need the extra functionality.

    +
      + +

      No assembly required to use them. Just select them in the download page.

      +

      It’s very easy to write your own Prism plugins. Did you write a plugin for Prism that you want added to this list? Send a pull request!

      +
      + +
      +

      Third-party language definitions

      + + +
      + +
      +

      Third-party tutorials

      + +

      Several tutorials have been written by members of the community to help you integrate Prism into multiple different website types and configurations:

      + + + +

      Please note that the tutorials listed here are not verified to contain correct information. Read at your risk and always check the official documentation here if something doesn’t work :)

      + +

      Have you written a tutorial about Prism that’s not already included here? Send a pull request!

      +
      + +
      +

      Credits

      + +
      + +
      + + + + + + + + + diff --git a/docs/_style/prism-master/logo.svg b/docs/_style/prism-master/logo.svg new file mode 100644 index 0000000..22fcdec --- /dev/null +++ b/docs/_style/prism-master/logo.svg @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/docs/_style/prism-master/package.json b/docs/_style/prism-master/package.json new file mode 100644 index 0000000..cbffb02 --- /dev/null +++ b/docs/_style/prism-master/package.json @@ -0,0 +1,47 @@ +{ + "name": "prismjs", + "version": "1.15.0", + "description": "Lightweight, robust, elegant syntax highlighting. A spin-off project from Dabblet.", + "main": "prism.js", + "style": "themes/prism.css", + "scripts": { + "test": "mocha tests/testrunner-tests.js && mocha tests/run.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/LeaVerou/prism.git" + }, + "keywords": [ + "prism", + "highlight" + ], + "author": "Lea Verou", + "license": "MIT", + "readmeFilename": "README.md", + "optionalDependencies": { + "clipboard": "^2.0.0" + }, + "devDependencies": { + "chai": "^2.3.0", + "gulp": "^3.8.6", + "gulp-concat": "^2.3.4", + "gulp-header": "^1.0.5", + "gulp-rename": "^1.2.0", + "gulp-uglify": "^0.3.1", + "gulp-replace": "^0.5.4", + "mocha": "^2.2.5", + "yargs": "^3.26.0" + }, + "jspm": { + "main": "prism", + "registry": "jspm", + "jspmPackage": true, + "format": "global", + "files": [ + "components/**/*.js", + "plugins/**/*", + "themes/*.css", + "prism.js" + ] + } +} diff --git a/docs/_style/prism-master/plugins/autolinker/index.html b/docs/_style/prism-master/plugins/autolinker/index.html new file mode 100644 index 0000000..6053b62 --- /dev/null +++ b/docs/_style/prism-master/plugins/autolinker/index.html @@ -0,0 +1,70 @@ + + + + + + +Autolinker â–² Prism plugins + + + + + + + + + + + +
      +
      + +

      Autolinker

      +

      Converts URLs and emails in code to clickable links. Parses Markdown links in comments.

      +
      + +
      +

      How to use

      +

      URLs and emails will be linked automatically, you don’t need to do anything. To link some text inside a comment to a certain URL, + you may use the Markdown syntax: +

      [Text you want to see](http://url-goes-here.com)
      +
      + +
      +

      Examples

      + +

      JavaScript

      +
      /**
      + * Prism: Lightweight, robust, elegant syntax highlighting
      + * MIT license http://www.opensource.org/licenses/mit-license.php/
      + * @author Lea Verou http://lea.verou.me
      + * Reach Lea at fake@email.com (no, not really)
      + * And this is [a Markdown link](http://prismjs.com). Sweet, huh?
      + */
      +var foo = 5;
      +// And a single line comment http://google.com
      + +

      CSS

      +
      @font-face {
      +	src: url(http://lea.verou.me/logo.otf);
      +	font-family: 'LeaVerou';
      +}
      + +

      HTML

      +
      <!-- Links in HTML, woo!
      +Lea Verou http://lea.verou.me or, with Markdown, [Lea Verou](http://lea.verou.me) -->
      +<img src="http://prismjs.com/img/spectrum.png" alt="In attributes too!" />
      +<p>Autolinking in raw text: http://prismjs.com</p>
      +
      + +
      + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/autolinker/prism-autolinker.css b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.css new file mode 100644 index 0000000..b5f7630 --- /dev/null +++ b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.css @@ -0,0 +1,3 @@ +.token a { + color: inherit; +} \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/autolinker/prism-autolinker.js b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.js new file mode 100644 index 0000000..3913c98 --- /dev/null +++ b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.js @@ -0,0 +1,81 @@ +(function(){ + +if ( + typeof self !== 'undefined' && !self.Prism || + typeof global !== 'undefined' && !global.Prism +) { + return; +} + +var url = /\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:=&]+(?:\?[\w\-+%~/.:#=?&!$'()*,;]*)?(?:#[\w\-+%~/.:#=?&!$'()*,;]*)?/, + email = /\b\S+@[\w.]+[a-z]{2}/, + linkMd = /\[([^\]]+)]\(([^)]+)\)/, + + // Tokens that may contain URLs and emails + candidates = ['comment', 'url', 'attr-value', 'string']; + +Prism.plugins.autolinker = { + processGrammar: function (grammar) { + // Abort if grammar has already been processed + if (!grammar || grammar['url-link']) { + return; + } + Prism.languages.DFS(grammar, function (key, def, type) { + if (candidates.indexOf(type) > -1 && Prism.util.type(def) !== 'Array') { + if (!def.pattern) { + def = this[key] = { + pattern: def + }; + } + + def.inside = def.inside || {}; + + if (type == 'comment') { + def.inside['md-link'] = linkMd; + } + if (type == 'attr-value') { + Prism.languages.insertBefore('inside', 'punctuation', { 'url-link': url }, def); + } + else { + def.inside['url-link'] = url; + } + + def.inside['email-link'] = email; + } + }); + grammar['url-link'] = url; + grammar['email-link'] = email; + } +}; + +Prism.hooks.add('before-highlight', function(env) { + Prism.plugins.autolinker.processGrammar(env.grammar); +}); + +Prism.hooks.add('wrap', function(env) { + if (/-link$/.test(env.type)) { + env.tag = 'a'; + + var href = env.content; + + if (env.type == 'email-link' && href.indexOf('mailto:') != 0) { + href = 'mailto:' + href; + } + else if (env.type == 'md-link') { + // Markdown + var match = env.content.match(linkMd); + + href = match[2]; + env.content = match[1]; + } + + env.attributes.href = href; + } + + // Silently catch any error thrown by decodeURIComponent (#1186) + try { + env.content = decodeURIComponent(env.content); + } catch(e) {} +}); + +})(); diff --git a/docs/_style/prism-master/plugins/autolinker/prism-autolinker.min.js b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.min.js new file mode 100644 index 0000000..9fdced9 --- /dev/null +++ b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.min.js @@ -0,0 +1 @@ +!function(){if(("undefined"==typeof self||self.Prism)&&("undefined"==typeof global||global.Prism)){var i=/\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~\/.:=&]+(?:\?[\w\-+%~\/.:#=?&!$'()*,;]*)?(?:#[\w\-+%~\/.:#=?&!$'()*,;]*)?/,n=/\b\S+@[\w.]+[a-z]{2}/,e=/\[([^\]]+)]\(([^)]+)\)/,t=["comment","url","attr-value","string"];Prism.plugins.autolinker={processGrammar:function(r){r&&!r["url-link"]&&(Prism.languages.DFS(r,function(r,a,l){t.indexOf(l)>-1&&"Array"!==Prism.util.type(a)&&(a.pattern||(a=this[r]={pattern:a}),a.inside=a.inside||{},"comment"==l&&(a.inside["md-link"]=e),"attr-value"==l?Prism.languages.insertBefore("inside","punctuation",{"url-link":i},a):a.inside["url-link"]=i,a.inside["email-link"]=n)}),r["url-link"]=i,r["email-link"]=n)}},Prism.hooks.add("before-highlight",function(i){Prism.plugins.autolinker.processGrammar(i.grammar)}),Prism.hooks.add("wrap",function(i){if(/-link$/.test(i.type)){i.tag="a";var n=i.content;if("email-link"==i.type&&0!=n.indexOf("mailto:"))n="mailto:"+n;else if("md-link"==i.type){var t=i.content.match(e);n=t[2],i.content=t[1]}i.attributes.href=n}try{i.content=decodeURIComponent(i.content)}catch(r){}})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/autoloader/index.html b/docs/_style/prism-master/plugins/autoloader/index.html new file mode 100644 index 0000000..3e5357e --- /dev/null +++ b/docs/_style/prism-master/plugins/autoloader/index.html @@ -0,0 +1,204 @@ + + + + + + +Autoloader â–² Prism plugins + + + + + + + + + + + +
      +
      + +

      Autoloader

      +

      Automatically loads the needed languages to highlight the code blocks.

      +
      + +
      +

      How to use

      + +

      + The plugin will automatically handle missing grammars and load them for you. + To do this, you need to provide it with a directory of all the grammars you want. +

      +

      + You can download all the available grammars by clicking on the following link: .
      + Alternatively, you can also clone the GitHub repo and take the components folder from there. +

      +

      + You can then download Prism core and any plugins from the Download page, without checking any languages (or just check the languages you want to load by default, e.g. if you're using a language a lot, then you probably want to save the extra HTTP request). +

      +

      + A couple of additional options are available through the configuration object Prism.plugins.autoloader. +

      + +

      Specifying the grammars path

      + +

      + By default, the plugin will look for the missing grammars in the components folder. + If your files are in a different location, you can specify it using the languages_path option: +

      + +
      Prism.plugins.autoloader.languages_path = 'path/to/grammars/';
      + +

      Using development versions

      + +

      + By default, the plugin uses the minified versions of the grammars. + If you wish to use the development versions instead, you can set the use_minified option to false: +

      + +
      Prism.plugins.autoloader.use_minified = false;
      + +

      Specifying additional dependencies

      + +

      + All default dependencies are already included in the plugin. + However, there are some cases where you might want to load an additional dependency for a specific code block. + To do so, just add a data-dependencies attribute on you <code> or <pre> tags, + containing a list of comma-separated language aliases. +

      + +
      <pre><code class="language-pug" data-dependencies="less">
      +:less
      +	foo {
      +		color: @red;
      +	}
      +</code><pre>
      + +

      Force to reload a grammar

      + +

      + The plugin usually doesn't reload a grammar if it already exists. + In some very specific cases, you might however want to do so. + If you add an exclamation mark after an alias in the data-dependencies attribute, + this language will be reloaded. +

      + +
      <pre class="language-markup" data-dependencies="markup,css!"><code>
      + +
      + +
      +

      Examples

      + +

      Note that no languages are loaded on this page by default.

      + +

      Basic usage with some Perl code:

      +
      my ($class, $filename) = @_;
      + +

      The Less filter used in Pug:

      +
      :less
      +	foo {
      +		color: @red;
      +	}
      + +
      + +
      + + + + + + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/autoloader/prism-autoloader.js b/docs/_style/prism-master/plugins/autoloader/prism-autoloader.js new file mode 100644 index 0000000..4d6a601 --- /dev/null +++ b/docs/_style/prism-master/plugins/autoloader/prism-autoloader.js @@ -0,0 +1,209 @@ +(function () { + if (typeof self === 'undefined' || !self.Prism || !self.document || !document.createElement) { + return; + } + + // The dependencies map is built automatically with gulp + var lang_dependencies = /*languages_placeholder[*/{"javascript":"clike","actionscript":"javascript","arduino":"cpp","aspnet":["markup","csharp"],"bison":"c","c":"clike","csharp":"clike","cpp":"c","coffeescript":"javascript","crystal":"ruby","css-extras":"css","d":"clike","dart":"clike","django":"markup","erb":["ruby","markup-templating"],"fsharp":"clike","flow":"javascript","glsl":"clike","gml":"clike","go":"clike","groovy":"clike","haml":"ruby","handlebars":"markup-templating","haxe":"clike","java":"clike","jolie":"clike","kotlin":"clike","less":"css","markdown":"markup","markup-templating":"markup","n4js":"javascript","nginx":"clike","objectivec":"c","opencl":"cpp","parser":"markup","php":["clike","markup-templating"],"php-extras":"php","plsql":"sql","processing":"clike","protobuf":"clike","pug":"javascript","qore":"clike","jsx":["markup","javascript"],"tsx":["jsx","typescript"],"reason":"clike","ruby":"clike","sass":"css","scss":"css","scala":"java","smarty":"markup-templating","soy":"markup-templating","swift":"clike","tap":"yaml","textile":"markup","tt2":["clike","markup-templating"],"twig":"markup","typescript":"javascript","vala":"clike","vbnet":"basic","velocity":"markup","wiki":"markup","xeora":"markup","xquery":"markup"}/*]*/; + + var lang_data = {}; + + var ignored_language = 'none'; + + var script = document.getElementsByTagName('script'); + script = script[script.length - 1]; + var languages_path = 'components/'; + if(script.hasAttribute('data-autoloader-path')) { + var path = script.getAttribute('data-autoloader-path').trim(); + if(path.length > 0 && !/^[a-z]+:\/\//i.test(script.src)) { + languages_path = path.replace(/\/?$/, '/'); + } + } else if (/[\w-]+\.js$/.test(script.src)) { + languages_path = script.src.replace(/[\w-]+\.js$/, 'components/'); + } + var config = Prism.plugins.autoloader = { + languages_path: languages_path, + use_minified: true + }; + + /** + * Lazy loads an external script + * @param {string} src + * @param {function=} success + * @param {function=} error + */ + var addScript = function (src, success, error) { + var s = document.createElement('script'); + s.src = src; + s.async = true; + s.onload = function() { + document.body.removeChild(s); + success && success(); + }; + s.onerror = function() { + document.body.removeChild(s); + error && error(); + }; + document.body.appendChild(s); + }; + + /** + * Returns the path to a grammar, using the language_path and use_minified config keys. + * @param {string} lang + * @returns {string} + */ + var getLanguagePath = function (lang) { + return config.languages_path + + 'prism-' + lang + + (config.use_minified ? '.min' : '') + '.js' + }; + + /** + * Tries to load a grammar and + * highlight again the given element once loaded. + * @param {string} lang + * @param {HTMLElement} elt + */ + var registerElement = function (lang, elt) { + var data = lang_data[lang]; + if (!data) { + data = lang_data[lang] = {}; + } + + // Look for additional dependencies defined on the or
       tags
      +		var deps = elt.getAttribute('data-dependencies');
      +		if (!deps && elt.parentNode && elt.parentNode.tagName.toLowerCase() === 'pre') {
      +			deps = elt.parentNode.getAttribute('data-dependencies');
      +		}
      +
      +		if (deps) {
      +			deps = deps.split(/\s*,\s*/g);
      +		} else {
      +			deps = [];
      +		}
      +
      +		loadLanguages(deps, function () {
      +			loadLanguage(lang, function () {
      +				Prism.highlightElement(elt);
      +			});
      +		});
      +	};
      +
      +	/**
      +	 * Sequentially loads an array of grammars.
      +	 * @param {string[]|string} langs
      +	 * @param {function=} success
      +	 * @param {function=} error
      +	 */
      +	var loadLanguages = function (langs, success, error) {
      +		if (typeof langs === 'string') {
      +			langs = [langs];
      +		}
      +		var i = 0;
      +		var l = langs.length;
      +		var f = function () {
      +			if (i < l) {
      +				loadLanguage(langs[i], function () {
      +					i++;
      +					f();
      +				}, function () {
      +					error && error(langs[i]);
      +				});
      +			} else if (i === l) {
      +				success && success(langs);
      +			}
      +		};
      +		f();
      +	};
      +
      +	/**
      +	 * Load a grammar with its dependencies
      +	 * @param {string} lang
      +	 * @param {function=} success
      +	 * @param {function=} error
      +	 */
      +	var loadLanguage = function (lang, success, error) {
      +		var load = function () {
      +			var force = false;
      +			// Do we want to force reload the grammar?
      +			if (lang.indexOf('!') >= 0) {
      +				force = true;
      +				lang = lang.replace('!', '');
      +			}
      +
      +			var data = lang_data[lang];
      +			if (!data) {
      +				data = lang_data[lang] = {};
      +			}
      +			if (success) {
      +				if (!data.success_callbacks) {
      +					data.success_callbacks = [];
      +				}
      +				data.success_callbacks.push(success);
      +			}
      +			if (error) {
      +				if (!data.error_callbacks) {
      +					data.error_callbacks = [];
      +				}
      +				data.error_callbacks.push(error);
      +			}
      +
      +			if (!force && Prism.languages[lang]) {
      +				languageSuccess(lang);
      +			} else if (!force && data.error) {
      +				languageError(lang);
      +			} else if (force || !data.loading) {
      +				data.loading = true;
      +				var src = getLanguagePath(lang);
      +				addScript(src, function () {
      +					data.loading = false;
      +					languageSuccess(lang);
      +
      +				}, function () {
      +					data.loading = false;
      +					data.error = true;
      +					languageError(lang);
      +				});
      +			}
      +		};
      +		var dependencies = lang_dependencies[lang];
      +		if(dependencies && dependencies.length) {
      +			loadLanguages(dependencies, load);
      +		} else {
      +			load();
      +		}
      +	};
      +
      +	/**
      +	 * Runs all success callbacks for this language.
      +	 * @param {string} lang
      +	 */
      +	var languageSuccess = function (lang) {
      +		if (lang_data[lang] && lang_data[lang].success_callbacks && lang_data[lang].success_callbacks.length) {
      +			lang_data[lang].success_callbacks.forEach(function (f) {
      +				f(lang);
      +			});
      +		}
      +	};
      +
      +	/**
      +	 * Runs all error callbacks for this language.
      +	 * @param {string} lang
      +	 */
      +	var languageError = function (lang) {
      +		if (lang_data[lang] && lang_data[lang].error_callbacks && lang_data[lang].error_callbacks.length) {
      +			lang_data[lang].error_callbacks.forEach(function (f) {
      +				f(lang);
      +			});
      +		}
      +	};
      +
      +	Prism.hooks.add('complete', function (env) {
      +		if (env.element && env.language && !env.grammar) {
      +			if (env.language !== ignored_language) {
      +				registerElement(env.language, env.element);
      +			}
      +		}
      +	});
      +
      +}());
      \ No newline at end of file
      diff --git a/docs/_style/prism-master/plugins/autoloader/prism-autoloader.min.js b/docs/_style/prism-master/plugins/autoloader/prism-autoloader.min.js
      new file mode 100644
      index 0000000..629f1b2
      --- /dev/null
      +++ b/docs/_style/prism-master/plugins/autoloader/prism-autoloader.min.js
      @@ -0,0 +1 @@
      +!function(){if("undefined"!=typeof self&&self.Prism&&self.document&&document.createElement){var e={javascript:"clike",actionscript:"javascript",arduino:"cpp",aspnet:["markup","csharp"],bison:"c",c:"clike",csharp:"clike",cpp:"c",coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",django:"markup",erb:["ruby","markup-templating"],fsharp:"clike",flow:"javascript",glsl:"clike",gml:"clike",go:"clike",groovy:"clike",haml:"ruby",handlebars:"markup-templating",haxe:"clike",java:"clike",jolie:"clike",kotlin:"clike",less:"css",markdown:"markup","markup-templating":"markup",n4js:"javascript",nginx:"clike",objectivec:"c",opencl:"cpp",parser:"markup",php:["clike","markup-templating"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:"javascript",qore:"clike",jsx:["markup","javascript"],tsx:["jsx","typescript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java",smarty:"markup-templating",soy:"markup-templating",swift:"clike",tap:"yaml",textile:"markup",tt2:["clike","markup-templating"],twig:"markup",typescript:"javascript",vala:"clike",vbnet:"basic",velocity:"markup",wiki:"markup",xeora:"markup",xquery:"markup"},a={},c="none",t=document.getElementsByTagName("script");t=t[t.length-1];var r="components/";if(t.hasAttribute("data-autoloader-path")){var s=t.getAttribute("data-autoloader-path").trim();s.length>0&&!/^[a-z]+:\/\//i.test(t.src)&&(r=s.replace(/\/?$/,"/"))}else/[\w-]+\.js$/.test(t.src)&&(r=t.src.replace(/[\w-]+\.js$/,"components/"));var i=Prism.plugins.autoloader={languages_path:r,use_minified:!0},n=function(e,a,c){var t=document.createElement("script");t.src=e,t.async=!0,t.onload=function(){document.body.removeChild(t),a&&a()},t.onerror=function(){document.body.removeChild(t),c&&c()},document.body.appendChild(t)},l=function(e){return i.languages_path+"prism-"+e+(i.use_minified?".min":"")+".js"},o=function(e,c){var t=a[e];t||(t=a[e]={});var r=c.getAttribute("data-dependencies");!r&&c.parentNode&&"pre"===c.parentNode.tagName.toLowerCase()&&(r=c.parentNode.getAttribute("data-dependencies")),r=r?r.split(/\s*,\s*/g):[],p(r,function(){u(e,function(){Prism.highlightElement(c)})})},p=function(e,a,c){"string"==typeof e&&(e=[e]);var t=0,r=e.length,s=function(){r>t?u(e[t],function(){t++,s()},function(){c&&c(e[t])}):t===r&&a&&a(e)};s()},u=function(c,t,r){var s=function(){var e=!1;c.indexOf("!")>=0&&(e=!0,c=c.replace("!",""));var s=a[c];if(s||(s=a[c]={}),t&&(s.success_callbacks||(s.success_callbacks=[]),s.success_callbacks.push(t)),r&&(s.error_callbacks||(s.error_callbacks=[]),s.error_callbacks.push(r)),!e&&Prism.languages[c])m(c);else if(!e&&s.error)k(c);else if(e||!s.loading){s.loading=!0;var i=l(c);n(i,function(){s.loading=!1,m(c)},function(){s.loading=!1,s.error=!0,k(c)})}},i=e[c];i&&i.length?p(i,s):s()},m=function(e){a[e]&&a[e].success_callbacks&&a[e].success_callbacks.length&&a[e].success_callbacks.forEach(function(a){a(e)})},k=function(e){a[e]&&a[e].error_callbacks&&a[e].error_callbacks.length&&a[e].error_callbacks.forEach(function(a){a(e)})};Prism.hooks.add("complete",function(e){e.element&&e.language&&!e.grammar&&e.language!==c&&o(e.language,e.element)})}}();
      \ No newline at end of file
      diff --git a/docs/_style/prism-master/plugins/command-line/index.html b/docs/_style/prism-master/plugins/command-line/index.html
      new file mode 100644
      index 0000000..109138b
      --- /dev/null
      +++ b/docs/_style/prism-master/plugins/command-line/index.html
      @@ -0,0 +1,111 @@
      +
      +
      +
      +
      +
      +
      +Command Line â–² Prism plugins
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +

      Command Line

      +

      Display a command line with a prompt and, optionally, the output/response from the commands.

      +
      + +
      +

      How to use

      + +

      This is intended for code blocks (<pre><code>) and not for inline code.

      + +

      Add class command-line to your <pre>. For a server command line, specify the user and host names using the data-user and data-host attributes. The resulting prompt displays a # for the root user and $ for all other users. For any other command line, such as a Windows prompt, you may specify the entire prompt using the data-prompt attribute.

      + +

      Optional: You may specify the lines to be presented as output (no prompt and no highlighting) through the data-output attribute on the <pre> element in the following simple format:

      +
        +
      • A single number refers to the line with that number
      • +
      • Ranges are denoted by two numbers, separated with a hyphen (-)
      • +
      • Multiple line numbers or ranges are separated by commas.
      • +
      • Whitespace is allowed anywhere and will be stripped off.
      • +
      + +

      Examples:

      +
      +
      5
      +
      The 5th line
      + +
      1-5
      +
      Lines 1 through 5
      + +
      1,4
      +
      Line 1 and line 4
      + +
      1-2, 5, 9-20
      +
      Lines 1 through 2, line 5, lines 9 through 20
      +
      + +

      Optional: To automatically present some lines as output, you can prefix those lines with any string and specify the prefix using the data-filter-output attribute on the <pre> element. For example, data-filter-output="(out)" will treat lines beginning with (out) as output and remove the prefix.

      +
      + +
      +

      Examples

      + +

      Root User Without Output

      +
      cd /usr/local/etc
      +cp php.ini php.ini.bak
      +vi php.ini
      + +

      Non-Root User With Output

      +
      pwd
      +/usr/home/chris/bin
      +ls -la
      +total 2
      +drwxr-xr-x   2 chris  chris     11 Jan 10 16:48 .
      +drwxr--r-x  45 chris  chris     92 Feb 14 11:10 ..
      +-rwxr-xr-x   1 chris  chris    444 Aug 25  2013 backup
      +-rwxr-xr-x   1 chris  chris    642 Jan 17 14:42 deploy
      + +

      Windows PowerShell With Output

      +
      dir
      +
      +
      +    Directory: C:\Users\Chris
      +
      +
      +Mode                LastWriteTime     Length Name
      +----                -------------     ------ ----
      +d-r--        10/14/2015   5:06 PM            Contacts
      +d-r--        12/12/2015   1:47 PM            Desktop
      +d-r--         11/4/2015   7:59 PM            Documents
      +d-r--        10/14/2015   5:06 PM            Downloads
      +d-r--        10/14/2015   5:06 PM            Favorites
      +d-r--        10/14/2015   5:06 PM            Links
      +d-r--        10/14/2015   5:06 PM            Music
      +d-r--        10/14/2015   5:06 PM            Pictures
      +d-r--        10/14/2015   5:06 PM            Saved Games
      +d-r--        10/14/2015   5:06 PM            Searches
      +d-r--        10/14/2015   5:06 PM            Videos
      + +
      + +
      + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/command-line/prism-command-line.css b/docs/_style/prism-master/plugins/command-line/prism-command-line.css new file mode 100644 index 0000000..153a870 --- /dev/null +++ b/docs/_style/prism-master/plugins/command-line/prism-command-line.css @@ -0,0 +1,33 @@ +.command-line-prompt { + border-right: 1px solid #999; + display: block; + float: left; + font-size: 100%; + letter-spacing: -1px; + margin-right: 1em; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.command-line-prompt > span:before { + color: #999; + content: ' '; + display: block; + padding-right: 0.8em; +} + +.command-line-prompt > span[data-user]:before { + content: "[" attr(data-user) "@" attr(data-host) "] $"; +} + +.command-line-prompt > span[data-user="root"]:before { + content: "[" attr(data-user) "@" attr(data-host) "] #"; +} + +.command-line-prompt > span[data-prompt]:before { + content: attr(data-prompt); +} diff --git a/docs/_style/prism-master/plugins/command-line/prism-command-line.js b/docs/_style/prism-master/plugins/command-line/prism-command-line.js new file mode 100644 index 0000000..3c77991 --- /dev/null +++ b/docs/_style/prism-master/plugins/command-line/prism-command-line.js @@ -0,0 +1,139 @@ +(function() { + +if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; +} + +var clsReg = /(?:^|\s)command-line(?:\s|$)/; + +Prism.hooks.add('before-highlight', function (env) { + var vars = env.vars = env.vars || {}; + var commandLine = vars['command-line'] = vars['command-line'] || {}; + + if (commandLine.complete || !env.code) { + commandLine.complete = true; + return; + } + + // Works only for wrapped inside
       (not inline).
      +	var pre = env.element.parentNode;
      +	if (!pre || !/pre/i.test(pre.nodeName) || // Abort only if neither the 
       nor the  have the class
      +		(!clsReg.test(pre.className) && !clsReg.test(env.element.className))) {
      +		commandLine.complete = true;
      +		return;
      +	}
      +
      +	if (env.element.querySelector('.command-line-prompt')) { // Abort if prompt already exists.
      +		commandLine.complete = true;
      +		return;
      +	}
      +
      +	var codeLines = env.code.split('\n');
      +	commandLine.numberOfLines = codeLines.length;
      +	var outputLines = commandLine.outputLines = [];
      +
      +	var outputSections = pre.getAttribute('data-output');
      +	var outputFilter = pre.getAttribute('data-filter-output');
      +	if (outputSections || outputSections === '') { // The user specified the output lines. -- cwells
      +		outputSections = outputSections.split(',');
      +		for (var i = 0; i < outputSections.length; i++) { // Parse the output sections into start/end ranges. -- cwells
      +			var range = outputSections[i].split('-');
      +			var outputStart = parseInt(range[0], 10);
      +			var outputEnd = (range.length === 2 ? parseInt(range[1], 10) : outputStart);
      +
      +			if (!isNaN(outputStart) && !isNaN(outputEnd)) {
      +				if (outputStart < 1) {
      +					outputStart = 1;
      +				}
      +				if (outputEnd > codeLines.length) {
      +					outputEnd = codeLines.length;
      +				}
      +				// Convert start and end to 0-based to simplify the arrays. -- cwells
      +				outputStart--;
      +				outputEnd--;
      +				// Save the output line in an array and clear it in the code so it's not highlighted. -- cwells
      +				for (var j = outputStart; j <= outputEnd; j++) {
      +					outputLines[j] = codeLines[j];
      +					codeLines[j] = '';
      +				}
      +			}
      +		}
      +	} else if (outputFilter) { // Treat lines beginning with this string as output. -- cwells
      +		for (var i = 0; i < codeLines.length; i++) {
      +			if (codeLines[i].indexOf(outputFilter) === 0) { // This line is output. -- cwells
      +				outputLines[i] = codeLines[i].slice(outputFilter.length);
      +				codeLines[i] = '';
      +			}
      +		}
      +	}
      +
      +	env.code = codeLines.join('\n');
      +});
      +
      +Prism.hooks.add('before-insert', function (env) {
      +	var vars = env.vars = env.vars || {};
      +	var commandLine = vars['command-line'] = vars['command-line'] || {};
      +	if (commandLine.complete) {
      +		return;
      +	}
      +
      +	// Reinsert the output lines into the highlighted code. -- cwells
      +	var codeLines = env.highlightedCode.split('\n');
      +	for (var i = 0; i < commandLine.outputLines.length; i++) {
      +		if (commandLine.outputLines.hasOwnProperty(i)) {
      +			codeLines[i] = commandLine.outputLines[i];
      +		}
      +	}
      +	env.highlightedCode = codeLines.join('\n');
      +});
      +
      +Prism.hooks.add('complete', function (env) {
      +	var vars = env.vars = env.vars || {};
      +	var commandLine = vars['command-line'] = vars['command-line'] || {};
      +	if (commandLine.complete) {
      +		return;
      +	}
      +
      +	var pre = env.element.parentNode;
      +	if (clsReg.test(env.element.className)) { // Remove the class "command-line" from the 
      +		env.element.className = env.element.className.replace(clsReg, ' ');
      +	}
      +	if (!clsReg.test(pre.className)) { // Add the class "command-line" to the 
      +		pre.className += ' command-line';
      +	}
      +
      +	var getAttribute = function(key, defaultValue) {
      +		return (pre.getAttribute(key) || defaultValue).replace(/"/g, '"');
      +	};
      +
      +	// Create the "rows" that will become the command-line prompts. -- cwells
      +	var promptLines = new Array(commandLine.numberOfLines + 1);
      +	var promptText = getAttribute('data-prompt', '');
      +	if (promptText !== '') {
      +		promptLines = promptLines.join('');
      +	} else {
      +		var user = getAttribute('data-user', 'user');
      +		var host = getAttribute('data-host', 'localhost');
      +		promptLines = promptLines.join('');
      +	}
      +
      +	// Create the wrapper element. -- cwells
      +	var prompt = document.createElement('span');
      +	prompt.className = 'command-line-prompt';
      +	prompt.innerHTML = promptLines;
      +
      +	// Remove the prompt from the output lines. -- cwells
      +	for (var i = 0; i < commandLine.outputLines.length; i++) {
      +		if (commandLine.outputLines.hasOwnProperty(i)) {
      +			var node = prompt.children[i];
      +			node.removeAttribute('data-user');
      +			node.removeAttribute('data-host');
      +			node.removeAttribute('data-prompt');
      +		}
      +	}
      +
      +	env.element.insertBefore(prompt, env.element.firstChild);
      +	commandLine.complete = true;
      +});
      +
      +}());
      diff --git a/docs/_style/prism-master/plugins/command-line/prism-command-line.min.js b/docs/_style/prism-master/plugins/command-line/prism-command-line.min.js
      new file mode 100644
      index 0000000..44d011a
      --- /dev/null
      +++ b/docs/_style/prism-master/plugins/command-line/prism-command-line.min.js
      @@ -0,0 +1 @@
      +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e=/(?:^|\s)command-line(?:\s|$)/;Prism.hooks.add("before-highlight",function(t){var a=t.vars=t.vars||{},n=a["command-line"]=a["command-line"]||{};if(n.complete||!t.code)return n.complete=!0,void 0;var r=t.element.parentNode;if(!r||!/pre/i.test(r.nodeName)||!e.test(r.className)&&!e.test(t.element.className))return n.complete=!0,void 0;if(t.element.querySelector(".command-line-prompt"))return n.complete=!0,void 0;var o=t.code.split("\n");n.numberOfLines=o.length;var s=n.outputLines=[],i=r.getAttribute("data-output"),l=r.getAttribute("data-filter-output");if(i||""===i){i=i.split(",");for(var m=0;mp&&(p=1),c>o.length&&(c=o.length),p--,c--;for(var u=p;c>=u;u++)s[u]=o[u],o[u]=""}}}else if(l)for(var m=0;m');else{var l=o("data-user","user"),m=o("data-host","localhost");s=s.join('')}var d=document.createElement("span");d.className="command-line-prompt",d.innerHTML=s;for(var p=0;p
      +
      +
      +
      +	
      +	
      +	Copy to Clipboard â–² Prism plugins
      +	
      +	
      +	
      +	
      +	
      +
      +	
      +	
      +
      +
      +
      +
      +
      + +

      Copy to Clipboard

      +

      Add a button that copies the code block to the clipboard when clicked.

      +
      + +
      +

      How to use

      +

      In addition to including the plugin file with your PrismJS build, ensure Clipboard.js is loaded before the plugin.

      + +

      The simplest way to include Clipboard.js is to use any of the + recommended CDNs. If you're using Browserify, Clipboard.js will be loaded auotmatically + if it's included in your package.json. + If you don't load Clipboard.js yourself, the plugin will load it from a CDN for you.

      + +
      
      +
      + +
      + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.js b/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.js new file mode 100644 index 0000000..0b185f4 --- /dev/null +++ b/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.js @@ -0,0 +1,75 @@ +(function(){ + if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; + } + + if (!Prism.plugins.toolbar) { + console.warn('Copy to Clipboard plugin loaded before Toolbar plugin.'); + + return; + } + + var ClipboardJS = window.ClipboardJS || undefined; + + if (!ClipboardJS && typeof require === 'function') { + ClipboardJS = require('clipboard'); + } + + var callbacks = []; + + if (!ClipboardJS) { + var script = document.createElement('script'); + var head = document.querySelector('head'); + + script.onload = function() { + ClipboardJS = window.ClipboardJS; + + if (ClipboardJS) { + while (callbacks.length) { + callbacks.pop()(); + } + } + }; + + script.src = 'https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js'; + head.appendChild(script); + } + + Prism.plugins.toolbar.registerButton('copy-to-clipboard', function (env) { + var linkCopy = document.createElement('a'); + linkCopy.textContent = 'Copy'; + + if (!ClipboardJS) { + callbacks.push(registerClipboard); + } else { + registerClipboard(); + } + + return linkCopy; + + function registerClipboard() { + var clip = new ClipboardJS(linkCopy, { + 'text': function () { + return env.code; + } + }); + + clip.on('success', function() { + linkCopy.textContent = 'Copied!'; + + resetText(); + }); + clip.on('error', function () { + linkCopy.textContent = 'Press Ctrl+C to copy'; + + resetText(); + }); + } + + function resetText() { + setTimeout(function () { + linkCopy.textContent = 'Copy'; + }, 5000); + } + }); +})(); diff --git a/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js b/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js new file mode 100644 index 0000000..aa5742d --- /dev/null +++ b/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js @@ -0,0 +1 @@ +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."),void 0;var o=window.ClipboardJS||void 0;o||"function"!=typeof require||(o=require("clipboard"));var e=[];if(!o){var t=document.createElement("script"),n=document.querySelector("head");t.onload=function(){if(o=window.ClipboardJS)for(;e.length;)e.pop()()},t.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",n.appendChild(t)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(t){function n(){var e=new o(i,{text:function(){return t.code}});e.on("success",function(){i.textContent="Copied!",r()}),e.on("error",function(){i.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){i.textContent="Copy"},5e3)}var i=document.createElement("a");return i.textContent="Copy",o?n():e.push(n),i})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/custom-class/index.html b/docs/_style/prism-master/plugins/custom-class/index.html new file mode 100644 index 0000000..ee4fade --- /dev/null +++ b/docs/_style/prism-master/plugins/custom-class/index.html @@ -0,0 +1,133 @@ + + + + + + +Custom Class â–² Prism plugins + + + + + + + + + +
      +
      + +

      Custom Class

      +

      This plugin allows you to prefix Prism default classes (.comment will become .namespace--comment) or replace them with your defined ones (like .editor__comment or .comment_7sh3a).

      +
      + +
      +

      Motivation

      + +

      Prism default classes are sensible but fixed and too generic. This plugin provide some ways to customize those classes to suit your needs. Example usages:

      + +
        +
      • + You want to add namespace for all of them (like .prism--comment) to avoid conflict with your existing classes. +
      • +
      • + You use a naming convention (like BEM). You want to write classes like .editor__comment. +
      • +
      • You use + CSS Modules. You want to use your hashed classes, like .comment_7sh3a. +
      • +
      + +

      Features

      + +

      This plugin currently provides 2 features:

      + +

      1. Prefix all Prism classes with a string

      + + Prism.plugins.customClass.prefix('prism--') + +

      2. Replace some Prism classes with your defined ones via an object

      + +
      Prism.plugins.customClass.map({
      +	keyword: 'special-keyword',
      +	string: 'string_ch29s',
      +	comment: 'comment_93jsa'
      +})
      + +

      Object's keys are the tokens you want to replace (eg: comment), with their values being the classes you want to use (eg: my-comment). Tokens which are not specified will stay the same.

      + +

      Notes

      + +
        +
      • +

        Feature functions must be called AFTER Prism and this plugin. For example:

        + +
        <!-- 1. load prism -->
        +<script src="prism.js"></script>
        +<!-- 2. load the plugin if you don't include it inside prism when download -->
        +<script src="plugins/custom-class/custom-class.js"></script>
        +<!-- 3. call the feature you want to use -->
        +<script>
        +	Prism.plugins.customClass.map(myClassMap);
        +	Prism.plugins.customClass.prefix(myPrefixString);
        +</script>
        + +
      • + +
      • In most cases, using 1 feature is enough. However, it is possible to use both of them together if you want (Result will be like .my-namespace--comment_93jsa).
      • + +
      + +

      CSS Modules Usage:

      + +

      The initial purpose of this plugin is to be used with CSS Modules. It works perfectly with the class map object returned by CSS Modules. For example:

      + +
      import Prism from 'prismjs';
      +import classMap from 'styles/editor-class-map.css';
      +Prism.plugins.customClass.map(classMap)
      + +
      + +
      +

      Example

      + +

      Input

      +
      <pre class="language-javascript"><code>
      +	var foo = 'bar';
      +</code></pre>
      + +

      Options

      +
      Prism.plugins.customClass.map({
      +	keyword: 'special-keyword',
      +	string: 'my-string'
      +});
      +Prism.plugins.customClass.prefix('pr-');
      + +

      Output

      +
      <pre class="language-javascript"><code>
      +	<span class="pr-token pr-special-keyword">var</span>
      +	foo
      +	<span class="pr-token pr-operator">=</span>
      +	<span class="pr-my-string">'bar'</span>
      +	<span class="pr-token pr-punctuation">;</span>
      +</code></pre>
      +
      + +
      +

      Todo

      + +
      + +
      + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/custom-class/prism-custom-class.js b/docs/_style/prism-master/plugins/custom-class/prism-custom-class.js new file mode 100644 index 0000000..bb5bd6a --- /dev/null +++ b/docs/_style/prism-master/plugins/custom-class/prism-custom-class.js @@ -0,0 +1,31 @@ +(function(){ + +if ( + (typeof self === 'undefined' || !self.Prism) && + (typeof global === 'undefined' || !global.Prism) +) { + return; +} + +var options = { + classMap: {} +}; +Prism.plugins.customClass = { + map: function map(cm) { + options.classMap = cm; + }, + prefix: function prefix(string) { + options.prefixString = string; + } +} + +Prism.hooks.add('wrap', function (env) { + if (!options.classMap && !options.prefixString) { + return; + } + env.classes = env.classes.map(function(c) { + return (options.prefixString || '') + (options.classMap[c] || c); + }); +}); + +})(); diff --git a/docs/_style/prism-master/plugins/custom-class/prism-custom-class.min.js b/docs/_style/prism-master/plugins/custom-class/prism-custom-class.min.js new file mode 100644 index 0000000..f22063f --- /dev/null +++ b/docs/_style/prism-master/plugins/custom-class/prism-custom-class.min.js @@ -0,0 +1 @@ +!function(){if("undefined"!=typeof self&&self.Prism||"undefined"!=typeof global&&global.Prism){var s={classMap:{}};Prism.plugins.customClass={map:function(i){s.classMap=i},prefix:function(i){s.prefixString=i}},Prism.hooks.add("wrap",function(i){(s.classMap||s.prefixString)&&(i.classes=i.classes.map(function(i){return(s.prefixString||"")+(s.classMap[i]||i)}))})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/data-uri-highlight/index.html b/docs/_style/prism-master/plugins/data-uri-highlight/index.html new file mode 100644 index 0000000..380be2d --- /dev/null +++ b/docs/_style/prism-master/plugins/data-uri-highlight/index.html @@ -0,0 +1,60 @@ + + + + + + +Data-URI Highlight â–² Prism plugins + + + + + + + + + + + +
      +
      + +

      Data-URI Highlight

      +

      Highlights data-URI contents.

      +
      + +
      +

      How to use

      +

      Data-URIs will be highlighted automatically, provided the needed grammar is loaded. + The grammar to use is guessed using the MIME type information.

      +
      + +
      +

      Example

      + +
      div {
      +    border: 40px solid transparent;
      +    border-image: 33.334% url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30"> \
      +                          <circle cx="5" cy="5" r="5" fill="%23ab4"/><circle cx="15" cy="5" r="5" fill="%23655"/> \
      +                          <circle cx="25" cy="5" r="5" fill="%23e07"/><circle cx="5" cy="15" r="5" fill="%23655"/> \
      +                          <circle cx="15" cy="15" r="5" fill="hsl(15, 25%, 75%)"/> \
      +                          <circle cx="25" cy="15" r="5" fill="%23655"/><circle cx="5" cy="25" r="5" fill="%23fb3"/> \
      +                          <circle cx="15" cy="25" r="5" fill="%23655"/><circle cx="25" cy="25" r="5" fill="%2358a"/></svg>');
      +    padding: 1em;
      +    max-width: 20em;
      +    font: 130%/1.6 Baskerville, Palatino, serif;
      +}
      + +
      + +
      + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.js b/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.js new file mode 100644 index 0000000..7ff8d1f --- /dev/null +++ b/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.js @@ -0,0 +1,98 @@ +(function () { + + if ( + typeof self !== 'undefined' && !self.Prism || + typeof global !== 'undefined' && !global.Prism + ) { + return; + } + + var autoLinkerProcess = function (grammar) { + if (Prism.plugins.autolinker) { + Prism.plugins.autolinker.processGrammar(grammar); + } + return grammar; + }; + var dataURI = { + pattern: /(.)\bdata:[^\/]+\/[^,]+,(?:(?!\1)[\s\S]|\\\1)+(?=\1)/, + lookbehind: true, + inside: { + 'language-css': { + pattern: /(data:[^\/]+\/(?:[^+,]+\+)?css,)[\s\S]+/, + lookbehind: true + }, + 'language-javascript': { + pattern: /(data:[^\/]+\/(?:[^+,]+\+)?javascript,)[\s\S]+/, + lookbehind: true + }, + 'language-json': { + pattern: /(data:[^\/]+\/(?:[^+,]+\+)?json,)[\s\S]+/, + lookbehind: true + }, + 'language-markup': { + pattern: /(data:[^\/]+\/(?:[^+,]+\+)?(?:html|xml),)[\s\S]+/, + lookbehind: true + } + } + }; + + // Tokens that may contain URLs + var candidates = ['url', 'attr-value', 'string']; + + Prism.plugins.dataURIHighlight = { + processGrammar: function (grammar) { + // Abort if grammar has already been processed + if (!grammar || grammar['data-uri']) { + return; + } + + Prism.languages.DFS(grammar, function (key, def, type) { + if (candidates.indexOf(type) > -1 && Prism.util.type(def) !== 'Array') { + if (!def.pattern) { + def = this[key] = { + pattern: def + }; + } + + def.inside = def.inside || {}; + + if (type == 'attr-value') { + Prism.languages.insertBefore('inside', def.inside['url-link'] ? 'url-link' : 'punctuation', { + 'data-uri': dataURI + }, def); + } + else { + if (def.inside['url-link']) { + Prism.languages.insertBefore('inside', 'url-link', { + 'data-uri': dataURI + }, def); + } else { + def.inside['data-uri'] = dataURI; + } + } + } + }); + grammar['data-uri'] = dataURI; + } + }; + + Prism.hooks.add('before-highlight', function (env) { + // Prepare the needed grammars for this code block + if (dataURI.pattern.test(env.code)) { + for (var p in dataURI.inside) { + if (dataURI.inside.hasOwnProperty(p)) { + if (!dataURI.inside[p].inside && dataURI.inside[p].pattern.test(env.code)) { + var lang = p.match(/^language-(.+)/)[1]; + if (Prism.languages[lang]) { + dataURI.inside[p].inside = { + rest: autoLinkerProcess(Prism.languages[lang]) + }; + } + } + } + } + } + + Prism.plugins.dataURIHighlight.processGrammar(env.grammar); + }); +}()); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.min.js b/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.min.js new file mode 100644 index 0000000..479828d --- /dev/null +++ b/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.min.js @@ -0,0 +1 @@ +!function(){if(("undefined"==typeof self||self.Prism)&&("undefined"==typeof global||global.Prism)){var i=function(i){return Prism.plugins.autolinker&&Prism.plugins.autolinker.processGrammar(i),i},a={pattern:/(.)\bdata:[^\/]+\/[^,]+,(?:(?!\1)[\s\S]|\\\1)+(?=\1)/,lookbehind:!0,inside:{"language-css":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?css,)[\s\S]+/,lookbehind:!0},"language-javascript":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?javascript,)[\s\S]+/,lookbehind:!0},"language-json":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?json,)[\s\S]+/,lookbehind:!0},"language-markup":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?(?:html|xml),)[\s\S]+/,lookbehind:!0}}},n=["url","attr-value","string"];Prism.plugins.dataURIHighlight={processGrammar:function(i){i&&!i["data-uri"]&&(Prism.languages.DFS(i,function(i,e,r){n.indexOf(r)>-1&&"Array"!==Prism.util.type(e)&&(e.pattern||(e=this[i]={pattern:e}),e.inside=e.inside||{},"attr-value"==r?Prism.languages.insertBefore("inside",e.inside["url-link"]?"url-link":"punctuation",{"data-uri":a},e):e.inside["url-link"]?Prism.languages.insertBefore("inside","url-link",{"data-uri":a},e):e.inside["data-uri"]=a)}),i["data-uri"]=a)}},Prism.hooks.add("before-highlight",function(n){if(a.pattern.test(n.code))for(var e in a.inside)if(a.inside.hasOwnProperty(e)&&!a.inside[e].inside&&a.inside[e].pattern.test(n.code)){var r=e.match(/^language-(.+)/)[1];Prism.languages[r]&&(a.inside[e].inside={rest:i(Prism.languages[r])})}Prism.plugins.dataURIHighlight.processGrammar(n.grammar)})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/file-highlight/index.html b/docs/_style/prism-master/plugins/file-highlight/index.html new file mode 100644 index 0000000..e66b989 --- /dev/null +++ b/docs/_style/prism-master/plugins/file-highlight/index.html @@ -0,0 +1,75 @@ + + + + + + +File Highlight â–² Prism plugins + + + + + + + + + + + +
      +
      + +

      File Highlight

      +

      Fetch external files and highlight them with Prism. Used on the Prism website itself.

      +
      + +
      +

      How to use

      + +

      Use the data-src attribute on empty <pre> elements, like so:

      + +
      <pre data-src="myfile.js"></pre>
      + +

      You don’t need to specify the language, it’s automatically determined by the file extension. + If, however, the language cannot be determined from the file extension or the file extension is incorrect, you may specify a language as well (with the usual class name way).

      + +

      Please note that the files are fetched with XMLHttpRequest. This means that if the file is on a different origin, fetching it will fail, unless CORS is enabled on that website.

      + +

      + When used in conjunction with the Toolbar plugin, this plugin can also display a button to download the file. + To use it, add a data-download-link attribute on the <pre> element.
      + Optionally, the text can also be customized by using a data-download-link-label attribute. +

      +
      <pre data-src="myfile.js" data-download-link data-download-link-label="Download this file"></pre>
      +
      + +
      +

      Examples

      + +

      The plugin’s JS code:

      +
      
      +	
      +	

      This page:

      +
      
      +
      +	

      File that doesn’t exist:

      +
      
      +
      +	

      With a download button:

      +
      
      +
      +	

      For more examples, browse around the Prism website. Most large code samples are actually files fetched with this plugin.

      +
      + +
      + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.js b/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.js new file mode 100644 index 0000000..65efaf9 --- /dev/null +++ b/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.js @@ -0,0 +1,105 @@ +(function () { + if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) { + return; + } + + /** + * @param {Element} [container=document] + */ + self.Prism.fileHighlight = function(container) { + container = container || document; + + var Extensions = { + 'js': 'javascript', + 'py': 'python', + 'rb': 'ruby', + 'ps1': 'powershell', + 'psm1': 'powershell', + 'sh': 'bash', + 'bat': 'batch', + 'h': 'c', + 'tex': 'latex' + }; + + Array.prototype.slice.call(container.querySelectorAll('pre[data-src]')).forEach(function (pre) { + // ignore if already loaded + if (pre.hasAttribute('data-src-loaded')) { + return; + } + + // load current + var src = pre.getAttribute('data-src'); + + var language, parent = pre; + var lang = /\blang(?:uage)?-([\w-]+)\b/i; + while (parent && !lang.test(parent.className)) { + parent = parent.parentNode; + } + + if (parent) { + language = (pre.className.match(lang) || [, ''])[1]; + } + + if (!language) { + var extension = (src.match(/\.(\w+)$/) || [, ''])[1]; + language = Extensions[extension] || extension; + } + + var code = document.createElement('code'); + code.className = 'language-' + language; + + pre.textContent = ''; + + code.textContent = 'Loading…'; + + pre.appendChild(code); + + var xhr = new XMLHttpRequest(); + + xhr.open('GET', src, true); + + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + + if (xhr.status < 400 && xhr.responseText) { + code.textContent = xhr.responseText; + + Prism.highlightElement(code); + // mark as loaded + pre.setAttribute('data-src-loaded', ''); + } + else if (xhr.status >= 400) { + code.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText; + } + else { + code.textContent = '✖ Error: File does not exist or is empty'; + } + } + }; + + xhr.send(null); + }); + + if (Prism.plugins.toolbar) { + Prism.plugins.toolbar.registerButton('download-file', function (env) { + var pre = env.element.parentNode; + if (!pre || !/pre/i.test(pre.nodeName) || !pre.hasAttribute('data-src') || !pre.hasAttribute('data-download-link')) { + return; + } + var src = pre.getAttribute('data-src'); + var a = document.createElement('a'); + a.textContent = pre.getAttribute('data-download-link-label') || 'Download'; + a.setAttribute('download', ''); + a.href = src; + return a; + }); + } + + }; + + document.addEventListener('DOMContentLoaded', function () { + // execute inside handler, for dropping Event as argumnet + self.Prism.fileHighlight(); + }); + +})(); diff --git a/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.min.js b/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.min.js new file mode 100644 index 0000000..31869b3 --- /dev/null +++ b/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.min.js @@ -0,0 +1 @@ +!function(){"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(t){t=t||document;var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"};Array.prototype.slice.call(t.querySelectorAll("pre[data-src]")).forEach(function(t){if(!t.hasAttribute("data-src-loaded")){for(var a,n=t.getAttribute("data-src"),r=t,s=/\blang(?:uage)?-([\w-]+)\b/i;r&&!s.test(r.className);)r=r.parentNode;if(r&&(a=(t.className.match(s)||[,""])[1]),!a){var o=(n.match(/\.(\w+)$/)||[,""])[1];a=e[o]||o}var l=document.createElement("code");l.className="language-"+a,t.textContent="",l.textContent="Loading…",t.appendChild(l);var i=new XMLHttpRequest;i.open("GET",n,!0),i.onreadystatechange=function(){4==i.readyState&&(i.status<400&&i.responseText?(l.textContent=i.responseText,Prism.highlightElement(l),t.setAttribute("data-src-loaded","")):l.textContent=i.status>=400?"✖ Error "+i.status+" while fetching file: "+i.statusText:"✖ Error: File does not exist or is empty")},i.send(null)}}),Prism.plugins.toolbar&&Prism.plugins.toolbar.registerButton("download-file",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-src")&&e.hasAttribute("data-download-link")){var a=e.getAttribute("data-src"),n=document.createElement("a");return n.textContent=e.getAttribute("data-download-link-label")||"Download",n.setAttribute("download",""),n.href=a,n}})},document.addEventListener("DOMContentLoaded",function(){self.Prism.fileHighlight()}))}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/highlight-keywords/index.html b/docs/_style/prism-master/plugins/highlight-keywords/index.html new file mode 100644 index 0000000..4665873 --- /dev/null +++ b/docs/_style/prism-master/plugins/highlight-keywords/index.html @@ -0,0 +1,51 @@ + + + + + + +Highlight Keywords ▲ Prism plugins + + + + + + + + + + +
      +
      + +

      Highlight Keywords

      +

      This plugin adds special CSS classes for each keyword matched in the code. For example, the keyword if will have the class keyword-if as well. You can have fine grained control over the appearance of each keyword by providing your own CSS rules.

      +
      + +
      +

      Examples

      + +

      JavaScript

      +
      
      +
      +	

      HTML (Markup)

      +
      
      +
      +
      + + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.js b/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.js new file mode 100644 index 0000000..32b2812 --- /dev/null +++ b/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.js @@ -0,0 +1,17 @@ +(function(){ + +if ( + typeof self !== 'undefined' && !self.Prism || + typeof global !== 'undefined' && !global.Prism +) { + return; +} + +Prism.hooks.add('wrap', function(env) { + if (env.type !== "keyword") { + return; + } + env.classes.push('keyword-' + env.content); +}); + +})(); diff --git a/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.min.js b/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.min.js new file mode 100644 index 0000000..c4326fe --- /dev/null +++ b/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.min.js @@ -0,0 +1 @@ +!function(){"undefined"!=typeof self&&!self.Prism||"undefined"!=typeof global&&!global.Prism||Prism.hooks.add("wrap",function(e){"keyword"===e.type&&e.classes.push("keyword-"+e.content)})}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/index.html b/docs/_style/prism-master/plugins/index.html new file mode 100644 index 0000000..7b4a48a --- /dev/null +++ b/docs/_style/prism-master/plugins/index.html @@ -0,0 +1,42 @@ + + + + + + +Plugins â–² Prism + + + + + + + + + + + +
      +
      +
      + +
      +

      Available plugins

      +
        +
        + +
        +

        Contribute

        +

        Writing Prism plugins is easy! Read how at the “Extending Prism†section. +

        + +
        + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/jsonp-highlight/index.html b/docs/_style/prism-master/plugins/jsonp-highlight/index.html new file mode 100644 index 0000000..2ad4ac9 --- /dev/null +++ b/docs/_style/prism-master/plugins/jsonp-highlight/index.html @@ -0,0 +1,174 @@ + + + + + + +JSONP Highlight â–² Prism plugins + + + + + + + + + + +
        +
        + +

        JSONP Highlight

        +

        Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).

        +
        + +
        +

        How to use

        + +

        Use the data-jsonp attribute on <pre> elements, like so:

        + +
        <pre
        +  class="language-javascript"
        +  data-jsonp="https://api.github.com/repos/leaverou/prism/contents/prism.js">
        +</pre>
        + +

        + Don't specifiy the callback query parameter in the URL; this will be added + automatically. If the API expects a different callback parameter name however, use the + data-callback parameter to specify the name: +

        + +
        <pre class="…" data-jsonp="…" data-callback="cb"></pre>
        + +

        + The next trick is of course actually extracting something from the JSONP response worth + highlighting, which means processing the response to extract the interesting data. +

        + +

        The following JSONP APIs are automatically detected and parsed:

        + + + +

        If you need to do your own parsing, you can hook your your own data adapters in two ways:

        +
          +
        1. + Supply the data-adapter parameter on the <pre> element. + This must be the name of a globally defined function. + The plugin will use only this adapter to parse the response. +
        2. +
        3. + Register your adapter function by calling + Prism.plugins.jsonphighlight.registerAdapter(function(rsp) { … }). + It will be added to the list of inbuilt adapters and used if no other registered + adapater (e.g. GitHub/Bitbucket) can parse the response. +
        4. +
        + +

        + In either case, the function must accept at least a single parameter (the JSONP response) and + returns a string of the content to highlight. If your adapter cannot parse the response, you + must return null. The DOM node that will contain the highlighted code will also + be passed in as the second argument, incase you need to use it to query any extra information + (maybe you wish to inspect the class or data-jsonp attributes to + assist in parsing the response). +

        + +

        + The following example demonstrates both methods of using a custom adapter, to simply return + the stringyfied JSONP response (i.e highlight the entire JSONP data): +

        + +
        <!-- perhaps this is in a .js file elsewhere -->
        +<script>
        +	function dump_json(rsp) {
        +		return "using dump_json: " + JSON.stringify(rsp,null,2);
        +	}
        +</script>
        +
        +<!-- … include prism.js … -->
        +<script>
        +	Prism.plugins.jsonphighlight.registerAdapter(function(rsp) {
        +		return "using registerAdapter: " + JSON.stringify(rsp,null,2);
        +	})
        +</script>
        +
        + +

        And later in your HTML:

        + +
        <!-- using the data-adapter attribute -->
        +<pre class="language-javascript" data-jsonp="…" data-adapter="dump_json"></pre>
        +
        +<!-- using whatever data adapters are available -->
        +<pre class="language-javascript" data-jsonp="…"></pre>
        +
        + +

        + Finally, unlike like the File Highlight + plugin, you do need to supply the appropriate class with the language + to highlight. This could have been auto-detected, but since you're not actually linking to + a file it's not always possible (see below in the example using GitHub status). + Furthermore, if you're linking to files with a .xaml extension for example, + this plugin then needs to somehow map that to highlight as markup, which just + means more bloat. You know what you're trying to highlight, just say so :) +

        + +

        Caveat for Gists

        + +

        + There's a bit of a catch with gists, as they can actually contain multiple files. + There are two options to handle this: +

        + +
          +
        1. + If your gist only contains one file, you don't need to to anything; the one and only + file will automatically be chosen and highlighted +
        2. +
        3. + If your file contains multiple files, the first one will be chosen by default. + However, you can supply the filename in the data-filename attribute, and + this file will be highlighted instead: +
          <pre class="…" data-jsonp="…" data-filename="mydemo.js"></pre>
          +
        4. +
        +
        + +
        +

        Examples

        + +

        The plugin’s JS code (from GitHub):

        +
        
        +
        +	

        GitHub Gist (gist contains a single file, automatically selected):

        +
        
        +
        +	

        GitHub Gist (gist contains a multiple files, file to load specified):

        +
        
        +
        + 	

        Bitbucket API:

        +
        
        + 	
        + 	

        Custom adapter (JSON.stringify showing GitHub status):

        +
        
        +
        +	

        Registered adapter (as above, but without explicitly declaring the data-adapter attribute):

        +
        
        +
        + +
        + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/jsonp-highlight/prism-jsonp-highlight.js b/docs/_style/prism-master/plugins/jsonp-highlight/prism-jsonp-highlight.js new file mode 100644 index 0000000..4ce5ca5 --- /dev/null +++ b/docs/_style/prism-master/plugins/jsonp-highlight/prism-jsonp-highlight.js @@ -0,0 +1,151 @@ +(function() { + if ( !self.Prism || !self.document || !document.querySelectorAll || ![].filter) return; + + var adapters = []; + function registerAdapter(adapter) { + if (typeof adapter === "function" && !getAdapter(adapter)) { + adapters.push(adapter); + } + } + function getAdapter(adapter) { + if (typeof adapter === "function") { + return adapters.filter(function(fn) { return fn.valueOf() === adapter.valueOf()})[0]; + } + else if (typeof adapter === "string" && adapter.length > 0) { + return adapters.filter(function(fn) { return fn.name === adapter})[0]; + } + return null; + } + function removeAdapter(adapter) { + if (typeof adapter === "string") + adapter = getAdapter(adapter); + if (typeof adapter === "function") { + var index = adapters.indexOf(adapter); + if (index >=0) { + adapters.splice(index,1); + } + } + } + + Prism.plugins.jsonphighlight = { + registerAdapter: registerAdapter, + removeAdapter: removeAdapter, + highlight: highlight + }; + registerAdapter(function github(rsp, el) { + if ( rsp && rsp.meta && rsp.data ) { + if ( rsp.meta.status && rsp.meta.status >= 400 ) { + return "Error: " + ( rsp.data.message || rsp.meta.status ); + } + else if ( typeof(rsp.data.content) === "string" ) { + return typeof(atob) === "function" + ? atob(rsp.data.content.replace(/\s/g, "")) + : "Your browser cannot decode base64"; + } + } + return null; + }); + registerAdapter(function gist(rsp, el) { + if ( rsp && rsp.meta && rsp.data && rsp.data.files ) { + if ( rsp.meta.status && rsp.meta.status >= 400 ) { + return "Error: " + ( rsp.data.message || rsp.meta.status ); + } + else { + var filename = el.getAttribute("data-filename"); + if (filename == null) { + // Maybe in the future we can somehow render all files + // But the standard + + + + + + +
        +
        + +

        Keep markup

        +

        Prevents custom markup from being dropped out during highlighting.

        +
        + +
        + +

        How to use

        +

        You have nothing to do. With this plugin loaded, all markup inside code will be kept.

        + +

        Examples

        + +

        The following source code

        +
        <pre><code class="language-css">
        +@media <mark>screen</mark> {
        +	div {
        +		<mark>text</mark>-decoration: <mark><mark>under</mark>line</mark>;
        +		back<mark>ground: url</mark>('foo.png');
        +	}
        +}</code></pre>
        + +

        would render like this:

        +
        
        +@media screen {
        +	div {
        +		text-decoration: underline;
        +		background: url('foo.png');
        +	}
        +}
        + +

        + It also works for inline code: + var bar = function () { /* foo */ }; +

        + +
        + +
        + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.js b/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.js new file mode 100644 index 0000000..bc136c6 --- /dev/null +++ b/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.js @@ -0,0 +1,99 @@ +(function () { + + if (typeof self === 'undefined' || !self.Prism || !self.document || !document.createRange) { + return; + } + + Prism.plugins.KeepMarkup = true; + + Prism.hooks.add('before-highlight', function (env) { + if (!env.element.children.length) { + return; + } + + var pos = 0; + var data = []; + var f = function (elt, baseNode) { + var o = {}; + if (!baseNode) { + // Clone the original tag to keep all attributes + o.clone = elt.cloneNode(false); + o.posOpen = pos; + data.push(o); + } + for (var i = 0, l = elt.childNodes.length; i < l; i++) { + var child = elt.childNodes[i]; + if (child.nodeType === 1) { // element + f(child); + } else if(child.nodeType === 3) { // text + pos += child.data.length; + } + } + if (!baseNode) { + o.posClose = pos; + } + }; + f(env.element, true); + + if (data && data.length) { + // data is an array of all existing tags + env.keepMarkup = data; + } + }); + + Prism.hooks.add('after-highlight', function (env) { + if(env.keepMarkup && env.keepMarkup.length) { + + var walk = function (elt, nodeState) { + for (var i = 0, l = elt.childNodes.length; i < l; i++) { + + var child = elt.childNodes[i]; + + if (child.nodeType === 1) { // element + if (!walk(child, nodeState)) { + return false; + } + + } else if (child.nodeType === 3) { // text + if(!nodeState.nodeStart && nodeState.pos + child.data.length > nodeState.node.posOpen) { + // We found the start position + nodeState.nodeStart = child; + nodeState.nodeStartPos = nodeState.node.posOpen - nodeState.pos; + } + if(nodeState.nodeStart && nodeState.pos + child.data.length >= nodeState.node.posClose) { + // We found the end position + nodeState.nodeEnd = child; + nodeState.nodeEndPos = nodeState.node.posClose - nodeState.pos; + } + + nodeState.pos += child.data.length; + } + + if (nodeState.nodeStart && nodeState.nodeEnd) { + // Select the range and wrap it with the clone + var range = document.createRange(); + range.setStart(nodeState.nodeStart, nodeState.nodeStartPos); + range.setEnd(nodeState.nodeEnd, nodeState.nodeEndPos); + nodeState.node.clone.appendChild(range.extractContents()); + range.insertNode(nodeState.node.clone); + range.detach(); + + // Process is over + return false; + } + } + return true; + }; + + // For each tag, we walk the DOM to reinsert it + env.keepMarkup.forEach(function (node) { + walk(env.element, { + node: node, + pos: 0 + }); + }); + // Store new highlightedCode for later hooks calls + env.highlightedCode = env.element.innerHTML; + } + }); +}()); diff --git a/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.min.js b/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.min.js new file mode 100644 index 0000000..7f54d27 --- /dev/null +++ b/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.min.js @@ -0,0 +1 @@ +!function(){"undefined"!=typeof self&&self.Prism&&self.document&&document.createRange&&(Prism.plugins.KeepMarkup=!0,Prism.hooks.add("before-highlight",function(e){if(e.element.children.length){var n=0,o=[],t=function(e,d){var r={};d||(r.clone=e.cloneNode(!1),r.posOpen=n,o.push(r));for(var a=0,s=e.childNodes.length;s>a;a++){var l=e.childNodes[a];1===l.nodeType?t(l):3===l.nodeType&&(n+=l.data.length)}d||(r.posClose=n)};t(e.element,!0),o&&o.length&&(e.keepMarkup=o)}}),Prism.hooks.add("after-highlight",function(e){if(e.keepMarkup&&e.keepMarkup.length){var n=function(e,o){for(var t=0,d=e.childNodes.length;d>t;t++){var r=e.childNodes[t];if(1===r.nodeType){if(!n(r,o))return!1}else 3===r.nodeType&&(!o.nodeStart&&o.pos+r.data.length>o.node.posOpen&&(o.nodeStart=r,o.nodeStartPos=o.node.posOpen-o.pos),o.nodeStart&&o.pos+r.data.length>=o.node.posClose&&(o.nodeEnd=r,o.nodeEndPos=o.node.posClose-o.pos),o.pos+=r.data.length);if(o.nodeStart&&o.nodeEnd){var a=document.createRange();return a.setStart(o.nodeStart,o.nodeStartPos),a.setEnd(o.nodeEnd,o.nodeEndPos),o.node.clone.appendChild(a.extractContents()),a.insertNode(o.node.clone),a.detach(),!1}}return!0};e.keepMarkup.forEach(function(o){n(e.element,{node:o,pos:0})}),e.highlightedCode=e.element.innerHTML}}))}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/line-highlight/index.html b/docs/_style/prism-master/plugins/line-highlight/index.html new file mode 100644 index 0000000..f3b58b4 --- /dev/null +++ b/docs/_style/prism-master/plugins/line-highlight/index.html @@ -0,0 +1,88 @@ + + + + + + +Line highlight â–² Prism plugins + + + + + + + + + + + +
        +
        + +

        Line highlight

        +

        Highlights specific lines and/or line ranges.

        +
        + +
        +

        How to use

        + +

        Obviously, this only works on code blocks (<pre><code>) and not for inline code. + +

        You specify the lines to be highlighted through the data-line attribute on the <pre> element, in the following simple format:

        +
          +
        • A single number refers to the line with that number
        • +
        • Ranges are denoted by two numbers, separated with a hyphen (-)
        • +
        • Multiple line numbers or ranges are separated by commas.
        • +
        • Whitespace is allowed anywhere and will be stripped off.
        • +
        + +

        Examples:

        +
        +
        5
        +
        The 5th line
        + +
        1-5
        +
        Lines 1 through 5
        + +
        1,4
        +
        Line 1 and line 4
        + +
        1-2, 5, 9-20
        +
        Lines 1 through 2, line 5, lines 9 through 20
        +
        + +

        In case you want the line numbering to be offset by a certain number (for example, you want the 1st line to be number 41 instead of 1, which is an offset of 40), you can additionally use the data-line-offset attribute. + +

        You can also link to specific lines on any code snippet, by using the following as a url hash: #{element-id}.{lines} where + {element-id} is the id of the <pre> element and {lines} is one or more lines or line ranges that follow the format + outlined above. For example, if there is an element with id="play" on the page, you can link to lines 5-6 by linking to #play.5-6

        +
        + +
        +

        Examples

        + +

        Line 2

        +
        
        +	
        +	

        Lines 15-25

        +
        
        +	
        +	

        Line 1 and lines 3-4 and line 42

        +
        
        +	
        +	

        Line 43, starting from line 41

        +
        
        +	
        +	

        Linking example

        +
        + +
        + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.css b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.css new file mode 100644 index 0000000..6058db4 --- /dev/null +++ b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.css @@ -0,0 +1,49 @@ +pre[data-line] { + position: relative; + padding: 1em 0 1em 3em; +} + +.line-highlight { + position: absolute; + left: 0; + right: 0; + padding: inherit 0; + margin-top: 1em; /* Same as .prism’s padding-top */ + + background: hsla(24, 20%, 50%,.08); + background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0)); + + pointer-events: none; + + line-height: inherit; + white-space: pre; +} + + .line-highlight:before, + .line-highlight[data-end]:after { + content: attr(data-start); + position: absolute; + top: .4em; + left: .6em; + min-width: 1em; + padding: 0 .5em; + background-color: hsla(24, 20%, 50%,.4); + color: hsl(24, 20%, 95%); + font: bold 65%/1.5 sans-serif; + text-align: center; + vertical-align: .3em; + border-radius: 999px; + text-shadow: none; + box-shadow: 0 1px white; + } + + .line-highlight[data-end]:after { + content: attr(data-end); + top: auto; + bottom: .4em; + } + +.line-numbers .line-highlight:before, +.line-numbers .line-highlight:after { + content: none; +} diff --git a/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.js b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.js new file mode 100644 index 0000000..5d919ae --- /dev/null +++ b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.js @@ -0,0 +1,181 @@ +(function(){ + +if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) { + return; +} + +function $$(expr, con) { + return Array.prototype.slice.call((con || document).querySelectorAll(expr)); +} + +function hasClass(element, className) { + className = " " + className + " "; + return (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(className) > -1 +} + +// Some browsers round the line-height, others don't. +// We need to test for it to position the elements properly. +var isLineHeightRounded = (function() { + var res; + return function() { + if(typeof res === 'undefined') { + var d = document.createElement('div'); + d.style.fontSize = '13px'; + d.style.lineHeight = '1.5'; + d.style.padding = 0; + d.style.border = 0; + d.innerHTML = ' 
         '; + document.body.appendChild(d); + // Browsers that round the line-height should have offsetHeight === 38 + // The others should have 39. + res = d.offsetHeight === 38; + document.body.removeChild(d); + } + return res; + } +}()); + +function highlightLines(pre, lines, classes) { + lines = typeof lines === 'string' ? lines : pre.getAttribute('data-line'); + + var ranges = lines.replace(/\s+/g, '').split(','), + offset = +pre.getAttribute('data-line-offset') || 0; + + var parseMethod = isLineHeightRounded() ? parseInt : parseFloat; + var lineHeight = parseMethod(getComputedStyle(pre).lineHeight); + var hasLineNumbers = hasClass(pre, 'line-numbers'); + + for (var i=0, currentRange; currentRange = ranges[i++];) { + var range = currentRange.split('-'); + + var start = +range[0], + end = +range[1] || start; + + var line = pre.querySelector('.line-highlight[data-range="' + currentRange + '"]') || document.createElement('div'); + + line.setAttribute('aria-hidden', 'true'); + line.setAttribute('data-range', currentRange); + line.className = (classes || '') + ' line-highlight'; + + //if the line-numbers plugin is enabled, then there is no reason for this plugin to display the line numbers + if(hasLineNumbers && Prism.plugins.lineNumbers) { + var startNode = Prism.plugins.lineNumbers.getLine(pre, start); + var endNode = Prism.plugins.lineNumbers.getLine(pre, end); + + if (startNode) { + line.style.top = startNode.offsetTop + 'px'; + } + + if (endNode) { + line.style.height = (endNode.offsetTop - startNode.offsetTop) + endNode.offsetHeight + 'px'; + } + } else { + line.setAttribute('data-start', start); + + if(end > start) { + line.setAttribute('data-end', end); + } + + line.style.top = (start - offset - 1) * lineHeight + 'px'; + + line.textContent = new Array(end - start + 2).join(' \n'); + } + + //allow this to play nicely with the line-numbers plugin + if(hasLineNumbers) { + //need to attack to pre as when line-numbers is enabled, the code tag is relatively which screws up the positioning + pre.appendChild(line); + } else { + (pre.querySelector('code') || pre).appendChild(line); + } + } +} + +function applyHash() { + var hash = location.hash.slice(1); + + // Remove pre-existing temporary lines + $$('.temporary.line-highlight').forEach(function (line) { + line.parentNode.removeChild(line); + }); + + var range = (hash.match(/\.([\d,-]+)$/) || [,''])[1]; + + if (!range || document.getElementById(hash)) { + return; + } + + var id = hash.slice(0, hash.lastIndexOf('.')), + pre = document.getElementById(id); + + if (!pre) { + return; + } + + if (!pre.hasAttribute('data-line')) { + pre.setAttribute('data-line', ''); + } + + highlightLines(pre, range, 'temporary '); + + document.querySelector('.temporary.line-highlight').scrollIntoView(); +} + +var fakeTimer = 0; // Hack to limit the number of times applyHash() runs + +Prism.hooks.add('before-sanity-check', function(env) { + var pre = env.element.parentNode; + var lines = pre && pre.getAttribute('data-line'); + + if (!pre || !lines || !/pre/i.test(pre.nodeName)) { + return; + } + + /* + * Cleanup for other plugins (e.g. autoloader). + * + * Sometimes blocks are highlighted multiple times. It is necessary + * to cleanup any left-over tags, because the whitespace inside of the
        + * tags change the content of the tag. + */ + var num = 0; + $$('.line-highlight', pre).forEach(function (line) { + num += line.textContent.length; + line.parentNode.removeChild(line); + }); + // Remove extra whitespace + if (num && /^( \n)+$/.test(env.code.slice(-num))) { + env.code = env.code.slice(0, -num); + } +}); + +Prism.hooks.add('complete', function completeHook(env) { + var pre = env.element.parentNode; + var lines = pre && pre.getAttribute('data-line'); + + if (!pre || !lines || !/pre/i.test(pre.nodeName)) { + return; + } + + clearTimeout(fakeTimer); + + var hasLineNumbers = Prism.plugins.lineNumbers; + var isLineNumbersLoaded = env.plugins && env.plugins.lineNumbers; + + if (hasClass(pre, 'line-numbers') && hasLineNumbers && !isLineNumbersLoaded) { + Prism.hooks.add('line-numbers', completeHook); + } else { + highlightLines(pre, lines); + fakeTimer = setTimeout(applyHash, 1); + } +}); + + window.addEventListener('hashchange', applyHash); + window.addEventListener('resize', function () { + var preElements = document.querySelectorAll('pre[data-line]'); + Array.prototype.forEach.call(preElements, function (pre) { + highlightLines(pre); + }); + }); + +})(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.min.js b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.min.js new file mode 100644 index 0000000..6c87091 --- /dev/null +++ b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.min.js @@ -0,0 +1 @@ +!function(){function e(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function t(e,t){return t=" "+t+" ",(" "+e.className+" ").replace(/[\n\t]/g," ").indexOf(t)>-1}function n(e,n,i){n="string"==typeof n?n:e.getAttribute("data-line");for(var o,l=n.replace(/\s+/g,"").split(","),a=+e.getAttribute("data-line-offset")||0,s=r()?parseInt:parseFloat,d=s(getComputedStyle(e).lineHeight),u=t(e,"line-numbers"),c=0;o=l[c++];){var p=o.split("-"),m=+p[0],f=+p[1]||m,h=e.querySelector('.line-highlight[data-range="'+o+'"]')||document.createElement("div");if(h.setAttribute("aria-hidden","true"),h.setAttribute("data-range",o),h.className=(i||"")+" line-highlight",u&&Prism.plugins.lineNumbers){var g=Prism.plugins.lineNumbers.getLine(e,m),y=Prism.plugins.lineNumbers.getLine(e,f);g&&(h.style.top=g.offsetTop+"px"),y&&(h.style.height=y.offsetTop-g.offsetTop+y.offsetHeight+"px")}else h.setAttribute("data-start",m),f>m&&h.setAttribute("data-end",f),h.style.top=(m-a-1)*d+"px",h.textContent=new Array(f-m+2).join(" \n");u?e.appendChild(h):(e.querySelector("code")||e).appendChild(h)}}function i(){var t=location.hash.slice(1);e(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var i=(t.match(/\.([\d,-]+)$/)||[,""])[1];if(i&&!document.getElementById(t)){var r=t.slice(0,t.lastIndexOf(".")),o=document.getElementById(r);o&&(o.hasAttribute("data-line")||o.setAttribute("data-line",""),n(o,i,"temporary "),document.querySelector(".temporary.line-highlight").scrollIntoView())}}if("undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector){var r=function(){var e;return function(){if("undefined"==typeof e){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding=0,t.style.border=0,t.innerHTML=" 
         ",document.body.appendChild(t),e=38===t.offsetHeight,document.body.removeChild(t)}return e}}(),o=0;Prism.hooks.add("before-sanity-check",function(t){var n=t.element.parentNode,i=n&&n.getAttribute("data-line");if(n&&i&&/pre/i.test(n.nodeName)){var r=0;e(".line-highlight",n).forEach(function(e){r+=e.textContent.length,e.parentNode.removeChild(e)}),r&&/^( \n)+$/.test(t.code.slice(-r))&&(t.code=t.code.slice(0,-r))}}),Prism.hooks.add("complete",function l(e){var r=e.element.parentNode,a=r&&r.getAttribute("data-line");if(r&&a&&/pre/i.test(r.nodeName)){clearTimeout(o);var s=Prism.plugins.lineNumbers,d=e.plugins&&e.plugins.lineNumbers;t(r,"line-numbers")&&s&&!d?Prism.hooks.add("line-numbers",l):(n(r,a),o=setTimeout(i,1))}}),window.addEventListener("hashchange",i),window.addEventListener("resize",function(){var e=document.querySelectorAll("pre[data-line]");Array.prototype.forEach.call(e,function(e){n(e)})})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/line-numbers/index.html b/docs/_style/prism-master/plugins/line-numbers/index.html new file mode 100644 index 0000000..5af756c --- /dev/null +++ b/docs/_style/prism-master/plugins/line-numbers/index.html @@ -0,0 +1,69 @@ + + + + + + +Line Numbers â–² Prism plugins + + + + + + + + + + + +
        +
        + +

        Line Numbers

        +

        Line number at the beginning of code lines.

        +
        + +
        +

        How to use

        + +

        Obviously, this is supposed to work only for code blocks (<pre><code>) and not for inline code.

        +

        Add class line-numbers to your desired <pre> and line-numbers plugin will take care.

        +

        Optional: You can specify the data-start (Number) attribute on the <pre> element. It will shift the line counter.

        +

        Optional: To support multiline line numbers using soft wrap add css white-space to pre-line or pre-wrap.

        +
        + +
        +

        Examples

        + +

        JavaScript

        +
        
        +
        +  

        CSS

        +
        
        +
        +  

        HTML

        +

        Please note the data-start="-5" in the code below.

        +
        
        +
        +  

        Unknown languages

        +
        This raw text
        +is not highlighted
        +but it still has
        +lines numbers
        + +

        Soft wrap support

        +
        
        +
        +
        + +
        + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.css b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.css new file mode 100644 index 0000000..08b29ed --- /dev/null +++ b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.css @@ -0,0 +1,41 @@ +pre[class*="language-"].line-numbers { + position: relative; + padding-left: 3.8em; + counter-reset: linenumber; +} + +pre[class*="language-"].line-numbers > code { + position: relative; + white-space: inherit; +} + +.line-numbers .line-numbers-rows { + position: absolute; + pointer-events: none; + top: 0; + font-size: 100%; + left: -3.8em; + width: 3em; /* works for line-numbers below 1000 lines */ + letter-spacing: -1px; + border-right: 1px solid #999; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + +} + + .line-numbers-rows > span { + pointer-events: none; + display: block; + counter-increment: linenumber; + } + + .line-numbers-rows > span:before { + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; + } diff --git a/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.js b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.js new file mode 100644 index 0000000..e9e684f --- /dev/null +++ b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.js @@ -0,0 +1,159 @@ +(function () { + + if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; + } + + /** + * Plugin name which is used as a class name for
         which is activating the plugin
        +	 * @type {String}
        +	 */
        +	var PLUGIN_NAME = 'line-numbers';
        +	
        +	/**
        +	 * Regular expression used for determining line breaks
        +	 * @type {RegExp}
        +	 */
        +	var NEW_LINE_EXP = /\n(?!$)/g;
        +
        +	/**
        +	 * Resizes line numbers spans according to height of line of code
        +	 * @param {Element} element 
         element
        +	 */
        +	var _resizeElement = function (element) {
        +		var codeStyles = getStyles(element);
        +		var whiteSpace = codeStyles['white-space'];
        +
        +		if (whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line') {
        +			var codeElement = element.querySelector('code');
        +			var lineNumbersWrapper = element.querySelector('.line-numbers-rows');
        +			var lineNumberSizer = element.querySelector('.line-numbers-sizer');
        +			var codeLines = codeElement.textContent.split(NEW_LINE_EXP);
        +
        +			if (!lineNumberSizer) {
        +				lineNumberSizer = document.createElement('span');
        +				lineNumberSizer.className = 'line-numbers-sizer';
        +
        +				codeElement.appendChild(lineNumberSizer);
        +			}
        +
        +			lineNumberSizer.style.display = 'block';
        +
        +			codeLines.forEach(function (line, lineNumber) {
        +				lineNumberSizer.textContent = line || '\n';
        +				var lineSize = lineNumberSizer.getBoundingClientRect().height;
        +				lineNumbersWrapper.children[lineNumber].style.height = lineSize + 'px';
        +			});
        +
        +			lineNumberSizer.textContent = '';
        +			lineNumberSizer.style.display = 'none';
        +		}
        +	};
        +
        +	/**
        +	 * Returns style declarations for the element
        +	 * @param {Element} element
        +	 */
        +	var getStyles = function (element) {
        +		if (!element) {
        +			return null;
        +		}
        +
        +		return window.getComputedStyle ? getComputedStyle(element) : (element.currentStyle || null);
        +	};
        +
        +	window.addEventListener('resize', function () {
        +		Array.prototype.forEach.call(document.querySelectorAll('pre.' + PLUGIN_NAME), _resizeElement);
        +	});
        +
        +	Prism.hooks.add('complete', function (env) {
        +		if (!env.code) {
        +			return;
        +		}
        +
        +		// works only for  wrapped inside 
         (not inline)
        +		var pre = env.element.parentNode;
        +		var clsReg = /\s*\bline-numbers\b\s*/;
        +		if (
        +			!pre || !/pre/i.test(pre.nodeName) ||
        +			// Abort only if nor the 
         nor the  have the class
        +			(!clsReg.test(pre.className) && !clsReg.test(env.element.className))
        +		) {
        +			return;
        +		}
        +
        +		if (env.element.querySelector('.line-numbers-rows')) {
        +			// Abort if line numbers already exists
        +			return;
        +		}
        +
        +		if (clsReg.test(env.element.className)) {
        +			// Remove the class 'line-numbers' from the 
        +			env.element.className = env.element.className.replace(clsReg, ' ');
        +		}
        +		if (!clsReg.test(pre.className)) {
        +			// Add the class 'line-numbers' to the 
        +			pre.className += ' line-numbers';
        +		}
        +
        +		var match = env.code.match(NEW_LINE_EXP);
        +		var linesNum = match ? match.length + 1 : 1;
        +		var lineNumbersWrapper;
        +
        +		var lines = new Array(linesNum + 1);
        +		lines = lines.join('');
        +
        +		lineNumbersWrapper = document.createElement('span');
        +		lineNumbersWrapper.setAttribute('aria-hidden', 'true');
        +		lineNumbersWrapper.className = 'line-numbers-rows';
        +		lineNumbersWrapper.innerHTML = lines;
        +
        +		if (pre.hasAttribute('data-start')) {
        +			pre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1);
        +		}
        +
        +		env.element.appendChild(lineNumbersWrapper);
        +
        +		_resizeElement(pre);
        +
        +		Prism.hooks.run('line-numbers', env);
        +	});
        +
        +	Prism.hooks.add('line-numbers', function (env) {
        +		env.plugins = env.plugins || {};
        +		env.plugins.lineNumbers = true;
        +	});
        +	
        +	/**
        +	 * Global exports
        +	 */
        +	Prism.plugins.lineNumbers = {
        +		/**
        +		 * Get node for provided line number
        +		 * @param {Element} element pre element
        +		 * @param {Number} number line number
        +		 * @return {Element|undefined}
        +		 */
        +		getLine: function (element, number) {
        +			if (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {
        +				return;
        +			}
        +
        +			var lineNumberRows = element.querySelector('.line-numbers-rows');
        +			var lineNumberStart = parseInt(element.getAttribute('data-start'), 10) || 1;
        +			var lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);
        +
        +			if (number < lineNumberStart) {
        +				number = lineNumberStart;
        +			}
        +			if (number > lineNumberEnd) {
        +				number = lineNumberEnd;
        +			}
        +
        +			var lineIndex = number - lineNumberStart;
        +
        +			return lineNumberRows.children[lineIndex];
        +		}
        +	};
        +
        +}());
        \ No newline at end of file
        diff --git a/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.min.js b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.min.js
        new file mode 100644
        index 0000000..5291216
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.min.js
        @@ -0,0 +1 @@
        +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e="line-numbers",t=/\n(?!$)/g,n=function(e){var n=r(e),s=n["white-space"];if("pre-wrap"===s||"pre-line"===s){var l=e.querySelector("code"),i=e.querySelector(".line-numbers-rows"),a=e.querySelector(".line-numbers-sizer"),o=l.textContent.split(t);a||(a=document.createElement("span"),a.className="line-numbers-sizer",l.appendChild(a)),a.style.display="block",o.forEach(function(e,t){a.textContent=e||"\n";var n=a.getBoundingClientRect().height;i.children[t].style.height=n+"px"}),a.textContent="",a.style.display="none"}},r=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null};window.addEventListener("resize",function(){Array.prototype.forEach.call(document.querySelectorAll("pre."+e),n)}),Prism.hooks.add("complete",function(e){if(e.code){var r=e.element.parentNode,s=/\s*\bline-numbers\b\s*/;if(r&&/pre/i.test(r.nodeName)&&(s.test(r.className)||s.test(e.element.className))&&!e.element.querySelector(".line-numbers-rows")){s.test(e.element.className)&&(e.element.className=e.element.className.replace(s," ")),s.test(r.className)||(r.className+=" line-numbers");var l,i=e.code.match(t),a=i?i.length+1:1,o=new Array(a+1);o=o.join(""),l=document.createElement("span"),l.setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=o,r.hasAttribute("data-start")&&(r.style.counterReset="linenumber "+(parseInt(r.getAttribute("data-start"),10)-1)),e.element.appendChild(l),n(r),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}),Prism.plugins.lineNumbers={getLine:function(t,n){if("PRE"===t.tagName&&t.classList.contains(e)){var r=t.querySelector(".line-numbers-rows"),s=parseInt(t.getAttribute("data-start"),10)||1,l=s+(r.children.length-1);s>n&&(n=s),n>l&&(n=l);var i=n-s;return r.children[i]}}}}}();
        \ No newline at end of file
        diff --git a/docs/_style/prism-master/plugins/normalize-whitespace/demo.html b/docs/_style/prism-master/plugins/normalize-whitespace/demo.html
        new file mode 100644
        index 0000000..a6bcf22
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/normalize-whitespace/demo.html
        @@ -0,0 +1,33 @@
        +
        +
        + +
        +
        +	
        +
        +
        +		var example = {
        +			foo: true,
        +
        +			bar: false
        +		};
        +
        +
        +	
        +
        +
        + +
        + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/normalize-whitespace/index.html b/docs/_style/prism-master/plugins/normalize-whitespace/index.html new file mode 100644 index 0000000..e1469de --- /dev/null +++ b/docs/_style/prism-master/plugins/normalize-whitespace/index.html @@ -0,0 +1,180 @@ + + + + + + + Normalize Whitespace â–² Prism plugins + + + + + + + + + + + + +
        +
        + +

        Normalize Whitespace

        +

        Supports multiple operations to normalize whitespace in code blocks.

        +
        + +
        +

        How to use

        + +

        Obviously, this is supposed to work only for code blocks (<pre><code>) and not for inline code.

        +

        By default the plugin trims all leading and trailing whitespace of every code block. + It also removes extra indents and trailing whitespace on every line.

        + +

        The plugin can be disabled for a particular code block by adding the class no-whitespace-normalization to + either the <pre> or <code> tag.

        + +

        The default settings can be overridden with the setDefaults() method + like so:

        + +
        
        +Prism.plugins.NormalizeWhitespace.setDefaults({
        +	'remove-trailing': true,
        +	'remove-indent': true,
        +	'left-trim': true,
        +	'right-trim': true,
        +	/*'break-lines': 80,
        +	'indent': 2,
        +	'remove-initial-line-feed': false,
        +	'tabs-to-spaces': 4,
        +	'spaces-to-tabs': 4*/
        +});
        +
        + +

        The following settings are available:

        + +
        +
        remove-trailing
        +
        Removes trailing whitespace on all lines.
        +
        remove-indent
        +
        If the whole code block is indented too much it removes the extra indent.
        +
        left-trim
        +
        Removes all whitespace from the top of the code block.
        +
        right-trim
        +
        Removes all whitespace from the bottom of the code block.
        +
        break-lines
        +
        Simple way of breaking long lines at a certain length (default is 80 characters).
        +
        indent
        +
        Adds a certain number of tabs to every line.
        +
        remove-initial-line-feed
        +
        Less aggressive version of left-trim. + It only removes a single line feed from the top of the code block.
        +
        tabs-to-spaces
        +
        Converts all tabs to a certain number of spaces (default is 4 spaces).
        +
        spaces-to-tabs
        +
        Converts a certain number of spaces to a tab (default is 4 spaces).
        +
        +
        + +
        +

        Examples

        + +

        The following example demonstrates the use of this plugin:

        + +
        
        +
        +	

        The result looks like this:

        + +
        +
        +	
        +
        +
        +		var example = {
        +			foo: true,
        +
        +			bar: false
        +		};
        +
        +
        +	
        +
        +
        + +

        It is also compatible with the keep-markup plugin:

        + +
        +
        +	
        +
        +
        +	@media screen {
        +		div {
        +			text-decoration: underline;
        +			background: url('foo.png');
        +		}
        +	}
        +
        +
        +
        + +

        This plugin can also be used on the server or on the command line with Node.js:

        + +
        
        +var Prism = require('prismjs');
        +var Normalizer = require('prismjs/plugins/normalize-whitespace/prism-normalize-whitespace');
        +// Create a new Normalizer object
        +var nw = new Normalizer({
        +	'remove-trailing': true,
        +	'remove-indent': true,
        +	'left-trim': true,
        +	'right-trim': true,
        +	/*'break-lines': 80,
        +	'indent': 2,
        +	'remove-initial-line-feed': false,
        +	'tabs-to-spaces': 4,
        +	'spaces-to-tabs': 4*/
        +});
        +
        +// ..or use the default object from Prism
        +nw = Prism.plugins.NormalizeWhitespace;
        +
        +// The code snippet you want to highlight, as a string
        +var code = "\t\t\tvar data = 1;    ";
        +
        +// Removes leading and trailing whitespace
        +// and then indents by 1 tab
        +code = nw.normalize(code, {
        +	// Extra settings
        +	indent: 1
        +});
        +
        +// Returns a highlighted HTML string
        +var html = Prism.highlight(code, Prism.languages.javascript);
        +	
        + + +
        + +
        + + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.js b/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.js new file mode 100644 index 0000000..b6c6472 --- /dev/null +++ b/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.js @@ -0,0 +1,190 @@ +(function() { + +var assign = Object.assign || function (obj1, obj2) { + for (var name in obj2) { + if (obj2.hasOwnProperty(name)) + obj1[name] = obj2[name]; + } + return obj1; +} + +function NormalizeWhitespace(defaults) { + this.defaults = assign({}, defaults); +} + +function toCamelCase(value) { + return value.replace(/-(\w)/g, function(match, firstChar) { + return firstChar.toUpperCase(); + }); +} + +function tabLen(str) { + var res = 0; + for (var i = 0; i < str.length; ++i) { + if (str.charCodeAt(i) == '\t'.charCodeAt(0)) + res += 3; + } + return str.length + res; +} + +NormalizeWhitespace.prototype = { + setDefaults: function (defaults) { + this.defaults = assign(this.defaults, defaults); + }, + normalize: function (input, settings) { + settings = assign(this.defaults, settings); + + for (var name in settings) { + var methodName = toCamelCase(name); + if (name !== "normalize" && methodName !== 'setDefaults' && + settings[name] && this[methodName]) { + input = this[methodName].call(this, input, settings[name]); + } + } + + return input; + }, + + /* + * Normalization methods + */ + leftTrim: function (input) { + return input.replace(/^\s+/, ''); + }, + rightTrim: function (input) { + return input.replace(/\s+$/, ''); + }, + tabsToSpaces: function (input, spaces) { + spaces = spaces|0 || 4; + return input.replace(/\t/g, new Array(++spaces).join(' ')); + }, + spacesToTabs: function (input, spaces) { + spaces = spaces|0 || 4; + return input.replace(RegExp(' {' + spaces + '}', 'g'), '\t'); + }, + removeTrailing: function (input) { + return input.replace(/\s*?$/gm, ''); + }, + // Support for deprecated plugin remove-initial-line-feed + removeInitialLineFeed: function (input) { + return input.replace(/^(?:\r?\n|\r)/, ''); + }, + removeIndent: function (input) { + var indents = input.match(/^[^\S\n\r]*(?=\S)/gm); + + if (!indents || !indents[0].length) + return input; + + indents.sort(function(a, b){return a.length - b.length; }); + + if (!indents[0].length) + return input; + + return input.replace(RegExp('^' + indents[0], 'gm'), ''); + }, + indent: function (input, tabs) { + return input.replace(/^[^\S\n\r]*(?=\S)/gm, new Array(++tabs).join('\t') + '$&'); + }, + breakLines: function (input, characters) { + characters = (characters === true) ? 80 : characters|0 || 80; + + var lines = input.split('\n'); + for (var i = 0; i < lines.length; ++i) { + if (tabLen(lines[i]) <= characters) + continue; + + var line = lines[i].split(/(\s+)/g), + len = 0; + + for (var j = 0; j < line.length; ++j) { + var tl = tabLen(line[j]); + len += tl; + if (len > characters) { + line[j] = '\n' + line[j]; + len = tl; + } + } + lines[i] = line.join(''); + } + return lines.join('\n'); + } +}; + +// Support node modules +if (typeof module !== 'undefined' && module.exports) { + module.exports = NormalizeWhitespace; +} + +// Exit if prism is not loaded +if (typeof Prism === 'undefined') { + return; +} + +Prism.plugins.NormalizeWhitespace = new NormalizeWhitespace({ + 'remove-trailing': true, + 'remove-indent': true, + 'left-trim': true, + 'right-trim': true, + /*'break-lines': 80, + 'indent': 2, + 'remove-initial-line-feed': false, + 'tabs-to-spaces': 4, + 'spaces-to-tabs': 4*/ +}); + +Prism.hooks.add('before-sanity-check', function (env) { + var Normalizer = Prism.plugins.NormalizeWhitespace; + + // Check settings + if (env.settings && env.settings['whitespace-normalization'] === false) { + return; + } + + // Simple mode if there is no env.element + if ((!env.element || !env.element.parentNode) && env.code) { + env.code = Normalizer.normalize(env.code, env.settings); + return; + } + + // Normal mode + var pre = env.element.parentNode; + var clsReg = /\bno-whitespace-normalization\b/; + if (!env.code || !pre || pre.nodeName.toLowerCase() !== 'pre' || + clsReg.test(pre.className) || clsReg.test(env.element.className)) + return; + + var children = pre.childNodes, + before = '', + after = '', + codeFound = false; + + // Move surrounding whitespace from the
         tag into the  tag
        +	for (var i = 0; i < children.length; ++i) {
        +		var node = children[i];
        +
        +		if (node == env.element) {
        +			codeFound = true;
        +		} else if (node.nodeName === "#text") {
        +			if (codeFound) {
        +				after += node.nodeValue;
        +			} else {
        +				before += node.nodeValue;
        +			}
        +
        +			pre.removeChild(node);
        +			--i;
        +		}
        +	}
        +
        +	if (!env.element.children.length || !Prism.plugins.KeepMarkup) {
        +		env.code = before + env.code + after;
        +		env.code = Normalizer.normalize(env.code, env.settings);
        +	} else {
        +		// Preserve markup for keep-markup plugin
        +		var html = before + env.element.innerHTML + after;
        +		env.element.innerHTML = Normalizer.normalize(html, env.settings);
        +		env.code = env.element.textContent;
        +	}
        +});
        +
        +}());
        diff --git a/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.min.js b/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.min.js
        new file mode 100644
        index 0000000..39fa579
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.min.js
        @@ -0,0 +1 @@
        +!function(){function e(e){this.defaults=r({},e)}function n(e){return e.replace(/-(\w)/g,function(e,n){return n.toUpperCase()})}function t(e){for(var n=0,t=0;tn&&(o[s]="\n"+o[s],a=l)}r[i]=o.join("")}return r.join("\n")}},"undefined"!=typeof module&&module.exports&&(module.exports=e),"undefined"!=typeof Prism&&(Prism.plugins.NormalizeWhitespace=new e({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),Prism.hooks.add("before-sanity-check",function(e){var n=Prism.plugins.NormalizeWhitespace;if(!e.settings||e.settings["whitespace-normalization"]!==!1){if((!e.element||!e.element.parentNode)&&e.code)return e.code=n.normalize(e.code,e.settings),void 0;var t=e.element.parentNode,r=/\bno-whitespace-normalization\b/;if(e.code&&t&&"pre"===t.nodeName.toLowerCase()&&!r.test(t.className)&&!r.test(e.element.className)){for(var i=t.childNodes,o="",a="",s=!1,l=0;l
        +
        +
        +
        +	
        +	
        +	Previewers â–² Prism plugins
        +	
        +	
        +	
        +	
        +	
        +
        +	
        +	
        +
        +
        +
        +
        +
        + +

        Previewers

        +

        Previewers for angles, colors, gradients, easing and time.

        +
        + +
        +

        How to use

        + +

        You don't need to do anything. With this plugin loaded, a previewer will appear on hovering some values in code blocks. + The following previewers are supported:

        +
          +
        • angle for angles
        • +
        • color for colors
        • +
        • gradient for gradients
        • +
        • easing for easing functions
        • +
        • time for durations
        • +
        +

        This plugin is compatible with CSS, Less, Markup attributes, Sass, Scss and Stylus.

        +
        + +
        +

        Examples

        + +

        CSS

        +
        .example-gradient {
        +	background: -webkit-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* Chrome10+, Safari5.1+ */
        +	background:    -moz-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* FF3.6+ */
        +	background:     -ms-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* IE10+ */
        +	background:      -o-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* Opera 11.10+ */
        +	background:         linear-gradient(to right, #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* W3C */
        +}
        +.example-angle {
        +	transform: rotate(10deg);
        +}
        +.example-color {
        +	color: rgba(255, 0, 0, 0.2);
        +	background: purple;
        +	border: 1px solid hsl(100, 70%, 40%);
        +}
        +.example-easing {
        +	transition-timing-function: linear;
        +}
        +.example-time {
        +	transition-duration: 3s;
        +}
        + +

        Markup attributes

        +
        <table bgcolor="#6E5494">
        +<tr style="background: lightblue;">
        + +

        Less

        +
        @gradient: linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%);
        +.example-gradient {
        +	background: -webkit-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* Chrome10+, Safari5.1+ */
        +	background:    -moz-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* FF3.6+ */
        +	background:     -ms-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* IE10+ */
        +	background:      -o-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* Opera 11.10+ */
        +	background:         linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* W3C */
        +}
        +@angle: 3rad;
        +.example-angle {
        +	transform: rotate(.4turn)
        +}
        +@nice-blue: #5B83AD;
        +.example-color {
        +	color: hsla(102, 53%, 42%, 0.4);
        +}
        +@easing: cubic-bezier(0.1, 0.3, 1, .4);
        +.example-easing {
        +	transition-timing-function: ease;
        +}
        +@time: 1s;
        +.example-time {
        +	transition-duration: 2s;
        +}
        + +

        Sass

        +
        $gradient: linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%)
        +@mixin example-gradient
        +	background: -moz-radial-gradient(center, ellipse cover, #f2f6f8 0%, #d8e1e7 50%, #b5c6d0 51%, #e0eff9 100%)
        +	background: radial-gradient(ellipse at center, #f2f6f8 0%, #d8e1e7 50%, #b5c6d0 51%, #e0eff9 100%)
        +$angle: 380grad
        +@mixin example-angle
        +	transform: rotate(-120deg)
        +.example-angle
        +	transform: rotate(18rad)
        +$color: blue
        +@mixin example-color
        +	color: rgba(147, 32, 34, 0.8)
        +.example-color
        +	color: pink
        +$easing: ease-out
        +.example-easing
        +	transition-timing-function: ease-in-out
        +$time: 3s
        +@mixin example-time
        +	transition-duration: 800ms
        +.example-time
        +	transition-duration: 0.8s
        +
        + +

        Scss

        +
        $gradient: linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%);
        +$attr: background;
        +.example-gradient {
        +	#{$attr}-image: repeating-linear-gradient(10deg, rgba(255, 0, 0, 0), rgba(255, 0, 0, 1) 10px, rgba(255, 0, 0, 0) 20px);
        +}
        +$angle: 1.8turn;
        +.example-angle {
        +	transform: rotate(-3rad)
        +}
        +$color: blue;
        +.example-color {
        +	#{$attr}-color: rgba(255, 255, 0, 0.75);
        +}
        +$easing: linear;
        +.example-easing {
        +	transition-timing-function: cubic-bezier(0.9, 0.1, .2, .4);
        +}
        +$time: 1s;
        +.example-time {
        +	transition-duration: 10s
        +}
        + +

        Stylus

        +
        gradient = linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%)
        +.example-gradient
        +	background-image: repeating-radial-gradient(circle, rgba(255, 0, 0, 0), rgba(255, 0, 0, 1) 10px, rgba(255, 0, 0, 0) 20px)
        +angle = 357deg
        +.example-angle
        +	transform: rotate(100grad)
        +color = olive
        +.example-color
        +	color: #000
        +easing = ease-in
        +.example-easing
        +	transition-timing-function: ease-out
        +time = 3s
        +.example-time
        +	transition-duration: 0.5s
        +
        + +
        +

        Disabling a previewer

        +

        All previewers are enabled by default. To enable only a subset of them, a data-previewers attribute + can be added on a code block or any ancestor. Its value should be a space-separated list of previewers + representing the subset.

        +

        For example:

        +
        <pre class="language-css" data-previewers="color time"><code>div {
        +	/* Only the previewer for color and time are enabled */
        +	color: red;
        +	transition-duration: 1s;
        +	/* The previewer for angles is not enabled. */
        +	transform: rotate(10deg);
        +}</code></pre>
        +

        will give the following result:

        +
        div {
        +	/* Only the previewers for color and time are enabled */
        +	color: red;
        +	transition-duration: 1s;
        +	/* The previewer for angles is not enabled. */
        +	transform: rotate(10deg);
        +}
        +
        + +
        +

        API

        +

        This plugins provides a constructor that can be accessed through Prism.plugins.Previewer.

        +

        Once a previewer has been instantiated, an HTML element is appended to the document body. + This element will appear when specific tokens are hovered.

        + +

        new Prism.plugins.Previewer(type, updater, supportedLanguages)

        + +
          +
        • +

          type: the token type this previewer is associated to. + The previewer will be shown when hovering tokens of this type.

          +
        • +
        • +

          updater: the function that will be called each time an associated token is hovered. + This function takes the text content of the token as its only parameter. + The previewer HTML element can be accessed through the keyword this. + This function must return true for the previewer to be shown.

          +
        • +
        • +

          supportedLanguages: an optional array of supported languages. + The previewer will be available only for those. + Defaults to '*', which means every languages.

          +
        • +
        • +

          initializer: an optional function. + This function will be called when the previewer is initialized, + right after the HTML element has been appended to the document body.

          +
        • +
        + +
        + +
        + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/previewers/prism-previewers.css b/docs/_style/prism-master/plugins/previewers/prism-previewers.css new file mode 100644 index 0000000..b36988c --- /dev/null +++ b/docs/_style/prism-master/plugins/previewers/prism-previewers.css @@ -0,0 +1,242 @@ +.prism-previewer, +.prism-previewer:before, +.prism-previewer:after { + position: absolute; + pointer-events: none; +} +.prism-previewer, +.prism-previewer:after { + left: 50%; +} +.prism-previewer { + margin-top: -48px; + width: 32px; + height: 32px; + margin-left: -16px; + + opacity: 0; + -webkit-transition: opacity .25s; + -o-transition: opacity .25s; + transition: opacity .25s; +} +.prism-previewer.flipped { + margin-top: 0; + margin-bottom: -48px; +} +.prism-previewer:before, +.prism-previewer:after { + content: ''; + position: absolute; + pointer-events: none; +} +.prism-previewer:before { + top: -5px; + right: -5px; + left: -5px; + bottom: -5px; + border-radius: 10px; + border: 5px solid #fff; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.5) inset, 0 0 10px rgba(0, 0, 0, 0.75); +} +.prism-previewer:after { + top: 100%; + width: 0; + height: 0; + margin: 5px 0 0 -7px; + border: 7px solid transparent; + border-color: rgba(255, 0, 0, 0); + border-top-color: #fff; +} +.prism-previewer.flipped:after { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 5px; + border-top-color: rgba(255, 0, 0, 0); + border-bottom-color: #fff; +} +.prism-previewer.active { + opacity: 1; +} + +.prism-previewer-angle:before { + border-radius: 50%; + background: #fff; +} +.prism-previewer-angle:after { + margin-top: 4px; +} +.prism-previewer-angle svg { + width: 32px; + height: 32px; + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.prism-previewer-angle[data-negative] svg { + -webkit-transform: scaleX(-1) rotate(-90deg); + -moz-transform: scaleX(-1) rotate(-90deg); + -ms-transform: scaleX(-1) rotate(-90deg); + -o-transform: scaleX(-1) rotate(-90deg); + transform: scaleX(-1) rotate(-90deg); +} +.prism-previewer-angle circle { + fill: transparent; + stroke: hsl(200, 10%, 20%); + stroke-opacity: 0.9; + stroke-width: 32; + stroke-dasharray: 0, 500; +} + +.prism-previewer-gradient { + background-image: linear-gradient(45deg, #bbb 25%, transparent 25%, transparent 75%, #bbb 75%, #bbb), linear-gradient(45deg, #bbb 25%, #eee 25%, #eee 75%, #bbb 75%, #bbb); + background-size: 10px 10px; + background-position: 0 0, 5px 5px; + + width: 64px; + margin-left: -32px; +} +.prism-previewer-gradient:before { + content: none; +} +.prism-previewer-gradient div { + position: absolute; + top: -5px; + left: -5px; + right: -5px; + bottom: -5px; + border-radius: 10px; + border: 5px solid #fff; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.5) inset, 0 0 10px rgba(0, 0, 0, 0.75); +} + +.prism-previewer-color { + background-image: linear-gradient(45deg, #bbb 25%, transparent 25%, transparent 75%, #bbb 75%, #bbb), linear-gradient(45deg, #bbb 25%, #eee 25%, #eee 75%, #bbb 75%, #bbb); + background-size: 10px 10px; + background-position: 0 0, 5px 5px; +} +.prism-previewer-color:before { + background-color: inherit; + background-clip: padding-box; +} + +.prism-previewer-easing { + margin-top: -76px; + margin-left: -30px; + width: 60px; + height: 60px; + background: #333; +} +.prism-previewer-easing.flipped { + margin-bottom: -116px; +} +.prism-previewer-easing svg { + width: 60px; + height: 60px; +} +.prism-previewer-easing circle { + fill: hsl(200, 10%, 20%); + stroke: white; +} +.prism-previewer-easing path { + fill: none; + stroke: white; + stroke-linecap: round; + stroke-width: 4; +} +.prism-previewer-easing line { + stroke: white; + stroke-opacity: 0.5; + stroke-width: 2; +} + +@-webkit-keyframes prism-previewer-time { + 0% { + stroke-dasharray: 0, 500; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 100, 500; + stroke-dashoffset: 0; + } + 100% { + stroke-dasharray: 0, 500; + stroke-dashoffset: -100; + } +} + +@-o-keyframes prism-previewer-time { + 0% { + stroke-dasharray: 0, 500; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 100, 500; + stroke-dashoffset: 0; + } + 100% { + stroke-dasharray: 0, 500; + stroke-dashoffset: -100; + } +} + +@-moz-keyframes prism-previewer-time { + 0% { + stroke-dasharray: 0, 500; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 100, 500; + stroke-dashoffset: 0; + } + 100% { + stroke-dasharray: 0, 500; + stroke-dashoffset: -100; + } +} + +@keyframes prism-previewer-time { + 0% { + stroke-dasharray: 0, 500; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 100, 500; + stroke-dashoffset: 0; + } + 100% { + stroke-dasharray: 0, 500; + stroke-dashoffset: -100; + } +} + +.prism-previewer-time:before { + border-radius: 50%; + background: #fff; +} +.prism-previewer-time:after { + margin-top: 4px; +} +.prism-previewer-time svg { + width: 32px; + height: 32px; + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.prism-previewer-time circle { + fill: transparent; + stroke: hsl(200, 10%, 20%); + stroke-opacity: 0.9; + stroke-width: 32; + stroke-dasharray: 0, 500; + stroke-dashoffset: 0; + -webkit-animation: prism-previewer-time linear infinite 3s; + -moz-animation: prism-previewer-time linear infinite 3s; + -o-animation: prism-previewer-time linear infinite 3s; + animation: prism-previewer-time linear infinite 3s; +} \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/previewers/prism-previewers.js b/docs/_style/prism-master/plugins/previewers/prism-previewers.js new file mode 100644 index 0000000..0f0d2f9 --- /dev/null +++ b/docs/_style/prism-master/plugins/previewers/prism-previewers.js @@ -0,0 +1,708 @@ +(function() { + + if ( + typeof self !== 'undefined' && !self.Prism || + !self.document || !Function.prototype.bind + ) { + return; + } + + var previewers = { + // gradient must be defined before color and angle + 'gradient': { + create: (function () { + + // Stores already processed gradients so that we don't + // make the conversion every time the previewer is shown + var cache = {}; + + /** + * Returns a W3C-valid linear gradient + * @param {string} prefix Vendor prefix if any ("-moz-", "-webkit-", etc.) + * @param {string} func Gradient function name ("linear-gradient") + * @param {string[]} values Array of the gradient function parameters (["0deg", "red 0%", "blue 100%"]) + */ + var convertToW3CLinearGradient = function(prefix, func, values) { + // Default value for angle + var angle = '180deg'; + + if (/^(?:-?\d*\.?\d+(?:deg|rad)|to\b|top|right|bottom|left)/.test(values[0])) { + angle = values.shift(); + if (angle.indexOf('to ') < 0) { + // Angle uses old keywords + // W3C syntax uses "to" + opposite keywords + if (angle.indexOf('top') >= 0) { + if (angle.indexOf('left') >= 0) { + angle = 'to bottom right'; + } else if (angle.indexOf('right') >= 0) { + angle = 'to bottom left'; + } else { + angle = 'to bottom'; + } + } else if (angle.indexOf('bottom') >= 0) { + if (angle.indexOf('left') >= 0) { + angle = 'to top right'; + } else if (angle.indexOf('right') >= 0) { + angle = 'to top left'; + } else { + angle = 'to top'; + } + } else if (angle.indexOf('left') >= 0) { + angle = 'to right'; + } else if (angle.indexOf('right') >= 0) { + angle = 'to left'; + } else if (prefix) { + // Angle is shifted by 90deg in prefixed gradients + if (angle.indexOf('deg') >= 0) { + angle = (90 - parseFloat(angle)) + 'deg'; + } else if (angle.indexOf('rad') >= 0) { + angle = (Math.PI / 2 - parseFloat(angle)) + 'rad'; + } + } + } + } + + return func + '(' + angle + ',' + values.join(',') + ')'; + }; + + /** + * Returns a W3C-valid radial gradient + * @param {string} prefix Vendor prefix if any ("-moz-", "-webkit-", etc.) + * @param {string} func Gradient function name ("linear-gradient") + * @param {string[]} values Array of the gradient function parameters (["0deg", "red 0%", "blue 100%"]) + */ + var convertToW3CRadialGradient = function(prefix, func, values) { + if (values[0].indexOf('at') < 0) { + // Looks like old syntax + + // Default values + var position = 'center'; + var shape = 'ellipse'; + var size = 'farthest-corner'; + + if (/\bcenter|top|right|bottom|left\b|^\d+/.test(values[0])) { + // Found a position + // Remove angle value, if any + position = values.shift().replace(/\s*-?\d+(?:rad|deg)\s*/, ''); + } + if (/\bcircle|ellipse|closest|farthest|contain|cover\b/.test(values[0])) { + // Found a shape and/or size + var shapeSizeParts = values.shift().split(/\s+/); + if (shapeSizeParts[0] && (shapeSizeParts[0] === 'circle' || shapeSizeParts[0] === 'ellipse')) { + shape = shapeSizeParts.shift(); + } + if (shapeSizeParts[0]) { + size = shapeSizeParts.shift(); + } + + // Old keywords are converted to their synonyms + if (size === 'cover') { + size = 'farthest-corner'; + } else if (size === 'contain') { + size = 'clothest-side'; + } + } + + return func + '(' + shape + ' ' + size + ' at ' + position + ',' + values.join(',') + ')'; + } + return func + '(' + values.join(',') + ')'; + }; + + /** + * Converts a gradient to a W3C-valid one + * Does not support old webkit syntax (-webkit-gradient(linear...) and -webkit-gradient(radial...)) + * @param {string} gradient The CSS gradient + */ + var convertToW3CGradient = function(gradient) { + if (cache[gradient]) { + return cache[gradient]; + } + var parts = gradient.match(/^(\b|\B-[a-z]{1,10}-)((?:repeating-)?(?:linear|radial)-gradient)/); + // "", "-moz-", etc. + var prefix = parts && parts[1]; + // "linear-gradient", "radial-gradient", etc. + var func = parts && parts[2]; + + var values = gradient.replace(/^(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\(|\)$/g, '').split(/\s*,\s*/); + + if (func.indexOf('linear') >= 0) { + return cache[gradient] = convertToW3CLinearGradient(prefix, func, values); + } else if (func.indexOf('radial') >= 0) { + return cache[gradient] = convertToW3CRadialGradient(prefix, func, values); + } + return cache[gradient] = func + '(' + values.join(',') + ')'; + }; + + return function () { + new Prism.plugins.Previewer('gradient', function(value) { + this.firstChild.style.backgroundImage = ''; + this.firstChild.style.backgroundImage = convertToW3CGradient(value); + return !!this.firstChild.style.backgroundImage; + }, '*', function () { + this._elt.innerHTML = '
        '; + }); + }; + }()), + tokens: { + 'gradient': { + pattern: /(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:rgb|hsl)a?\(.+?\)|[^\)])+\)/gi, + inside: { + 'function': /[\w-]+(?=\()/, + 'punctuation': /[(),]/ + } + } + }, + languages: { + 'css': true, + 'less': true, + 'sass': [ + { + lang: 'sass', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['variable-line'] + }, + { + lang: 'sass', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['property-line'] + } + ], + 'scss': true, + 'stylus': [ + { + lang: 'stylus', + before: 'func', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside + }, + { + lang: 'stylus', + before: 'func', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside + } + ] + } + }, + 'angle': { + create: function () { + new Prism.plugins.Previewer('angle', function(value) { + var num = parseFloat(value); + var unit = value.match(/[a-z]+$/i); + var max, percentage; + if (!num || !unit) { + return false; + } + unit = unit[0]; + + switch(unit) { + case 'deg': + max = 360; + break; + case 'grad': + max = 400; + break; + case 'rad': + max = 2 * Math.PI; + break; + case 'turn': + max = 1; + } + + percentage = 100 * num/max; + percentage %= 100; + + this[(num < 0? 'set' : 'remove') + 'Attribute']('data-negative', ''); + this.querySelector('circle').style.strokeDasharray = Math.abs(percentage) + ',500'; + return true; + }, '*', function () { + this._elt.innerHTML = '' + + '' + + ''; + }); + }, + tokens: { + 'angle': /(?:\b|\B-|(?=\B\.))\d*\.?\d+(?:deg|g?rad|turn)\b/i + }, + languages: { + 'css': true, + 'less': true, + 'markup': { + lang: 'markup', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value'] + }, + 'sass': [ + { + lang: 'sass', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['property-line'] + }, + { + lang: 'sass', + before: 'operator', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['variable-line'] + } + ], + 'scss': true, + 'stylus': [ + { + lang: 'stylus', + before: 'func', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside + }, + { + lang: 'stylus', + before: 'func', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside + } + ] + } + }, + 'color': { + create: function () { + new Prism.plugins.Previewer('color', function(value) { + this.style.backgroundColor = ''; + this.style.backgroundColor = value; + return !!this.style.backgroundColor; + }); + }, + tokens: { + 'color': { + pattern: /\B#(?:[0-9a-f]{3}){1,2}\b|\b(?:rgb|hsl)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:rgb|hsl)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B|\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGray|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGray|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGray|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gray|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGray|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGray|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGray|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i, + inside: { + 'function': /[\w-]+(?=\()/, + 'punctuation': /[(),]/ + } + } + }, + languages: { + 'css': true, + 'less': true, + 'markup': { + lang: 'markup', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value'] + }, + 'sass': [ + { + lang: 'sass', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['variable-line'] + }, + { + lang: 'sass', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['property-line'] + } + ], + 'scss': true, + 'stylus': [ + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside + }, + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside + } + ] + } + }, + 'easing': { + create: function () { + new Prism.plugins.Previewer('easing', function (value) { + + value = { + 'linear': '0,0,1,1', + 'ease': '.25,.1,.25,1', + 'ease-in': '.42,0,1,1', + 'ease-out': '0,0,.58,1', + 'ease-in-out':'.42,0,.58,1' + }[value] || value; + + var p = value.match(/-?\d*\.?\d+/g); + + if(p.length === 4) { + p = p.map(function(p, i) { return (i % 2? 1 - p : p) * 100; }); + + this.querySelector('path').setAttribute('d', 'M0,100 C' + p[0] + ',' + p[1] + ', ' + p[2] + ',' + p[3] + ', 100,0'); + + var lines = this.querySelectorAll('line'); + lines[0].setAttribute('x2', p[0]); + lines[0].setAttribute('y2', p[1]); + lines[1].setAttribute('x2', p[2]); + lines[1].setAttribute('y2', p[3]); + + return true; + } + + return false; + }, '*', function () { + this._elt.innerHTML = '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + }); + }, + tokens: { + 'easing': { + pattern: /\bcubic-bezier\((?:-?\d*\.?\d+,\s*){3}-?\d*\.?\d+\)\B|\b(?:linear|ease(?:-in)?(?:-out)?)(?=\s|[;}]|$)/i, + inside: { + 'function': /[\w-]+(?=\()/, + 'punctuation': /[(),]/ + } + } + }, + languages: { + 'css': true, + 'less': true, + 'sass': [ + { + lang: 'sass', + inside: 'inside', + before: 'punctuation', + root: Prism.languages.sass && Prism.languages.sass['variable-line'] + }, + { + lang: 'sass', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['property-line'] + } + ], + 'scss': true, + 'stylus': [ + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside + }, + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside + } + ] + } + }, + + 'time': { + create: function () { + new Prism.plugins.Previewer('time', function(value) { + var num = parseFloat(value); + var unit = value.match(/[a-z]+$/i); + if (!num || !unit) { + return false; + } + unit = unit[0]; + this.querySelector('circle').style.animationDuration = 2 * num + unit; + return true; + }, '*', function () { + this._elt.innerHTML = '' + + '' + + ''; + }); + }, + tokens: { + 'time': /(?:\b|\B-|(?=\B\.))\d*\.?\d+m?s\b/i + }, + languages: { + 'css': true, + 'less': true, + 'markup': { + lang: 'markup', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value'] + }, + 'sass': [ + { + lang: 'sass', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['property-line'] + }, + { + lang: 'sass', + before: 'operator', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['variable-line'] + } + ], + 'scss': true, + 'stylus': [ + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside + }, + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside + } + ] + } + } + }; + + /** + * Returns the absolute X, Y offsets for an element + * @param {HTMLElement} element + * @returns {{top: number, right: number, bottom: number, left: number, width: number, height: number}} + */ + var getOffset = function (element) { + var elementBounds = element.getBoundingClientRect(); + var left = elementBounds.left; + var top = elementBounds.top; + var documentBounds = document.documentElement.getBoundingClientRect(); + left -= documentBounds.left; + top -= documentBounds.top; + + return { + top: top, + right: innerWidth - left - elementBounds.width, + bottom: innerHeight - top - elementBounds.height, + left: left, + width: elementBounds.width, + height: elementBounds.height + }; + }; + + var tokenRegexp = /(?:^|\s)token(?=$|\s)/; + var activeRegexp = /(?:^|\s)active(?=$|\s)/g; + var flippedRegexp = /(?:^|\s)flipped(?=$|\s)/g; + + /** + * Previewer constructor + * @param {string} type Unique previewer type + * @param {function} updater Function that will be called on mouseover. + * @param {string[]|string=} supportedLanguages Aliases of the languages this previewer must be enabled for. Defaults to "*", all languages. + * @param {function=} initializer Function that will be called on initialization. + * @constructor + */ + var Previewer = function (type, updater, supportedLanguages, initializer) { + this._elt = null; + this._type = type; + this._clsRegexp = RegExp('(?:^|\\s)' + type + '(?=$|\\s)'); + this._token = null; + this.updater = updater; + this._mouseout = this.mouseout.bind(this); + this.initializer = initializer; + + var self = this; + + if (!supportedLanguages) { + supportedLanguages = ['*']; + } + if (Prism.util.type(supportedLanguages) !== 'Array') { + supportedLanguages = [supportedLanguages]; + } + supportedLanguages.forEach(function (lang) { + if (typeof lang !== 'string') { + lang = lang.lang; + } + if (!Previewer.byLanguages[lang]) { + Previewer.byLanguages[lang] = []; + } + if (Previewer.byLanguages[lang].indexOf(self) < 0) { + Previewer.byLanguages[lang].push(self); + } + }); + Previewer.byType[type] = this; + }; + + /** + * Creates the HTML element for the previewer. + */ + Previewer.prototype.init = function () { + if (this._elt) { + return; + } + this._elt = document.createElement('div'); + this._elt.className = 'prism-previewer prism-previewer-' + this._type; + document.body.appendChild(this._elt); + if(this.initializer) { + this.initializer(); + } + }; + + Previewer.prototype.isDisabled = function (token) { + do { + if (token.hasAttribute && token.hasAttribute('data-previewers')) { + var previewers = token.getAttribute('data-previewers'); + return (previewers || '').split(/\s+/).indexOf(this._type) === -1; + } + } while(token = token.parentNode); + return false; + }; + + /** + * Checks the class name of each hovered element + * @param token + */ + Previewer.prototype.check = function (token) { + if (tokenRegexp.test(token.className) && this.isDisabled(token)) { + return; + } + do { + if (tokenRegexp.test(token.className) && this._clsRegexp.test(token.className)) { + break; + } + } while(token = token.parentNode); + + if (token && token !== this._token) { + this._token = token; + this.show(); + } + }; + + /** + * Called on mouseout + */ + Previewer.prototype.mouseout = function() { + this._token.removeEventListener('mouseout', this._mouseout, false); + this._token = null; + this.hide(); + }; + + /** + * Shows the previewer positioned properly for the current token. + */ + Previewer.prototype.show = function () { + if (!this._elt) { + this.init(); + } + if (!this._token) { + return; + } + + if (this.updater.call(this._elt, this._token.textContent)) { + this._token.addEventListener('mouseout', this._mouseout, false); + + var offset = getOffset(this._token); + this._elt.className += ' active'; + + if (offset.top - this._elt.offsetHeight > 0) { + this._elt.className = this._elt.className.replace(flippedRegexp, ''); + this._elt.style.top = offset.top + 'px'; + this._elt.style.bottom = ''; + } else { + this._elt.className += ' flipped'; + this._elt.style.bottom = offset.bottom + 'px'; + this._elt.style.top = ''; + } + + this._elt.style.left = offset.left + Math.min(200, offset.width / 2) + 'px'; + } else { + this.hide(); + } + }; + + /** + * Hides the previewer. + */ + Previewer.prototype.hide = function () { + this._elt.className = this._elt.className.replace(activeRegexp, ''); + }; + + /** + * Map of all registered previewers by language + * @type {{}} + */ + Previewer.byLanguages = {}; + + /** + * Map of all registered previewers by type + * @type {{}} + */ + Previewer.byType = {}; + + /** + * Initializes the mouseover event on the code block. + * @param {HTMLElement} elt The code block (env.element) + * @param {string} lang The language (env.language) + */ + Previewer.initEvents = function (elt, lang) { + var previewers = []; + if (Previewer.byLanguages[lang]) { + previewers = previewers.concat(Previewer.byLanguages[lang]); + } + if (Previewer.byLanguages['*']) { + previewers = previewers.concat(Previewer.byLanguages['*']); + } + elt.addEventListener('mouseover', function (e) { + var target = e.target; + previewers.forEach(function (previewer) { + previewer.check(target); + }); + }, false); + }; + Prism.plugins.Previewer = Previewer; + + Prism.hooks.add('before-highlight', function (env) { + for (var previewer in previewers) { + var languages = previewers[previewer].languages; + if (env.language && languages[env.language] && !languages[env.language].initialized) { + var lang = languages[env.language]; + if (Prism.util.type(lang) !== 'Array') { + lang = [lang]; + } + lang.forEach(function (lang) { + var before, inside, root, skip; + if (lang === true) { + before = 'important'; + inside = env.language; + lang = env.language; + } else { + before = lang.before || 'important'; + inside = lang.inside || lang.lang; + root = lang.root || Prism.languages; + skip = lang.skip; + lang = env.language; + } + + if (!skip && Prism.languages[lang]) { + Prism.languages.insertBefore(inside, before, previewers[previewer].tokens, root); + env.grammar = Prism.languages[lang]; + + languages[env.language] = {initialized: true}; + } + }); + } + } + }); + + // Initialize the previewers only when needed + Prism.hooks.add('after-highlight', function (env) { + if(Previewer.byLanguages['*'] || Previewer.byLanguages[env.language]) { + Previewer.initEvents(env.element, env.language); + } + }); + + for (var previewer in previewers) { + previewers[previewer].create(); + } + +}()); diff --git a/docs/_style/prism-master/plugins/previewers/prism-previewers.min.js b/docs/_style/prism-master/plugins/previewers/prism-previewers.min.js new file mode 100644 index 0000000..477d4e5 --- /dev/null +++ b/docs/_style/prism-master/plugins/previewers/prism-previewers.min.js @@ -0,0 +1 @@ +!function(){if(("undefined"==typeof self||self.Prism)&&self.document&&Function.prototype.bind){var e={gradient:{create:function(){var e={},s=function(e,s,i){var t="180deg";return/^(?:-?\d*\.?\d+(?:deg|rad)|to\b|top|right|bottom|left)/.test(i[0])&&(t=i.shift(),t.indexOf("to ")<0&&(t.indexOf("top")>=0?t=t.indexOf("left")>=0?"to bottom right":t.indexOf("right")>=0?"to bottom left":"to bottom":t.indexOf("bottom")>=0?t=t.indexOf("left")>=0?"to top right":t.indexOf("right")>=0?"to top left":"to top":t.indexOf("left")>=0?t="to right":t.indexOf("right")>=0?t="to left":e&&(t.indexOf("deg")>=0?t=90-parseFloat(t)+"deg":t.indexOf("rad")>=0&&(t=Math.PI/2-parseFloat(t)+"rad")))),s+"("+t+","+i.join(",")+")"},i=function(e,s,i){if(i[0].indexOf("at")<0){var t="center",a="ellipse",r="farthest-corner";if(/\bcenter|top|right|bottom|left\b|^\d+/.test(i[0])&&(t=i.shift().replace(/\s*-?\d+(?:rad|deg)\s*/,"")),/\bcircle|ellipse|closest|farthest|contain|cover\b/.test(i[0])){var n=i.shift().split(/\s+/);!n[0]||"circle"!==n[0]&&"ellipse"!==n[0]||(a=n.shift()),n[0]&&(r=n.shift()),"cover"===r?r="farthest-corner":"contain"===r&&(r="clothest-side")}return s+"("+a+" "+r+" at "+t+","+i.join(",")+")"}return s+"("+i.join(",")+")"},t=function(t){if(e[t])return e[t];var a=t.match(/^(\b|\B-[a-z]{1,10}-)((?:repeating-)?(?:linear|radial)-gradient)/),r=a&&a[1],n=a&&a[2],l=t.replace(/^(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\(|\)$/g,"").split(/\s*,\s*/);return e[t]=n.indexOf("linear")>=0?s(r,n,l):n.indexOf("radial")>=0?i(r,n,l):n+"("+l.join(",")+")"};return function(){new Prism.plugins.Previewer("gradient",function(e){return this.firstChild.style.backgroundImage="",this.firstChild.style.backgroundImage=t(e),!!this.firstChild.style.backgroundImage},"*",function(){this._elt.innerHTML="
        "})}}(),tokens:{gradient:{pattern:/(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:rgb|hsl)a?\(.+?\)|[^\)])+\)/gi,inside:{"function":/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},angle:{create:function(){new Prism.plugins.Previewer("angle",function(e){var s,i,t=parseFloat(e),a=e.match(/[a-z]+$/i);if(!t||!a)return!1;switch(a=a[0]){case"deg":s=360;break;case"grad":s=400;break;case"rad":s=2*Math.PI;break;case"turn":s=1}return i=100*t/s,i%=100,this[(0>t?"set":"remove")+"Attribute"]("data-negative",""),this.querySelector("circle").style.strokeDasharray=Math.abs(i)+",500",!0},"*",function(){this._elt.innerHTML=''})},tokens:{angle:/(?:\b|\B-|(?=\B\.))\d*\.?\d+(?:deg|g?rad|turn)\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},color:{create:function(){new Prism.plugins.Previewer("color",function(e){return this.style.backgroundColor="",this.style.backgroundColor=e,!!this.style.backgroundColor})},tokens:{color:{pattern:/\B#(?:[0-9a-f]{3}){1,2}\b|\b(?:rgb|hsl)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:rgb|hsl)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B|\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGray|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGray|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGray|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gray|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGray|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGray|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGray|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,inside:{"function":/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},easing:{create:function(){new Prism.plugins.Previewer("easing",function(e){e={linear:"0,0,1,1",ease:".25,.1,.25,1","ease-in":".42,0,1,1","ease-out":"0,0,.58,1","ease-in-out":".42,0,.58,1"}[e]||e;var s=e.match(/-?\d*\.?\d+/g);if(4===s.length){s=s.map(function(e,s){return 100*(s%2?1-e:e)}),this.querySelector("path").setAttribute("d","M0,100 C"+s[0]+","+s[1]+", "+s[2]+","+s[3]+", 100,0");var i=this.querySelectorAll("line");return i[0].setAttribute("x2",s[0]),i[0].setAttribute("y2",s[1]),i[1].setAttribute("x2",s[2]),i[1].setAttribute("y2",s[3]),!0}return!1},"*",function(){this._elt.innerHTML=''})},tokens:{easing:{pattern:/\bcubic-bezier\((?:-?\d*\.?\d+,\s*){3}-?\d*\.?\d+\)\B|\b(?:linear|ease(?:-in)?(?:-out)?)(?=\s|[;}]|$)/i,inside:{"function":/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",inside:"inside",before:"punctuation",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},time:{create:function(){new Prism.plugins.Previewer("time",function(e){var s=parseFloat(e),i=e.match(/[a-z]+$/i);return s&&i?(i=i[0],this.querySelector("circle").style.animationDuration=2*s+i,!0):!1},"*",function(){this._elt.innerHTML=''})},tokens:{time:/(?:\b|\B-|(?=\B\.))\d*\.?\d+m?s\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}}},s=function(e){var s=e.getBoundingClientRect(),i=s.left,t=s.top,a=document.documentElement.getBoundingClientRect();return i-=a.left,t-=a.top,{top:t,right:innerWidth-i-s.width,bottom:innerHeight-t-s.height,left:i,width:s.width,height:s.height}},i=/(?:^|\s)token(?=$|\s)/,t=/(?:^|\s)active(?=$|\s)/g,a=/(?:^|\s)flipped(?=$|\s)/g,r=function(e,s,i,t){this._elt=null,this._type=e,this._clsRegexp=RegExp("(?:^|\\s)"+e+"(?=$|\\s)"),this._token=null,this.updater=s,this._mouseout=this.mouseout.bind(this),this.initializer=t;var a=this;i||(i=["*"]),"Array"!==Prism.util.type(i)&&(i=[i]),i.forEach(function(e){"string"!=typeof e&&(e=e.lang),r.byLanguages[e]||(r.byLanguages[e]=[]),r.byLanguages[e].indexOf(a)<0&&r.byLanguages[e].push(a)}),r.byType[e]=this};r.prototype.init=function(){this._elt||(this._elt=document.createElement("div"),this._elt.className="prism-previewer prism-previewer-"+this._type,document.body.appendChild(this._elt),this.initializer&&this.initializer())},r.prototype.isDisabled=function(e){do if(e.hasAttribute&&e.hasAttribute("data-previewers")){var s=e.getAttribute("data-previewers");return-1===(s||"").split(/\s+/).indexOf(this._type)}while(e=e.parentNode);return!1},r.prototype.check=function(e){if(!i.test(e.className)||!this.isDisabled(e)){do if(i.test(e.className)&&this._clsRegexp.test(e.className))break;while(e=e.parentNode);e&&e!==this._token&&(this._token=e,this.show())}},r.prototype.mouseout=function(){this._token.removeEventListener("mouseout",this._mouseout,!1),this._token=null,this.hide()},r.prototype.show=function(){if(this._elt||this.init(),this._token)if(this.updater.call(this._elt,this._token.textContent)){this._token.addEventListener("mouseout",this._mouseout,!1);var e=s(this._token);this._elt.className+=" active",e.top-this._elt.offsetHeight>0?(this._elt.className=this._elt.className.replace(a,""),this._elt.style.top=e.top+"px",this._elt.style.bottom=""):(this._elt.className+=" flipped",this._elt.style.bottom=e.bottom+"px",this._elt.style.top=""),this._elt.style.left=e.left+Math.min(200,e.width/2)+"px"}else this.hide()},r.prototype.hide=function(){this._elt.className=this._elt.className.replace(t,"")},r.byLanguages={},r.byType={},r.initEvents=function(e,s){var i=[];r.byLanguages[s]&&(i=i.concat(r.byLanguages[s])),r.byLanguages["*"]&&(i=i.concat(r.byLanguages["*"])),e.addEventListener("mouseover",function(e){var s=e.target;i.forEach(function(e){e.check(s)})},!1)},Prism.plugins.Previewer=r,Prism.hooks.add("before-highlight",function(s){for(var i in e){var t=e[i].languages;if(s.language&&t[s.language]&&!t[s.language].initialized){var a=t[s.language];"Array"!==Prism.util.type(a)&&(a=[a]),a.forEach(function(a){var r,n,l,o;a===!0?(r="important",n=s.language,a=s.language):(r=a.before||"important",n=a.inside||a.lang,l=a.root||Prism.languages,o=a.skip,a=s.language),!o&&Prism.languages[a]&&(Prism.languages.insertBefore(n,r,e[i].tokens,l),s.grammar=Prism.languages[a],t[s.language]={initialized:!0})})}}}),Prism.hooks.add("after-highlight",function(e){(r.byLanguages["*"]||r.byLanguages[e.language])&&r.initEvents(e.element,e.language)});for(var n in e)e[n].create()}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/remove-initial-line-feed/index.html b/docs/_style/prism-master/plugins/remove-initial-line-feed/index.html new file mode 100644 index 0000000..8eb942f --- /dev/null +++ b/docs/_style/prism-master/plugins/remove-initial-line-feed/index.html @@ -0,0 +1,59 @@ + + + + + + + Remove initial line feed â–² Prism plugins + + + + + + + + + + +
        +
        + +

        Remove initial line feed

        +

        Removes the initial line feed in code blocks.

        +
        + +
        +

        How to use (DEPRECATED)

        + +

        This plugin will be removed in the future. Please use the general purpose Normalize Whitespace plugin instead.

        +

        Obviously, this is supposed to work only for code blocks (<pre><code>) and not for inline code.

        +

        With this plugin included, any initial line feed will be removed by default.

        +

        To bypass this behaviour, you may add the class keep-initial-line-feed to your desired <pre>.

        +
        + +
        +

        Examples

        + +

        Without adding the class

        +
        
        +<div></div>
        +
        + +

        With the class added

        +
        
        +<div></div>
        +
        + +
        + +
        + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js b/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js new file mode 100644 index 0000000..f62a8bf --- /dev/null +++ b/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js @@ -0,0 +1,21 @@ +(function() { + +if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; +} + +Prism.hooks.add('before-sanity-check', function (env) { + if (env.code) { + var pre = env.element.parentNode; + var clsReg = /\s*\bkeep-initial-line-feed\b\s*/; + if ( + pre && pre.nodeName.toLowerCase() === 'pre' && + // Apply only if nor the
         or the  have the class
        +			(!clsReg.test(pre.className) && !clsReg.test(env.element.className))
        +		) {
        +			env.code = env.code.replace(/^(?:\r?\n|\r)/, '');
        +		}
        +	}
        +});
        +
        +}());
        \ No newline at end of file
        diff --git a/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js b/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js
        new file mode 100644
        index 0000000..e0016a4
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js
        @@ -0,0 +1 @@
        +!function(){"undefined"!=typeof self&&self.Prism&&self.document&&Prism.hooks.add("before-sanity-check",function(e){if(e.code){var s=e.element.parentNode,n=/\s*\bkeep-initial-line-feed\b\s*/;!s||"pre"!==s.nodeName.toLowerCase()||n.test(s.className)||n.test(e.element.className)||(e.code=e.code.replace(/^(?:\r?\n|\r)/,""))}})}();
        \ No newline at end of file
        diff --git a/docs/_style/prism-master/plugins/show-invisibles/index.html b/docs/_style/prism-master/plugins/show-invisibles/index.html
        new file mode 100644
        index 0000000..cb0ad43
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/show-invisibles/index.html
        @@ -0,0 +1,46 @@
        +
        +
        +
        +
        +
        +
        +Show Invisibles â–² Prism plugins
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        + +

        Show Invisibles

        +

        Show hidden characters such as tabs and line breaks.

        +
        + +
        +

        Examples

        + +
        
        +	
        +	
        
        +	
        +	
        
        +
        + +
        + + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.css b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.css new file mode 100644 index 0000000..c57be58 --- /dev/null +++ b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.css @@ -0,0 +1,34 @@ +.token.tab:not(:empty), +.token.cr, +.token.lf, +.token.space { + position: relative; +} + +.token.tab:not(:empty):before, +.token.cr:before, +.token.lf:before, +.token.space:before { + color: inherit; + opacity: 0.4; + position: absolute; +} + +.token.tab:not(:empty):before { + content: '\21E5'; +} + +.token.cr:before { + content: '\240D'; +} + +.token.crlf:before { + content: '\240D\240A'; +} +.token.lf:before { + content: '\240A'; +} + +.token.space:before { + content: '\00B7'; +} diff --git a/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.js b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.js new file mode 100644 index 0000000..f3d120a --- /dev/null +++ b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.js @@ -0,0 +1,21 @@ +(function(){ + +if ( + typeof self !== 'undefined' && !self.Prism || + typeof global !== 'undefined' && !global.Prism +) { + return; +} + +Prism.hooks.add('before-highlight', function(env) { + var tokens = env.grammar; + + if (!tokens) return; + + tokens.tab = /\t/g; + tokens.crlf = /\r\n/g; + tokens.lf = /\n/g; + tokens.cr = /\r/g; + tokens.space = / /g; +}); +})(); diff --git a/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.min.js b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.min.js new file mode 100644 index 0000000..9df7258 --- /dev/null +++ b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.min.js @@ -0,0 +1 @@ +!function(){"undefined"!=typeof self&&!self.Prism||"undefined"!=typeof global&&!global.Prism||Prism.hooks.add("before-highlight",function(e){var f=e.grammar;f&&(f.tab=/\t/g,f.crlf=/\r\n/g,f.lf=/\n/g,f.cr=/\r/g,f.space=/ /g)})}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/show-language/index.html b/docs/_style/prism-master/plugins/show-language/index.html new file mode 100644 index 0000000..e79b1cc --- /dev/null +++ b/docs/_style/prism-master/plugins/show-language/index.html @@ -0,0 +1,54 @@ + + + + + + +Show Language â–² Prism plugins + + + + + + + + + + + +
        +
        + +

        Show Language

        +

        Display the highlighted language in code blocks (inline code does not show the label).

        +
        + +
        +

        Examples

        + +

        JavaScript

        +
        
        +
        +	

        CSS

        +
        
        +
        +	

        HTML (Markup)

        +
        
        +
        +	

        SVG

        +

        The data-language attribute can be used to display a specific label whether it has been defined as a language or not.

        +
        
        +
        + +
        + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/show-language/prism-show-language.js b/docs/_style/prism-master/plugins/show-language/prism-show-language.js new file mode 100644 index 0000000..38675bb --- /dev/null +++ b/docs/_style/prism-master/plugins/show-language/prism-show-language.js @@ -0,0 +1,31 @@ +(function(){ + +if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; +} + +if (!Prism.plugins.toolbar) { + console.warn('Show Languages plugin loaded before Toolbar plugin.'); + + return; +} + +// The languages map is built automatically with gulp +var Languages = /*languages_placeholder[*/{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","css":"CSS","clike":"C-like","javascript":"JavaScript","abap":"ABAP","actionscript":"ActionScript","apacheconf":"Apache Configuration","apl":"APL","applescript":"AppleScript","arff":"ARFF","asciidoc":"AsciiDoc","asm6502":"6502 Assembly","aspnet":"ASP.NET (C#)","autohotkey":"AutoHotkey","autoit":"AutoIt","shell":"Shell","basic":"BASIC","csharp":"C#","cpp":"C++","cil":"CIL","coffeescript":"CoffeeScript","csp":"Content-Security-Policy","css-extras":"CSS Extras","django":"Django/Jinja2","erb":"ERB","fsharp":"F#","gcode":"G-code","gedcom":"GEDCOM","glsl":"GLSL","gml":"GameMaker Language","graphql":"GraphQL","http":"HTTP","hpkp":"HTTP Public-Key-Pins","hsts":"HTTP Strict-Transport-Security","ichigojam":"IchigoJam","inform7":"Inform 7","javastacktrace":"Java stack trace","json":"JSON","jsonp":"JSONP","latex":"LaTeX","livescript":"LiveScript","lolcode":"LOLCODE","markup-templating":"Markup templating","matlab":"MATLAB","mel":"MEL","n4js":"N4JS","nasm":"NASM","nginx":"nginx","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","opencl":"OpenCL","parigp":"PARI/GP","objectpascal":"Object Pascal","php":"PHP","php-extras":"PHP Extras","plsql":"PL/SQL","powershell":"PowerShell","properties":".properties","protobuf":"Protocol Buffers","q":"Q (kdb+ database)","jsx":"React JSX","tsx":"React TSX","renpy":"Ren'py","rest":"reST (reStructuredText)","sas":"SAS","sass":"Sass (Sass)","scss":"Sass (Scss)","sql":"SQL","soy":"Soy (Closure Template)","tap":"TAP","toml":"TOML","tt2":"Template Toolkit 2","typescript":"TypeScript","vbnet":"VB.Net","vhdl":"VHDL","vim":"vim","visual-basic":"Visual Basic","wasm":"WebAssembly","wiki":"Wiki markup","xeoracube":"XeoraCube","xojo":"Xojo (REALbasic)","xquery":"XQuery","yaml":"YAML"}/*]*/; +Prism.plugins.toolbar.registerButton('show-language', function(env) { + var pre = env.element.parentNode; + if (!pre || !/pre/i.test(pre.nodeName)) { + return; + } + var language = pre.getAttribute('data-language') || Languages[env.language] || (env.language && (env.language.substring(0, 1).toUpperCase() + env.language.substring(1))); + + if(!language) { + return; + } + var element = document.createElement('span'); + element.textContent = language; + + return element; +}); + +})(); diff --git a/docs/_style/prism-master/plugins/show-language/prism-show-language.min.js b/docs/_style/prism-master/plugins/show-language/prism-show-language.min.js new file mode 100644 index 0000000..7f4dd60 --- /dev/null +++ b/docs/_style/prism-master/plugins/show-language/prism-show-language.min.js @@ -0,0 +1 @@ +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Show Languages plugin loaded before Toolbar plugin."),void 0;var e={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",arff:"ARFF",asciidoc:"AsciiDoc",asm6502:"6502 Assembly",aspnet:"ASP.NET (C#)",autohotkey:"AutoHotkey",autoit:"AutoIt",shell:"Shell",basic:"BASIC",csharp:"C#",cpp:"C++",cil:"CIL",coffeescript:"CoffeeScript",csp:"Content-Security-Policy","css-extras":"CSS Extras",django:"Django/Jinja2",erb:"ERB",fsharp:"F#",gcode:"G-code",gedcom:"GEDCOM",glsl:"GLSL",gml:"GameMaker Language",graphql:"GraphQL",http:"HTTP",hpkp:"HTTP Public-Key-Pins",hsts:"HTTP Strict-Transport-Security",ichigojam:"IchigoJam",inform7:"Inform 7",javastacktrace:"Java stack trace",json:"JSON",jsonp:"JSONP",latex:"LaTeX",livescript:"LiveScript",lolcode:"LOLCODE","markup-templating":"Markup templating",matlab:"MATLAB",mel:"MEL",n4js:"N4JS",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",parigp:"PARI/GP",objectpascal:"Object Pascal",php:"PHP","php-extras":"PHP Extras",plsql:"PL/SQL",powershell:"PowerShell",properties:".properties",protobuf:"Protocol Buffers",q:"Q (kdb+ database)",jsx:"React JSX",tsx:"React TSX",renpy:"Ren'py",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",soy:"Soy (Closure Template)",tap:"TAP",toml:"TOML",tt2:"Template Toolkit 2",typescript:"TypeScript",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim","visual-basic":"Visual Basic",wasm:"WebAssembly",wiki:"Wiki markup",xeoracube:"XeoraCube",xojo:"Xojo (REALbasic)",xquery:"XQuery",yaml:"YAML"};Prism.plugins.toolbar.registerButton("show-language",function(a){var t=a.element.parentNode;if(t&&/pre/i.test(t.nodeName)){var s=t.getAttribute("data-language")||e[a.language]||a.language&&a.language.substring(0,1).toUpperCase()+a.language.substring(1);if(s){var r=document.createElement("span");return r.textContent=s,r}}})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/toolbar/index.html b/docs/_style/prism-master/plugins/toolbar/index.html new file mode 100644 index 0000000..5547c5d --- /dev/null +++ b/docs/_style/prism-master/plugins/toolbar/index.html @@ -0,0 +1,134 @@ + + + + + + + Toolbar â–² Prism plugins + + + + + + + + + + + +
        +
        + +

        Toolbar

        +

        Attach a toolbar for plugins to easily register buttons on the top of a code block.

        +
        + +
        +

        How to use

        +

        The Toolbar plugin allows for several methods to register your button, using the Prism.plugins.toolbar.registerButton function.

        + +

        The simplest method is through the HTML API. Add a data-label attribute to the pre element, and the Toolbar + plugin will read the value of that attribute and append a label to the code snippet.

        + +
        <pre data-src="plugins/toolbar/prism-toolbar.js" data-label="Hello World!"></pre>
        + +

        If you want to provide arbitrary HTML to the label, create a template element with the HTML you want in the label, and provide the + template element's id to data-label. The Toolbar plugin will use the template's content for the button. + You can also use to declare your event handlers inline:

        + +
        <pre data-src="plugins/toolbar/prism-toolbar.js" data-label="my-label-button"></pre>
        + +
        <template id="my-label-button"><button onclick="console.log('This is an inline-handler');">My button</button></template>
        + +

        For more flexibility, the Toolbar exposes a JavaScript function that can be used to register new buttons or labels to the Toolbar, + Prism.plugins.toolbar.registerButton.

        + +

        The function accepts a key for the button and an object with a text property string and an optional + onClick function or url string. The onClick function will be called when the button is clicked, while the + url property will be set to the anchor tag's href.

        + +
        Prism.plugins.toolbar.registerButton('hello-world', {
        +	text: 'Hello World!', // required
        +	onClick: function (env) { // optional
        +		alert('This code snippet is written in ' + env.language + '.');
        +	}
        +});
        + +

        See how the above code registers the Hello World! button? You can use this in your plugins to register your own buttons with the toolbar.

        + +

        If you need more control, you can provide a function to registerButton that returns either a span, a, or + button element.

        + +
        Prism.plugins.toolbar.registerButton('select-code', function() {
        +	var button = document.createElement('button');
        +	button.innerHTML = 'Select Code';
        +
        +	button.addEventListener('click', function () {
        +		// Source: http://stackoverflow.com/a/11128179/2757940
        +		if (document.body.createTextRange) { // ms
        +			var range = document.body.createTextRange();
        +			range.moveToElementText(env.element);
        +			range.select();
        +		} else if (window.getSelection) { // moz, opera, webkit
        +			var selection = window.getSelection();
        +			var range = document.createRange();
        +			range.selectNodeContents(env.element);
        +			selection.removeAllRanges();
        +			selection.addRange(range);
        +		}
        +	});
        +
        +	return button;
        +});
        + +

        The above function creates the Select Code button you see, and when you click it, the code gets highlighted.

        + +

        By default, the buttons will be added to the code snippet in the order they were registered. If more control over + the order is needed, an HTML attribute can be added to the body tag with a comma-separated string indicating the + order.

        + +
        <body data-toolbar-order="select-code,hello-world,label">
        +
        + +
        + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/toolbar/prism-toolbar.css b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.css new file mode 100644 index 0000000..2b234e1 --- /dev/null +++ b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.css @@ -0,0 +1,58 @@ +div.code-toolbar { + position: relative; +} + +div.code-toolbar > .toolbar { + position: absolute; + top: .3em; + right: .2em; + transition: opacity 0.3s ease-in-out; + opacity: 0; +} + +div.code-toolbar:hover > .toolbar { + opacity: 1; +} + +div.code-toolbar > .toolbar .toolbar-item { + display: inline-block; +} + +div.code-toolbar > .toolbar a { + cursor: pointer; +} + +div.code-toolbar > .toolbar button { + background: none; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + -webkit-user-select: none; /* for button */ + -moz-user-select: none; + -ms-user-select: none; +} + +div.code-toolbar > .toolbar a, +div.code-toolbar > .toolbar button, +div.code-toolbar > .toolbar span { + color: #bbb; + font-size: .8em; + padding: 0 .5em; + background: #f5f2f0; + background: rgba(224, 224, 224, 0.2); + box-shadow: 0 2px 0 0 rgba(0,0,0,0.2); + border-radius: .5em; +} + +div.code-toolbar > .toolbar a:hover, +div.code-toolbar > .toolbar a:focus, +div.code-toolbar > .toolbar button:hover, +div.code-toolbar > .toolbar button:focus, +div.code-toolbar > .toolbar span:hover, +div.code-toolbar > .toolbar span:focus { + color: inherit; + text-decoration: none; +} diff --git a/docs/_style/prism-master/plugins/toolbar/prism-toolbar.js b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.js new file mode 100644 index 0000000..9329451 --- /dev/null +++ b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.js @@ -0,0 +1,137 @@ +(function(){ + if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; + } + + var callbacks = []; + var map = {}; + var noop = function() {}; + + Prism.plugins.toolbar = {}; + + /** + * Register a button callback with the toolbar. + * + * @param {string} key + * @param {Object|Function} opts + */ + var registerButton = Prism.plugins.toolbar.registerButton = function (key, opts) { + var callback; + + if (typeof opts === 'function') { + callback = opts; + } else { + callback = function (env) { + var element; + + if (typeof opts.onClick === 'function') { + element = document.createElement('button'); + element.type = 'button'; + element.addEventListener('click', function () { + opts.onClick.call(this, env); + }); + } else if (typeof opts.url === 'string') { + element = document.createElement('a'); + element.href = opts.url; + } else { + element = document.createElement('span'); + } + + element.textContent = opts.text; + + return element; + }; + } + + callbacks.push(map[key] = callback); + }; + + /** + * Post-highlight Prism hook callback. + * + * @param env + */ + var hook = Prism.plugins.toolbar.hook = function (env) { + // Check if inline or actual code block (credit to line-numbers plugin) + var pre = env.element.parentNode; + if (!pre || !/pre/i.test(pre.nodeName)) { + return; + } + + // Autoloader rehighlights, so only do this once. + if (pre.parentNode.classList.contains('code-toolbar')) { + return; + } + + // Create wrapper for
         to prevent scrolling toolbar with content
        +		var wrapper = document.createElement("div");
        +		wrapper.classList.add("code-toolbar");
        +		pre.parentNode.insertBefore(wrapper, pre);
        +		wrapper.appendChild(pre);
        +
        +		// Setup the toolbar
        +		var toolbar = document.createElement('div');
        +		toolbar.classList.add('toolbar');
        +
        +		if (document.body.hasAttribute('data-toolbar-order')) {
        +			callbacks = document.body.getAttribute('data-toolbar-order').split(',').map(function(key) {
        +				return map[key] || noop;
        +			});
        +		}
        +
        +		callbacks.forEach(function(callback) {
        +			var element = callback(env);
        +
        +			if (!element) {
        +				return;
        +			}
        +
        +			var item = document.createElement('div');
        +			item.classList.add('toolbar-item');
        +
        +			item.appendChild(element);
        +			toolbar.appendChild(item);
        +		});
        +
        +		// Add our toolbar to the currently created wrapper of 
         tag
        +		wrapper.appendChild(toolbar);
        +	};
        +
        +	registerButton('label', function(env) {
        +		var pre = env.element.parentNode;
        +		if (!pre || !/pre/i.test(pre.nodeName)) {
        +			return;
        +		}
        +
        +		if (!pre.hasAttribute('data-label')) {
        +			return;
        +		}
        +
        +		var element, template;
        +		var text = pre.getAttribute('data-label');
        +		try {
        +			// Any normal text will blow up this selector.
        +			template = document.querySelector('template#' + text);
        +		} catch (e) {}
        +
        +		if (template) {
        +			element = template.content;
        +		} else {
        +			if (pre.hasAttribute('data-url')) {
        +				element = document.createElement('a');
        +				element.href = pre.getAttribute('data-url');
        +			} else {
        +				element = document.createElement('span');
        +			}
        +
        +			element.textContent = text;
        +		}
        +
        +		return element;
        +	});
        +
        +	/**
        +	 * Register the toolbar with Prism.
        +	 */
        +	Prism.hooks.add('complete', hook);
        +})();
        diff --git a/docs/_style/prism-master/plugins/toolbar/prism-toolbar.min.js b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.min.js
        new file mode 100644
        index 0000000..17cee96
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.min.js
        @@ -0,0 +1 @@
        +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var t=[],e={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var o;o="function"==typeof a?a:function(t){var e;return"function"==typeof a.onClick?(e=document.createElement("button"),e.type="button",e.addEventListener("click",function(){a.onClick.call(this,t)})):"string"==typeof a.url?(e=document.createElement("a"),e.href=a.url):e=document.createElement("span"),e.textContent=a.text,e},t.push(e[n]=o)},o=Prism.plugins.toolbar.hook=function(a){var o=a.element.parentNode;if(o&&/pre/i.test(o.nodeName)&&!o.parentNode.classList.contains("code-toolbar")){var r=document.createElement("div");r.classList.add("code-toolbar"),o.parentNode.insertBefore(r,o),r.appendChild(o);var i=document.createElement("div");i.classList.add("toolbar"),document.body.hasAttribute("data-toolbar-order")&&(t=document.body.getAttribute("data-toolbar-order").split(",").map(function(t){return e[t]||n})),t.forEach(function(t){var e=t(a);if(e){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(e),i.appendChild(n)}}),r.appendChild(i)}};a("label",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-label")){var n,a,o=e.getAttribute("data-label");try{a=document.querySelector("template#"+o)}catch(r){}return a?n=a.content:(e.hasAttribute("data-url")?(n=document.createElement("a"),n.href=e.getAttribute("data-url")):n=document.createElement("span"),n.textContent=o),n}}),Prism.hooks.add("complete",o)}}();
        \ No newline at end of file
        diff --git a/docs/_style/prism-master/plugins/unescaped-markup/index.html b/docs/_style/prism-master/plugins/unescaped-markup/index.html
        new file mode 100644
        index 0000000..442ef2a
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/unescaped-markup/index.html
        @@ -0,0 +1,195 @@
        +
        +
        +
        +
        +	
        +	
        +	Unescaped markup â–² Prism plugins
        +	
        +	
        +	
        +	
        +
        +	
        +
        +	
        +	
        +
        +
        +
        +
        +
        + +

        Unescaped markup

        +

        Write markup without having to escape anything.

        +
        + +
        +

        How to use

        +

        This plugin provides several methods of achieving the same thing:

        + +
          +
        • Instead of using <pre><code> elements, use <script type="text/plain"> +
          <script type="text/plain" class="language-markup">
          +<p>Example</p>
          +</script>
          +
        • +
        • Use a HTML-comment to escape your code +
          <pre class="language-markup"><code><!--
          +<p>Example</p>
          +--></code></pre>
        • +
        +
        + +
        +

        Examples

        + +

        View source to see that the following didn’t need escaping (except for </script>, that does):

        + + + +

        The next example uses the HTML-comment method:

        + +
        +
        + +
        +

        FAQ

        + +

        Why not use the HTML <template> tag?

        + +

        Because it is a PITA to get its textContent and needs to be pointlessly cloned. + Feel free to implement it yourself and send a pull request though, if you are so inclined.

        + +

        Can I use this inline?

        + +

        Not out of the box, because I figured it’s more of a hassle to type <script type="text/plain"> than escape the 1-2 < characters you need to escape in inline code. + Also inline code is not as frequently copy-pasted, which was the major source of annoyance that got me to write this plugin.

        +
        + +
        + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.css b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.css new file mode 100644 index 0000000..3ba2a1e --- /dev/null +++ b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.css @@ -0,0 +1,10 @@ +/* Fallback, in case JS does not run, to ensure the code is at least visible */ +[class*='lang-'] script[type='text/plain'], +[class*='language-'] script[type='text/plain'], +script[type='text/plain'][class*='lang-'], +script[type='text/plain'][class*='language-'] { + display: block; + font: 100% Consolas, Monaco, monospace; + white-space: pre; + overflow: auto; +} diff --git a/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.js b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.js new file mode 100644 index 0000000..8684eba --- /dev/null +++ b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.js @@ -0,0 +1,44 @@ +(function () { + + if (typeof self === 'undefined' || !self.Prism || !self.document || !Prism.languages.markup) { + return; + } + + Prism.plugins.UnescapedMarkup = true; + + Prism.hooks.add('before-highlightall', function (env) { + env.selector += ", [class*='lang-'] script[type='text/plain'], [class*='language-'] script[type='text/plain']" + + ", script[type='text/plain'][class*='lang-'], script[type='text/plain'][class*='language-']"; + }); + + Prism.hooks.add('before-sanity-check', function (env) { + if ((env.element.matches || env.element.msMatchesSelector).call(env.element, "script[type='text/plain']")) { + var code = document.createElement("code"); + var pre = document.createElement("pre"); + + pre.className = code.className = env.element.className; + + if (env.element.dataset) { + Object.keys(env.element.dataset).forEach(function (key) { + if (Object.prototype.hasOwnProperty.call(env.element.dataset, key)) { + pre.dataset[key] = env.element.dataset[key]; + } + }); + } + + env.code = env.code.replace(/<\/script(>|>)/gi, ""); + code.textContent = env.code; + + pre.appendChild(code); + env.element.parentNode.replaceChild(pre, env.element); + env.element = code; + return; + } + + var pre = env.element.parentNode; + if (!env.code && pre && pre.nodeName.toLowerCase() == 'pre' && + env.element.childNodes.length && env.element.childNodes[0].nodeName == "#comment") { + env.element.textContent = env.code = env.element.childNodes[0].textContent; + } + }); +}()); diff --git a/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.min.js b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.min.js new file mode 100644 index 0000000..f48514a --- /dev/null +++ b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.min.js @@ -0,0 +1 @@ +!function(){"undefined"!=typeof self&&self.Prism&&self.document&&Prism.languages.markup&&(Prism.plugins.UnescapedMarkup=!0,Prism.hooks.add("before-highlightall",function(e){e.selector+=", [class*='lang-'] script[type='text/plain'], [class*='language-'] script[type='text/plain'], script[type='text/plain'][class*='lang-'], script[type='text/plain'][class*='language-']"}),Prism.hooks.add("before-sanity-check",function(e){if((e.element.matches||e.element.msMatchesSelector).call(e.element,"script[type='text/plain']")){var t=document.createElement("code"),n=document.createElement("pre");return n.className=t.className=e.element.className,e.element.dataset&&Object.keys(e.element.dataset).forEach(function(t){Object.prototype.hasOwnProperty.call(e.element.dataset,t)&&(n.dataset[t]=e.element.dataset[t])}),e.code=e.code.replace(/<\/script(>|>)/gi,""),t.textContent=e.code,n.appendChild(t),e.element.parentNode.replaceChild(n,e.element),e.element=t,void 0}var n=e.element.parentNode;!e.code&&n&&"pre"==n.nodeName.toLowerCase()&&e.element.childNodes.length&&"#comment"==e.element.childNodes[0].nodeName&&(e.element.textContent=e.code=e.element.childNodes[0].textContent)}))}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/wpd/index.html b/docs/_style/prism-master/plugins/wpd/index.html new file mode 100644 index 0000000..9157a48 --- /dev/null +++ b/docs/_style/prism-master/plugins/wpd/index.html @@ -0,0 +1,68 @@ + + + + + + +WebPlatform Docs â–² Prism plugins + + + + + + + + + + + +
        +
        + +

        WebPlatform Docs

        +

        Makes tokens link to WebPlatform.org documentation. The links open in a new tab.

        +
        + +
        +

        How to use

        + +

        No setup required, just include the plugin in your download and you’re good to go!

        + +

        Tokens that currently link to documentation:

        + +
          +
        • HTML, MathML and SVG tags
        • +
        • HTML, MathML and SVG non-namespaced attributes
        • +
        • (Non-prefixed) CSS properties
        • +
        • (Non-prefixed) CSS @rules
        • +
        • (Non-prefixed) CSS pseudo-classes
        • +
        • (Non-prefixed) CSS pseudo-elements (starting with ::)
        • +
        + +

        Beta: This plugin is still in beta. Please help make it better: Test it and report any false positives etc!

        +
        + +
        +

        Examples

        + +

        CSS

        +
        
        +	
        
        +
        +	

        HTML

        +
        
        +
        +	

        SVG

        +
        
        +
        + +
        + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/wpd/prism-wpd.css b/docs/_style/prism-master/plugins/wpd/prism-wpd.css new file mode 100644 index 0000000..43b7165 --- /dev/null +++ b/docs/_style/prism-master/plugins/wpd/prism-wpd.css @@ -0,0 +1,11 @@ +code[class*="language-"] a[href], +pre[class*="language-"] a[href] { + cursor: help; + text-decoration: none; +} + +code[class*="language-"] a[href]:hover, +pre[class*="language-"] a[href]:hover { + cursor: help; + text-decoration: underline; +} \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/wpd/prism-wpd.js b/docs/_style/prism-master/plugins/wpd/prism-wpd.js new file mode 100644 index 0000000..dc147d4 --- /dev/null +++ b/docs/_style/prism-master/plugins/wpd/prism-wpd.js @@ -0,0 +1,169 @@ +(function(){ + +if ( + typeof self !== 'undefined' && !self.Prism || + typeof global !== 'undefined' && !global.Prism +) { + return; +} + +if (Prism.languages.css) { + // check whether the selector is an advanced pattern before extending it + if (Prism.languages.css.selector.pattern) + { + Prism.languages.css.selector.inside['pseudo-class'] = /:[\w-]+/; + Prism.languages.css.selector.inside['pseudo-element'] = /::[\w-]+/; + } + else + { + Prism.languages.css.selector = { + pattern: Prism.languages.css.selector, + inside: { + 'pseudo-class': /:[\w-]+/, + 'pseudo-element': /::[\w-]+/ + } + }; + } +} + +if (Prism.languages.markup) { + Prism.languages.markup.tag.inside.tag.inside['tag-id'] = /[\w-]+/; + + var Tags = { + HTML: { + 'a': 1, 'abbr': 1, 'acronym': 1, 'b': 1, 'basefont': 1, 'bdo': 1, 'big': 1, 'blink': 1, 'cite': 1, 'code': 1, 'dfn': 1, 'em': 1, 'kbd': 1, 'i': 1, + 'rp': 1, 'rt': 1, 'ruby': 1, 's': 1, 'samp': 1, 'small': 1, 'spacer': 1, 'strike': 1, 'strong': 1, 'sub': 1, 'sup': 1, 'time': 1, 'tt': 1, 'u': 1, + 'var': 1, 'wbr': 1, 'noframes': 1, 'summary': 1, 'command': 1, 'dt': 1, 'dd': 1, 'figure': 1, 'figcaption': 1, 'center': 1, 'section': 1, 'nav': 1, + 'article': 1, 'aside': 1, 'hgroup': 1, 'header': 1, 'footer': 1, 'address': 1, 'noscript': 1, 'isIndex': 1, 'main': 1, 'mark': 1, 'marquee': 1, + 'meter': 1, 'menu': 1 + }, + SVG: { + 'animateColor': 1, 'animateMotion': 1, 'animateTransform': 1, 'glyph': 1, 'feBlend': 1, 'feColorMatrix': 1, 'feComponentTransfer': 1, + 'feFuncR': 1, 'feFuncG': 1, 'feFuncB': 1, 'feFuncA': 1, 'feComposite': 1, 'feConvolveMatrix': 1, 'feDiffuseLighting': 1, 'feDisplacementMap': 1, + 'feFlood': 1, 'feGaussianBlur': 1, 'feImage': 1, 'feMerge': 1, 'feMergeNode': 1, 'feMorphology': 1, 'feOffset': 1, 'feSpecularLighting': 1, + 'feTile': 1, 'feTurbulence': 1, 'feDistantLight': 1, 'fePointLight': 1, 'feSpotLight': 1, 'linearGradient': 1, 'radialGradient': 1, 'altGlyph': 1, + 'textPath': 1, 'tref': 1, 'altglyph': 1, 'textpath': 1, 'altglyphdef': 1, 'altglyphitem': 1, 'clipPath': 1, 'color-profile': 1, 'cursor': 1, + 'font-face': 1, 'font-face-format': 1, 'font-face-name': 1, 'font-face-src': 1, 'font-face-uri': 1, 'foreignObject': 1, 'glyphRef': 1, + 'hkern': 1, 'vkern': 1 + }, + MathML: {} + } +} + +var language; + +Prism.hooks.add('wrap', function(env) { + if ((env.type == 'tag-id' + || (env.type == 'property' && env.content.indexOf('-') != 0) + || (env.type == 'rule'&& env.content.indexOf('@-') != 0) + || (env.type == 'pseudo-class'&& env.content.indexOf(':-') != 0) + || (env.type == 'pseudo-element'&& env.content.indexOf('::-') != 0) + || (env.type == 'attr-name' && env.content.indexOf('data-') != 0) + ) && env.content.indexOf('<') === -1 + ) { + if (env.language == 'css' + || env.language == 'scss' + || env.language == 'markup' + ) { + var href = 'https://webplatform.github.io/docs/'; + var content = env.content; + + if (env.language == 'css' || env.language == 'scss') { + href += 'css/'; + + if (env.type == 'property') { + href += 'properties/'; + } + else if (env.type == 'rule') { + href += 'atrules/'; + content = content.substring(1); + } + else if (env.type == 'pseudo-class') { + href += 'selectors/pseudo-classes/'; + content = content.substring(1); + } + else if (env.type == 'pseudo-element') { + href += 'selectors/pseudo-elements/'; + content = content.substring(2); + } + } + else if (env.language == 'markup') { + if (env.type == 'tag-id') { + // Check language + language = getLanguage(env.content) || language; + + if (language) { + href += language + '/elements/'; + } + else { + return; // Abort + } + } + else if (env.type == 'attr-name') { + if (language) { + href += language + '/attributes/'; + } + else { + return; // Abort + } + } + } + + href += content; + env.tag = 'a'; + env.attributes.href = href; + env.attributes.target = '_blank'; + } + } +}); + +function getLanguage(tag) { + var tagL = tag.toLowerCase(); + + if (Tags.HTML[tagL]) { + return 'html'; + } + else if (Tags.SVG[tag]) { + return 'svg'; + } + else if (Tags.MathML[tag]) { + return 'mathml'; + } + + // Not in dictionary, perform check + if (Tags.HTML[tagL] !== 0 && typeof document !== 'undefined') { + var htmlInterface = (document.createElement(tag).toString().match(/\[object HTML(.+)Element\]/) || [])[1]; + + if (htmlInterface && htmlInterface != 'Unknown') { + Tags.HTML[tagL] = 1; + return 'html'; + } + } + + Tags.HTML[tagL] = 0; + + if (Tags.SVG[tag] !== 0 && typeof document !== 'undefined') { + var svgInterface = (document.createElementNS('http://www.w3.org/2000/svg', tag).toString().match(/\[object SVG(.+)Element\]/) || [])[1]; + + if (svgInterface && svgInterface != 'Unknown') { + Tags.SVG[tag] = 1; + return 'svg'; + } + } + + Tags.SVG[tag] = 0; + + // Lame way to detect MathML, but browsers don’t expose interface names there :( + if (Tags.MathML[tag] !== 0) { + if (tag.indexOf('m') === 0) { + Tags.MathML[tag] = 1; + return 'mathml'; + } + } + + Tags.MathML[tag] = 0; + + return null; +} + +})(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/wpd/prism-wpd.min.js b/docs/_style/prism-master/plugins/wpd/prism-wpd.min.js new file mode 100644 index 0000000..86bad36 --- /dev/null +++ b/docs/_style/prism-master/plugins/wpd/prism-wpd.min.js @@ -0,0 +1 @@ +!function(){function e(e){var n=e.toLowerCase();if(t.HTML[n])return"html";if(t.SVG[e])return"svg";if(t.MathML[e])return"mathml";if(0!==t.HTML[n]&&"undefined"!=typeof document){var a=(document.createElement(e).toString().match(/\[object HTML(.+)Element\]/)||[])[1];if(a&&"Unknown"!=a)return t.HTML[n]=1,"html"}if(t.HTML[n]=0,0!==t.SVG[e]&&"undefined"!=typeof document){var s=(document.createElementNS("http://www.w3.org/2000/svg",e).toString().match(/\[object SVG(.+)Element\]/)||[])[1];if(s&&"Unknown"!=s)return t.SVG[e]=1,"svg"}return t.SVG[e]=0,0!==t.MathML[e]&&0===e.indexOf("m")?(t.MathML[e]=1,"mathml"):(t.MathML[e]=0,null)}if(("undefined"==typeof self||self.Prism)&&("undefined"==typeof global||global.Prism)){if(Prism.languages.css&&(Prism.languages.css.selector.pattern?(Prism.languages.css.selector.inside["pseudo-class"]=/:[\w-]+/,Prism.languages.css.selector.inside["pseudo-element"]=/::[\w-]+/):Prism.languages.css.selector={pattern:Prism.languages.css.selector,inside:{"pseudo-class":/:[\w-]+/,"pseudo-element":/::[\w-]+/}}),Prism.languages.markup){Prism.languages.markup.tag.inside.tag.inside["tag-id"]=/[\w-]+/;var t={HTML:{a:1,abbr:1,acronym:1,b:1,basefont:1,bdo:1,big:1,blink:1,cite:1,code:1,dfn:1,em:1,kbd:1,i:1,rp:1,rt:1,ruby:1,s:1,samp:1,small:1,spacer:1,strike:1,strong:1,sub:1,sup:1,time:1,tt:1,u:1,"var":1,wbr:1,noframes:1,summary:1,command:1,dt:1,dd:1,figure:1,figcaption:1,center:1,section:1,nav:1,article:1,aside:1,hgroup:1,header:1,footer:1,address:1,noscript:1,isIndex:1,main:1,mark:1,marquee:1,meter:1,menu:1},SVG:{animateColor:1,animateMotion:1,animateTransform:1,glyph:1,feBlend:1,feColorMatrix:1,feComponentTransfer:1,feFuncR:1,feFuncG:1,feFuncB:1,feFuncA:1,feComposite:1,feConvolveMatrix:1,feDiffuseLighting:1,feDisplacementMap:1,feFlood:1,feGaussianBlur:1,feImage:1,feMerge:1,feMergeNode:1,feMorphology:1,feOffset:1,feSpecularLighting:1,feTile:1,feTurbulence:1,feDistantLight:1,fePointLight:1,feSpotLight:1,linearGradient:1,radialGradient:1,altGlyph:1,textPath:1,tref:1,altglyph:1,textpath:1,altglyphdef:1,altglyphitem:1,clipPath:1,"color-profile":1,cursor:1,"font-face":1,"font-face-format":1,"font-face-name":1,"font-face-src":1,"font-face-uri":1,foreignObject:1,glyphRef:1,hkern:1,vkern:1},MathML:{}}}var n;Prism.hooks.add("wrap",function(t){if(("tag-id"==t.type||"property"==t.type&&0!=t.content.indexOf("-")||"rule"==t.type&&0!=t.content.indexOf("@-")||"pseudo-class"==t.type&&0!=t.content.indexOf(":-")||"pseudo-element"==t.type&&0!=t.content.indexOf("::-")||"attr-name"==t.type&&0!=t.content.indexOf("data-"))&&-1===t.content.indexOf("<")&&("css"==t.language||"scss"==t.language||"markup"==t.language)){var a="https://webplatform.github.io/docs/",s=t.content;if("css"==t.language||"scss"==t.language)a+="css/","property"==t.type?a+="properties/":"rule"==t.type?(a+="atrules/",s=s.substring(1)):"pseudo-class"==t.type?(a+="selectors/pseudo-classes/",s=s.substring(1)):"pseudo-element"==t.type&&(a+="selectors/pseudo-elements/",s=s.substring(2));else if("markup"==t.language)if("tag-id"==t.type){if(n=e(t.content)||n,!n)return;a+=n+"/elements/"}else if("attr-name"==t.type){if(!n)return;a+=n+"/attributes/"}a+=s,t.tag="a",t.attributes.href=a,t.attributes.target="_blank"}})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/prefixfree.min.js b/docs/_style/prism-master/prefixfree.min.js new file mode 100644 index 0000000..94fc408 --- /dev/null +++ b/docs/_style/prism-master/prefixfree.min.js @@ -0,0 +1,5 @@ +/** + * StyleFix 1.0.3 & PrefixFree 1.0.7 + * @author Lea Verou + * MIT license + */(function(){function t(e,t){return[].slice.call((t||document).querySelectorAll(e))}if(!window.addEventListener)return;var e=window.StyleFix={link:function(t){try{if(t.rel!=="stylesheet"||t.hasAttribute("data-noprefix"))return}catch(n){return}var r=t.href||t.getAttribute("data-href"),i=r.replace(/[^\/]+$/,""),s=t.parentNode,o=new XMLHttpRequest,u;o.onreadystatechange=function(){o.readyState===4&&u()};u=function(){var n=o.responseText;if(n&&t.parentNode&&(!o.status||o.status<400||o.status>600)){n=e.fix(n,!0,t);if(i){n=n.replace(/url\(\s*?((?:"|')?)(.+?)\1\s*?\)/gi,function(e,t,n){return/^([a-z]{3,10}:|\/|#)/i.test(n)?e:'url("'+i+n+'")'});var r=i.replace(/([\\\^\$*+[\]?{}.=!:(|)])/g,"\\$1");n=n.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)"+r,"gi"),"$1")}var u=document.createElement("style");u.textContent=n;u.media=t.media;u.disabled=t.disabled;u.setAttribute("data-href",t.getAttribute("href"));s.insertBefore(u,t);s.removeChild(t);u.media=t.media}};try{o.open("GET",r);o.send(null)}catch(n){if(typeof XDomainRequest!="undefined"){o=new XDomainRequest;o.onerror=o.onprogress=function(){};o.onload=u;o.open("GET",r);o.send(null)}}t.setAttribute("data-inprogress","")},styleElement:function(t){if(t.hasAttribute("data-noprefix"))return;var n=t.disabled;t.textContent=e.fix(t.textContent,!0,t);t.disabled=n},styleAttribute:function(t){var n=t.getAttribute("style");n=e.fix(n,!1,t);t.setAttribute("style",n)},process:function(){t('link[rel="stylesheet"]:not([data-inprogress])').forEach(StyleFix.link);t("style").forEach(StyleFix.styleElement);t("[style]").forEach(StyleFix.styleAttribute)},register:function(t,n){(e.fixers=e.fixers||[]).splice(n===undefined?e.fixers.length:n,0,t)},fix:function(t,n,r){for(var i=0;i-1&&(e=e.replace(/(\s|:|,)(repeating-)?linear-gradient\(\s*(-?\d*\.?\d*)deg/ig,function(e,t,n,r){r=Math.abs(r-450)%360;return t+(n||"")+"linear-gradient("+r+"deg"}));e=t("functions","(\\s|:|,)","\\s*\\(","$1"+s+"$2(",e);e=t("keywords","(\\s|:)","(\\s|;|\\}|$)","$1"+s+"$2$3",e);e=t("properties","(^|\\{|\\s|;)","\\s*:","$1"+s+"$2:",e);if(n.properties.length){var o=RegExp("\\b("+n.properties.join("|")+")(?!:)","gi");e=t("valueProperties","\\b",":(.+?);",function(e){return e.replace(o,s+"$1")},e)}if(r){e=t("selectors","","\\b",n.prefixSelector,e);e=t("atrules","@","\\b","@"+s+"$1",e)}e=e.replace(RegExp("-"+s,"g"),"-");e=e.replace(/-\*-(?=[a-z]+)/gi,n.prefix);return e},property:function(e){return(n.properties.indexOf(e)?n.prefix:"")+e},value:function(e,r){e=t("functions","(^|\\s|,)","\\s*\\(","$1"+n.prefix+"$2(",e);e=t("keywords","(^|\\s)","(\\s|$)","$1"+n.prefix+"$2$3",e);return e},prefixSelector:function(e){return e.replace(/^:{1,2}/,function(e){return e+n.prefix})},prefixProperty:function(e,t){var r=n.prefix+e;return t?StyleFix.camelCase(r):r}};(function(){var e={},t=[],r={},i=getComputedStyle(document.documentElement,null),s=document.createElement("div").style,o=function(n){if(n.charAt(0)==="-"){t.push(n);var r=n.split("-"),i=r[1];e[i]=++e[i]||1;while(r.length>3){r.pop();var s=r.join("-");u(s)&&t.indexOf(s)===-1&&t.push(s)}}},u=function(e){return StyleFix.camelCase(e)in s};if(i.length>0)for(var a=0;a text.length) { + // Something went terribly wrong, ABORT, ABORT! + return; + } + + if (str instanceof Token) { + continue; + } + + if (greedy && i != strarr.length - 1) { + pattern.lastIndex = pos; + var match = pattern.exec(text); + if (!match) { + break; + } + + var from = match.index + (lookbehind ? match[1].length : 0), + to = match.index + match[0].length, + k = i, + p = pos; + + for (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) { + p += strarr[k].length; + // Move the index i to the element in strarr that is closest to from + if (from >= p) { + ++i; + pos = p; + } + } + + // If strarr[i] is a Token, then the match starts inside another Token, which is invalid + if (strarr[i] instanceof Token) { + continue; + } + + // Number of tokens to delete and replace with the new match + delNum = k - i; + str = text.slice(pos, p); + match.index -= pos; + } else { + pattern.lastIndex = 0; + + var match = pattern.exec(str), + delNum = 1; + } + + if (!match) { + if (oneshot) { + break; + } + + continue; + } + + if(lookbehind) { + lookbehindLength = match[1] ? match[1].length : 0; + } + + var from = match.index + lookbehindLength, + match = match[0].slice(lookbehindLength), + to = from + match.length, + before = str.slice(0, from), + after = str.slice(to); + + var args = [i, delNum]; + + if (before) { + ++i; + pos += before.length; + args.push(before); + } + + var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy); + + args.push(wrapped); + + if (after) { + args.push(after); + } + + Array.prototype.splice.apply(strarr, args); + + if (delNum != 1) + _.matchGrammar(text, strarr, grammar, i, pos, true, token); + + if (oneshot) + break; + } + } + } + }, + + tokenize: function(text, grammar, language) { + var strarr = [text]; + + var rest = grammar.rest; + + if (rest) { + for (var token in rest) { + grammar[token] = rest[token]; + } + + delete grammar.rest; + } + + _.matchGrammar(text, strarr, grammar, 0, 0, false); + + return strarr; + }, + + hooks: { + all: {}, + + add: function (name, callback) { + var hooks = _.hooks.all; + + hooks[name] = hooks[name] || []; + + hooks[name].push(callback); + }, + + run: function (name, env) { + var callbacks = _.hooks.all[name]; + + if (!callbacks || !callbacks.length) { + return; + } + + for (var i=0, callback; callback = callbacks[i++];) { + callback(env); + } + } + } +}; + +var Token = _.Token = function(type, content, alias, matchedStr, greedy) { + this.type = type; + this.content = content; + this.alias = alias; + // Copy of the full string this token was created from + this.length = (matchedStr || "").length|0; + this.greedy = !!greedy; +}; + +Token.stringify = function(o, language, parent) { + if (typeof o == 'string') { + return o; + } + + if (_.util.type(o) === 'Array') { + return o.map(function(element) { + return Token.stringify(element, language, o); + }).join(''); + } + + var env = { + type: o.type, + content: Token.stringify(o.content, language, parent), + tag: 'span', + classes: ['token', o.type], + attributes: {}, + language: language, + parent: parent + }; + + if (o.alias) { + var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias]; + Array.prototype.push.apply(env.classes, aliases); + } + + _.hooks.run('wrap', env); + + var attributes = Object.keys(env.attributes).map(function(name) { + return name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"'; + }).join(' '); + + return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + ''; + +}; + +if (!_self.document) { + if (!_self.addEventListener) { + // in Node.js + return _self.Prism; + } + + if (!_.disableWorkerMessageHandler) { + // In worker + _self.addEventListener('message', function (evt) { + var message = JSON.parse(evt.data), + lang = message.language, + code = message.code, + immediateClose = message.immediateClose; + + _self.postMessage(_.highlight(code, _.languages[lang], lang)); + if (immediateClose) { + _self.close(); + } + }, false); + } + + return _self.Prism; +} + +//Get current script and highlight +var script = document.currentScript || [].slice.call(document.getElementsByTagName("script")).pop(); + +if (script) { + _.filename = script.src; + + if (!_.manual && !script.hasAttribute('data-manual')) { + if(document.readyState !== "loading") { + if (window.requestAnimationFrame) { + window.requestAnimationFrame(_.highlightAll); + } else { + window.setTimeout(_.highlightAll, 16); + } + } + else { + document.addEventListener('DOMContentLoaded', _.highlightAll); + } + } +} + +return _self.Prism; + +})(); + +if (typeof module !== 'undefined' && module.exports) { + module.exports = Prism; +} + +// hack for components to work correctly in node.js +if (typeof global !== 'undefined') { + global.Prism = Prism; +} + + +/* ********************************************** + Begin prism-markup.js +********************************************** */ + +Prism.languages.markup = { + 'comment': //, + 'prolog': /<\?[\s\S]+?\?>/, + 'doctype': //i, + 'cdata': //i, + 'tag': { + pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i, + greedy: true, + inside: { + 'tag': { + pattern: /^<\/?[^\s>\/]+/i, + inside: { + 'punctuation': /^<\/?/, + 'namespace': /^[^\s>\/:]+:/ + } + }, + 'attr-value': { + pattern: /=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i, + inside: { + 'punctuation': [ + /^=/, + { + pattern: /(^|[^\\])["']/, + lookbehind: true + } + ] + } + }, + 'punctuation': /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { + 'namespace': /^[^\s>\/:]+:/ + } + } + + } + }, + 'entity': /&#?[\da-z]{1,8};/i +}; + +Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = + Prism.languages.markup['entity']; + +// Plugin to make entity title show the real entity, idea by Roman Komarov +Prism.hooks.add('wrap', function(env) { + + if (env.type === 'entity') { + env.attributes['title'] = env.content.replace(/&/, '&'); + } +}); + +Prism.languages.xml = Prism.languages.markup; +Prism.languages.html = Prism.languages.markup; +Prism.languages.mathml = Prism.languages.markup; +Prism.languages.svg = Prism.languages.markup; + + +/* ********************************************** + Begin prism-css.js +********************************************** */ + +Prism.languages.css = { + 'comment': /\/\*[\s\S]*?\*\//, + 'atrule': { + pattern: /@[\w-]+?.*?(?:;|(?=\s*\{))/i, + inside: { + 'rule': /@[\w-]+/ + // See rest below + } + }, + 'url': /url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i, + 'selector': /[^{}\s][^{};]*?(?=\s*\{)/, + 'string': { + pattern: /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i, + 'important': /!important\b/i, + 'function': /[-a-z0-9]+(?=\()/i, + 'punctuation': /[(){};:,]/ +}; + +Prism.languages.css['atrule'].inside.rest = Prism.languages.css; + +if (Prism.languages.markup) { + Prism.languages.insertBefore('markup', 'tag', { + 'style': { + pattern: /()[\s\S]*?(?=<\/style>)/i, + lookbehind: true, + inside: Prism.languages.css, + alias: 'language-css', + greedy: true + } + }); + + Prism.languages.insertBefore('inside', 'attr-value', { + 'style-attr': { + pattern: /\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i, + inside: { + 'attr-name': { + pattern: /^\s*style/i, + inside: Prism.languages.markup.tag.inside + }, + 'punctuation': /^\s*=\s*['"]|['"]\s*$/, + 'attr-value': { + pattern: /.+/i, + inside: Prism.languages.css + } + }, + alias: 'language-css' + } + }, Prism.languages.markup.tag); +} + + +/* ********************************************** + Begin prism-clike.js +********************************************** */ + +Prism.languages.clike = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'class-name': { + pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i, + lookbehind: true, + inside: { + punctuation: /[.\\]/ + } + }, + 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, + 'boolean': /\b(?:true|false)\b/, + 'function': /\w+(?=\()/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, + 'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/, + 'punctuation': /[{}[\];(),.:]/ +}; + + +/* ********************************************** + Begin prism-javascript.js +********************************************** */ + +Prism.languages.javascript = Prism.languages.extend('clike', { + 'class-name': [ + Prism.languages.clike['class-name'], + { + pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/, + lookbehind: true + } + ], + 'keyword': [ + { + pattern: /((?:^|})\s*)(?:catch|finally)\b/, + lookbehind: true + }, + /\b(?:as|async|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/ + ], + 'number': /\b(?:(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+)n?|\d+n|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/, + // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444) + 'function': /[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\(|\.(?:apply|bind|call)\()/, + 'operator': /-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/ +}); + +Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/ + +Prism.languages.insertBefore('javascript', 'keyword', { + 'regex': { + pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/, + lookbehind: true, + greedy: true + }, + // This must be declared before keyword because we use "function" inside the look-forward + 'function-variable': { + pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i, + alias: 'function' + }, + 'parameter': [ + { + pattern: /(function(?:\s+[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)[^\s()][^()]*?(?=\s*\))/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/, + inside: Prism.languages.javascript + }, + { + pattern: /(\(\s*)[^\s()][^()]*?(?=\s*\)\s*=>)/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)[^\s()][^()]*?(?=\s*\)\s*\{)/, + lookbehind: true, + inside: Prism.languages.javascript + } + ], + 'constant': /\b[A-Z][A-Z\d_]*\b/ +}); + +Prism.languages.insertBefore('javascript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/, + greedy: true, + inside: { + 'interpolation': { + pattern: /\${[^}]+}/, + inside: { + 'interpolation-punctuation': { + pattern: /^\${|}$/, + alias: 'punctuation' + }, + rest: Prism.languages.javascript + } + }, + 'string': /[\s\S]+/ + } + } +}); + +if (Prism.languages.markup) { + Prism.languages.insertBefore('markup', 'tag', { + 'script': { + pattern: /()[\s\S]*?(?=<\/script>)/i, + lookbehind: true, + inside: Prism.languages.javascript, + alias: 'language-javascript', + greedy: true + } + }); +} + +Prism.languages.js = Prism.languages.javascript; + + +/* ********************************************** + Begin prism-file-highlight.js +********************************************** */ + +(function () { + if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) { + return; + } + + /** + * @param {Element} [container=document] + */ + self.Prism.fileHighlight = function(container) { + container = container || document; + + var Extensions = { + 'js': 'javascript', + 'py': 'python', + 'rb': 'ruby', + 'ps1': 'powershell', + 'psm1': 'powershell', + 'sh': 'bash', + 'bat': 'batch', + 'h': 'c', + 'tex': 'latex' + }; + + Array.prototype.slice.call(container.querySelectorAll('pre[data-src]')).forEach(function (pre) { + // ignore if already loaded + if (pre.hasAttribute('data-src-loaded')) { + return; + } + + // load current + var src = pre.getAttribute('data-src'); + + var language, parent = pre; + var lang = /\blang(?:uage)?-([\w-]+)\b/i; + while (parent && !lang.test(parent.className)) { + parent = parent.parentNode; + } + + if (parent) { + language = (pre.className.match(lang) || [, ''])[1]; + } + + if (!language) { + var extension = (src.match(/\.(\w+)$/) || [, ''])[1]; + language = Extensions[extension] || extension; + } + + var code = document.createElement('code'); + code.className = 'language-' + language; + + pre.textContent = ''; + + code.textContent = 'Loading…'; + + pre.appendChild(code); + + var xhr = new XMLHttpRequest(); + + xhr.open('GET', src, true); + + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + + if (xhr.status < 400 && xhr.responseText) { + code.textContent = xhr.responseText; + + Prism.highlightElement(code); + // mark as loaded + pre.setAttribute('data-src-loaded', ''); + } + else if (xhr.status >= 400) { + code.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText; + } + else { + code.textContent = '✖ Error: File does not exist or is empty'; + } + } + }; + + xhr.send(null); + }); + + if (Prism.plugins.toolbar) { + Prism.plugins.toolbar.registerButton('download-file', function (env) { + var pre = env.element.parentNode; + if (!pre || !/pre/i.test(pre.nodeName) || !pre.hasAttribute('data-src') || !pre.hasAttribute('data-download-link')) { + return; + } + var src = pre.getAttribute('data-src'); + var a = document.createElement('a'); + a.textContent = pre.getAttribute('data-download-link-label') || 'Download'; + a.setAttribute('download', ''); + a.href = src; + return a; + }); + } + + }; + + document.addEventListener('DOMContentLoaded', function () { + // execute inside handler, for dropping Event as argumnet + self.Prism.fileHighlight(); + }); + +})(); diff --git a/docs/_style/prism-master/style.css b/docs/_style/prism-master/style.css new file mode 100644 index 0000000..80a674e --- /dev/null +++ b/docs/_style/prism-master/style.css @@ -0,0 +1,407 @@ +@import url(https://fonts.googleapis.com/css?family=Questrial); +@import url(https://fonts.googleapis.com/css?family=Arvo); + +@font-face { + src: url(https://lea.verou.me/logo.otf); + font-family: 'LeaVerou'; +} + +/* + Shared styles + */ + +section h1, +#features li strong, +header h2, +footer p { + font: 100% Rockwell, Arvo, serif; +} + +/* + Styles + */ + +* { + margin: 0; + padding: 0; + font-weight: normal; +} + +body { + font: 100%/1.5 Questrial, sans-serif; + tab-size: 4; + hyphens: auto; +} + +a { + color: inherit; +} + +section h1 { + font-size: 250%; +} + + section section h1 { + font-size: 150%; + } + + section h1 code { + font-style: normal; + } + + section h1 > a { + text-decoration: none; + } + + section h1 > a:before { + content: '§'; + position: absolute; + padding: 0 .2em; + margin-left: -1em; + border-radius: .2em; + color: silver; + text-shadow: 0 1px white; + } + + section h1 > a:hover:before { + color: black; + background: #f1ad26; + } + +p { + margin: 1em 0; +} + +section h1, +h2 { + margin: 1em 0 .3em; +} + +dt { + margin: 1em 0 0 0; + font-size: 130%; +} + + dt:after { + content: ':'; + } + +dd { + margin-left: 2em; +} + +strong { + font-weight: bold; +} + +code, pre { + font-family: Consolas, Monaco, 'Andale Mono', 'Lucida Console', monospace; + hyphens: none; +} + +pre { + max-height: 30em; + overflow: auto; +} + +pre > code.highlight { + outline: .4em solid red; + outline-offset: .4em; +} + +header, +body > section { + display: block; + max-width: 900px; + margin: auto; +} + +header, footer { + position: relative; + padding: 30px -webkit-calc(50% - 450px); /* Workaround for bug */ + padding: 30px calc(50% - 450px); + color: white; + text-shadow: 0 -1px 2px black; + background: url(img/spectrum.png) fixed; +} + +header:before, +footer:before { + content: ''; + position: absolute; + bottom: 0; left: 0; right: 0; + height: 20px; + background-size: 20px 40px; + background-repeat: repeat-x; + background-image: linear-gradient(45deg, transparent 34%, white 34%, white 66%, transparent 66%), + linear-gradient(135deg, transparent 34%, white 34%, white 66%, transparent 66%); +} + +header { + +} + + header .intro, + html.simple header { + overflow: hidden; + } + + header h1 { + float: left; + margin-right: 30px; + color: #7fab14; + text-align: center; + font-size: 140%; + text-transform: uppercase; + letter-spacing: .25em; + } + + header h2 { + margin-top: .5em; + color: #f1ad26; + } + + header h1 a { + text-decoration: none; + } + + header img { + display: block; + width: 150px; + height: 128px; + margin-bottom: .3em; + border: 0; + } + + header h2 { + font-size: 300%; + } + + header .intro p { + margin: 0; + font: 150%/1.4 Questrial, sans-serif; + font-size: 150%; + } + + #features { + width: 66em; + margin-top: 2em; + font-size: 80%; + } + + #features li { + margin: 0 0 2em 0; + list-style: none; + display: inline-block; + width: 27em; + vertical-align: top; + } + + #features li:nth-child(odd) { + margin-right: 5em; + } + + #features li:before { + content: '✓'; + float: left; + margin-left: -.8em; + color: #7fab14; + font-size: 400%; + line-height: 1; + } + + #features li strong { + display: block; + margin-bottom: .1em; + font-size: 200%; + } + + header .download-button { + float: right; + margin: 0 0 .5em .5em; + } + + #theme { + position: relative; + z-index: 1; + float: right; + margin-right: -1em; + text-align: center; + text-transform: uppercase; + letter-spacing: .2em; + } + + #theme > p { + position: absolute; + left: 100%; + transform: translateX(50%) rotate(90deg) ; + transform-origin: top left; + font-size: 130%; + } + + #theme > label { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 8.5em; + height: 8.5em; + line-height: 1em; + border-radius: 50%; + background: hsla(0,0%,100%,.5); + cursor: pointer; + font-size: 90%; + padding: 0; + } + + #theme > label:before { + content: ''; + position: absolute; + top: 0; right: 0; bottom: 0; left: 0; + z-index: -1; + border-radius: inherit; + background: url(img/spectrum.png) fixed; + } + + #theme > label:nth-of-type(n+2) { + margin-top: -2.5em; + } + + #theme > input:not(:checked) + label:hover { + background: hsla(77, 80%, 60%, .5); + } + + #theme > input { + position: absolute; + clip: rect(0,0,0,0); + } + + #theme > input:checked + label { + background: #7fab14; + } + +footer { + margin-top: 2em; + background-position: bottom; + color: white; + text-shadow: 0 -1px 2px black; +} + + footer:before { + bottom: auto; + top: 0; + background-position: bottom; + } + + footer p { + font-size: 150%; + } + + footer ul { + column-count: 3; + } + +.download-button { + display: block; + padding: .2em .8em .1em; + border: 1px solid rgba(0,0,0,0.5); + border-radius: 10px; + background: #39a1cf; + box-shadow: 0 2px 10px black, + inset 0 1px hsla(0,0%,100%,.3), + inset 0 .4em hsla(0,0%,100%,.2), + inset 0 10px 20px hsla(0,0%,100%,.25), + inset 0 -15px 30px rgba(0,0,0,0.3); + color: white; + text-shadow: 0 -1px 2px black; + text-align: center; + font-size: 250%; + line-height: 1.5; + text-transform: uppercase; + text-decoration: none; + hyphens: manual; +} + +.download-button:hover { + background-color: #7fab14; +} + +.download-button:active { + box-shadow: inset 0 2px 8px rgba(0,0,0,.8); +} + +#toc { + position: fixed; + left: 1%; + max-width: calc(48% - 450px); + font-size: 80%; + opacity: .3; +} + +@media (max-width: 1200px) { + #toc { + display: none; + } +} + +#toc:hover { + opacity: 1; +} + + #toc h1 { + font-size: 180%; + } + + #toc li { + list-style: none; + } + +#logo:before { + content: '☠'; + float: right; + font: 100px/1.6 LeaVerou; +} + +.used-by-logos { + overflow: hidden; +} + .used-by-logos > a { + float: left; + width: 33.33%; + height: 100px; + text-align: center; + background: #F5F2F0; + box-sizing: border-box; + border: 5px solid white; + position: relative; + } + .used-by-logos > a > img { + max-height: 100%; + max-width: 100%; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + +label a.owner { + margin: 0 .5em; +} + +label a.owner:not(:hover) { + text-decoration: none; + color: #aaa; +} + +#languages-list ul { + column-count: 3; +} + #languages-list li { + padding: .2em; + } + #languages-list li[data-id="javascript"] { + border-bottom: 1px solid #aaa; + padding-bottom: 1em; + margin-bottom: 1em; + margin-right: 1em; + } diff --git a/docs/_style/prism-master/templates/footer.html b/docs/_style/prism-master/templates/footer.html new file mode 100644 index 0000000..b0e306a --- /dev/null +++ b/docs/_style/prism-master/templates/footer.html @@ -0,0 +1,15 @@ + +

        Handcrafted with ♥, by Lea Verou, Golmote +& all these awesome people

        + + diff --git a/docs/_style/prism-master/templates/header-download.html b/docs/_style/prism-master/templates/header-download.html new file mode 100644 index 0000000..4e3df4e --- /dev/null +++ b/docs/_style/prism-master/templates/header-download.html @@ -0,0 +1,2 @@ +Download Prism +Customize your download to include only the languages and plugins you need and the compression level you prefer. \ No newline at end of file diff --git a/docs/_style/prism-master/templates/header-main.html b/docs/_style/prism-master/templates/header-main.html new file mode 100644 index 0000000..01fe940 --- /dev/null +++ b/docs/_style/prism-master/templates/header-main.html @@ -0,0 +1,12 @@ +

        Prism

        + +Download + +

        + Prism is a lightweight, extensible syntax highlighter, built with modern web standards in mind. + It’s used in thousands of websites, including some of those you visit daily. +

        + + diff --git a/docs/_style/prism-master/templates/header-plugins.html b/docs/_style/prism-master/templates/header-plugins.html new file mode 100644 index 0000000..45e2aac --- /dev/null +++ b/docs/_style/prism-master/templates/header-plugins.html @@ -0,0 +1,8 @@ +

        Prism plugins

        + +Download + +

        + Prism is a lightweight, extensible syntax highlighter, built with modern web standards in mind. + It’s used in thousands of websites, including some of those you visit daily. +

        diff --git a/docs/_style/prism-master/test-suite.html b/docs/_style/prism-master/test-suite.html new file mode 100644 index 0000000..5aeebf2 --- /dev/null +++ b/docs/_style/prism-master/test-suite.html @@ -0,0 +1,167 @@ + + + + + + +Running the test suite â–² Prism + + + + + + + + + +
        +
        + +

        Running the test suite

        +

        Prism has a test suite, that ensures that the correct tokens are matched.

        +
        + +
        +

        Running the test suite

        + +

        Running the test suite is simple: just call npm test.

        +

        All test files are run in isolation. A new prism instance is created for each test case. This will slow the test runner a bit down, but we can be sure that nothing leaks into the next test case.

        + +
        +

        Running tests for specific languages

        + +

        To run the tests only for one language, you can use the language parameter: npm test -- --language=markup.

        +

        You can even specify multiple languages: npm test -- --language=markup --language=css.

        +
        +
        + +
        +

        Writing tests

        + +

        Thank you for writing tests! Tests are awesome! They ensure, that we can improve the codebase without breaking anything. Also, this way, we can ensure that upgrading Prism is as painless as possible for you.

        +

        You can add new tests by creating a new test case file (with the .test file extension) in the tests directory which is located at /tests/languages/${language}.

        + +
        +

        Language directories

        +

        All tests are sorted into directories in the tests/languages directory. Each directory name encodes, which language you are currently testing.

        +

        All language names must match the names from the definition in components.js.

        + +

        Example 1: testing a language in isolation (default use case)

        +

        Just put your test file into the directory of the language you want to test.

        +

        So, if you want to test CSS, put your test file in /tests/languages/css to test CSS only. If you create a test case in this directory, the test runner will ensure that the css language definition including all required language definitions are correctly loaded.

        + +

        Example 2: testing language injection

        +

        If you want to test language injection, you typically need to load two or more languages where one language is the “main†language that is being tested, with all other languages being injected into it.

        +

        You need to define multiple languages by separating them using a + sign: markup+php.

        +

        The languages are loaded in order, so first markup (+ dependencies) is loaded, then php (+ dependencies). The test loader ensures that no language is loaded more than once (for example if two languages have the same dependencies).

        +

        By default the last language is the main language: php+markup will have markup as main language. This is equal to putting your code in the following code block:

        +
        ...
        +<pre><code class="language-markup">
        +	<!-- your code here -->
        +</code><pre>
        +...
        + +

        If you need to load the languages in a given order, but you don't want to use the last language as main language, you can mark the main language with an exclamation mark: php!+markup. This will use php as main language. (You can only define one main language. The test runner will fail all tests in directories with more than one main language.)

        + +

        Note: by loading multiple languages you can do integration tests (ensure that loading two or more languages together won't break anything).

        +
        + +
        +

        Creating your test case file

        +

        At first you need to create a new file in the language directory, you want to test.

        +

        Use a proper name for your test case. Please use one case of the following conventions:

        +
          +
        • issue{issueid}: reference a github issue id (example: issue588.test).
        • +
        • {featurename}_feature: group all tests to one feature in one file (example: string_interpolation_feature.test).
        • +
        • {language}_inclusion: test inclusion of one language into the other (example: markup!+css/css_inclusion.test will test CSS inclusion into markup).
        • +
        +

        You can use all conventions as a prefix, so string_interpolation_feature_inline.test is possible. But please take a minute or two to think of a proper name of your test case file. You are writing code not only for the computers, but also for your fellow developers.

        +
        + +
        +

        Writing your test

        +

        The structure of a test case file is as follows:

        +
        
        +... language snippet...
        +----
        +... the simplified token stream you expect ...
        + +

        Your file is built up of two or three sections, separated by ten or more dashes -, starting at the begin of the line:

        +
          +
        1. Your language snippet. The code you want to compile using Prism. (required)
        2. +
        3. The simplified token stream you expect. Needs to be valid JSON. (required)
        4. +
        5. A comment explaining the test case. (optional)
        6. +
        +

        The easiest way would be to look at an existing test file:

        +
        var a = 5;
        +
        +----------------------------------------------------
        +
        +[
        +	["keyword", "var"],
        +	" a ",
        +	["operator", "="],
        +	["number", "5"],
        +	["punctuation", ";"]
        +]
        +
        +----------------------------------------------------
        +
        +This is a comment explaining this test case.
        +
        + +
        +

        Explaining the simplified token stream

        +

        While compiling, Prism transforms your source code into a token stream. This is basically a tree of nested tokens (or arrays, or strings).

        +

        As these trees are hard to write by hand, the test runner uses a simplified version of it.

        +

        It uses the following rules:

        +
          +
        • Token objects are transformed into an array: [token.type, token.content] (whereas token.content can be a nested structure).
        • +
        • All strings that are either empty or only contain whitespace, are removed from the token stream.
        • +
        • All empty structures are removed.
        • +
        +

        For further information: reading the tests of the test runner (tests/testrunner-tests.js) will help you understand the transformation.

        +
        +
        + +
        +

        Writing specific tests

        + +

        Sometimes, using the token stream tests is not powerful enough. By creating a test file with the file extension .js instead of .test, you can make Prism highlight arbitrary pieces of code and check their HTML results.

        +

        The language is determined by the folder containing the test file lies, as explained in the previous section.

        +

        The structure of your test file will look like this, for example:

        +
        module.exports = {
        +	'&#x278a;': '<span class="token entity" title="&#x278a;">&amp;#x278a;</span>',
        +	'&#182;': '<span class="token entity" title="&#182;">&amp;#182;</span>',
        +};
        +

        The keys are the codes which will be highlighted by Prism. The values are the expected results, as HTML.

        +
        + +
        +

        Test runner tests

        +

        The test runner itself is tested in a separate test case. You can find all “test core†related tests in tests/testrunner-tests.js.

        +

        You shouldn't need to touch this file ever, except you modify the test runner code.

        +
        + +
        +

        Internal structure

        +

        The global test flow is at follows:

        +
          +
        1. Run all internal tests (test the test runner).
        2. +
        3. Find all language tests.
        4. +
        5. Run all language tests individually.
        6. +
        7. Report the results.
        8. +
        +
        + + +
        + + + + + + + + + diff --git a/docs/_style/prism-master/test.html b/docs/_style/prism-master/test.html new file mode 100644 index 0000000..e28cce1 --- /dev/null +++ b/docs/_style/prism-master/test.html @@ -0,0 +1,203 @@ + + + + + + +Test drive â–² Prism + + + + + + + + + + +
        +
        + +

        Test drive

        +

        Take Prism for a spin!

        +
        + +
        +
        +

        + +

        + +

        Result:

        +
        + +

        + Language: +

        +
        +
        + +
        + + + + + + + + + + + diff --git a/docs/_style/prism-master/tests/helper/prism-loader.js b/docs/_style/prism-master/tests/helper/prism-loader.js new file mode 100644 index 0000000..3257485 --- /dev/null +++ b/docs/_style/prism-master/tests/helper/prism-loader.js @@ -0,0 +1,131 @@ +"use strict"; + +var fs = require("fs"); +var vm = require("vm"); +var components = require("../../components"); +var languagesCatalog = components.languages; + + +module.exports = { + + /** + * Creates a new Prism instance with the given language loaded + * + * @param {string|string[]} languages + * @returns {Prism} + */ + createInstance: function (languages) { + var context = { + loadedLanguages: [], + Prism: this.createEmptyPrism() + }; + + context = this.loadLanguages(languages, context); + + return context.Prism; + }, + + /** + * Loads the given languages and appends the config to the given Prism object + * + * @private + * @param {string|string[]} languages + * @param {{loadedLanguages: string[], Prism: Prism}} context + * @returns {{loadedLanguages: string[], Prism: Prism}} + */ + loadLanguages: function (languages, context) { + if (typeof languages === 'string') { + languages = [languages]; + } + + var self = this; + + languages.forEach(function (language) { + context = self.loadLanguage(language, context); + }); + + return context; + }, + + /** + * Loads the given language (including recursively loading the dependencies) and + * appends the config to the given Prism object + * + * @private + * @param {string} language + * @param {{loadedLanguages: string[], Prism: Prism}} context + * @returns {{loadedLanguages: string[], Prism: Prism}} + */ + loadLanguage: function (language, context) { + if (!languagesCatalog[language]) { + throw new Error("Language '" + language + "' not found."); + } + + // the given language was already loaded + if (-1 < context.loadedLanguages.indexOf(language)) { + return context; + } + + // if the language has a dependency -> load it first + if (languagesCatalog[language].require) { + context = this.loadLanguages(languagesCatalog[language].require, context); + } + + // load the language itself + var languageSource = this.loadFileSource(language); + context.Prism = this.runFileWithContext(languageSource, {Prism: context.Prism}).Prism; + context.loadedLanguages.push(language); + + return context; + }, + + + /** + * Creates a new empty prism instance + * + * @private + * @returns {Prism} + */ + createEmptyPrism: function () { + var coreSource = this.loadFileSource("core"); + var context = this.runFileWithContext(coreSource); + return context.Prism; + }, + + + /** + * Cached file sources, to prevent massive HDD work + * + * @private + * @type {Object.} + */ + fileSourceCache: {}, + + + /** + * Loads the given file source as string + * + * @private + * @param {string} name + * @returns {string} + */ + loadFileSource: function (name) { + return this.fileSourceCache[name] = this.fileSourceCache[name] || fs.readFileSync(__dirname + "/../../components/prism-" + name + ".js", "utf8"); + }, + + + /** + * Runs a VM for a given file source with the given context + * + * @private + * @param {string} fileSource + * @param {*} [context] + * + * @returns {*} + */ + runFileWithContext: function (fileSource, context) { + context = context || {}; + vm.runInNewContext(fileSource, context); + return context; + } +}; diff --git a/docs/_style/prism-master/tests/helper/test-case.js b/docs/_style/prism-master/tests/helper/test-case.js new file mode 100644 index 0000000..cbf51a9 --- /dev/null +++ b/docs/_style/prism-master/tests/helper/test-case.js @@ -0,0 +1,196 @@ +"use strict"; + +var fs = require("fs"); +var assert = require("chai").assert; +var PrismLoader = require("./prism-loader"); +var TokenStreamTransformer = require("./token-stream-transformer"); + +/** + * Handles parsing of a test case file. + * + * + * A test case file consists of at least two parts, separated by a line of dashes. + * This separation line must start at the beginning of the line and consist of at least three dashes. + * + * The test case file can either consist of two parts: + * + * {source code} + * ---- + * {expected token stream} + * + * + * or of three parts: + * + * {source code} + * ---- + * {expected token stream} + * ---- + * {text comment explaining the test case} + * + * If the file contains more than three parts, the remaining parts are just ignored. + * If the file however does not contain at least two parts (so no expected token stream), + * the test case will later be marked as failed. + * + * + * @type {{runTestCase: Function, transformCompiledTokenStream: Function, parseTestCaseFile: Function}} + */ +module.exports = { + + /** + * Runs the given test case file and asserts the result + * + * The passed language identifier can either be a language like "css" or a composed language + * identifier like "css+markup". Composed identifiers can be used for testing language inclusion. + * + * When testing language inclusion, the first given language is the main language which will be passed + * to Prism for highlighting ("css+markup" will result in a call to Prism to highlight with the "css" grammar). + * But it will be ensured, that the additional passed languages will be loaded too. + * + * The languages will be loaded in the order they were provided. + * + * @param {string} languageIdentifier + * @param {string} filePath + */ + runTestCase: function (languageIdentifier, filePath) { + var testCase = this.parseTestCaseFile(filePath); + var usedLanguages = this.parseLanguageNames(languageIdentifier); + + if (null === testCase) { + throw new Error("Test case file has invalid format (or the provided token stream is invalid JSON), please read the docs."); + } + + var Prism = PrismLoader.createInstance(usedLanguages.languages); + // the first language is the main language to highlight + var mainLanguageGrammar = Prism.languages[usedLanguages.mainLanguage]; + var env = { + code: testCase.testSource, + grammar: mainLanguageGrammar, + language: usedLanguages.mainLanguage + }; + Prism.hooks.run('before-tokenize', env); + env.tokens = Prism.tokenize(env.code, env.grammar); + Prism.hooks.run('after-tokenize', env); + var compiledTokenStream = env.tokens; + + var simplifiedTokenStream = TokenStreamTransformer.simplify(compiledTokenStream); + + var tzd = JSON.stringify( simplifiedTokenStream ); var exp = JSON.stringify( testCase.expectedTokenStream ); + var i = 0; var j = 0; var diff = ""; + while ( j < tzd.length ){ if (exp[i] != tzd[j] || i == exp.length) diff += tzd[j]; else i++; j++; } + + // var message = "\nToken Stream: \n" + JSON.stringify( simplifiedTokenStream, null, " " ) + + var message = "\nToken Stream: \n" + tzd + + "\n-----------------------------------------\n" + + "Expected Token Stream: \n" + exp + + "\n-----------------------------------------\n" + diff; + + var result = assert.deepEqual(simplifiedTokenStream, testCase.expectedTokenStream, testCase.comment + message); + }, + + + /** + * Parses the language names and finds the main language. + * + * It is either the last language or the language followed by a exclamation mark “!â€. + * There should only be one language with an exclamation mark. + * + * @param {string} languageIdentifier + * + * @returns {{languages: string[], mainLanguage: string}} + */ + parseLanguageNames: function (languageIdentifier) { + var languages = languageIdentifier.split("+"); + var mainLanguage = null; + + languages = languages.map( + function (language) { + var pos = language.indexOf("!"); + + if (-1 < pos) { + if (mainLanguage) { + throw "There are multiple main languages defined."; + } + + mainLanguage = language.replace("!", ""); + return mainLanguage; + } + + return language; + } + ); + + if (!mainLanguage) { + mainLanguage = languages[languages.length-1]; + } + + return { + languages: languages, + mainLanguage: mainLanguage + }; + }, + + + /** + * Parses the test case from the given test case file + * + * @private + * @param {string} filePath + * @returns {{testSource: string, expectedTokenStream: Array.>, comment:string?}|null} + */ + parseTestCaseFile: function (filePath) { + var testCaseSource = fs.readFileSync(filePath, "utf8"); + var testCaseParts = testCaseSource.split(/^-{10,}\w*$/m); + + try { + var testCase = { + testSource: testCaseParts[0].trim(), + expectedTokenStream: JSON.parse(testCaseParts[1]), + comment: null + }; + + // if there are three parts, the third one is the comment + // explaining the test case + if (testCaseParts[2]) { + testCase.comment = testCaseParts[2].trim(); + } + + return testCase; + } + catch (e) { + // the JSON can't be parsed (e.g. it could be empty) + return null; + } + }, + + /** + * Runs the given pieces of codes and asserts their result. + * + * Code is provided as the key and expected result as the value. + * + * @param {string} languageIdentifier + * @param {object} codes + */ + runTestsWithHooks: function (languageIdentifier, codes) { + var usedLanguages = this.parseLanguageNames(languageIdentifier); + var Prism = PrismLoader.createInstance(usedLanguages.languages); + // the first language is the main language to highlight + + for (var code in codes) { + if (codes.hasOwnProperty(code)) { + var env = { + element: {}, + language: usedLanguages.mainLanguage, + grammar: Prism.languages[usedLanguages.mainLanguage], + code: code + }; + Prism.hooks.run('before-highlight', env); + env.highlightedCode = Prism.highlight(env.code, env.grammar, env.language); + Prism.hooks.run('before-insert', env); + env.element.innerHTML = env.highlightedCode; + Prism.hooks.run('after-highlight', env); + Prism.hooks.run('complete', env); + assert.equal(env.highlightedCode, codes[code]); + } + } + } +}; diff --git a/docs/_style/prism-master/tests/helper/test-discovery.js b/docs/_style/prism-master/tests/helper/test-discovery.js new file mode 100644 index 0000000..b2aade1 --- /dev/null +++ b/docs/_style/prism-master/tests/helper/test-discovery.js @@ -0,0 +1,115 @@ +"use strict"; + +var fs = require("fs"); +var path = require("path"); + + +module.exports = { + + /** + * Loads the list of all available tests + * + * @param {string} rootDir + * @returns {Object.} + */ + loadAllTests: function (rootDir) { + var testSuite = {}; + var self = this; + + this.getAllDirectories(rootDir).forEach( + function (language) { + testSuite[language] = self.getAllFiles(path.join(rootDir, language)); + } + ); + + return testSuite; + }, + + /** + * Loads the list of available tests that match the given languages + * + * @param {string} rootDir + * @param {string|string[]} languages + * @returns {Object.} + */ + loadSomeTests: function (rootDir, languages) { + var testSuite = {}; + var self = this; + + this.getSomeDirectories(rootDir, languages).forEach( + function (language) { + testSuite[language] = self.getAllFiles(path.join(rootDir, language)); + } + ); + + return testSuite; + }, + + + /** + * Returns a list of all (sub)directories (just the directory names, not full paths) + * in the given src directory + * + * @param {string} src + * @returns {Array.} + */ + getAllDirectories: function (src) { + return fs.readdirSync(src).filter( + function (file) { + return fs.statSync(path.join(src, file)).isDirectory(); + } + ); + }, + + /** + * Returns a list of all (sub)directories (just the directory names, not full paths) + * in the given src directory, matching the given languages + * + * @param {string} src + * @param {string|string[]} languages + * @returns {Array.} + */ + getSomeDirectories: function (src, languages) { + var self = this; + return fs.readdirSync(src).filter( + function (file) { + return fs.statSync(path.join(src, file)).isDirectory() && self.directoryMatches(file, languages); + } + ); + }, + + /** + * Returns whether a directory matches one of the given languages. + * @param {string} directory + * @param {string|string[]} languages + */ + directoryMatches: function (directory, languages) { + if (!Array.isArray(languages)) { + languages = [languages]; + } + var dirLanguages = directory.split(/!?\+!?/); + return dirLanguages.some(function (lang) { + return languages.indexOf(lang) >= 0; + }); + }, + + + /** + * Returns a list of all full file paths to all files in the given src directory + * + * @private + * @param {string} src + * @returns {Array.} + */ + getAllFiles: function (src) { + return fs.readdirSync(src).filter( + function (fileName) { + return fs.statSync(path.join(src, fileName)).isFile(); + } + ).map( + function (fileName) { + return path.join(src, fileName); + } + ); + } +}; diff --git a/docs/_style/prism-master/tests/helper/token-stream-transformer.js b/docs/_style/prism-master/tests/helper/token-stream-transformer.js new file mode 100644 index 0000000..deb831c --- /dev/null +++ b/docs/_style/prism-master/tests/helper/token-stream-transformer.js @@ -0,0 +1,32 @@ +"use strict"; + + +module.exports = { + /** + * Simplifies the token stream to ease the matching with the expected token stream. + * + * * Strings are kept as-is + * * In arrays each value is transformed individually + * * Values that are empty (empty arrays or strings only containing whitespace) + * + * + * @param {Array} tokenStream + * @returns {Array.} + */ + simplify: function (tokenStream) { + if (Array.isArray(tokenStream)) { + return tokenStream + .map(this.simplify.bind(this)) + .filter(function (value) { + return !(Array.isArray(value) && !value.length) && !(typeof value === "string" && !value.trim().length); + } + ); + } + else if (typeof tokenStream === "object") { + return [tokenStream.type, this.simplify(tokenStream.content)]; + } + else { + return tokenStream; + } + } +}; diff --git a/docs/_style/prism-master/tests/languages/abap/comment_feature.test b/docs/_style/prism-master/tests/languages/abap/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e0f28feba3d7df45f10f21bcda3873189760a09f GIT binary patch literal 201 zcmdPm<Q4a&bm0CFkenrskC>=_n{^DaGnwh(Rq&PYwpE>=j(FH(S7S*!;Dtc5C9 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/abap/eol-comment_feature.test b/docs/_style/prism-master/tests/languages/abap/eol-comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f29fc84a5d3e1054e6cc062793fec3d5818c4e07 GIT binary patch literal 215 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 J@4x=j{{i-fA0+?) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/abap/number_feature.test b/docs/_style/prism-master/tests/languages/abap/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0c9556e708b4621d81a1ef7dd826dd0c46d78957 GIT binary patch literal 224 zcmXruToQ5QW#VSd5X7V^$y= zoi`y|PB4K@(2Zz?53V(D{C3P_Xg8I?RA0!}Zf$U>=vB#r-Dz`o$d^~FdL+6ILp&Do z;kL8KD*2S^{7l0W&d;h}2D|jxno+X(&yTp;>U!tl)jIh0-e>T`a}UZiaBr^9DS6py m*lX3qF9(ec;I(_#9<14aK&5Ndc@07P5bIssx%P0-P5ueTwey(( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/abap/string-template_feature.test b/docs/_style/prism-master/tests/languages/abap/string-template_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7979fbefa069ef7119334f36d449ba47dda2a77a GIT binary patch literal 539 zcmb_ZF%H8Z44jL^A1u$IpXf871F1+`r411<75IBhP&TrlA`2Ov@37BlvUb!iah51k zX;e|?;|UQ6gG~32DmW7zr|=|a7m2~nW)XHZP6z9708DrvK%x)sy*x!Q-}R$|DM)Rr z!fjrUq$&gM6aHHn&IBU?)GF>yVo6&@2!0uTd*p;Sx)P#DPO<Q4a&bm06_*rc=A|p? zC@86`E5+)di-FvMT{s5fFigpW1T118hhrCxf%rrzmX`~N$oGzOMrv|)u|isYkpjd| G#d-kBMNU5e literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/actionscript/keyword_feature.test b/docs/_style/prism-master/tests/languages/actionscript/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c41a8524e5f95a1cc67505bee4924cff5b8ecfee GIT binary patch literal 2895 zcmbuBL2l$A5JlHx$#+0rXXXN4&M{h95L}K?(_jJa9^Za`(M}eTB7M(zflK&RbwNYb zw`DYMS?qN*&KA+Jx&^ObOBwslrC91{CYkLPnh~S|o6=|`z@hKtPn9?!&g`QNVTX}2 zhAq14Qyh(-LHXMnidHsm^HabbO+Ewywokndo;$apZ(N=%Q&qjG**g^oY zT6eYYm|U~JTTN=ssfw#I!Q9@0ccaNtw;Vy2Z53oy9=@%wE*iEjIU!)pJBYfkEsIUJ z;cfxnlSin>;)7-cPi)MzM|;!AVs)R|nn&|46@-s2Y?G#GZ&Hw7GoP8KyX5TkV`(f_ zT@j}5`tIjHJnDDpyC0X~D*GelX?QV%EyL@JxeTjr{f77{>hy@&uW0+vXBy+0Jd1)$!$(=>`DgV$!5>AQ_h`L<#-A;N##>|I>DGT} zT-($M7~PDg^UkxaHPSdbD9xhL@+|r>4Y#(<(`fEAd}sigSE)e5t(wy`ga^$Y@`UC; sRm=$w6+1Nkp^0b*NGG0c0_!`x?_U2$di`F+U5g4`1IcR+4OV{r1&Re`qW}N^ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/actionscript/operator_feature.test b/docs/_style/prism-master/tests/languages/actionscript/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..14c007c75bb0dbf73728364cbc267550d6dbaebd GIT binary patch literal 1107 zcmbW0L2AP=5JlG&=nmfoYhgw81vE;a#|SZml2T~E!O2qO>=^~R2=iC5$9VMoXTHFi zh=dUn2F%_?K@yCDNiYaz@h%_)RMe`eXfCK4Rlj89jDpgl=u&hoC>qbFsH8(D(7UD5 z-kRL8#ZIjvQu5Bb^v2cd_TGK$`{i<4kGEy*H|S%3*x(fRV%BF*?z=Xe>W*-tkOMZTb&6jR#qr$&}=-D{pd*~JsB$$KB;l) yY|oCAGt`*vCsazcck8{iXvb_K8w{Nc?=;>Yz^~ua_umyi%ZlUqjQ>fzem($i86F$} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ada/attr-name_feature.test b/docs/_style/prism-master/tests/languages/ada/attr-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c30a2f57d232adc0c7d11844e16237b019f3e8ad GIT binary patch literal 275 zcmeawD@jdHEm9B8tV-qOa?VIBN=z;R^1~8yc)57Fbjbi9ebKyJoY6{UiA9--Nja%X zItogj5Q~&zbrhnN5=%;obn_B(!7^aGf#Mii;I6@@3FttjSY9q5BHxwH8L7$H#R_Tp QMG7DnWhRxDq!#M|0G(<>)Bpeg literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ada/boolean_feature.test b/docs/_style/prism-master/tests/languages/ada/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4019c444f8b53c40620226d2914ad19fd46effee GIT binary patch literal 201 zcmXRZDoy3(N=wWs22#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H<8xk|A*=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040MAk^8UO$Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ada/char_feature.test b/docs/_style/prism-master/tests/languages/ada/char_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..145f2cee8b6e7f3a53fe2ab63cfd18e3be28d7f7 GIT binary patch literal 186 zcmY#SQ|IMUcLWl=T)JcckiKYMF3xDBk`VRdCDCS4c`M;^hMINCzN&(Y#!o(Mrkrxw)x%B}zI9O1ipAu{xN7FuRmu adAWdyd<&g3Qj@cb71HvH6ri>i>j40SqbpYc literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ada/keyword_feature.test b/docs/_style/prism-master/tests/languages/ada/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e5c815f22f653fc6be3a7ca323e0528ef8fdd53e GIT binary patch literal 2409 zcmbW2L2lbH5JlG&pgR~|r@2Iq5oAGAV|ieSREJb-_w@Zk$w-0zZW08f^gf65*qlG% zl&$t%IF&Y33(;R=lx3fbE0cyIgFj3dl0TV+2PUjK$*2ia9snX1V$7-3kRT2cr(i&X zOdf!#2246?#m+T1{vNY9x3BuUi}D0lx%nq9psc0Omru%@`dQIeR( zz8iDJrXKE}N>dd(hlmpt=S@0m^-QLmm%f`b9#h6{Y4y}HqH?{6VQF50^QV~UplR&8 zCB$nOvC(2-oRP$0`Wb2iIm)nlnv3Nsu^nMSJuwT(gG^#JoMtlnkislD#N^j1Ym;%3 zFE277-sdG)+r8x3`Fg64#UCCiUMwg5?RnHNj@w+WcoUm7wJ2nP^tX^TRYi8I?|*Cj zcG1aSv|jq|?%!nJ{rtwC$G!L6kN4wM9ycU-d^sG0U#jEB%fGyE+O8dw+CBV_Q0Qjc zO=Tg|#Aq5A^~=pT%c@;}ve@f^U@s7c_lhCXUP4qsO>tfWD;!IZxm3X!)CLxpl>_}PP)hUUXC8XLi_Z81)L$r~G4 i+&UfOXnh2u7al+Q4*%b8h;J8(*K&XX9rmtRUjG1L9K9C+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ada/number_feature.test b/docs/_style/prism-master/tests/languages/ada/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a27f1af82c908b4dcd4b9e34a8a3075a07b17d10 GIT binary patch literal 368 zcmXpp;^i_iiZ?JY;N>#bGc<`eG>y09(DLW;m z#JeRXrz*SZ8XLtM@^bNV>5>6J`l5NcIHQ&FN^_G^i|%wq{2~R2FN^g6GvH5| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ada/operator_feature.test b/docs/_style/prism-master/tests/languages/ada/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..21a313746d60ba519f0378c03aa22e44be669b35 GIT binary patch literal 492 zcmbV|F$%*l3`OS(bcc_J3{G6{LDte^gbbym6gs##y+5^w4y`psm_Iz8W&A~%l44Fw z0;#FcnhCMyfDwVo!+S&~rf^`|y@lztxcu76^_`2G;6&Xzbu=}KUvo~DDZMDBXlztd pZ1C^tXo^EGjy(z$b^r6d=M5I!%2dzs!Y_~Q_S|vL1>e^9^9Kyrb!z|s literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ada/string_feature.test b/docs/_style/prism-master/tests/languages/ada/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c44e9cd0171099d4e51b75654baa1b5d51035a55 GIT binary patch literal 216 zcmY#V;^k6u%g&EJ@|%O3TlWPf9E@G2-Ro<Q4a&bm0l_eHsCMM;iD(NUFIROn&CA6Zt(2Ufo12-fBX5_ zafp+ahKy5vMIy1^7r*y;w&T2)!=qVx8J_Xz+8;B16!;`To*yvzZ~xWS=Al#NfNtph zYRUy;61OHin#Jh;wnac^2Vok%oZc$(Ui6ZtH#paB>VfWKpEH_9{1#zn&MsmyVTqG4 zI^#@<Bovtq*9s zyc7Ii@k|F2JENef1kUh6b8t@fy zcD1wpHcHa%U8S_|fyTaf%sfA2=$BJAeM9J_@<4YhmeXiF6LFkIf~P!?y5fA-Gr zITS(iMU(rgX>_bbnx1GcnfqOl<9RRmXJUvMn)?F9VMa0fyHLb^2PkqYta^64pjU17KA^^k!Cg z{54z{;=S(w77XpYEfIODEy{Rnwst*8Z|#9z#J5rrNBO)(@+*s^{V!|_j;{a! literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apacheconf/directive-flags_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/directive-flags_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0bb206ecba91ca90fcc5960c9defb5413241f1c7 GIT binary patch literal 228 zcma#{4~pgGiuTb740Z%Ec)4`R03dzQyj+~oN-3E|smUdoWvRMpIf?1TN;(Qk(LfuN iVs&szL#$Q;T27Ju&Kar6*~JQJ`9%tFM<{?Dp$7m3?KCR@ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apacheconf/directive-inline_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/directive-inline_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6b4df43b26d2dcb50355274e46e9fb7ce444161e GIT binary patch literal 35174 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apacheconf/string_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d2849caf0b5b862a1681cef9af7f53de16e1e7d4 GIT binary patch literal 370 zcmY#N%gjR<30R?Lu!GNyj;3u0Fb_DUM|jPrQ(vJ z%)E3Z9R(1VQz=FXYFUgD&~VP!SRHJt;4Z?W2510CFVKpz#G=f^q?}ZsCFt%48xOJ- xVh}G^EG0g2&PYwpE>=j(FH(Sbt5}bh%Q2@oUm+PG19MHWLS|lZW=bktDF7M;R_Oo$ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apacheconf/variable_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..025fe75b7a93f4eec31be233fa7c2679c7821057 GIT binary patch literal 266 zcmY!>$S*44 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apl/assignment_feature.test b/docs/_style/prism-master/tests/languages/apl/assignment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b06cb39b2b992eb18eb80493c11f30023c9752fb GIT binary patch literal 239 zcmYd%)HcCT!AQZFmy4H6mka>X7tPDXsg$Us1Eivr5{rv7)AMpu^GcL-6qJC*E5$-2 u@=9})Qj0)>hCm^OXeESz5xRh}QY|%wq{2~Q}i}V0K>ovsy literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apl/comment_feature.test b/docs/_style/prism-master/tests/languages/apl/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a308451082d0ea28a70a2ad92dd59eae59200ed2 GIT binary patch literal 272 zcmaFVJC~R1QSV#@xBUF1#3EiUWkvnc;v)T|%sl$wj)D@Q4a&bm0CFkcAmn7zuDCsCDJ?dSf u6svdk*^4;s4k(!)ctdN#pqyTetu^s?7$VVjr literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apl/dfn_feature.test b/docs/_style/prism-master/tests/languages/apl/dfn_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ef4be35c77b3a73617aaf8b2c625c430877554e5 GIT binary patch literal 442 zcmb<6uzl3K1&nrCsb{3-JnC*yc+}B;XvL%6t+l*dyj;3u0Fb_DUM|jPrIfTh zB^?E&YNc2mFh8#}Hz~CUBxC>+N-NDvF3HRXtFy%>2y`IXJLn~miF!jA# g(L`#MVtKiMi2Sg0&PYwpE>=j(FH&$x%PZCc0FCK({Qv*} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apl/dyadic-operator_feature.test b/docs/_style/prism-master/tests/languages/apl/dyadic-operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bd141edef64f82060c48ec918934a7525171d14e GIT binary patch literal 406 zcmdN>c+|TXh!^m3J?dSe@Tg;k!lRxYyj%`IY8NjTFPAPE0HiOPmy0u6DWx(oB{Nw! zzaX_Ju_V7pNk>6RPbpSM0jmtqC3xf(0OfF*33NJcogFi9%k}KQW2yrleY=!mdAWdy Z`~Y&!NKMWzR!GY)QhVxk!=ht3V9we13l5o!QAqTF#N254IJDp2T4wu{V=CQoWN{e@Q{ElVmJ$)Rhzz z-?o*N*q=*I^0?xEAbCej5K{mT7Wx32HDYC34SX#T3*c>H^@+t^TzsyPhDV8m5fUGX z>PxH!04+otAW&Fz5*ZwI7x9+RIVgTt4-vft%mAiHnur#Fk7v;vEL0>Xs1|FQ(m_&@~Z`B=roBL>r6<)IK#(eWFzZ0)rNVZR#2*rtMH|$ZDlY>te)E zgMc(8rV#lDddOgpyOPt4QN|3K3?{o}P7|L^6TP8YMTXRgJ*&dL*cRTG57OI*`_fZQ M%GGE2ou;*$ADn|P)c^nh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apl/monadic-operator_feature.test b/docs/_style/prism-master/tests/languages/apl/monadic-operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0dcc9b088cec0edf9b92428d7acc8c3ae20d75a9 GIT binary patch literal 443 zcma!1&{ufWvtQv+Zv!vap%p+HhR8Il#ml8j1_0@c=H=pyR?5xKOH9d3 z*3BP9Biq%oTE~k%M3g}EclD!Q;Nt{+5T7ge1KFOYK_{>$qV{FG# frC44rAR<2uoikFCvx^nd@{1Ip0jU5B$YMPJc;$n9 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apl/number_feature.test b/docs/_style/prism-master/tests/languages/apl/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..815d1ca8b096d8a06d91d1e3bf36bbf27c88497c GIT binary patch literal 420 zcmXpp;^i{dGc++YwdCbGv>wQN)G-ezSW{0wVH*#5p51IlEXPEx$+s5-!Dh04AJd2><{9 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apl/statement_feature.test b/docs/_style/prism-master/tests/languages/apl/statement_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..24c68744e18b707a4bdd8a1f62bcc458208e7d4e GIT binary patch literal 209 zcmcC=OycFTa?8(mN-W~#;^opM1Az2J^Kx-UD;1X{mZavU=9MVvC@5JuCMm`0U=fGd crWDJ|1w`aq>70?8oL#JtmS3a*x3^di0L%6+0{{R3 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apl/string_feature.test b/docs/_style/prism-master/tests/languages/apl/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8bc8dd1bbfe8b58ba23b49dc41d95672a7eede90 GIT binary patch literal 240 zcmY#a=jBpQ%g;|rEP}Aq)uC)&E?qJJFBdOYG%putv{G?NQD$Dcl8%Csy1G)V4!RiB hPOLIeHz>vOasd(f4sp&%P0lV>NXsu$fVieu4*=t)G=l&D literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/apl/system-function_feature.test b/docs/_style/prism-master/tests/languages/apl/system-function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..81cbcaa11166a3bbaf45661d02044d38c529da4b GIT binary patch literal 309 zcmaFVH`UXhm+MjA)Nn^IhkdC4W2 z`FTn@3Q9nmJpGkob@0fCJK~pj4#F=Fa=TJ2FBcGz?*ZqG)a2}9g|z%41&A*cV7@5U F0|3VXRN(*s literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/applescript/class_feature.test b/docs/_style/prism-master/tests/languages/applescript/class_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..547906deabc9fdfca144e78a47cd16af178362ac GIT binary patch literal 1955 zcmbVN&5qk35Iz^l?=bRt+lS~%t*RcnYA=;mdmv!ofNOJ4HOA2WLZsX*uuE59;aL zk1s#7d{7>>1CM6*ds+_YaWXil@1H-CKR1(hFy3AwMEn!M;1ul{qelu?_UHo~5Gkyk z%!vfA*3CtyY?DesXra@f&Xiq%zuNEV5PmJ%Q^w>4%KpkpizHtKVVBjMT~}caP&7*% zv+S&?iRU63B>85YoC>_E4try8q}cPzu}kco(J{rdCc4yA7Ipp zUgOIHTw@#AgrrbUpzN&mvC@)M+klCs!ai|UK!w2qO?(y*vzx#+%0~81l(;XPa3^$N z>5I-oZIe#IT_YT&9um;nMMTCs5~7cgBytke*2y##np+p$7WBTE-$I)^s|%TXSg7VM z=rl_kmc*|a);4#43$47*x5#VS?WJte`<7`=h$4#F?OM3?|MPBgqzLD1f8#1xP~Wkw zqz;_^imIrukwv%bD1%C5$78Dpd*3|Lgl3*M g$~y`?HpiDi(f{qU^YMh{mA-qk2b%Z%0mks*AG!2s+W-In literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/applescript/comment_feature.test b/docs/_style/prism-master/tests/languages/applescript/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d823ba429a69e95d5be05b89c22a4eae2c3adb53 GIT binary patch literal 405 zcmbV|!3x4K42I7J@(!V1Tv_)H;$v((%$n)2YoYCYep}`?5b>~5X!7Sz_)?{)caE-| zM>uZbN#+s1VL3IMQ2}OK!t2HspG; J9AcVMy#f9^Wy=5n literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/applescript/keyword_feature.test b/docs/_style/prism-master/tests/languages/applescript/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bde63a16c1fac951fd155c1db6ad55da4daf7288 GIT binary patch literal 2742 zcmbVO!E&Q83_UM1{DUUvZhvAwqtk;40z4%)Yn#yg{XUr_(<1Gq9cr8>AxpBQXV=BG zkn7@=$qj`QxzYKMOWU}`r9wlB7tB*!Lyvd%JwLEQojZR}$3skv*XTp=VZ?0mp~q{E zTibLT*p&%C>$e@3jX6+fvAt1iTya?Yo0R`iwpdBbu)2F zF%e%m-H1Ou+#Q^#41R$2;8TX{&=}&H$^VpsX zjriI16bG4?NIsJDz+9oqH(Nl(_86k?@?8BKceo8PoV(G&3j6sBDf|)XL+h7Qo z`P5^?o{b_*D;0lXxB~@DG9jdrT*&TRJlrh_IWGx8tk{5=wu!N!+vE}2Hbta$^Rljt z)k@p^{=r|{w9Q-F{CYcm@NJ8!KfTZiM{g~s_ZK>%SJtQ;P>t>f7PzwgJi(T*9%)PP zJmZ#7`zl2M&F=y1MPb1AA~7UVGzN?!0(uPXUR8#^cyGY9>NIZTzPlOgeJN9A2M5qlOE6XR?+< ztI`&vbtx3BOk>j8G+J97;A3!pP`Zy^s0CtI8F)5JQ&^%lqj$gN{d)zW+o~_6`x>j% zcC3^y`rz#CT5DRTwDxnQ8g;s&&bIV_!_S=%ECG(AT1pth1cgDgpjPs6b9RbR$~)!! z2L=T}aH}ch&{2Rumf6`np!W(6m+uZ5yCAh|6 X{QS1?XX5imt`|9n+s^&kkYE1+ONLj7 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/applescript/number_feature.test b/docs/_style/prism-master/tests/languages/applescript/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..96eb6f2862202adcc1a908c7fd2d24e9216366be GIT binary patch literal 258 zcmXpp;^i{dGc++YwFEL!4Gnm?O!SOgbxnD>c)4`R03dzQyj+~oN_nNZNvTCjItofA sMoO_dXkt)Hu}AHU6RkA?Zl34PGAGC_Ye4a#Ltryr*H-kVvSyOBZ)>(t=jZ|4qh zqi?(3FLmG2BFJq<2y0~cl@zVf7JB1gXL_g5#0d0X(_V@w2!E{Kx|KhC}%1OW&d>l#MkdkXg#>{uDNzIB?qWwO zNvMjtzG5x!P$liGAyUUGamd5M5KC{~+qjWjIu<3B^MBH?n32gGrvAsxB+)yrIH%$# zdkm?0a+lMCc!!j?+|rfiuBgj?;HkpN+H}bezOqUJvQExD`>vZ*Sw^B+AIQb4&n#Eu zvvE*5b_!4B@G%D!F~OCp!!oGdw{#MmIGi2_QALs_Q^_FCDz1hzhK(1TW*o%v#z8e+ mb&&)dn$49I`1|=O`2C=FKP=$?6*yL{1B1i&pdpS$`|S-nAR-U| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/applescript/string_feature.test b/docs/_style/prism-master/tests/languages/applescript/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..42770f6156980519cc220c042395b28fdaad6d04 GIT binary patch literal 206 zcmY#V;^k6G%g@%#sWRb%nyx{F2mSUM^lPT`~YjUohinNi0bOQmJ_po6dp!(6Bo%gY5sSW{0wVG) Ua?VIi&MsC+%P&%Z*jB6u0049)(EtDd literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/arff/string_feature.test b/docs/_style/prism-master/tests/languages/arff/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c3178f17b13a87eb41f94f1127aaacca56ee82dc GIT binary patch literal 294 zcmY#N$uCXHNmVE;%`Zt!iBVElP*o@{Day=CSK{STF9yMkUsv}~Moe`s?6sv=#0o7eGN-@YTQ;Ox~0wVIA=bVw6oL#JtmR|%7 HiDEqf`8i5E literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/admonition_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/admonition_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6b1688f59b54522bf910458b27248cf5d066ce5b GIT binary patch literal 460 zcmWIX46ssg%g;|rEaK(z^AB+a^AvzwAgHK1N=(Vk&&w>y%+FKOQBVp2x>G3@$bdRFrYHs|jzuBZ z4{((*kKj~}@E=?c(C;{v!~70cOwa;YxWIJ)jaTC3iUoO;jPTI~>2uCVP0lV>NXsu$ JK!j4U9sv9!cM|{r literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/attribute-entry_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/attribute-entry_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a12299ab8863526caeb5bb19e133a5b62670d351 GIT binary patch literal 1006 zcmbu8O%8%E5QWz^=^bjfS`W~~m5G-S7C>qskk-_)&~SJ=Q!K_<@rMNr?VDk~H%0D^ zVP#>Zzg;PzMEV7Mhm92_J`Rt#3-YCmN(d?0!WGv3FEh*n@GkvZCxv)%rf6 ze-Ci#b>;fPHAX}8XlE$RCE>%Ni1bg^3~}SL up}%cgGW>g9Pu*uee|ww@!cdX}&JX8SK;EuaReNSfV_5`YaC#ec-rN8=jt~(5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/attributes_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/attributes_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a4eb9e25f9ce20a3b9bc9bd9a6b889a79a154b96 GIT binary patch literal 9311 zcmeHM-EZ4A5P!A-{|_3IE@`I3OShpw2JfX<9|kmgXkQB1X=s_Yg~*~O(fNSm|9y9q zL{X&Zucku>I4`kC9`E?OpSmCEY{B9$fAMLO@g&F} zz2b3jqHXiz(J#OL{t$_&cSe&lFPhN_lVkbMt1;&n^JEeXywgt~UZW(KaQ*kEKXH#J z)_=6!`GueVnr}qOo@kXORmtK~vFto9`d; zIO`GS&-@$zkBs;a(MU{tkw4aM#&j%>?48;;b49b`a z_Bf+rdKDbM^Lk#N#`7ule)9T5CaCxMX4#+6*^I7mh|RMo=E*UHGtI&XE)dGyK6W2_ z%hO9g8hejF^nQNrpTeGE3E6;+qlArCat0=@R<|IktL$fs*_UO~yIkG$qhu_ey#6?) z;qr2|d~=hmP*bOUzQ>=u@tt;y;B_ND{0c~v#9$8by#OBJnF^6c!-ZgQS@SU%oG+44 zEGXW27$pH2pm4eT{GP@O+=4hWU?pH|HNZ5`Y7O!YElo!t=#e6OqCuu9umI$xIQ(xi z-x5LVVIw?fWx34B`9!0Ixq(~nk7qJf$ZX%J!iUjZB1!~H=P46xLmpQF(%^tI^gE$=TP^3noCMSamgGD^ zX?57PA?PH5K<$=ZE$Rv?vQJpq`?>=qW%HPZYz8Mmh>`Y`2wT=|A4LG()_K6nGsw3Z z(fNuny{BnJhq27SNZg7u287R9N(E2x@I5t}L4pTP2V;E~;p-E%+PK*-XlAB#G}~EE z&`3O$fMHaXKXoVylB$H7wdiOVZ1$U@Aer(8`|2pXRjUmMG{5W;pO^>&QbP?0yHc_l zvXa@mv1)dXd=J<`548Jffu_Az^PKz2Z zd_&r;>YiErH!>qoVOW@-N)KJC=eHheq9*H@;c4Roq>P9rw!Vpy+;8l{56HkCve)@g*}E1Ifb zHe|*1-S@_s)|Lg_Z7zmNm31|4W!qNPZzF9*9v|Gb26&oe?Ua>meS0~ z@-J|T6B_$HAGlgWEyuEZ;A;3TTYX(PaJ79u-yXOc1XAro93-vv?+yp9wuWNXi|T=^ zVFK6dzwELW1rMei)Y3q)`VIynMv-(B{{vTph8cp7P#WC}3q$QqR`(S)vNyWwf6CQL z=2atWwY*pVV4|9pIr}hzu&l&8!!65?*4D6Gb6h&0MPysH>dRJ*S*#94^*fB^t XZ2)io_WZjk3-2;-%u}yQRu}&QGI_&5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/callout_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/callout_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b7de9b1bcb055d4b096b0c0da715415f009bb8e9 GIT binary patch literal 608 zcmbVJK?=e!5Ih^$KZHG3!Ml1;=qK79(o#_@jil+N_;_byJQO2JL&zqXX=f&zTU#5a zciRIgEIPNA6zb79Qc@;Tq#k<=6oG%zBbn5C!4S2A)QY1LXS(3Vbe$bN_6(0)WgsMO zHH*K}l|6qj!e<~LSDGNd4frJZn-he*sk>H;-~`?K*f)MO{%WD4ImCT=N`Mgv&gA93 q=J_MgoRUg3XUrpoH%T~@)^det6&B3peLG#+<~HcFbvkxz*gOILppp{+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/comment-block_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/comment-block_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4c4248edf5685a84973bfd458dafe33de599a39a GIT binary patch literal 283 zcmdPb*VpIe0un$HM!V(bCnXkv_)dvcFhO1}T`~a3kZ4{m&S<6N{M_8syb|4{oc!c$ zB^?DNkex9_F?k?bDOLx+B8Zbf%0U?DEQC&8u2_&QWH?S2q|Z4cH95OjAuYd10qR5r IuoH{*0Q^!wrT_o{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/comment_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c2ccc51b5069aa85417bc8845d38a90647718649 GIT binary patch literal 601 zcmbV}I}U>|42I`g@*Sd#6*MR4RH>Ih3=pNF;^7Ly#^Ff}janY9gqKAA?cbjhr4W=7 zccMIN5fIKCKKUiQ(+IeNo%Ku;o2IfXcJ^6tTi+$g%FuLr-gIX~ocb5^^&5W4< literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.js b/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.js new file mode 100644 index 0000000..2e99cd1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.js @@ -0,0 +1,4 @@ +module.exports = { + '➊': '&#x278a;', + '¶': '&#182;' +}; \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a3d5ce817593d6aae329367c926e60d8717bfedb GIT binary patch literal 916 zcmbtSO$)*>3_V-ue<&5Uixu2OK|J|0#tz$zSd>k=3>5tFru(Q{=VjVco4maDk|tO_ zqU|o-i(t9gMSIRT3;fVwa4aAWJxG|?uu@-YZIH89%Rm>>@dRDYGR!}XA_qxcjPEnVI6&(!eAZZ|rq|-?ejm~O>>LcdW z#;qqJ)dhmN8$dYq=&4lL!RNdF%4Pd+%}&$FsFe~gU{rQ1^K0*JG6$txGxL6ADsHI; sgTyo&ewa7IZjYR}pLU6VT{)q~8fV?||F*iv3*^^IoJ%7bUmB|Q8>2+oiU0rr literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/hr_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/hr_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..822a7dbb456abacfc88b35345a06fe6e2fde422d GIT binary patch literal 195 zcmY#aSLfy8b4F@% OcCkWQevv{(ksbi-NFodX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/indented-block_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/indented-block_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c6d665754aa832de4feba4cc0596381337dbcd4c GIT binary patch literal 599 zcmbVIv1-FG5S?rAKOCCckT`oFLn(CY<}D6JwlCHZMWWJW>CkWQNv_+v&<;5yc<=6> zt@o<3D2u!M`sD%I_T+u1L)%JcCtwGieoJ$B_8wN!Sxp_-Zc|GdGTZMzv7o#R05!2i znMu8;nqZY`0n1`@L#4kQmUV$v1{&p;6ZzFsNFQir|1Mg+zvavcN(x?FImJ^=Ql Bp!xs+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/inline_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/inline_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d88a57080cd1a027196a6113c7eb14373058418b GIT binary patch literal 11872 zcmeHNZExZ@5dPdq`48E^iWb_HZa-FSccuFoEQJ6rM5PIrmsM}K?Qg%CaqJ|HF-}TP ztOQaE8Bd-Wk0+kTj;HKtyAIMYox09!wv6-nhI#+wamLcY07PjRtx5?9p5iD@x50wV zTxTF|2F+obC2_PGy3Rc4YY@Xkr1Fw6!e5Z8g?D9OWlNax}YA)3vQem3cFkh`X+P=Ya}lW(QmQ=O4F%` z$aD(ETnA)B5t*Toj4BZtmBP_BNYiYc#QADH8p(!U8N!}W?)NLY{k{;trTIKvB;huD z6QcVx-?D@Y?}hMpkY!0Y&og$Fum_f~Xu)1Z<9HlIi*=k#CZ%LN59gaOUM0bH{jVq5 zrNYh4GvM6ai5t$(&%_WvaZw7Tj6|+;3m?b{88R4v56-~q_`tBrk%1(tjtO2W zqXAh}83)%=rdQyNA*3Z7Vc`!m?&>{VQTt6zSqU-s&kpX-<3 z6SiW{+iQ~k#lOBv4uiewSzQO1&MoGY+5pyfJO9X@#9 z*mcgvei&`Si20WuUgC8YY{CUzkNs^PEwVhw!Z-qfKlLZ@UrY_CqS3(dJ)2A}wcrZi zY(|K+3a5h|4E#2z1X?SSTF~~GvWV*Npf84=8^Q{m+Y?sMFoty=ZTJp>sP zXT=WgHh?9%qfxpKwZtpdcshK=otCS-7Qhrv%Y|NBSmP>(QyBxKp}5*F_YC;Et0|Ak z-W8t#TNyr^>PcB^4{1@z_8}SqJZ-^V3_kA;u{B{apsPW)i85yoZ9qBdo`NoDi9N7A z6S2o^MLz6dflNSIlzZ^HSshex8s&Rd7V{af2ZFSq7zWT9K|r?})A#{cg~9&&i9{#x zj@+SxEnB)^fL0#T77U>cD5aB;byO16Q1GFNau~kHepV1sJwu@VbFiyLd!Yv2RNoyw zafe1cloa9nASdonyfLt;YL(=s_YbxA5s-08giqW-jYy0A4f|<{NCA|&6L&aqhsLCL z;ts`DgZ=Y#wA`Vf0yXj=xoNs{j{$j{pa}3rdYiC}(K|>KHfL>I^iqqDFJFj-msvIT zcdxbJJ`Z=rbi|$Zg@N*TKEC^>ZEn43v@GepQcqxa3Ysg#Da>dGPfwhRjg_-ApN<%O zNJk(%=y0R*q3xQhWdymt95y^bBu1`@gX;>s0a~g%mUKFzY>Hud6J#+4-sihXa0lD~ zhbMML`c;&2;U!r3-+cTgTt8wTKm7qdBEO>SIN~^d{sVmcE`8+ZfOHeswbbE9h%9uz z9_7P_FOGQ9oH|QKrLL8swH`GOK8Kz)q2%JpGBHMDUq82l8Wq~2HYj!S<0p5pkH_7P z-Ob_*Ug@S1sB+}79%EIt8+_M+>fZe{-`{JtcuawnBwn!Dc#p85lzQ=l#|tn&KECua I_MCnB4-Y{OQ~&?~ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/line-continuation_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/line-continuation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..651fa81fa397a73ffca70a260d46a63cec772c69 GIT binary patch literal 319 zcmbVHK?=h_2s~Ht58^S&_7jDCBFQ0HQo6Kg+1>oV+Dp;S#^CPg@p*eFG~+B}+@QPKoid^x=2LXt$}hhtk^y#OR-y z$$Wp3HEF8glbrdM3E~G4R;AhlHlUi%X= zQU8kv049+!fr)&BV4_D1#=WzAhWmxC3M^ZFZn=YPZQ3Plf4 bK_LjAxNM2Uz3)wZZ1Ia6%9+Fd%C&F5W}-c1 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/list-punctuation_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/list-punctuation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..60dbf13cb588697dfc404982c032a9b159a903e4 GIT binary patch literal 1673 zcmbW1&5DCC5Xa93@(#gUWfhdY_Oc86616Nz=~8KFinT?g55F_{GK$8wIhe`hmzh6f zCMo-ol9I$sYG#7h;7W`$$}_zi70S@t(WhQ1&>c62G(w3vn34R-N&3d1gpv)Y z*~F*n+N77;dDq-{Q^|Au!QwRD!WX5NbqStXFnJp6Ni5P**rdl1Et`ObJR67zvPI8Y z89^Sd%OH3_23(?{=moZiof1>)*=j$nB^#1>g9B>#OSE{2?uK+g1+;=IwXH}P@A<_$ zQmtIKxoi&mIu$3mJ3<#?dqRJXS`%LhNT>Ivde_9y zos^j#x8*K;a55R>+G0j^FB>jS`&o7PR5^8{U=O!3B^%y0T}AHenImDN)iX b*`oM2Uda^CeINF_DsK;tl z@sUNhTXXib7P@t+lRDpNTOGv&D2n0JU@A9A*II)?LEK_Hp?_l2ZA@$to$pK%9=R5k z)Y=Y?7*KOeFglpR&91maI*4E))l4M&Tm)ekVnk95YT0^4|MehrGgd);r9!vPChl}6 zJl*zGUfKw9XS5+!7#SS^*bxFGh9}OubLJ+|o5R_b=H!vNx?(Bsy;0S%hrR6}3>o+# z>p_|tL%nOwA%v!!z3JXUHRiZRIxyBXgg7YIL(?7_jgM0`w5D%s1?qfKm4hI?M~Xkd CCi*7; literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/macro_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/macro_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..50ee1616096a8978e898045e1bf435b880907dda GIT binary patch literal 5621 zcmeI0%Wk7E6o%JC$~z#h1J$HEB&2C)G*2))nuSAM@B}adr;SE^_&LXzm|#N4Wj0l^ zNCXF8{^R5SGkFt27DBQhdMaGDqj{Mz_f6mQSMwP!UfE8vDi5OHJYiM6c;<;4Q&~fB zK1-!6gNKKYj}QM<#A_iozNnIi=%-yLOiED zlOm`q8gEjXe^2m+AB#LvgYcXtEU4p(vBHz-HeVMQFN-8f8BbCfJ}ws-FE$}*9>Ne& zO~cUrC4}4b0J{7?WfHC2FvQ7w-h9?-{hA3th4a~G2p{T0!4T-ftJn5bwzb0U({ zxDsUH;uT!JZHriPQNSJ2Rts4{n3NdV(l!{t-KGhZvf}HlWOdsO^wWDf(oaJKANSsA zwq-cR&_*=R_Ig=inLEx3zgKGb(fRLp^Zyjk_{7mEFHGc6cxx;sew|qKrcs^5HZF3D z73`Sbt+en$Iq0yQw(y9t*9&#L(~8q|rs_}|v{4{RR#7P`EYi^2K3v4530${&4HJe1 z>oJH8jB|C{yZGE4g={)8%K>nmJ5Su?;1u2UY0ziVJ!yF!kFQT>Uv`H zyy0$dF6iDzYp1be?ZMc+>L28qo7pF0l@J4iDE|$&(NTZ3Y-+ zPjwF|-C!D}?0)p7>L+G&>Dq(mV5VEkyI#m4t?a4qw}q90KCkSy7sx&dE$1k;uFu5) zxNah961^M?UzZ5#T33%?(A}U%>S0W6?>+J+;wOO2IZCo~QZU(%Mz`Hbp21{~0_~jX zqLqy^4SJilV1{b;igovIw>Y|78yV;n+3W!aHhtsTJ%pg6LqMI{;TPzqPhP|HQ!h7) z0hqL2U!Qk447`Xzp01?a9S+77?{HABMRzz1oqYG_u{#_R^V(w@^;9@$w^w|a&wvw` U|EcvOW$~tlKXoftfxq_u0k=N=_5c6? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/other-block_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/other-block_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fb33c207f67fe9b9c403c6eb23258583f1bffeed GIT binary patch literal 829 zcmbVKO>4t23_VYv{~&w}NnszyZ7@d9W9-e^ZCz<&N@cWJVfg=K=+aA>PYnFdwnF&X1^DAzZA43zcq*ba;_d#29Qkt3oG3?JR>L-bZZm$cc5kwr5w4 zph)~LT9$57fxj6Z`!lxu(ZUJCUOUsW@AcU9>`5kU2mMUrq8M9#f8q(hC`(QVy#Id+ z9xJW(o_4M!Kb~Zt)B7;C{HMqB=}Fp>+-V;D0^z}UN9tHER5Fl~#<(tUZmY?=Fojm123h bfQWpnoikFCvx^nd@{1He_A7wxFV+J9SFkSI literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/passthrough-block_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/passthrough-block_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a5bb08b43c2c08b791a63eb47a0b946956301ff8 GIT binary patch literal 633 zcmbVJ!LEZK5Ijr5KWsQzZT$dmFE8;YtZ5LbkXmS9Nt%BB1GSBL-fA#}*B7-U`ZVUT7B_X?lbc9cZHs7T4_ zi!a@4Dal&);NGKhHjL`jPgdO65mF_Uf)N-vYHK3Mk{|1ism9LkY<5`^_&-g;wt3Q- z%^EGcbK&gUF8W=Q-)gp|Uj6ousq1%%ZTqrFM>{x7WmSx?% zbxYzMYw1QLCR$wI&*4`|ar1Ds4mQJpc^JN;JKl|s*3;s literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/replacement_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/replacement_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ca27610e212a578f8a374f179dce685bd122f671 GIT binary patch literal 1040 zcmcJOu?~VT5Qb-(^c|WmKw^CZCuSGoMi>CkNJJpz*nD`efLN%D1{nywzjycDPa8y` z2u??O#UW>$1&j5;dW@R*w(h4UrqnviL^yklx%46IBug;4-#-HfXI>&Tv{hEX9cq+2 zA*qW@cfyU+c%OyX#D`K?Vg*zrq1Bd^saD(91@;-1O>HPGM-P$=^wJ3-L)2y7BXn<$ zRc0;TBS#FM7aqGmT(ZWLR_D|I_1=Rom literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asciidoc/table_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/table_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0b4bd3c69a7f035ba2a10e9e1cee32b014db5b32 GIT binary patch literal 1778 zcmb_d$!@|h5IxtD|6%a4(1@5_D!Fjy2Y^U4H6m(Q6bJRq4J_wi}^4&UvL}VEyxS!zye$!$Ldm#()4aNE^6WY|O;(aFwn3p1$3=o3l zkT;0kKq@644Te^}pyX}A%tf#c=pAm4r+reK){d5|MFRjfx3a9jpjFKOZ+h1Kne8+Ltxop0c!52~643ELmCR>De6MU(dl zF#h(YQv-dnAGsK}&WtUs>RKibAJYZk9+@xVs+-IcgRM+Qp#R{-Nm=bKWwW!3+I| z!DsOggU@c7VZsE;`rSM9U}zeORT1ipVa(w-^{2T*VoE}C>M`S3ID!5k!KgGhk$i|e s$UaLRPaJ;Xgg`Cvi)fM;y*gB0pf&W9|9-kw$Nlbfg+twd9I7+S}9fsLk!tCrC6?5 Uyhb`_q$XzrbrdN;jV(l1gAR Yl(=H?8snUinw+hWmS3a*H>#Km08Yywg#Z8m literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asm6502/number_feature.test b/docs/_style/prism-master/tests/languages/asm6502/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..55262f67bdab039fc7a41acd97c7b8affbe7f710 GIT binary patch literal 263 zcmeZqaa2$?G&1K34sldau`n<&;PP>aP*7Gi1TqbQkc&$f7vSQG=2B3IR?06(&QD2I z(oszy-Fld~1l@{1H8PAKLA0MC&wp#T5? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/asm6502/register_feature.test b/docs/_style/prism-master/tests/languages/asm6502/register_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..91ec7c42be8b380377d28640eafc1a1ae7e6cb32 GIT binary patch literal 214 zcmeZqaa2&TFfcICso-)9_EB);;?l(hxVWOZ6cnPB@(YslQ&N?56qI~i9F<~qz=9d6 z6?vt(NvTC3aj=OH86_Phh=QWj^vvQChb5s=dmx=5;<_ccAq#*IIIP4qQU_qZz;F{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/aspnet/comment_feature.test b/docs/_style/prism-master/tests/languages/aspnet/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..da388e5f769cbad4b9aa28c62291d4a25f02c593 GIT binary patch literal 292 zcmcCf)dd1oJ6pNkg53M+L}@F-0+XFjp$Y@^S$Y`A&7tNKMWz1{zxgb8E34 E0RNRhL;wH) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/aspnet/page-directive_feature.test b/docs/_style/prism-master/tests/languages/aspnet/page-directive_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3d79dae938e20fbec694a99f5e23749ce0ea2c87 GIT binary patch literal 2105 zcmc&#%WlFj5Ikea|6p0-M*0O%QE}>_Dnh+c4kle7Y7$4bgT&w0o7j0lkjeq);&^8^ zvza)%^Xc+UYsmKLg&m|^@V!uc`bx=s%9bmc8zs{gU^TL2?^%&T2D#BLVgphcxA_p- zfa-0&E(N&2XK9MktVDeBk+nEBw+haQEH#EYIU6{Df;{%L4IC4%K}qz$MF}NaN+w%g zSgGhIQ4pKt49tilpD~2SFg|Zh0vRUfI+z0K;0-h4g#iTTdbs?zK_?gDey2*Y~OoRg}&mOpUB1GqYC ze5k6zZ??Qj?AYWHT(4ZI{kltW#&tQ~!EWs8(U?bxrwod`XDg;SXYqE#I(x(r#cPCt z2d(p~4g7sp1@*5TNW5+(LB+8R1uCG^Dg#xpw#_k=^k5VODx(=a!Sw4<_iuShZ1;M6 XIId0*|7tt?6%%R7u-mX^O6r$Cu_qw4 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autohotkey/boolean_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6d97d4bffadedab7229c12cab1d94939919806a7 GIT binary patch literal 200 zcmXRZDoy3(N=wWs22#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H<8xk|A*=)z!&lwx_g XfQWqCoHJ6Bvx^nd@{1IpRu%&Qqc|(< literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autohotkey/builtin_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/builtin_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..afbe8d33253d9d0ccd92ed29213a6764e306a136 GIT binary patch literal 2644 zcmbVN%Z}SH3_RC>{~^eE+n-pVMKA54$Hl^s6(&(vvAvRn-!*fz$Fd5tzNZorxhRx8e9JqIk_M3@x2gZI{WAaa}9=IFf0&BfFluSgslo z`$4?qh?{6f_~7Xz$&T}o-O9rtw@pr~jI$-ETE*4-G9KI!$-!5}6^N4D#hk>KcLmlq z<8YA}p=+CAzTn)lPc!x)C)i2ImFkUsDH^$5OtR-i4l;RT;Tw=GqLs>*!pGN~8j9j` zF=OB5v+cOalL-l5Ljipy7{|#wxTU2;*w+$4%tbjnk7Jext&l!wg;ZV*aE9a>s&)!; zUFC?v+vIXO3Tg(B*VN!pdup2xPy2p$KDlB4u-ltH?w=q2)8Z;Kb+lBAP$ULE7E$N6Vd`^W+T2)7 zPt#jkkJzIZiFRvFg00<3pwhlXul>vcZE%h)9nZi_0YtByKma8P3KZ5L$Vwvw^6dM8 zXqahfD-LL%-NQg49A3$)iss&|g1PfJsHAoetEQw~%w0E1S^OOlg$^ z;8_CvOT64Q4a&bm0CFkenrskC>=_n{!1I<;6)xi)3S)>%p Z%LPQ_+vc2+nw(v%kd|Mh0JXAM4*&;!D%$`6 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autohotkey/constant_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/constant_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ab116734881a5f2696a269ea1a1f3bea58081826 GIT binary patch literal 6174 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 nZizmo6Cqq%WG6 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 V{}Av?@58>04`p3H=x2rgzdtQTai9PI literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autohotkey/tag_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/tag_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0ca92589e4928a2f1e50094135b970ea350e8815 GIT binary patch literal 250 zcmYex&$r^`O3TlWPf9ETvUs_4$p9dI(Y#!o(MlzW=}I~ZNtg2G14ps@U ceM+&sTtGy=rOp|t$=SsUY57G8Fq@0@00UDm761SM literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autoit/boolean_feature.test b/docs/_style/prism-master/tests/languages/autoit/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5750be06cf27d835178f9345f9de005d2777d503 GIT binary patch literal 201 zcmWG3Doy3(a!br922#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H(6xk|A*=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040EBWYng9R* literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autoit/comment_feature.test b/docs/_style/prism-master/tests/languages/autoit/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d88708f344a3dcc17d707a0ce3c776bd54403f89 GIT binary patch literal 689 zcmcIiK@P$o5Ijr59|&IBr1b+FeFk_yq|umy0s4P;t3<3slO_@_JF`2??jk4=Z1A3v zt?}b%U5b57IwVRq03UT|+LE*GgkfCJ7G%B&6y&S`@w)^7pg~E$;$WQwLy|vR;2qTcEG@A7Id^wkLB1;h literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autoit/directive_feature.test b/docs/_style/prism-master/tests/languages/autoit/directive_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9219f700a04f6581dba69c5c2105b40948249467 GIT binary patch literal 294 zcmY%P%MU3^tn^II&*SA%_Rn)HEy?#R2`))2DhWzW&nzxUEmBZ&tw_u*$VpY=<>KYi zB?Ex;Me}lTMk}Rc7NsVaWR|5W=_n{EBkWd+)xjc<)j2?=3eif%B}JKe=|EGWm11D- fi&0XFjpgM6BJ!Q-oRONGU96CnU!(wcYq1^x<%djU literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autoit/function_feature.test b/docs/_style/prism-master/tests/languages/autoit/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..13c82ddad2a8e98362d6e99b16934bf16f2faf0e GIT binary patch literal 386 zcmYex&)3l8rflFa-(B^?DNpe0JN zIttNB1t7uFM3}e+R#8o$C^jQN?!>BrbYp;iB+VpVu2@Qf#5p51IlEXPEx$+s7B0nl E0PoObF8}}l literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autoit/keyword_feature.test b/docs/_style/prism-master/tests/languages/autoit/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2db276cb775c8e25cd3b7c39efe8b14164c281a3 GIT binary patch literal 1312 zcmbVLL2kn!5Ih%&KUh8|{e+WLmZBWuv^hjMxDJ+42vjyG>F>J>b}t?G5Faqi?836l z6!oB_D4ZR9{CRDIDkd_5c6? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autoit/number_feature.test b/docs/_style/prism-master/tests/languages/autoit/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5c6ac5bcaa4ddd3d6e60f8b2219301faa0267347 GIT binary patch literal 328 zcmXpp;^i{dGc++YwdCb8Nwom+OkH(>90NV`RBc0`v_XYaVv1X0aw;zuFPAPE0HiOP zmy0u6DX%m)DYZyRM?uNNNGVnaO$_P|ObMX7Fa;s*#1x0R8;bddREskTZnrAp@DtVq`zM7{wsH_d`9gd)mDQgk+k&C*E>lI3dW0KLc+2$JK5PVOToQ! z%&qoYOa&4JAwfB=9MM7*t_lRDaDXcXXp27=fFQ;0ixui>DYBZ!$s2p&l4?F;bJLXX zc{CJ2w3K9^AOj2*aj1suti93g&_S4^UyiyNN8c${oW%=kNouWg+O*INUQ2YWRLaM5 ut_d`H2#n;jf3u)g2U0Y@eC6TVoo*xb&eQszBWZgkW2esF-JmDq?EV2zN15sX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autoit/url_feature.test b/docs/_style/prism-master/tests/languages/autoit/url_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1f6d3cd4969c15910536642a558db2e2fddb0234 GIT binary patch literal 298 zcmY$+%uCKGO-WU-Nz2dIODr|E2i*fjKfpNhy|>3y8>fs&htaa(1yoT7Hp2T4qja Ou|j4Z5P`#|SPuXXaY#Y{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/autoit/variable_feature.test b/docs/_style/prism-master/tests/languages/autoit/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e36ffe327ab33a934fc561a56a18ccb272d73acb GIT binary patch literal 343 zcmY#M%g^WKQUQ|jNr^@ACPutm4$k?x1*IjaMSh97sUU7ZsAExb29Oov=)}v#%cV;O z0O^b7<>HK1DoZTNOiap2Rnk#V0@>K<&;C@#dV0ODq>azI}w#qx3i5&2$m e&PYwpE>=j(FH(T{r&u8|FGV3YF}WzeSPuZKiB&lO literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bash/arithmetic_environment_feature.test b/docs/_style/prism-master/tests/languages/bash/arithmetic_environment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a9c5663dc1ee205c163e4aa88f7d3f6329563428 GIT binary patch literal 924 zcmbV~KW~FD5XEQwDNd&jCZrNbK^YRJ&h6GIVF2nRD8-J9N!4#(8{_aNbb$r?hk1VY z?kI%~1Q3JolNU;3Six2=@gxNFd&o11AL;En<{70u#H3F#$={M3j+uHbFo7cP2b0q zc&X8yF)(n1It`~WBRjl)^?YvY&`@!7cdcZ}&t2(wY#V^K+QC02m$A{_m*!8#G@EfY zI@wv9s9J9}7!OVVkBE<;uI%?m$S>0XJrr$iGwDsDcKM;1oUXK?xx{7ER}nchk=j}Q upVEF#N)PHXwcs&M6Bn+3Bwaf8Zx>cvYtVDAE)`Q{0gT^EDR{-Ws{a5)cHXoA literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bash/command_substitution_feature.test b/docs/_style/prism-master/tests/languages/bash/command_substitution_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2b78b518514304ab126569e345547e43581f864e GIT binary patch literal 752 zcmb`FO%8%E5JuO`DVhljP0&kt3~0h%5rWX96pgoc+7hV*qe0pAn|9{CmT)JES~9Gp z#66_*A_WZn8p|_Q4a&bm0CFkenrskC>=_n{E1I<;6)xi)3S)>%p Z%LPQ_+vc2+nw(v%kd|Mh0JXAM4*<_bDtiC` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bash/function_feature.test b/docs/_style/prism-master/tests/languages/bash/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f3fb71232b5174dcbf73177506956b59e7c21537 GIT binary patch literal 7994 zcmbVR%aZFR5M4)A{)etvXR=5>A)k@T0wZK`Edc|_9^bFeX|QvX;bfC33pA&jhnfa; zADPXYA|~aSqSjTfcWdnG+TF!9#Mfg6P?FoW(`1es_ec5I&c_x1)@-<{*!eWsW%lJNcD>|;a*s30cn>IZj1>y&6+JEf zBKBI2UF_ye7P~_`?mOftO+YIEIiekkYR+Oy+PtUw6hJ zrDl^()4a&+mtOpa+Y7F&myKJ@1qwd5M?_s@-d%ylahlvEyCm+LvsGY&GoIOno4C5x z7-24V!}GdNXHg`bDk|tg@R?#po6nSGnU|P%7^T_cG%XidTEB}&e~U-6Wk;JOZn%4@ zW(QHRS6M3NzZ}J7x#((O*9*ZT&{=-Vn6O$N7DK z8XXO=WU`vAqQJ_o&dew_U>8|^sWCrfjRjNFve^gEoy23+ZsKS0OJBd!}V!cDFokQOT1Tq&~oaFs2brY*vAoNV#ZhC&^&wy1KfT@ay| zEUpaglzo7>Rr9m{(0Z2*qirQFvOU75?B?oF1lg_Zvzd2!nE*HH2m96ix)fB4U*c&( zt^as*pml)#_G`JDBzw&03AR9S1lVO)H-J(_Cr1T*lO0zuAxf|k930R)DY!c!M z1BF=q@_5ItnkAGiM(niH6q5_`Tu>M}nNsevRkL7ee}9V}+o zZs49!P-u}8! zRNfW{l|EK>dwJktv%5*guFbpJG$(Y}@M7W1K?-(pX`8UXWA)j0NP*oiQf`Us@DyGlH=w$jr;3OrbijUpSXDu&xK2 zy6k*G?eWC-HR@${FZb-#=AR~CihRzO_vWe(S41cJ{gIM`DNfV-|M=5(f1IYD{&-uC zV5^Ve?Pqyw27CMSXZZs6ml+dO3ij6>7vYhqpuG@@q`e`5kCXlPJCiiMUq|ruR;7}a zpq63%MNA|YV8cwG?`op1FYgh?+nj;KZgytl^$37;p&b%IcaX!Zby2-+D(M@0-o^bfK|dY+7`Gx4jLtimg> zB0cAuMe{O#cdUNBtJ{vH=!i-WC{>J`gE0 zlsyq*X*wFBYtlsvw+W7zg`fz?30if753AE+_EB4dc!Kt*o(MeI$o+NPb6DvtfpkHQvc{w*;EBf07DJLSNNA=Vt1fgaaQ;t7$pYZ+SWsAaQ4~ z=70o8YR}MiDtw7OT3QF?af*!&Al+2*##F+9sFDx>l)|W}90Nhgl08`nC=V0X1fFz4 zHgIDui0Th2g9xA81{+yZ$gxGIKSrFLw4ERsbsJ;C;6|Yk0XP+)gKZkiLexRK5R@!% z+wvf0m^SzsFg0}8#@&!M#Q7V$LsW^ofd3g48~wv3@q;4zk4Cl<9|4Ips)N`dpjE33 zCRfghD8HB}E>dcWNtCPNgYYz<(^;&i#&0nJv2&)mVdKO|4~ZE}*{M;t(`XDQ4%Ub^ zqU(rxUsN2_hXnyS$9idO9T9-OBdGFuv~y+nn0}}Hh(tL+1~*cW4gs2wG-$jb!IelP zFbhPLMI)+>BLqHLQuD?y?-8XZ8A_buNnjG~#%L0pI+1doqb^8LfWwqQixOS%qyz;$ z$x#}DHENX(sbnkZh@JmG=vdMK{47K1m`dRiP2;fXoI0ybnsl0*3utEAh;X9+WX9>} zPp*7yrQ|t5J;TVBZG5}xe%bY%fgd|jN}i$M=m8Hac_;4(rSVA@o!4gq5d91$r&9kE zK$P{{0N`PM?Q6lP|N49|O7J~l1gW3(FAi^io+kYM|7VBa^%GdpFRr2=BVXSi$}fKb Da@i0g literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bash/keyword_feature.test b/docs/_style/prism-master/tests/languages/bash/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b3bacf55af569a0fff6f0ce50dc18cdcbf225824 GIT binary patch literal 763 zcmbV~F>b>!3`OS(&>cQBr#?W|9wW%$N)$|3kN{am+S`|MlA)od7>0+(Ps;kA9MKla zptO;EI3lt&u~d9lnpgOe8|R&HTR4$5oZ)AY#y$JSC1ayRzF89rLdk?(^ajAs3_-DTDPbX^thDGVluqO?6G1&`Pi?J;U7u?l>(=bp1tOYVw2 f_Fyn%Qrfe-S|jiK`|`DrUpMrfo>RhOakl9XfiK*M literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bash/shebang_feature.test b/docs/_style/prism-master/tests/languages/bash/shebang_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c41860d026958cd0efaaf0ee386e358d998aa9fd GIT binary patch literal 183 zcmY#Z)KALH(@#n)&fw+Z<Q4a&bm06=$R-CFZ3o=_n{EBg|Eb<>dk*@(p*+ RNKMWzR!GY)Qh?f^2LKlPCL{m= literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bash/string_feature.test b/docs/_style/prism-master/tests/languages/bash/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fd2a30317d0ff5d940bf378fce63484526b98c03 GIT binary patch literal 1300 zcmbtU!A`?43_UMW{=o{9dfD~`Jq*D>T!sYPmI`%S2NPQZZN~-i?>r}IyKXJhpgkn^ z%X4D;B}z#V1X8G#F+9cKEh*-4=3REqev7kHG02|&7^doff%uJC7}Dd@!`<}uc{070 z0$$6NV&98JM3eg)i&KB>msk(50271`@^$*MN$6u|ieyQ7k-_FImu5FV^keIit}uaF zZ(RcWN4TJc*>01xXr4?FRR|HHNHP4w$Gn*oy_s^SRs)(TjbBC4;LslgZC=eC=^z04 zg_G$N&FQ9Ux1b|}?QjQKbJw+MV@=f{bD#@RYXhhVTgA`C#V;yC$En$y!U)x0NJ zT$qewhaqAgRP)WQfu&bwc`~%sIR|f7IwQJO>`)T0 zv-Z+_D;%#`le41K1>^%%H-(KFstVB1e&b?UeMu4h=YCziCX2V6Rwg6&Pz?P;5vNOX cPekc)2gyfLTyAnhi<((VHK%pzUzmLK1AT~I_5c6? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bash/variable_feature.test b/docs/_style/prism-master/tests/languages/bash/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..16b7448aa3ef1b3ff96b4fb039b682952767bc35 GIT binary patch literal 240 zcmY#M%g^WKQgHy{Y9Lb~DY2-Qmy4H6mka>X7tPDX8Ld>7Sd^KVl#{BYqoAY$G*&5A k2UFYut0>$RO0m3LKt#S%oHJ6Bvx^nd@{1H;?kUy-0D(a@?EnA( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/basic/comment_feature.test b/docs/_style/prism-master/tests/languages/basic/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d306176161943d6996121aeeb4dd326438f13466 GIT binary patch literal 240 zcmY#XaLdn6N-W~#3Uc*@vw696$pE}uyj;<|T%6HL$@#gtsd*(zIttNBicnLPVqb4F@%cCkWQevtyyLB)CiLX!Tbz*P9U>iLE}8TLL|^tyt5 z^02%=-Kc(o*c9rP+bgZi$G8QKLyg~T zCrHl*J&>uuFs22mu8~4@j#x6tFF)7eJ!nZD0a{$D;a|8bi@Q}47`nw{j)m?lK4bS_ zV2NM_SNsKzh7C)Fq$O^1L|o%qJhvq#h{ZIy;NKuzSzDo{xRrIoM61Uy)@9a#L8uRK zb>*h6sevgXR&Zubaap059880F7a)}oz_|D~c#~|X(_+kbMvHyI?lq5-EzXCLlOpj;{&p90pL%PS9AaYqu^0)d%g3yvn;EI4SOXG?tX z^o$fi#zS&E#~4CB#RPLDZDFW-+kSwyc7W;!ccJ?ie7NmoU%Xw{m|*C7=E=GuZt=>I z=j)BjdyB!Ye&qY(!;jzbN4*b^4?lc3eE$2(r@wyx`sMKM>EMp}@bTUM+4Z*3NYom< zk)#5`tNHg^OQX2QB!J!3{AbB7nk#MahE(G9&XfReQ3cd{RRXwaCI6fx8@I9KxBIyR zMQtm}MdL!(X7X9{Wkit+lr*zLhrcZnUX?Dj@%|u#*xk)2()h&NXg_hAI z6s4^_>nRQ7LCM}Tqr_^i)QCJ$_k5~Vc(*I$o^v&ZEGz-(z!a5i&D{#vv$=wh-zA$F zUjkY@$ZfjU3DS^Un3tPZs|#hM)f*CF0+9e}63v$@YjulO&~{MONO4v>5{UBCs})g4 z{=MY03{XI;qckFyfLcpS-%wLY#LKgb3QbGbnoUAc8ftZ&Qb47r*|qjlP?Yyys}H4o zk}mzXhLmcoDmwt`Oogmoa#@RZ0h8IQ)vH=bp21qvO8Hjhb|BQf3PBOvVY4>Y&|WP| zu-4BVgq3Rt>fOWls#~k=b+`sunQJ6>_^95sLapZ|#0p;mL5G!HfRyiD2<#M;0(u9{ zW;dacdw-$PjuLwisW8berc=bSbCFg$CxYFLlz-9A>>ZF)sXdWKI>y*HX$5pr3P5kA z*)m4#zohuyk!kEEH>h@PQUM)YkB`nyLhSWAKz@J**P{x2rvTe0;$F_qVpgZ@+%}``d3n{R7K< B@YVnT literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/basic/keyword_feature.test b/docs/_style/prism-master/tests/languages/basic/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ecac6855ed986576a0989844892e4b4c8ba848f4 GIT binary patch literal 3307 zcmbVOL2er{3_RC>|FG~m?H}Yd*A^^GhNO)f1Ua=S3gi$VITZbUXJ{t@it#0ZBiS=t zQsPQOhPGU+&5jsT2^&l;+}d(6hLq0Z5Z0}vxjWc6?n2C*HnCz#7JMqsCHNc5!G}Yk zS;?(07n{%nMjKP8@UgLJn80#ww)HQYH6j9tnf5lNe8$_`+!1FJ;d@i~Kd%!!Sz=s{ zal)Lj1@Q?vw|DJH{GClb?~#~%5>)?l$MZC-Qg2t%haA7|iL zmu(I9v5Xx{-P;|8$ULQ(ZMc}FG6p6K^PVGDpGrZ7u|~K#>^*Ne9AK2~JD@Tl3geeN zc=9mYdC~ahaWMCIVDxe{S{}LLVeK0%T;8$l;m}uFjc>A=C#xDVR;~5I#N*4%z}5O( z;in#aHPx3^XCQ5dH-yJq%v&b7S+cPYqep5x<9=K6Bhz~5am3Hg1B3`ZRy>Gb%wanP zLU%C0BKnRizifla?bUaViTK?S(dK;4+njqupqZ;!E^ecph9ewfpQpgrc=9)W+Tk_g zM~%$*a`E*Oe|+wKx%hIwdV2i(=lSL5>SkDlwtBevALKnzFfWe6d6NXrt91o_ziX0j z(i?B1GUxSFIPa^(ae*bSQh`&dY|8<6UJ?)ifm0O}e3l8xP&cj+5E9KmSu}wIr3q+{ zCLl&vh_14V8>q~S1Sx2OptfCs+Lq`Sd!YXknt-_`AH!T(q zK%5mywU&5SS(X`de*E$DI{bQm87^Jj>$iWfGCza> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/basic/number_feature.test b/docs/_style/prism-master/tests/languages/basic/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5adeb7af0a9d058964297b357166437222612bf1 GIT binary patch literal 290 zcmXpp;^i{dGc++YwdCb8O0@v-Ok8z=90NUbS8YR}G%uGf833d&nwN_+S}CtIHz~D9 zNk>7+#7HSt2TcrWIi>{AF_?l7$6<;?9jg?}%LPQ_yVyA+H95OjAuYd10pjdpJpi#C BJ8J*{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/basic/operator_feature.test b/docs/_style/prism-master/tests/languages/basic/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b2d93f619b7e89c82bca9527071a09038ddfa40a GIT binary patch literal 566 zcmbV}y$ZrG6oqFm+;=!+=+Gbg0!cvB!NEq0h)`M(sR#~{*7wJBaOus|aHo&+UBW#Y z+CW<-3u~A%6i87rbudVnHq{RM^A(5ViK%iIxEeQCGcgql-sCk*t48@xKit25P&t%V zZH^f-5oQAu@&sqHon#TrWU!DZm8gtu>trtS5l=th-`TkS0Zc%RSO5S3 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/basic/string_feature.test b/docs/_style/prism-master/tests/languages/basic/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..83fea35edbae561447447bacccb085aa8bf284a3 GIT binary patch literal 210 zcmY#V;^k6G%U4p$Pf9ETvU$05$p9dI(Y#!o(MrW7MVWc&N;(QkF+ivktAin$mJgBv dSqGBmNXsu$fY@BD2LLv5&Y5IwIz|6vdq9GW!iLyv|+uxX$)-8RsLGzTYET2n^~va)3_{p~xl9a&Dj zPTJfunvXYc=8fao1B`R}VfZ&2}pSceD>s)x*hQ;wp6l zD)HDCx#KF)(oC6!*4l!D3Tfb+ENhna(5x#dR71sZnZYf4UAgxYY~*-IYh>9@*SFN! z#$I@OD`Q?ieqc^=YJyDm)v~G`4wN((oJ_ifW;_74c|VyBpy$ijz9JD`)BX zf8sI6x(iCvdrLaziZ={=#!{c76RVFOfxaYXHPn)2=hZm_DaYifUBqpWiDCsCDSpf}Jiq%0AgxaGN a%gY5sg2b5Iuv$f3RFf0yRZK?Wv^*ZO^;6Jwa5Zj#EYrab!E~qN@LWXI#@lYNFjD zK=!=(c=N_~@;Vw0&Y+f6TPQZSt^hsVEJnlR4S!OjkvyOrms(F~jXQ)0O-4iYr@2PM zuirnt+dv3*%gV91OqsZv+#obqifIYPx_hasc3UI9oE=%bmoUn${-m8&_5uAI0{EHKV7al$#!9jEXdmZpBW%v%@_xn%V-A2hL%Svt79fR5e ezS%$Mp-Wj_>H3kqfZH(JC<%G>jUM^iS052CWS2QmdXS7mMW^sO= zl8yq12jnK_=jNv7l>h~l;1(;z>R?KOT^dsqlLv7tTunh~UUErkVo4_0R3%kaxC||f e2D&RYmX`~N$PWkSjMU`pVuiH)A_b@ui}e8C8eMV# literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bison/keyword_feature.test b/docs/_style/prism-master/tests/languages/bison/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..49fb3733176d0565a679447cd69b787850d9f1bc GIT binary patch literal 373 zcmbVI%MJn|3_RO}e;_2it$x5>{S2}PT`_Kml<yQj@cb71HvH6dgAt&$r^`N=ht>H!%V-R2&R}q$*H?mrIun0MZxD%f%V3l$2SVpQogw0OA3; z1*Lh(C8dcanP5RBRaK=}9jHuEenDzcNhMIN63{h3aRm(JR#;U-Tup)opzjE&#&jmo gm9eqBTtGyAkT_?gCTABbq~#YW6hOS2nOdv|0EnSm_5c6? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bison/string_feature.test b/docs/_style/prism-master/tests/languages/bison/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3f3f6c0d58c9368373870c5e24827adf1b8ddfad GIT binary patch literal 486 zcmbVIK?;K~5Ii@KKZJ$g#r6Su>@(aPRJ4_Xkt81ceJ5$Lr3wW@SlG$zPG+>0qPMnC z8EU2ol}ag^+5zGW2vYi@BXQ$4E z1>E!@gPC7?v9f(|!+49_Sz+ CriQ8j literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bro/comment_feature.test b/docs/_style/prism-master/tests/languages/bro/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e1eff305fd328f0d027fcd4e4a3be9bdde64720e GIT binary patch literal 344 zcmY#ZR!Gjz%}vcK;ZhFqck$;^R#tHHjPP~kQdWqFh~VPVB?EAAMRRdRD?trb(ou+3 zPy(6@VhOrgPK4FOxxUk478gut42afp21l5{}}?A8yr0u zqjzjwBAC^L4Jlf8g`Z)j2@|cv1bXg1F!o>_BM_(H5XXh4v=SZ*Ik4TxC(efgj5{!R zze?&P2PU5e*+(vIn613!EV3xv&5GTyygB&Y{7Mn!qCle$6CyDp%cWPuG&uQUlQZSZ zaHo-dz%0wopf%>a*nFvJPHtrD9q|3Z1Dx@7?r(HFq>TR5^+Rq~e>wfbxqq6z8>%Cv z!y1>CYwTyuq`w;0DQRBErg@p8#&xiozbCCDdGwmTw4ei791ZFY4YPbSEqc-SI-*knAcyxA+I^<9r(c literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/bro/string_feature.test b/docs/_style/prism-master/tests/languages/bro/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..68277b5147be2fb41e4cdc5386049bbab1fa9e52 GIT binary patch literal 386 zcmbVIyAHxI44m;-SjUj1%%y`nUGM;@Y1FWy!G(3QoRTm>GCQCP4WD4U?(dM6TlqXA2xxM8?)znppBA4W6mNa&lq-U(4(G}VVC7X^OO@Zrb=8F)6PpXYim4@S81|JvmpF#ScsbaYVZ1)QMNx*Qc!yxBf_7B&7TiI b;6o5L6vQK%>b0Tc;?&^*0}X-# literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/c/constant_feature.test b/docs/_style/prism-master/tests/languages/c/constant_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..449305a71eed09513716b55b56ddb517e9cc864c GIT binary patch literal 656 zcmbV}K?;K~5JlGw%pF43ws#PXAdR-vxDp9sm6l2b6Yt+>B6N{#8Upi~H?x@kg~)P7 zg#aW3%S)%ym^;Pu;zw0HF79@CTxGv0ddmQnHDiD(O0OcRA5PISb*iEqkkZe$+{?V` zy$;I)2+;YDx9v56P7Ud2sdOhbi7*lF7}7=_X3z68d$6Bb3&PBq;vcX!`Is@z*WRr3 t^$&A{%-9`dCIBDXBMAT#Qh=D)NDIjP|FcV8L;q2DoEO|p6Fx#zmoE+Rtib>P literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/c/keyword_feature.test b/docs/_style/prism-master/tests/languages/c/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..feb9ff937784fff5b9420f6f0eda777344901362 GIT binary patch literal 1533 zcmbVM%Wm5+5ImOv|6!qX+J9(sD01ngy#)cmP%DWr#SQqV<9>aXlpWMwr&ZyYZ!WnHS>bGQTp8T4n#Q zb(DMO{Fka@+iwL5iuK+1iUdzz>R4F?95~I_VYI?3g<>m2{x+kp`E(IaHcZjwv3_#CC;vXz?ZL5C3w95{=?vBtD5mTZk6RJG#E?p_4z%y{ze)ubyZjUYt0%>W=JBC2&*^Kd*|6U13O64 zJ`}O$#rY`87L&D!qp(=Ky3UG~b?4V$>{UXZURZLjt*b+ev+BLWBZzgt21G?|JoVB1 z5L>u^3U)_9S`5*1WZC&m2zI>HCE&>;Hh-OMSz}*-&#A+L!4aj-`-73FV*xCA#`{e&8}9f zh=d*kI;4acRdU8OsoW4yFsnpEGW3SQ&>3OP?*~1ru85)va^+V0TC_H9?e#9+_hz+lHGI__;9Y&dlv8? sExn0R+EBW+%Aanh>GBHSpF_px^S|x&^Ys38!N;=Vcs}Fz+g((C0Q3+6SO5S3 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/cil/asm_reference.test b/docs/_style/prism-master/tests/languages/cil/asm_reference.test new file mode 100644 index 0000000000000000000000000000000000000000..991f998cc2bbc28137bb2d0454e67f8a379904a8 GIT binary patch literal 189 zcma#fEl$oa%E?TM<>JyM6L4`wb8$v1D3v7^WhN%&q$=qsC`H4~RZ@uMqR8-&)Z&t2 Zg~a0G)ZC<;N`<1-wA7;1yyVnkE&zluEA0RP literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/cil/boolean.test b/docs/_style/prism-master/tests/languages/cil/boolean.test new file mode 100644 index 0000000000000000000000000000000000000000..c6cfe746fd036fc6a004fff9569d1a62fb0d3b33 GIT binary patch literal 186 zcmd-oDJo6nN=wWsPUYg#B?EAAMRRdRD<$RU=cFd)Dd{LEflO42)j<;lTcH%o6-%x) PA*sbB#R^b+iuJev3bQHg literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/cil/comment.test b/docs/_style/prism-master/tests/languages/cil/comment.test new file mode 100644 index 0000000000000000000000000000000000000000..97a30a459fbce66fcd3c12937c62f835949d9cbb GIT binary patch literal 191 zcmdPbS18HIELH%bM1_*n;u0<{T`~a|S2P!Aw1QG{er|4RUWt;9f|5SE=}HQ*T(Oi` O5dw5#u>#bJVlDu&h$>zH literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/cil/instructions.test b/docs/_style/prism-master/tests/languages/cil/instructions.test new file mode 100644 index 0000000000000000000000000000000000000000..fc01826c814d06ea3cdc5984641ee61290721e42 GIT binary patch literal 7817 zcmbVQ%Wm8_5IirxBJepY#E&HYiQM)UWe-rT05L3flf`Ow zlNyTbw(COMb6H`d(uwrSiS**cyqTU0cP<@^YpFPr%BXb+*n4`2k5*0(-$FM$~hJN(TZ?>v^i|YU*Vi09`3qD;>{iVlRZD$ zd4|AvVoYqV#^185n3_tP;fE8cIG z=Gn4hjf=1~$#uLXRlC`=yG^^Vnk`J}XKzW>Y-yGileDZ@7Z|04O)4-+1#BuHL!mt? zTMMmW?v~X`TfQt|40YIoye$$TVcwRN>$IeYU=QcHNY2HNVLf~ed7j!hoW^rMt|5*1 z(6DTdRZv3g3Lhyj9>RjpgsP=x<+d z-P$aw{nYDLueWxxo(-g}Rku1L;QQ(jaQaYClri8OqI)|dl(UND$QW>*(Y?J95S-@l z_@j)KbCH6kpQ?41je1m^uViZu;IFZGY*b*l9SJS62j5X1>`u` z$OVJvMyDO$1PPV1rNZRz)y|%(FHfWjC}&g!MQMrWSk;|JS{Jx>ksBAebCG)w;lXwn z)W0wu$Vqk`&FG)#ZZxFhAiV3H8#3uQEbr3y=LHAqJ$l*&|3u!MINlC+&F@YeZxFlm z-HGEZW0$@=alDCmbex-9%=Kz^2Xq%9xf7h+xl67CNjiYLk_ra5C(&+qDc!2)#O_?8 zd%cA@5btFk#+#Y|%iYaEbTIjTCn$E~6Ro@hdhN|S7g4K7Ta8-9jNH1`)G>mb)}z>M zMMAh}x_}c8FQ+;nLOLQsIwV3nZoKzB{NO_$eMtQZ%BB0f6WFI6%$;6utl0}#ZW8&@ zEF;R-^BqWgooRZlGNv8On2w5=6IjOfc)hyp)C|H-5OO1|yqzHAW>~Tlaysqi>b2`1 zp56B)fj3(p(Xo=G*Nc#jl#rfvK+a+j+F?0M1)BU|m8^^Jz5Ha=T#cM5%iier>EN|H z`x%l1dditbaINXh3>>`~7@}Vj01n5w?l9vd9Yb!z1@!Qir;-e2t|U@&SqejT%WKy$ zmJFC6)ts1ulDcb^e3|Z#Y>GaiSZ+;Fa<)wa`Yd4?In{kyMeC&I-12y$>q};+#Pi?xD zr}od93Eknz?|BIq}+#DV@OPs}A8M zGwgD7w6LZ&`D{&X^2{*HQJj6*GS8}e&P)4<{sAw{T?>}?3*PeEg2P<5*Nz;xz$`0% c^(B1y+sycXz2)ZLAo({ZX2;)*?YUpV|9Bf~!vFvP literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/cil/keywords.test b/docs/_style/prism-master/tests/languages/cil/keywords.test new file mode 100644 index 0000000000000000000000000000000000000000..53a4645a25d293102ae1264a3c7497ba6636cdff GIT binary patch literal 2787 zcmbuB&34-$5QW#Br||JQT{Owb$%AB?j!e#c82n78me>mWY7z~+i-~uR{pf-#G{oph2huPfjn{^Co?2h)WfHPA zB@T9`(G;eUtveVm_0CjZh(kRPrxX+M$K;)rIr*b-7;~#rpq)9GFt+t*+sT@wim69j zkm+_lnsRr$)DQRc>P8;s?DphLDC9<$CsXVzxx*Bb1Z3?o$V@KeVuEF9Xtexz&{AfS zQs$BJk*buf5U6dTS_#(bQ9E(k8J(ntw-8T({G>b4$|^hRr?UJ%X(g{?_B>KB#U1%+ zo|ppXq7go29}C6dC)*ciLm1dI4eVV}wzV2FNJ(gsJF6_0^mFGFPZ&}(muEE(jGS$%ELB5&% zk$n#G5c&R$@ZNTN=PFk{K{AI}77Ie-M+Dg5j0bwZwx1dM+ZS=?UXY#$wcx7$MDT z7}r#Xpl3g3O%T>l3W!|E#tIfCSs`6qAXUAAV3D9z^l*>RS*Q@yJc98rIfJk%93)-z zFk5sGGrS5_%a#6jw<`eeg32fwp!&KN$Io8$d2I}SdQ)*UiM^iq%nwRw^jX sOD-u*EXm9VOIQO%(G`R3$EBK=E0z+MIcKCMXBR7^}0G5wBGXMYp literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/clike/class-name_feature.test b/docs/_style/prism-master/tests/languages/clike/class-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..04c211254ea0a3e36b8fdc711818042a69bbe554 GIT binary patch literal 784 zcmbV~OOC@J42IW1;tt5GR%&~Rk>(O13x+ys)W%fcsx!AA9zs>pvI$}Vn9u(Gus0Ke z`gTr=i5UH8EUF*lrNCcCI#=6#zu}C;p%~eli7OV^kVQ8tok7B<(%GXmY%gjTU-wc- zaon&H*GtiX%|hW2&waTZ$;=1`mCPN)fDjMEkbZ#nnqK*|sVHql)wJ8phe)sLw6XV4 zrHE}}5vYeN{ym*P$Bbd3T64(xeyT_h_Xk;i7@iy@NbB;sgN2lZHK1O3u&CP0cG&(os;- zhuNhRtAim2v>dB2$TcxVF?kU8D8=$}0TKC*a?VIi&MpQTTBJ~%nU|iEs+*IUm#UDM Sm!gncnp2Vq;X)lRE*Su%FPfK&Gg>LFG%vX%Ge1vBM?nc_x>BqT zShxTrT$%`z(ZC_D2^Pm@5XhN0G?8kUi4o}r@p8pd5;o2msma;J3TgR83a|hw)&l^d C>|VP7 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/clike/issue1340.test b/docs/_style/prism-master/tests/languages/clike/issue1340.test new file mode 100644 index 0000000000000000000000000000000000000000..0b5effa041c852a5548597239f34eb6638a042d6 GIT binary patch literal 242 zcmbVFK?=h#3_H)@KbY(m)_P-mM=v|JJFRXpG!Des|ChopyH-d7VJvY(U`B{d2;Bkf zeMBO$KQ;wv;)x9P|76ao`CYxMfm2hJ&#fOG8$FOOzCfS)0N5*@WDSOYz zEuvZYHc)buk(IVN|FBA3-!`XSE%?|%990L(O={?%SNGCaHl?*9YgXUU@=`HeKSWHA zL5%YEirLo?#JHm`&|{?Hl4J7X0yc=4WgE%a;x;i|O(~{#?~3_iaWPzjAf}JJd@5+0 U;h!X3XSB;&(hi(f*dw)Go(6L*@Bjb+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/clike/number_feature.test b/docs/_style/prism-master/tests/languages/clike/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f6bcc0b662fec96a14916d8ff0ab599f1fc7ae34 GIT binary patch literal 388 zcmXpp;^i{dGc++YwdCb8Ni{U!m6-kLnsUX_P(aDvUi&CA6Zt&~@qo0M9lq@$o@Vx$zSgC+)b4W>F(2Am1s) t@^S$Y`CfF+NKMWzR!GY)Qbj692vMRa9d2e7OfhUftQ78H{dZO2_4t+F zG|TCVR8idc;>j9W&qIE_g!B6Z9VZCmNB)8<@2P@Gun%EB^f43>n%G)1&O`41=oNU* Umy-CLIfqug(DLl%j;nI`2H)+dtpET3 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/clojure/boolean_feature.test b/docs/_style/prism-master/tests/languages/clojure/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..55720b4f46d952248a79087faa51179f0fef5681 GIT binary patch literal 214 zcmYdG%qdRgDk&;W<;u&<;o{OI18{Lgb8$v1CFSSmq$cJm=_n|rflO73)j<;mS%WDG cv{xyXE0$cloikFCvx^nd@{1IpE-2Om0Qti*xc~qF literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/clojure/comment_feature.test b/docs/_style/prism-master/tests/languages/clojure/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c4f5c7d182ecbb1dd875027d849041ebb19cc333 GIT binary patch literal 257 zcmcDvRw&8HELH%b7+8es!W jG*$;)4cu91j!=r_isd5HA2s*XcJ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/clojure/keyword_feature.test b/docs/_style/prism-master/tests/languages/clojure/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0c32cd2db4a60d2d48fdb44dc92dc86a3f52c959 GIT binary patch literal 7093 zcmb`M!E)Om5Qfk3Q@B2*N#wjh;vV`KnH(@e5e)_v;bh#W@9qM!q#l}K@r(c?^zrW^ zqt*JhRo(Z^t;V8tP#6`U{16_>&O-6~?1F;2IUJ~j!Zv)KzWaFJmK*S#Q_UC zu-Kz%=oBHP8b^oLiZ`%3*NyVtc_czN^%`a0LXREBG&Gkm(M`glDlrVowvFtyNnZ{6 zRCq5g%}Jow1-LO)&Cxld1bP#Do8yI6irTWLC8T!i&PRi$(znhyF%fiBi&qW}gchHRRG&t~(o zxp~51nunZVY|ECy*_MTc4>O-fm;##uAhId`3~p5gwiV#OthN*%c#~ZMKMsY z6#(m|hJmo3EM=7&*x4nCVIXa7b6UA7*d6DfEkjkaA~8_7Q7>eb8%Ue|oK=pZ=S3xy zzsx}#w=bSs2rV~oztqH01y9Z;tXvg7eiy8A6h6BvqMA92rHUeniN-@=BvJ`QkxXW> zRK-B33JT+>4C36PDG;lJN|9WKv3v!wO$-Ey#zN&FGU{TXVgy>nKn!3rh_`|mC1V7f zXypdl@hXS{hjP^2ip1EE@9Uu!dlgz(Zs21*RZkUB&ns5BfromiHHqQ&=QXR`!2SA3 zUyfP_eGCKh>*%zO<*Mj)cH*$^c0#2$Vj{9s<(-Q57>=*v8~N2lhAMiczmiz0;K?;3 zaZt9MgE;%uJUKy3hOdUfEFyOXD(6PBnG6(!$eBVn77vxvGhAQg)J~ShRE3$LN~oAv ziZG@s%1R|!Occa@**?w>C+Ea6i>ZoIY84E`gj|-y+mIn;DQ6^(uP_@}5rv7xj4O9L z<|Q+Q`EyRW%`1(eDkev3p&1sV02B+tUiQ8~w+NsOI=a`Y32wO{2l|3oV{kp3o^I4o84Ps9IEo7d96B7XKt PzK>hj54UMm#{K3mqMz0UOJA)=;4g#;y`QWxIdgrIh5s|w50-Pw1tkFD-H zqBJ>VbuTS^M+CMta&lRkq{-sx<4XwqkQO^CSTx?EVVxWtnIc-T907g9N{r+|wnbq) zkF<40s%v1r1Y_I_`6_SNG^^Il!bz>d$P(9l^u|^%@>7Dh=&u|>&V3%=X|m&3MVPC4 uYHt>uHmKJBo!4g}-VajYB*vjc-4mP~E(A;FP8M1X4+sn4fk_zQv?-scjEM>W literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/coffeescript+pug/coffeescript_inclusion.test b/docs/_style/prism-master/tests/languages/coffeescript+pug/coffeescript_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..ccf8963ba1b83c807a539cc929d09eeaffe6dd81 GIT binary patch literal 322 zcmbVIyAHxI44fM&|6rK~q?Qlp+KrX5%@73#EJ{+P*%1Fu9!2c6EDv|S)7ic8))Gn4 z;Nfk(|DY67bUP~R#^f`igUoXU>jTt;Q15}`P+oO4ftPp!c5u-*I)4FC14{w` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/coffeescript/block-regex_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/block-regex_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b01a9a42de843749ef2e386b4c011a59ad7e1dcf GIT binary patch literal 618 zcmbtROAf*y5M4{c9VXMQl`|NR(Xs$awP_0mx-c5=E|fM}T^Q>u2=jTo#~a32ZEYci zI-fm)L;rsvSv}3 zI-GCQBR#N$m*2* literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/coffeescript/class-member_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/class-member_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6fdbcf3e3aaf68622a080de104e3815bc1f4131b GIT binary patch literal 224 zcmZ?BOUzB><#I^N&yP<^EaK(j<Q4a&bm0CFdj-7whJx<|d^UDd{LEIe;us liq*j`3AI)!mX`~N$hX@$BQ-g@SRpOHNCE5s1&9NR^#Bd`Gx`7k literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/coffeescript/comment_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5d034ff0f076aa48d3b9c311640b689aecae83fb GIT binary patch literal 309 zcmY#R%g^WKQdR&`3Q37YK&CPhCn>Q?0Vu%B#ml8j1_0@c=H=pyR!Yv#%}vcKQPNRR zQU+S36svew?$ zWe|*#2nm9a?>Gd63gJ)*>w4=rzc!C%YQ4SBBBO-~)R}ub*qMERgb_Mh;dUGbc8g9V z_1=O{U$E(D{+mXx`<4n(XGA%8pb6GEZDbp<{C>-LHmgkgFv^GlR8&_RcX#1r zqDx|TrOQF1E8}9#7+lV;xJD^nHl~R$+s6kd+ypLc%@m2gMyT|IOEG#%dyeuj1)|7-dDCwYbtVm3oOpK*5R=i2zoPiV{Xs?0$ z;sdhpUZ%Jc6c;);)8RRQZ_UdOel_mRny0tn%EunlG(6MbWE$R|=^J*|L8FI)&N>0T z7d;Et*y|=^*G5nvqo`lT z)6s5D)CqwzDYQCO2ZVEVl$(`lI;>5BusV%Z>l@y!!SQqd`@QgZ&F7~8-vqiDVgB_O D)3f;2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/coffeescript/property_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0f256798760bf38331f82bb4c9aa7bfaa70b3f18 GIT binary patch literal 265 zcmYex&$r^`O3TlWPf9FO05W;Gbjbi9ebKyJoY6`JMfnA(MJ1I=ItofaW0hicAi|}2 z$t9(UC7JnoAQ>yTII41xE8tQXT6no)DRH24Mrv|)u|isYkwSh_R%&vI0@SgYsl|E# D!?-`g literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/coffeescript/string_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f5a68685166f20b622c6d4a31f73a20147666946 GIT binary patch literal 1321 zcmbVLOLD^?3|*TU?w}zHHgWIJ=`rjq{2{F;4z&KPI=y=(0g3H8pPEbtONghZhorR> z`siHPaw*E9LqjS2qd#ok9}L)iH+C@Hr)!I$arOuB4xVXVyc41(Oikb(lxzZ~#XG@Y zKRIY(uV;z8UK z)nUK%A)g!WJkPt_67fIRGL_>`9hPw9N5FeW5p*>M$t4~F6fs5mvlpc*mXGYoC5j|Q zP`t&oxX$y~4o%xwlTKAYSuZ8sh#*y-35p8cjrD4gVl&lNQpZTv@IS%+p`J((6sAZ_ zvQ=fK7L}g%SZILx6s$e9qWKGR5!>s5AXsCZjv)Kvda>sz5yda=^7Be@ph4L%Un$*t z`!Ln1hokGD#~Eu)O1%b!t$}OtrfhaYNMbOs{@e$DFulkxd|?pomyF*Uz7rphPo0i ng=(IiQY_H4SResJpVMJY-;3QAy;m11=i wq9IJ(yu{p8kOa_PpfD-QL2gru<>dk*@*U`$k(!)ctdN#pqyX_W$UVh+08(#3jQ{`u literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/cpp/keyword_feature.test b/docs/_style/prism-master/tests/languages/cpp/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..180f68ef09291d4f7741078994d67912ead3d7e5 GIT binary patch literal 2699 zcmbVOO>f&U3_Z_){{xY8cjz`01A5%gD2hOpnOLYI8Tv??{rZuz+;t&$X%SfRBSp!i z_+E{7$6zuT9^(N_K7pwv!b^;P99|NdSFk1{J&K*d&L*|T{lmVr$@g#jG7i?8oF8e7 zr^SPfA(NG#__id5X}YI44J|HIgbA%L*M%nsQ#}Ql&|{(ZNWc2xX?6|fU)D;F*^ z)%P;f8z-;)q&FH`)oJ9S^ZUaOE`IF}JT?!WG#8$%KI8E96My3{4o~CorH}|3p&#kDV+^cGwt$DR&t(k>kYi`BRnqApu?S8pH)@fx2>G^>z zl=w^^Vhz)Y1UtQG2I^!5X8IxcwqA{oggfz*#2Q}-nE6Y9j<5LbRx80t-yo061SlLk zAqxDRAeB9dF{OWJP-$2hRp1-LD)BqziY4z9EG>87YiMP_L zbZ?|D;YRoWfx9SZoBUM?Wi6|Qgqw;8cvBT+6P6k2|3P*%W0W_7WJ!y@>XeMpbW4T# zDhfl>H6{KgbaDX;pFq11N}PmIiM}bN@bAhgaaK|#(5jrmy$h*^cWL-n`nt?28+2_J ikv6SX4eB17mhYa&fqtJC^j|aD*WCV1Gu}g2_WTDx4_wy( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/cpp/operator_feature.test b/docs/_style/prism-master/tests/languages/cpp/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a29f08ea5b372ab537978f0da5a8a7c738355eab GIT binary patch literal 1299 zcmbW1!ES>v42IA1Q~V&ofi&ZeaC+EdRApjYr%kQOMtj%+_1WhH?UMbcB1MGHe{9Rd zcJOG>qJsBuPC`K6%MCRa4B`}C(I{F)r3gXIs;Cus!Ckj;*CWAS$ z6Ds5R4Yr;S-+1}F#xHwKGtSdBuE_0cn&aljcD8IQ;_rAwcJi<*r?102T8wgo(v|y7 z&OBiaVJ%@5VV*g3DRLe<1aiLbBg~~YqO1v92pgC~r$p%)Y#3}AtQfR=LL%ACA+%<2 zVQ@$=uTsH$(lVtw<;OkyA6*xn=F%;RM1?GQWw2l{-G%HDvm|LX*TUzSTho!;*QO+f zwN1Ifn(BW)SsQa|jZ6&GN9uYawsF8|@-6#&2gTFJ;q`dIyG@+&bi&`rxID@)f5%yi literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/cpp/raw_string_feature.test b/docs/_style/prism-master/tests/languages/cpp/raw_string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f9a896f882d464b731109b978041188cfc08eaa4 GIT binary patch literal 370 zcmbV{K?;LF3`N%sGeC&RiU^r1Va7~x(g{(t_9xOZsad%guSA0hYgSluMoN1`!A(n+YRsE!Gpq(NdEH5jkbTovEmL{VAtmOisKo{y5wa60beg-0N6Dlt|yy2Y)(7dx6!knF>(^ Zh2LQIPZ=iHS)NRN_TtcX;#;bp!xP!jeGdQt literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/crystal/expansion_feature.test b/docs/_style/prism-master/tests/languages/crystal/expansion_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b40bd1f51ff615f9d7a4a5e5a5de34bd92165dac GIT binary patch literal 648 zcmbVK-3r1W6u#bhii6y>I+xrio%^4v7<-G1GsTC(pf+jW%4zcx1w7#jw?+_%-e&WAx0) tx{Rt91J^3-bRl?n%p|usn|Vmv0Jiq+4>!@=N4%;5JKhWmr++YR;RP2Kr;`8x literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/crystal/keyword_feature.test b/docs/_style/prism-master/tests/languages/crystal/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..962beadf84ce93712d694dc66eec9125f14c6313 GIT binary patch literal 1886 zcmbW2&u-f=493qBpm!j0?(zaX?67t~fTD+8i$YLrdJ!T^uKp}bpMI1aZ;2^jLj%Kh ze)=Ra6!}H(V+y)Upsmpn>NUb1e;5b*fcglXjwnTEb&U5?^f;8e2ec8(%?whY>j7QN zfr!f^;ICBB-~$ZVNnr*suCuvEdd8$(hbo$P^fY&CqS9Zaux1aV?t+KW_t_#iS_S+7 zJ|~#GaS21wPr>}u31JF8VVAInfU(OI;+9?}@A{~crv(G192||lWkZ2Qv?MQ&0p`7d zet9k^PZ*>~2Xv6m6V@AToSktd8A{AM?LyzYqr1fzrN}NB3#T&WbTAa{$)p3E4cZ=* zdf0teik^?p59(?6{HT-^N`2cs(Hr3fN%8puA1S1Gk>bN zpef6)L!%Pq+FHd8oOyQUDrZ`%dd{*Vwho|1b$eWwHem~_+Gbg7m8C78SDI^4UnPpV zjcIH5aay~P;nJN9`g(dd^+(;yWPiGuM%FpGv^Sr#v^yJ_+kaW=pBcF}iDlANVrJK9 zY*Jl>@!3^cn5SZP9j>h|#Bp&YqU!_|n_}W(TTR$FksDiMld8=%Xt6!Q>u9PEGI{aE z1|*;4lzfxH>Z6Qae6_*<`Ya8uLtKovF>f~F&8rl2ecX+|9@?mYFx5 zH*cnO?K#`LDvc@oTCTBd7{=4&a=&L&NEc_7y-W##OUif{pybtNQ^PMO2A%lF%b zkc+-xP=~T89EV9VVKu776QZEM^TI&836%UK76VxnYn=qfPTj z0ODNsy&3pN=P9_=95ia_P^CvvExd+RHvms*4OW*%L!(}8T3zwrD1N?@bca_l3Ol~e zB#v8dC|;Ik$27W=7F=`RI__>A)s3&~#SQqWAN#U=({N7&^h%$Up;PMp8FH3cwD9$3 R_5C1%W5&WHWwi#G^9#Knb)x_P literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/csharp/class-name_feature.test b/docs/_style/prism-master/tests/languages/csharp/class-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..113982b6fe01ade30d87dd5c8b1bc0441f6e3038 GIT binary patch literal 709 zcmbV~K?;K~5JlGw>aF|@iLRA1YcJRagg zUzG(SBghnQj4A^4b6UEGP_D?=Y|4i-#kSB+!uTRi%w-k^x=>h!vnU)AC3swiQ^3W+ Vcl&;vu0}VVsH_v-y`W|2_8%+2y>R@s{e3~PZEUz0InL}XGrK!0(V&5k zoocdzpfZo*6ao(jITFM=s#g?(f8acWO)`>A+ndT;Mt&At6Z_l;pU!#@2>^7NRZ9 y&RQJ6(+xi}{m+2y>OKi~mcG${>fM$@g0q7|Uk(!p)iSj0GB>HmpBp&yXr?zVe$_~lHG5CVGV z-Sq(W+~D15K+(!&#tUFK{(DEnmv_eF?R}!pBA_X%StSC=Q4$Go5uOMl{H9@Ap{xq; WN^yb2bIK;QQ;l~|%bnZXy=^vXjXECy literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/csharp/issue1365.test b/docs/_style/prism-master/tests/languages/csharp/issue1365.test new file mode 100644 index 0000000000000000000000000000000000000000..6aaf3c71696b2469d209762bc8a9bb7eb6d40dc0 GIT binary patch literal 899 zcmbVLy=ucS5T0xBI~?lbKvF2B9g?k?4BaxC461W>L~JQoc0w_E_e!$PHKHZOLet%S zKe{^!*+aRlaElsG^tMVstYjoXTA4TY$1v5BJxmo)XMEL5V~M#vIs z)S8zre~Y7Y_gRS?a)2oLZw&Sf((!zU!O(^X%DO}icUu)Y!@qi|wc%VME!0R*DOg1o4XJ_0N4TYM)(w%6Y^FV15d&9aT_q z!UP1ngPE1=B`}%#-o5VuKFR1(s`1sOlqfp-ma=j2ig)eJg=?Co@R^GELhub;Ln*h- zmunuuPVyMO$Q|qTQ7g=Ifo8%U4K;Ef!E7l7J5S;37-y1&R(Q={hoscT_WPqO`+2$h3a++}|$N_H8Od7lmI#tt zrf4RW=9}0&)MT-eEVT&(Tlb}7u5^5UfF+1d{3tipa>JC3-gDsLFmnTDFLkA)S7tSg>p*3{R{M6LVOZ2q60Vi21Z z<_~AcZb=po|5BP7Wf$5QG-|?biLOj7tlW|Ms!h|SxU(rWE;^opM1Az2J^Kx-UE9I5uCZ!fB=_n`}0L@d1<>dk*@(p#)NKMWzRw&6x zEKyKOQ&K1>N=?hGP{=F>vhoX3i*hOzGBVRMa)7ubHANv2D4tkUqL7~k)RL+Iaf}`> OS8!^og0h8ynH~T~oHYUf literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/csharp/keyword_feature.test b/docs/_style/prism-master/tests/languages/csharp/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e1c37f0a08db0655419967852af362599f45f362 GIT binary patch literal 3400 zcmbVP%Wm5+5Iom_|H1IN?GNPG&j@m$rIpQuCIvp^xL@BHO7^952ofZuG()bIOLBMO zPNily)cwwlBbwk{LD&BVi=&TczTV@2?&drOo?J1sDFw9I+y}aQ1vGSGaCNxg<>E41 z8$Jw%hu}(iL7!rQ4RqDVhDoCh{_0?Aw8^yqZnR)$M}wo4rw?PodupdZ{2txa!y^lH z#bUdnT`Xd@ea^uT^wU18<+$HXu8*30bRpdF?my|#6q3WJDZx!N=IHg56HJ{A#5trB z{W_z^U~?vxFcz{>?-|Bd9-|j@2L@AEN4Gr*6gyo!an-y`N=u^rH5|Lslo^s zIwNQd7M3`s$OvS^GO}G^h<$AgQ&~5$mLq!2yrckEcs_0y%f0JwcW(joe)sDeKb-fv-~D(!e%SqneK`I+9Nl(l zj&DEzqsCF8yjBX=;CATc1l&Z0^J)s5cU8f-yb9)RRyeM=fO+2~jEz?~GJ=GAick!5 z2Jpk{amLBOURR$YH{eB$W@gcNPc?$ta*t$sGLp=ioh0>0SBgv$WI|KKn&AY)l&4_i zKm{`?Dtyb5l49BvM9-rNUlXfjkZBdp)T{8M4#<|A)p%rU0V91YwC8h0Ai*n`8DHRj zQs7n-6s2N`q$h`NWdz*U4*jFpXk%(wUZot?Ct(5wOQEP>5{_p9KWm)g><08}D`jaE zCe~W1h^=@kYOSV7?+7mXaLBl_I*@l7x<3*JENl1e!uu#ikfYI0>(sPEcLsNgS$A;9UkD-}XEF XeqRgz;XgFxfSPoG06uJ@u>Af9TbAhS literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/csharp/number_feature.test b/docs/_style/prism-master/tests/languages/csharp/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..126808037b79cba38724e8fb2c9645697c9bc9cd GIT binary patch literal 286 zcmXpp;^i{dGc++YwdCb8s7OjoN(IspPL58lyj;9ox?}*5zGz-9&S<5)(%hufA|)LK zB@-j1SRFJmsI{095NBW!2RlnCmX`~N$akA_Mrv|)u|isYkwQvpa%OH~jzVHyib6(e MMIww3ad@#F0L9ioWB>pF literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/csharp/operator_feature.test b/docs/_style/prism-master/tests/languages/csharp/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4749c38c75452e66955dd470fd1515dc7ef1651d GIT binary patch literal 1048 zcmbW0!D_=W5Jb-v>_3bJ*1?MEAMnbDd`5^Nl$1gPE>4aj-`;K1UaC1o==3z2T}G>j zgaIRZq=Xp7<&0?(cSk_MA}%VDVo;2VUXiofxgscvVo`A&f=P?Gl%ZLiLKU5QV3`5k=p$6W&xg9C#jgFSLGl@6S!)+Xv$ED6`H}v^__v*xGW`v`5}BvhWRT4)_G8; z^Wl1tqH=bY;El6V&>;*gC`91k4MOjNXN?$;;y`au7_sdiEs6QU%Toe6__XMq@AS~K@@FwMxtTdBXs$Q)@dn*JDjQJ!J6p|u Gj{7fRodkXW literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/csharp/punctuation_feature.test b/docs/_style/prism-master/tests/languages/csharp/punctuation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b9a7bf1499bdbf15871db19805bb64cad342cbfb GIT binary patch literal 468 zcmbWzF$#k~6a>)PImPfRh0PvdEw=C&%P)c?BnT>rR^r_Ss}z&QUp|K6Gm(KU6H`KF zjwp0)+*z{$ZWj(HsEW<&*e~mSc~7GSS~L%WgXUIq`opJ-_N?>yd`9Gp&b#JK^RBtp V+?d0!4&A*T{qW^;`tWD&hyxFEdIA6d literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/csharp/string_feature.test b/docs/_style/prism-master/tests/languages/csharp/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2814cb561c3b989ea81db04d9c3d967dcc446302 GIT binary patch literal 506 zcmbVI!4AS83_VNIe;~bZnfrzrKV#j2ZA=$8h=6{-1x-vGUIwIv_xect5JBMN2pwNQ zG{~u8AU#vYOk@N^uYImkT7gicawLu*jyqP;wIB{HhUjN|!Ac_W#;)3++#+$4AM%H8 z$|{C=kkWsdNuvL(BTtqGF3EZRZI6oBkRr?kb|Cod_vw5!!!5|kd1;+r^&+($<aYiepWEQ0+mt>Zu zD(NUFmEyEWDVCQDh{(6iIU_YWyI3JDzepibL8&Z1Get?kIXFN8Za+{eCnvu=HANw* SQlU6CH#0duCqGY*mkR*!aY4cW literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/csp/directive_with_source_expression_feature.test b/docs/_style/prism-master/tests/languages/csp/directive_with_source_expression_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fc059f4246af8c6d518f73b7232ff15e05c9c81f GIT binary patch literal 255 zcmXR;F3Kz@(Jd}YR!FT#%q_@C)l1ILwdUpG<Q4a&bm0rDPVRCYNNEr7Gzt zC>0}YQHs?8$}1sTro_t?ONoWf8L7$H#R_TpMGDTr0Sa)Nfg(9M`Q@o83Q3g;i3-K} WrA5i9KyMZlr4|=w=I810asdE}?La~R literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/csp/safe_feature.test b/docs/_style/prism-master/tests/languages/csp/safe_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..af31d1ac4d7ba7dfc75fd7c48143e666311206f3 GIT binary patch literal 547 zcmbu5F>k^!5QXPP@_#sa@c?NhRMH{pL`$dAp+X%HgJqv(Lr7Ae6On)4BpwRN1~;AF zyLZz2G#c3yAtkRslvRl$2MS$*Q6Vgh071b!6;j=m^5j%6^p^_L4y7GjD;LWweXqaj z&6Bj-b#|~n-}Y^*yV<5~gZxmYE*@@hGGMT-6sG%BP^v~Nt?UoC{s0YLhqdAT^Fl`>K*lJiqim2?!8 zlpz)=#p+DVW8WTVtKiMh!sNS$hL1rIv_7ukxSV9updcF;VV?QK*4Q*@<3rL0)p068Te^ z{SQ2E*b7g&o7Lr*7o2usnbDokl#hAc;F{C^++edSSiW~z?Mv<2`klhb!z1^~N8ZVK q9kEQWsO?#zQ~E%!_{!QE5%HbFz<;-|wC5t1?Hk%iF! literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/css!+css-extras/selector_feature.test b/docs/_style/prism-master/tests/languages/css!+css-extras/selector_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3931a6633472b7390c38823fa3a5efa97413bf36 GIT binary patch literal 1024 zcmb_b%Wi`(5IhHof3P-}M1@H05vjfOGl&lc8)22$5ng&|e!jcrQISIrB%Hjj*|BG6 zyf0LPrWdy~X(%Wf+Xu`$gHv)$J8bj1wVgh^xtG@?cgMo1QgJi}`z6>Dl=u)_Eu6Hff_)LX!(YZS(ItAD>x zkqbzwOGy)O9bAorLhBvZZy;%Q3-Idwp0%LvR0xsxoemE#Sddw&htaHNl5B%bP$f(N ztQ`wLGLnmC8Sl8R#a)Vv-zJ1-%TLyw2`R+hRs$Nob@cO@4Sfdr@AcD!e3vF0?4I-7 lXKU)OAR6C`wXs7sC*ormil>86P7AApur63_#Qd{_(=YU$5n})V literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/css!+css-extras/unit_feature.test b/docs/_style/prism-master/tests/languages/css!+css-extras/unit_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6d5c15c8e60c5a19eaff6eb232d13316ada4d4de GIT binary patch literal 400 zcmXpsFi_>?GAv5X<>fLpFvuaYifU zmF6a;7Aff{C>a_UD8=e1L@Sl%WtM;hRDoP{HK;0puESIVbSv3_UMW{vnD~2`Vym-K{LW7L49X9!8euhm_(J%-%q zO#i6XILv>pf)<&nkPSEw2Ab~n%u9pSW^$g}YP)I&!6zI&8G}2k+W;*h;A-%4@Dmpi uyla3LrjPk1$A@OVEWV7v-@4Zk`pKuHxM!DM-ax%KtaLtXYQG!JBPCzz(G{Qo literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/css+haml/css+haml_usage.test b/docs/_style/prism-master/tests/languages/css+haml/css+haml_usage.test new file mode 100644 index 0000000000000000000000000000000000000000..c90047f28f99df620d41c3f7fbee704fc8849efb GIT binary patch literal 538 zcmbV|u?mAQ5QgUpzQd7OeE?UN?sgN0ke(=wu_UojM4!DEQ?zJZJZ{PV<^KD*R2UNm zm&Bs6FpOak1{1wgF9ZC7_(VCwf(#2*HPWJv$(Tjpq*YVAMG~3Y%F4(ygA#@9v;%XB zg*u;I$Bb0>M%HQ x@Yu~|HHwFUs?(6=Ir!5pDB7-!QzYVdZ`b}A(WPZs*qQepznRn; zAtRCWEhQjym6h(gFbD$`HY8N6hO4vx>n9ZKOMuiA%pn=R&Qj$t*-=(VCehRHS9O#&5(fYECh*y{tl%YX+GE&hi|aD16`ZC2h_+$@IBb9?o->V5z$YJE z(azh0%86(a%q@_wTah?{J(XTMrr9Kh#HHxmeI_C$RNsgPw zM=QV=V?Vn9I(IVFaXK(8xyKS9c+ctOff<87+3;#`K{m|6UuLN1-%TeDm(i zdS^TlD{C$!w4(5iobS@6+3Z~>Drv?D)PhwKPUoTEm8|kVSSIrj?(c&7a|5KxpeyH; zz2-86+aTx~hDH=2EG%t3Yn;3}{Z9#Dh`l{~shLKT%$=1}BA_c;! zu%TDCRVrH|8Lu>EkBQ8aQ$RMEW}1&CYcmiiSfvww|932Y4rf Ikrxg426cS;TL1t6 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/css/comment_feature.test b/docs/_style/prism-master/tests/languages/css/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a3899eddb2026b70faf840df1409328af0e767b9 GIT binary patch literal 309 zcmdPb($eSU($`W*%g5{tlmUM^iS052CWS2QmdXS7mser|4RUWt;9f|5Sa zE~Qupb~^GN~b=CI7I6oS`%U%eEarO(^8rY){r6G<&wLPQ<4p1 z#pNT$3XVNfr5jx6*-IRhv!bgdpN4ykWt}sZ`gq%61Q)8dSEY`H-h zQ1HhBUFx7yN`&O1lxikECW|vLNiu&Wr=d_2Q!O8Wk2PKazJc#JniSt6cf|>WCB|nx zi!xd8AD5qLS#(C5Fjvcc?U0)7`KyfJ!+aQ-f7m&IwGEaq#_(HjEE1i6Yt?R#4$6-7 R@Ya+?H{w_CuP7vE78b*iqS28Iz!K(ScX`*g&149ig0MGY)5*6`U;!84!ZS z_>e0h4cV0Css)laF=|eiR~nTur=?_x*unmp~6qh<@esNBu6`9|qph e&lTpZq{wG%Dx-Uci#69qoB#)3Ltv`ynzJW$kfs>` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/css/property_feature.test b/docs/_style/prism-master/tests/languages/css/property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d01e2d1dc0b6718b5adab7809baf9358f0c512e5 GIT binary patch literal 585 zcmbu7K@Ng25JlILaEGRA>VjoidJMt>N>x(qkf9CnKAwRKa4}mjXjDSbF6aMwnfX%z zH6SM_%OnhnT&NR*)g=>Cy{N5p0_$Xc{M<6a}ji`X#8{<+iPEQM-``v&B3tV*`~JHUvcIsgCw literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/css/selector_feature.test b/docs/_style/prism-master/tests/languages/css/selector_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5a5972013529c02f703f425d75db3a89549540a6 GIT binary patch literal 495 zcmbtQOAdlC5MA4(cbIgE-~rfr3}At!mB!jJZDGUZ9jx7GOhjk*=6y2rG~&XUMua__ zdJhTI+V~JFIT}0EBhKnU6i>F~jHIOGtomVAU&Gn15kXlcBYIJSpc6z#$+W&rPR6N^ z2HnamdH*6$7iaQI)B9&z0*WnS`lxJu>!_>GHqN?#dOVIwUIJ+J5R5xpRaxT{^lpIb LWTQzi7Z(n9wB?2H literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/css/string_feature.test b/docs/_style/prism-master/tests/languages/css/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c849d6044c8c0264506bac75bbcde424a956c550 GIT binary patch literal 438 zcmbVINe;sx3_KT!KUlsXMM?9BJ|oT{3$#@mtOEIefu?Gb-eMskdpx7@pdn;NDU>0_ ztfWB0Oj7in%hPYOAW#>Op!9ck1fByFwG>iR2P*LzDNYUg;O_Q{B_N?8N~Q?0Eq7pa znQi_fkrpXLj%@U|a3R)OTdj9g7TK?4o#o1n%D~g4ZAcb3w___se8&U0-1PA9VAz3= W89a6MnmOn(=R5M;|0bW5{P_*wKy7~j literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/css/url_feature.test b/docs/_style/prism-master/tests/languages/css/url_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..05ce8f9f74279884569e3eba611d22bc9fcce433 GIT binary patch literal 436 zcmbtPK@Ng25IozYf7tYbO$wjz87v2|1&yTDLjNy|wV>%q_p+Itnaxb_sn8yy=uFXmb3DQAz#hep%zOPp@3EjC>r%mZD}(kzO$o{8JfI^ z=+UM!8P)paL$-e7tof(o>0-{e33}&&8cGGhK7yN#Rxn-dFq-lOp|u*c3thTYPjicN A8~^|S literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/d/comment_feature.test b/docs/_style/prism-master/tests/languages/d/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ed1f86036b85e99d2fdcddd4d1002ee4b177eb10 GIT binary patch literal 576 zcmbVJL2kk@5Ikeaf0&vZ0rnAnKrg)!4tBC_ERv0Cn;wezdu;{Usze;HEKA;*S?`RO zPjrldoEKvGL}-UrE3K%isGN8kN3EO<__1tlDh}mL5?ATd(hm{t>F7FTemG~@1?8tO6{iLRTEI_jha%iwCzqe62)(YmMz83+&1S9M#XWxMPQ@N} zt?u<+$$(PJ<>)m=)GaW~a2{0mG9hgv)}UWUCu`8JL3=E$Q;F=1m7!A6V_9W_ox}X_ z(MncPDz(=q?WM~u+9nu>ZuU-GV&)M|haaU6GYm1Pw0bk-!Hsnhb1>oye6;UWqu~K# zPs$sW;Jo%;eaCEiXR-1@H6DWu=G9=t!L?C5YV{c{tqTY5&Zxv5>qy-@%+i|{Hlu2e zYA+S9_JfkroRaHC?}BcU$42asX~0Df%RIc-ScumlimRr^jbJ8hns|6RBu7p`1!;zJ z6Xo1Yanx|ybT(<{r;BYcGi$y}o1llWPXmX8!RacKMpJYgJeC?RqsA8JijgJ&9Dc`q zxMDs*G5IcL$3&a<07VE|j!-OflWj`W$w^lyhp~+~?VOL)`H+8^fZeU@yZeu~buG1r zr<*Tx{p0;(LGQjie%RhWJ!YFv&$rv{-}S%2oA=vdeEW2l?Y8$11(Mq5?fZvMnfQA9 zc=Pl;*PlPX^}L^5T-UgaCcsg3eZn@$X{_r}c{Sj`d*JZ8k+X50EA3pF;PD#17=v$3 z*GYA~`tvvbq}|JU^~cNRs4r*d+s$>gx!QcY{x3Gi4n|2Z;rQM%d>SY!@rMxzNCcJ$ zMPb)77)Soda0E31OO)dy*iXeu1L9)9N`DuvYA_EN+Bk57LRG69%XJLJ3JY zgh&~P;gXV;@SYv)rK5qo#rnx$|oLSV$4O(`eol@XF} zDZYT_jEok)c5UABHXCE%en@5~=919}oN_WdsaHwGd&+?d3vtFiT7SNRXDV{0)KZ#AP zvgW2#65*7|s(g_uGM)0XZeJjakf&@>_LR#~pHf--Q|jkqfYA9ZK#1~OAWV5b5GFq; z2=Vs9*nC^B@c;YIj1LFh9H$C;rMkMV%5!77uBK5pM)g&2M{TD{*|ysEZm0VGQsJ>^ OtZu96GVEMG{q+NSTKAs- literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/d/number_feature.test b/docs/_style/prism-master/tests/languages/d/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..817bd7e3d6693946b4d875f907bc729688643068 GIT binary patch literal 788 zcmbV~O^bst5QfhUa zys<_KYn;}ad_!gz48lU?*5yn0L80**DYUXaTT8JrNcp*y0&J|xPgj@QFN*6L<$COn zsMjN!1#eVY_t=empB2GZ{TzJ}w)nPoITpRHRPhsRH@OB*itLR=b$cmh`}FVn+xkno zNK$Lk!y;nz_Z)9HxMLx+^)bD;AWSpH({y8gpLWQ+oc=lexGt!{VW`7lQj6o0dR&Io qWI3rD60gU7s?DWI{kR`!$KwWA3Ow&$k?prXork3Rza-N=8PpBa`LT%r literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/d/operator_feature.test b/docs/_style/prism-master/tests/languages/d/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d7e291da7814bfa4a3f3bb2d0a6fe4a22d557403 GIT binary patch literal 1446 zcmbW1&1%Ci5QNVa=p9xD>tIFl3rM>3F+vTcq|_9W689+l?42$2P-`x2h-aP2r=Msi zZp|9+tqH-J7_CW3QcBj8YR!6;b+g8yI=#tRaxT`?D)sv+T45}UEDLI`;&A0!w8C&1 zH(K$9ehw0#Q6hAb2|CLR9c6@i@z5p>iW#B1?9d_w>cl~@1t>NE)gAx+rQ^=lJe-Hy z$L0R~dAkoM8Cn~jPMzyLb3DP9RWF z!*T#41*aaIC^+}vOu?}SM+$2A4}0_!)c?)_Y!qZor{LbtxKmKg!_tLh^o*V|owo=;o)0t}vQ+5i9m literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/d/property_feature.test b/docs/_style/prism-master/tests/languages/d/property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9e61b062942bb20bfd440f2c95705b283ee7d929 GIT binary patch literal 420 zcmbV|K?=hl5JlG&yu;v1A?*dS5qgY}g^h+tiUu{5+`dlH&_bXPapU{=|DTad@QVp) z1M3oKl@u40NNuBfJPoADMlM=PD7l_E_^+en(ypq!bhS3Ko&8>;I EH!QkuEdT%j literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/d/register_feature.test b/docs/_style/prism-master/tests/languages/d/register_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3eb57c6738b0a710f0e33076990bc2e1ecc619c8 GIT binary patch literal 3853 zcmbW4Pixyi6vWRJ=sPSvwU8FCRcUWH(|ulh@-p}FcLrk&}+bos8X9v*dPiIj$tC@rO< zEGQ_fs|jI+2^ob6(S+%o#*WPL;NCeA?wvC+hE%520JeIhWC~DE)D!hYJy4tv0rE)6 z6tYMb$s$=KYseb1hO8k=WQi=1C9;;RC2Pr${S-U0j;tf=EQA$rv!}#!9u`QnM509! zEfbc1WM+^^LAX$)3q`z8Py`2Eakrhg(z^dZ|tCkO}dOomf`oK#SH@Ju!RKyLc v;wIKNsp4j}h?`i%O^my&EBwFy2g3OM`OD8!`1<=LY(JlVg?~R4P9OdPaDxNA literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/d/string_feature.test b/docs/_style/prism-master/tests/languages/d/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fc501b11d46bf34ac8c649d38e02a58e77c42f7d GIT binary patch literal 1007 zcmbVK(Q1Q05Pa^z{ll>@Hjq|7pahzfyygR3A;#3S6e6B239b3}&Yo6lJYNzdFnhCm zb30>+%$Z0lOL@UmPzD%9X1!d!(8*ZZrQfvIN~@CMyr4p>U1}3Flyu+WnZr*VUO4>I z;R~>ItT!92mZ>#vtX9D7N!W2i*IReEc8nkmOu&KseMM399LPY?4cQ_Z11%>eId-4>UJqnV2YBku;*4UCgXO&l8IeD8IE Yr9>-yx2JaX_L_ZECNHdMqFX)w0xKc~FaQ7m literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/d/token-string_feature.test b/docs/_style/prism-master/tests/languages/d/token-string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..01627c4a851dc6956b47cf5f2af2af5536bd1854 GIT binary patch literal 232 zcmXS{PRq})<>e}@Rw%4aN-U~X0CIS_bjbi9ebKyJoY6`p`Pr#?y2T|$nR)3-ItogK oU`v!@b#TbStyYTVNXsu$06Rhf;)r5B084c^ZU6uP literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/dart/keyword_feature.test b/docs/_style/prism-master/tests/languages/dart/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a5e3c6c2da8c0e13d7925fcdba7f17031005d989 GIT binary patch literal 1755 zcmbVNL2l$A5Iipue`xtQ%H{((?lYns7`q*#VZZ_$$G_hKyxQF~hfzi&BbSQ;)752@ z4nJO~T@TA{x@cvtDMvGAGAVH^14v|cW3yJ*$mT|)NsLP#7p+DI-V4Uy69^cx^&8W~ zv)NoOBge>-R#Twq@aAquVg~{C+g&UETmx3&&&<&qSAfiZDv~pH5#m9!#e;TrxC>FM zcg|#It?Yeud}p5vA2*P~=*ih@H1W{N^NuHeb5IT|M*~G#4OWbtml*akZqaL%Aepks z*k0Peq_kVSA?3v;tr|CDH~Cl@FGU{)`}hcUqJ6QB3G9XHA!?=7&u{$7yjQJ$ybd=$ z_7JDxiH3Uom*MS+{)21H1lno{Sg4#u6*F3qJ1~ka(PDy*dUb_h7ngKEoM}g*+NiPD z&5wCQA%ZUl@X})!v-R=nz9#g~DV}cZ;nkfTttm)$v#-F5oh1l+cVwI2CHwS$cSdc9 zHsyiCIon1oQQN4GxsT5>~xXO8r6k)ZW{^72Ho`iRf@Ev?Ip4YnVB7Cr}MZ*be7Re z(a{5A3?B2B$y1{f@~92y*-i*Nh6J7<(VXG1+;uC36z2o4?DbNddX=rLw``RG)xE>0 z!F3`N%!=nmh3coC1A3s{~-k1;e5%9IWr$dGhta`q~VE{e1om%^PmV4oo5lf*8?MA{YdtXdYqe1xb)K zD(b3LgD98;O(UlK#5#Nzrk6{%Jg)2fv#i|-T}s{i3IAEn%8YWb!qKAMqWzGWbY5NS z4HoTQwo4@Wbcl>BTWv=u3N{!c1Y*Ls}vpSm^10`1fhyl8R&mfesnh@g}d9uYim zFa%*70cU{kB7nWq=txAXa#7GbCq>&(4U~dt+nKgfNKyU}tgECrR5;Ckuoo-{g3abt2y5$=$(g&tRD?L7B`y?8rwnVmUc(t=S=hi_hp=iavZFI6%2Ir%@a4| F_yU>{DVCQDh{$)ab4F@% PcCkWQevty$)x~-MmZLfu literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/diff/diff_feature.test b/docs/_style/prism-master/tests/languages/diff/diff_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0e53490016a7c21d3039688268040dd0a182f30b GIT binary patch literal 418 zcmbVIOAdn|5M7sqJB)0L9-wKu=`oCp28NbsFaq9Rr;1{`YF}6|ywA)~0AYw1P`yXa zI4h42=e&gHXi0O;9JlQb!)R6e&M1Ee`D)Hiwb0fWAwd+>dP^6LTv+Tdq9(y%)WlmC z(6558;gd-3A^R?g%o9Gh6AfqcnZM}|knjFN)dn!Vhjj=EsUbX^2HGAyx(J~eFi3fWhZ71^Wfm3sQUP1u!k}NWw36AGr84iVCFZP9c>I9AXN{Jsi%zHyJZ)sv zYCN>6Vz(P?O{(`7$n&Zccx~$%mGOo_yx|mK@I`*FPherNe&eIOBn%b_)Jhrv-NA~H zVF3mJR`f4{Gj`un<;De0GwhwK(W(?D^6chq*nx|qet@a9w`uSvCpuO`0;30MY(=J9u1hJXNbD*sfD<{#&ct!8)mrciK_y@(MpC@y$5xqM^{!VY zc}&yJ*rUwwqd(6$>2W1|6wq$G;5nfNrnU=Q$j=`r_>2I@`pJ0llwY{hYmov}Aq0RNa}+isC}2s0s*^YE$uNc?-E*PrKv cio1k+^)N7FdH--f3(U?9J4(eIy%L+~7ij4uG5`Po literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/docker/comment_feature.test b/docs/_style/prism-master/tests/languages/docker/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..054d6023d168b01d574d26410f92bb4d88dd8417 GIT binary patch literal 201 zcmY%9Q4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE(V%bqyV+DSPuZd+A4bh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/docker/keyword_feature.test b/docs/_style/prism-master/tests/languages/docker/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a36a7e00b6ba53ced883b21fd89176d0aef404b1 GIT binary patch literal 1433 zcmbW1O^@0z5QfjS`;Hk{LK-e> zDTmn4jK_Z8vFkj~Mz#rtX+j6OL6&ukJml<`=Z;~&-lyfBv#~L9rubPN_y?Jq>KI2d zE`M%SB0DPIbOMCDnFC=2-7?8Iv;Iz8--2)7dp-Pd=8&A6Ad&D}ZBsCnG_+;=Ie*+_h(8OaC9#jO*LyKX9#+WN&@$}lus^i=FVG*GAj7Q! z@urmE%r>4a8xArrVwL_7Pn{l4TF%saow#@iScp<(q6MP87AwvSZvgv3=1-jYL(8^t zJyS=F-pbwXjD;#mf;7^wKXoVmXy6z&6!9hvutv_>pBOrB!P%FEc$cT6$|Jp#OG=1U z3yY}CqcVC1K-5Cs1490p-jIsd=NB z)_x(pYMN%2j6^iKshQIbBZ_R+OkJ#ZNf$Ij6;EpLPC@i21(Q+rYEkBKy3w*PwQ-jM zfx4b&D^uWypX;&c@5b1hR YPYgZ}pMMMbTN%C=@TPLO+*#522gN;!S^xk5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/docker/string_feature.test b/docs/_style/prism-master/tests/languages/docker/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e131f0213681520061b9bee65be182d765d76559 GIT binary patch literal 367 zcmbV{I|_g>42EX|xkJg4MZJW_Fb*od5G=IbA5&6rP#2pHNxr;(A_SVfkRSSBz83@w zm=RbZCun|#8X#0ZUg~QRik9LTwqv2vk*HBuKC-%5?65DM3W6MZ-CG6ob83>4^}ND+ VqBbMw|F5%Ir*V&N_Q9FhSYMbKSGfQH literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/eiffel/boolean_feature.test b/docs/_style/prism-master/tests/languages/eiffel/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5750be06cf27d835178f9345f9de005d2777d503 GIT binary patch literal 201 zcmWG3Doy3(a!br922#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H(6xk|A*=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040EBWYng9R* literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/eiffel/char_feature.test b/docs/_style/prism-master/tests/languages/eiffel/char_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6a9b1248c0b5880ae557f32b99c3cdf6643043c0 GIT binary patch literal 222 zcmY#SROjVVS5*g-`i4fv`al*hmo6Cqq%WG6i!)j&IU})1Nk>6RJyBgLRtHrGXceXy d#A2mbUM?Ua-*)GW)a2}9g|z%41&|Yp^#H~xDXRbg literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/eiffel/class-name_feature.test b/docs/_style/prism-master/tests/languages/eiffel/class-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a7e15a6b6c7ac099f87e7f7bc005c445859da69c GIT binary patch literal 240 zcmZ?d<#O})=jC!Tafx>`aW>}V;^opM1Az2J^Kx-UD<$V778mR0CFZ6o=_n{UD#hwx n5eC|cT>|C~rC44rAR^x}&Kar6*~JQJ`9%s~7b$>TRICR8-_J9$ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/eiffel/comment_feature.test b/docs/_style/prism-master/tests/languages/eiffel/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8a6b93e320f9f3e72034c752aa8a85a22bec66b7 GIT binary patch literal 254 zcmdPZ<>k`VRY=RvS4c`M0<)EX93==3#3vo_a`AFS^Kx-UD<$XW=BDPADCsCD>FO%Q p>R<}OY{o7b19D3Y*fC16yj(y;zKfhQQj@cbf%X+CK%G^r2LQsEH{SpN literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/eiffel/keyword_feature.test b/docs/_style/prism-master/tests/languages/eiffel/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cb6ae29832dbd41b27ef282ea70bf9f52a41c3db GIT binary patch literal 1909 zcmbVNL2leI3_RC>|3K_HeMLS{^w3L?gI1<@g=i&Ll9Nqd-=S<5NXSzbw#*%pBgrDi z&X-&(xeKR8E(QlXMsjHy2iKbOSDr|~TEis~pc2k&<8gq;zmSjckk9FrOCw*{iSKbO zMF=N8uNRCnoF?3LEpYLD!TgAak-^IM#wEEp4m0QxLUYMC z89q2sn8zX9mKeBFNLMbQ;aL~<4UY8cN^n?83@=PEdlxb0WgJp&gqta!YmO{N#HMrd zunPSu?AKCZVdXrBgoR;G?#2NAt^unkT>Z-Qo9h}eSK(IPsdB{3cr32qT~N(8WVS0- zx?)p81fzvW`^v`QPYx5kNyI&uaTtf6-}p)1(>VNiI=%4wTQ1Y-fljWU?&(e0L3sxoc0yfaCpbf`S z;Km$NR`JpSCKzT7_m}?pAh(V&<~mwPv-FlS;H||Bs=en_iu9lbq9+yHxAV1L_NLXr zTN4|2Z))I*>F9EmBVDgSQ2_(Zi@^yPi~TG$&WqjkyM-D{oV>b!++uG3|-W6nPsyz%M@m=GuKZ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/eiffel/operator_feature.test b/docs/_style/prism-master/tests/languages/eiffel/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fcba4b34a2b007a8e07b8cf576c648786bb65017 GIT binary patch literal 539 zcmbV}Jqp7x3`XY)bcYX*`LQlwXX!EG20}?GG~kkS3_g3Dp+hTA5gyFrNqj;fV6%3E zwGd&F1c7)a2j|hD%ikI;Dy9J*iHWH_QAc0Tbm>iePs{j;i)mm&E^}+}OOHI7TC15z zW@@UWf>}Vm)ai literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/eiffel/string_feature.test b/docs/_style/prism-master/tests/languages/eiffel/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4b6692f8f559e9382fe5b950a1468850a46c941d GIT binary patch literal 609 zcmbV|!485j42I7x**lCTTnO_OIQST22T;I8+>(J_2=8t?5KVv!Kw$m*wWU7*XHdHs z+;ng;XK`70j4+`zsj7D1I72mrkqm;;lN3o}hB3SsGK5JskT8sa9Fr_`l?N{R8^zg4 zLDzd@8%PD@c!N$?DsGd5+sk3n=ayESiB-MQ+qJkg^~Gv(Vw(xxAcZ|o*GDI6=f&i5mx|}B?Tu`Wt$tczZ=z^TV=MgP R**d$#@5+}&Z=PTJ`~f(gp9cT{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elixir/atom_feature.test b/docs/_style/prism-master/tests/languages/elixir/atom_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5b1c47d2f1b05edcae786e9ae1bb0e6ab9aaf957 GIT binary patch literal 232 zcmcC2DJo6n<+4gk%qa%ZZu$96iA5$xyj;9ox?}*5zGz-9&S<5?lKfmH9R(#TkPS+) lI;etR`!GadwkyT*asd(fPH@ghP0lV>NXsu$0J)=B4*>S#GRFV_ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elixir/attr-name_feature.test b/docs/_style/prism-master/tests/languages/elixir/attr-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..de7cadc8981e4c73dbf585011df20d1cf18efbed GIT binary patch literal 573 zcmbVJF%E+;44fM&f3PyAmFSqY&p-?YT!9LtN{mo{UkA!SVW^tTCtvP-m!pHsLh0aI zXjOX$j+-`Gpf1upAZs->6lA)4Z?%flQN<2Q3|eV*{^KQHuGJ|w&vB@DL~i|HESTIB zq98ajhx33vB^2EX4`W|aNLVHi?D%$F-0;f-{`HVw%>2Cr31-R6U}22=JiSVqzl6ketq!`_vvRH3({R zQ(DdBMq*}!*||Y`g#SZDz0kvaqw!X+2ne?eE6=qERm(a?{~l5_ToWs4zzz+8x{Dogn literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elixir/boolean_feature.test b/docs/_style/prism-master/tests/languages/elixir/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..aa949797d22aef92453dc97a05c79389103b05e5 GIT binary patch literal 236 zcmXRZDoy3(N=wWs22y#MIlNrFT)JcckiKYMF3xDBr2PDx)Wkd`9R;Nlpy5ifI_Sb+ o+pvfOtyhZW(^b literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elixir/capture_feature.test b/docs/_style/prism-master/tests/languages/elixir/capture_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8a64b6615455050f9f3bf12ecec7d991103112fc GIT binary patch literal 770 zcmbVK!D_=W3_UO4e-J*Hgk~x3z3i}S`vvY8Ugor6s~sHsvag@yVn{+WMvXD(`AK?u zb{8$|K^%3sG(X0>m#t()Df;ofi?$8Dvs+m;B?c8M@Fa36By2z;AP)T)n(kYNU@XEl zh#kVLcz$3}o?^ulr#8F>#ob`M4$fo1_x!EKOT}9~gy;=nGuiomAl*@ubmEj5pXSZR z%Y;Q@wSqS*I5h&&o}}L|#!voa|3BVeofOyp9IwWPX F<`=Xh%`X4| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elixir/comment_feature.test b/docs/_style/prism-master/tests/languages/elixir/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7a7981d944907f6d49c65463e7cbeacbaa536e2f GIT binary patch literal 262 zcmY%9dk*@*U-zk(!)ctdN#p1oL9C9stP&Jm~-c literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elixir/issue1392.test b/docs/_style/prism-master/tests/languages/elixir/issue1392.test new file mode 100644 index 0000000000000000000000000000000000000000..c7d20a8366e6d893133653e894dcf2a8be37a93a GIT binary patch literal 318 zcmbVG%?iRW3_e@vJA_=^VD=fj_yjwa9cmk;;M%b^u*bKxC?cK~atQf;$GrM*SG-u0 zs5{^MMy{7aiqnp%IxWQk$CoP(<<_`xu$fKvG2j5GaH@Z7k^ebe<7hOwI9)kYRkn6- k=*PClNs6-jn_oiWm0*sJ9|WJ|1TKbS1{(`L6MW^WCkob4Q2+n{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elixir/issue775.test b/docs/_style/prism-master/tests/languages/elixir/issue775.test new file mode 100644 index 0000000000000000000000000000000000000000..d3243f80a8b7f9edd727e7b7fc5e76a015841915 GIT binary patch literal 336 zcmbV{I}U>|3_xch`82KH$RRQs{55GUJhXjDHqm0mrEL zRnw$Zsq;>^$Xg}`aVQWlzis+NaD=ve444UG5^#QTYiS`1$S|i6C<=p*>@C4z&aGAt RBB;CW3a^yGlAvF?{Q_{sRiFR> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elixir/keyword_feature.test b/docs/_style/prism-master/tests/languages/elixir/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e1b02a1ae3cffee2d4ffb84fd3f1b5f57a5fcae2 GIT binary patch literal 996 zcmbVLNp8b13_MqW{y_Mg_7iZAB>Qu2qczbB3A`ZVU2it=?aF z8t<&t+j&~?exu~36HKPbFkMdYA8oQoG&+Gb*%&;I?K;Y4)>VM4*I)pnPvOU>e@={# zn>C|VyH#V(HX=N|98-34C65Hu%pc6)G>FzYN{FOMex%zTC&A}<39OGi8u!SbXx{TE nV9qCF$02)QMKcFjU@g$oMJs+^Pxa@5cFp}t@nwZayz|E|rzk0JBYWlP}9k7H@26E2s1~qexNpJZ$D+l#_Xzt!sj`DaL%CxbI7R! z1hiLDw$y0oTlb%S(QqGkTnImT~}$#9AQ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elixir/operator_feature.test b/docs/_style/prism-master/tests/languages/elixir/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c97dcce5ef6ee0d9fa3eea7ea1040567d788b65f GIT binary patch literal 918 zcmbW0!3x4K5Jb-|>_2RK$ibL;FG((bhE)(z6vayQSp0T3f(N^EGHgP5%xs6SIp3JN zj;U>#nx_>+j~!c?K~Ufwl9Y~y z>`@jZ3o;v2Evc5gH>#P`Ox_9AnbbKGnK*2C=vw1+Z>#VVjTTrJdH4{f=M zt*)O2n8pu|G{JQK@uVUA9lWLrz!dm2!2rJmQ=5TCqN&S(BjMC#;E{Oh@&e)p0QZC6 T_BC9d`u=jc8EnqG(C+vFWh${g literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elixir/string_feature.test b/docs/_style/prism-master/tests/languages/elixir/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ca54f4be820506fe1e3a0a3b4ceebe0ad638592c GIT binary patch literal 1828 zcmcgs!EVAZ3_TMm|4^Ajhs1`2I8M7D?FTsQ(DVQuY}KHdS|$$AeEaOUDX_Vk#-V^z z`@NUMkH&V@WMl1WSx&TaJ{}%t)4Bl`CnirwX23CoI0y-t$4tf;AMQ9FWg!X5QH97$ z!gRXCq&jj^hd4+HSUfWMq?J|xc+Ru65ti0uTE#IQ*n&Qzb)psxNL#pr2$Pfy^TU8O zT7}vWqjSkJKTJ$C7KW)-_cwfKU82<>fofmo#T$&H1o(Z>tAI2e|6nm4GzuUNm*&NO zU4Gi_a-Z9Rb|4t>*Y!5v<;Woh!z1{;h$y~xD@JG2GkPVjA*EgT`~mo45cpjWxc0IL z)q=}RbAJp7Je?6V{o28DI{dVETBsK;Zn;3S9p4E3x*1hnZq98d)QcA>G@`(=8?Wfs zP2FXtoeW$p7I@V-2K=`)MKc==h71b!0Otk?F0_b9Lbv$m&UEYlRf;?Oxj-^273=%0 zyV-~~h6bA<^ZmZq&Zd+9cRy(*k4P9AzTN`OUleJDzuTwq{C%B$RMEzk5s%{P;Tv^X B+kF54 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elm/builtin_feature.test b/docs/_style/prism-master/tests/languages/elm/builtin_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..da96c1dd6c5a138299459f5de7f7911c71ee854f GIT binary patch literal 1273 zcmbW1!EVDK42I7`;vKA1;cY0{2W4{qXQXaq7KTl@Ai3DvZiQ=f+=1e1Y)ok15N z&qE+;H8Z%0DjSrzV?ZYwBPB;uDVlXShp3YR4>CstXp z+_{*81j(AHK-P$)SIzLqc8gaLiKIVKRfbq(mAQ)QL_DidvdZ18DixuNYAegJj798Z z1S&F@oJPsA4Fp|vv^}}(6A@ZdSMiaIU42#ItIv2~yXMt-GABDx(Be$N*{RJ@EB@VX U*QXC^KO^+~pM=&z@$G|FzmBzor2qf` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elm/char_feature.test b/docs/_style/prism-master/tests/languages/elm/char_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c4d33fcd2a973a68d63ce7c773d8685a317b0942 GIT binary patch literal 276 zcmY#SROjVVk5LDcd0^7W7)({TxdLfkE?qJJNMAHB7iY9maz5+xl4C0(%5O0hcV z5)eCMiemC0wkpN)asd(fRy${;CTAA|JyfJnoSB!Nld7AOnU|`Nn3tlETbfgn3E@JW HR;&jA2=qJX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elm/constant_feature.test b/docs/_style/prism-master/tests/languages/elm/constant_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..06f25f10e5c580e3534058d575be3cab8d12e7ed GIT binary patch literal 254 zcmZ?E&*$ZG%g@(yN-W~#a!Rby19FlQi{ed;c)57Fbjbi9ebKyJoY6|j`FX`9iFqYT tItofaW0hicunB{##wLa07^PTVE+8V`Ma~(i$=SsUY57G8FlQC(0RRY_J7WL< literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elm/hvariable_feature.test b/docs/_style/prism-master/tests/languages/elm/hvariable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..defa3ba74dc17f9bbe5358fe4236f967144f3d25 GIT binary patch literal 258 zcmYex&*$ZG%g@(KN-W~#a!RbyOUus(vg1vRc)57Fbjbi9ebKyJoY6`dWr;T#EArAOBZNaaO}H!qx{2y3;nmMllePqkelKw~vXj2$~Hez!O4@nsi>= zBCiZm*H3)tORl)hf1pbu{K&=n{FN-pI>VHehNf6vf3j^jVK8KQ)2m_d8V=9s4DOyZ zXQMN6{!9Hj=a=YMdTi#tg$l`jGbO(osU;h2mMjLNf%EOZPbEd%(sFZOA9Q>4>VcdZ KAL-=qN{SC&a|Ocy literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/elm/keyword_feature.test b/docs/_style/prism-master/tests/languages/elm/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6f1132a4ec619d60d70e45e4ff00f22f8621f828 GIT binary patch literal 530 zcmbV|!3x4K42I7J@(!Wr=}Y(+V~4V(F08g=o#@`)l<7g+(@LP>=g&{_SuZw`R&Ns% z`@{(Rnq!i1BXJ}FL4uQ)*H*uUJg*4%I6OR4bhM7FmUWwT5aE2_<+&E&)S8L6XIuu; zkg<6$(>3&~mQvok@Z~#H{15#eR`|u0Qm6#%Br4uarjV6XC1Xcdm}9v@Mq3HUtWAfY VbsYG01cgg6sZ9O7&&;xKP0#qx3i5&3>` n&PYwpE>=j(FH%TJP0q|s%uz_pOHs&3tw@CNAs#K(HJl1rGS-CBcV=Hn zm$g-;84t>1+u|%*R66Vx8?P1zB}|@K*<~JL&HO5vCC;jteWJmevVm?ERb23KgXbC!6HuhxZLL0&5yy&rYc< zde5UPgG3fj*iu0tqFbj{trCSmz07mU%chGEPCNvJ2I121*Fr@cEx4_A>elS>jMC^X3W{pI=wWW!|_bIFrRZEdCjV95Vo~-a@(ilR5owrIKq8Hr%8sQ%CtmWF?KZGWZg|KNQDbx?T z_Ji=s=qNi+frd_B#>xoB_1(gyN$A4djACTE%;r|Y)#8#f&c;>T|3O}kR5uPjjD^>? JXYk_S@^4^|u0&(|%!EOv|0IubOI z03*aB-g?4g>muUKBGBv`R@8nE4|uv5nQ6ncC?!H5gk)u5Gr%^$ekFAv0;aWEOIC18 z1+GIFCa)|vF6$UZ+`E>0l!>8Fah0}Ot=c2cMIkg-PMzOzU@A2t*TTuRCbtyhrZ!y) za1c;8_!QR8>LGT~QAU7ZA)UcsN86fW)!(_hyr~*AhRcvR(;7p^rPiXsIPR!xg1Q`H z70Z6JToV!882ixH2&5^}+U#v3_72=gZEotfb>c0-KerGM+n&DvZ$CUcSM*dWivJlE PvJyv5KbSh33-SH{AKc!y literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/erlang/atom_feature.test b/docs/_style/prism-master/tests/languages/erlang/atom_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1761a8bb91e4a5162fa20fb0727015636b4abe22 GIT binary patch literal 299 zcmYex&*$Yz%g=X+Pf9G}DJ2xj3Vh5=-)Pm2?!8 zfF>)&>YxjO?S+XKmgbkFrs%?Sz#RjYR{(-&C3Gb~C&mDQx>77J7Z8!}Sm%t?KYiB?Ex;Me}lTMk^)f=jNv7l_=>bD5=6sRf^^10wVH_cFssm P&MpQTSEK+nzgQ0dfTksv literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/erlang/function_feature.test b/docs/_style/prism-master/tests/languages/erlang/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..72d8857d1530e81a74faf09be392befecfceca63 GIT binary patch literal 416 zcmXReNG#9O;N?oo&v%GVN-P30)q!jUAX6R0j!}<^0Wo;Fbjbi9ebKyJoY6{YrFqFE znfZB2Itog~AUl;}brhnN3P8f8i7*)rpeTlNnA7mJJ(scqo9RmdF lxODPz#ZnR`&Kar6*~JQJ`9%sa2Nx?O=A|e=e1Q>ZaM$} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/erlang/keyword_feature.test b/docs/_style/prism-master/tests/languages/erlang/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3af1da3d3933fd8ff55525c34a52522b7a1ced56 GIT binary patch literal 410 zcmbV|K@Nl<3`N(|q<3goJ9CLShH*i#4MYP8pvKz^#*M?QY*@W~+W)^So;J&#j805J z5ZI68gd!VuDM>kg8G_bmBV32}- tR~Gw?&{g66$`$X=f-`TUFZmmG_MrxZ@}8ISwQQzD5+dn&rmLOwIRF&mZM^^h literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/erlang/number_feature.test b/docs/_style/prism-master/tests/languages/erlang/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0e5890f3fae14dbf88026ec09138d1d4eb2e2c97 GIT binary patch literal 383 zcmXpp;^i_@HZ(Bg~{Q zO-e0N(os+{F;a@vK@$Tz1XCF7Fic^fL$L~`;tOp` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/erlang/operator_feature.test b/docs/_style/prism-master/tests/languages/erlang/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..addd5d3dd393dc9070ca65f6ba92fc15cef26a4b GIT binary patch literal 920 zcmbW0O>V;=5QW!8;tnq?LnwR8<4undWnni&sY*ixQPtyjsM|#|vxU=BJ?cj*qVTb=LDr{2N(3#BmgYQ!E!Dw19 zi+hCyDGQy++ETccC`z=^vW?0&k1}@BV*8+_lqWACTS3C^4K**1O$@BtN1-iiuq(yE ssokzE+)Yxew3Zi1SKrDWevRx7*6@1V%`fNl`rdHj|76Y?f3|MV-?ygvVgLXD literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/erlang/string_feature.test b/docs/_style/prism-master/tests/languages/erlang/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..42770f6156980519cc220c042395b28fdaad6d04 GIT binary patch literal 206 zcmY#V;^k6G%gc)4`R03dzQyj+~oN@a;fnTbg`sY*HuNy&>)a2}9g|z%41(+L)^#HttJH7w_ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/flow/flow-punctuation_feature.test b/docs/_style/prism-master/tests/languages/flow/flow-punctuation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ba0c900515b6d2347e4fcea2bb7c4228300ddd4b GIT binary patch literal 289 zcmb=fQAo?rSFlnjE-A{)OIN6=<>lh#(j^0c^hNV>aYiep<>Z&^7L?{Cmy{-!Waj57 z=_n{w*C@pTDX?WgezX#rycJLythuDJAQhwm;vSGD>;~49w9I4$B)91S0CL$$_5c6? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/flow/function-variable_feature.test b/docs/_style/prism-master/tests/languages/flow/function-variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cda25c97bf47ab8ecebbd640a1bc6b3a1286ca3c GIT binary patch literal 690 zcmbVK%?g7s3_h>WcL+T>&^>^lmpz7fsG^%}Yox7%A-?;Jl7l~o&7R7ad|&bxiXri~ajV_**3PII~ zDi0x3*j841v;-z2G*McjbedR%2b8Mx_|4QR6f?zt+DUk}H*2qQ&z!r$Nn=#rC`_#^ z`b&3p`(1S4YPMK2uf=PX0I6f3!0%la&|c{23=#3J_o{q2sL=wC S1o$KzlxVze4BZ_q!d<@kyuZ5u literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/flow/keyword_feature.test b/docs/_style/prism-master/tests/languages/flow/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fc1ca2accbf6f0ece6d873a426b9028726e65db0 GIT binary patch literal 656 zcmbV}%MOAt5JlHE=|7N$CHfP{${3BfBPWG zg|%FEt|?8xK`c$9<7dUwJTSs&yW;WxRTyn5a%XmSw~#C$elDrAe>rXkfMs2Pg#7_M z8Ug|D5TpmoAmBZO^k^zXeqDxmupI(12Z(%wfni7rLOwcDW8~iT`Q-y^?<(oJOqLMU F?gP8}u$ce= literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/flow/type_feature.test b/docs/_style/prism-master/tests/languages/flow/type_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..53827c351afdc5191384e8bd762d8bc4b7cf1720 GIT binary patch literal 460 zcmbV|u?oU45Qb+D?j1tr>O&|vc5y5n+Ing*O(aQ+eS4E89lWt2aK{G+|Nqs~*povr zW!{2Q=853TJX@=&GYI{*TqiRGWh3g$f-tHt-P66+2(wjjM>y_y>8?RIG%_q7l9iD4 znn||RAI(WQ&ABU0yW2y?9tBk}-e! E0kbT1#{d8T literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/fortran+pure/fortran_inclusion.test b/docs/_style/prism-master/tests/languages/fortran+pure/fortran_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..176cad9ecfa30d62be27c883d762cc7a0e4aafd4 GIT binary patch literal 327 zcmY$jQP9=WRdCBMDk)0Lvorwlc)5%Wk0Q(uFWsma;JK(`brKpkAH2LOnoO$7h| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/fortran/keyword_feature.test b/docs/_style/prism-master/tests/languages/fortran/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e3bb493bbea430d79eae2f2bc266b0623e0cac5d GIT binary patch literal 3315 zcmbVOO;6k~5Ir|i{zJ59+W%l2XV+TCPHhKRAx@O45(gwWRQ>mzXD4C1dh`H7iTAx3 ze~dG4#`H~ITy6b zN~YO<$mm+>W15tfp%{v#RtaMl$}5Z`7Sq9JWqqn6>t~ppG^XlhPI<~M%lts>X#Bd# zwlTh!$M@OZC}%ttGIuuPDO>c|+z{fZ1lfl!2fXmKavG~)xQ;p>ym(tLbHy^q#)J1c z%HFJQn=$lr2~*IfpJC+HXq-)A=4a>ZaB7<{897pzvcwU~PZF-tlz2@+CPUyRnNfV? zb)&LOGfDWdfZT?hCYn4)nIoE8i_;}_BR0u6qs1xZFttrqac|_;?ZF~Ux6xuA3Alvm z*wv_&aUDvOx^qf?pRv6JL=e1&GM$91+}1FAjdMs8hGNp;T@EpnORW*XNy1)^dA7^> zI)*u0gfyQfZ1G?aG5I=DvU@L=DBJJNpk^lnIUEoK%s6}-crGp&*7b9g09$OwYd7~| zX1%P^Hpdbu+<}DNyLt^#22;5%`M&3vEW#O0Dhnt1cItPNGQN_0!1c}8Lfd@( z#2@_b+vdyt?)mA@@0ZsfyQ^-8kV(Gn9;J3pddGlg8mR3`NZH&p%}SJ7UKc|B^ep| zu5yeO*`sjPK|)nwBt%h4if6XlRY8fzN)>Tsd{tY@Kz=z<^_Xy%0!>U-#b#8MaKb>- zDO^RKP@C#Au9gADpe}G6g@Q4qau5Qggul-LX3&qx1eBeTZDq0jz#KE#$TDlWz zF5L*h(Z3KF4Gn?O;V^hIrR8B1T@_6cG2Xf)%Asu{#M(zON*XHyqtha=v|hW1wvqqO W_h0(g)8q47_w(hoTbi)9Z+`*BR7zj~ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/fortran/number_feature.test b/docs/_style/prism-master/tests/languages/fortran/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c7b4a4cf3c77258eeea338981459f3174e867d25 GIT binary patch literal 702 zcmbVJ%WA_g5Ik3)e-L}|B{nN*ZNA|E}zqmMZuVA%u2z zv}k6?St*QeO@BVzmiLcR=-g#CCFAlmn;X*YoUtS;n2HIdMNC{{lH0XoQ0>^ zKhP^Xi}p&xPN@70$2$?iCuhROU#G$@J2!$~$K7|giGL-HhV}%-tA>!%c&{6n;tVlN uG8&)I^psP0Q)4Rr4Cm_SNWuH^bXV`)>&HR8?e=Q$E*F>6=k<zTne6}o literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/fsharp/annotation_feature.test b/docs/_style/prism-master/tests/languages/fsharp/annotation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3445236d0d52e7f3b27ba0bc2a0230a8a4f8c97f GIT binary patch literal 670 zcmbu7K@Ng25JlJY6wRz40Tb9lSZLxUN*9Ho5_M|Ya(|~HU?6Oe<$oRK{emdYT9=ZE z;;2jrwK5RpoU$;Dc@`02$&QCH!2$saQ9I>2jSzE6D0=nSxPHt)6d>adXdcSi1l6;p zvp@zTSWJ`>BnzaU`ey;v9T&`&Nu$xV=)SgV-Ef#8V4dmk>QyU$YZXjn;Tvs%-1iuY x(EB#)@3O=GS+~a9rCaOc3CxGHDO;ELab3Xii?H24%jwoOcgru@@VTx%us7yPu3Z2C literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/fsharp/class-name_feature.test b/docs/_style/prism-master/tests/languages/fsharp/class-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..79399642463e1b000124697e68ee5c4b05329cf6 GIT binary patch literal 3602 zcmcIm$!^;)5ItL8LGa`Rv4P}hAS&9lLJM>WlHMF27>SC6$dW-(Ne$%VJHtg(Xezah z)ECr{ATUrJQ20kjsd`huybQuvC&YU*Cgv0!F*Klw=mGZ*?i-IRgu%n@DsMzt%e*Eu z(N?K(@tKSAiD%ABSr>35t#4(tdE!Ep8Gp;FH3Wt$0G*vfboLA&+n-awhVpxa2IqJ$ z*3Pt^i3ddb%Hl)ZE1Q_FxoDgECj;&@GcP15MJs>R)s{3l0h-GCK}G&TzOxa5QbDOx zA*WVX^M6|~$b$88!&AxXhl-;@!OMq20>->*m;}Y=GLwbi6&H)m68wj<5(NOVhbtHmDp8bFzgfb;GxA@Mco}V zs(uj)hys!Bo}zU)9Y&3)J%2X&`tpEw-5BtgLU#yZMAp&TYucm9gsM)m!`aMmhElqU zCOfg1exrSMA(x8QCB-gibD!wQ_of6R_BkQ+uExfOpT4;vdAj-`5_)Hw-5o{P9*d({ zv#sj=6K8s>M*lhm^r*MuL9%`N|7IijK=;drr8bz5zG=Wr2tA~5$FL?%w)|&;3=N;2 zyM9nn`j4lNRS&71x-q@VA{j=tP$lJ;pv(WLtIUqZF>fQWzyuAxI7h_+#o=b}8-x$x zzUas32DFNP(6pL77@aBOz#K3Z`@#NR2Hiq%kVXAghmcP-!h zs9_q~T}8>go*S+ywbKN`KwxN4?>a}=Lmq}qnN*rRDF^^YnOUBW@wYGWgHLI;OS#a@HK1O3u&CP0cG&(os;- zhuNhRtAj2FvK*^0$TcxVF?kU8D8=$}0TKC*a?VIi&MpQTTBJ~%nU|iEs+*IUm#UDM Sm!gncnp2Vq;X)l!MnQE+}wLnq)CW2g#RV%p$0)v67<^jW# fH1oJ($qjtxjMU`pVuiH)A_b%QF^Wmi~ke9Y_b0m|_KNWIJm5?|TQ7kje~=g=BN@ z?%lhOMg^#>O<)6+)XlpNH3&2a&NyojETy{!(J+Cn>>#bykVwe4kdzsuXW#!e+J_8Z zCD7}N-Pi!S?Hbi86V#z6%WpWOu;A>j5J&a>W!*tMfI!LO1Mi_Iv=qX2%E@3I!J84B zN+ky$oHm~X@2K>hK&M6Cz90YR#jue#&Wu(8)J`#^?oMVOPBLg~NLV^Z5>*^tk1!2l z^q5zjZzsHr6J)<7FXTP@c-%ZO4La_%#D0k$*Ce8yCe}CSvYtbS=2QE#Qq*bA@Z;=; oy~-)>wO0G1$1QRoJBzt&S1S+NfRU~8D|k~1?w_7t9#@?G027GU(f|Me literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/fsharp/keyword_feature.test b/docs/_style/prism-master/tests/languages/fsharp/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..17f058a5e335585283f8e957881638a85463bf47 GIT binary patch literal 3345 zcmbVP%Z}SH3_RC>|3RB`+aJiWpHb{Vk?BNTSu$ifkA8iJlC$WVEKuws4`)Pu`}<)6Aq;%Hn8_A*F%wNE%4SN#8sIps#hwD0XeU}`5cFN7 z8(3n3UtB{lX*`-VQ#6PvT`6Zjz-rF^%4?q2Q}E7Y;&)jy64bt5%!0fil}oV&7D(*s zz*#P!LQe3L@bNI^F>~1K%qcS~(t!7ixnc#^=~(}D|}4bH{O!b-@#UQ3Um7C!a5N0TrLSwPX3M!OQ&C)irHrDF9kE_Bzv z9PD=L53gU%$ALIVY*8S-C4l$Dd~Jkvy+(?0y;se8=3~ENp(%2FN5y)(ed@*m4@$4|^z%ZNl{$@+G&$L%ilkV_9ydMB%8xuhlGo!1W7yHTvdf>t+EoW zRae5b3IpDUx0Pk#@Lr}BAJpw;ujFyhkLs>5pxlco({{2I){ncxJwkfR^Y!c@N&s6^ z5iG6A2pCOA!MF)2+*?-?4y{W`xOOcC<}Rktb6XSEMOGYcd(tk;GskVQ87i6I?`LbC zf)|Zc!{n(&vlWKid;#vK;%+Q#Yj>6?y0rjn+g5m6I~V3??*ij?FF~c0K@KQ0K_5tO z=mh~nKL`wZLSRi_0N&@S3Jzhu2@r`t1&P8`wTa>Z-BK0HKZdG;(dnwB5pGrDNR%ay zM5}bICuhI#s)>ZdrjZ1`X(oX;4Fz~lUqzKLZz4;;Pthd@ng~<)-&L9Pfl3o#Q*8o% vsyJnWD(jlVf86d({D}#!sfoeEYv1AZc}4hxCGleTzYeHQv$ezJd*A&5k46>8 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/fsharp/number_feature.test b/docs/_style/prism-master/tests/languages/fsharp/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f2f86ed288d3a8ae429f7232c78fc4603da30dc2 GIT binary patch literal 1008 zcmbVKO>cuR3_UMW{zJrd6!A4mkL%P*mDsVTs)wWv0xi&qEE@d#C8k`!>!DF(zdYMd zU_0yu7m|{&-@b2mrgf-PCAeZwi3K7G!)Wru1dK(Lq%kE?@J2}-B)iwdzATU{2ht!) zt$=e*E?DPD@;QOV73Z1N$TO#uXBr?_1rQ9t!oj1pn+NCM6jx6iS9hZ1<>a-d5wi1q z=7rD|@9Z!5u}fIQb`7PAJp@N@&1MZ5e{vgh{)lT}#+72t5>M55R)%Z~y=R literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/fsharp/operator_feature.test b/docs/_style/prism-master/tests/languages/fsharp/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7e15afc40d470cea37d7a7aac99a25857f7d62c4 GIT binary patch literal 2059 zcmbW2!D_=W5Jb=2uUH%GgB{s-A!`r)j1WU9DTN+Vk{*q}y|XDjRGMBAGD>)iq+M&Z z*1V`{x(^xuTnTb8LIE0}8R|syV(#`KV{j$N!3YItfM%#OF}IuB&F$ub-5kJfup8_K zyZzYJ?LHt5b0HRUfLIK%7-BKRVx7n^h@_w)%QQ)h5*LYCqv4w+CCxtiPu6|kbzN8O z`(C$glMSP!P1AN4Kn8JbS>WA+?xTq5s*N;@E{pV-ED|30h#ckV*j_%**O#x$wLNH? zm-ckfzbrA9Yac zAv$Oc(Kbn(&Wa_eFA*aeb3Gf7?n4qnAFtmut1g+e-Ik?^(1^>g&cuE9V1CxnRvHz{a?7P1ssxm|Otg&zTt0PEV8ok5J# q-<-}MzzCt^jv?L4C{hOd`qKZK?`QE7-VX;=QBD3MWQjubXB8O)&Gm!eU%0hyd4Kr99VXb=?qKS(4YnR!Fl~cq+kW)|(;mGC literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/gcode/checksum_feature.test b/docs/_style/prism-master/tests/languages/gcode/checksum_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d3ea45613ab0a27bbb48df1d553feb8f4e63b66a GIT binary patch literal 185 zcmZ=avd}Uz;^NXJ18{Lgb8$v1Wv5n_=NF|Y=_n|<8(ApD>VO23Gg6bYi%WAsqCg9j XV!2|;wZs{0ltNm5kpj%rVm&SZL$fDw literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/gcode/comment_feature.test b/docs/_style/prism-master/tests/languages/gcode/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cb2533f89587cc0160dceeb54af0f1cebc109a42 GIT binary patch literal 347 zcmbVIu?oUa44l2M2ybekb#M|oI_M`9N(XHt4@ynRdr@(Js6s)2Gt0S$JIOTr^RqASQ%X2P`vR`}Z1 v_hjH@7VV9ij2il@_s{u7+ z-M~O8RtH@WXe|~|kUK!aXsUq@!&D4%DHc(X)0JYmV##&Bb4F@%cCkWQevyK^u0mp7 Pih{3ha(+r`u^txyH)TUa literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/gcode/property_feature.test b/docs/_style/prism-master/tests/languages/gcode/property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9dee88682da36eb92ae65bd1b43ff3652fe0d69b GIT binary patch literal 338 zcmbV{y9&cF3`OVaD}?4a37xv<(G0Lr!+cojJ45pN=FWB33} Ceov?X literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/gcode/string_feature.test b/docs/_style/prism-master/tests/languages/gcode/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d05306d7dbc3ee777b6e82eb7b7a79f8ebec4a84 GIT binary patch literal 296 zcmeY@wJ=u*R`QJu@(&Gh4N_7FP;zu~uBfcCR#H+hG%{A=;?gApaB)R*aYid;r&gBd z7o{laC@A>?EmDfr;Q|R46y+DB7L`kVp*NH8D!qbOd100d;c> fP&3HYAdOtH;pH+^aQ1KvQg94*_VncCvb0oi^Y>RsN-W~#;^opM1Az2J^Kx-UE9In? zrRFH)m13cW t!cDNWgsF!b0rUw>1kD7X|A6{=xqyg#Upi-`CTABbq~#YWfZb562LOXrN*w?I literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/gedcom/line-value_feature.test b/docs/_style/prism-master/tests/languages/gedcom/line-value_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4ab43e728b7ce0425d310b28be0148d1e1ca4444 GIT binary patch literal 839 zcmXq1aQ5)@QE&i}E`|=gTt*53K90@`hZ~Qy9qv57<#4ag!yOxr?0mRm-_hp7lXV{M zoN{!^(OHLQJ>1o#b9nC2orf15X+OMD=lIscYai~|cx2bZ9s6~TwjAF4aOc#cQ;*Kp zIlSxPuI9sgkM82-GF0$$^mSE8&QD3TQZO(!G}d?a_w{vDaCGtybJYh~?cx~Xs^FmP z;vVGc?jPjo=;xqdY^dPk>a1XBX=x5p;q31hqTrlgP+63jo>8KZo|=-JpX=ZNq4n~M z(s{Xfxpc_@AbruiT%6HLIjLo-IZ8STN`^|YI$)8K#B>lJ6h<(ioXosb-Lk}-(o~>K zbhJ`Ier8@tY7s~oEG(5`W1;%tCK|!CLrnw)HB1QAL?!A+0MI=U@4%gd?mh`|6<^{28qCWDMC2zC=Zw_k>|%wq{2~QVgeicNK(QVG Dr$iEx literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/gedcom/pointer_feature.test b/docs/_style/prism-master/tests/languages/gedcom/pointer_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f39ffb77a6c7b63cf25bb5b61be7966d65eae906 GIT binary patch literal 500 zcmZ=rQ*_|va!AY1k9SHe0x{!N6qQs|)zmdKwX}6~_4KW*ZEWrAqhn&@5~^!z>lBoM zYLmc94HO)LL!Ep*Lqc4G927uIUM@ogH%H%K1qUGM=@SVwkC#iA3;@y>&CA6ZtyGYo znOBlpq@<&u5le8$Q3SGf zD!O@ZFMUAJWD#m=K7M%5E;MA%{^jQWZZv`+ZMFyq>jfv(wFs+LjqdA4RgfxGSNuuz zPjTvok%%fLS(IC4Dmu+1>nz8jsF~#9(vvbM=eSzN=7iW7CRrMHqB?|lmoH}jaM$M) Kzada`oi;xOja*Iu literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/gherkin/atrule_feature.test b/docs/_style/prism-master/tests/languages/gherkin/atrule_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..23bc5408c58815cb43e576009288abccade00fde GIT binary patch literal 24704 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/gherkin/feature_feature.test b/docs/_style/prism-master/tests/languages/gherkin/feature_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..774dd363c85bfc9aed4762fc4dbae5e2c037ce0f GIT binary patch literal 9142 zcmb`MO-~zF6o%Ke9 zNlVlw!X#rNhz%tfl0X->rLN4lSzusuC6uaa|3vS#XME2LhDbR^0(;(b?lX7BADr`^ zfw-Dct;w^>Rb7u0BN~a5Tr@H;s!u9o#G;cQp5;fz1WhJo%78ge)0R9wM@=;~O4X!t zj*jZ|szpI8YpNPGP2~$p0pdI{NW!9qYFcW7$aG(?u7m;~r>JJ8NnECS$~aKel&WQ@ znpUMYNQsp-z=j5EPiuF;83$D!2l={|uvA^s2)`}WQXr5vC-t@taak?F(|LB1Bzx)> z0k>+9rwhEG^VpEy}!~@&X6H_@HsK9;3ZukAoqfv$|gc_F4bnjT22VyZeP&r+ac-VkTNvzi9Gei zF_O%h@L1J|YGwnPsmHl0ldAJMexWMZ;y5+pdTLarjO&+$z(2Z~Yvh#FFX@(%qj93d z)g1pc>JtEaiEo!A$#n|ALQ{p9hKUBXEdI5SO@K3ACg1~jIeTi14k@Ry;KlipT%U~B z?#aD;RbA0W6|Gj#Qb07wHA|PrUsGdDuRaArrt@mmm!$SheTvi<66%CrU#QJU{acOH z?x>-+YvbyHbBoOaKikXZO-|nC&&uvA$#8o_d+ZxzHGk-}x;cN8y}P`-usgT=aQCiU z(OPXiX>IJ?Zh>!0u5IkyYHb|Mww6KW#@;l~T?wlDC9YL?wk;l&{nEj#(t6%jDsc7Q zt-T))X7}&!KRcL}Ojazjr72ciR#To!j=2XahSsu9{Qa*w~nJM`#28e+3+50 zPBC#pu5#W}<}5L%!g-SPuT%c-Huzi}7UmA877q)r4-5Ij!lF!kd;7P43S08{?^5tM z8aeYGKha1uG8~P3FdVzu`DYzFtqc#x(sXh{H-7w)9yg|Z4KwH)ySi6Nmqxx`dqF==B!++n17PD_G z(Ul@$ppnIpI=wHBAlhXNL3Y>}O0X%%kVGGkS>J8_F%aPvpw@Q{1}w$%Bybqd#=t>* z=L19W%n}r$u- zT|=#xh8zatdw3WIwEa+=j#G$1_~s&tA^k`UCS+k^P|)?naC#c0C}1yd6$9*H$Kr5D z99$GGX!@d1VV@WSJJDLkfP4APsBf)az^;MaubpzwyFVyklVgCuS;t_28IQzB{~iT` zmOlpcjwt~K9T+TNK)q%WDBjWW1rB%I!~;h?W=Mj9hUO|L*3nT63Wu5A^zXz+20keC zaWf(e)Eg^d5aCG_hUE>fFbHqnbuuCv84(k$_ZWno5$n#6(nQ+iV=Y7R#$l$SY6{6@ Olnl{QS(2jWNB;vK`Xes@ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/gherkin/outline_feature.test b/docs/_style/prism-master/tests/languages/gherkin/outline_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..19fc54f9404f77bcc4243c67cf71c2a8b9879176 GIT binary patch literal 185 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/gherkin/tag_feature.test b/docs/_style/prism-master/tests/languages/gherkin/tag_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..51026ea1b1d1106022e8658484c889b67df470db GIT binary patch literal 291 zcmZ?B%q_?-DoM;M;pK8j%FM~h%u81QGLo}XixeCZ^YZd5dAT?p((?0pxp=vB$p9dI z(Lghzl}ZxRm2?!89N<VjQ>l2hQ zaK5)qdL&9*2*>=+D&mQ%6d3OuIM+&d)=;v1_MrtI!969E@EvFF6O+q?00h6h79RL6T literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/git/comment_feature.test b/docs/_style/prism-master/tests/languages/git/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c3d0358e78c659c3d6fcc63771eb980bbfa41e6e GIT binary patch literal 415 zcmbV|!485j42I7x**p9h7foOfV2p`D6K_5MZ~!cfD8sPw{%*#L5iT@6G-?08{TktB zQH`ao4O)}D%9flI5mHlHUxEizgnH=vj+yTJ&;z!UBdE4xjO2)My`0WCG~JVqT5AJRx=e~qrow)*tYWBW=3rIC|6@x8v%_Dce32>tftvGBg%m#5qo#)H NheI=rpMQH^r{9YLYc~J@ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/git/commit_sha1_feature.test b/docs/_style/prism-master/tests/languages/git/commit_sha1_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fbc58ed2bd59cab420c3e788a5cbc0307fc69944 GIT binary patch literal 501 zcmbV}F$)4Q425S4{SU{@DovZF*HK*D9Yv%~Qcgq!_5Y)yILcwjlHq&Fd*RFZe7tuB zpa5!1>Zy4yriJiwvBg=GaJ)S_-5!4>h45VlGv3`~m@- zN1&1&V*qqcy!zM9 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/git/coord_feature.test b/docs/_style/prism-master/tests/languages/git/coord_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8d8c5e2b48560a32074a089ed8f7138e8ae3a081 GIT binary patch literal 259 zcmZ>8P|!70&^FXDQgCqK<#KQU@+~cNj10h(p^<_%ga?%1<>KYiB?Ex;Me}lTMk^)f v=NF|Y=_n|HY=PUV6svMv9n9ie zcqjd#PVRLMhqk22Nr$qYP799f0BE#MtGko(k-nNorf00CZW#tw%ZQ;wi!7Q$l=gev zbv|0nTbfV?b;ld?Vw5-Gj_3D||KBW69$aF?KF{lkUdBx?Jh;F`{GCufIX=NTj_yUP pFrYa9*LWy#^K5`u8vK)?ptgqt8lvo6$c)4`R03dzQyj+~oO2s8bnR)3-ItofLK&TX}gCPpE z5}Sm&I;LWKYiB?Ex;Me}lTMk^)f=jNv7 zl_=>bDCq;OR*KcZ6b9KFQxua2aSb*lSoMM3i&Zt)z!<2JO0m3LKt#SroHJ6Bvx|Xd L7AZh|Q>+I7YN<*+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/glsl/keyword_feature.test b/docs/_style/prism-master/tests/languages/glsl/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e07768ca1796773077e5305e99ea40b49fc0eab7 GIT binary patch literal 7520 zcmbVRO>g5i5It9b{)3S7wm_`h_SCMgdufh~MM2ASOhgt9edMFRzB5A(Wl4`ov5SBf z-y1%TNQxZJnsMyiVH#~&G`<_gvY0w|^8KYOUQGY)x~H-@OsA9W%VId2-X7WTY1SKAL)+l=moq_1Xd2p!Dj$~_&ZgJL1PAH?a53n zsk>8I*p{JTI`rg#>*(2aWg*VEPJT|UXIGAXI&f#=?~C|&@V+gJvF9#NMuc2PW8@6K z)3vvalm6V$n4aFLx8u~4`o)a9ii(8ak6M>DUFWT201 zG0hhGNEZ6Y7SZ6_bg-$VRMdzo$?Sgrc&1hTI{Opq$$+g_(Ea|;zBli46RF;MA9(e9 z7wm7H4+iQ{GDt5c{Mxe{FuAwe|4m<0deK;&g_&I$uioY_*#nY7tg1q&-Y9&3Os2a% zRn(9x3$yhYe1BZObVO1s9_nSQ8PRSMvTddBh;C2mqKJn))I zT(k}YeOpo6Fv!BNf0dgbg9)RwKG+c*?%PT*(xDbc*O*k&`Ut{_TarOVN%c(zH1?ea z@5aM8DI%5lXfG2S`V4a&JLH*8k8#FUb?tthW7=PNDK`Fc;ho@W`q7QDDVTU1n1Rlw zrZvOxRSqjQv)x4C_x>7 zv;sIyxWrn3I(h(7GzL%!&j23cH9&9x2jCdd0mhvG$T1&)=O7S}t^*)_!T^=H5#SO? z0z5>PfS?Tqpd5Pwn1fLOb94$|30DE0;#a`MfEF;v5a9wQguH;@fR*5CvBhxwiol1A zz#EjHAR38KP>p3M7)JIKbz?XqLt#0xr$`#ZNJfJ6jk!eX5Y1`;Uql-?6Y!i88XWN_ zqeM3e@^pPZa0@g(0pAW#z>yN4jGLk0gA##AKrSyEW4X*g6lut9XJak5ABZ9ixgKq- z<+=n>q#^gIjkVmbAPP0`F4NMDj5O908Lw!7kvki}(Dofvawmw)Zl7anX4c;6 z#p!qI1(K>7$@SZ((F_-wjdmK-#Ag&(|1+C- zUC4JL;r)kmq!!DW*Aa+!7oecSkaI!#yh0i&aUs3x(vdV=OQXz~g$wj%IOezEyWWPL zU5)gI>dDcJRk#RlI#C}owEB?fj5^=svf7YT6x4}*Kw>_vvrW;<=YOU;C3-5j51T0*+=4dyPsu2f4`nY{dTs^^H5RttBRS_;gA0Sx*;s4 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/glsl/number_feature.test b/docs/_style/prism-master/tests/languages/glsl/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..20ac4d11092e45b27412cb5f94b965e5b105dad1 GIT binary patch literal 462 zcmXr0a7s*ZOH5AXWlU2~v}p1G^GAyC?+6r?N^tS$${ zOylJ;(lhXJaYifUmF6a;7Aff{C>g+f+=e4uHiRio9Zu`|Mq zp$DRXwl=oPSGR5bAEyV2)QttiCl_ceiHKvN3b2qi6;<9EOD)nYfQY}ch!MM3B99W< dRx9qub-do8e~=jinqM)E^R(dFFZ^%l@&+Hxx*q@l literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/go/boolean_feature.test b/docs/_style/prism-master/tests/languages/go/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1ee119262567bee76811387c3e3b32d1952e9e39 GIT binary patch literal 290 zcmbV`K?;B{3x@`sRf^%Firq(rGG1`D?J{kGysdNM2o29_O*u=ywm$EFDJOb%fY z4f!FoKd$r!gl6E$dv$WKA+|i4FDtVZoINVEh*j`o$|FL~f8Bm{^B!pNCy6S(-gJp3 G7rGm{5JbBG literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/go/builtin_feature.test b/docs/_style/prism-master/tests/languages/go/builtin_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..414018fe02f71ec4439b354011076c17a2404902 GIT binary patch literal 1250 zcmbVLL2iRE5IonC|A08Bl^_x7z0ZhpFvMw59NRL`mfv^Q(DcyZ5`?^FW~^P-J8cL~ zt9Bl(R$aJ7XTO`neOuM9TG^CB((2-Z8Ta+N5mA~vP7Pz~{kvAZAM=6}*j7yrqQ{r0 zr!0^a3JD^SC>n{sqBtU(iP8Eq3NaCj3&UT1QeB+2I$LL@?EYqu-dV5J&0GO^`=wPh zzV8rF9O}x!L6NM%|0dgoPm45KJwNcsxuaH3$FiMzH}<~V6=jP~mZ#l67_BAnz1Q0u znor1l8w6jkXNzeLgpms*@N%PsKr1=Q3Wd08xO`u8oE9mgLF59nw1U&TLeRuQY-YwV zlH|*D5(4AOP?=wbFNUK`oC&;)JR!sb1coUHDlQ=~Y(voOBZiByws6PNiuK5W)r;jx YE4+^z^6kTR*P*zCR2b)q)tSS~52FNH%K!iX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/go/keyword_feature.test b/docs/_style/prism-master/tests/languages/go/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a2799f73f11de3d47628baaab14a7bac560f0b5a GIT binary patch literal 927 zcmbW0O>V;=5QW!8;trPA=_z`QD2oXhY|9Q<{4~n#`yj4VRc{rGAM?Gz$TN>?QdzBW zk`?1D0b>lg^rlHZX8z5R(Cu_x8>|%+jL*&x70VSXsm8_ z?H^YDzCv$q(AGcQp~BH6iYNCdpUt6-(JP7<*3l+9NukOWhUrwOtiW4(borDf<%=U$ y_A6;OJI-+2ANk9B+J6ktIFpJ!o~wXM`9+Nhvho;`FGG@9L04yK{p3GwD@P(nmLuOu|1{Q8ZA+z$R9CvO*o}oUvav8m hU+s}3^_+x@cRH^hmec3${p*2`ZO8R~$Me)Y=3miT0(Sra literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/go/string_feature.test b/docs/_style/prism-master/tests/languages/go/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..97e3960b72534f6fcd9809180fda65827eaa21a9 GIT binary patch literal 617 zcmbVJK?=e!5Ih^mAL3qesZzxs2*p2ih1S}tSW-w^^e0}#lU~GM_?O}{+-*TnktTM+ zEP<2gH2J1lg&Z)VK}&~J`(_cC1~);ZlX+MB*Z-FR?k0%rNoNXINJ0C5Yo_Zo*_J9R Qtg^L9OBI`?>YOTvPa_kecK`qY literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/graphql/attr-name_feature.test b/docs/_style/prism-master/tests/languages/graphql/attr-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7f976e6d502fe9f5129119dcff53952b63662bc0 GIT binary patch literal 496 zcmbV|zYc>S5XNUoc!vvWgTkh_A_Fmsdp2{0=<+xz(imjB z*a^yoi#euPw7Zsclm2)%^@extt79c>=pM$!`Ncu&<$$lR5YkC2QDS_@a{ixiI`ARR i8P)kuzP*fYJv@5{>fI=BdQ4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE(V%bqyV+DSPuZd+A4bh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/graphql/directive_feature.test b/docs/_style/prism-master/tests/languages/graphql/directive_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ca9b70048ad4779db61696f95e30280ec7a5cbb6 GIT binary patch literal 214 zcmZ=L&dx00<#Nc(OU@}xN#*6@<Q4a&bm0rDPVRCYNNEr7GztC^>*kSBlla eA_KKhDVCQDh{(6qIU_YWyI3JDzeoXYbuj<}QZXq2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/graphql/keyword_feature.test b/docs/_style/prism-master/tests/languages/graphql/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..06d16f2abf7c48d1e532d2770d4e2aad77a83be3 GIT binary patch literal 406 zcmbu5K?=e^3`N%la)%-7I)_m35^WcQrYfZqn@*A5-WhEv>Z~-YkmQH=e?PKL2#vaP z$37r*V{qXrew~>{#E3ULrwG>C)E`6;5Vk*5(v=9Cl3Jebq9-a0^$COO;&Z-mWmXGl zX7#S3rvdu@R$5hsdaA4rH(oRF`IW literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/graphql/number_feature.test b/docs/_style/prism-master/tests/languages/graphql/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c58cc24d91fc736fa5b7debf21b6dac4f2c1b0c0 GIT binary patch literal 332 zcmXru#VGfveuNXsu$fcULg4*(UfME?K) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/graphql/string_feature.test b/docs/_style/prism-master/tests/languages/graphql/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a3d26be33a1f6906a0eec4b351c2384afb510fa5 GIT binary patch literal 262 zcmY#V;^k6G%g8N-RzdPANXsu$KzOrQ4*-S9Vu=6% literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/groovy/issue1049.js b/docs/_style/prism-master/tests/languages/groovy/issue1049.js new file mode 100644 index 0000000..2ce8153 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/groovy/issue1049.js @@ -0,0 +1,8 @@ +module.exports = { + '"&"': '"&amp;"', + '"&&"': '"&amp;&amp;"', + '"<"': '"&lt;"', + '"<<"': '"&lt;&lt;"', + '"&lt;"': '"&amp;lt;"', + '">"': '"&gt;"', +}; diff --git a/docs/_style/prism-master/tests/languages/groovy/keyword_feature.test b/docs/_style/prism-master/tests/languages/groovy/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..57b7e16419bab456e4ac0f9ef106c55b25f465a9 GIT binary patch literal 1958 zcmbVNL2}zL3_Mpe`UA%2v>(W^&&cFJQ;@|m18PXfj{5onqLMlV51M#nN?L+T5?riY zfdNMd1nyioJI{URO2N!9C}# z2Qy;Vhs9Md4H^}Y306ThK*_O1MQ{z;O@TFdUdZzzxlN?Wcy2|jPA&DW+s1%h$Y#ip z8juRzz$*L(u~tG0uBA~~4s2*Epa#!|$F=f2C}gWJizZF&SK(*{Hi(1D>3@m*tIKirqA!F4?8vJ4`hnaW#G32`)HSpb@8uM1aGDE6= z8F=%v21_+K8@?N!?N9@3@obK0!yg>dbgE-Es5bL#1goXC!qsDI_yN6rI&qW97K&Q6 iS<8oYn~u%OPp^F^*Z2MW_k{jhw(p;d5q1%lUw;91>{t{4 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/groovy/number_feature.test b/docs/_style/prism-master/tests/languages/groovy/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bd12ff9df09b16b6825141e2583c003d20eef30d GIT binary patch literal 824 zcmbVK+irs}41Hdt{6oa+Xq2Q(>K;c6Ri*wxRiOZ(MQvF{HHrQG>|__M@l!2G?BioY ze4=WlwcGAmnr|AGnMmmrxHO2>O(=7xaL=VMOx6H~MjFIK5=0cb;R?QkHFt-&`)K>)XV=FoiO2Y1 zrAQA_{^~sAf?4Tk##$?DN4On0)lQ~`8RJO8jI@mnWL1dU?R90B&gS>8x5svRi5nuj zr27?Z|LH4#k`d!_-wIu_U>sS0QO%t!6XrT$&N%w+B5jVS@UpmN;gWKs?~-zKF@d}~ zm=)zHN$P|Tl;jMYIToq3lN6mva4~(PcHEU;0rH!uBP+_8l353=FxBrOlU)rbF Qvpjdb98V{i&%@b$18F{Jr~m)} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/groovy/shebang_feature.test b/docs/_style/prism-master/tests/languages/groovy/shebang_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c5806ebbb399a7676569187645d3d951fb52d46c GIT binary patch literal 248 zcmY#ZOv}$tN-W~#QdZP2EiTee%FNSG%_~z#FUrp^tK{Y4<Q4a&bm06=$R- zCFZ3o=_n{EL+w(E)xng)V!2W*FBcGz?*iwH)Z}c1wEQ9ks4Enb^K)}k^Gb^K0C-(H AYybcN literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/groovy/spock-block_feature.test b/docs/_style/prism-master/tests/languages/groovy/spock-block_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5cc72fe830819fc4b3d70472c8893f3d72ff0f1b GIT binary patch literal 443 zcmXR;Eh#Oq;^j)uEKAJ;(&ZUossutM=A{6|l54WUqZF%yO%mcn9Fkyn"$foo"', + '"${42}"': '"${42}"', + // Triple double quoted: interpolation + '"""$foo"""': '"""$foo"""', + '"""${42}"""': '"""${42}"""', + // Slashy string: interpolation + '/$foo/': '/$foo/', + '/${42}/': '/${42}/', + // Dollar slashy string: interpolation + '$/$foo/$': '$/$foo/$', + '$/${42}/$': '$/${42}/$', + + // Double quoted: no interpolation (escaped) + '"\\$foo \\${42}"': '"\\$foo \\${42}"', + // Triple double quoted: no interpolation (escaped) + '"""\\$foo \\${42}"""': '"""\\$foo \\${42}"""', + // Slashy string: no interpolation (escaped) + '/\\$foo \\${42}/': '/\\$foo \\${42}/', + // Dollar slashy string: no interpolation (escaped) + '$/$$foo $${42}/$': '$/$$foo $${42}/$', + + // Single quoted string: no interpolation + '\'$foo ${42}\'': '\'$foo ${42}\'', + // Triple single quoted string: no interpolation + '\'\'\'$foo ${42}\'\'\'': '\'\'\'$foo ${42}\'\'\'' +}; \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/groovy/string_feature.test b/docs/_style/prism-master/tests/languages/groovy/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..639db8255fe662cb2c6d41b5664083742da5c3cd GIT binary patch literal 1062 zcmbVK+it@k41FFF|6n1cN>w^OVxLj^kT%IWEsfWZKJ4#jn?$)l_fVpMFUQ8l#~5B( z(bga?M6J$cFS=GcS#lDHlt~nj=$wK62E9QN1VYLV39FT(Feit1ENErPWSvE4ql}V@ zHLe5P9xiyh)!hJl2V4o|6o+Vw0#?Ymp4bmv>83=>h7K<*uKK9e+tGxf|LQ(X0md&r zb1Jf4syf2{1N6S5CZFNr`={|_r|h&pbNQHeLS*VoBRvn%(-^%;o!P4xPlFcp<_Z~n znug4tnUD*anUTh^567mQP5oSZhCJC$1R2?sCW<36tSoctkmW3BLUo7cPAOJL zAzCRpKP45&jgD5zE6q(xEdoiI7%9cZ#_C|xrAwABTe5Vik*7_Opf+BvSWvK#5t_On gea;!F$=SsUY57G8#hH2OIjOoinR%%Sppeu90M|!u%m4rY literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haml/doctype_feature.test b/docs/_style/prism-master/tests/languages/haml/doctype_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5f5a731bcd74427082580e8f1066b2548fbe4d2e GIT binary patch literal 242 zcmY#XROIDSR8&+jg;2pIMVZMZyj;9ox?}*5zGz-9&S<5S{N$3#f>b3P1tp;AO0hav lL={YNh(jEq6wAv6MC7}~IU_YWyI3JDzeoY3MizcT&)zV0};rwU&bgYK@3B870e=DE}(_v2ZM7)YI1h5LRx;20!ml_c?tzNi9oU>wW3510HkeQ A?EnA( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haml/multiline-code_feature.test b/docs/_style/prism-master/tests/languages/haml/multiline-code_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..06cb2b439da5b3a6da6dd1f2932217cfc624e9ea GIT binary patch literal 1988 zcmbuAO>ToQ5QW#VETSj)F=s0;6;hLd@V2Gq$9v4H}tTNq!Fvj7`2@%O;lEWp;l zU1(;|y*on#!xm@L0DF_ug|^S1f2Ir?TD`@?8E2v1U+5Hdo~SxjsmvW0&fSSzgwCbT zRGOu^@Dh0xdLRs)yuKVn*+9O52C1&;wZWoD@7Pkz!YnHbQN~KP`ffud_Drix9}}MG z^UONGo3%91UuMynjOI_duH6LDaorn%_}-K;uTGeKPQ;=A1I1A)35yn@p=}?TZNM> zk><^1faWrAaZS}3ah9QwRh1qxfua-D#)L`u zLS2o%0uZr=)X8EaOEssS<23E(bSID+o5IrBB>4T|f0|>I9l-pQ$Cf;Tr;@Z<=iGCYR+ zadN-!*~#WTxok!Vp>m%pEU8Wmw6UOc>mrsdTW2sU+ku@8OrNTe6I8mzC~X)HXG3{qiG&#Y5*CftthYq3s_ubiX5)#rCwg?fp zH$Q&ve7=!P`Jmq$nKwD;5Bj5xI1J5Rq&w~Y1WXwb#k}!1Fv7&(2u3AQzZPj$E?(WNl zSIb;;H6inz;@kigYa}RSYW48-%X;SV4Zk^NJVOCbjXHYN%YwJSVYR`Bk&F?EkSRnA za9cK5s37PljAiutE0=~pA@XGRjLPW^5BjZOg%veyM<--ON04Q@UPC78Lddxjo{Osz zXuE*U?^l1Qbp_H64@>oEQ8QQ>JphDx5Mge(MzAOYVV0+n$r+LbQhK5mJ!hK<)n&y}Ty1ye`OOS4{IXtA*iC?>TK6$&WoN?u>_vmor2d-R1~ zI2Dd0#3E9|RVHK4iDL>i8y<@U%E|70SW<;5SANLIoiA(bF2iyDT_#rPxdUJ;h?-c1#;_kU~%r4ZTOwV z#O_=D*EaO8cnbeRK_$@{H5! zChMxuT54;3uekQQdmW(mxouGUiQ2pJ=y#n@yoftt)J|UQO7NF7_GlwA~%_@|bZAz_M1(uFl)~>RF2`Mx4%#Rt?k>Q}l{!>WS8- zrq;w^XQ=j&K}RrBwTx>M7Bv4>M|}c^=7a=O*dItbvqY1&2KGo(J^SXG@FKtM|&0cQ6EtE3mEUnv-C}vs{mTm~l w)p{?LiE^W%21Sy^A`*tcq4n!S44!1>Xt7zRw>=CPI%5$hiYF4faWLrr0U7f^&j0`b literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/handlebars+pug/handlebars_inclusion.test b/docs/_style/prism-master/tests/languages/handlebars+pug/handlebars_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..c69751fd060bdceadbe2fccb5ae22adf410f7e19 GIT binary patch literal 284 zcmcD@NX$#gNli*DD(2lh#(j^0c^hE>BidIU?%qdAN(nZ*y zq@w_mK}h8#=B5G#m8_7|#OgqlKpg^-Ms}7`EKoWYNB|M}4s^~)P0lV>NXsu$Kv=B+ Paj-&Wo`P3mN~#_JXM{(? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/handlebars/block_feature.test b/docs/_style/prism-master/tests/languages/handlebars/block_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..dd2c74e9c78cd0a234ad709a4d630819036a0634 GIT binary patch literal 696 zcmb`FO%8(~5QWzz;SL11Z9PNNV;C2RW1NUT0dzy~>;;WY+PbNc75QG~@n#0+5)iUx zvTs}HtnuEtG!pMAac)kqVrU-H;skRP=M<}Op@fp#ffMU8N-i0%MOP{)gf{%jA_}Yo zg)Lgp0dePe9u!`vUN#XdNmn)rjiOKx@fLkmJ}kWFd2r72>%k|NQJiQzjGeTju-JDo y`uyD?R=@pi<6o71hf})Vw|TKWMf#>YqsQIHK+l!xxWBnk;2aa literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/handlebars/boolean_feature.test b/docs/_style/prism-master/tests/languages/handlebars/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1f252a1450a688215f03cbdb0f619eebc2f15098 GIT binary patch literal 355 zcmbV{F%H5o3`J)m3tNuzh?1IPZg-kn+;cKF&AvWkg}e5dQ1ytMJR$nZ?H>=Db9v$mpA-)St|w= igwXtJ{#LKee!6$LcRJ*F>+49jdx0Tkh|I9HDwh{NZ(6wk literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/handlebars/comment_feature.test b/docs/_style/prism-master/tests/languages/handlebars/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c0fffb9f5600ba21363e7dd3c26a0243e790d727 GIT binary patch literal 437 zcmb=fR#ZsK&reD$s;%Yas;*Yl)dletfC4~VrJ$<|6$gp(a)E?V6hed`s(86{$pE}u zyj;<|T%6HL8Hsr*IjKM^ij{N}qNA0P^K)}k^GbjmC7{FL&QywxjnyGS0~VhUs}*Ed qOi@f8#Jj}mf>;RC2MQCAPF^k`B0p%HGg6bYi-8U*Qhu^s@8R(1&h literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/handlebars/handlebars_in_markup_feature.test b/docs/_style/prism-master/tests/languages/handlebars/handlebars_in_markup_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d9591ba4af6c58f5177d93d17f9f4d79651a2dd3 GIT binary patch literal 1071 zcmcgrO>cuR3_TYq|AG13uG*a+YZ|i5K4irQ6W?zaEbWuv!SJB(WI5bxDflr zcKrP8rK0hTF+yrpwr%Sz$-x{Ce{PcVs#<|DyAm-#cO1u?_51Vd%j5dv^8u}^Q05qO zM{$0iq-~kQoW+EX;sWN(0?_;m<}RJb23p5jCc5TYloGFi2hp6a%>Z8jbc%Y1b<>9k z;T{cO&t;ltTdt~0p)|`yA#|oFF?M)L9YDjC;M+VSf5+H>j6#sdQH>kASWax?h7!M5 z;99GNT2h!O8h{k3KM^Y9=CUq~%@vfZ&#~kc%`qn+|v*b{@yHdHEVKH1G L-8Zfd_3{22Y6KDX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/handlebars/number_feature.test b/docs/_style/prism-master/tests/languages/handlebars/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..aa894ec501b8b44d332a0d276ed801dba0f0b37e GIT binary patch literal 691 zcmb`F!3u*g42I7u^c_O4Q&FdfT{qZENDtL!C{qWzfl&JH>sA%!WNczi$)E5M{zNJ8 zyMvG?ks)YJiBbxp(4<3-V*xua#%<7#f$s$|y8Bm2iMt>up(LSXldxRWvcyz0Epy;0 z8BJnYRK*P&BQd2IHyu{rtJEsv+P3jFtu^BY!nyM+{R1C`v)mQHxDt74h`rA2*8jRO nMfa!v#-_wLzWfc2IcAp@&esMcW<@1RFfRc)c4DaQ>09ps))u&5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/handlebars/string_feature.test b/docs/_style/prism-master/tests/languages/handlebars/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f9f9d707a607a598739f81c73f7b96fb1edfa274 GIT binary patch literal 559 zcmbu6K@P$o5JlHcGIt=eVN*}xFU-KpS0t%+9HFrVQu`JY)4sgw|y zS?g3z)O&wy1C?6oTjc|@{0ez65X?AadIVX&u5RJ{)> GM-guvf0Qo( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haskell/builtin_feature.test b/docs/_style/prism-master/tests/languages/haskell/builtin_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c50ca40bb20b6a1ee91a8d8f802cb8a611cfa4e4 GIT binary patch literal 7150 zcmbVR+iu%95Pe<){s$t@-37Y+g0@Mp0dgslEDCI~C}@ech{&W$NxAgv_Z(7k9M5G&8ZQ-qa zdmnNG*}(=-(EgeGjah+OUEJJ`!K{+A56eYmhpI7^^Q{jXQ#Hv{aogGCK#BoWyz_Bo zJNEj4c#m!msWGJ&Q@vCzxNBF%+MTx%BDD)~>w_I)0>N+ma33!MaR12PRm6Jg6g$J_ zYs2+8KQs>9u60}E!mBP9#_f5ETac#Sed7XH3e1=LxJQh}r4*BKkK}spKzibWb_K9tirkw)W2xerv6}le{8$Pn(28xVrS9sEAN4ExD;FT zPH~25Yg_-*VMci8E&>0`JYJ(eOWmJbLDTQVLh1^YZJHzXF|j#qB*01 zh7s2iN6g8>I${lde5Tq&+VPXeEU>T#)A{A1ORhFu^4qg#KYWFu^M!VSD_oD&fY*q{ zpYxz_oq>;KX?WfZ$&|-sFh534g6%CPk+OZ}_710HaG@~`wx_PjZ`o52DA$rb9ADwN zxXCORI0WLCo>#l{%HX*lG7;xiXkXwM3Uuc;0jnYtHa|bUq%v%KAGs9JD&Dcgsk+X= zFW}L7I1|ow7!y{Sa7`2T3N{^T(^s}FE@ZhtKeR*w?iwGdw76@%`(f}K;U?U!^WF4K zd;$?|zC7%3b$pi9m0npL`(-ukmDLns>^NN^;l8w77-(3rUt{{5DEcrRx?21i5DCVF z(K-tZ%N#!9`!D>X+_&Z8w{It_5&qeSlXvFC zuKJUI-nwQbHz04`V3F{Tfp#v=U5dy5Q%|5u`BA zIx1I!u>X^eQkKz(L=m+~@R{3kcx&gdPOvk~lVA?}B#ban(Y+TJDk5{7cuX)yWSX3^ zU$nbMUFgGSZ-yBOf}s&&JwChO(5}8qZ05jJ)#X1evpnyxea37Bck(%OUmZE z|JM5>I9Ak5(X!C67d>kXC{ZP7n^Q$idC486n*7aw zJI9h+3Ra|v&U1qI2fqFnhjAt{i;b9O5z%yuQ{m7$mpOU}LYSR<<6 zo+*D;`1kW^Z3-p9mV!CqJ_29L$b_l5qJGNIg`S+N>nJmLNhx2QL-S>Nh!kICXM&~^ zSl&`8aKFH{K`w4off5M3wPenTS@sc4$DB$Qllw{-e)ov7oVTkpD|x(1(p(pZK_N=t z%BhT@C_`C8otgB?rS74qnCc)3g>?~CdoGkn0TxaK`dUa)ROOnACW1a~5AT?SNU^k(xlztde?;SY;vQVvwp%H!@1?j7%(^#9Td6HOj1& z+GhI`%3jM&Qd=%RDX_drEKh+^XxEGe^((0p^(+O<^(~2`-lYvT6~H7v3StT&Wwc#IO%aewQ7b2h6*z5_T#}PRutcY$Q-*YS5>pLNkvW bxxoKluWo*BT=jrIGU2ZT{FB~P=KSM77c1=> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haskell/char_feature.test b/docs/_style/prism-master/tests/languages/haskell/char_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e4dedc444a71a630dfe861ab94415b11e09f2c57 GIT binary patch literal 249 zcmY#SROjVVkI4g*M#f;O!p#*(^K$8u0YLhqdAT^Fm69_OiJg<^mf lVi5$|k3|&Z9Hm%ZE+8V`P0ksq$=SsUY57G8Acqy}0RSe|G4cQa literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haskell/comment_feature.test b/docs/_style/prism-master/tests/languages/haskell/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d8c8cdda20f41c6ce9c62238e12220ba66e14fdf GIT binary patch literal 252 zcmdPZRY=Rv=jEz~(n*O$3c9ttT)bSmWB`!9XkISPXr<)*+}zZ>5+xl4C0(%5O0hcV z5)eCMiemC0wkpN)asd(fRy${;CTAA|JyfJnoSB!Nld7AOnU|`Nn3tlETbfgn3E@JW HR;&jA2=qJX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haskell/constant_feature.test b/docs/_style/prism-master/tests/languages/haskell/constant_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..06f25f10e5c580e3534058d575be3cab8d12e7ed GIT binary patch literal 254 zcmZ?E&*$ZG%g@(yN-W~#a!Rby19FlQi{ed;c)57Fbjbi9ebKyJoY6|j`FX`9iFqYT tItofaW0hicunB{##wLa07^PTVE+8V`Ma~(i$=SsUY57G8FlQC(0RRY_J7WL< literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haskell/hvariable_feature.test b/docs/_style/prism-master/tests/languages/haskell/hvariable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..defa3ba74dc17f9bbe5358fe4236f967144f3d25 GIT binary patch literal 258 zcmYex&*$ZG%g@(KN-W~#a!RbyOUus(vg1vRc)57Fbjbi9ebKyJoY6`dWr;>)j-^v``SDxny@|vpdX0bysa1 zJ7`Ubit+8vFRE5j`0A0H5x}(CZt@*BjN1ipf?)V!jS{LqQ$oo);rMq2C947=ugW^^ zWG8zE8S?-lt$aST5m*?Spv*i1o*iIRhCF4&Z1^b2bUsS++ls*QqbLO8v#s3ze_inC h>#ktmLRWMY%AhPIc&B^2Z{(@9tk#ANA8#}`e*=Rdum=DD literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haskell/keyword_feature.test b/docs/_style/prism-master/tests/languages/haskell/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0fb3657923f647096d7c45b8f38246f729864f81 GIT binary patch literal 684 zcmbV}!EVDK42I7`;vFo`-Ckmk5%qw;ELJE~z?$amYm#Wv;+%?*5TA{)|KHh);G(S+ zyload7J5+n(aLAQ$UzD~iFcr9)M`BoUu(0;Aw+Ci-Ln6U2npx5+!1on>R#wZjUEVX z!~`p!M=Yq7R-bRI{%+9fV=xmgb1vRoz&P&STrcn+_Gtv|(@D5b%YkEQpG9_;LqG}= zr4!WUV|@H()AJ;M(^mvo?~^K<0U~)fMDW~uK6diwm`LvqO2|$NxH@dETJe70=I;^R OR3YR7Hb&U}u3s}B?5gNXj2&tlnd~2I3VVDjn-{y&N@(Blgtc-SED91;VZn-MhW>AQBQri!%9Ri%dKS zaxt7`V?N8T@DOH&{=$h8A=LJSmx^6I(xV^9vwOC-NvL-(+mP)%RXo`R(|m| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haskell/operator_feature.test b/docs/_style/prism-master/tests/languages/haskell/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9cd8339fbf01e57da2fe6a3531e9e28c98a65eb0 GIT binary patch literal 1069 zcmbVL%WA_g5Ik3)e;E7VgB{6tV+li{KM}Li$dyyyEs+Kdlp4ii2YilDod5s; literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haxe/keyword_feature.test b/docs/_style/prism-master/tests/languages/haxe/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6a26bd0962598c85d84c57ed311fd8b2e9459d75 GIT binary patch literal 1459 zcmbW1L2kn!5JlHT;trA5X)n=ZL|G7wYZMF?3~_z?er%_U>UWbUCglBLu+99D(HE`E ztw=UjFvGuFcIK{?HN|Zsur*>w`~*`FU{e$yE7aZ%rUnG`3D+9U^HedR&CBAqXOb}|q!Hwkykb~qhsV;Y79YQ~ zdKd&RqYp@>)%y#dw(g?U+oij^bxFDJ&ZkcB;=AklFMgf`lUV$ARwTF`9>+p4UIpXr zycs_VfJjG0FeNd#*9=iw5iyLaVt6mJf0P`F&rrl}LVI@VA(`i0WnnyU)G; zY4l+TqHPW#9F}1e9wPW@DkAMJW5RAbqU=5-!fs3^G^aAYS(gZ#mlEbn=|cC!6DiWdg4Gu}QLzF9c{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haxe/operator_feature.test b/docs/_style/prism-master/tests/languages/haxe/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6963f80066e5d509c27a4f79d7dbbfdd4ebc83b6 GIT binary patch literal 723 zcmbV~Jqp7x3`XY)bcfG|c!(3{0=AbPBP38tN})qa+R^0fwTBL^JjDnPkN5dU$T`Pk zVJ%aSK38N42!TmK<=wy-ri7H3JbZxnOc604X0yeB20Lb^oIkKiZe%)*dVMb2<-KmY zgLcm8sT0^{h+oqdCd6KfeT~IhILL4)Ox&WRsH&ooqA5(An538r6QY-*ue{qAPlU^_ n|JoQU;aKfXE5n0CjYPXdv!0l89Uq0>ycAw8UM^iS07zdnFBfODQbAE_K~a8kYH@LXk&=#rl5%F6 zQmhVkDTo8`O5>KyOHqpDkDJ2xj3Vhic-^4E0lB;lxK~CTABbq~#YWfIW~}tOo#!ZBp_8 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/haxe/reification_feature.test b/docs/_style/prism-master/tests/languages/haxe/reification_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6d382b7cc6bf01a8f8b5e80853442d3631609513 GIT binary patch literal 308 zcmY#M<>gYTHqkb!<>lh#(j^0c^hNV>aYic@rDmpOCMT9;=I1HtC@8685HZvF8~E*I=egF1>g+! z)^etx(oP|)^n=I+La}&m^UVvPl(>RUk`5v2@Xgt3#zk=jXITNAca1s2QWT)@hO%7# z@>p0oWt0jg@k0;|Bm*!$qg0d#D>TN}uC+Jq8*8W#(FuMyF_g3$Oe8e_V`1=3dE4F` zeE+Ei&$wgydsREM0NY5~wszXvfzBfxwVOzOrG8D^(vi`8qJdJT+DhXLT^%N>r6!kTmZd7`C@AGZjaQ1* z0ZSGqrh&y_)+xpEasd(fb~KYiB?Ex;Me}lTMk}Rc7NsVaWR|5W=_n`_Alwl{l0#yYlwx_gfQWqO kIA^3LXBR7^Q4a&bm0rDPVRCYNNEr7GztDCI&;R*KaDOP1yp zC#HdAfOaXx@^S$Y`4&27q$Xz>t4%*-q1<>KYiB?Ex;Me}lTMk}Rc7NsVaWR|5W=_n{=qMNT2 s%gY5sQ4a&bm0rDPVRCYNNEr7GztC>20VRf^^10wVH_cFssm i&MsC+%P&&!2o4EWD9r6!kTmZd7`C@AGZjaQ1* z0ZSGqrh&y_)+xpEasd(fb~Q4a&bm0rDPVRCYNNEr7GztDCI&;R*KaDOP1yp zC#HdAfOaXx@^S$Y`4&27q$Xz literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/http/header-name_feature.test b/docs/_style/prism-master/tests/languages/http/header-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cd2612fa66ede99d6f84586af225f5a54107d72b GIT binary patch literal 662 zcmbu6F>k^!6oltm@_%^pY^Nac)cmZ%{LM|UuaWi*lF5LW9AC5zH}v|emJ zs@ClB-QQ-uI7~rj%GKy+jW;5ugc9+G*X6d9+-zBfDnTc#Dv)tt=X)*`*q*mG_8S;G zx3jEs50zdZ^`%#=hT~_3ed-(KaO8-%5Bx}axZ`SpzH4X*M#=s^V=OY%FEyCb!D$ib H7O8_TQvkGx literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/http/request-line_feature.test b/docs/_style/prism-master/tests/languages/http/request-line_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..70db1a9f384b34fd795556921163c6d529cc9b6f GIT binary patch literal 1311 zcmb`G!B2xQ6vods>HpC5JX-PQZVM7;Vt}}MB0CV$1tY8oHRykDTcB}L7Fouzy#BuT z`o1rTcMKI$)@w@nS60;}C%LH5ma&BTeu3%2KHU@x1X7j)~Xrh+(%!oYSv z>D;~rtut9rDO}@2;9c-R06_}DO^O@-@yT21m2XFmS4bbK)4CBgZ{)W+!HL=z-mmlz zd~Rl}D)y%CKUB5jzfiktY{XKWN!fVEtkR8PV}S9>^d*+5E7OdqaU|!qm3fwdd!wDO z=M1+DJeYGrcDAidx{PiNeZrn`?J}$h!S%62aIO#jZOZx3^=|;dUZ?1S@Ok=PQ1JY{ OMF-KKA%aLpuq8jzD`P1D literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/http/response-status_feature.test b/docs/_style/prism-master/tests/languages/http/response-status_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7384ff2a898ec1af081a3f60ff1367ee14fb4c19 GIT binary patch literal 554 zcmb`DF$=;l5QXOk@*j>YE^SS;gS#LVK^?l44%MD0ViS^d@ZX!zDpm?&@wU8|`?&Yg zEZa{-%wfhk>^797tso%bb681zxKtI^Jw1V~w9ael>ZNl?!~)in8c+F)dCX&b{r@Or?y6FIQZzjLOvRH*IU{a|elRye09y#JLW206X>|G>Sq h_6u$}5Jy&;*3^G&d<$F%_~vTQBYEc sn6DJ8gCPU84k(4D2kt7YQgCg&T(Oim)j1fT~K0F@s_!2kdN literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ichigojam/function_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6cc325b6f0e7b72fb3e9fa13f640ea68ab8cc75f GIT binary patch literal 841 zcmbV~!Ab)`5Jb;5^gk?fjvoAj*-48-mND#1Of=*a42qC|(f_x4#gpYF%Tn~dt%0Gd zVqaBaiIAF9`dlClGBu2S7w zA6C=cFt?oWZ&fiqn#+&**+x;hzTi=u+p1h`!{O_=|9m?g!>kLjuVFX)LrY||CPJ|W zMjNA86!H4z2=-M{ydl(=&GDLHcDX4ZVn$$$B0+*ZC4!MLp$MH(Zvo?txxFXEjN%ZA fCNcWYrO~ypQ^9+Aq literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ichigojam/keyword_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..71d83a480cf623ff533c17762a814bc92c938c70 GIT binary patch literal 1615 zcmbW1!EW0y5Jb;i!2e+AoaP@SdF>FUNrGJ2F@l_u6a{h!kQ|EseP)%O$~ndG67thh zT1zuCsTP?^lX+|^bJVe7J)$zIpl~W0>MV0kILPHH8qut2C;Jd}U7GB3l|ydJB!`B| zmL=>Zq_UVCr=3LgGKryK$s>N{c{G(+mn2CqsC$!)_8Ja%CMAwnDfy^UYQUY#Ax#k$9MgLo^V!~#AWEl%aGd-0ocBe@&-!fK{bJ%H?%NR^H z^79*?4fZ{3o(6sBJtB6xFEp*oRuEHa@O$0)kJq>%pT)aJontKR&Gf1|(0Z1zx!Khn= za45c~FcE|Io^ssvw7JzUMqFx<_s+nsP@kUbtxh<^W9WDxEd zLNG#wP^1i_nbC!aat)^b3Z7Ji68(CX^_^?D_1M#Hc-#oS-_N}H_si4k$M)CT`}SY( HecXNmmn)^? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ichigojam/label_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/label_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..42ad2e853f8ddc0bcb8cef4141017746a628b1a9 GIT binary patch literal 206 zcmZ<=a13w_@^kg}=W+-R_4efD;^opM1Az2J^Kx-UE9E36rRFHL+#k&=#rl8KR0tPYwO)M1zsK!;)qLL81M p4)q970@X$gk71~QdsHcwmkWr<_pNhAYI1h5LRx;20>sP3dH}qZPb~ld literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ichigojam/operator_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..59e799446d5f60bd833a6b4196a5e411e24d7a5a GIT binary patch literal 598 zcmbu6%?iRW5QNVT>^r16!o{6^X27cSqiD;P>KYZ z4Q2yl<_HtBjbNXsu$fY@BD2LLvV+45QW!`lsiOOu!3Hq$3QGhG6WaLj{HO0+t<$ybk!G$2xaVPbhiW15$2;1lnie^{I5 zvpjcEzEP(TcV*H8Pw-xpHZY=M@`9olZ9rUIKwR6UaAr^eZX+>@2WR9iNL>##D{b@6 zCIhESvF0sTeCkqO4rz;blT|Znd1Xg8V*<*_C;ONqE`h; z>yhsHJUP8>+UD@WgS=zgydC><(k5zqxXI6#^JBm7`rY&5`qTb@2sg@ra@7?0>j8@8 z=AiM~H4H&JZN+h=lqn5JiQJhiPRo~0rP*lq+T@!Ux_=WYW3fdgS_gx~Dm*5PGI{h^ z95cz{Wmp+drkDbCyg8ERo&p=)1Epa3kPsHH+QNt|IyB6qF3{vvzZg@6jS^My7*eH> v5>+E9QpJ-YP*oa-+%ll(FauVB?oVx#f3K_b$5n<~=q}E8t5kQZREPIp5@S57 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/icon/comment_feature.test b/docs/_style/prism-master/tests/languages/icon/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..09493ab5819ca0cc339c458ff65a11a56142c210 GIT binary patch literal 201 zcmY%9Q4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE>=j(FH(S7S*!;DoBAp{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/icon/directive_feature.test b/docs/_style/prism-master/tests/languages/icon/directive_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ede5ebc85d8e529c30eb6c10ef9db96eba933ffd GIT binary patch literal 372 zcmY$%%uCKGO-beDQpw5815qidX%I$f9*_wX$V`LL5CL8;T`~YK7cW;dFBfODQc7k~ zYH~?tS*ntbf|3fm1)a2}9 Zg|z%4g@U5gf};H7)Z$_w2kz@)JpfaKU$y`M literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/icon/function_feature.test b/docs/_style/prism-master/tests/languages/icon/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..715452f5f56e55b9d72efd8b03af1d2476532323 GIT binary patch literal 406 zcmYex&)3l8<#Nlf^n79U3QB9yIh7oX=V%1WORkRj|K_Fj3G~^eg7A2PC l7l9n9h}Dc}tfH|>z!0J+keoA8le3Ez((;QGU?Ekk2LR#2YLfr} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/icon/keyword_feature.test b/docs/_style/prism-master/tests/languages/icon/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0816911020fb60a51818a372b5df5010fc6926b2 GIT binary patch literal 1030 zcmbV~OOAsu5JcBw$#+1kGjoYKMwEpy&0t~K$e1MDeyRawlUfCV8^3CQ)LmT>H(Aqd z)_AuFMu3Xg%iz{n@sq8QsFI`}!(9rJ2N$9>e=&CsF%0-ps9~R^d-kr2SP?_Q<`GjQ zC3#}Ilrd!F&n0{5*MhVnJ{Rm=WX9nd>spdEOLaAP#C4hX!|N!(6*pQ_)eAhvpyycg z{lTN_uGV~A+ex+uZqQzuw$p;Nx62#f2-K1>yw{KjXHl7w3DmMPoO(vJF@$TU2tHaz zgfK98G?yx8w~40hXIT9}xEh4v%xGrUe0hp&bC`?@>N+Z@4T*60k_m@ViK5PBn6-WP bHc8&i-rlUi`?=$PNAc6r47oI??U$c_{6in+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/icon/number_feature.test b/docs/_style/prism-master/tests/languages/icon/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fc8efc845380f840b183a52d3d8d0c426d1ce426 GIT binary patch literal 476 zcmXru<w8Z38pi;A<#H!Syl1h*&T`~YjUoL+#k&=#rl7UjJ4w?|qrI>=) z#GpRGR1EYPrXa+pnBowhgT>Jt0tyLC_27`f6h?#;rW`!vlwx_gfQbCybIwRj&MsC+ M%P&%ZgkiBB013cq4*&oF literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/icon/operator_feature.test b/docs/_style/prism-master/tests/languages/icon/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a2e29ffad245a99b92bb37571b740f9cec745c90 GIT binary patch literal 1881 zcmbW1!D_=W5Jb-v=pQzQ_+ZEJ-AGQLpOMs1N=l&z7pF(#Z||&}9GV?n5=3@9Jnc%h zv>WfXvhAXGrIZ>fsk$f?0-|@d)EIDT{CU?%1Kl7Xdbjtkl~xtpE_U7p2@OUsLEV7I zn}|>`c~D72Sp(uts7kVzUeP{EzdplQ9ko{PAO~fRa@274ZjeFMEVGUzlS*=tC1R+% zL{)d0bb9EpPi)USZ1ahq&O3Scaw^83%k=&`PQ^}&P4Tuf<`$;>=kN&_Sy~cbiIJ5h z@d1g+z?C%XtnKugd903}7q-sE=EPAVCIeT}taHx_wKgYCDkE8W9A<_Fn>3Jx;sOwm zR}U;FE)6Xo$eT*{iqZ_mQD-bcb0kBvEQK>Pd1tuvY_&Z}t6hPzENw0?O`OYoK)Hu& zjF!aKaI_@479-DR<_>l~dL1KYOU~5GOy@9KC@Z$uVvB+gFGbrfogOKir#YVC_5MCA cq$XYi&pV9gyZ-Cf<>UJ*pW`I=)_>jq0VM9?=>Px# literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/icon/string_feature.test b/docs/_style/prism-master/tests/languages/icon/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..78bc0349acd5706832277c2932808aa6fe01df0f GIT binary patch literal 347 zcmY#V;^k6u%a2jYPf9F;u=C@2xquunSp^j0i_@% literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/inform7/comment_feature.test b/docs/_style/prism-master/tests/languages/inform7/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f0aedfe0d35ce009eafe936bfc81fa3cc46a1a6c GIT binary patch literal 233 zcma!c%g;|rEQ;mjiUzWHxqxgCQ3Vv><Q4a&bm0CFkenrskC>=_n|H%m&$_ n6sv(8=pTTf&6NPvPGUErC{C!sm4MQs~&5+pE%C>}d<@-X( znlI{OB5PWo((Ga_m=4sQF+?tbE4ea|^KA){t?8%_9AxhHSVhON41rJ9(3o)yapyw6 zj+IBsd7aA{xx_SMc_Z9ZYQk~i8n_*6hrNMwA>VBi7lDq1h%WI4oTI#xHMo+}6y&}{ zSMu<{7}GN5dRarhUzh4g4mrZ7G9y&vlVUv$)?|-x@LA%A`}HZ+LKz1Z2^pWor*cOr z7taXtC%Y!t_=TP30c(2NQ^i%4_1t4f8QWTtpPa=H~F(|~7X zDjp(L&78D*RxvB?4|S`cG&2oQ87vJ!ab7xvVn@qpj@ID!|Gx1l%Ffd2+`W0^k8hRL Byubhe literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/inform7/number_feature.test b/docs/_style/prism-master/tests/languages/inform7/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cb5ca7ff6149b4b6e685133923a7522f9fcb646b GIT binary patch literal 572 zcmbV}u?~YE5QgVoa_?|qwnnWTI`=V*OPf=P3JIY0@eA6aflb1~$6et6uC5Snd0ChD z2g1D=dxWwmW(2L6+@{G5h8dyLi=j@gOjdpnEU&DHWj{DlQuzWG&eM+F#?$H%!u7-o zeGS5;5o(!VY(z$)u0)$f?Dy;RBBV%ZNR?8b(nI=x%ZE--aF8|!Cvj;|6f)_Z=4=`eS-bL$nBfpC8F{;P+^$(}s?@*!&AzFO{VL literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/inform7/position_feature.test b/docs/_style/prism-master/tests/languages/inform7/position_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a29821797f3b103e3fd0eb462ca1dc1a8724b513 GIT binary patch literal 1308 zcmbW0!EVDK42I7`;vG=V-CkmkQT0F*(y(SY0#ekspKVyWY0eIfszCkO#=*bs8E#H1 zJAByQg={itb+-N0BtJLdvnUbCEMzn7Ym*_(R5+zYcb}v>?1ta^jHc3hnW-0B0y${<2 zC`Ym+C4?;%I=RVKgqx5>TBZFDVzEoS$$t;gKuGM@h)51RBD-MkMz_I|BHO4*Xk8>L djiYGi0qss&;qUn=eV<%^O=g5>zDG5^eF0ECmbVIStATvqo(Ej#~HKNth`IJ4uac)n#^emhRPvOA4dRXx(g`2<2A`tISpT zvI4D+r;KWae6$_UC3@;5rxN{w1Q7mU-Jq2Z${c}Ut;**7j68~TbckIMf zO(}&r?zI|)URg$eO4AK{8E#UV!C8CpeYaYile+Ahi~D_EuE&u}htu-#z!!s2i)F8U zoYN{(Kz{>Pd~Pa?IaD4+zv8(!*fdWz!RFe-q3?o?%|3UNd2qt`S-5=TB93&qV$rPb zR5bYr(bS`hh8-J59|srBW5=Ue1&{fLATl&{3XA) zzWedEE7v#NcQ3v0^HYZ*S+qX3Vkj8;1fNt{k|9Nt$Bf zN#^mn1gTXkNd`7{h`emfiYFrPL5Q@kny$BIT! z>{&Iq2^Lm)eFM+RLa~3ehTAapVU}MWLscm1S2T-3RmCU-U8CbqN=Gf4_EE5^;RaUq zaU13J_K;1!=9Q|lsTZl+1bNt%7BkP4I&*l@YYs!fH-N0^9Q!|tS?NBX=BsL4y$!f? veGxFQy&ou6o}pV1-WUvOuMUdg9kP4xJN$qDG4ksq$FtAR-TER?(*OJmF8;uA literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/inform7/string_feature.test b/docs/_style/prism-master/tests/languages/inform7/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..56a880e16386d27eeb02d258ab7ac0f8468bf2c1 GIT binary patch literal 1425 zcmcIk%WlFz3_OFxKUjO|h4K$o|DftE&0&*uf<@SkcAe7veeHxcyo3<6fD|(EV|F}_ zF^jpWLfBsx^TI~`pHT(8Mra$`V+2Y-9$wM2+`N&m^B36Kno6?%DM1keuOYGZZV1%O zGDMGY39Ti`a^P&-K+$vvJCfkKA(moN3hK}}O^#`mNga$kN(g%bXI+F!*@T2nD3sBb z8weFNRIgbmIw~z=8mRAV55@4jW8g4g<#+;Zd(bO?7rrip_;ZBNqW?(=9Vc?Q%FsI@ zm5Vxy`STqg&C3?^S!NO|0kee6e8|`2`SKi>pMj)8U%s@f$4feYbouX6;EF>AfSnp*vQylj#DmXf14E)4c42fxqYeS-a zYeW9H;DMp0gd<|P$(8S@(9Hag>mFC?*S6#NPBq+1exT#o_Dtu$C}I>#M($PI(fw2W zb-f;1k-rt@lJQRFd&?p|PHNob+Z2>N65hGEP=5C>{_7gcO@eB8$LRJake4N>Bj9jB FSKs$}ncDyW literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/inform7/title_feature.test b/docs/_style/prism-master/tests/languages/inform7/title_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ec3cdbfbb41fff322ef1c4b11fc0d8979fcb0058 GIT binary patch literal 451 zcmbV|JqyA>42EX|`41s;EBN^XEI12Fm(t-{A}u|QT+jcnIGvZRA=8t0$n)0f-w&Y; zm2_6^TtGOfPP9$H#f3<_1XP22MG3S|*j4&C>XQx$ySdH_9TS33E*J!a24U539HSR5 si0k}sZj1j!reW@xmAP9<6S2-Fl2^bj!grVVPz};gGu<`NuZ(&90So7G`~Uy| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/inform7/variable_feature.test b/docs/_style/prism-master/tests/languages/inform7/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..25c2f740527275440a07ca28e51305775ab8b067 GIT binary patch literal 2188 zcmbW2L5|}f5JlG$DR+pxnN3e$Vvf=31-9u96PvQY&P;AU^{b3qqR6JBh$0{ZxP>@s%bh9YRa@@Nj^AhY+(hbW*6-| zm{KDH>i_UMN@TEjS|(oU;#0;ZX~e+f9w^oLGheVQH}Q@n|0(;ak)_E`PPe#ZfJC#l z=xlff+P%{g-4q~Wm1Gd#AU68U`EKtuGaAptdU-FOXXZ!yfr3ZJ1{~qhc-20HI7=W)QHtoYOz{No7ySF zevDY?ml@ULYDsNs9#PE7%GJ(n0b808GqXZAIwOSnwIB@e88-#ukF{D&(@?e07H*!K z!&6N~@m;eT@!VRjMra*NqHVcA9rXr*lDwQ~3LC)i9O#$Su&Gtj-CPyGM>x8V2H S54U{zpme#r6!4YGum1rqfOu2@ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/inform7/verb_feature.test b/docs/_style/prism-master/tests/languages/inform7/verb_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3da285d30311f2fc75e853486ece63676498ab4f GIT binary patch literal 3406 zcmbW3OLE&V42IX$jPBs^I_V{Pj7%1^%v!1`Q6(uW?&%BShvb%^vxpZY{NW)ImI0V~ zcK2br9FlJv6D%z$neIx6#3`;eK#V{qvN%~rrzK1x zk$i;Ur_LHjRuHlqq)iVPbYR^s2@xm; zBv?&J?rT5HC~@t_0N;z12V905n_oO{y}41q-cT$OfxM$c^t5J38`EK=WVcP;I6uSG z`7rxn68Zo0g?t|0;5kJbaEgJnzm^f#x(*R(bVE!Qd2n8SKIc8sFj_-d%PaZjjbr** z9OmF}!o3v3hYNI~;k5v>Uw9HXU&&_b59idJI9 z-mf6ELU7jNmT|OlhWLB2_7BwSkhZwXOj%466+(^=Ni69IEG2`4BomR$v;|IdLecd> zPLlj04@ldqp75qGQ%-W*V5i4H;Ah-Spx>BQ{)zK9#;cLHXq7Xp@~W(KxVFhF#mO6+ zx6SJpK5f%BZ*BAK?Rc}{bbL7+&Ex-le1G|06|6$re_tuKN}v>67fO0kk-26lGo)4H zoU)Rlx@gL^riSlTSc@!GN!e4SsF|ZYDQl@;Pk23$)V7LGE^AM4e8OvwKus(iwhE~^ z>Sf7MJrzYQeS*~~_d2T`P<0jGYOq%Df2qV$pB3h6t!S>@CCrsvGj$VGd1XjtzQ(jW z`ax;S-Ju4lkSP4<9G|E@ajRUO8Y+5>im2j9|0xZn8r@?O>$ch)y|?6hC)Nt}*5@u=F{`{b z5mS*eMn6}WBGiINuUF>M`4!*h0HxTb0;Rw}@C56-?(>84kRDxf%odvRq@gh84uxe3 z(Ht|0;xeHqUT>^Cy_B{XUFuY&WuJ3O`#k4VSfzByL{u8fe57%n$~4WhrJ^)E)tI`) e{tLFvdmfp-FloJJzaPEruJQ2GheMvX;`hJUi{(B5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ini/comment_feature.test b/docs/_style/prism-master/tests/languages/ini/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..85faefe78bbfd6e11f497b65d41cd89cbfff662e GIT binary patch literal 201 zcmcEK<+4^t%g;|rEaK(j<Q4a&bm0CFkenrskC>=_n{!E5+(yh(Rq&PYwpE(V%bqyV+DSPuaBk}BH( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ini/key_value_feature.test b/docs/_style/prism-master/tests/languages/ini/key_value_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5d25d9d3cfa23284e805c0f8e86e14f99db8b7e8 GIT binary patch literal 342 zcmbu4F$%*l3`OS{doGPiWO|R(4M|_lBr{=QF{NO?}_w?QH}VK z!V}#w>YIatofGlfd)oo(QF n3kqe9_>Z+bdqzC;yHg7DPtn`M*(E7YQ7!I$-CC&?=a?>E#2HZO literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ini/selector_feature.test b/docs/_style/prism-master/tests/languages/ini/selector_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3158a665da3d2c7c012410a3f714f4de3ad4147c GIT binary patch literal 221 zcma#fFV9OYisj{sPRq|vN(8ZZxpc_@AbruiT%6HL#i==|$tC$kN;(Qk(GcU6Vs$X3 lpcX0tt)$3S=Zw_k>|%wq{33;7pv9T_c?u<&B{`|ZdI0dIGz9KUUrO4ZABGG_+3L}@>_>u>huQSZxSY9_ z%qc2^?h+03lD1`yOVohbQVP1l6Sy7_(Bss*I^#NVq#L`&t2k}c@U@kH;6dxvp#FD+ S@hJBF9p+Dwmu0Do<%Tb3dr(IJ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/io/number_feature.test b/docs/_style/prism-master/tests/languages/io/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..371be063de0811b6cf2fb054ef083eb28f3bf1b6 GIT binary patch literal 321 zcmXpsGUhTgGS)LOHRCb>lR#dot_esm6-dW56&_ z7?+13T;grQh|bnEAsg_N{B8m{gS88 M@%;qqZDoHIaiBZyv$qRuB=I7;90%btrdSERG)nLU+dR$nQ zDk*Vs=~4@DaYb`+Mk^JU6lLb6E9odG#Q>pFtPV&JC{~b@s#{o^Uy_=li>d^q3`r@n rB*GgpF;H&Jzr7X25 zNl8aRsZJ?YM*&%&7ASzGMju^`z86_bF)>(_C4t0HEKI`?@x`LA1VdGcl~OD( Z7Z8yj7|t1~$=SsUY57G8kPs=>0|5MAR$%}D literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/j/comment_feature.test b/docs/_style/prism-master/tests/languages/j/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c816bf19fa401996950ed40e029a50d43bff3261 GIT binary patch literal 211 zcmeZs(&OdwbJA0A%ghtGQHdguGv_jxz|OI-1iJ+_K|7})6x%*0OoWoqkk1`3Y`AAsjC%8p4;*(apVubp z(3)|XAD?-A-gp?wfW$v*r5$elA6v028P(?1wvI@sktk}GjRc!oDTF%h1 zx`lkch*!wvj7i3&j2n;TUm3)g7~&1}J`~PLCF43SbT+0-l(YSFe7ar6=Zfp{!rw5j F^aV~f=Cl9+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/j/keyword_feature.test b/docs/_style/prism-master/tests/languages/j/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..38f982d87a427d9c55c8665fb3597319ed4ebc25 GIT binary patch literal 1240 zcmbVML2iRE5IonC|A08B`9!3ga>_M|Dub6oZHK3%?a0xU+8`d(bk))Hs!0<=glke^qB#> zI|7g!fl=-ZBDhrmKI{Qlnh9{}E`X)o1%7?2x&NSK5(FShXCW?=?jI7D5Dj3c!=eRtR=o Zeb$Qa_pP_hl9&G8J6if}+0uRsX&Q=p<+h~5l9#Yp z_?n$^j{Sp6maJxp)&|z3ZNXdcip8qbYY?r-%P+M@$xJBp4 zTl97VWWyNprg`_Q(&oglDX840Vqh$?6=y+QCEx$wxTp8=_2UeO?-R_|?(Ba73Sc0^ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/j/string_feature.test b/docs/_style/prism-master/tests/languages/j/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8cfa97fc3cb436a8793bfbb7e7b4f820c8842978 GIT binary patch literal 204 zcmY#a=jBpQ%U4&=Pf9ETvU$05$p9dI(Y#!o(MrW7MVWc&N;(Qk>gr0dI_P3>o0MXC Zxqyg#>zp%Ele3Ez((;QGAa)k(0RRCUDsKP) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/j/verb_feature.test b/docs/_style/prism-master/tests/languages/j/verb_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..55f908663f1adffff33af9fbf97942332a733cbb GIT binary patch literal 1971 zcmbW2&2HjA5QNWb$?s6{&&59-5eRGs$0$NMM9Lf3fV3-COZET(Wfcj-vv1F^2X_yr zAO@=1_4SMgG(O@;I2wMNFbIPkVMjcic?^S_Fj&}ng^EydwMI>-S>(tGIg1P#A!AXZ zB$O;tq=b}3f`pK;=+F^576l4I!6HUXh*^Ze5=#n$8D{($22)JA+MsdQ&V)0I6XC>P z5h3EQ4PoQ1J`v`GHFM8|7s4B>SHhOCcfD2yw+1a|-wh519|oUnRu2ZN?>r{fj9J|C z7+Eu9amQo8W?;Z_$ZBN3i7~5*0fP^$_e$(QU#@iT#1}yPtCkX3T0{h9GBCRY zL}V%>Q*T|33^Z5PaaL#63c<%q?9I?*4j&-T=Ep{~w`Wcv_V9oS*+*|NL{nuk9Z8nQ@?h D{W80P literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/java/function_featrue.test b/docs/_style/prism-master/tests/languages/java/function_featrue.test new file mode 100644 index 0000000000000000000000000000000000000000..2ca6169f8efa9771e5c9a09bbccda736fc634eae GIT binary patch literal 556 zcmbV~K?;K~5JlIWQ-rJ(w7Aw?dkk?g)kwvfkwh&;yn832P>L1E3T`<=DNxR$w=4d(Y23z>!++P&eREO9HIKHnA4()^T7E-oLye7c5+3uSp;j5} dXjaEx*iXabG|2Y8-1(~V+Va0JVhyuLcmh`rll1@q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/java/generics_feature.test b/docs/_style/prism-master/tests/languages/java/generics_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d1d5e5363a6d6fa93f9dc7e816ed7392cf594c08 GIT binary patch literal 1451 zcmdT^&uhXk6h1G|{~_d}LKP+m18Xn!vh%!^9%9XEu_h&LCPVz+mmf{B(aPusV?Cwc z`;qs)_q~*2TjVKB3tUz3jTJ1|gz$XvfIh#{nq-8B@B1YkpDD#hqGD9X){+rQc%D`gSGi^KQqZ&(xXu|>&VliihHjEgi#q`!N@Sv>smL*& z?Y$0u(YWrRd(E%Z+D!2~6(g+xWawli;kag8@vyR$Uy(0mV$r{?`etflTbIN0qz7MW z{0{$8(KckTRLstpG`9ltTSJ$_cEeh`)62EcklDhY&h4Lc+dpn9j$5Mj+Ppb-cn)_B n=`pHmp3_VTT)s^`&JRT60lDnMpR;IB(nAH`8HZL~GY@C+M3>Hv(jg|N7He9X6f3^GN!mnPanO+Aa^Fwxr)myG z&VUtEN>~@g=1j#2WhywfSOc~S1(&eP752GhM~PD&K^JbRqAs?i6+FTq3}$~EquYnU zWKS-5zm+v75s=CjNwR1R*s@*TK4yYm(P%z;akMwzzB`8u4c=OIgcAy^b0)RFsZkeM zHG-*zs=O5D(`Cohz|gCklLtqt*aJgV$~`brL>?F_Ui87)O3nSl$ c0rmZV>zgyOi-coYgPU^kibQh}Zr$|z`ZV|7TTD4{?xuI`3L!+oWoE{AUV;#0ky*D}( z{3uuOj!T&KE9IoxT=JL~YYMi#B%tR>HBdAe>Hg&W)iBM}D3DfH4s7KCes%PuOGqyE z5|+hz3Z}qD&2Bl+6ZuGwf4JfUVoqmvl;GR4ktdQjBEP*#uV#taHAtl0=+*2S7Pzle zx8~*wq&-rnYo2#HQSj#;3fAMge1dPf(d{bil?r*oWDWnXK;Og){Mt*tg&FBa)_niM zAD?@(=G)tJ!N)z9d3u4#9WyY!zra6*=S+wK%?N4#=g`n7>X;%CF{Vn$$CN2KJa)o< zjG@r~9!n+bm{W0VmL0+(T*q81xjg8?-UnZ(V-b{$&&^PZAFCqr`sxUkS4oJxT1qxG zrr{Irv3o-9{p7>)ZYtTltcv`(y-IPcvuylaZ&B&%t^^(XuT%&KBBcXDs00k5F+h~i zP83C_W&<%wZ7@f4UZis_7nYK<7J8L@yg!u0}6MsNT3oh*es;X^j z&-lIZ%$w;^$5N_((cwgPJ9 zjTNp}%p2C=QsY+8wrCTqEc_dkh3N9HbP(O;1#hKx%Bu~8V;{R$>%k>U0&{8bSnaQ+ zu3NBIvcjXE@=2x#9gp#<1My3GxWymwyzS-Rrjl*iGlD11tywOWUS_AgH5*kU2#QuW z2F?j0Xv8&r-cTSGvI6#?{A%B>Kf!SH`a+SJ&(6Q_qKMv&AAAi@560H~jPZbq-=BpQ zEjw^MBI4s8Xu%PCdZ5RC(3KygS4NY)h^BP^ym6&F$GqX;lJDs&0hqdH{5kr62RtU* zF61ou9mxhSidF}67#0) zV#+xMW!QD_G-W;tcT$ZqYzHI_DbtCeO~aX0?&Q!>Fpon{DtmHNRE3|aLlz$tsa867 zPU?lCg!#8q>@&*pj2U%5+r3f8qcny(%u)1G=gG+SFuHpq^%#|J%4X6`Go@((6za(V zH5;3C!964a-->4H?iuk%>2W|8je|m|9FOxv0gKeB-xtet7Rhub7eE6_Uir~P<2aSc o>@A(Gg%^&43ckNOea&Z=E2!3vEsSO1j#&*0rEz*STFhtv0dK42;{X5v literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/java/number_feature.test b/docs/_style/prism-master/tests/languages/java/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..014ed37f6a60aa9c06f3c0b15ed0b60bd576181f GIT binary patch literal 836 zcmbVKL2kn!5Ih%&KOnBQ5nx*NoT@$L2T_Eu!AjJ|u^d&RzwZK0TGiW2z_Nzjox$E& zqbV`kr`MJeN|ex{9Vn4Py*4HT9V!I?VsYdAo9jb4DDgb06m?>l8qg`ITF_Kwoe0T{ zAm1ri5>~#+YTLqvR*Tk}&^+3wMb~BpX_YM{nF*(~tt>m0QqtV95^qPz!;X)ir!LIA zX547LuU9dT1-Ci)r?zx$UA}Y?OXRL%TDLCa$=r2BaB<0%M$fLeOwUD7@(rbU!nXhb literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/java/operator_feature.test b/docs/_style/prism-master/tests/languages/java/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8c8eb39311ebb469dbb69c0ad6a4fe2541227d95 GIT binary patch literal 1044 zcmbW0O$x#=6ol6Xa))W5T{On-rHKoVAr?dwL7`Gz7SHZfaO0bm<#n2T%;cvb0U;nH z?;;|LjRFO=L&r)~b~5r@d=o$On@JNAwMNZiW5UE@V}mtb-u39&Y0ywxwA2a}HD>Rq ze>`(;=iOpg4)@b|cn)K^L>bEc5M4t&q8;**}aACuRG|Hw!;5UXx5#r zGfSqRn1%6@WzJM7QKkf?t1I%C{=Z1u%jtN1;5>{t+-~^ZsK?5?Hz?W&jQ{`u literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/java/package_feature.test b/docs/_style/prism-master/tests/languages/java/package_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9fe6f1f353a67ce10891a8756916873778f8ba60 GIT binary patch literal 1354 zcmds1O%H-F3_Y`7vGhoEe}JPW4kq3Shh|PibPzT){(DzP*&ZY2SbI>3U||6l-$2sG&E zb^KC8KUD(qfX2*;4$VrNY8w8=fDn?XBTb*m)mfak&X36GWrtP#m$ckHPV?%YQ_tKV k+7|EJ7$14&RmV50nlvCw-+fvZJ0)|&H$}ypSH%c+1@+u|@Bjb+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript+haml/javascript_inclusion.test b/docs/_style/prism-master/tests/languages/javascript+haml/javascript_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..2420e60f120e509b7a0a642e70255f1a67161bd1 GIT binary patch literal 466 zcmcJMF%N<;5QS%(^gmoW194{5#28oI2*U|Ss6tEHLUiG`+d?9;l6d3$-rc+0r4Jm? z7DjfCv)%r6!19CzamLx`g>;1hR)%;(g~6F0oQX;{j!e7+hzJ5%kiwR{D1Md@c{E#8 z-`>dt`dvxn9_5oE6J4(g*Q1kK1=Bb;{x6j?pU&Bai^QStSX1$|P-z1f|B&nS5SUK{ hQo$M9CV^W`;AB%0STX}y(5iU@T0k#!XwYesd;rz+e5(Ke literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript+http/javascript_inclusion.test b/docs/_style/prism-master/tests/languages/javascript+http/javascript_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..f7977c55453d2b7f8b413ce1621d8bcdeb624afc GIT binary patch literal 419 zcmbVIyAHxI44kRdf3Q4L*r_^oK}<-nRUJ%fM0q4pNQ?US*eyZ~unc@7j^P(|_LD?B)NWwHwDPv5xj rtcl%NjB+{FvZj_t?*CnsCpMQm99@8ow7nbK1~Zibt%db|zg;{5h|_K2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/boolean_feature.test b/docs/_style/prism-master/tests/languages/javascript/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4019c444f8b53c40620226d2914ad19fd46effee GIT binary patch literal 201 zcmXRZDoy3(N=wWs22#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H<8xk|A*=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040MAk^8UO$Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/class-method_feature.test b/docs/_style/prism-master/tests/languages/javascript/class-method_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..303f481f95e620671ba77aa341fa45735bdbd4af GIT binary patch literal 1066 zcmdT@!HU8#5Iwihe;5W2E!4#y@U-9;cq=`OF-37rBuUXy{P&$?8|ije1Q!-8IkfZg z=FOYwh!3(B*3vrYvovY6&f!u*2TNEK&|f)5wo?K&Wbz2WfXpC|uXLupTQR%v96nh( zf8z1HiZv@d$nLDo7E3_kYs9(?@$fNMbd(HL=qty1z)r0at|hnE%Jcfb39QB=Lzq3r zWD`Pui<4miCym$O1PNZy%X3{5O8G@ekXsh7=#w<$v?t?oz$;YkaT5~a0&C87r|9BV z!*6DO7H|#sgUM0L!pvf(v3VY23{RZAxcRZk*+Yxpd;5o;k7eTy{Ga+{g#0gLDWB(e X?|mo5!9t@Aghd11f}P&lw=Dex7y}fp literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/constant_feature.test b/docs/_style/prism-master/tests/languages/javascript/constant_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e17f2855ad6bac4d7e48466f71cc15dfbc80ede5 GIT binary patch literal 399 zcmXR*EK+du_qXQdO3u$KE&;LQog9PUd?&{!6C)sxmrIun0MZxD%f%V3l$}~xo?n!r zq@$ozmRO_|s{Tlf6kbch9bRUI33lPqL>KKb)R=){OH{@TYN5t;uVJsyQ@HL4dX&Byc$Aqa zMq*7|@Xh=E-rrmZ7{Yv;gqv6-;6dg?-i7_ab@p>12DK-JA{=mu8a&OD@b59;@8D%n zD5{TA!ppia96{zfXzWpIW;RgxMBPI0=j%AbKU(lKq(V6zPoJ~z53&j#3ixnRLj6j} zb$Ts+uH!mm*XfKIk)z6{|x#H1&MLxg(Oi!45ckO1e$Bi1xeU7oI|gQmgZ`EWk!%br8;l7Qu8Rs~af z45UagXwdjxDn%z%u12XoC@NCT`;e*)i&e%?u%5hCd!+se!C&dkFGU0Sm$z+r^D_lqG+)&+uj cq^jTz=9Z)^W~Q{U03X2THk96Z+76|-0Xh&K>;M1& literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/issue1337.test b/docs/_style/prism-master/tests/languages/javascript/issue1337.test new file mode 100644 index 0000000000000000000000000000000000000000..e49f78d114735dc9e6ec54f6f0e78534807fe9bf GIT binary patch literal 291 zcmdPbS4c0-DbOoVEJ@DLP}kEhE=tzd($d$`%PLmaQHWO0%`Zz;kJYs1<>KYiB?Ex; zMe}lTMk^)f=jNv7l_=>bDCrYxt5Pg47Z8zewR1*la(1yoT7Hp2ZfQQ4a&bm0m89ktO#y^(oq1310~>m zr39r|9f(+FUP)?EK|WA@W_}(_DNrqnxNbpdUUEq(OpTICHB>)t+tBQTdr&DBWG`nd z#C}2+)k2g*RipU;XizNBG$0~B#GEryle3Ez((;QG@=}XSQd1OQp$CnTVm*c6)Kmp! ILt{&G0E4=1c>n+a literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/issue1526.test b/docs/_style/prism-master/tests/languages/javascript/issue1526.test new file mode 100644 index 0000000000000000000000000000000000000000..320219cbc994f36e214561542ad3b2b0e7db20cb GIT binary patch literal 813 zcmbVK!D_=W3_UN9e-PTC3ABL?wo7R*`-C1t4#rdFtg97dhtj`a?A2u}Ne4APn5Spy zJxMKjZHk5C1FeJ{52C61bZi%8o;_6FkS#{MXX^+yTS)K7DauIFD&){3g}e3CK)~ zsUE#Ec`Do&wIUC>qEH_o=xvJ$0KF9oGlp9t3zrlhc(1`07lT$e0^=6^ADgEKg_1$x zqlp~|hgFzhDKZoarNvlGgJ}T<+O-PRd#$*CGxlz7=-rZg8mwy^wiFB5LNglc)jMoD zQK<O9W^5j2M* zKjUj0zW>9Ib(eAYcA4&U>@m&Li<&Io-t_wNwf($L^r*|U@o`q{BL>#!#(!0q{1^E5 zNta-=tp4gkeu;btbmP+StJ8Fi<}{b zqx^=>3?v@jmi5H=dvX-x$f0t!rCK@830Y3Jye-B#y?4N<0_1c$uU#6Fm;E|5GmgT*=-umzE0Etvc(b{9_z`0fS3N`~Uy| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/number_feature.test b/docs/_style/prism-master/tests/languages/javascript/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..16f0e5fdf3721bc3fd693f42730da9e51e2c00ef GIT binary patch literal 650 zcmbV|!EOQ}5Qfj4WZr>r?YdcTZPTMR9=!Mh#sjQlB`P$qM)&PqipECvBq5p1_XAPwe*dJcyIzG)u;e}zOdG3w_vl^I{*QNbQBQYD egy|tT);wO_Q+IZL6PTx8Pl0S}?9ctp{`?ihwW5Ro literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/operator_feature.test b/docs/_style/prism-master/tests/languages/javascript/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..eb46bc49939b589c382e8ab9030074dbb8a001b7 GIT binary patch literal 1138 zcmbW0O=`n16ol6m=ni9py|5$u0(#1##|SZml2T~E#p%-I>>V4r$(vQoSUkD0jZQ@^Is8AV2yG2WJuwtb+=+IHdmXi^q;Ss}x z$QtW(c(Rmd%sIICaIZWGXAkEs_;i}A za(mDnr+B)E6^qL0piJ&jx4GEJq^HbnAGc!VuTu$_Z%NUur(5Moc=hnAJPCIm?vy9) z!iTT!GWr!qK|d5bd3F+P<716H%h3l}l=V3V>h;Qe|GIvB-|;ywxZG~|FVXw(2Z1vq AMgRZ+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/regex_feature.test b/docs/_style/prism-master/tests/languages/javascript/regex_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e08db8a26e28f335dfcd8c36b4820e2a7506bf84 GIT binary patch literal 881 zcmbtS!A=7q5Isx6KTNo+T9j;EFZSTU&j1eFhOQe^XjnGU82{Y?Y}Ry1Q|%^`g_-vl zc=N>8Ias$|tSAw<7G1yl7&&gFl1l5(C2zj2pP#UFb9(@>V1~ecv6M(9sq;^1kybSb zXkY%%+B#yh9ZH_2~wd}GqH;7ayyk2RY}sn&`|et;W(SKq4*XY;AyxW zcWdLLf^`PEz42{uDfPphFwGpZ$f+Ut-gfaEbz~F8PTyb}aM?@9PJ=xfxXhM0e5ZUC9I1PF(p-oFksT#7i`m**0?Zb`R3>UnNN)}()pyw2wL()ATa>uD) kK7%*Vjhc7|d5{nVus!&d$k-Xx@*%{N%Y?ld%o|Ad1O(fqj{pDw literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/supposed-function_feature.test b/docs/_style/prism-master/tests/languages/javascript/supposed-function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7568de9b7941fbe1ad55a8633e959704c11de332 GIT binary patch literal 781 zcmbu7O$x#=5QW#~6hl@OYA)bPJw|ac{fP!^CM0da+nb~Reb<(rSmn>VA06gt;G zis5R)!Cy*1e+k>YsL`ti`@T?0Es`cWMzuD!UGWHt-49QQN^B~rN81dBtSmvs?($qF z)g^VrwV)RH70#Y{yvVX#=8;^-az^r~EU@KU@00xQI|jwmobQwJ6 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/template-string_feature.test b/docs/_style/prism-master/tests/languages/javascript/template-string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..664c056ddb066cc7c0922a990aa0502ed20505bc GIT binary patch literal 1131 zcmbVL!H&Wp5It`b{(+DlG}_e|uY20huuZ5HcN<%1C_Od)`_4eILfjZ_(g5?`FmGNM zepZSeOU+5bVM~%}zu&HQU+IX;6|r;#bg{%e!xUa}%8&3@@Siwd!2mL%H*~Y1xH8I( zXuGB~0U1wciyekC#2xy0UI&b3Z4 zTMX3H(g@utXu4L?i;Ux0H^|Bip2N~{$_Jtx+N02r$@behsyd-dqilRNhiCF`4h9n9 zQdisGWKQVb^Umq?1*Y4=GZIvH26zzH$e~!?wG_0JC)y5;sol}nrEWm`&p#UYDa8N) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javascript/try-catch_feature.test b/docs/_style/prism-master/tests/languages/javascript/try-catch_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c4bbd8b2b8b85e8eba14d47f29d5e792c6545cf1 GIT binary patch literal 453 zcmXRZs#K^}s8vW#EJ@B#&`8w;^U^Z&5_59EGQ3>8T)JcckiKYMF3xDB?9|Hg{Gt>k z9R;P5qDrM$9k6IYXc*+W?+DreQx`mSE$&M!(A**9vV?;&Zr vxGLhoc>VsH=+CUSx`4l%`MJ=zWt=5pSqQbo9Nwfj6wJcZsy!%C>({{v!*FG2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javastacktrace/stack-frame_feature.test b/docs/_style/prism-master/tests/languages/javastacktrace/stack-frame_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b4c400e45871e08e51a6f502133d86f1617a3403 GIT binary patch literal 1484 zcmeHHJ#WG=5S{U_u&fRs5le^-RUKNX8(mN*n&C(s;U@8+*a7w5_v|DHQXwFfIyFON zzq|8&y*qGx3EIe#e&cZZggq=~^9h5CBEEuB@lEacLAx!tNH<7R?KB!FxIw3^H&3vX z8KT@kCH>nEuZYid4$j`d>Am7h<+hj}y>%*&+GzJQemA+ngW)Tzt3*v0iw1m*t=VWT ztb-(vvWj9CQ%(?Jx%xU_mC{{+6Y(^FNdeYIrqL5V@J_O;P2y?_9E~@T9iDl-1$}ZI z-qRmBJZbC>lF&_}f7kF{KaRvX)2C6nOP|K-n*L8Jw*z*~@VAUU8LYEG s{|lB5NU>Qr7m9LmY)_IrUsN|_$>O2Q>}9Kx-0}=79#$F;E6qyw4U{3BfB*mh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/javastacktrace/summary_feature.test b/docs/_style/prism-master/tests/languages/javastacktrace/summary_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..01497f85fda618a12e4cd2c5750e5b3c98447519 GIT binary patch literal 3566 zcmeHK!EW0y3_VX@LHOMI1AHrr0z0%rvG$hwpvqjLRF(`$PV2v)lsIx^$64%d#X2kq zf>TlrUm)Rm#bUcpa|v} z-0`BnbgN$DrP+qDdlK9Nmta>KX#q(|xlEu-<9jVFFEQw5a0M2P1q?X{*>In^DfS}0 zrnSKWo|_DUvsQ%)qnuwR>H-ZguV{eE0!&?18jZILp&D|q(^*g-=rdKO_(sc0U|Ken zR%>K7y=(4w{~l0p1lkZEArB#f>?EK})uI5YtjoiowiztOeBHRiuuV?L<%|y@3-V== zn7S;fZjuXdkM6lcr(JSul9p&H%Frz(o(xHT;gp@EswJ~E^)d-@8mqahVW;%8y%V02z2q28 zqT>Ice$l^~&f?+$T>X2@+mF@UpTO)tUBf7JCiLMl-czx6vxKI4jG{5zf%#Kevu)DT zhK`TV?(gZ-2Zi&l(~BC6n~ru27~ZQR^GG|lO|%MA-mmRqc8v~&E!)m&G~M_(hwc$z jpQIyCAB1e?53_X)yVdVr;#}5F3n9w*(J4|D@!J%tI8_^{wO~?56vy*;=0@?(kh}zH3 z@w1)BEHfgDttcn3lBTo~tVN<#3P)*kc+aIt*_%kE5s7UuFq_w?$Ro(G(v`6}d)9>% z6X1o;GGWHL;2;&exVN=1-!c&leTy^85R^E=XgHd(gOSP>3Kp=`s?>!T0#{lIPHy&a z$A`fOeu3}B>8MT0BjAs1)f~2w^Xh{zvDJp$lhzt{zzAsuNVBU{Vx?9Dbczv}_z&c$ z;>H(oV(v$HaXmlzNad#=D^%$zF$bB0vl7Ck;9hI|j~INmtT}stZd>J3Al3E4Ow&@1 zha`dU=SFR{uRMKyVmGns+1!&~gmlH-)Z-$?O<2J9k2HSLNC%*&ZeSpSo54Q>C@l_J zM&)d}S>5n9Dxj09wT8_72l;U~9D!Sb zKKHcC+^kL?ay5OuU3GMjI248!&uaocIoq=Pc91P|k?c#@X#={lhswTcV@rtfrs=lP Qy*48Zcn#rUD!g~bzfhA)kN^Mx literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/jolie/keyword_feature.test b/docs/_style/prism-master/tests/languages/jolie/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..55a95cab1ac589fa64d28af6943e8bb4b4b0961e GIT binary patch literal 2384 zcmbW3!EW0y42I7$;CC=`ZubH?4ZF0(fEK;%5DbGNGYJtz@+3KK_VoKHJ8_XR7|Z+v;d+BicJ@#7+dXGNZgJCbsb4C;T-1Ye-#M~^4^)jlfAHkZ; zL1w?ikb?~l-AA7(Zj7ab!7KggDdks6UGPcveD?IyoY2XquEcPj4imj)LKIQxE`~uo z*hCVCG&0i9iHgss%r)(VNl#pcVp~LS(xkuAGtk}A+7B7zd{t=#~eeT88$y*%6 z^IwS~?-)^e8p<)?d4qUd!XCqpWk*~*PV*ETWAJ2-2FH{p*~lH-`QAC)G_DqYQfCJ2 zg~$<~m-7yscXidpaO4&adYlbG(Hmna?v0EEF30hf0yYmvif}~n$QBFg>i!ddb+xLi zFRR6#PD6<8;;vcn_|z87ue)nBzBeH_+tsSeYgBQ0pDK|Ts{(n$Dwtn&!K-GGPKR}H z68utK!G3!9Hx^tU=A0XlW=LM zd@&7(xT*FB&5C3e0o2eai5eM2@)m(?YUsU?YFwmMvqNk(Gv1hH=8a|*iPr2zv^6lP z(f=Q4QF_gTh`!iAXyjZCv}Nz=gN94R(7>gJXi%z(W}oVehDznpfYc(*K2;|T&Gky7 kQo%I)RMUW@td*Znl(u_W{C!7upBjYN;NO5|Ds$=UKYS*#ssI20 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/jolie/number_feature.test b/docs/_style/prism-master/tests/languages/jolie/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..90d5c96f31842a86ad78863f5a274aa9d6b68bdf GIT binary patch literal 297 zcmXpp;^i_i^5Nw&)H6yo=H)WbGj!E80ntXO+J?Mbyj;3u0Fb_DUM|jPrM%MIq|_oM z9R(#5BPE4c9SlJqETUkyU=fEn4yy#nwLl48E+8V`&CVIA$=SsUY57G8DXGbsxrsRn J5DygV0RUNyJ_G;& literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/jolie/operator_feature.test b/docs/_style/prism-master/tests/languages/jolie/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..963acc2f13532de7984b57de8dbbff5e62c7506d GIT binary patch literal 786 zcmbV~%?iRW5QNVL@(z=LIhe-YZBhjvLwcxx2v#et7r}=&sYoo@Q$tw7$LwTCRzquO z$C-ig+aCmkuNKy!MCo8kSj(A%^H?d))>t6N90gW*W5bzmp0GmSjjF=3NmE*EXtf=#OsofwG>D_UmHH*Y=ZafSVGn5I_WgGKNn9l0T08E8=KWV58Muhs3Ij z#tC3POoHWvHTWYCilD$@V#&!);?9ikY(?F>i`YMUOCf^uI?!FvtyJ3LhZ9DT3&Ld| zw54F|q1SWyf&OdA6H6Xm^27K4{p5|VPA$|fK-F&ru7(?J6CsUxHA=dMaQA2l!ypU>sE8netF$mO5U+SVmxsY7hg!>G}9I!r=LSTfqWp3#CADd5L3BOO`hk{{YS+u(ib_bbo( l7bYW=-n{gmuk}|+YptHGsK|=L<#ZHkI*4dc?6d5={Q&(eYgqsQ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/json/boolean_feature.test b/docs/_style/prism-master/tests/languages/json/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4019c444f8b53c40620226d2914ad19fd46effee GIT binary patch literal 201 zcmXRZDoy3(N=wWs22#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H<8xk|A*=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040MAk^8UO$Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/json/comment_feature.test b/docs/_style/prism-master/tests/languages/json/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..50341d39924c80ecad39cc384cc8c6edeb7b327b GIT binary patch literal 531 zcmbV}u?~YE5QgWH@D7(7iI&~5UHb;=U@UEo3I=d!jPG8qmBi>&2_fO<1HOZavy+r? zYqWye^u5wPBq$|jKx4ug5dtoqsoRKvkY7p=B_wh-6PF%nv@Z{bej)-Sa6~2PNf}vcBSvokDYIR)1^jt=IjH_I)aG+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/json/null_feature.test b/docs/_style/prism-master/tests/languages/json/null_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1283944abea7feb34e5df0392baf255296e3c3e2 GIT binary patch literal 163 zcmc~R&B@{A;^opM1Az2J^Kx-UE9C)AQPNR>(6PK+Kt#Tg&Kar6*~JQJ`9%sKbM*k) Cf*@`H literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/json/number_feature.test b/docs/_style/prism-master/tests/languages/json/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ca87a480d5dc1c9c8cf560ae52523287bfe6394d GIT binary patch literal 420 zcmbV|%?iRW5QNVz>^p?L+AR4+doF#7(u)!iM1>aL-z2RUx2J|2Cf{aZW(KE> zHns?nO*$hOcKy*Igj3QHL0c}rv|}H7UsNbc7nvVBPT3m}4gF(+JnAPn)sil^g5x(ejR~P^Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/json/operator_feature.test b/docs/_style/prism-master/tests/languages/json/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9d30b2e5e6cb29b1331b6e70187460bf3ab7c29a GIT binary patch literal 161 zcmcEG;?gApaB)R*aYifU7o-*?mgE;H=_n{!DaCTdl53iCMrv|)u|isYkwRiljsncw HVm&SZrMV&^ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/json/property_feature.test b/docs/_style/prism-master/tests/languages/json/property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3880ad733dab4b10a7213a20204c73b8e2e7beab GIT binary patch literal 633 zcmbu6O%B2!5QW#0a0fDLG-;P?Jw|Z>4UNWF8VU>B^zJe=G*J_6l?6W^!@POJ2#vK8 zv~oBNAPSBIL^)A1QnH&*tl+rU5|jhMN=o82CHo%+zN=!g3cAqNJ}7^&EpP@SoKPfk zXFKEk9idG1$+^O`3=(o6hAD3y28s;ZaMLECBBK`}zVJ7pwW-S`#j}Sg@r~}*if;6y jW$YLJYp(T6yFPfL}G?6vA9GByK0aFiB}CYge#WJP;<^mP0lV>NXsu$KngoOE&w_g BY~=s| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/json/string_feature.test b/docs/_style/prism-master/tests/languages/json/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8dddae58fb9284bbc10b79006343e58be445c9ae GIT binary patch literal 548 zcmbVJ!485j3_ZJK|FHBtJrLu8tDiwRAOR&NjEwC7gnzdiP6Rb3EX$hpz4g6z0GvUo z)H5JlGVPAuCD2BvV}vN^GI&<(aFCu50|Jbkakk&E+`ELcT>`DqRec31s2){J_h*ZhM^H^Wo9(C&W+7XrD`WW1m#AnrqHIF94)jRkQqf25D*9cyMI5u0IUS$ nE58t+S3q@2;-{v+pGk>6WUDlMkA+5=|~`ih8W literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1103.test b/docs/_style/prism-master/tests/languages/jsx/issue1103.test new file mode 100644 index 0000000000000000000000000000000000000000..fdb4030cb217973a2b38216dc15796685d1fbfde GIT binary patch literal 565 zcmbVJ%TmKI3_K?@`3H@-_CbeZn_f!4pvRDdk_hT)V+ThGQ@$Q60ftbx)Z>e^yV9=R zlZX29X!`w`YqkO@Y%0^kvvVmH0W9bpVYyu=aT3pOII7E%ILh$EmpA7toB{UaF`tDl zPM4$hGIR}l66ckgj>HUwUP7&-0^>&!s;0B0bR@=Em25^y6k$k$D#(Xrfk`5MZmDJ+ zg&`zPp`Om&fT`+w@~4?UkSF|J`t@p>A^$!(Sr+QU1~mpteouPV z^Wogs_5*w;*1K>VN06S(Wv|D;FiodC%d_H+73<18dni%p6L%2f+eEW&a7G4-+DgF# zR=Y@3#IzJb;poZ{m>-E%#Hxi-B8l`Xp~Rm7@D~oIx1FrQ+Htuk63OExnIPl;2rg#f z`sk#?e(O+s-!jcZMq@W1DVhF4ZpKdvPqRCfTBQ5_A3HZ}E&-$=foQO;2VpSez<4KQ b9cUQrwQCuC{l!L}^6Z@%9-m)c-!%RPKI4`T literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1236.test b/docs/_style/prism-master/tests/languages/jsx/issue1236.test new file mode 100644 index 0000000000000000000000000000000000000000..3cc3ae2b8ad5d9791e58025463dcdc36fe5e8ee5 GIT binary patch literal 511 zcmbV|zY2pe5XR>UzQd8OHP9A1iHncWQ5>!@R9l;fISWO6_a;gSrkf$d9l!g&`;+E% z(^fEY&Z%w;?|R*tDT|{xN;W*FE8=KZFv2@KfQ#3O&ALGe8ju>TYza$Qd2nTxh!%}W z6uzVb^JuJetXxV8X1ZQt^>h9=8@*Z3#%|~t67|U&+hK0xHuo&ld9qf`r}8k6O~K#+ z&SqTNn>%5lYX@F`ZSWW{16$q^e8wEDhw}%u2ZdlpVhsV)XO4uJy=ZlTMphtcV literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1294.test b/docs/_style/prism-master/tests/languages/jsx/issue1294.test new file mode 100644 index 0000000000000000000000000000000000000000..4d167f146cf71900a861cfdba39da125210b04c3 GIT binary patch literal 1416 zcmb_c!A`r04sI3X{SQ}-r2<>LP)f=X|maw zo%dc}`WAPo$p~Ux$|51?_Fx=Bx83rBSbc=Ndck@aKB*2&uHRu^s3cZ;1rnBWgYYOR zpO=s;LXbJ6lA+9!yHt?LluSB-&*Kgzb&L19mP}`00*PV-GQ4?!XG6K2T$m!uk$IdX zr5QLW0ri_H59Aij+v41^<~I)8ci@4)*W4SmTkY1M#$)HEj5rk=EVm|$MIQt@i^Qyd z+W0c9>ZFBUP$5YfZO6J7>bWF*+bd!Ar3 zgdLbU<>x1vlH2<(!z5Da0pX6Uo+yiSL=jb5k0^i5zaG}6um8W*5bPfuYoPc)3`=YK yRk26ZJYL^ehm2LFM&>sCx<=%G%)-wk+r*w{b7bSgZ~dF*1re@>xA%8^iG2bFY;vRk literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1335.test b/docs/_style/prism-master/tests/languages/jsx/issue1335.test new file mode 100644 index 0000000000000000000000000000000000000000..35c2704ebfaf648ee0b44ebc5f0acd42b5e1b77a GIT binary patch literal 2728 zcmeHJO>5&Y5Ix7>{~)x5B#@*HWiKJlVS8Ejnqvq=v8P>8M>5u!r5OMBm1N6~Wn4_-qT3iF9o6$M2e@B$FEU2gE@(I1iy2&Qh&eDBKNy6 z*gnZiCItu#140spEGiG?laP{Y+lK`a>;fAy{U%{rEv}$-3+)RB9jh?thb71{g{VB; zl_pSi^7HxzQ$;fN0*zf5EN}RQK^W*NCI^b_g)WHs?*GyMvO>gIFyvBb6S}2GUERdk z#VJ#2X|`*Cy1Vpfz+-K5pbRm076;mNp0==xbDp8gtV7ldOD|{C<@Atp6q#KiEZ2KP z$lF8{3e*||KxymOZsZwzx6v@7)F8m3pd z&{H>)+NU0Rjk%Bb^Zu??)nr2J`^6p|lc*Qcchm&ehHkF=JF}<*2V!pA8+-u&tvU9e zQT^O-r1cnekD!KjXER{#qr`@R*3a#4sjo~VDJUX9Atd^J#&bpFGl`2leIw_b#Tw*7 b@dSu|aS`)6;^zWkMfL#X)B5r8a~S*t9sBdA1rqbMIjvtOSZ0&s!E8#g-fwY48lgK6!Gu%6-;UiqAEykLKIgu?5~MznJ~dN-VJG-M0l1C>8a^Rb0SP8k)fr5ANb(|AM&!m_cE&3 zC*2VIw*wuuy(m=A6mNu1p$W}5n5L1UW>SWNodE%(hUN(8V^&6)Qk}`seb6ACL0NRX zRi?8pIUa;g&;6~ZgIsUO9}BJtj2+@^!}BOkmi~G&vXO8{IKqzf+tI4{1r@V=#6*Ao zfDT8gS8jYQkcM%>^Nbf#(kW#cG}^Bj7omc0oHmV3d291n$eJSZob5-3xjHw8u^`1R zIoX--#3Fx0T^sXT7)4p?t>B)Kf8OI2S%I&w`{S?gP(kq}2^tX~6_i9TfLyq$$m{W) Za3OgKgo#E~&{^0sIRcQU?d~NG{2vI13rPR~ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1356.test b/docs/_style/prism-master/tests/languages/jsx/issue1356.test new file mode 100644 index 0000000000000000000000000000000000000000..3c4789a8766a77fdb9f923681bf286ae518d4dd7 GIT binary patch literal 568 zcmbVJ%MOAt5IjS|KQ!wVXpGSlaPbp7B8Lqrk5F3!i}CYqA(#~OpuKE2vyYkC1XSjmAjo8^x`bmE_<NYwkjg= zBrDDuI`8_)68`45^5o0vz&8~BKiRnvWjC-&_sraFV5L@MRJ5vQ#vq8e)o103xzH&d)S%Zn|Y7* zqwM}zWn1oyW9AauS|p74l{sME<3d+eQwVA}$+FNA=Cjl>GEGFr zm2wN7qX9!SmKvP)s)TW(deCSe6PtaZ61A*oaMmmPhCA^Lex4K3&LG|28BIpnCuUyw q;i(qsJO9h08;Xa5OIZWv6}_N5-BFMNS-?I%t{_H)<$AN*+SVHZYI?>1 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1408.test b/docs/_style/prism-master/tests/languages/jsx/issue1408.test new file mode 100644 index 0000000000000000000000000000000000000000..e54a44c31f3e2bf1be6520ff389f6d1faa74f7d7 GIT binary patch literal 811 zcmbV~O>2Wd5QfhY{13x4$5>kEp@bxt-bxRJ99j^;t#0DBx{6Nvf%xA$tFDcP5{P)% z`Fdye*;&Qv6Ds;i<+`pR6Xjm%C%K~~g!8&mv3wR{ znfXX!j|(v8vB6ex&=DO3sa$gkt}s}bv>Ec8Xih=r@KF$zo)(!jQrKPrhhP{Xg%S>#;P!Dx9g zib-U8r};2CQyafvKjm4827?y5g*~2;*PxI0xOt)pR~GmONH0A+)TD6JDhJ%2|I63x wA(7EX1-rZii=CI;V23Y735?LPWiUbh_AVo`*5mdScu%ikD!Sdky zc<*vAXJ-XB2Bxa0N@+mstdO~ZZ^1JgPgS{9Qb-GjFaXdP61vx~EwXK;CG;ppE15JW zJllNoC5l2NLp)vjf0Zus3x6{7Dg7~}9>V~47(`Dj!lhyGma>i5|0$ib0kDjkWb=XZ zJ0p_36c|dGZ=KD3_zdRNxC3+=If`v1Gh1=HR+6g42ms{u;+>dVX@`b)L2!?)HEtp; zM30D5*7El6WS{uYI;wx!O&TJ1`dGfCuJDW^dgH2Sf?c_M%xQhkgv}A#$hj@}T1FP7 zBxz=PChK7V=voiqHuqw7tLg@^Te%@=^lZJ?bm^|uOSl*V8|4inpfl vcrzQlVSxMDw`IB#*~Y*^X;^5!Eb(nLU{*?7FnekFE`}c=;C=M@F$#l!G=gji literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/jsx/plain-text_feature.test b/docs/_style/prism-master/tests/languages/jsx/plain-text_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6c942066c7777fed39f37b654112df1a714ca14a GIT binary patch literal 991 zcmc(e!EVAZ42I7{$~#y-!>AA^)WTtp(e@D9utq?FQg@n!`tC~zSw}g6Hqlf3`>W&r zcGFsYt~s0RjM)kcJ7ZmtUd53*zhmL7Aj=?u4J;S1f~4;`ORpSfvnL+TILloRIgzI0A?;dxSGq-@x{~7O%toAKXBM2^^0DgNx=~mSeT<0yQ7CL5vB+(Ttm$$*klP_pd5ds_xl>ZUI4WohrZ zALratS}I7UPOHHax3~01N?U#?}DGoOI&A>z>anATx?-U0LO#P z5^uqz1nMpUH5!#%C}`9J6Oi;3&#Dw6CI>uKO_|Du%8ZvPCG1lc3qS&(5;nRSBB_+Z zD^V;}3P$O`1hh17G(zRt^^YTc6M2HMwc3SZa{^^dHJd+(VT190CX3xlx4`&mMTfor zvz$l42K`{-DLwEhnWujHQo2q>R>@(d3tUHk(*Q&@<;bqk8|!(UZt5 z=`fph7XFR+DE-8M#=&;W88_CIU{pN_?P@!9vJYi1ApLO0nv8?3Q;3Alz0jeZ>mcm%@8bH6rMsHE Pa6xV!9tjFw`>yi|lCgeh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/julia/boolean_feature.test b/docs/_style/prism-master/tests/languages/julia/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4019c444f8b53c40620226d2914ad19fd46effee GIT binary patch literal 201 zcmXRZDoy3(N=wWs22#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H<8xk|A*=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040MAk^8UO$Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/julia/comment_feature.test b/docs/_style/prism-master/tests/languages/julia/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..054d6023d168b01d574d26410f92bb4d88dd8417 GIT binary patch literal 201 zcmY%9Q4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE(V%bqyV+DSPuZd+A4bh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/julia/keyword_feature.test b/docs/_style/prism-master/tests/languages/julia/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e2cfa8c88f28d744166ebe8767bc86783114fc30 GIT binary patch literal 1204 zcmbVM!EVDK3_TBtf3R}y_7nSzss}1+%dT zy~%D)!x9|yZt_v9-ebY_O8?oJ3s{5ptd+GU1h6RU$AHl^zEBAd( z8DaF1GFBK<)@od$MV}%}A@wGJAGPxHyrAjnU_W!l_Ms%LfYe`5&WQR+RfO&;lw^nsE!J7h0@o|FN*$0BPdVk@mc}K0@j@`wrx0HwO0G-*} z*PRaVXXCe>a;vtN&}XiDzhy%0zd(5&4H_PhjIIM~p*+9_&5%TNop2NMqlDwoAl)P( zf_I5XJmm(-T|**#)0BX@y60v;L?^>pg#W-KO4@lQBbADHR;@r;#S&%THHcZ@B7B#< xz}W^3mdzI;oO~iNa!iBaVI+~j#u6wStvhK&@9S>+JUe?S_2Phf=j^sCA3u?raf1K= literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/julia/number_feature.test b/docs/_style/prism-master/tests/languages/julia/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..72fc7a48e57a406a54566f59fb0c78fccc655e5d GIT binary patch literal 551 zcmbV}O%8(~5QWzz;SPkg5}=rN-6p++ae;`@)W2w((A#&wx+$(C1elM75eKQNQdR1Lh;)gv?=8AW&cFe)!S%;3XLBnWaJ*+iZMC7qY&sd>iTxKjY*BrU$;I2l^IAQXbg2_sh zJUTcJw}<1#@f;950^_=*H8AVp)8Ouk-|rvJ8|U3*wDZ7|>JBD*IuyhCG`@ZfW3fZg z7RMbnDbJh$I|+6w*hsKZK`TLOW7IAJG7Nyez^^pfmVu##Ysu z0yi(oe?_aVC0VQBB*96MnS!QL%HmR0aT0WjirXukR=XC9D@z_X*Ao<#pm92=k}E32 t6`}RhYz(n2=~7f*rFC|$mb_`ndvP=w$KwtD@^O0myx@Hp@!#c_=Rb-CLpcBd literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/julia/string_feature.test b/docs/_style/prism-master/tests/languages/julia/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..207b3f4425a78ff81477bbea0120187ea64d93c7 GIT binary patch literal 504 zcmbVIF$%*l44f0wMwph_XZ_YfHe;<-jszs4;YEIL_fUJ^5@|vAI1L zQM9dSd`rY6WrZk4+YIMfODX-VY5Yv~6H*&NC-}0L`M0WkWVLR605@(8;T(7HHul{+ W+QA2#ZH(4U58I6{xNh!4y#4@JDs{F1 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/keyman/atrule_feature.test b/docs/_style/prism-master/tests/languages/keyman/atrule_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1171caf3befe415924b4836e0a5267b056d8e74e GIT binary patch literal 370 zcmbV|(F(&L3`L(8$Ug+1yZyvIqx2!O&PtsQqm2Ijtdud@w@M&z$xZH&gE)E^>jIVF zbQ}$WO|iVGhzpixvk1bAvz{o#))5e{C*JDo5iY&roQgN9BgOT+8an#dTAIDMg{$&z tLkoMD{$)QJ8pGbOp{W6()_K1BWb`cbjEUHLk_xJGN$l5;{KPcM?F-+QW8VM( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/keyman/bold_feature.test b/docs/_style/prism-master/tests/languages/keyman/bold_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..58e731c2ce138b3843c1d308e265c8b46a805bdf GIT binary patch literal 1676 zcmbVM%Z}q95Iipu|A2DvDYHMZpD`M(u-&%V@UVa+M~1Co>ERpS z7*^IxtV^!vJD-8!(*`#F;ZQqEfpZa58kEsuNFyUpbA=ou$6?`iHBNCqEJDu+t&;o6 zSj9Te?F=59**iw?A>5tIJPGTbLXYO@avL}XB}vcxkEI|P!-12uah0THs4XQ?TNcG- zN!>$SN|Kh8b@ez1`78q`h;kS}4z(@T0I?p{Q(B55{+Z;Y)$yjiV>ybUU6}*>FLcjk5?4$u* literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/keyman/comment_feature.test b/docs/_style/prism-master/tests/languages/keyman/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3056bde85df55b4101988d9a4566142a86c17673 GIT binary patch literal 210 zcmYdRaLdo<<>E{R(MgF#yj;9ox?}*5zG$F1(Mrkrxw)x%B}zI9N?=2kVs)^J11(dE a<>dk*@@;g^NKMWzR!GY)Qh-`ptOo!Y+bzrh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/keyman/function_feature.test b/docs/_style/prism-master/tests/languages/keyman/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3852ade1b21dc2796c4e7955b5eef22b2f054cc7 GIT binary patch literal 784 zcmbu7K~IA~5QWc@@E<07;etj@dhlcjwt{RL1KW6jW>XN-O|h76jq%^h>;g^Wc+tHu zFW=0BeQ$HG^46}Cvxea(k=dNvA_~_ri59|8Q_Fcb$v= ziXZ#xsJcD#f#rB_w)TI5f;9!Bk#&chO624h$wvoCICx63$z_sS-wRg$_RC`yW z5})Noc1#J9G#xV~=@4v0TYbtMpVYs?54Ux-)6jGW*wtU!hfj6f!lrHEz0+EiZ4GbT Kt7=qz&{yB>JIGQ1 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/keyman/keyword_feature.test b/docs/_style/prism-master/tests/languages/keyman/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7bbd2303ee927687fe9a95ad4522463816c9c0c5 GIT binary patch literal 715 zcmbVKL5{;93_RD8|6p-$_Y?b!Ce#9~DtES{t~Biy_#V@%(axGX8i zk+~pb`@e=z--Ua)6V`bnA;@V`p!T5%5- z6n?nUka4pjPosvajS9Wn+R)s6R&?=QVKs+_!Xp^P--Bwv5?4c~CaK6f_0|7-(uyg` Yn;t>-`|*E%@i1qSF{3)C#~kF3KOaxgVgLXD literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/keyman/number_feature.test b/docs/_style/prism-master/tests/languages/keyman/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c71eb6e02d7125714f1488521f02244fdb8c2c19 GIT binary patch literal 376 zcmbVH%?g7s3_dTAcL=?%8|{$!0K(qDlX&Rb4rTs8Rq*kbZaqy;ek32{OG3VsXQeWY z;O;q-);i-vSZ|6+s|N!i(|H5}!sP(sUWIU~#IW>FAA}@Pe(#D}{^{&vM@+u99rn2+ z{(Ns6=?_sOa2$W8XuN$-^cn*#Lu*IpB{^@~-gJ^0znWB#861svHXYf<1Y>6(D2`9p E4@x&y)c^nh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/keyman/operator_feature.test b/docs/_style/prism-master/tests/languages/keyman/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bc439e8597c407663c053d5661c7698c70b9973a GIT binary patch literal 282 zcmdN^u;b;5QPAP#(ooRk<>KYiB?Ex;Me}lTMl0nPq!uNXw L2_XV;eX$+@Ft$N$ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/keyman/tag_feature.test b/docs/_style/prism-master/tests/languages/keyman/tag_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2aa760ae329bc585659bbe04717c779ff35ba55e GIT binary patch literal 320 zcmY$%POZ#M%(LRDJ2xj3Vh zN)pqRbQF|SptdW;>YxgPoPsV0br-rY#0ZchvCDv6tQ5=31w`aK+c_gOIlEXPEx$-1 RF(*f%peQvhvm&)v4*>gpO2+J@U~~y+aEl~4m?*^70U-6*4^FK!poQ_a{@(X+LZQn0p{je?vfJ3 zlL0rQHN8X1(UCB6DPUDK0WePJHC7c>ng4LQT%;MYwKh z%G*KLx-OpDOr$^Dx^Pbo=?TcRHx-FIkdo>nJ&ENzQ7oALh1I!1`d}!p8Z@$Hix*m{ Bm;nF) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/kotlin/function_feature.test b/docs/_style/prism-master/tests/languages/kotlin/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8bfd2b226109abc09d80b71513426fab36a42739 GIT binary patch literal 426 zcmYex&)3l8|kLq2e-(hO#imz-U}SD}b*D6gMxh7Nym+$D@^2R;z)g2I7ExFQ?d=@_uF#9%we0$P+&RTmMjOU?T)#q z8%y6|s4l?9n2IZsBIdd8j_Tb7X6?Jtm2rj%E`u1;b#bw+8&k{((TvuyByA5xV)dA5 z%2{HNh=-Fa4r9V^jqWOA-}#V1_*kzPAB(qa{G)h{md_;LCLoE)f=?CMojn%Hgx_^Z zYIA@RCwZ8W25g&3j2>PR5p;4Rc5BlXSa6i!ir+k9dL|lc!0zezx8;)-kKh>9wbP}F z@ag7N<%DpH8!zr`6O|i+*(4Qs`V*%080?(tWfB9_m#PSty$kl7?I5`#xS5Qt02U`f zJ>1G{DVAB&9Y*mA%DTW)?BBWBE4n#2VsLuyyZdaJVpL>tpC!Qb-R~cK%PbjDkuLc#|zgKwLQ7gpE;^y{f155rT$4{i?0QNW6IeoQic1N0%BIO|^(NAU*;Sh{kZ}q_*BP#?tG<+9U5Ih^mKa^Z;OSWmf+p4F2fKW=H(jtfoErOr#MEekuTpB{Mnc3YWGn6RK zC{ZP6@-0tT8;L=Z=!?hMxV0pwC|bhp9Cjm%7HFr_Y&Qp{_gT_D*NG|)IOK#IG~p7H zb5yA|*_=fyhN-JK+f?H5x;Jev!a(2wq7H4av{CbE2Re&jb7&rC9vC9|7>MShAfkur sJhw^FxNX*T-(cS2)bt<{OlXz52ZVe`2YX_ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/kotlin/operator_feature.test b/docs/_style/prism-master/tests/languages/kotlin/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..12f0cae315bdc6470a6573d2c521b0d6639ac962 GIT binary patch literal 1045 zcmbW0F>iw~5QXPj@_%?(f&s^7N7xMg8BvC)O-0ozM9@YV`0;%nx^OoIpDgp~y*tbH zd3X<>tO*E=gpjRCNF_)sRE)&nPlqm{MayN4n)84mAtQ4+V(h`uTN5Li2HR%M`TCB} z>mBoA%{qN!ofiC-=}`!4KJgXb(VCZ|n{Sup{4+1^0O#H5fF06UqE48DGzX0p^R7t9 zT0%vbRHkmHl4UB5DH(Z9+I~8ju~Xcwl(lNUS_*4bI7s236fTFjJJ_t|8>MjUCDTx0 z;^t$N=BANs+cYZ?#`CT8I$hqrR(#A0{`+Z- Ef3}hkf&c&j literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/kotlin/raw-string_feature.test b/docs/_style/prism-master/tests/languages/kotlin/raw-string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5a5ca3309bc4130360411462ac9f649bab1e15c8 GIT binary patch literal 343 zcmbV{OA5m<3`Exz=ng{bq?ah<5>^&Y=#M}Qa-q=Eca#vwrd>of#%SijjA{%Mo~{(p zA-k#!`Lk^yL4X6wVq;=z4@_{0>6Fy-yR9#O&UbAjsqK#Tee>HB2`wT95+PUgKV)vR fMF*Ji4SLxG3z7-Vzjj4zc=yGRuBZ+oR*!LWo9=_$Xr3! zN+Y;c)v?FuqBRlRV8kS(3&gcXdRg02)mB0N%@_PRi556U;f{w9MiEAbh-M8WR%xIC zp=>ljQ4a&bm0CFkenrskC>=_n|vD#hwxh(Rq&PYwpE(V%bqyV+DSPuZilq!P& literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/latex/equation_feature.test b/docs/_style/prism-master/tests/languages/latex/equation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..40caeebe89da3674d8b3083a0271eb0bfdf28caf GIT binary patch literal 3826 zcmc&%+m3=T5Pg<}e;^GHtI_?5{fw3e)T%^jSHx_L;oo;!>?jwdSVdoSW=_v^=1eVw zD=9aXnDiA?{-UPq~&z!FlapwDDoF`Hg3dqIs>S#i4 zDB6)}oNtgw8%Uz98bKAo_ae@+_=E)LKoa!Sh|rJ7c$ciNHI-I1I4No*8Z;>ol^%Eb zE)g8}gN`PoM%6^Fp)))~s*8z47rRD-DBqhs@lh&M-y2b4L?+XKl2A<$iK1yE1db7b z$s#Irvuw7IX&Q?qEGJBl9nq^tgk?<3Ljv$NJ^<^%WaInk0Ma`l1H$_$^~kg6QA#)r zJ!@n@Xi~yAC99)YsB=^HM4u&S3bglE1NQMP=X=~30NXSQ>D&Z?S+upTXV%`Iz} z*hO2r3?DqT78`Wdw|qJtTwR;AF524ge^A-S+w(pBZu!K^%1phj{A~DQdk9uC3rvZJ F?|(EVcYurl7gj(^n_H>Q-Zdh_55Gs7^=jcu<= zW!!Wav0QR(g;^<$$Ze_Wwc@gGu`v88Y-ua;;q;k%D8C!7<<`3+H!jm401%%h$K{l?l>d_LT#@Oeku5^Dr*7am`ty~oBiASr=)w2{0K1> zEGS~BbV$m(&q7lAu7W+ben`;L*dZb7KN6VpUsMPhMk&mJ1LGrxa~CP{M?(r_$UGF9 F^9z!^tPubJ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/latex/keyword_feature.test b/docs/_style/prism-master/tests/languages/latex/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7a1b86f9defcb9b21947a8f81495558f5566fde1 GIT binary patch literal 1035 zcmcJOK@P$o5JlILa0kM=H8Jr99)os4>7Y$35TH?Gyt_~}qSl3tWjD;9KVf)NRIqK- zS!!Kzd%>sxRVR@JnM9)Tkc1ttpiAQ3f#IU%+f-C*(eFWd(Q)V4YGsa@KWNv~kny$Q z25kAXz$l+^Fv5sov|v>BO87=Anh{zQ!_#P)5k^f+^!$-Khufi`h0{UXI_hsD7?och z@>l;bs!{oW+{5T+bdO&-qy2!!jQ&s5W^D3;Zs;=*^F|Vj{plFifvFGf$}cXz6N6D1 Wv7fLld92&)K(vlXZOMHF-0})z8#hJ( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/latex/url_feature.test b/docs/_style/prism-master/tests/languages/latex/url_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..53e1c0185959f31d0c70517e494102091a1b24ea GIT binary patch literal 265 zcmazkEy}6RC@Cqh($_C2$}G;!D%MNR&#mR<;^opM1Az2J^Kx-UE2Wj@C6{F8=PBtZ zD8fq;p1Ua(1yoT7Hp2 JXpm2_9so6eLE!)Z literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/less+haml/less_inclusion.test b/docs/_style/prism-master/tests/languages/less+haml/less_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..fffe2ca74edff4b7f98131b913ab09b5ca9c0325 GIT binary patch literal 638 zcmdUsF>iw~5QXPj@_%^p9QXk+cInWu8)CSUqp@o2$Tm?U1iw8tq^XpuOSXD^pWnMX zy~=P1QaqKtbC^)RldmyLA;pr^>Pms%ym;W{+$QBVs@Ep6FLJ)xA!|RPrGb;E*6FI< zZ7{ImE;^sTtGteCztM5DT^uQDXR~j*c?SKZZ7~M=SOfEQH+E;L{{pjW(*oP9M%}rV z&GjGeks{qC#RDxC+4p?l?lYiw9{12KXHJw<_rp;Bpk_8 HsOWX!ZIOU2U69!Lg(^cRiHHaZN>aX`*clkuYI(Z5XPu=tIrpMF z+ZZM64#(5fi(ZTyhPb(&n$bF6Od9Dl4nW#Z4EklNh>~43H1ngA(>G5J$2+7#$Zlod vYgo#vi;IC-RD`KUBiC-(zv#qKRr7VX|8;qo<(a|81k@Yahu{KS_1)~hSC~mD literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/less/atrule_feature.test b/docs/_style/prism-master/tests/languages/less/atrule_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..333d672217b90d68c66dbff3263f5be27236f9f8 GIT binary patch literal 469 zcmbV|!3u*g42I7Z`VJu{1s!9%c@p**(nHY>%Vw3fvVr*SODh{g@M2GC`0^+JU-hch z66S@oYAs!3l`8UV>@J(>ti&P7d zM_`;x<0t9$V2HvQ1+lp4F4PU0dxG$11cNSt8;LYZ&5Jy&;*3^G&d<$F%_~vT zQBcy?SBlla6ofhen;g(ZScO4aVv1t&AdXau<>dk*@?Gkjk(!)c3^cSzp*S-yJttK+ YCo?ZqAu%sSA-6QABoo4g`lMJ70ObKl{r~^~ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/less/operator_feature.test b/docs/_style/prism-master/tests/languages/less/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..70939949558dd7b525f8b0235d3eb4f962405418 GIT binary patch literal 235 zcmdN^&{fb<(C6ji<Q4a&bm0csIL^u Z%LPQ_JIOgCH95OjAuYd10p_k^Jphp(GFt!u literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/less/property_feature.test b/docs/_style/prism-master/tests/languages/less/property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..85288c4b8de6f2435aa95d4672c7252e28d286ef GIT binary patch literal 487 zcmYex&nwX_Pt8ovD6!(@a;Q$r&reD$s#O4Tk`j}%(~I&;^HOxd;@S34fa|zCAtSCSO JG&8kW4*-D!iAVqd literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/less/selector_feature.test b/docs/_style/prism-master/tests/languages/less/selector_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ae82f146b6e8d2ff2b6c839a2cb5b083e97fea85 GIT binary patch literal 539 zcmb`DK?=hl5JlG!yu&cvw2(;FT?KlK;KCSfr8X9mltReetA;=+*|gNvIDY^9d8~21 zRbI6)&6Kce($39G9V*yY&G`sBt#uBSbk_NBE6ehbB$O0C97-suDamT=l~r7MvQp? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/liquid/function_feature.test b/docs/_style/prism-master/tests/languages/liquid/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4689ef6a4989e3d1a7103eb427d9e3d1140f3aa4 GIT binary patch literal 1991 zcmbVN(T>|75PU8Y|FFvQ_5PviXPizJ!Rv+=0|lJu`t{v~*mo_Pmy0YzW_A~hW(RXF zU{b;`gQ=58Qz}o^SgKamBv*}he-JD>4>tNjuQeH4X$;oT@Mb+~HJgesqs_Qts5D#5 z=4o_SH{(2=-(Ze6N+=YIg$g6|VWKjGEiTi_i;ppD<%0Fwj6h?rr`6Bsf>xfl=S$5l zX|l6G3 zHc<%pT_qyJvLRwv;ax~$8Y@dcNoo?>v?mdKkOI!?BzV{n>var21T0Za(E@QuT;T4S zCuZ0|m;adap)I7erq?m6b&eE&@1-&0Xf7#>+fBl`0mo9kBc*ui(J{O=tpK+!ma6>I z*HXaV>0?oDeF5!WAeHL2Fs6L83yE#M@sQ|-BGJuZ1cEI`fSZvJKFEn(X^d|+CBWoc zGP)a?z_POmFgx1=xOv|rZZ|{XhmUFYI416X`Iu=2Dph1l9n-qU3ix5VGS^-B^r{s- xpSR-g7qq_$EHT6G$K@Hm`4YjtQ?&JF|Mp@sUA%N7(ZvXKt%m9rM}MES`U~4Wg1-O& literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/liquid/keyword_feature.test b/docs/_style/prism-master/tests/languages/liquid/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..84ffabd96ac61826afda78c350666f562f93755c GIT binary patch literal 985 zcmbtTL2kn!5IlFK{R8qj?I-$-C7D=Sw-z{q#}J&Of(@xy)nNO7W>L;YW0eIE6JK3Usfm$B`B|0P_3KpMGg-HN^wKNOJnOhqQ#r<#&1JV%KV8c&r+LS54=2#rVO1tsZ@ng11(917mOT7v^m z7?;0TyiESt8Z(AM>=;Z9QTWvf&AyXWCdm{O zZTK72iXUp43u%@Q-=tX2s*IHdGd-PV=OJQw=HHBrt`2QyC TuIJP3fy*@GIF9&UiO1#*IC}Mk literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/boolean_feature.test b/docs/_style/prism-master/tests/languages/lisp/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..35d2ac1f3abd93f17fc30d2977f09dd52a1799ff GIT binary patch literal 444 zcmdNW(d6aQ$ji(DQEB=43Lt)Ti9#$d7cZAC833d&nwN_+TB)EkFS(>Nu_QA;Pf15X zNkb`CM&~q<>KYiB?Ex;Me}lTMk^)f=jNv7l_=>bC|QF{REp*00wVH_bLO48 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/declare_feature.test b/docs/_style/prism-master/tests/languages/lisp/declare_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5aaf52fe2232ca4e836b27c7d7ffa372e4babede GIT binary patch literal 405 zcmdN$Nlng4EK1en<6R zLn&5AAzBG)A4mko1dF4o)*%T#(M4-7CHj`&oOi@f8F5`H)Vkrq9=Zw_k>|%wq N{2~Qt80hhG0RSofXM6wv literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/defun_feature.test b/docs/_style/prism-master/tests/languages/lisp/defun_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b9c1f7fdc5ec99052f9cd4bdb56e89ed7d848f4d GIT binary patch literal 2491 zcmd^B&1%Ci3_j1`cMv{=1mZ#a3VRHbgOj*xNg5X?S=rl9vdJj z_)cl1@|GXk`9vsDpW2H&YgZXZ82#fwlq7kJ9nU+;&l1Wks7zCOPpSI>e2UILhEL6H z5&ld~?4P10sP$4?n!X0)EQaF=9>X@^R0rd>F`i@(RTm;m;LrtEdgCyR@3bVsO7Lq# an6r#lh7FsBB)zwzDXJDXH3xo$c>MxR7w236 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/defvar_feature.test b/docs/_style/prism-master/tests/languages/lisp/defvar_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3d0b6ae03a5b26d45c2569ffb19c9cef44f7b7b2 GIT binary patch literal 1099 zcmcgr+YZ7Y41Jb_e;|FD$@C}u48j9rOqc0c7-;-^3!4!aW8!7&TTe?*TTZi5S7&Ki zWz3qA?BTIO+5}-}PdQ^unYMRHMETyCQv&R*@m=BvGGvj3!U~jZzOe9)Q?laF`BphE zU2R&(8Dt=G#$gx&0gg_iuNPy>5FT+Bldz9k7DpWdI2Z^fB0ed(#**_;LD+C;ayrF) zl%G Dl&?An literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/heading_feature.test b/docs/_style/prism-master/tests/languages/lisp/heading_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2136495fa1132b321d4c45a5b5e1b4635b56baf1 GIT binary patch literal 176 zcmcDvwpPe6aYid;q$Z|h=A|p?C@5KjjZ})| PNXsu$fEr$`$IAr(1z{q9 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/interactive_feature.test b/docs/_style/prism-master/tests/languages/lisp/interactive_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f3bc95866b1a8ce19b91d24114bdf63643590e58 GIT binary patch literal 441 zcmdPM%qvMPN=z=vEKAko<kO;H`!zGlN8B-LKhs#)Au2@RK%{e1A WIlEXPEx$-1B{exGu_#rKmkR(T?svKX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/keyword_feature.test b/docs/_style/prism-master/tests/languages/lisp/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f47119274e2fad4b5947750839844465f3a9208d GIT binary patch literal 2597 zcmbuB+it@k3_zcU#6LuNN~>l+vCnAxKnYn<8Khi#`TH50ZPKJoRh<_*zMNP|ust}F zyOk6mq!^sJS*_gIjBuaV)mxPr6^%~PEs5*Vc=TP5))~}_cP1rD2)-$h8Nz}_BN>+%E_Q0qPi9<{K7A$34Kf8x)4@5T z>6y{w5~=>#dga_5L)5aERt!|76$M)gJYb9z;}e$@Qf#Go+4f8EIv15~@cpLihkn25 zw*AT6uOUv=0xz9xzam#)1wy}zJ9y8zioO~iLVkbX|IiPS@|usBnTYl~GAWi@Mm++| z8u0Ki8FcKJ5cu5_7ePmzNr5K8B!tKWKx1MOYD;4xYBOXau#GYqtpPJBwRJNQt?4r< zZCo%Zv8r{#ON3?CVbP#40k@ bytkv#r_|LA36`I(tsmV*MT@IRdX?f6@9OV0 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/lambda-feature.test b/docs/_style/prism-master/tests/languages/lisp/lambda-feature.test new file mode 100644 index 0000000000000000000000000000000000000000..032f1986e77de664e47a16c91653c7174c496adb GIT binary patch literal 547 zcmd5(K@I{T3_MH1A4pG-pr7y=ghQ8Q)vODKg&2Qt2_Dp4FM6@z(rJfjJMxTE*Q1b% zp5jbChFa4RU~Hg6aY-{C1HKD{y9i@oRtdZk)vslW1P- E?v-1a`Tzg` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/lisp-property_feature.test b/docs/_style/prism-master/tests/languages/lisp/lisp-property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..62e324d122b4fae509f4bc63c223a8573ba7c8a9 GIT binary patch literal 239 zcmdPk<+4i4&*$aRaYic@l;$OulqQyB=I1HtC@5(t#p-~?b25ty zbPI~|3sQ?pDnT+J8)1@YnlzPSdAWdye787fq$Xz8$h3L{h-r+!{8VA3Q%IXY*gCTABbq~#YWK*Fk6kCzJo D*fGpN literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/punctuation_feature.test b/docs/_style/prism-master/tests/languages/lisp/punctuation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..904ef79f48da1b441f1c268b7302632a3d0b00b9 GIT binary patch literal 323 zcmdPU6RLn&5AK>cLT)bSmWB`!9XkISPXr+SEyyTM7#FEVXJS80kB@Lxm9k6&| zX?{s+if(abZc=^@NCs>%PFaw9V3KG?YAVI@asd(fE_KdGP0lV>NXsu$fH+G5;;dpl GUM>Kh@juf5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lisp/splice_feature.test b/docs/_style/prism-master/tests/languages/lisp/splice_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c80cd73da5934e7dcf8b9ce4a4e55b1c21659df3 GIT binary patch literal 253 zcmdPk<&CA6ZtyEB&mt0bsSdy8ar=+8xq@fh60~RkX v$jMAj1qp#{#3BlE0ZbUp5KX06UM?Ua-)+trsma;J3TgR83J`}B^KtH?Y>l4Nch}it*hvHa0SeoTC*1 n^H0u~2?=U8Xnr=Bn=$!#Y3gf$)_E|)0E?Y)H@=^}4!IOhY#(}i literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/livescript/argument_feature.test b/docs/_style/prism-master/tests/languages/livescript/argument_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c195da9c5d190d0ea3a1b8b046c0bb7cf1e0022d GIT binary patch literal 248 zcmY%6MVnZOdw6x^q;^opM1Az2J^Kx-UDbD5)vM>R<{QU==mQ fDhhOxQY|%wq{2~RI5>6J`l5NcIHQ%4^K)}k^GcL- z6qNLVwkgHxU+P$w$I@^S$Y`R;ViNKMWz2AWo+0CjA!9ssK@ BJ}3YH literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/livescript/identifier_feature.test b/docs/_style/prism-master/tests/languages/livescript/identifier_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0b9fc09eef4fd3bf4b066de5d057b08f7589bb96 GIT binary patch literal 456 zcmbV|!3x4K42I7J@(!iv#e?_+`WR!3wo9=n4YczxpWb$YL#UU95CY#H$p3p01TS(i z>3mu@vUM%e?53_Y(>|AQ3{9DpG~uRTrLpJ;n1)P)F^pfv15i2pvj0bF3xMx_-BuAiS{ z`=wEeuQ;NgS8H?nTa>QjiKEW*pthDCVQ?S=Mv%;oZ79>}ZWC~LumhEBrV$5p4O5Se zpF*0#kgXy3H5!-$ZX1N;NX$5z^thOp#nDrywDIV6c3XO^CXIL6tkf8?OkHf1cRs2p zit%GaZZi)#sM%ojOyhF%_Y_nm^>^EbYRf0!y>z-~QcC(c5gF(JXlCxg<~@Q677 z)d0yq+3n5J?@J$I)ZlR9b6|zW>sq7ZB}rp}><(S&Z3~RVZT4@A5S`4#dsWEof=5+w zT|uND+b8%z2_F>eq<1S+59(RtU#a){o@R8f?FIN3VK?~oVO_RNPixWZ3%hL>1? zuG(oTekm@z?1FSw-~&Ja*&%arcB1*55I~|6arWL$?M^FbyV1A*DfF_&<)(q!I*>}R Jf-sEc`5PJMc;x^9 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/livescript/keyword-operator_feature.test b/docs/_style/prism-master/tests/languages/livescript/keyword-operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b6f3d90ad631fb5a1702a041eee597c8b4e2e67b GIT binary patch literal 1064 zcmbVLL5{*O3_PzT{~_cI`w51m`&8w8>I zUlOzGJP{9SAauD$IL!$CLPMbE#8MFk;TuA_wZArpZX9(j+bFfmXN{tEv60m$m5^EI znkK4DDH4`4^ zm7|67Hjrk|i*cGgv>nuAv|4x!tCEMex_xF?WnEVG(X|^~R`JnXecXD>V|;*l@SL@G soQBaJc42nWMQt9#6yf2jm3TzZ_j|$YFLb_^FtAvy!%I0~RZjW+2a1P21^@s6 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/livescript/keyword_feature.test b/docs/_style/prism-master/tests/languages/livescript/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..123f37d5fd95e1bf5b05cf99ee9eb7a74d8e0e78 GIT binary patch literal 1360 zcmbW1O>V+45QW#Z-e##kB47v2FxKJU_vP{(j&Cwe18X-SL!i>esyD=nzy!j?D4-^B1 z_EhzFp`rwYFM+uNbYTo?3ot~DAQZy*?4?b~pwH6NA&vHwctM{&^5%B$N^^Ck^1u&t zxTA!U?TR(@#guGfe(CBgZ@9xaD4sa%m*5;#^%BFOdHUfnrdLjQUVWDiL%;`tc ay!J;LPbjf_y}9U|AFGxXreQCAt#|^NqIF9E literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/livescript/operator_feature.test b/docs/_style/prism-master/tests/languages/livescript/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d9565b24fdb64b521805951faa4ee57a33f7971d GIT binary patch literal 1763 zcmbW1!A|oq5QNWI@;j^}C5MEVdt{qPJVr&N0!386^cNM5k)NH}0Ec$xL}k0lm)Tio z?RYOyp1g}$VwD)tBJMg|Ea)j=C}kT89!y!L2`ziqb>6M3ti`(|N!!*FZbwO@_Mra( zph~LR0cusSO3IS%y(?1CvJ_m8f~c`zgy$f`;N2|q>|HBu>s>E>?_H3PB~(lx)Pjo& zZ9q`iqN)Ibi3+l0jEgLbcXxsWNb!fC#_hbj*)_+P!~f6Y>+x`IZl&2bkGHaGPVa~F z{`0h<_>C@gPk>wag))=qO4yI(MQl`PEjy-N7{s!YR9I(9H*C^P)YH z>uL?w!j#Dh6J;DKHLsLLVmeY7s8XqQCCiG>fEZNfiVudmuEc;WNxEmzTGFe%TNopT zg&L9~vBHfc2|ipl#lcQ-P-f~oTj8wC2wN*`l^J1gg}pK(BkPt1?_ E1^$W2C;$Ke literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/livescript/regex_feature.test b/docs/_style/prism-master/tests/languages/livescript/regex_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0369ddb83f6bd994447e41f5bbe6ce3f7e36e176 GIT binary patch literal 418 zcmbVI(F(#a418`O|4_0wndT$>jIIwl>J;fJodXp=-lUsY#ix}%gv(v-5<0|a_q*ii z)CJH)pcyew&>39`#GUc}=~Yb6?T0g!5q1Vd3VOZZiOzyn7L)J%4Qqo`#zI$rbuAJ# zsp)f2DW<4W&0*2~N_c=OWGEBau#F-3{wkKT*5ssc9?A>;BffVo*+j?_odeB(`5CrH O-<}6HNG9LnGHhOo$Yp{6 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/livescript/string_feature.test b/docs/_style/prism-master/tests/languages/livescript/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..313a1311a5c8b90a6c92b693f10a4d496b37e2f9 GIT binary patch literal 546 zcmY#a2LWC#AmNsu9|NS45{r;Tc)4JFkQyKcs{)BZ*bsSME?zF1Xoa-=dS$d>hd6DZEJ#Y13;@y>&CA6ZtyEl6l$n>Vq@$n&bSw}k#p+;+ zgWQVn5>6#WF?kSAVpD-d3}P%u3l2%Bfta!wVT7q91{7r2gn{;96GjPFrC44rAR<3- ToikFCvx|WdS)>37;bJ`iM4y95 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lolcode/boolean_feature.test b/docs/_style/prism-master/tests/languages/lolcode/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4409cfe0732c8ee1832677ea79e890ab1bb84577 GIT binary patch literal 197 zcmWId^yB4nbM*A#<>KYiB?Ex;Me}lTMk^)d=jWs*<|*kYD203aDaGobi-N3Cisj`3 XBJ%BW&PYwpE>=j(FH(S7SgZ#CpyDW) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lolcode/comment_feature.test b/docs/_style/prism-master/tests/languages/lolcode/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6031e27b0200d69ff615866e5617311c28a29c45 GIT binary patch literal 269 zcmeZw3JF(8%g^WKN=htJ2=Q?V;^pFmiUCDff^$Y{a&|G$e?ck!K8@Ngwqb7ca&mzxqyg#KRIWlCTAA| M!>LFC=9pqV0H}CS6951J literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lolcode/keyword_feature.test b/docs/_style/prism-master/tests/languages/lolcode/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bb59d25f0066a31863103e0c57034bfcba436670 GIT binary patch literal 1498 zcmbVMO-}+b6g=Cc|KVjXUeLc_itb7SyEWTIT)~4uhz0@)YK;Hhd0jRkX1qv9`#SUb zwjVPMGICygY0bD9Jy?TL7Y^Ip8V@##L(n{?M&sHVS6NezU29D&Lx>}cTs}rdlq$^n zUX$;A^uq~C-TJc3krXzaw zX|V!CVcIk<4T>!xF3RQ zGA@iT#~Wl!^T<(g1g{C^Dgvr32;Av}5Gou3cS`z`pldv8jZEsqM~F_1gy`f+h)%DB zfPe{_6islIIDw&gjv}8B>Iwq)HsMt78^ZQRB2>#10IQKy^&Wwf842FGlMrfG0{8v} zCG%|kxm$j`?RRP?7?k9nIGnJsJVDbNKyZBy{(z|@`we7^!(yk)(Em4-E-%gbF%22Jv$7a_N!*K>DJACPph|r&gBd z7o{laC@2Aq2V1BVs{@wGNlZ%30ZBj{024;l0do*c7FiR}fl9HwTtGy=E1fe^le3F~ MVNj$1Ho9030HCiwR{#J2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lolcode/number_feature.test b/docs/_style/prism-master/tests/languages/lolcode/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..060d6d29597f3c7b8006c2bd7878a67b5a0782d9 GIT binary patch literal 198 zcmXpp;^i{dGc++YwdCdE<Q4a&bm0<(1|pr4}jaC@7g2DaGobi9xMVisj`3 XBJ%BW&PYwpE>=j(FH(S5SgZ#C?_Vbs literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lolcode/operator_feature.test b/docs/_style/prism-master/tests/languages/lolcode/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c55dcc18b0e7ed1c08c38e3fd8de446d6b697cac GIT binary patch literal 698 zcmbV}-wJ{-6vnR`>>b9gt#{D;H`1-#Mud1FVFU?=_Wqx3`%$RbWbEq z8i96J(zT6Eu*!>DDcPof@By zp|52a{V@^4U@JyuqcOHvkHJqE7+T`NAOwaHh!7<%R9;as&h^Re@6Giwuv^!&x^3AU H@vwUXQ)a4q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lolcode/string_feature.test b/docs/_style/prism-master/tests/languages/lolcode/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e3a25a9cda899dd9e29763732f8162e9db71a4a3 GIT binary patch literal 608 zcmbVJ!485j3_ZJK|IqYCf_?x85Bdux9+1O85F*fIn;J3xyWJ2m!GmGjp?lqXYx@wT zz=9}Mx{o5HHxva7M(b2{1MpzrIo@Hj+k+$eK($ApiQmR=HBS-Kk5{I0giht<8_`yJTZBOObW4ila|EhGQ z(mMAQ`WgQr<2$6mg0Dej)HHc(otX3IZ3`w+@R{$;w#>7$fr2#j2AL3Ul`UbY-uSQj MSsSQYuw~w?UOYvUr2qf` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lolcode/symbol_feature.test b/docs/_style/prism-master/tests/languages/lolcode/symbol_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7f1534a175b67ab408bba12625fc541148f7965f GIT binary patch literal 673 zcmbtR(F%ev6n$>6f4JOd>mOzigrqR^L52^RN}@H!aGhA8q)I{{~$t$$diPjR+VIEHankY3lgsv~E`cW2;kCZ9k<_Qr9sY(C< literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lolcode/variable_feature.test b/docs/_style/prism-master/tests/languages/lolcode/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1066c33733d2517d04a6dae32b967332cac6eb61 GIT binary patch literal 168 zcmeYa;pO7x(j^0c^hNV>aYieZB^G5SCgr3m=_n|9hA74Iasd(fhB{}YCTABbq~#YW Jz)UXI0{{FZcSp|~mipv;W(!Pgz-mZEgQ z8Yic_mu@qZ2!X>cAxtJhDwQ=Q*=b$;kmr-Z4Vr1(Xg#4I(fxg}rzklnZo{(7e&s#m zUE`-*_un-knqg&Wz7@DJj=tcvE8qd|UW4C>-&tkmnffpA^KG_|#I7N-N}o5mXoFI$jzY9j0Z6bk5hkvIRa6rwieUu8$yoJ}U=l9JRAV)`mJG+>G>MlhmXd&V T&PYwpE>=j(FH(SoZm}K!A>@6y literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lua/keyword_feature.test b/docs/_style/prism-master/tests/languages/lua/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0020acae17c08c4f82ff0682ef57f8ef61adfee7 GIT binary patch literal 783 zcmbV~L5{;93`N(qC!0Mx#m*+Jw%*IwvKFR?Hj}$3+iuk{u1qC+(8lEADnAl!U8U{SL~Rz2 zb+;S#(p>wT^J+V$%LkvIyD^<^VUgdb))dY|h$V&l`7iB%2zXKey$1i_JfQ@30 zt&WJk3ky&Ni+&vtzQZ+X+9 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lua/number_feature.test b/docs/_style/prism-master/tests/languages/lua/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..913b5b8e0f367e55e89b1d10a93e58957abb1d73 GIT binary patch literal 558 zcmbV|%L;=q5JlGwerL3F(PU)^WH^@_m}8_s zD@CROAuoB5LNh@JIB^#j#FkYGM70A7&3oORc5UZ)G#V;?S2la5)G-IprG?!(M?|}Y zVjojeigd=|UMM6m;i%-&|aG9isE2k0$wp{s64odP4vJ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/lua/operator_feature.test b/docs/_style/prism-master/tests/languages/lua/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..dec283644c16472d2fe9ea05dcbac3bf6394cb21 GIT binary patch literal 623 zcmbV}Jqp7x3`XY)bcYXzWXO+w0ozND5fUgRrO+WI$ryb0Dno}>o??VBkN3%7HRw>I zWExRnN5SOa9FvEa3QQ4EN-hCGdP0(JEfZ6B;vBi2>C&6|JuSCwUQ7$qn4!fl>NKh~ zDg~)&qxLF|c8!YMG^agxF!ik0qR+9A3r8J}IhG9{@bCLVR!mw3Kjgp`zzP`JlwN{!YV$|7Tb^@~iQb6S_ zxXalm?5q@2*ucL)oYwS`Mzbd2wT8I5uAGZ~h*Xud7KW=574kQlGGh3lGe$M8>)L)? zDWotvmK5YI#i52_^pE}qg#t?tV6kE8Vm4j>*FFop?Ku-05(+u3)?0thZ3-^Cne)!r v#CWGeAa0%BLCzWuc#eEJGDhl8?=pt3E-7eU`=@cbx6N}E8L7$H#R_TpMG9a~>SpFClq43VrCFZ6U>j40y@mZJv literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/makefile/comment_feature.test b/docs/_style/prism-master/tests/languages/makefile/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0e0c6c43589f1015928a1437ca51ced70c1da70a GIT binary patch literal 249 zcmY%9$wj)Ic1QmhV! p7}Q!^QVKCKF-0+XK&L3h@^S$Y`R;MfNKMWz2HIDo0CiNc9snklH`o9G literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/makefile/keyword_feature.test b/docs/_style/prism-master/tests/languages/makefile/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..dcbbcc895a00ae7ed835294382ac99b4de4e8e68 GIT binary patch literal 4019 zcmb`K&5q+B41muYDer)C%1G0BiG7S}4m5$*Gc06)q_c0oHb3c4BCWLR9#UfC5656I zqtalNP$uBRj!M%Lbla%!$@wTilMHlHfmUB_gD>h!9Ka4{9+fEnZQ~Z@J)mUru*j%H zSXDEb(>Sv&++~vS(l%|=%W({|*6=N~b1$Nor$D;&Mru12#YqNb3?_Q#;e0d4FopRPs^jQ}xsP19s5L-= z<}$~ZzHO==+}l6Q0!D6LBYlV0cr>uW=wx97){}`1 zSPnKWUOE`LVEJ5SqNQ`0iIt8Hj?Ik90w$lRtYAXbs)P%NRSgp=7e!1k$Cc-~C}Z-f z)^tp`S`#wiQc20h!jhB=MI|j4iz;e17Ts%@V5uT!VwHlPi&icKTsSK8d8);9A7NzC jedcetwt4@b+s@C68b0X`spZ%l%!;Ih@0#7Qe zrLc?BN>mWWAyxV3M0bcU} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/makefile/symbol_feature.test b/docs/_style/prism-master/tests/languages/makefile/symbol_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d1fe40b5d033b5e7cf1593ad9a1f471e132ed59b GIT binary patch literal 368 zcmbtP%?iRW3_h>WcL-sE!t?=l^)W^d-Rx$uHlxjiy}jwY34&-2;e&iX`P{`bv|8J-;g(^f1Z>mfI5$9ZDP}`hVW7y?M;|BfkzJZ8Y^_gE D1ln9v literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/makefile/variable_feature.test b/docs/_style/prism-master/tests/languages/makefile/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..84431d07d0a5ee0634141e1a3bff617b2263b22e GIT binary patch literal 390 zcmY#!;N?leq4lbG?DlI=hDX|F5Gy;;mT)JcckiKYMF3xDBvc#gy#H5^5B^?DN z6$hnQ9ZXRb8?3@02Vs=}3Mxb^6_n;Bmy{-!Waj6A%+>&jDnT3%k{l5QXO;@gJVZYFo;hwM#p6%NBW{<|3nDu;9|DOMZJHwp&-(qB0=y?tRDO z*bh3MO}Kg~u*Jc$BkZJ*;+6&MS5^G2*H5g{_bA2Ys7}@~#d>M4Dir;<;PpURR6hY! zTTKQo5f^_3#*6RxqS*#tfbDGDsO2%LaBZ9S_TJ+GxlPDFg~Dn*Ts5UzIk1ko=yO;p za%d@@m~&mYm!7(F!YM?&&wq?*?64lMdTb} zB=Qn-Q-Oj?R&W)uIuHe52f)+=H58QQC6|;YmSpDVfix&9K@@T-L7b`t(iIyEBtZla hk?(TnjMU`pVuiH)A_bVM6d?Xk$jnplN=!-B0|4-^M&1Ab literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markdown/blockquote_feature.test b/docs/_style/prism-master/tests/languages/markdown/blockquote_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3d0a4dffd51f084b1cdf3fef5c52f4e57cc590e5 GIT binary patch literal 272 zcmcChNXyUX<+8Jb(h5)pFPAPEfR~GxE1H*!Gg>JrCqFs6ur$9URY^xd$xbO2NP?`0 sDT>Kc(!r*L7&QtAMM}I}u^{WnaHTFtpL0fPa&|G$Nks|>w-)OG04Iw+n*aa+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markdown/bold_feature.test b/docs/_style/prism-master/tests/languages/markdown/bold_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..486e6ab60ee9a06a778045bd2e5d8341e0848f5d GIT binary patch literal 1300 zcmcgsOK!s;6kG?1J0Mmqa&m{N$8ao!9a}{~Pyya#k+b(b<6l}gaiTVsko<=6FuXAc z(KuHsF9an5-zn)UDbtLUlyvXi3|4(DkXWkINRR-)n1C|?FeV@epm+h~HR)_0cyRrk zl1^3Ids@LH=8?bHo2)cZlPv-4w<% z?1t#|vHrcg=QZ60(v!N|dNX?E(|PB!<$oN)F;YsvCM6Ht3S0c{{iCjqfi=!Eyc>4x i%>>6{9by8ttxOx>f?%#;>95UL>TkxBJuoo8qvQ*|BuHKW literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markdown/code_feature.test b/docs/_style/prism-master/tests/languages/markdown/code_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..948c50920c44bf5706369334a4a3e3058b027977 GIT binary patch literal 675 zcmbV}!A`?442I7{$~#y+Zxcw|5GP)N+nAIzbvLulsS+17o*pLyx=oxGHB$52{`|*r zeT>lhr2ETR<6JpA60t~Q)I5q_*K2hZEdZ>vY0 zz-6!kgr( zl;tc9NS~0nLl*4dlVk^vkVhXdFF>>)V~7fhN};U0^UMbj->$4FU}6&T19VYJBBK(r nPe*7m_$edAzVc26MxR6@#9NR=hXZ!jw8xqts0P!-j7ibo0sXoU literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markdown/hr_feature.test b/docs/_style/prism-master/tests/languages/markdown/hr_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bba290d4ac521a42780dc68ce9369c331e63bfb6 GIT binary patch literal 211 zcmdPW(&FXf<+JAjQ%G+G;3%{(5DHy=J4(+kTf z;TTbp<1V8eB{51U#yP8z((Ze4J0z&waH3RA$*zXU3pGh7SWGd$1}%LMeli+C;LsNF z0Y4^P|{M01(G0ZVv1t&lyp!ewIPx~M`4lFg-KR{B(W$k)I%{_K>^KlBd9!f2uCVP0lU`da_6Xso#>FT_W?Xk;JLYU~s@P2uH!SsnnddD3v$wP1b#@O{AAdJn*N?bm)<4-D zoSxj`JVdzo{q@BjYa|7^Tt90cpIv+M&|3#-;CAq?y@k;EkiyEedhj%LV0+-g7Laa3 M0gX8VdEZI#4W3~hQUCw| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markdown/title_feature.test b/docs/_style/prism-master/tests/languages/markdown/title_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a06f3326365af4020bc0a84f6190235660cf3121 GIT binary patch literal 917 zcmbV~OAdn|6h+4+VGjhR(!}qKQJ0|()Mzwqv_afWchilPkC)iR%FOx zJfr1AO`s>1@=^#cDb}xpJv8r-pYg2M{G9qqOoiwM#h5Xi=ef6%OhWsP%4W;^&hfvk z(>;3xrCa8FCwp@j$^F(8uM#0Rm$}#rm4jB{{0fc{95NgwJf=8KbkK36_^9MqiL@Y) U&-tJ7*4EX1M9siWuHzMg4+QA+KL7v# literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markdown/url-reference_feature.test b/docs/_style/prism-master/tests/languages/markdown/url-reference_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4dc25bafded554ad19ce8180d1184e2e95d37f16 GIT binary patch literal 1296 zcmdT^J#WJx6r6*^e|UL|6Dc3N6=mt#p{mpg7_fyKw~4U;cj&J#5QkQA+`+1i?`0y&2x~>_mKVpyZHccLSw%G literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markdown/url_feature.test b/docs/_style/prism-master/tests/languages/markdown/url_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ca8b9cff7289248026759f9a0fd34b11d7f48e8c GIT binary patch literal 419 zcmbu5F%QBZ5QXQG@E`Cdo78r9HF4@>;sgw|X)W4HbD+OpKsJMeG99`1zPopPG)8VG z=hl7Gtf=jBwRLZnl9CP2^cWnC5zr|FFN-S1{ZCRt$?k_2e4LVk!vkliSf~rgjW5Bs zrK~;-UltBxkGBr>{o*Hph#5poApjz+fGj$Ngv5C&)T*0@KniC_cKP0nlD{r-n1=pl L*=UfRPpz$A#?WOo literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup!+css+javascript/issue1240.test b/docs/_style/prism-master/tests/languages/markup!+css+javascript/issue1240.test new file mode 100644 index 0000000000000000000000000000000000000000..c9d5051df828073d39a68546c8e5bada5d06308f GIT binary patch literal 692 zcmbV~%Wi`(5JlIvqQ_UjRtB#7PkpBYS8RRsHu4<{?FG7lj4ldambj zhSXQC?&+kYXbpiU2S+GbiPY1*HDf@C{l!}Ngvz$o9pJScOafoQ6tAu_Q8JC!bV}|v zJW48=jW3ZQ=_^LSN<0cy{m@l3XsT_;7EG~-LZ3L5$59m1*$?vx3l2}wY`L)3Y0Uj* z-FeK)Jm$O@xL~M}q3w;+WZmdF&JOO@y!WjpvtxvH7dq$c%Qu#}%e$O%nz1f2r(fAF zVFntuFzFJDzotqaruqlEcndovnc?;gKfRf%@o=#Yp7n>GmIi~@R|9qD>$8Cu?V6#F P_>f^jI{#L{gZce8Fub!$ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup!+css/css_inclusion.test b/docs/_style/prism-master/tests/languages/markup!+css/css_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..6296fcef0ac21d04499a2d1ea135da9358f400c7 GIT binary patch literal 1188 zcmbVMJ#T|B5S>BdKb&qRWltbW=1v)D21A?_B>`lcsx-=f?;RgO22!ao*}ivo&+i@% zwW+TXOkK(djr=x2sx@vs_f!;c_gp6tY7L3_*?8{5bHkv)Q=HZeX|@qEib0&|xvK>q z=f%`7MkCJX1F!83?aC@oO(jfLjY-k{_5A9Km!Wgy6#ZC6b9OPThfWE}F z8c>riQQu_}`M^FjNY@gYgA$gX0gB7!+Z_Kh{e>|-*XBTQW z^^oN?b{kjjO*eIDG+3moW}A&OW@p9TA8FA~izqzDH3Or8{mqFfS$d56^j7p-f-V1< zcb_u7XgC!LcKbb4TAU?hxz3If-i5kUrB8=heul7pQ-C}KB0sio3b6KBQW^R73(OWI AW&i*H literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup!+javascript/javascript_inclusion.test b/docs/_style/prism-master/tests/languages/markup!+javascript/javascript_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..ef9a0ce9f5501d1e32735ff08159a8c13d27d7c7 GIT binary patch literal 983 zcmcJOOKyWO5Qf)S@*S*MB@zi2AZ)s;)DsXEE;Xr})F3~i=Jp-S*eM|_8nrAC^T7Xn zzwOerS`L=k%OG}O#g{EU_?d?+R9)Y%)@2dGijp#Y0hZV+*MP}uos!K14<(e;{*~2W z`2li z7iDIZJ;c(?xG>n=KPCg*AXU&{IWW`_E4k5m{t+JCAH`=PtEIwvvidKKE)wTGrwJzX6kL^)>(i literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup+actionscript/xml_feature.test b/docs/_style/prism-master/tests/languages/markup+actionscript/xml_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a5b5227fd31e49c64ec93a59ec552537632aee0d GIT binary patch literal 1070 zcmcgsO;3X`7(SPT|IobWvBi(m1|*ADJ$W&y94b~NgO;=f-M_c5tV7FoAu0iq=i%x5 z{nB$yMbp-5FN9e?+}+YFj!1f>a)(Apjgc8#TwW!I=Nj^K<;AESk;yl46i3O73(qlU zjKNOq-<5ub1%;k#C>D-|F)q?;{y`_T%LJ0Um7(g?m_zD;81p($zprF9_AY$;F{zLcNTAfJVh+|R& zTqjS;dR}+mbd%T*1#{_5K0U%%iXStAT{?H*KP$BwR1B zILv&W8GrL*?_1w%;fGSRJaCOmLVu`1ub? zcA>R)-9qTz{DH!`ANB=Mn>Q)$nGwHD#AUgzVkru9$GS)Z7bz`+#ljuIMGG#lV~d%R zO2=B{oh=9kXHJ#MMv(4-YtnsmKp}Ub6{<4Pt0>nS6Q@dAd+3`G2fm{VenfQQdy9na znkq95H>IlB4X}O7RyU^P8~AC?XFg>Auz8>4#}3h6Vd_*S?)fB1Ae zD0wz}WaCq6@0ZLuB%R&+!f_G|_GyP!JE6@R$_@rozw6j!Jg68AFPp%{3D9W5DmE!~4Qfa&LYaKU|sg`;P$3s6ezS$T(cto95 z`Sj4bM!s-7O%aOunjKEQhhy3IE_nap``Gs$HzIqkp->v^w6B3zIb=dgpxdcT8zbsl z-}|MEh~X#K&&>|X8l>X6$RQQDQ^4cX6VwXKh8rj=SysY5U(p(Bc}~!>G78q3Z?|0E F{spzGPL==w literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup+haml/markup_feature.test b/docs/_style/prism-master/tests/languages/markup+haml/markup_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ab5bbbeb9cde84b5ad23ab5c5851af1a43120da4 GIT binary patch literal 244 zcmcCX$t<(u<>KYiB?Ex;Me}lTMl0ne7G;+fDCsCfM=O;irlTHz>S CKsmYq literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup+http/html_inclusion.test b/docs/_style/prism-master/tests/languages/markup+http/html_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..b5f067c77d261730f90a911920e7be2ef2a7d13a GIT binary patch literal 471 zcmbV|KM#U15XI+`@Ew|)L3Tq}SR6EQU?Uw0oN*d}eVGsssm8D6Q$uVBABv*!kDxpDpz#(?FLx?owzeq3p2nPSzy#tsaGil6-Zo}CrEl`)(ngoUhjWmk_8;58AkG6KG?j$ X`h3+#Kj=-d+v<9nscs$XV!wI-q77=p literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup+http/xml-suffix_inclusion.test b/docs/_style/prism-master/tests/languages/markup+http/xml-suffix_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..589b9ed21b17673bb6f2f2e0431b59698ce82c53 GIT binary patch literal 546 zcmbVIv5Lbm44oawKM1XDn!SWBSvs`Pp~FGQU~)=hn%JRHxb*KUrFU?2YGaJiLr?EL zD-WK@bHewYw!k!TI&G}KbL0GFHH41lDxr3u)zr0d6h~Pd!Y)hoRhTR|I#^D&L>g=_f8YfP>_=bmI8SMW>}hL^ zLHQ!8fGOuBs`NtMVX1`Q{)a~CA}8@H#Z>O{-RBKe*8%EqgX+0)_;K98*YN K=V5<7pEeJDCx|}) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup+http/xml_inclusion.test b/docs/_style/prism-master/tests/languages/markup+http/xml_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..89372ea680da8aef2e4bf0f1dfe975f78ef5d6e8 GIT binary patch literal 496 zcmbV|u?mAQ5QgUnzC*ZKo4tsOONSOZI20s9NMn_15^RL_?R%#!lx#JGz@NMOzq_lP z4aSB%yu8_S<^9lW6?$jIa~#qnO^VjJvJmu=%r_jWYtn=@&>3|#Q*PC0AmdQ|!a-)3 z191;PzYRp4VKq5oAgJ3{L<*&!tq$`t5AlkX!59Oa2grcQ1xrp*atV?WKJh<6ViO5@ f5}|mvFS_cCzCU>DCVn{`xn5Vyd&>`XecrtRg^zVe literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup+javascript+csharp+aspnet/script_feature.test b/docs/_style/prism-master/tests/languages/markup+javascript+csharp+aspnet/script_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..aa07913e92da3eb54ae5faf68f9060377f3917c0 GIT binary patch literal 1047 zcmcIiv2MaJ5S_7j<;3y{4ENEI7WyL6-(j^qdyi5;DtsGnaaCWTNKirNg3&-Z-y z-n&a|#;SI}jYhYWmbfLBt7*+xRG7pey^2I~I>mcq;*0x8%pdq75s7UiCR^#SkTdAc z)pkS;jHoLi*S7glXJiTAfKb_t+rRPqatB|rFr z0IE<0wBlP-faYYaM{~z{r-i|L4}6DR(ZWKV5+qee}EW*0oa7zn7f7)NFOZPv6I|jkiHPP=RI`##;AjE52rz+7M*tgBn(| vf;TO7?KsdF(t{n%KXGIl*tWyR{*x!1Q^Jm6%w?vW-<3AkA2_UI1poj5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup+tt2/tt2_in_markup_feature.test b/docs/_style/prism-master/tests/languages/markup+tt2/tt2_in_markup_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d548ac15bc63a9b4f111bf68b039eb9f866b7fcd GIT binary patch literal 1475 zcmeHHJqyAx5Stp(@e;_TKfWJuenp&uz}>fo>ULZw;+Eg75)1n%zL-Qym~ zWtG0}c?57WW?M*$_XZG&EcE~-*@P!w@MV4SrTzt{Bndc_P{JwMaOUKh#o+CwgI+&& zr5mNwro$ALF%kQ;4a1R`x5N~9%iJ@8@Ps0R+dUa7)#z3`Wqn5;Jz8>hl~&85Q9k^l zFHku{t|1-eNo7U(pP1!TBO7o^WQBQ-g@80d^5 q1#plk6sIPaWaj4;>nIdw=B4MP>gHtTr79%mr6}Z<=9FZDxq1NesZYEB literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup/comment_feature.test b/docs/_style/prism-master/tests/languages/markup/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1b26ae54e5a4199073d989d8ab6778d0a0c84ef9 GIT binary patch literal 343 zcmcCf)CB@NUM?FTLm@3cUm+>6NC88Hmn$i;3L?zQ1=2w(;N{}wist3wj8;m{&&^HE zD^b!>Py*Qrv`Q&f2b&DCYX~TbDT>L1I#4N=mkWr)6D2kS4WZHI+1@+qWMHG8J^-mQ(VQ z-~Z+P2G`kRn$Kq=sNAL=QZo1{+~<=q%wF!s4=J!1@wJ~KW_bqT;)eGU#L<);F+SuZ z^A@0l_u$!CUATZ!!Yb#sw}@TW@vhGsyT<$pKYdK%d+oMy8z3&7^!+G_|FAr_pyX=7 zWK+1Wtzr?d{kUO%wv5idI20nz8xd^yYs{ge hEJ$6J$|~bvXRnQ*)n;9*xYkC&%1GFJ)J}&Z{|1Emo(li~ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup/entity_feature.js b/docs/_style/prism-master/tests/languages/markup/entity_feature.js new file mode 100644 index 0000000..e5ac159 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/markup/entity_feature.js @@ -0,0 +1,4 @@ +module.exports = { + '&': '&amp;', + 'ϑ': '&thetasym;' +}; \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/markup/entity_feature.test b/docs/_style/prism-master/tests/languages/markup/entity_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..44f0f83d6a9690345a70f3041e1fca3d158b1b36 GIT binary patch literal 304 zcmY#O%q_51P%FtuElDh{%mp%)D~!z2OhF7oGXra0E?zEOG5|xaC;npsv9t19F~HEH4)jk?%(5jMU`pVuiH)A_b2SUmyJlUmu0! bjKreE#uzfVj?+dBb`{$UJP&Wei{YO*qz!@+@M7QH zcYoiVv)%ifsd<;zQf6rsFv>JNkT%%1&_5uzhW@>=fP7D1vvjP$2&3hUDsHi@T73Yws~iyk literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup/issue888.test b/docs/_style/prism-master/tests/languages/markup/issue888.test new file mode 100644 index 0000000000000000000000000000000000000000..5c327fdcea4b9e7639171a83d148a6a685d6daa6 GIT binary patch literal 348 zcmbV{!3x4K42I7u^c_mP&R*SN?6OA?b{RdCHO`{8qs`pwo9anC2n!)3{9nSK)&`fN zcRH`j5)Pl4IZ~n3Mq~|qU?=QR3ng`p;o2;9(Y>TFwtts$G`}*VCsTZ z@ZT5|(0urxLme2F4HwS+{`)IVx2!HPDSko)`@pQG7|8nI!>nAStfe?3szcK>Z_pvD G_pDz50$0xf literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup/prolog_feature.test b/docs/_style/prism-master/tests/languages/markup/prolog_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d7a2d3de861bdfc5f817ed73df0341eb50e2b75d GIT binary patch literal 482 zcmbu6JqyAx5Qb+1`47jc6+KgNPuax7~Z6&)qC* z8wFRgP8yx!I2mC!=WO;a1L>nFq^?rjZkF-%nHM{MQ{-wQ54EK-MNe{4`$i?LQ^=XW zohgW|9|j=|;4J>ZLS4?;Ajh*c%2XHuzOE_)g6KxzKKdr{NhNx$54CTc;ssQoutGmr zL!gK4+i|x42YFG`@#LU177AIGWJ!D2tyj=r!A0P@zbJ~8)C31zKyy)EKHTIE2#beY literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup/tag_attribute_feature.test b/docs/_style/prism-master/tests/languages/markup/tag_attribute_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..69751b4edddf761c5fc42cd53f06057c953b1205 GIT binary patch literal 1790 zcmds2y>5dr5T1j?J6N}{K!+$(gtPQ9fWiDUK}}5xb}I4oy~99EAZ-+>YE=eo-+i|4 zzWZ^QmuHq8MbmIlMWcYdR254_%~R3tTqh(winxa|ZxHkwQ0_V?r(X+$5~W)@V6(O) z9C!?zFs>6k@X@}=byg85u?L^ge7eBZNy|)Wp~^}k1VTuBf~^3Z0GcI65P?vt4y1T1 zhND){`LuvKi=)24W|#2cl9?ukL1maVwk*QFvkfU-uxx5SQoew>*Lt7`PRzI>a|a2k zI|6b1xiBoddaoNZcD*qM#LtZoAm}f+ewBf&|N3mTC>S&}&O9~=`6Z;!OdA8pdtAp7 zSu#UQWZ8(>MRdvqGM3iwYN)|7I8EP{7ksUr7TUg>mPG9h!OrO`18 dWSMGwxO{8QK1y|{v|?R|X@~2K*^yhor%xtYvLFBe literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/markup/tag_feature.test b/docs/_style/prism-master/tests/languages/markup/tag_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..43089ad64039ef0edd38fe912c18c6a6a9680fd4 GIT binary patch literal 1255 zcmd5+&1!@&5I%1p?=a-lg4KHwq3mP09#YM!RFhz0Vc)(pNtG@3uu2aNXyz~TWo9yy z+ak|w!CBt)pG7l|<1NpKj1tZY2s{!fxf=8OE+>*LFg3`1LEQU&{-GR0jWG&wgjDH+PDYP7wv$9t7I;k_( z2(eopuGz6d{S~^nOcza40Pl-!bG)0+ovJ?^T+IY(wEhOz*e(fw@SXI4nbI)MgYWI2 zVCc1SAaw(479I4O?4u;*>}_xc>gYGPzI90Y_B;Wo0>YAsA)JuzMp*xa9@$kepc%H$?fFk2&) qyA>TZi$&Os5byOikB?ZtKH@m?(!7-zlr(}C^CG>gAd9SR{rwMN|5~^J literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/matlab/function_feature.test b/docs/_style/prism-master/tests/languages/matlab/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4c0100a47953fb43d64f561068bf91f3b01d9802 GIT binary patch literal 296 zcmYex&)3l85m_)QB~c*gLMD9+b!4O9x9&9ixSmbT3ljz1WV0G_Az1=H1O2 WdB3m!JYtwiyN=-J8Q%Ax{5%2krO+w> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/matlab/number_feature.test b/docs/_style/prism-master/tests/languages/matlab/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4bd7a44840beadbb83f053a13c2bb80278ee6c37 GIT binary patch literal 384 zcmXpp;^i{dGc++YwdCb8(lbm2^Nn1!O?bHsfLvWupnN7!DvOs3NC8P+E?qJJNMAHB z7iY9mUTJPpYLSwTf|7}mQmhV|7}PD85@5Gs3LEQz+=?jiq)^**FHKQAhOr=`2#S@~W$4*W7B1|}$`A-V-p>q~xB{+c zawS{?7nru_v0+-H#>`ZrL4qw>j}Dz@@*Z>YmFfrACteiVAtqx{*UB=UU z7)=G^3UjQmV0~iJEETg+SO{8tE6rSHQF^0A*V3ycnzg9Xv(mEOaVu-IUb0R>SrZTF zmGG>ZR$gf{6IVtl#>|pv!Wf>rG~(acrg1Z+{r?}@-!A9-gzGTk^myR=nI`uEupGGk literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/matlab/string_feature.test b/docs/_style/prism-master/tests/languages/matlab/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..48b91335d489e3c95d601a15779a62f8d0c9970e GIT binary patch literal 232 zcmY#a=jBpQ%g6RU0o?w2VD$q h9~L>F{YtUCTtGy=Bb+l*le3Ez((;QGATBA^0{{zJFu?!- literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/mel/code_feature.test b/docs/_style/prism-master/tests/languages/mel/code_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2eeb2aeddbd10de173b1f06408aa9b81f01efc5c GIT binary patch literal 268 zcmYeuDOS)ePR&V8F3HT#OW@_=<Q4a&bm0CFiH4D(NVII6z)XYEEWuW=U!h zP)I33DOLv}oK~6#whttlQ;ZPKNlXU`AshskLN^F#PHZeM7Z8!}VCRg~KYiB?Ex;Me}lTMk^)f=jNv7l_=>bDCz4f#p+-RLakDY a<>dk*^6hiZNKMWzR!GY)Qh-`otOo#4WGg2C literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/mel/flag_feature.test b/docs/_style/prism-master/tests/languages/mel/flag_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..799721359e47f82255573db8e6182c4c9e5a7b56 GIT binary patch literal 216 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

        AIl`c>26=xdZi;yTt0pnbu~z0kU_JIuE7Lg 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 Ulf6{;7ts349*Y4Fq`Uw4AG_)fz5oCK literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/mel/keyword_feature.test b/docs/_style/prism-master/tests/languages/mel/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..79c1e0b5b79ebca23259b24064c78de3a61f3f1a GIT binary patch literal 720 zcmbV~L5{;93`N&t$#;lYcjgjvjH(Mlp+RAAMM%@$z9wWf`m07ELGKA9`+F?j&P>iO zUcZuS%&YFMKG-!?-3XIUO@<^^L6E|9OETKT6oanZmYP3XOMEiji#Vp@>snMT3iD0> zTdZzkdU#jc726b(-pcg-!PCy2nZC|u_ODIK)tm-1wo=UH^q;rd5I%|p>Zl$W0kHK4 z;JsmpO98aE6o?oQ%n(*Udn`b-oB-~@0nw90VviPxo;47A_~yc-@8=WnJ9#%RgHGgd IjKT8r1~L%D?*IS* literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/mel/number_feature.test b/docs/_style/prism-master/tests/languages/mel/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..66b6453951a770f486bcac7837034ec5c6af9955 GIT binary patch literal 236 zcmXr0a7s*ZOH5AXaYifUmF6a;7Aff{C>g+P nP>R(-lQJ>F6oa}zDVCQDh{$(_b4F@%cCkWQevtyiEya2OCSNhh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/mel/operator_feature.test b/docs/_style/prism-master/tests/languages/mel/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b0c09887b4f900a02949fb916bce0b75f38bfab9 GIT binary patch literal 664 zcmbV~F$%*l3`OS(bO+fG4|ZH%!1mH(gak@SDRf9lI{NTchAxq&81b<`@5=}jC=WXk-iR9QQO34y~W&Yl|(E`wb@^Lqa-tL@1KJN9(2 zG_Nox!cm5!=BZ&X!(IiG1d|FH2^tmL&BM?|1)XD3jNO{%X4y2WO{)Z}3U=BzlN}Mb T&M(33H9y`PJ(rdKo3LGf@F}2x literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/mel/string_feature.test b/docs/_style/prism-master/tests/languages/mel/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..42c1913af66784690e93b4d05f060051e5693201 GIT binary patch literal 210 zcmY#V;^k6G%a2jYPf9ETvU$05$p9dI(Y#!o(MrW7MVWc&N;(QkF+ivktAim5v@8Z< c9Y~&+3y8?K)Hx$HIlEXPEx$+sVso(`0C~nN&j0`b literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/mel/variable_feature.test b/docs/_style/prism-master/tests/languages/mel/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d62e3d5dbe9186375220828a31a5f36ced6dc4c9 GIT binary patch literal 246 zcmY$X;N?KYiB?Ex;Me}lTMk^)f=jNv7l_=>bC|SWwRf^^10wVH_cFssm Q&MsC+%P&%ZnqRC30FQVjwEzGB literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/mizar/keyword_feature.test b/docs/_style/prism-master/tests/languages/mizar/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f2b2d48718a3bf291419a72f74e36e3a26487233 GIT binary patch literal 4149 zcmbVPTW;Gh5d5wH-68OI+A{>`F@k=`6m7GSNQDn6zI|s`w5$~47D&-hPdrRO&j8Hb;SS zj%{-Uc(iBd<)aH6!I{n*J6L!&U4n(QaB7B`U>d5tv9kT200d!LtKq=?0RRi3)moH5aD8V&|Aa>&8c{!9p|wJ z0M5JB{N9Hv45lat>Vy2qY3zIH2Kh<^t)E?#MeK+CbS4kjj{R772G6H}bDv^Bkk=*8 zZnm($tcRBb+L!c+`=)*v|S*`1^rr@_f4oS(x`a7}hSmctQG1J+&d z&522Fo57+PZRar_Ll383HtPdmG>CH@Y7a&}ENvrCN46a@wzoLB$uLXICv7wyh|0;~ z%y?t66&+6Jxso-Quqh)cxUZS(yL|76~4+kAUHyxHr53~_jVI=txJ9ezFkO>9Yoaks3( zxM5(Z?pb5w&Lf2kb5VbNXHnD8Cg5!XjUBRPs4zkl!8= zT4er7vRkQTh|LQWw9Ly|xrjYV8AY|WG3JAUTKy4{;MzWC|1(LGO}_lB)*e z6hzr0qN+4XZ|ak>cOCa1nmyIM(xcN=`Vj_NkfRWX4+*w|Dj(ULswXMMUVK%Y%$}NS zU1Qb|sT5Y#%9zI@r|McVNrWzgp?oRKjV((ERV;HiBBR+wta6&pDb${o$Grk4uI`eY vkee=N^X!AbruiT%6HL`30#(i6!|(N;(QkdU|?Fu{s#S px^~z^)vyWL0tFS&3NXsu$fH}8V4*>HyImiG2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/mizar/parameter_feature.test b/docs/_style/prism-master/tests/languages/mizar/parameter_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..531dd17269b4cae120474ddd57b2ddfff35495c6 GIT binary patch literal 397 zcmY!}R8TQeP%-A^QZZ3bF;!481G3B%RLm7rEP*UT170p(E?qJJNMAHB7iY9mL1Iy2 zZfZ$tk&=#rl8T{Htd0V@pb<7fW1t`w15B`~HN_@qhTQ;=Fop}vu?bpYH^9(9DVCQD Yh{z8a=Zw_k>|%wq{2~Q-@D%F-0FItqB>(^b literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/mizar/variable_feature.test b/docs/_style/prism-master/tests/languages/mizar/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..87158a6c4787a63add525a15efcec9d1ecc0eb3f GIT binary patch literal 362 zcmWHr;^lGNu_QA;4@6va>qa}x17ATB3fJ=lY|l=E`MQsQ;zjMU`p OVuiH)A_bWLi}e6~8CUWE literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/monkey/comment_feature.test b/docs/_style/prism-master/tests/languages/monkey/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..967d3fe4a344ff68f7a376f635a7709eb625dc92 GIT binary patch literal 405 zcmbV|F%H5o3`J)w`3{yDva}qc2o8YQnhv1^wL)p6go)Ermqef{Q!^#@|MvS)boTyc z0>b`cojed46G%1YJ=adt9YN7`7$fl*nGE&bIXk_+2842J@gdY34gx}puxmMO;)+-$ zOzx_6D|73hr%Wz)VK2y27(J)ae{l**87zaAglqk8141Xr8NUI D#J6Xu literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/monkey/function_feature.test b/docs/_style/prism-master/tests/languages/monkey/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..21debeb3befb009caafe82184b72b5ff97fde7aa GIT binary patch literal 310 zcmYex&reD$($M7Pa?8(;cS> zr6WZz%<9RuNHMNDhNeiVxO&&DkN~ z*XB_)$0Ehz}x#;=(4SiUu6(=xE*}JO1IdLHP>YY$+0EV?A2uF($T6>1@)+^c_*ojYy>0 znS{4iCBg!|OYo_giGo`j+1=E3C-JTSiBJuJ@a7OiI9mphs)rB`-yn3wE?;ej#HtUy zgK3)TRAfT6F2-@k1UGXdLUlXBPxi+ZLf45vbxeZQLJ4l3N`z*zM0j&uroGuP6RR&1 fp&B*e>fG~tYw-QJeJ=*-pT^lP<=M%@$1nc?3@gXwN=$J}OitzH;^opM1Az2J^Kx-UE9I5uCZ!fB z=_n`}D8=fa37HsSib36hDWPYIDF$<=QY|%wq{2~R2i;MLDWC=Rg literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/monkey/operator_feature.test b/docs/_style/prism-master/tests/languages/monkey/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0a468b020b7392a0940e9d8726c094c1ba9ee394 GIT binary patch literal 905 zcmbV~KMTSz5XEN$`3{c`9r`ETB?iP<9UR3$v{F!vq#a8?yRU+S+)aku<9Ph;GUPdD zjfW5LD{BG*m3PT1QBrHv)B**yK|{@vQzuN+5hHaQuVAq|bPupTU1FEmt)Exy;(&d! zhWq|F^W4#z#W9PoHl2rVs)^~L+r;ZtrW}41w`aK%{e1AIlEXPEx$+s*?kHrnMJ9|C7ETZ#d-j#KSI0! literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/monkey/string_feature.test b/docs/_style/prism-master/tests/languages/monkey/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..21b2dc7d80b6cae3db7a616565eb51f8088f7bef GIT binary patch literal 214 zcmY#V;^k6u%gOQb}b&s%~;d zViAz1WUmyf1Cop>ipc}of~i0iML`v&0%arx5T|0QQBjKJ0O1TB2pAviG}H&M*3ZF-YLuerZsa3-ZUjKQb853%$)#QG&$Uod%)OPMAC z8w4w2MWZPWO9pY06@<1Cr=i7{JFXvdh|uLDiyw54(NuY~-Z+QEM%`qL0h7n#`)mV} zoCIs^h|hg?au=U@un4U2`S4n~CC(wMS&994GHV_J1V zB5bxu1o$MQ)i|l3PRazeR>rH>5<$(EVz@EmuxE;yac%}qro+)0g~bzGJ)dzr1PHEA bh3>s=@c#Ux;kTrmPCvi>_;uQ!59##}@x@w| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nasm/comment_feature.test b/docs/_style/prism-master/tests/languages/nasm/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..44659860b3b3df58626bf8e7942efd68331f0294 GIT binary patch literal 195 zcmcEK<+4^t%g^WK;^opM1Az2J^Kx-UD<$XW=BDPADCsCDSu4frV2FWiQHtf|0wVIQ Ta?VIi&MpQTRips5uUHQNUQ{S? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nasm/keyword_feature.test b/docs/_style/prism-master/tests/languages/nasm/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..699387c02ca05cbec3fec9a8d407d4f9605d3067 GIT binary patch literal 672 zcmbVK%L>9U5Ih^mKP)+`Xj_7KtJZ>0P_$kwMSP@M)JD>R`u8Ta)~eBixok2syO5df z4gD#!DfCn|jeDgQMnR6WX$be5X*_P!3NgYcW$P^F3Amg$S4;5(BF^Qzt2FGAF_FOH zB;q8CFxnm@b%4cj87GSGk7v+nbtp!zH?n^Vlxz_n+d50inXG>t!w>I*Qc1!T{z zXD&9R4y5=H3G48Qn}!~zmc-vDmEL^xlwN&dq<5NmZ&vw fW~1RMVG+3&`DXkPSR>zt9b4~Hh`4|vwzPQzk1DRv literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nasm/label_feature.test b/docs/_style/prism-master/tests/languages/nasm/label_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e9be0d195686770c3f70f8fd0fa085509f989fcb GIT binary patch literal 232 zcmYex&o?o$;^opy%g+ZJpF)1}iNk>5mXdKW2rC1$Q jVX%Feq7dtqVtKiMhv3_UMW{sE!hT2RP>x?MMEKT+)v3Mf*w0WFi@?`J!}wA!au5S!;`J58R= z^ycdie{QrglWTKdk<(i=Hurt@f?m<@3$4HlfAp}@gCly_=poXbZG%?MS9ZeOorBkU z*HWSGSVFl0*JIh?G7w&w!ayrCFBZOVOJHV-*ABNf;)?HcUbv!sg^%1e(7-ksWCPml ziBWG9@Q4EzNihH{#O=7zz#|%1q{RTxz|ksu;D>o9t)5Ql_s>_=T+>66n)TGv&jSn5 zv5JA-N^m@ODT3EP_!)44PsN$F@*MD|j9s?f1}}FSn%au1TElTmB1y#yZLX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nasm/operator_feature.test b/docs/_style/prism-master/tests/languages/nasm/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0202fc4a1408bf43d1222290cfa69790eab48290 GIT binary patch literal 448 zcmbWzF%E+;3*Kn?7a!mcvw~BKE)5J6$ deXBXQGL=k)<)ZVRFZA}BAMXXvn6S6HTz_12Z5{vs literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nasm/register_feature.test b/docs/_style/prism-master/tests/languages/nasm/register_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..77f054ec15e3c0b1ae76958e31f246677f3a0c69 GIT binary patch literal 1509 zcmbW1O-{o=429Q>GBF8aO@A3pV(zS|wBa%bO=L?BOrcmQw-vD(iqT?NR%W2xB>{54Wdrlo$N7|8h z2MVA73ZM?AS;{PRmNp|1=W_ zF+@2%Kk)N?r<|TngZ9f}Ti4+rgKfv*;~@Xx2pF_}j8W|8%G7?+QSC?1)Lx9J_UbS- z>J`N(V1%eBGhk8_ol8r!MPD%3n8CD1X(6l<)|`bxp#P#J8j?U}ik4-rXyRyqt|pMV zqVJjOG{^mguu52S7T$hZi6dc^u;wf{mRoc*#+ImS&VnO8>?p;T&LAv+%4Zsvo_wO(B@PWBgY$Y|DJ) Kkn9Stq})GW)kymQ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nginx/comment_feature.test b/docs/_style/prism-master/tests/languages/nginx/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..09493ab5819ca0cc339c458ff65a11a56142c210 GIT binary patch literal 201 zcmY%9Q4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE>=j(FH(S7S*!;DoBAp{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nginx/keyword_feature.test b/docs/_style/prism-master/tests/languages/nginx/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bd34c52b34b6a507738c998bc95e380c8e5203d3 GIT binary patch literal 18094 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 Z-%!1`kN)&DeuY0p{z}R5<3Epw{{!1l{cQjM literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nginx/variable_feature.test b/docs/_style/prism-master/tests/languages/nginx/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..29959b95bae71f1a79270f8d1881e04088f5862c GIT binary patch literal 216 zcmY#M%g;|rEaK%-0W#vjEM6{MG5{|ZFIO}#7iY9mSz=LUVp2}3l8%BB$W)-AO0hav fr9c)c#qx3i5&5<{XQU=)7b~RY7b(E3F4hA8J##SV literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nim/comment_feature.test b/docs/_style/prism-master/tests/languages/nim/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..09493ab5819ca0cc339c458ff65a11a56142c210 GIT binary patch literal 201 zcmY%9Q4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE>=j(FH(S7S*!;DoBAp{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nim/function_feature.test b/docs/_style/prism-master/tests/languages/nim/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..899ad50f30548c937c4f00150d74eee8856629ec GIT binary patch literal 397 zcmYexkEyUs%-7)MO3q0vF4h7vN)oeE!=giCfy@Mz1R%-FrAr0?>5Jy&;*3^GE6qzT z$;{7F(oq0%@?*d@D#gZvxCJ1&(nP4Vl7>>O4yGQk)4;m(3sQ>`OY)0=93?HF5yYDT i^A#!f0=f~t$GeeuQFjB<-F zNODMD(qts~RihRay-i|62l5<+<$0ux)YV5D!ih~n$u%eBtSzF)4~desS*_#uk&gPI zEhyBk2A-5L@x_V=|u>H6EMb)MN8XKYZOr>{p#$0$Q2O z&u_f+-0Nh1yv}zyA1N>M%Wby!UFWx#|KLKwouOR{giviTSjEC{RS&^cP8_Zb9)jac z`Qk*EBtJ4VO1Lgsh7T2Urpua9iGV763e)F-(O}7#6$ba=p@fbHA+GUaOkx7k0c6RT zNCICYN*MYG#t^gYG1Zj0#+-52+!G2$K+x_C4DVLK2=xwv!%PS|+=UU1b))`6l3_>$ z?GD9oVOkp=M$(6=5#pcAF)E)7RUc$HjFG_IDG3hiB&d2Rg<-A?hueMu!+r_V{dj(x W4Bp>2<=>mQd%59{>vlPF`SlmL2qU!s literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nim/number_feature.test b/docs/_style/prism-master/tests/languages/nim/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0587edb0946698543adfa9e6213a1502a1fd52b7 GIT binary patch literal 537 zcmbV|!3u*g5Jb;i*ncRw*1l{EWLdtu2 zq+{O2*g4*1DFQ;gVWxLA!meib;dXXU7VVi>zs{QIpDj@W=o`(4@2I}NMh~FM_~uVF cKKxV_0CRP|KUW#BsaoG%s%8xWt*w2(0NgZntN;K2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nim/operator_feature.test b/docs/_style/prism-master/tests/languages/nim/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9981f4a40218d2c6f3417cfaa7fcc25dc6409b71 GIT binary patch literal 964 zcmbW0%WA_g5JlG=n18r2Nfvgj?1S@weny-?sADYJT15(_i;!>cD9}YSvx<>H9G^R0 z=xU7$HB*TtQ-clD4pZEi=9uBiG{F`}rWINy=ir!_sY30&5F*oH`C~9MJL+ZYIL-sEA6$dB|4|gjPj8@oJa14{YBcMr$~J?486hP zed@#C{HRTzEG9kFSXydLHQjrWEnBLsCrj5gl=2q`CRxwlfY;&t_MXs(h`(!)+%Eu& B|J?up literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nim/string_feature.test b/docs/_style/prism-master/tests/languages/nim/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cd41819d1d269660de2127e35bf3dcad8cc8aed0 GIT binary patch literal 631 zcmbVJ!3u*g3_Y*Ve<->1;&$F$=m&T;9y+H}CKjqNKYvNfM6lbyR@(ZK_nN!{NCCzn zxSREKroS-4ZX7r%H~=A3Kw)1BV48hDJ_6(!;^Yn1I$W;AHEtD+8U$?RG-@q{#>M2c zOL0Chm{&@1DnA8e3XmpL*$$;PF*cfxGcV2*nmwYvwnbKNop_D(hX(Y?{%@NFR0F@N<9e;?tYwG8uTIW@4eNuM3tGct^)^p?4 K(9>#%>GB5hq@9`o literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nix/antiquotation_feature.test b/docs/_style/prism-master/tests/languages/nix/antiquotation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b0e6e51c7bfcd568b2f60e7af8e1907eab796a08 GIT binary patch literal 267 zcmY$XHZiK@<>KYiB?Ex;Me}lTMk^)em1Gu{=9eUvWaj57=_n|vD8=f4WeQ63l1obA z;?*$mywcpH)FO~l6C;=yn%Y{WSY9q5BHwY&8L7$H#R_TpMG7b`ELO-bEh)}SNma;C OQz$Me%FIhI)&l_U1VGvV literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nix/boolean_feature.test b/docs/_style/prism-master/tests/languages/nix/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4019c444f8b53c40620226d2914ad19fd46effee GIT binary patch literal 201 zcmXRZDoy3(N=wWs22#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H<8xk|A*=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040MAk^8UO$Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nix/comment_feature.test b/docs/_style/prism-master/tests/languages/nix/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f44b3d423a597149fb60593f9303d5208acb9375 GIT binary patch literal 281 zcmY%9 zP*PTk)xi*hT8~8viju`P?*^@H;CL_TO|8P?9$ zDsFX%@-cc(Htx?MQePGg(XgkVVt9R0kt5jFUM6bvsVvCIFnMk`o0ekTjh?ef)?Fmz*8Px< zKwF+WP@N)q3pzz4@jv_VJL({r+B-D zGdnoRg6Hhjz>kqb_z(l#`IDThe8ukmcRoYU>D_7GgcuLnF!t2D6HRk?8jPwbugG%- zIpC1?64DO0Qx0LQ7>rf+mPJ&W7ml5Gzxd_y)Y0WLjP4ufApUtP(S85AWryd*_;nuA z@83GpnD=E-7PoKslep)yc=x<+r!!sOtky~{VKkQ%q*7!UoRC{eaLK=czs+2%DC)X=Ay0+8Omc}sJ{3J; zlMG;#%6kE^R3I{m#{!z<1X3|zY;qWt8b-Tk)Ck*-U{(CojJ)zbsr_;}+0 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nix/number_feature.test b/docs/_style/prism-master/tests/languages/nix/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..25fc0310d50cd5acc6afff967870cc7fff5c7e5b GIT binary patch literal 219 zcmXruKYiB?Ex;Me}lTMl0o&<|d^UDd{LE87Rf-pb426VTwU4 hR*L220wVHlcg{#n&MsC+%P&&M%qvMvPc16e0{~9iEA9XQ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nix/operator_feature.test b/docs/_style/prism-master/tests/languages/nix/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..461f1a257e07e4724438400587f916e3730ee5dc GIT binary patch literal 541 zcmbW!u?oW=5C-762lo!Y4lc&}0%`(%jF6#}ltKqf($R;H4qbXq5&4Io?@+ji7?~7Q z&45rdA=R|7mdU{-rcz)Gyk{CQG1dCSX>&8vW!Cw#Zuf8A^Z*_8GT^Ujoq$S0)rCRA z(1l6D)P+_;+dA<_C!uSv2v~}g#>me5-t;Kpq!*@o&#&h8S|9Hn&%EKcpZ$6OGe?4o literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nix/string_feature.test b/docs/_style/prism-master/tests/languages/nix/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e8e7f35b76d5daf02d906f6e86c0e7da563c1ec0 GIT binary patch literal 1036 zcmd5)L2kn!5Ih@+Kde@fxTHBm`9RfYgdDI#8mlR|7+)IY@7)Db+ilWAP6f$^+1X_n z7Eua3c(1Y6+Jv-I%F`sI?7f#_T*KlFn>AdZHlHOK^c<5y(crHXR6AwoT|$)i6t0a5 zDLgHh0i`DOa-tMZ4-6@!*h*1tv5%p3uegLQYMQv)Eq~+egHBGc7k633A7=i+qFO<_ zdki|fA{}%hAS)q>t&28v{$yh79V=y+aN}b8G5C1Jae+xZ$GX8aarlm$$A}x=Ya6Hx zZq_6EgMYytACk?eke`%pP0&4iKu@3g>JTN&9Ol=*<*-t03A&FHsm7?E$61-tDGgb{B>{s;prqFJqx+g2a+a%M!U!V}qk*6> zVj$9}JLy^JUbDI2zU=HbM7e7)+BGzJO)Emx-~VY_EtfaI%nnPBFWJg@iMbm6m}!eq ZuI=C_C2#jYdh5ycat?%>jyN7wU~de&dMp3{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nsis/comment_feature.test b/docs/_style/prism-master/tests/languages/nsis/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0ed2723294ddd22cd64bf980efd0e23c8b795845 GIT binary patch literal 293 zcmdPbQb^0sSJ2Yu<X7tPDX8LgC@pPQSS zSE8h&paii9Xopg)4tBYiqL@60Gq5NDy9OUz9Lv8sI>{oLbS{oH*#gFR|N0*)mjQEFmIs$YIeDp)MeHNw$1z{eHH;pNgL z1Az2J^KvNwL9|kGeqM1&VqS@oj)Ia3n){Vvb+9XgcnX&^s!wsMLiIjQWhh~SQx$qZ h;Zz6@J*8M)E+8U52%R%hle3Ez((;QGV1Zby2LN`@h|&N6 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nsis/important_feature.test b/docs/_style/prism-master/tests/languages/nsis/important_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4563c0ff85e61e23d5dff1c7edadd5ec6e708bcc GIT binary patch literal 1483 zcmbW1O>V;=5QW#Z`R$jtD~#30_|B$U!t znni)q*fuB1y;(+WbLu@LaQ+!eF?PMj&0L6 zZ%;hjcW#@PbFXLbFbW&{*RJQYxt~>kc`cXh$5*M?PqfUXD$lRyUSmlLWytEN5E4v< zu!bs#WmQ3|(#miXUztAWv08GMXt^Y*wuUw#A99vbt>B1NdR9}^;O>)h!DgKUT0^VB z$~1ef0+S8P?4L7_3bI)%CCR^KwpqGNlgrB}8@~+mUC>|JhJMdq2p<#3Tj&OdopiIO Q8yP!oL&QZ!x+2ic7({1SE6#6ub)#al9Jt3 z+Ql>)39C-=B3_DBhq-;J8#|rc?)S4MtM)~8OitO+I89po;R^5Rxy;&E=*qJG*w(dO z6irgKHY-c7Oy7$0swhnhxwG}WtXuP3RQvj4I+s8|_%w0e9lR90j*VD;7JKLhJPR+L~bsm^|Dty*Nrz$jd^4J zb5n#muGlx>#EUkZCNxs*~UIGubqSYWr)AHU8R zDa#GE4$ezsTFeDhi}ILQbK>%PjrC~V)+8v3>pIUc%h0*GS(|smB7Oa1apKm4&|9y% zvfO0$^*#$GU6u3JM_Vf|42KhR%L(3R&!R85Gv~{6Jb8Eaim(~+g}stJXfN|31-Yp^e7%yRDzm(Xf z54g!sF4ADFNwarsNfL~^2>rF#E1n92umbYXl?KsGt=n+778lk_XDKKF%6B&k*pFfL z?8CchKKM!j!d_}ul{inX&d{L&$L@)JyK577@EjqEyF!2mkB89UgVw@-0GfhgR~6T) za6-8r)o_sxi@T~XM!5C5(TCvb-omQ)8^H7<~ON^m3j ztJ8%@PYF4Vc$q#WaQXW#x4j07NRbRrA`i#i_`w@E0o~0Ce0vbQZwTV@lY$%PB7*9! zD{XP1xkt3vx6niJJIP7?XOr45a=p{ZFMr`5)%$Ha`RTWtH}my@z~|=YZ#VA3z4`s; zAM{tzx@Y>?audlEutoCvt|PDbD+6~HBc0yfMDML490 zI;c$oC6Q7s#8Hac-IoeRiKYU%YASx2nF>wN9ipgx?y8_JSyZr?-6}Yxy9z`R>Ig*H z>+8Kd7*E3>)+)N1o0|z8l_Vkd3ffkY>utO@alM%J8 z2c;=yp5(?nE2V;Ro1V84YI!0{L68t3h?c+$s!KN@DnLgs$uQlnXUB9KWfNTUXHo-^ zP!mC7*knNIGB9p|gA*zTlL09wT3IO)>uEcw&IOMr7!a{1scUI7M(R(f!CasKFgYjy zo-Gs*Vh|K{Y>21Oj>-t>q0A z>Fc@)6t&V$;H(w6C$VLNA6RYG%+cHmI^exWEr^Vk4MsBrEVLSs0;7nu=g#H!6;21W zJ-aSfi*&mT5BYc5Vl*5^@9>iPq+C(oJqbK!wPsu5o-B+xx!2mp9_dee{*eq`w% zImWE~tH+p$k_^VDf&N`&tQEzr_Ae)5WeN$z8$7(N2(@Gu@#^(OsyBR&5%J6S8Og*w z*a$%Xf+KE`$81poi~`;z= literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nsis/operator_feature.test b/docs/_style/prism-master/tests/languages/nsis/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..341fbb83fa9b533ee8896b05889675c318ad36b8 GIT binary patch literal 619 zcmbV}K?;K~5JlG=m^*v|W?@XdKoS={hA5O`DRf~`m%+2wEV?K&E5j_p> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nsis/property_feature.test b/docs/_style/prism-master/tests/languages/nsis/property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1437e86214758a96008e4d4b264a11db0e9b0ba8 GIT binary patch literal 3456 zcmbVPU2mH}5PU8Y|Ka54q*CH2?*z^^GH@;*RjeqoXpCd41R@}9^Y6QRfMvM7#7Z8F zZ+3Qo^WN+x-M$Ltx#(bQSP%H7U1%7T@zS;1bbL(#B$U;Z_X z`jBV1ke9rC2IQrLCtywXPs*7_Q@v#j?o^qEX;`7XaDQ^sn7JO`SaBS>cS#K2G&%eDv)Nue?;YWf?zTViL6-7MSghIqUl!PG<;*BkWnL8hWNyNhra@N7dv0|%R zdcwB6jc>uu;VVn^6%S{)HG$1fsVEYehU-{&B8-{q*vNqWa~*dMd&vO`1TMuAzJ@#w z*Kl2PNb>JCGE0IjTY?Us!A}&6;A*&p-GG#1bUIwZu0YgCXL@gON z3?EVkU>k6A+L~j>8taRSMGHH=H;rh)Jr94xnBRj+TUzX-luYCD3x9Y#9!%rg!{oJs zb5=F)lM6OU@pMlfFW3mqa{`3(ucBxOfGWzJMW_kVGYA+>gc3qqQR$t}sDa*iC@E=0 zL`vsPY6Q)S5^C*>;-jCbI2aryQxaQ`9;gaPQ&eGeNlLgiOoHDVDVZd#RZZ%>mdZi* zRWs0zTeeabofA`9v}d2eY){k~#O}KKp>gawI;GniT8YN7Q_)I}L+PwY6kk>;8KvLpNrMjfDGl9OOX|C%mN4j>TGqIe zYKgM9Qqiv4LTFSRefy=8+7?S?1%l2HONuQ!Ar*jjM(IFL9QSz*?bzF|J|mDd3O70` zOg~c~YZDYk6NE+vStm2a2dsX|_<(|QhbAn40j2)oF~zc-MKpOQ(~6FP^NTKaoM<$J z!HlEfbW@Ke+Rs6nu$+vj*wNWXrT>AEpE&m@NzPZ)T?P{uNs!|`L`I4yj&2%{IAMKZ ZFuTM&d!If1uJJ!9`L9+tq8+mO`+p=e*;fDn literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/nsis/string_feature.test b/docs/_style/prism-master/tests/languages/nsis/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f4098761e6977576b01ea80dda160aa3932a1dce GIT binary patch literal 295 zcmY#V;^k6G%a2jY2Qt*vff&e9&j&Jixpc_@AbruiT%6HL#U(|VdFe_z3Q93Rs1&P% zAquo9252!hNp*Eh4Ir0+oTe1Z%LPQ_yU#fzH95OjAuYd1p&01IoK)Sy()^Ot6otgR Q6or)h(jA$Lt!+xxgj2+;@TR(jew^>AQlLPzeVG+s5d+5cGEuj5(BPf}aql@2Du zVZB9MG4btKal92;+2;tOkFHjp&|?MF6($C4FX*sNgg~3eQ468&ET(5iQ1NMOs&%ovHQC4jtb6j*hx*ML2T7Uls_&hWk literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/objectivec/operator_feature.test b/docs/_style/prism-master/tests/languages/objectivec/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e241410d19beff8c60b557000fe6a85326ae87ae GIT binary patch literal 784 zcmbV~K?;K~5JlGw7yyo@# zURG1XI5XDxMV=!kY1w1_3LY+kB(_{^C6>c~8>CZ{I!10ri3uI)=%tQchzsc;h9|zA toug9vujQT9k3_KgiKP zk?DF#NSM6G2j;Z|BZh=22wK8-(xTtdddD%^hUw5qey3;ON#!Ks%DGxpp(;Z2KhV$= zdl(rzW(3|ZNzJKQT}39sg3tKEx=xfggbwILY)YB%n073$wz<>eetTutYI0?T`S<}l C>T(1C literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ocaml/boolean_feature.test b/docs/_style/prism-master/tests/languages/ocaml/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cffed638815d6865dc20975243546802fe622895 GIT binary patch literal 201 zcmYdG%qdRg!%g^WKN=htJ0P%Ubbjbi9ebKyJoY6|j`MJ5Nc_m6Z3Q8J43zTAY lFoi)j#uUZmLF`nD<>dk*@-24GNKMWz1{zwV0JXhX4*<@=E^+_> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ocaml/directive_feature.test b/docs/_style/prism-master/tests/languages/ocaml/directive_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..704e25080cb177526ed4b3e7863b9b2ea221107b GIT binary patch literal 250 zcmY!`EX^$8lA&eW_ zdxq-~4=9b}(k85&#~F>(Ibq9Fn%aVSr&hzkI#E{d z(&1f3BquDN&VmijS&n+ORxhC(W9StG+SrNP+9>af5laN!Q zU=#|Q00?1j)4?QSOo6*TGr vOGSYoFp3378_nKo3YpQ148>7(7>+VDyn2WG|F!64mhq$P;I7@hAeHAY@J+t@ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ocaml/number_feature.test b/docs/_style/prism-master/tests/languages/ocaml/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2076a5cbe453e56ab81a7d8781fac0aefd2f425a GIT binary patch literal 434 zcmbVI(F%e<5PWW7|3U6GJ$A2C>$Rw#5LwhNf+#@=`ut8Li_Ry9eOP98VP@#Hug-F+ z8izn_o?6Lrr@;mn#`#({?|TcXQZ$BP#nXA{1k3Z@?k@I3?K48WvCLt&+fwW%!P)=ZVTK-zfnkbblpHKvMr>&_G&VVylw@laVy%^o;fJMk zy=coa=bK z&CA6ZtyEl6l$n>Vq@$n|1B6PkIvAorhs8jghD}~Q2IyE!Z9rj=>#<6Jyn`u`5Cild lR$-8bu}XkKKq;1&3y8=M2Iq{_0Ra8CTrB_q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ocaml/type_feature.test b/docs/_style/prism-master/tests/languages/ocaml/type_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f6fdd68648c75ddc1341e40cade7382005158f42 GIT binary patch literal 254 zcmY#)%g^WKQcp@OiZ?Oh2_1rfg literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/opencl+c/boolean_feature.test b/docs/_style/prism-master/tests/languages/opencl+c/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8f7973b3d6d6c11564af7253901ed534ccdcbbd1 GIT binary patch literal 277 zcmZ?vi4O@1b>(vQiFb4K33lb>;^opM1Az2J^Kx-UD<$RU=cFd)>E;)t<|XIoX5<%_ zDCsCD0WAPoq!g=zUlG_9O0m3LKt#S%oHJ6Bvx^nd@{1ITQj1fI%2HDlpbk?gsVqn> fR>;g#@CUlk*+&87LWSh~lvD)`XI;ktPfa}lxxYl1 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/opencl+c/constant_feature.test b/docs/_style/prism-master/tests/languages/opencl+c/constant_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0d03ec46cf5625af257faa8c5765899641c5af99 GIT binary patch literal 33514 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 Bi>Ckp literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/opencl/constant_feature.test b/docs/_style/prism-master/tests/languages/opencl/constant_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7f41b9216840a33c9bf6b3d46c51ab56ccc6d630 GIT binary patch literal 5031 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/opencl/keyword_feature.test b/docs/_style/prism-master/tests/languages/opencl/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..47613f7b00a202f0512a39d9982b2324bc22bcf4 GIT binary patch literal 7452 zcmbVR+iu%95Pe<(`3ED<-31~Gf!_PNzYgr(uWMJ=yK$J8W?0ZY^y5?0qx0;i!AqwfcM6=R?xk5gkjXb~ zJr4a_>c38%652*)*Td}T)C_I?97tfu|Rvd-5lR z&V94&$LW*?pQrIKHG!L()4BJPYc9*^p2o3P@$jfkp>nITR9U$vxc}^S&FtOo*i0%g zT>6E|t;$km<={qlY7V{@2bx8m;a0u(1DxOY&0z-gT&w>z=uzCcqD4r9l)&O~=>|lh z9r5?_)Jsnqyg7BQ5AV9~;Nk|Cw{DfXH?`}{*flF%v(7cCB(BJ+=%p7HS+&TjMONL$ zw+=xJ^mY;cqMXyx|&QHfeo@TL=c+cx^q4bAlCI&3@q!@MC2 z5nB&M~XL_kZLLgiLvsj_lIJ2eB&gTEsXHj71K1_S1_Tl{$3B(Y;$-Joo_3 z$8m}h@6x9tG~3XWp{d;5{VT7-VZU@cG}A>4y>`p)=$5y$Z~fj~^i)&{YuXl}*@mVJ zP30~Kq6!&@K88VJ6eI>ghA|<~7Y(jT86U!{4K(BlD$+n_=;W}Kb{rt*?l2(EmoU%J zh>1AU(87p5!-}?*dl~U$dRe*Zze|NiA?K7C>-8TKlr!t$h)E?LUN#Ynll)NEFlAEj>}ct+#X_`grSIYyHJ zgUxAy!Rz^NaCWf5SKCl~mtI&SLc(FNaVHX1k`e+-nqt5Yj|Nc~_}0Kn1Fsk^DG|XX zNn$WkB?G4JYieaEF!yCVb6;@g{)ZHez3Hc%%I^)?3a<*`muN`-w8iey2#TIfP8g_V&8s&UM9`tL=7EY(B8V`>&KAB_jNhFI;;#hnV$Kn&X6<_#I71eA{=z5A; zrXQv`zG>B*v1cQ_;5R0aAHSbIxivE!~|zE6P!&=a5lGGa3M~G5)30ylwoivVlyTc zZU`sk8v~{h(Q=QWz#<~!SwsY95s76Z@`knB{jIb_6+^L!Qn&IGr?ntOs9d6AoD{7r zoJKX2dn^?e*H93$G+1OqfsAQr$&3;IxGbBI21IQUsB?v zcqn=@N>{Z>@JX6`Cl*glb9A0+jZIWauEbO-!V*f$vJB6K+WYT!4u5~YTKo0rchB<% g+2f|^`%Ns{&YN!7{B!oh*S`VD|8;J5W9$F=4;c#R_y7O^ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/oz/atom_feature.test b/docs/_style/prism-master/tests/languages/oz/atom_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b249537e00cb950195de93b0267d90a63c87755a GIT binary patch literal 239 zcmY#a=jBpQ%a2jdPf9F;u=9DjAZ%VPT`~YK7cW;dFBfODQesJdu9A*|lDfK5tPZLO p&_<}0Sfuh}iemCWPEd;F(nw(v%kd|Mh0CG&R9sp0BGhhG! literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/oz/attr-name_feature.test b/docs/_style/prism-master/tests/languages/oz/attr-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..46dc2221e2e32f2384773a85aff71ec184b0226e GIT binary patch literal 397 zcmbVIF%E+;44fM&e~7XG5>(7t`-N_ZAyA{DHVz7o#Pb^$!BC+NSe|^o^PL@F>>`oJ zoM0i7-C?FoMSMVbj|iqNq>!RIQOs+kxHNi**wg4ymrA?+pl(am=!vmtH#kqzFUJyv z3atYsv9-f>vra8}$9t>$Ly0}nKOKy&gTPAlCi3I2(5)1y&%fmMg#I zP*PQj)xi*hT8~8vp4XmP?KvA$MXsW9rs*%lxI2fxbwMwzPTtGy=SDZ6ale3Ez((;QGV0IQO UB<7_k6cptrr>2w^r55V}0C+i4LjV8( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/oz/keyword_feature.test b/docs/_style/prism-master/tests/languages/oz/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2fdc28accb1a4e4536743381f1320c3dde44677b GIT binary patch literal 1528 zcmbW1L2iRE5JlIuID&9X_+CoI zD@GR+$K7@ed@EeIldx;XzTqM2=%J$Qt WIpggmyl*7qO9{i<>R literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/oz/number_feature.test b/docs/_style/prism-master/tests/languages/oz/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d7b2ff97fad91a19f31409c1cb0fe5d976e476c1 GIT binary patch literal 512 zcmXru5>6J`l5NcIHQ&FN^_G^iSAK@u!;f$S1Fd43y8=M VVdsq0DYt#x{jLM$vx$B=Q{ZgJ|w^E@Q($HHK@{~R>t07hGT4% zm7&p2vY26*jAmr>ttwf!n2jpgs3Iq5ISzx7FVGY_UEVdOcH^pr3yoG9wKGs|ORZaL v)M<3H-1b_xv2?$KY%R%XTUdtO!aw8hcT5tG-+`B7dHtC2Rww*jg!%anSY-Nx literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/oz/string_feature.test b/docs/_style/prism-master/tests/languages/oz/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a7550e8dc39bcb403fedaa3b83736738e54b0452 GIT binary patch literal 254 zcmY#V;^k6u%a2jYPf9F;u=9DjAZ%VPT`~YK7cW;dFBfODQgKO9W?s6Ij)GDQ5Guv$ sV2A=Oj)7Q>OFloQC?*f+9FROO7Z8!}DCdmSQ4a&bm0CFkenrskC> z=_n}a1MO3a)xi`7Sr$_ilLv7E79}x2fI}GSP^DO2E+8V`wayu-$=Ss~(~1;M1& literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/parigp/function_feature.test b/docs/_style/prism-master/tests/languages/parigp/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e2ad9e4d013d2db4ad35e7a4bbb10ac3b3450174 GIT binary patch literal 350 zcmbu4K?=e!6hzksa)%+S6l(7v9wT%SV`74mU-DCWeN&{kux@nz?tNyM2}HV+B7oXm zU{RpafE33cwEBz`2cyEAT}_l#4;6^i*u$u4g|pqb-lbimpAqkVyQZ&EQjGtMIY;mA ij6en3A|7yhFu}cEHQI_Lrs{dJ&NFQBNViPIUxz0oYFYaL literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/parigp/keyword_feature.test b/docs/_style/prism-master/tests/languages/parigp/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e210791d2ceb8573b141a11e56dee5abd133f864 GIT binary patch literal 1789 zcmbVMTW;Gh5d5wH-C>~bBzGu!j36-dSlfhUQJ|>UzJ2x)sWrO%iD8@4jJV>EJJTg< zFLl+)Fvl?Ex*EFEVTiZMt|%qDSZ5pWb#;u4@n0XWb6i3uy&J-(jx>%s&TZmq{Mekr z)gDBNx#l>~k9CB-e0>!Ed%sLl{ zyMy!I`{;fkKFtT@6MSGkAqQAsq(6O14!FR4cd*ZL12{xDx}d+6>H_Ea>%#%XCk|}J zaR_yigR8X^|G!t%Yt9_)E;FCQ4!avYlB0&io<663btyHl!>FS@{9lU~_+m>*2o&a& zo62IMFsV+45QW!R@*SSMg^Xh3h;&(1IR#=7(kY3cq>5AZ`W-8%RM;yl|IPQtw*02l z$~&zr9JcVNBqSM-i6o#%wq(7nUStD;^{^FU(A1GMki}8S#ZFd9D8VQo0lAvjRxT&G zycW8KJfoFX#S<-_+iSJjo9p-Iktef(Da~Q?fV@lD-{(@vQ-&b}sY(;YoD|;7$_RJ! zGGbF_U^F+yi`f}|H$N3`#mET%i(?L2Nq@dVZ#{SCfRAy)Ql>z7y@V0nBFud|$QS6PBp8vTYMeSg5g^Z@!RmC({OW;o$2; zdOt)NuVwa7xL)OF2 z4@&NkWHy+_UDkI=mG6*bHkjtR3+-C$7f9Ent(gs`ac!D0T$$-u((|JESy0LApjG6DfpbP` ca(1yoT7HoN)NjQKnR&&TDX9vGfGO4k0Q5XudjJ3c literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/parser/escape_feature.test b/docs/_style/prism-master/tests/languages/parser/escape_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..69bef5560824b4d3ca7ee43642d054cde90ff98d GIT binary patch literal 968 zcmbV~-D<)>5QVQJ_zue$P(h1$8Gld&Un0rEHYQf8i6k3)A-;RhtW8lfSB9K~{bqLd z=ZyBd9j&1mw1NiE5DK9fxUz727z3q1J*E?g=Ajpd!4E(GpK26Di z`R;I0$R zU^jt9B*4DF0)h1;Hl0Y+WD;F(9hELp(Z9J-8RgWvZFWGhy)c(Enk-k$nmue{*I?Vj z0HbrAC$={BP@t%y`F&rWM`#)}o#(~QS!5b(%W-Z_?0877pXfPwF~{0Pd0xBrqN&|l zwYhdIixarR@%)Dd`)ej7aP#u%g$20G)0STjw{+ncIe6di{>@jKd{-(fN_F31_3;av C^yOCo literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/parser/expression_feature.test b/docs/_style/prism-master/tests/languages/parser/expression_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e9a229fe5e7850b70b19f5f3fbacecbb2d4293d4 GIT binary patch literal 1123 zcmbVLL2iRE5IhGdf3Wrh3G@J5A|<)>8I(#cm?jFr2pih|zH0|;3bav!av(e7@$T&4 zx>4Zng3$9evA1?!Sw~AZ-iG+TcJ}$XBUwp>I6%R9U{N?KJb2(y=aRLvN`QUV4HM$b zEAWXbVXbbfOtw_sir_-(-vO%j`oVg1v-y#GhqNRw5>+fxw-aX(4GbC1qMh59CX@HV9{GG zJx}ezg+p!?WL;Bx#Q~<~V##s_XBR{{62%oeyk(@-NWF0F7;RVTAEl*G1Hsuv` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/parser/function_feature.test b/docs/_style/prism-master/tests/languages/parser/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9cf470bc7efb4dc460b081eba600d5b55754e613 GIT binary patch literal 1383 zcmcIk!ES>v3_XLyKOmo4Y48E4t&pZ|AF$mRR2hV|Y9Unu?WU^#K05?;1-1iYJ(=hD z*?D!`5Gq%OCE&?f>d%=aXO!57z9BnPWlT^t>2jR3traei(@$p?dfqdJ=j%dXo0<8qiB?89F)!fu6Lnzyxi`K)>`sXHC!q6(L^^ z_3`y}$gsnG&Xn)D>4GR(5dFtL4w5Tn9EcEN9nEI?G$n4#I`X0V{Byunw9xiuq>8=M zRhwD9ee^3AW-<$KH-QQ?3ysREN_r(Ln%B{5OA0llI(cOKT4xFCb1z%&o*u7oP5r0{ zlZs2Pqh!0qgGsZ@1EWyGo6B`*S4Kd`#$)6EknT4;-6=O0(rvG$Tvldo!K;nPl>Y@; C@P+gM literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/parser/keyword_feature.test b/docs/_style/prism-master/tests/languages/parser/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ae1e9def9c3b7112a59d818406d2d4962fe81f31 GIT binary patch literal 1338 zcmbVMO>crg5Isx6e;}J4AZibu)zn(rG%>Xada~NAxKyHo*#&Ji{`bx-AYa?2DTiJ5 z&CJ`GHvypY4{d$5S3AGvFIiPk(k>YA?I-47faw&7^tIIut2lVp8= zupbB05uV1cljrdZS{-{*z^53gYo@%&>@+);h3D?dKN#+o3eh8Qt$E{xp>L-l4UsUjrN zSY-gwe}FT!RpzuUDpR3PDl;@r!ZLIAx#vs>KMX)llo#~f$AKHgG)h2XCL|T%bAf-0 z2;$w6aqLtFSd1A7_l(mBngCEUfyzG06s&6smE6Dp0dpJxSx!Vh@;VBKdXC+cvO!>A z3EnDMuzngvydBUTLnqc1!{+kq WHE{d?pJcdZ?nW5!J228dh}&-x(qDxD literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/parser/number_feature.test b/docs/_style/prism-master/tests/languages/parser/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7bb3cccf71ceecf5323b9005baf95d1fd0576c51 GIT binary patch literal 924 zcmdNeG1BDa(lFLDG%+-_1T#}jL6m`>g{!V1RMIk48_Y7ONJ>meOH57$tB7!Nba8WZ zb_H^Hxpc_@AbruiT%6HLsTBo9sl~;a`FTn@3Lqh%SV3uCa!F}o2}DpyLn&4VB9T{` zo0M7vRH$TP1Q$e8t*I0XR2&P|LbmbHP@%0IsirhF9~zG|wZm8slt5@|1w7@^))rWj pCS(gQ7chB|pXi-4Qj@cb71HvH6d;MYSRpg7I5QXq1^OyqF*_`xwIqoW+r`q7;`skbU-1ig#sWTjI3fOX;uo z=f~Z(_LzKl_fy-N%+%nj!CTbeGE~F39!5oeWKz}}l{Fyeqq2;nR5bXi#ytm?9S2uY zN!M95I=)i%Pt#@|C^%@~K+WBl&^XJeWaDn}dCOvQTP@Tq2|Ey_O?C{P3iXt5)RGz` z5kwSu!goqH1&y@P@Ca9!ZMkRsY|FMDZR_TdviE(?gh(<@=R`skwmAEtpt_}Ue=?v@}bn2RNs=X7q)I+`i6eX__ zakRb!k2;Sq1Q0NtC&A51`o5|LmanF)rHnZQ&;^aIt6Ar0!nE^h;&YzIOLE0_DzYq{Qn1Jkan z&IWwHMR^i!QYPC6Dw`LoZu#H)h=23|e;p6(0DMsN8h<5dz5ATn;WZFNdm&O7iilp4 z2?wVpO7fS|Yq1gyE7~;Gv}tEAw=Xf*-DOd2k5dngqJ5M_YN{;oHM=9i&x(j`Ri6>g c|K#!T%${BZiL;!X3Pg~Ei)70Peh3kFpW;2f6#xJL literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/parser/parser-comment_feature.test b/docs/_style/prism-master/tests/languages/parser/parser-comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..94e772cc7311331380a8bee10d545a7cfa72ebde GIT binary patch literal 343 zcmbVHF%E+;44fM&e>jB|_(UaM&^s|CN?KI{bSX`i zwbH7&5QnbU>Sn}d;31k?ir#FNGjTJgb){HL4O5x%Z|l6lj9LkQWVgK zaDsCiGm_$sv}T27g(fbeNx?{p{fftXwG_J=>|=-)(FG5cVv4w7^j#X;G?P$3Q_TZR z(fKP0!O+k2hrWb{R$6bG*;13uZC-hOy+;b_!upOLZ??Om T>O)j>_fR>H?qb!_TRc1gdsx>7 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/parser/variable_feature.test b/docs/_style/prism-master/tests/languages/parser/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e2544fdb7ffaf1ba24e2305624c2a428300aca96 GIT binary patch literal 1294 zcmbVMO^<>w5Isx6e;^G9O_ao|Q7?P)=DkZc#l@8@f}w?M{PjE2DcPkTn#h5a&b&9T zZ>FT@wvD3{-n!-#GyLQ2GLcbs7tm?IFaW0G8}=VTi={iFI3ew0Aifw z@CNCc!3yRO^pl}K3`+S4Js2N-W@_J&Nn@<~Bo3|e6bgv*rBb2w<1)`Yu(Sor2gHH` za%Rv|? x=W_2xZs&~e>@PHJJhs;;a0wAMk!V@BH#Wo(q`m$JdApRSZ<(CiE*Zti>=#niTI~P; literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pascal/comment_feature.test b/docs/_style/prism-master/tests/languages/pascal/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2994975152747443a0295bebac26160bc21b8f4b GIT binary patch literal 377 zcmdPUQb^0sSJ2Yr<HK1O3u&CP0cG&(os-?H~?t3QmhVkxtOAuJc#qKD1o{cmkdmAEfxj(`d9^_o>YqE YG_6Ph>fK^J0Mfr%wEzGB literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pascal/keyword_feature.test b/docs/_style/prism-master/tests/languages/pascal/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a31f48560665cbf0601666dc919a58ae99d85dd4 GIT binary patch literal 4306 zcmbVPOO7Kq3|*&yx`W{LBtSN~K#nn(g-XS;m6oM~q-wWw`aG&W{*aT!G^VF*ijNXM zBA@I~QdlY(o3p(eTdsXK(Ah`hY$4-PEVb|2pS-x5a^HhU?5G2LQKhC-pfqd1z$ z2Qm|DPD^yvr)bWproQu&@z*)fm14ClhbUes`%0tnG581zK32+;b!37aDD++Q!KC3I za@C}%@6t@!;v8nS?t{j@n{#qBE}0BIowJ1lnOw@F$pm9Ljf;cbOf%VP3I!M`gikg5 zcsBJyI0qc4_nFKRJ=|Sl#imQ4Vm>YWxLw$#o3EF?ga5wF39+FsU(IBj-;r(xLBT!< zRSF?iRU3i0;u|y)zV->zXc(0FLTg?vd3s5Qqn|jYuFM zI3#}m{0kpbzFFk&Oc4mzcNYr4K8gqN^Kqmv6b;~cnc;>{?n3UPn2;RXyHY9kOa=$R zf5d5wX+LXBnd*{}_?SvXAx)?oc$UIA%?@}NNT`f_Yhg{FltZ$k;Sbr5WKedtK+nv< zR-6|_H)sC|@3{&qinW#IG6Y0n=0D}a5>5x|^6U!^&R>rTg|r}ys7*T|j3Jm}vD>B! zk4u{Bgj1k$XL7AbaAKUkVvAD8_0$Dd1Gk9_fRnp$m7ODRjndvPAAd#eY(AsFeXa`! z?8f(yYvlJ|_+i}lzWeR_>4WY!T)xvcbJ~mT^y8a(UEp3LrR56QyOGw6gf2HHDdc9Q zn0V@5%Ic$?X^Tnhvi3V6=KiM`KtmL&+#sbeWd*)>P@&EpRnhm8&^)rH{vCtC#dZBoB2{_L(1>T06RK~CqLi7m5K%0g_m#1S>e$U)CE(L(c zrx3Pr+RVJR63kbj%k#FWzVFxuuuy*)$jTP$gch)EVk>~>5&pB~z-{jRe6K@ZRbVcJ zh1V=^EIeFAXIGwxUKMbv1agzPj?Lu|ZJfEtff02{Fs`b;#X z5X4ilaWGK{*qEsbdQeqm`N3Va#huJ*Ya6@8(pwAJ*sg+E*{?wCY*<6A^jJc6x~yRu zf0mG)Pb&~6*aEP#XjT7U;0lZxxdPfLx3?Vz^&%{E&Y)+12H`MZL?RyvXrlk#@evO0M%PQ9rpfzED}=LT z&6gX3l58~s%gBa2@~b^52llZkON1lG2nTi*xrcxdZm97tLD(gteK(oyMLj%8|SemI?G2ApsM+*ff=bl$IR7W9ly2nN^Iy^5cJN1TO?Q zhkYc|q2m?Nqvyq-frmrOn+PA_B3h;goWU2bM!juVzdW=Y$=lKIFZ zQobV>GIhS9&IOP4gN%RTS$jt^FGrhiQyK2L*d1&L_O!!a=A2~v$V{|58SFH+mj4~n zD@bGNxs5D)iIi)!oD#Qal<~a6oWfdlzJna*EYVL@jKglo>`*0Rdl-uT=9A1XNsDjF uDe?74@praTMp;t{Sumx~Cd(+REg`#ZPh@yKFZ}B~UEV9+a>1|lHGBhkv;Oh` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pascal/string_feature.test b/docs/_style/prism-master/tests/languages/pascal/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c33a448a946ed05811d87f65207b6142cf7b3611 GIT binary patch literal 328 zcmY#a=jBpQ%U4&=2QuQ^dAXF$fmkKY1T37du578Elvo6mAAfGH8@jwz;WjztXUWK2<@&){BAisj`3BJ%y=oRONGU96Cn VU!(x>OtC^@UW!6;Mq*L19srzZNJ9Vs literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/perl/comment_feature.test b/docs/_style/prism-master/tests/languages/perl/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..503d161564f6f736409841e5cc513cf32d91eb11 GIT binary patch literal 268 zcmcD`NlZ%3QAo?r=jBRDEaK&|O)f3r} E01fLuc>n+a literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/perl/filehandle_feature.test b/docs/_style/prism-master/tests/languages/perl/filehandle_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d244e668333fb2e3be714405a093fb2f774b3e7f GIT binary patch literal 277 zcma#&<+8B@;@}V$Pd^aD&EMb2F$l=w<Q4a&bm0rDf)%W+djNTs{nCsu^s>@FFq~+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/perl/function_feature.test b/docs/_style/prism-master/tests/languages/perl/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..552d2f3309f635775ed61636128cc1001d603e29 GIT binary patch literal 264 zcmXReO;Sk9&*$YT1~T08^W&Woi%g7oxp=vB$p9dI(Y#!o(MoBhdC4W2`FTn@3enL@ z*{PM~`9&!}juOxwrC1;hvQ;TIR)NKMWz2HIbw0CQ!r9sqc3 BKWqR1 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/perl/keyword_feature.test b/docs/_style/prism-master/tests/languages/perl/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..82bab2bc153be1d0e3bd6f62d15a168dd1cf6986 GIT binary patch literal 1095 zcmbW0O>)98429SAjPIbyn)VVs2E)Q63V32{>K{UGU&&1ut+av(p5f)`;gLSMxWPH2 zTVPDF`q}+>Bq%XVQw>pj1bHS=yO?uD()oi*z441D0YCADKF z{EVFVE?}BqaGShT@p4slYyO)Ly}M; zhl?#uVhcwJPC0;-a|bXIYlO8L?>JHt3D5=(=1d6)QYK}DQ{m*?m8YYE^$wu1s?j{d*XiC$;XBY@x|AcOeN#y$d;*RAc|%(f+4Fg7RLix2f=b$b8+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/perl/operator_feature.test b/docs/_style/prism-master/tests/languages/perl/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d9b02044f40bd49cefe47d31d37dec30afa3d5c9 GIT binary patch literal 2505 zcmbW3(M#h%5XPS`kpJOJv3+Qr6n)M{w9g`_pkS|%wrTEYY--w`MN0nmn~lmH&L?+R zhDr98flMJY$QH8Gb^%#J zZXp+tOKqP+Mqv;J0}Rxh5{R0Eq+!rUU(Ko4KTa^jX?tm}M;V6B1Ap^+=it;DI1O#k zsA<>%2Q{Z&8$I;YoO*2}NE{ON{^Da&qz~?!ChB9v4zc<;4udhy ze9y}*iY>|_wTavLVU^VROPt!q&=cl^dd*5;h}j zOW01Ctx^!>lCWFCE(p6+W~-bN<)~E}?Z8S0j5%7!28$5pgFn8FDNES5!aidpq3#9m z8CScS>=jE>q$<8m9K4b>S1rSdQO`z>E{58Cuj6tr`XR&>%Q>aAU=5XBcCldSm=ky J`(Cn%e*@D{nyvr< literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/perl/regex_feature.test b/docs/_style/prism-master/tests/languages/perl/regex_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2fb50e4917b8087d7de4bb978fa468e181abfbab GIT binary patch literal 1982 zcmbVM(Qe`}5PZH!`Gz!$fB27Nr>aFX{YH!`D9ZvT&X}1WZ2?ASd(}W-yE!xcDU~jCmv_-U^f&IO|60*(J zflhLw%#8wv`lRp-RF^F@sYIzuO_vXCLz*s;rmY4Q#ke7QUU`Jmgc?}j ztau;LQd*e;nFT-m?gxKFTBXUaYVDf$=Dyx$>$WJ?_4YL;1NxlM2*CquoVnt2FtU99 zodXjb=gG5%iH?qCz=fDbe1VxJej$_J9tsc%L*AtqUeC4{|HW7c`Z@?Z8eAA7^Xk3hi(q!#(1)au<*EwYA)LY%_DC4yCuS41eb z4ymJfytr{}A4{dkO(GI8m#4dsy+kN>8!0vM#D!7;`T9g`KoLXmBLgoAhQy8(q1d3L zPR%nI>MYHecvj3IQ-(_HVPs+vh&@dTv8#o(56IUGElk|(dJ!+1pt#@~*2?bs11H>( n75@3#9L_`b*13%RFtgXAtUf-wTeG{I&P~?!jkCAT4Zr^ZSoA!B literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/perl/string_feature.test b/docs/_style/prism-master/tests/languages/perl/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fbad18eb4eb679c50852b29d7c4836a8ed64fd81 GIT binary patch literal 1923 zcmbVM%WA_g5Ioo5e{ghh3T=JqF~o;{hBw4+n?5MSv6GTO=)ZTgBa0$Smj*0$JTp5< z(C$!Gc{WsUegE8zQz_LSkY@yt4U2`IRQp;MPF~8&yWlONA^Q>+0*f%ZSxLWn7^X&c~AM0!K?4~it)A+f6H+O{@s>*EcW-s}hQk3wP zC5$r49$%T}uruyq#5OD#nB;^PHDz^?w1<(n$`PNx+9^(W*CVvveHY2rv&g!R`D*^k zBqtn~l+{Jj9!6rIBEF)tkzyw-#!eF#mX5#n7K`KZHX?fG|#q<5BiqnysK_It~(_IOWV#Zx(>My6C}R`ta+v@`X5{J l-mb}~kKN1Hv3Tppg1hoqboQk8TRlvIG$DaGnwii7+C zmcW!k_8AT(abegc91O8qW@3b0xrz!_T=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040OJlQ{Qv*} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/php!+php-extras/global_feature.test b/docs/_style/prism-master/tests/languages/php!+php-extras/global_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b7222da96040163ddb075308b0b1e90bb5f5efd2 GIT binary patch literal 681 zcmbVJOA5j;6kHp~9ZKj@y+hTf7K_oQ>OxAW8e8zwkf`T3X}b`8D??yjW+s8mgtLT? zqC`*Qa{Zg^RVKg!D*a8<49q>ftC{>M9i1o2FtC7G3SdI+@vcll`*xs+0q^7 zS+M|lPHTESv?+F8fA5Tw@Oy3I4R@k!j#7rUX)NW_+$BddrEqHR$l8vab^90 zh21Y%-v3s*Ut@|(0i%5?7~iCX30-QK)TM|?E>(Ag*+D@zAzGLODU^$SJwv+U0CI%@JvAq;-jo%& zf+tr>&}istD{$m~ETqPiQ1BHQcBf<8@RJ1p-@$=}?QZPmXw`R-Z2ysPhUNC3_I$Hu M$-;#s>V5O+4UNs3o&W#< literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/php!+php-extras/this_feature.test b/docs/_style/prism-master/tests/languages/php!+php-extras/this_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8ac7b61f4e3b2eaeab8a77bde9cbf6d82aff74e2 GIT binary patch literal 166 zcmY!>$;d3`<>KYiB?Ex;Me}lTMk|3#QPNRRQUNn!dAWdyd^4RhQj@cb71HvH6u<`R F0RSi6AkF{) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/php/comment_feature.test b/docs/_style/prism-master/tests/languages/php/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0db0474557f078c4af22a9ee370df4cf3fccd41c GIT binary patch literal 377 zcmbV{O%B2!5QW!HGIt;>N!z)AF(w|P?E>qlM4%1S#N!K=ovcb`!F==g9uWeOxX<%d zhxAn{1C;?nLZakH$7lX%w^;6`*`0nIq22Ki5PF0|FViB&ewB@oL~?BYVG&lVC8brI uM}{!?O?bUlb@{KIla;^hhm@(lLn<#O})cXAAhH!bC^<$c m#p+;)g6+g60e6K`EH4)jk?$1ejMU`pVuiH)A_bUxiuC}a;WWbl literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/php/delimiter_feature.test b/docs/_style/prism-master/tests/languages/php/delimiter_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..15bd9a81dedf75fbd22d3036aa175888462542b6 GIT binary patch literal 367 zcmcDqSFpF^<+8Ca$S8oaY{4`ymo6EAmy4GxnwN_+S_x>Ll8yq14dkSx=49q(mZTN| zg_LaUm11?Uh}+vK#R7$6!IJn502xlH8MXvW;N=3khWt=)&PYwpE>=j(FH(T}zE}?c DVqa05 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/php/keyword_feature.test b/docs/_style/prism-master/tests/languages/php/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9505114c77bb69a2c9f2a664296bc6bc8529fd74 GIT binary patch literal 2243 zcmbVOTW;ep4E$aLz5|i(?p~muJw{P16p3zxD3Vu_>*n@LN{;go3%CuMxS=>hi6Vzl z-av@(NpBUSI`^GQu#c#YpjE=Y)5GL-w!zcCPNnor&)`!A`pni(pHBNhHHQ7$1!xQ?fx#*k5GG%!+jJYn-8h8g_i9H2gg;_EXIv(1F` z>V#>m)Pwc3`?E!7;5}sWwUl&4M+*bFmSsn`mE)N%s${J1e*fUrcYXKTcfVeDM?B9V zn%xuZlsCJ#C%ChP*qEql8e6F%vNn{daV=%mSh?&3{91?78W(0I8o630y5ZpYAkUIF zmv8mHIr62P1;A3b4P>cz31RsN_xUrSF>z}M=-M%@_u4@crnHoVSsF&h*g=BS-jETc zAEc$)rIl{OEzq`_(ATZrr|#10LfED08>(9|5MWguS`??_v2sa1s^f-JRgn=$s_HZW zzsxkr(l>$@(Q3$V#Z1@|sapfN-0pq;FX|_dta4bXHl(PErbM->=ytBEwF22HzLo2y z(W@8>kfP3wJF9hLWc3ypNcuf1%VPx?Aq+xQBS6LeRTC>Eea4HD}J2F)69(eARZQ zy#}AjN-;|i`zAfmS4y!o_nnu^y=MuW2`vzMVu1-yoZbI}O^f_;oD*7bymll6ofo%Z T-(~)HxY)`iQHLmo&8Gbm`*5s? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/php/property_feature.test b/docs/_style/prism-master/tests/languages/php/property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f7790197a5016b0876e04d4d2583a9643bbb950e GIT binary patch literal 427 zcmY!>ODxJvOv*{swJRvfFGwvaspRESNz2dIwM$AY0ufcbT)bSmWB`!9XkISPXeF2( zN;(QkDsWD$4pQ4a&bm06=$U8bC@Cw&>fn%p jTB;Pw%LPQ_+w7c?nw(t>G_6PhVtr0#cB%r@4aIr@zdbV# literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/php/string-interpolation_feature.test b/docs/_style/prism-master/tests/languages/php/string-interpolation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b0d57f894c62f0c4bbb842b0bcee575d8fffffd1 GIT binary patch literal 4371 zcmdT|TZ`I26nJekkY&Hhs>D<%5(4V z7f#{OFE_Yj7~$ZnRDz|>_K;9U87`zwpp@5p60bc!8^RVdgoAp%ck35hQYQ+YMF#8B zM6*b0mQEb_=CgQ=UJ9m!PE^ERf>k1zT(C!>zkyhP@E(p$H>1oPN(oFHIsGMO+8u8; z8`0);enyH0yJNK2sBT6n4F7o7zS%MwjXpm-bUR;!5_36Yu~uR92*?Jj7$oCly_O2B zaZ)E=a>o`#{Xv#>J8;B(w*zN!`1SMShwotV70T>G#faf%5bbu{6Fw;C!A%~Y%LG{9 z{!Sz~-_14ULxzi2e8LS`_z*`PxAezN9xrJGBfjAj_kG`p@H)FD9PP_j58i$3wcr~L z6!rKziDo(pG!PK=@$%Uyd7cV|6F1~Gf2%I+Inq?*{+>JKTBtxvbE{idR7x`zOzIyEj}Q8=kz(P2jAl1r_WGf8QWGiy{y^Sdp)Y_?O*&bG{HrQA-v zFw7v%2<3_uOF>AdB$Eo>$B>SQ$mS*?lY+nmL;t10Gq|UT!kETXm|)eiUP9ud* zYnweS&5QSeIpsLrt7+hHM|Fu5O!?aQlqi7rC9Z&9`ARvDLBPg>L*{iy+=)9X^m;pI yUa&!c2q`0?8EBiQE&+z^fNlqnIsJwEX(?t;F=6C=&ah~aZc~GVu;I<; z8{QDd@lBFEU0vS$-mPdwsS9SHmFm^^2E)ep;yC8`#(i&LbR+O6v;v`^cd`z_UGjLH zYy;nWsH91vQ+ zEfv4HyJ$d%kh#_DF~CkT2fR%@<;XrGcfq1ZEoPM2_TDs}fS~B6s%yaZVydlG bisj`3BJ#cNoRONGU96CnU!(xDu~-iPU_4qu literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/plsql/comment_feature.test b/docs/_style/prism-master/tests/languages/plsql/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ec8d4bce63551495c966f9f7bb21e52a44336f83 GIT binary patch literal 279 zcmdPb($eSU($`W*%g^WKN=htJ0P%HoK^P(iVv!Dbxp=vvdAT^Fm6G#wb5rw5lynr7 z^nsQs#p+-RgKUZ^iphi6k41^DE>=O1KBZV*E+8V`na&xh$=Ss~qly%uZY|aW0CGA! Ang9R* literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/plsql/keyword_feature.test b/docs/_style/prism-master/tests/languages/plsql/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e000f7273bbb25de22e1ca71f1360450b8e4c897 GIT binary patch literal 7282 zcmbVQU5ni|5Phz}|6$qZw9t@0Alth4Dl1ElB;WlAVJU4&A%Q^hQ2OtCW+dO6(&K%| zvRsYlXe?sX=~#Zc^nXp_nETD&aIlPN2v zFqv?ylZ0Yh<75vmU;&fGsIv<$7dPT@O{TaQ`p$Ygt3&O)6fE98jCN_zCSsCMW9IIR zS78D+1>^e;uhu3exCf8wi9_`pcF98BcPDEW{JLqf7|!9hxPz1Bx_P#f(=BuXubqTehH^PBI!JY%GlN$c^F5eR#k28F+|ze&&Dr#w zH|dB6Z%rND+i;W(^KM8c!5`k;+1IssQyaL?yBQ;62|h|t_!zOoS=Kq52k}oRm?~tv z4y~OB*>bpl6}8Xa3>Nd9S6>{WrtgB8F^gc(J78nP&A}p=Lo_vhL%aru$P1K|OzJgdD7a8wxK(vYwE-e-n7xQiv?Sk;ptw(f?vX5vn zZR}Z0M-$vr3*eZ%31XQ1S$7Pl*CzNmo-LrINy*g>Ud(uhE2QrhBT;Mpvkf&)L@~=T zshEl|UQEX6M?027vSR3D`tmFD#_E=2jx*-9Bqz&8bJhq;2AkV=3FlH9I4apOCYY$V z@MDt=5}1g1{V@{fcn59)#D=zUO|?f^Q&1Nsivpv?Mo~_4bWh*O|qmV6JuJg#Jm@sU1Pol=}vpk`n442>eF-}#eI{{6NTnM=k5TUxJJNFf`nt_d{_d8a(itktP{VKj+x7TI@w_wx_@iQW6Y`|17dr;q>q z{pIT)x36w)je7d_!>j)R@;RpZ_I+lUEQ0IfJ=4^ zc*pd}B&fQas2ZWc^hiF4x@98_+0v68tmP~FDD}=IqhWS6#o>tLJPfHx&_0qG)Y7CK zNb)8M)m&f?s+ko>CDmex=^Dc{f1?1tR9iyF@b)byP)qq3A~_(_ zZ<*jr7<2z6ZKQ@+0WM7fX=2IrnrU)irfPn!T5?J(BwJ-_OZub$% zS$EL=F9M3Pt=!|b*ZPm+wIJjeD#RVY9(I9RL+-#*_Hd}y795kBfg!aHWr!B09AJ@C zOIOyv)v^rI;+6waV^QQ<{!&=#VGf{tpomt?%%qjjJ5a5u3D}Bkiu|YQ-sz#W_e&VN znrflWtZL=X5ESt{YOU=Vro}!5Q2leg&;bNdet_yh7*IVsNR?7x-RbeVkPg&>B~eI4 zDlI`Rgs0$u5*HL|Oa{f2+F;1ep|9izH`qDxl^!7`;7h2Mef`0xu)dXIp@?U<-A2Mt zi^|F{NN5_S2V=9Ney07E*fy-Fz0}AcZlmlFgBo4LA@D~O5JHIp!Z1-l$VU!< zgQ5UPDW<=&R2;p~Rvf=e+&UcliHtvUB|F&f0{{R3 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/plsql/operator_feature.test b/docs/_style/prism-master/tests/languages/plsql/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1422bca469c3be8c354e1e912c327aebd811a134 GIT binary patch literal 172 zcmcDr<>lh#(j^0c^hNV>aYifU7o-*?mgE;H=_n{!*($~Iasd(fhB{}YCTABbq~#YW NBDJo4>PziyML7}d^TqQ4a&bm0CFSSmq$cJm z=_n|vfb3L?)xi)4xdN*=&|MI53@u={V$%b5Jyr>jf0SZDE&~!|_(>O}H6*pTBr`8v J!3pB6VgOyQOpX8m literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/powershell/comment_feature.test b/docs/_style/prism-master/tests/languages/powershell/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5f6becc78d9f8caef93b9cf4fee43f6736e49362 GIT binary patch literal 439 zcmbV}!3x7542I7QIu?r9V~ z25XfI2%?1a(cwj>Nse0HjY7BxvTqYKLS?jzg=#T12yO@@>9+UVQr?;V&(1wUyvG-CRX)Uj HD!cSw*r#_& literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/powershell/function_feature.test b/docs/_style/prism-master/tests/languages/powershell/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e7b07af93db869517670111c1822386b79422466 GIT binary patch literal 14316 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/powershell/keyword_feature.test b/docs/_style/prism-master/tests/languages/powershell/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ce058862a4b129cb5b449f58092c7fa12737c9d3 GIT binary patch literal 1230 zcmbW1L63qk5QWc6!he`>cK?J5i8r(AdN3Xu9JH~tZYg2;_dBhanC$Z+A<%p;(+t!1 znDbd%ntN7PTBuN8Xkk>>(ZboFZO^n+LD7;MZDs9fIa<}~dab-_sWcs@$Eu;yp7N~x z)qyH)0(*H`Wz0yGleP1ulD#YMTB>?m2kk6L)yf*#cvE|Q3lujshD}qZ_@`%EGi?SP8{J;K8))m*O&%ldq+vt5PTMnmD^L52HcWfxuZ?j-p5@u+8&|A5 z41>n5PUjBAje~UfmaO@ z>F27Kq2`BDb8aWJ%to;8N!qAfCNA5*_)u|;no)t>R>W7sJL4k2oKXEDa8N? vDHw=LR3IJ!O>sgz1`KeC9H1$Lh)=OBj(H~c8^QdH$=q@$f2lJ~+3fxRcDG|| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/powershell/namespace_feature.test b/docs/_style/prism-master/tests/languages/powershell/namespace_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5b8f568b4de432e17118842b018d21f08f5fa32d GIT binary patch literal 547 zcmbV~F%N<;5QS$+_z$F$Mqn^bFo{tY69?Fu4z+1a6KETH4EXE4A`%A%Let@L?R&lV zrL^oF$R;hJRrMtR2o=xJowTL3d$JPj}B}HRd3~% zj)rGb*HVBo+NC$CWvfJbR}KaXwnJ4IBrBHJ(JfT@?uJsU4WKFdWD#rcs|fF+0)_X@O$XIn`J_!FXuuKNJ* CBc2cd literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/powershell/operator_feature.test b/docs/_style/prism-master/tests/languages/powershell/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cbcb25bae5e139dcf15bc7e50a3821b364e698a7 GIT binary patch literal 1325 zcmbW1F;BxV5QS$VfeK#Y6${#nv=iwd(pID_hDorK;2^oR-3~o!=G+gMrPM@};S+adLK9V%ypKZsLLTlF9F-d)S5=2mI)jOk$ zqr(Fqlb6NOCi52vdy+vu+He<@0~EzRkm2J7rDlFMs~;Oaz-*vU;G5AX9)_tuoM#R< zePM~Wizqc-2ABr=w;M?OGq&Cu#f3Q$ffNf`DTZcEd59)q+47EQ*_oaVT9c3`6axWn z6HQQf2ZgO`zg-V_LCbD2&?B2WX7dr+rTd0;j9o{Q5yBeQ3(6(Toec6W7X$Bh#*<5- zD8jLNKu~GtF>AuF#ZA!}VZov-S+^kk0kvSQ)<$4vW#(gH$tIi;PhOAMI$;4|<9<5N zNNWhEXT;%e%VQg>%dour|7d7ftDDA$t-AGm&#YhCUtU8T;qE;COZMXbB^;D0j=ll* C>b3O% literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/powershell/variable_feature.test b/docs/_style/prism-master/tests/languages/powershell/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a956ea7265c07d62c057049451d97094df6a70c2 GIT binary patch literal 333 zcmY#M%gR^+B+Nc!E%LPQ_TkD*Wnw(v%kd|Mh0JFPT4*)>cFHQge literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/processing/function_feature.test b/docs/_style/prism-master/tests/languages/processing/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..44b741d439e10f41d439fb7c9c1184d901a48e8f GIT binary patch literal 259 zcmYex&)4APO3TlWPf9F`H!)HG@_4y)$p9dI(Y#!o(MoBhdC4W2`FTn@3Q9nem11=i sqLm6jf~AQtaSfm-HpNh9;L^j(6-$ZxoHJ6Bvx^nd@{1H;jx5##0FcBzyZ`_I literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/processing/keyword_feature.test b/docs/_style/prism-master/tests/languages/processing/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..efc41fa34fd5b0edd10e0e29cb613267d61ef0c9 GIT binary patch literal 1018 zcmbV~!H$F=42I83!aEqwv-<*b+{Z9;K&_F;0D&^DZ@(>?J#2a~V^qTbw?*4;$Y58k zMvLRZO96U&Tgsi*7|?}E$^^5m9<>6`0q}zmCJvchu%4EfwQ@5(&*b3=0okNY%#;*h zqg|+;B2#uRi&P`k!Mjnb3|Mo}s-Q*QmzsczmCdy;!o?M>Fz;HuqMNkZ7UwBltIszs z&g-@M=*2$t)i7eE|A~PQxJ%JzZw2dYw%~C0 zCHWW!IoHl^Llf%I6b04IlK400%cmYR2(<{0%S9L>p~Oj*1e>+34Zzd1(B^F{=-#>gU0#;YKDGB=uk>Zp+idA(U0$Q=#uxQh+O1wE{eR2oRN!G z6_qv}9Gugtp*5`rOj;Qj!UcsgAW%j`N)Jz&kSK{ASiLuEb(-z^UbfqJ-RuaP?RCTs zNvx2^%9WR^#Kf}WW!D+IrE#%!#>9b(ljIrh8S#l7?mnl8V&GyB#mL1dik^#J6cZN{ XiCWPt z@ndeUX3A=9&v8D+MRQS@Hu(p70vZC!OOD49EG7F_jwaeL#s05T4ShH5f_0Op(_UUX C$4p)T literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/prolog/comment_feature.test b/docs/_style/prism-master/tests/languages/prolog/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..10668e7771a025f74feb358c983d29dba3402240 GIT binary patch literal 258 zcmY#YaLdn6N-W~#($~_`2azBFUM`@J0*KGcrAr0?>5Jy&;*3^G&d<$F%_~vTQBYEa vTBQ`LgDwTK8>=u#OH5Hr9>h6HvAkSBM82DxGg6bYixtxHixi*^E7k)5VURe4 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/prolog/function_feature.test b/docs/_style/prism-master/tests/languages/prolog/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a7633b0670f2260bbc66c66c49d7200e652ca93a GIT binary patch literal 330 zcmYex&reD$(%|Jv%g>Jovf@pQfSkmnVtqp(Rg##eZ^X;R%cV;O0O^b7<>HK1N-NDv zF3HT#Q_@jT0@?$#Mk!WDAzG;bBwm^blhOc+Vp9)w7x8+)&c|jL#6wE4yj(y;zOS4! SQj@cb71HvH6kuK})&l^(zftA@ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/prolog/number_feature.test b/docs/_style/prism-master/tests/languages/prolog/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4d275ed5f2b9ebde5283c6d35026d414b1564c6b GIT binary patch literal 220 zcmXpp;^i{dGc++YwdCb8;N{}w(j^0c^hNV>aYifUmF6a;7Aff{D47^3#pNXsu$fViPp4*+#4EA0RP literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/prolog/operator_feature.test b/docs/_style/prism-master/tests/languages/prolog/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8964b34d8370f8bed388b8288c34face5aa374a0 GIT binary patch literal 655 zcmbV~y9$Fq5Jl?@%s*TgE1$jb1^Emg5E4TqBpX(X6n=bGAw?W3m#q%x4ws$n2R!u^ zFFoR;4HHv>8W~fL6d_Xq4<%EKBYdV76C5TN(QIa=^_apPXU%`vXJt1^R-ega7~l literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/prolog/string_feature.test b/docs/_style/prism-master/tests/languages/prolog/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6714b86aeb992a27e54ea38eae1b4671cfd2835f GIT binary patch literal 451 zcmbVIK?(vf3_KgiAIe;ES^b31*mzKJRfH|H{vQ)kaACKXZF?9xlVmag6Q-=lw`&QE z1=xpc_@AbruiT%6HLWr;mwI)~c+KCK=rx$fL z=kN03sNg3_3Q+@k96vBkoM__aw+Il?pz?P?!ug!YZnC&J)mkU*S*t)+PI=;ut&>7z vw8r(d>Ce1Hg7qif&!$UW&g$^U8~#Qf`VObA9Y*N2fuVbhAk`6QigEt}u58M~ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/protobuf/keyword_feature.test b/docs/_style/prism-master/tests/languages/protobuf/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..eabe71e61926b6cdbee4ddb6a1595a6d21676e81 GIT binary patch literal 691 zcmbVKyN-h}5Uk^`SZ$pv0wqdyKad_#n6OE#fX(@F7Zl~+V;ft_-6;}+%9`Do+0ihN zG5kz$P(oU`GXPCrPH5`D17!g>*u$>+k53*i0R2i0rb=Z{sS!D~+c`#>H~uTuElUCZ1c06HHw#iCt!` eH?jZp@W6&OYuo?4(D4c-r`a}@5bZL>6_zZVc46BK*I)cXhK{jhEQM1?rdskoL+w8}p obaQl=kEuIr^Y-xLEAb?elUjZI`m@U79rwYplXdtZ-)E%j2Jq-#%K!iX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pug/code_feature.test b/docs/_style/prism-master/tests/languages/pug/code_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6bb436bae71c13a007004217512c5e3f7cd8b828 GIT binary patch literal 590 zcmbVKF%H5o44jFSKe%2Bg7N}jVP|4P9ildc2oy(25aRd5p+ZFkA(8QX=R4b}z;x4& zXeNaeZVl!BWCAqQYA~UMIh3%{p;1n^o1$b=aLP(CDH3-_5&B{-RewBgc}V>Z=&rVj zR}~FeTmV*BFEY+y62PRyI_vw5e9H{eJt<@Dv@c+q47tmgGQ&FIHG5>2sE%xc4l_0u ztUu=o(HqNBd|%xw8aeG%B+r!j3mwRY3;q&{cm6F`@jKY?PQ8N^X?!XEI9SEH?MXN1 P03CTS_F}BgUuO9Lm?e%! literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pug/comment_feature.test b/docs/_style/prism-master/tests/languages/pug/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1ca737a566685610964bc013b3a1dedbe7bc00e5 GIT binary patch literal 333 zcmdPbS4hjx=jBpJN-W~#;^pGhhYE0V0!4tLRUlEAAVeOjRF@0@GAtTsO0-gPer|4R zUWt;9f)d2^n4*|GkSmm8b#N<)DTyh8x(lZ|>=Iy;dAVXiE+E6SPuXaEKVN) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pug/doctype_feature.test b/docs/_style/prism-master/tests/languages/pug/doctype_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7c13b12e2c90ce29c0503db8f0df1cdbb88dab7a GIT binary patch literal 358 zcmYevPcEq}NL9!v$<5*AN`dkW^$Zalkd#6|sFRPUvx1VYzJ9o|v%bDdh>JpmM~JVF zf>UB~X0ifMhrYh6pAs(@FPAPE0HiOPmy0u63F-zV9R(N@>^P-Z9bD2tyYa{(J3oey f`(u=pVtKiMhwB#_%uj(wnmDW!G54z#J!3NXZ0@)Ea}7pd={*_D)2MA_7hSepHTy*VEa98)NWh z33&SmTzD_NlYb=b=%n#!!=@UQkZZ^F3IYC>ZWx!q8=w2cE8L86(t`TchTKkc2k-qg z{Il$)h#Y>OrH9^~xq1zGa%Y*M@Bbfy)b`Y5EXYfsy(lL;>$_n;!^WlGanYDC)-7=F z`<>5u#RcGJHxs^#Dlnc?lp;<4~r XtMbg_$br-v;s}Af?&*y?)xLZKjCL<9 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pug/keyword_feature.test b/docs/_style/prism-master/tests/languages/pug/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..89af3f9ec9e533251bb4f91a30052bc8b9f00e76 GIT binary patch literal 501 zcmbV}O%8(~5QW#BggX${Y7fz47#ASZ)zwB@s+Aw-`Y_l6_pHIQO!!}J@K4i2J4!bBwG4D;0|n?l_)QabaGAa ztcAhv#|144E|#li6QU`O-IJvZb8?trj)pVHo*xqKwTgg7{##DkDK##Oe{#1&p-E`~{mFeuWkMm7wYmK(&Wf?*- zn&1##MpI8sLMip-loHBlci^#fN1`2IxIkkWE1)lcK;Jh)tu>EW1EwX@2(+;G?{&sB zrySinhm;-0C-Q(VKJV5UN=Y7N?YE#Xe|F)~<0mIELY4S1y63|WWmC z%TzcgQ?f!9&$}Tee&NBm6c|!!*e9J4JbScFP2rqnv&LK1<<8X12w4J(Ce+$bbzwvy zN*>!7OOetXBP_frxeb9#J+9C>%KEhB3i+1{XY8S)F~^!_o!)W9jpsq7SR^Q8#wf9^ z4cA>O#^qXgT(T2K$#{EK+c0Qz_h63r%!(SL(v)gQSz_zy;Oc4CwjZSp+klcYSMw0^ zk2^Z@%ePc}OfK@V#&-8ZVf?6V)KJZ1$JLSk9S0a*XYVm}$x?bBhPeaFiYsPhGa^%G zy(3r7)}wtkHIJ3w>^KEJwD|SidOz^pQIlLM(yU61yF%Js(FyrDaQGicFzuxwnyWL{ Mgux5viZ!(+zp!%{$^ZZW literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pug/plain-text_feature.test b/docs/_style/prism-master/tests/languages/pug/plain-text_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5e97fb014039bd2c32b2d4feea8ad4bd0da9a350 GIT binary patch literal 288 zcmbV{F$#b%3`J)Py+g=sy@bb*4pplLOBGwh*++qA0E?xINO z-Jz9M=0{1c<6RwQH)9Q=D;()W7S`6q+JmELvcEDGbEU3wc`HI+Ae-r U6Mua`qBsX{0!0sn5QMO~0h?_?1ONa4 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pug/script_feature.test b/docs/_style/prism-master/tests/languages/pug/script_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..649fbf39e73bb881aff1d31dc9f16bdcf2ded3aa GIT binary patch literal 745 zcmd5)yN<#z5UjD}f3UV8kqAhL4pH$LmJ1UtT#jHOdyU}l@h0JQIT|Wlt#)QTvtx(S zR}Cp!qo-^!&zDk+Lfgye(%@=Lc&6E}J=v~1&R@7v6dxQZq|ix71KAx+6xSo@1R&MM zOj@+>^aKst=t`=NE{#Cz7+PYwr(q=88<^bz7Y`fsJg}JGn}68(J75Xs$<04r*=AC= zM84WY!f;#Wy``RBID0_0#VPmt!=cp!VU6Ns>&R1DLr9X2!-K&Sf$0KdYr|F9vU%R? gTT+%Hx%&J=t$(oG2emzV6;d)a7Io!Nb=!sM74!|h?EnA( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pug/tag_feature.test b/docs/_style/prism-master/tests/languages/pug/tag_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..415f8bd9b1b422bcbd29ba14cdfa5e9dfb03438b GIT binary patch literal 1881 zcmb_d+iv185Pc?6{=uC}O)3E&fSP^T&q#SNv0)>q9XSr#3iaQ2#vyTJ>U4{W5JYq4 zemN2KIZYOA!_^bF*3`Ss$~M1bf?K}YYn^Raw&N!Icutcvsa4b2++ipz02N@#?0X}N ztokFX<4*t0mdrg$;Y@hm+V_(zE|orMgWil3sIueL@nCeP1d0wuN_7n(>T}*H*;c%f z;-P?-N(=c5dS7cy&uWz>>q;vtm8GQk;~THl>Qt*^nmkT{4Wq(HXLZMi>`H7-36>wQ z%n~p+*lw3o89pz7q5z3e*LRUjNQOe)NW-l*D1s+&9!R|JRAp<8wrpxQ;tk;)A5?O0 z86X#rv^YdX>4Kl3M+3W!M<#YOZw~|}A5r8Pwp8wxeqERFf9xG0;MQlhQ9-at#nji8 z;%|~l8#XYSOW_e`c;=^$EXxvnp|7;RuYeg? zJqi93Q*ehJO(NO`S_Rtvpl#z0FThbnpW!Ep`8Iej~SzYd?1*Jps?2$!t}?udE$XCk!Nh156nG x1{(;z2c{GQxYS6}L4$Bx0?O{`nrI5Y_rDr`)BCPvdu5KpX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/puppet/attr-name_feature.test b/docs/_style/prism-master/tests/languages/puppet/attr-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ad0d4c32add24457e2e09f82220c7eb51a7b65de GIT binary patch literal 399 zcmbV|!3x7542I7Ye20)@v3rB|vd54eY*ALmwAgr(zWWl!E}Oel0`mXFKVJ+fLDdRi zb{WP=E+euRQ4g)Sv>Hwvd1tliFz^U8U~wyPq2g#wku_Gl@u<$CBg#W`PcJS5u+QCT z^Vw0#Vvf_h7lp5tWtv(2|D-0(FXQpa{bFZdE3WfjbG`fJu|r51WdC(8&CA6Zt(2Ufo12(BmCn%q zTiHpg%6lMl>l_-eTGfCEA82?L0bOTo^b}Adgh0k2nkM#+LhmSmo~DI_QLB5K2CW{@ z0lhpzIBWG}qv?#->e~W|{s&NVpQ2r7QxLprE~3?h;rApgd|t_vKSipH1@_ Oiq`ppN1@sz2y6EGt?QXjiqMCD2HDeHTnG$(~}_Vwhpq?99%` zILfzBLXh<+;Q02sKOi937&37{IJu>KAh=Wy5w8dw>{?E)0v{1V%xq*j?rY|`!tWAnE|fV2k<4fs>nq!-ZARf+ zpBtr5y;a@x+NObs&!45q|-L>@w3~|(L$#UgdmRX z=NJ2VIf3T0aC#$&! zt6vp!>cer)VNn=o$JHZ7w)ba8&N~KLVK7E47O|QM5}C3nV#txGuC;CsbEJYk3ZLKb zp}ZLJVmK(Hb~=R_i(xsb|H`UJT_s(n3$#H{y97Xj=P4w~te=PW2!umo!iYjRpa_J{ z3a3n|^Al1G)M<}^{$3rd0tsebsW8CIk7Mz7YDAz*vPYtw@jt21_=jnL@6EOLHqyba zTsC&#*`lK`(Ms%>`mOZn@vXr*nb%02h43G0@6u#)o2xp5R7$f%-RM#o>9irWM988q zkb!qJ67I3?U=bMNck5y=y@tB#6|UKi(|j?pH(b9o^q?@n@9n$ua8T)sWqWOyUm#|k s$%+A!QWtnHnGF{}K=(5>PvA0S)wYz})2HC|*X#fBK literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/puppet/interpolation_feature.test b/docs/_style/prism-master/tests/languages/puppet/interpolation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a7f116825d45a2bd68c809842c6962644f821c78 GIT binary patch literal 1789 zcmcgtO^<>w5Isx6e`qEgG(n>1sqwZygXMqi5{cCO_6^aATt~gPwe($?!s82Tfd{$KImR bjbZ4**%rRf|0~{3@!_*#i745_Pr&;I5n%3& literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/puppet/keyword_feature.test b/docs/_style/prism-master/tests/languages/puppet/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fb97edff54e990c8ba4522097eb9f5855cc58e5d GIT binary patch literal 764 zcmbVKORfST5L`>b9VV>ROLz?9f-n#}A`m|B#oOCG!^>M(D<=e+s)7ksZA*#dY^R*G zvb|TWoNb=xXj|hYr#7CRtJMcPV&4i%tng8EJX6prjO6x9WJk}ED@!TeeWlK)Q(jqI zD*f2L6?q*_uI;bF`;qv1S)!M}YIXYJlXF+C4p;N=uiso(b6kx5f1tS?KUjV-fW-m? zizf)5CIM=?h8eaI5aKI_DFFP>c|bw^o()pZumC0L0eHplI>a^Ey literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/puppet/number_feature.test b/docs/_style/prism-master/tests/languages/puppet/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f7df677a4094d53ddcd3b1c1cc5fb9d7e56ae525 GIT binary patch literal 382 zcmXrucqJ;+B}43S>q&Il8zxI=k|6 z@p9>s0YLhqdAT^FmGVk+lTwS6bQF{flwx(zgiMSu#h^~aB9Ur=MG))-OmUExu!zFE hh(!wKWu;hNE+8V`-_9AS$=SsUY57G85YHFu0RSwjQvUz| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/puppet/operator_feature.test b/docs/_style/prism-master/tests/languages/puppet/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..46ada00f8742652e8fa8ed40afc4c36b1fb7b4ab GIT binary patch literal 869 zcmbV~Jqp7x429imb7j!AUQ*iQ96|V&`?N9($VTp1dEqd=R;|;@zY4%REe|*(< z@@{i#ruTime5SeCq2cDd!wOlf7`h}(1qLk)MqsFc%1qi!Cd;PV=tIWfRNbqkDO!nj z!<8^utTtB5)WnrJRv42I8*ly|Va9a^a^Pf%^s9s@W8Fe@s=D9JXqr=Lwx*Tb|!iy|cK-{$}9 zcy0)?cFh}P%&YRr60=ZZKlmN>`_TfV3s-9-0QfWqtc%z#f^=wEcjw&om zdEbk?Y)lxfk#qarUXN6tBD5Sp5Z`;bJ~WMiV(i$*y)`d=WT?-obaYA5*CPQ}*EA;R MeBXJ3Wdw2m15y~YX#fBK literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/puppet/string_feature.test b/docs/_style/prism-master/tests/languages/puppet/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..584e2a7875ae31d1008336916037cb858dc62b69 GIT binary patch literal 805 zcmbVKQEJ054E?UbcM#gZU1`=UZ0s0uKAbjL!%URf?nit2Npmt5+CkPpu>JI8y=Tc7 ztxQYSQ0+qAlU9#>(5iM9MiBXD1_~qZe=`Jumvu|@1Y;C-8(=PMcD!6B@Ijz_)~dMU z(@LvSt5u0Hg|2_cEtF^sR@L?jWxb=NKf+{#?Zu|7V)O>D!~>mb-xQxGO3mTBo<)mH zy{>tiEIRVbEl*=JE3U#XD%w!YvFEN&O&G|#)DeShUDS`NnV)TN6{auOH+62gx~y#8 z;(upPvoI!VRY`O2n2AF2-j2=wBSK37@?^wktzLa3*yl((x-^Dh_KrZkKZ6?v-!%~u K!K~pww|xO2E8Wxp literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/puppet/variable_feature.test b/docs/_style/prism-master/tests/languages/puppet/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a4c9ff25cd6468113ecf64c0873547e539992d6c GIT binary patch literal 355 zcmY#M%g^WKQn9iE(n*O$@g_zHK1DoZTN zOiap2Rnk$2R#E}lr4$>hgGB}`Ur?HtTvD1?l9`_e|%wq{2~RIkBjvHLgZJ2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pure/comment_feature.test b/docs/_style/prism-master/tests/languages/pure/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1e0519cdceef8309b867b4eb58a1ed4fed3245ea GIT binary patch literal 332 zcmdPb=jGDZS8&VEPf9ETGPSfo0$LyeUM`@J0*J4ysGzHxm!F)Gnw(wC%f-v3O9lYx zi{|Cxj8;m{&&^HED^b!>P}0{|iq*jsgt`Zt9MFMSg+W?kiemC0ZpNYn#S==gyj(y; TzE7ONVWE(gU!(x_PO%;UboEP) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pure/function_feature.test b/docs/_style/prism-master/tests/languages/pure/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d1c366392d21723a42dd05dac3b3c64e28a8ee28 GIT binary patch literal 11298 zcmbta+m7Qn4t?GN>K_{YJiEY5H~I(mGX{geag@Yej_vWKx@*3E&mkozHG8N6b_*z7 zctlE;C`uyJ9GB;(=5#uox8an|kL5$NdbJzYG@qL`{jIt;xHaw0>*XC<-=?%lV@VC(G>;@B{c-ImJ-s$i52o!6vzmT3?TQxXuE%a? zj#WltTkYI;gx;;S*Y=)KrRto={sgg>{pxw9&aBQ2_QQEj=pU162?cLMyLO}3tpwtw z#i%X`bA{x<&FZE5(va>S?1+sh7qc~E6EhOI@a?PP5386Fw{Z70B)K2C|5+-_%<}%p zR>|9y<>flgdAMcE8adk$mUk6lrKrdS#>uwzwOO!a*VN$4JN`pQx}qbwfSKuFsj)cS zP}Zy)&PMLgdp9hJqp+_=va8R%oOOqU{aa8m5$m_Fj~u8yHc1z%2HLW~_E43E3zG|2 zL6)+HeTO-HetJnTT}WVs`sQ{#H6;gs-*9^}O)~`N!Zflim*2N9)8D*89@NZm-I|xQ zo6B3awHaB>+LfvE9K5#%^L9(OBR}KD(GAT2`q0c5^f?rUTp+UX3>r3P@f_rF#^|P| zeeslLX`iQDIJEY0rDjHbui#YNIUsHtVF0Ju#AJn5#4mhQtsC2J_@#cX2zu=8jNN(tlP(K06^A~iyu-#NAR?VcNArVL}>ctP;|;Kpa> zg#w8+n-cBboS0+capt6XA%`!rWo$TN>oUWPAi=62wbk_878u2n+u4PBvF&@&WM#6Q zT}yLAcT3w0_*lzek(fglEMqkvwaW!VwAtEsgV*-yT>6gRyA+kl1@yX@6O>gnc63N}BEbKwh+!8B(Z{^GG?8L89BY|WOn*v>B`P!U*COVGN^mFGLb zX5@9GRW+eVAQGu-YA%5E{PfTN;g5X3KR^BB_s``l`~1tN&&_f9{Kqfy210O>YxId3VI9tOIcY_te`N|&R+5COfOS$=1 z+WAvVbp*p4ka5CD1P?e#$15(PYe9VWX^#6tP~*CzhsUC1BMt+vF?&!}ApHq``bjp2 zG@DjMK2@bCd$h(#v{3fI4cKsP2oOIws$ld{&WfW(bKBFo0=;`of84I7?(ZJhHBr7w z_9Cb?`?#-QPKNJVET8f*qJ=Gbr^ZI67zSLdWMA37@UB(ED;mL@i)1y|f<)+S2!TN% zbSKo#L*nkDh`6iQ1+vFi0iuco$@`R>WY}PDrj7d>&l}Y+0Ed{KAo}TPr3q-lgO@VO2 zNpg}qluj+a^a7Tu5hJf}j)>b_9wBHBzX*l>t3cnrR>1g~#S!m@wPqvPkZ;|nm)Q7{ zv!b*Ho4+U$ZBOM8G-pSMnsXvTD@OuH6(0%N*{S5x{VC~ih$?!gsq&P_-cu>2a!Q!1 zRWfDgtH#c97j{D@)zDqGT2jDJ+`0i%KBmG`2x?o?E5N}A+}*=L&v%D$(14!f3Z(mW zH?w4ONLs_)6|ETQoK|#rssploo489`aX2EshkkC&Vvg_%1Yes(wV94Cwxs_iSrKMUNJlfAZ2O2V4y%Xx6pwE;^CI?f@DL$ zLDLz6h!HtBxat)L0~ZlpKg%kIP=+krA%%KS{eS>S6^5s{g3HfC*hI1*2qEd=QHg+v zWI&uGy3a6%65m&dhW8bM!HpzC`bI)9xnS>%U?;$nG!XTRl zm6O`bcT2e#Ugz%vIhMgq?qcw#@y4(bUntbu2afk8DH79$J+`Hr(VV#K1Kejaj^ zJQsOG@jzsJx;S1j1{S)M9ae-oBiSn?m9IZo`>Sky*nfAW*Iz0dg&pf;FRS${16R zfJtTqd*u2s`s=pgl=cU078q?J1 e2v_H07*^PQScCWDe)u{`f66=jo$NMK%rC#v6Y6dN literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pure/number_feature.test b/docs/_style/prism-master/tests/languages/pure/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..28bf6f35498162f115b3a3c65e0bc737e771807e GIT binary patch literal 448 zcmd1IOXKCrOU&ct;^i`^a7s*ZOH57$GLsApfsmKW#0ZGZ4Gn#Gxs3G;O$<#ffs9lO zprD?StFAdvrJiM~wjodzFPAPE0HiOPmy0u6DX%m)DYZyRM?onwFHI>{2Tc&@MzA27 zFx<_UI-q{QlrS;EA_np!rZCjcSR_&{Fa;rDf+-FSBc)hgE+8U5pqw*Ole3Ez((;QG JAfZ*P2LLNJVw(T} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pure/operator_feature.test b/docs/_style/prism-master/tests/languages/pure/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3b7d71affc36adfe1149de83712c35a4966d53e9 GIT binary patch literal 905 zcmbW#&8mVx90l<89hi4GO+q_G15w|UW&*GjaJcXw62$EuP@er7A?BRRU(K# z&dhP}pX4dh-5Cd)BDW{lLMyFWFleKLE_zz^F~AT$0*tg8Bg6z#%rMs~!U}6_aCK{{ zJE{lj8|tTf4ZVwd_+MOZ-BPQcrLo7XNKUpe9!!#_Cid`&^689n7DhQ7qwE}euI^t~ zi=&ZYYcqA2x=cMGD(!P_z%*p?nF6Mf5Ot0@7cxzlrc5)Yxe#?m5eHXHYo-m;RjAkB{f&ijPmuO@T1VGfOf+EM6{MG5|M;CjbBd literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/pure/string_feature.test b/docs/_style/prism-master/tests/languages/pure/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..42c1913af66784690e93b4d05f060051e5693201 GIT binary patch literal 210 zcmY#V;^k6G%a2jYPf9ETvU$05$p9dI(Y#!o(MrW7MVWc&N;(QkF+ivktAim5v@8Z< c9Y~&+3y8?K)Hx$HIlEXPEx$+sVso(`0C~nN&j0`b literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/boolean_feature.test b/docs/_style/prism-master/tests/languages/python/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..da7f1779df44977098d4f2d2ada07735a1904020 GIT binary patch literal 230 zcmWG3Doy3(a!br922y_cc|ekvOP34)(ihFk#Tl)Xl%JoInwY1gqo5Q5G+ilH2VEF! h9Tstr{YtUCTtGy=Bb+l*le3Ez((;QGpe`xa0|2RRGl>8I literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/builtin_feature.test b/docs/_style/prism-master/tests/languages/python/builtin_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..95d2ba142a515abbe9063b76aeefdea7af581690 GIT binary patch literal 2629 zcmbVOTW;ep4E$aJx&x7~7U=FJ_83JG$TkyeSC#}x&ZDPaQcl`#$gd{xYetU+6e3)Cl9cU~!Gw;K>ER3yueF z$tP>*+-MMokX(a9DhppqddFC?S#!k3v~Ub*aG}ENYJaBdY|V@z!%V&V34F{eHSn>~ zEm21B)yLXg9FcD8I`pYf2KN^*Lh!XgNHpJSO-Qshi_3IeV8JDo>&fHUnuXRY;-x_v z{vb^)jnqrZ)IOC7aymmU^jI1#c5(5DP~3UnM*{_?m3l8ovzsW4xzNK2OT`IFTH^$L zmUQZ~s=-rwO{GzshTiR);AIj6S zHSaz@S+n2!B@^#{Zw-Hce&fUKUak4@x*Jw{Yd-E?VCROqdwYTZu@EE{uM*=eN~qxE zJu9+5_pl7nSRMz#dtBk(HoeTg7l9g)Q@j_6(gVE=LGq=FWNgV2>s6+aZ)K-6=w&GI zTUjbhT&FVK%du~DEK)z}TH)qGmkn-(F9IwC3dyDnGMkk`qFp&8d{+{M|0XS>%}r_q zev=*zpA~x6CYg&Df%!>7tYr!(37eA3VkhAb@l!%~G1R&sHqnCAQevc@66|WK(6YRW zY?50AlPmNo#|ks)vmjx;7T~7e67FU2C_yanGPTH8MFt@9?uI~tN8T>WqQQq_$Vhh( z1!hOl_{n0F?9FmyfGtR%6&~AzfE4!pf z-dt0K$wdXuuBuRPHoIl#HI8j1&raPKpH%c&At8rWbD80B|9txR?#&wdec#G|&p7_A O{GY4;XS{iO{q+yNRW(uo literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/class-name_feature.test b/docs/_style/prism-master/tests/languages/python/class-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..31cb255e81d5c25f527ff5f6de5789f929876b3b GIT binary patch literal 326 zcmYe!Nh~f_aLdo<!syj;9ox?}*5zGz-9&S<6V)XMVwq7)?^ z1tqX0O0hZ$(GaF?USe)4NCM~tpfJ(O;m#yQQ@m0vFBcGz?;q!k)a2}9g|z%41xRp# IoL{U50N@)^Qvd(} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/comment_feature.test b/docs/_style/prism-master/tests/languages/python/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..054d6023d168b01d574d26410f92bb4d88dd8417 GIT binary patch literal 201 zcmY%9Q4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE(V%bqyV+DSPuZd+A4bh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/decorator_feature.test b/docs/_style/prism-master/tests/languages/python/decorator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c04d6428379c8889bf826202fc63f4a11bae2061 GIT binary patch literal 454 zcmbVJK?;K~5IkpJ5%#2DeSjyS&j>lBG14M+B~eO$-(4F-D!sU;&180FGieh&L)`^W z(ajW#p6KRc30>$l_k|o9&|H&C3E*;~01PODn+aB$0fnu2W5un(X&L>zxcNaNUt^6{ z@ZF3BCD4IctW5mwEn){oDGb4f@P1M3M4z9x&Kc~*IJ>e)Mt|1HCLG3phofMfn!H@RT)JcckiKYMF3xDB?9|Hg z{Gt>k9R($zg-WqH3eiewrFqFEnfZAjL7-b8f(0PK(nOfJ22hkJ0}x)I%$#`2w1b?1 j(*&TO(Y&Xr6wAv6MC1prb4F@%b}=vpixgntS*!;DA>)2N literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/issue1355.test b/docs/_style/prism-master/tests/languages/python/issue1355.test new file mode 100644 index 0000000000000000000000000000000000000000..c381b255f37545ebc505a144d9217c109a1152cf GIT binary patch literal 523 zcmbu5u?~VT5Qb+-c!#D8KmZd%7@d3s*}wtt#0F@aYa8R+ThKC)xMHY9Jj`d_cID>THAz9*c8N$|7GB2wnpXZBqU&?1v42I8(ly|T=cYA>z_ZZaYyZu^7eB=d%+y0A_U@#^C#H9<1)CM zF%@~O?7=OLiZ$1S?gl={*x4E%xe(6?Jr45OV*m^^$RndQ`0zLtzz2F5h+PP)HA74= zq+XcYXXJtbz4SN zbj$EYrB*!fn6%t!)O=v8<7<@@7bh+^bfHDuL!$MVo^)ZH_)r7K^LkW_eAe1r%&8aUlEZ jk%J*=8YLr5q*$$vHFCe-S>Gf2TZVcN$dLfg7Rz6Mwc}Ef literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/number_feature.test b/docs/_style/prism-master/tests/languages/python/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6d55b14cc843d2c64633b983bb757c2054832740 GIT binary patch literal 459 zcmbV|K?;K~5JlG=m^*}Qt09RI+igpG32_lMMQv5k7VPaC8@p*-83F_EG4TKJoO3P^ zc%Q_|j_IV!t1b+Jk_ZtKO2kJ5$;3r)>se&N#7cHBd%LD&gMbijc=KM0uuEz8YI8Ht zfKdKTL$lzY&*@h1FRibX^x4wJ7p|SpU0a{K_A6XAG()g|`$^7~Defb=^#iHQq)SuO Zt$qZgFP`(r>rM}EqPvnTin#NQ>;pM!X*>V` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/operator_feature.test b/docs/_style/prism-master/tests/languages/python/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..67853366271478dbe7323bd99ca8a47938430f7e GIT binary patch literal 800 zcmbV~K?;K~5JlGw`|}e?iIS|T zQFHb1Jc%oB0sI&9W(zY}BkHP&1jH@%0s z|4g&1;7Zq4I7q~r0BZ@>D(EHXHElN^lKIDI(Ls_yaR-h2f#Nc`?3k<3QG!v4j!EHm yuSizFq%=%BC(H^+>ajCbE#x6rDRolXTx$)_^AGR#9PY0Lk7-6fj`+X8<@yCv&d0R? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/string-interpolation_feature.test b/docs/_style/prism-master/tests/languages/python/string-interpolation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..789cb832439a0841697ab5d41e5e0e3f213f2acf GIT binary patch literal 2820 zcmdT`O^=%}5IqNp|KN2GhAc$+QV)^#)W6Uhy_xZgkLc$I0blr36Ofjm72moAavj$>!b>08qHY0&2cKxdmF!Zg%%%9E^?h&1k0*mc*2xcq{y=quF{Oc z0C4B%WxwI^vVm|P^bt1?vXgmD4^=JG!FD(>gQD|LoW2h0;GU=5%j`WmUVnjvOL(3G z9$${v8oBHhN5fV`61t*#heHf)Neqi<4Sv%0Lq@+yQL$u!ZLBy8d$W;(^if~kl;!B;gaZGy`9@BjrqR=`4XkS6oi9Iu2$F8&PS zk@*VqY9dd%sAF$5%I`UwPI#zasnoKj_;92o0f5!O79 zjB-S$-}AMxt_F01NJ}*F+(fi7me3L@0-EwnvYQc^JxpTdEtq8c7veh#*04>sY+!LVoVY2RVF};z8NJ Mo7jU=d(|!e0?M(|B>(^b literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/string_feature.test b/docs/_style/prism-master/tests/languages/python/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0bb511985a517d0b1c2d909ee8be29c4451c8987 GIT binary patch literal 485 zcmbVINe;sx3_KT!KOpzOCG98rjJSsqC2ds&OHT6t4uMnP6c)+$jF&NyH8cs6gqOnh z9v{9>KI|QHS2xH!k8yQ{W{na@@B_#Ko(3>w4{gZ;WXV{s-S4cM|{r literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/python/triple-quoted-string_feature.test b/docs/_style/prism-master/tests/languages/python/triple-quoted-string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ab1e2ab759ef5a0a41f2418259cd11537d5d3fa4 GIT binary patch literal 443 zcmbVIF%H5o44kp#KSalnrQs7iqv_B>0ti$?S{7c9n=lj>sydcqpKP7(07Q|lO#qm* zM1e4E6=CYySB9;%Wl0;RJlXkDhMC-oU}CD7HZ{g{x!;0&JY@_=H|W@(P#O6A3V-R* wREsV=#3$cRTBcvsEW4k}{m1n&X7tPDX8LgCXF<6v=yr&e)%LPQ_`_VZgH95OjAuYd1 J0pfsSJpd6LNdf=> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/q/comment_feature.test b/docs/_style/prism-master/tests/languages/q/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c78bb336189c3d2caf43f3ceb7955cdf40406c64 GIT binary patch literal 381 zcmbV{K?=e!5JlGx%pJz*wl#N9@DiOani5f@2`1Hrr#B;|gwj>BNXX;Q@P2hP?-Y%F zc;ozsUI>P+A=o|=+y2W4nIL3@P(V?huRlMR;bzCtWi7&?NPrdxx3++=oTW)CDZ8#-_Krt literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/q/datetime_feature.test b/docs/_style/prism-master/tests/languages/q/datetime_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..92fe28c53fd91c8005b007140e6f41d6875d981e GIT binary patch literal 908 zcmbVKy$*sf5T0$)cW62zIWZ>6>ds`+fjAJ0(HJz5!obseS1S@Y93))Ye)oU(K~^cq zEJ}ycptLAX3NQ#7htf$QMFOi$47;ko#jqXT?eKvf!5*y+uuYRqx=vUy1^`S(CgEtp z*@ly9=_7n@sdtlN`Nv1?5@nfbiKUH^{KQ-Ze7nff))DrnM^8odjRo7eC& p54@W7Le>(~^ic}@|EJsjQl4(LIzOI@I9ErCXjiM^Zav^%@e8x`)-(VB literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/q/keyword_feature.test b/docs/_style/prism-master/tests/languages/q/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4851408e91f37008eb99b0d52e64ab2a53699b33 GIT binary patch literal 5445 zcmbW5(Q?~15JjJ>8U2ID&uJ#@G+)rqh%*_Age2G$K?9^j7DuRr&@{jNI{i9T7r`u9a*93`f~;x18oi#S=PqvX>0ep#~Q z^;Cu0AIy*tdQh`I#4%3N_Gy&1Pr_?IeOjl*_g9IWij~FptI#2gVF~rRbkYpLy$?b9 zAs&xGMuu3HIQ1q+!y433x~m!mjUY^;^txUN!b>}ff&196rp0zlYkkv<=7LPExA9+)STpBz3H^w)0)J8X|;rJ>GW9qa{ zW70g2>E^~`d6#J3jZ2R5;8IuV(rv!oWbpD>gUj$$4|R4gL3S=-=_Kuvgo&+DLoTa; zWLjBebqeZq3Y%P;lEvz{@vNn*9htlAnVCb^pLLPPb8~*qvLPY+bN0&4Il5V{F(>)v z`z1OkbN5p=a_9yHrZ0c^(#JWc-V3buk4vb%x}p%X(-7tJ5N3f`(PDomuy?1X)`nbJn7H`$tn_6x)KsRj)y4Ty`qf$Z&^U>e|K!w0%g0EEdl zFIC;J(8iTeA1j0xWUmWw+eyR<9ZjgfCDs;0_qmJg8Bm?fg!-sPTxU1oKFkT%>5j0Dd%|`81FT$tQJoy5aLPcqPieqg zQh^F*8Kh9O66`#La3v-HJ5wR}k-D&oo6znRDfV#NY55TK=L89Hns>zja6gC)Ct1LD z)`c*$X^2YH$bvFAglW^RxgD{~JE0%MRZRzh@B9$qjZu2BT1rX$;VYuJD=G^mveHt5 zF?O7|5?Prn!ffQS5;>uFN~D0S^cc~NqD%=ik(E&cj60QcZs67=oN#C5gi`?5yq(BO z*8ZQPIkQI?SG?x_KzA{~@EgJ|7f|t&Uf)_!5Zx69;{TQ$sN`c(wTX)oYT+t{@LINz z!leu0t|0*bfbPr;(W*yO(5$GwBrXSwDo`S;Bn5b-4dPL>65UlS;kB$qh3Z_y zUHF2cR>Fvr8CS_fcJWL&fiACsTkCDaRe%#-D{@lM6su+@DxWilo#Ub=AbND+6HwJVG#H0x|gWy@C#KOfl5&fF};e^>a>L203_yR(-7lJqfiv(6jVNnNiq*5#|7Z8!}Qs<1+yse)f)U+0`v(v351{?b-s3 z7$wh6f-@HnFYuAUB`~-b!6F6*3xV+6qZbSqn0Dv{4H~8nPEep=I$;v5SefqF1px=V zVH4D-nYL&J6)L7PX2F7mX`T%)JO_8lv$sq6cfEg>4&_*WI6RfYS{Y8q&XePuIJ`D^ z1Ndn4Xbr&_LNda%upOf5!1HHI^&4iUB!*spL~npW%R|C<+Rz!k(Q=dUP8*!z3oRE3 zKWW2c_*Khm!tdI!8{V97dcd3JH^bLju9Nw#HnfJXv|J_ptPQi_7cDQ8^NjKOJ$nDX Pe*HXf`@Q41Opoy&@|f*5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/qore/boolean_feature.test b/docs/_style/prism-master/tests/languages/qore/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4019c444f8b53c40620226d2914ad19fd46effee GIT binary patch literal 201 zcmXRZDoy3(N=wWs22#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H<8xk|A*=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040MAk^8UO$Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/qore/comment_feature.test b/docs/_style/prism-master/tests/languages/qore/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d7f52c611b79546bb49c1fb6c11f321b73318497 GIT binary patch literal 355 zcmdPbQb^0sSJ2Yu<J* zKQ}iuuS7{lK?!0l&_<X7tPDX8LgC7nwMOXnV+Ymqo4$| zL@8EBAzG;bBv_gV6W72hstFXuW(3HcST&Gf48o73nZ(N#OG%J8XQU=)7b~RY7b(EP HrC1LDuux;~ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/qore/keyword_feature.test b/docs/_style/prism-master/tests/languages/qore/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7f69ae0ec90bb2c4e45166e2271ddaedfe72439c GIT binary patch literal 2458 zcmbVO%WmT^3_Py^{{xY8cYmPA{fwdq*`{l46e*D8q~5RJq2xX`RDqy@AQ>$@QYM>4SSG(8n(=RH=4vWnmjHvE+ztSSo(;2m|zG# zWf`;eE7N4M>AQ(%v${-Ez_kvJiCqE}`}KtJHM5_DVaDE$%IG$lT`-yEfGu7^4z!rG zke&O^p3aU>?6a)FL%^}EUpU&F0N?<|j~r&P`dkK%vl$tH3;u;p8+nuM1xN6F1?ody zEDU~ij>7PV5tFcD<8bwKj`m_QQ{K z{0RdN)pzBFr)Ye#2oq-bpqF4Lx&#M$e1PkMvG4ls=Qn<`?y2v7JROd_T|=A>4|Fhl zG98{D=zoLXG**&L!8Q2+-;ztc_ky z!of>O9$Vh163r}C(?UxXDT7p1gL*GB?H(GCl%ay9EE~j9r!BY^Ze_XS)k|TkJ@<0g zxRk#}L+cZWJ}6hw3kBL4&~0{o2uk(8<6WxkX!>1-TARG<(*2uw34l7S&sEOu<`L1W z&Y$Y_q^q)uVq;6FeTVD&o%Hv@<1xt} K9oow?{rU&q#{td& literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/qore/number_feature.test b/docs/_style/prism-master/tests/languages/qore/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0385aaff4a0f5daeefe35ea17b43b6cd805886e4 GIT binary patch literal 342 zcmXp=G6VtxAmHUPsBlV5aZ5~21u+wo3UrNmxlD|Bxs3G;O$<#fK@6i*i!@#?UM^iS z07zdnFBfODQeJ6pQfiTsj)IZ_+*;=-&(CSDx2QvX+F~UsEs-;sXn*aa+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/qore/string_feature.test b/docs/_style/prism-master/tests/languages/qore/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d8cdb4f531e3c3a84be8b36205cfe787acf23b8c GIT binary patch literal 287 zcmY#V;^k6G%a2jY=jBRDECTY>)qxl&q7D%O@_4y)$p9dI(Y#!o(MrW7MVWc&N;(Qk zF+ivktAim5v@QndgqWh3JfI`6sZm$Q)CY1U(3wzOKn1*9Kt#T4oikFCvx^nd@{1H8 IPA=910M{Ep#Q*>R literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/qore/variable_feature.test b/docs/_style/prism-master/tests/languages/qore/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..693dffb7ad9cfb1012247b956a0936c4c5a5e053 GIT binary patch literal 258 zcmY#M%g;|rEaK%-0W#u&tauY6Ajb_V%FCro2H@r5<%;Iz;*3@*ODxJvOv*`B(os+X r*#NXaDOLxo6x4F8(h%n;#qx3i5&3R%&PYwpE>=j(FH(RxtXK~Ka@{a&zQ4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE(V%bqyV+DSPuZd+A4bh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/r/ellipsis_feature.test b/docs/_style/prism-master/tests/languages/r/ellipsis_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fdedcd8cc8a82aab3dfe9de104f0451d174dd6fd GIT binary patch literal 251 zcmbV`F$#cC3`1uNy+i4&0mU153~>;xSp2A1?~gjTIT=ER2Z0BG2`HbbD<-DmN1k8H zl(lLp`5qpcivrLt|G?!pt}E@B?*5l(W*e4}X*=XKk$xQ|b{o7;;-jsnPi{xx0_++$ AumAu6 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/r/keyword_feature.test b/docs/_style/prism-master/tests/languages/r/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..67132c4d50b4809f2f7c134fdc31b1b2a680a2d1 GIT binary patch literal 615 zcmbVKu?~YE6r4-KKfEy8{)6di+&UR!sC`x<1%o!)zb~LRZJ|pE1KiysxjRGyCswP_ipnhmT2{3rm2BhLs6?K+Z`3F3v3c{eZU`$T#be0h>i27b<{U yR*`8RULba1hF}_*e@i>g`uOA2*2fR_RS+vFvHSm)jxE;R0PfdtDPgT^I6MJxz^n}b literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/r/number_feature.test b/docs/_style/prism-master/tests/languages/r/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cbe9a5804c74c2f2a2c165ff1f0db0c0bc93f428 GIT binary patch literal 656 zcmbV}L5spL5QWbM@*jp=ZNnxTL9dE}AZ733A=^%{Xlqdx`tzNMWmz^k8A^El-pgU$ zRK9|JAEfvg*S^{L8d(OXon>K-wnJ1Qe9avr^h0T+VBgt;6rb8SvskgPTS_>bFDa)D zmWDF6C8Q1A1o%ga@{Pmqj#A8ys{iS}@vaI`m9NyPfWL@FA@nczJ6g_)qvnj)=s71= zkuzd7so`vn9a1<|nKP)`6m!)novKd_+op_HlhU{RUHlafH`aANmQxEt?|% literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/r/operator_feature.test b/docs/_style/prism-master/tests/languages/r/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..dcdd8b93afa8da43f741075f67c52fdae19d78cf GIT binary patch literal 748 zcmbV~&kDjY42RDK@(#b1(SurdFKrQg3{eo72o5Hj$FgU)J$TUMWC=Zdd`bEz8?4dc z%(S4zp2@+b5{W4xMW%od5gbBrOcAl522I&5tYyl`naRU@rjq=}s(DAI)zOU4e!9HI z$!uXZ=Cs8(T1(VPbS_9#Tcp=YwAWId^jy+dg`%-yrl^TQmJC(=d4r%Fr~HgoQOS;K t>qfR|RMAS&RwizprI;%dqL-pCjH$%`({#A^*T;<8IN>r3_>9%Odjkk2yDtC$ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/r/percent-operator_feature.test b/docs/_style/prism-master/tests/languages/r/percent-operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2c7528e0c1ab4a71908c9845911a2332d57ce27a GIT binary patch literal 435 zcmbVIK?=h#3_CB7KbU|orCA@bXOteY)>*?K9!W;~{5i0}F3q9F0tsP(g$URQ2Gj~e z6vl$RD$jg(Ntjml#MHY{tIKF!lxB*>vJh7|nH~(HnR+Qwf>I0+ zD#hwxhypE(fmn}CUR@ni56FE`2P(z#asd(fu5`{wP0lV>NXsu$CGzlRB@k+5C0CHwYbpQYW literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/reason/character_feature.test b/docs/_style/prism-master/tests/languages/reason/character_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8b9de3ecdcf0384d851015de1c96e0c3e380da52 GIT binary patch literal 311 zcmY#SROjVVk5LDcF<`PHEe%ZP8yT7a8N6J&WB`!9XkISPXr<(g#G=IHlGGw49R(%z zM0KTD9W3H8Kqugm0m|W$0=X5J9N7IzvAkSBM7}4SGg6bYixtxHixl8KDb@o3WynR- literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/reason/class-name_feature.test b/docs/_style/prism-master/tests/languages/reason/class-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..04454b673348bb28cc9c96490e1511f4fc5c445b GIT binary patch literal 351 zcmWG8Day=C*GtRK=jC$C&yP<^EYeF#tm5Tz1X4x3T)bSmWB`!9XkISPXr<(w#NuMz zyu{p8B^?E&V6bgUu{sLTN(H5P$t9(UC7JnoASpeNs1nc}F-0*z0W6xK&cmY{=y066 i9r5ZbQsU)`rNp<+8L7$H#R_TpMG9aqD}cOQtOo$7>RC(x literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/reason/comment_feature.test b/docs/_style/prism-master/tests/languages/reason/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5a420bac4ebe8d209cc34cb971cfaf2eefa20668 GIT binary patch literal 377 zcmdPb($eSU($`W5&df{CNmaCe=bQF~Ifo@ZZ)xi|T;aKcy;jWJbNKMWzR!GY)f`wJF9sqRMUWxz! literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/reason/constructor_feature.test b/docs/_style/prism-master/tests/languages/reason/constructor_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6ac80d0163f3db3b0fc61764488f32197d4d0fe1 GIT binary patch literal 242 zcmaz{E#~EN%g>KbN-W~#a^&UW<Q4a&bm0CFkcAmlTyIm*f{I=_n{grWPy3 k>R^+BT8cx~Q7M*}3y8>fj&nw8a(1yoT7HoNlADV40Q~?tKL7v# literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/reason/keyword_feature.test b/docs/_style/prism-master/tests/languages/reason/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5cf5b85b77ad75ac5bec28b8d17374e1c8f8fb4b GIT binary patch literal 1582 zcmbVML2kk@5IonC|A2CC`-wiI>cJ#SvnANbb_nqL&N>m7PA?#0oS9j#%(J&s8z$HcY$mQ_ZwCLev&#SFn787b@S4Ee?GanW37 z+bm78jA~gChA8jep7>bYr*|)(-BE5!%0u_M>p~p5uh&0lp`cZZ5UqR!Z}nvOqrik5 z5(T4B*m{Bx)+7w3mwmJmi`e>#P-rxU&XJ?775}5?QF!T7AYwQsQ}^W^zR!=Rk5T$#*}+=7ZAO*%UnR1{0ssI2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/reason/label_feature.test b/docs/_style/prism-master/tests/languages/reason/label_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d81883d8b87eeb17b86c79ef67552d4ffb2e4dfa GIT binary patch literal 253 zcmYex&$qHlN-W~#N(9kWyj;9ox?}*5zGz-9&S<5a#H7?5B^?E&wETRfSRI9ErTl`_ zqQsK?B9Ne!6-Z18Xk$!KOrDYss+L4N8mg3dxne1Co^wWOa(1yoT7HoN*p0<{0Q-G8 AA^-pY literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/reason/operator_feature.test b/docs/_style/prism-master/tests/languages/reason/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2794f7866356495e858ca605adf5a05585391cad GIT binary patch literal 972 zcmbW0F>Avx5QXOo^dDZFA>c&kU0BMHpAi~j+Jr#Wsz@C&nEdvhh78Hw6eG;}z|Scv|1ynzwzIe@|ul%ca|(BckqoBe3^O@hJ5{Q#SY{3@TH* zN7+3p-BHS->NiW_L87fhD@I}pOQ~B(bd%_)xviznNz_X;sBUdlHSrJLmLC x%N9q4a(KkwTVR=rDRP7raa9~RKdN=hsOvU$05$p9dI(Y#!o(MrW7MVWc&N;(QkF+ivktAim5vMdH{ c9Y~&+3y8?K)Hx$HIlEXPEx$+sVso(`0D7z}&j0`b literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/command-line-option_feature.test b/docs/_style/prism-master/tests/languages/rest/command-line-option_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9394b0d38e8fe6f5b5c50c763536c8edee9f8579 GIT binary patch literal 1090 zcmbu9J8y$96ouy^@gI)7f`h`|q3T1blqv%iOOk=4rm+fk1SB;7zIGty(Nd`D0SSE0 zXZzlRX#@m3JtPeBP;e=1i*9YJ_YqP+u+IVs7fdPWiDhS+Nbyc97t~m&R|9ckV0i)J zm~%DZC|iuD=f$I$D0#8RDN2qEa}AAo!fuBYzEb!uC@o3}ysAgFatQUM|jfpqv$ujs^V>`w?2 g>{SR8>{}(Ezk!H+FFR+XCTAA|y;GzB^Hq)$ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/directive_feature.test b/docs/_style/prism-master/tests/languages/rest/directive_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e114a6dbda64d3941dae299025349df2c75724e5 GIT binary patch literal 555 zcmbVJK@Ni;5Ik$*A2xfo`v9)}LT~DUSVYjxJv5sw9HJ=p`^QI7i+lFvHeG22Z1zAzcYx2C0MeBk{yx$6;Mll|_Sov3*=* zG|plTNQ7OTiL(i+kLIot%%cV7ZzHp7oeJh`T;^!L5$<& ailxLm&Kar6*~P%%DN=y?NdfGqVm$zAmP;xC literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/field_feature.test b/docs/_style/prism-master/tests/languages/rest/field_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e275c61272463df6b9d094904f09707a2f044ac8 GIT binary patch literal 376 zcmbu4JrBYl5Qb+-_zxEnw`yc?xz(RhI$*g9vDyY`{QL5uOLbDFBYB>?_r=ibkr0jt z*mAZ(Jw}9^o*_y*;WjWMk5*! zSObYJ%_Wuc>aL<_R#*;Nq3>ynmeee+)Y_rSQfBaD`>WcU5uA1ZbUaz=uK|Y1Ln#{e EPq-9YivR!s literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/hr_feature.test b/docs/_style/prism-master/tests/languages/rest/hr_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..83449bf8a5d90a3151055ccebb8506b4cc9a0511 GIT binary patch literal 1175 zcmb7@+fKqj6h)sU;UC8Fu88m66BE9`H$W|ANE@NmnX2*n?e0Z2@x&(q~3f;<)EnIO*v zc_GM4K@J5u669ErH-fwsLh&VZzohYipRg zHO$`{nqUo`u!eS6Lr<)sG1kx>YiJQzOQ)=%UDnVuYiOJ`bk7=EXbpX|hGw?L|F%j6 z)62Q+`Kl%5dWw2gg#13aSsh(b$MUVNnr!aoWffA-y_8Mi!gGkP?x9YpoXmsEi!5e& z6JpYPdtC%a&3$rN3@(Ppr!t1AOJ$V@*M!uxKQysiEabCl`fr(T=jXQNs%{p-G`UI8 Mj>7W#Y^KHf-V!Z literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/inline_feature.test b/docs/_style/prism-master/tests/languages/rest/inline_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..408037f593ddd7409136f7cb77dfcbf27762171a GIT binary patch literal 1687 zcmb_d&5nXF5I!#n?=a~}5qSVF9yaj>cK0MERH@pCl(Z%Bz{Bs11(Bak#B5`<%uM^u z&&TIRDG0>1ICCRS5cysZd|9pXQxL$OYczbHr2+gTGPgn(T3C^S6*rrpbEQ=#RzsKX z4Q(zKJ?P40E+CV5A*VP8YK{iql}euIP6$r}!VkPXg2t zDpT%_mA14}{54y7=P}T(Z2ZrAE{9_EGZT|l{U!3nh z0M~?abv3g_Qsa6Pe6_MiY4rXt>-XO=r=tkt#2I1EGml&8n9Ars)2bEdE*MEH94-cqO2btd3$=`2 jxxSPr*p2puK*|)NyZe8Eq$DaD@^q#RJWt`dA`|@r#`xA~ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/link-target_feature.test b/docs/_style/prism-master/tests/languages/rest/link-target_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7ff98a41a7147f11b7fe56936b083bf56120262b GIT binary patch literal 1493 zcmc&!v2MaJ5S_8)f3S`fEXbIxAXVz#EwO@&phZx-a+0BZJ$E)lq*kjmB9JAg=XZWD zr^}O4WOF5+t>sK&ohY%;F4SYHkLP-8?VEOgB~sdHEmG5m#{oV zP8(ezOz5f&7pZtM)_i~3y5x+rX^)5cGR{UBeAQ-M)wC+99l9g>g9J++fg+6(Ol&>nZxJ`SNBHmQ>XoIEbl z04B~${!bIPGg4eO@XukSKiBZ4!?^a4`~Uctaoov9lN%4U5k<>oOwmDmEKRlnXBZy+ V^KJRDS?^1+wN6l$iI8QbJOQXkg0TPq literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/link_feature.test b/docs/_style/prism-master/tests/languages/rest/link_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9f850408102d9d211af537280a47a9fe4d3a02a9 GIT binary patch literal 965 zcmbtTu?~VT5S?w(e`v~z1{htL+})a{tpv1z6a!`P>%CGmQHvo!;CQ)v_ZsdVEad_t zmW?s;v1;3k>PDQO&RLR-Rg8Qd=m3O&9f1f)LdHQkVFDPQhjcU{wP~~|i8i+EjB1Eg z-LQ=x3Z{vQnej%KR|zY0xQE1$N&HU literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/list-bullet_feature.test b/docs/_style/prism-master/tests/languages/rest/list-bullet_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..668653f3a464673b2178531889a1e8b68c407798 GIT binary patch literal 880 zcmbVK%?g4*5I(oC@38Di%M}dq1?m#iH3IF>FG^OR72(O~P3p~jl4csWQ`w>iUH!iK zK4<3ZitX{pSx+n%8D|O}1!q4I~qn= zbdb(BPLDV+g5MmaImK@d%+0_JhN`t1{9xjm^>);*-~Jz0VqgsW(vl6vv`kI>>+PF3 z$0o))CuEIb!JeD?_FRLmi<;E9T^+$s+mf?6W~xOL71j;n&1#oJ>@tCY6cotZeF5QW B>aG9) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/literal-block_feature.test b/docs/_style/prism-master/tests/languages/rest/literal-block_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..39ff58c5e42f40ac11df982100e0f7b6f0d37ba5 GIT binary patch literal 424 zcmb`DF%H8Z3`OT6aR0BudpN5mbaMIel!CEFGgV7|VXE_f=*Z^05%jUbrzO12)DH4L# zqHmZ(mtAy))~X3Db|xDV;03D`k@YLcqyG>VKUhy3Ig>+JE6<<2;EmzA=V$1r1>Pyc K;Sh*J%Y6s4K5F;? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/quoted-literal-block_feature.test b/docs/_style/prism-master/tests/languages/rest/quoted-literal-block_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7dba1d1757ea64a7cf9072800478b858cc6c1892 GIT binary patch literal 6548 zcmc(j+m50@5I~=ognww;yMn&sHM7b71fU|zMl)uZMV!fumv7&0s+=v~ta-3Z40^hc zoQ{x?4g%Mysb6_+4mI_Z6!z;=^65IRW9T|5RA8oPn4)2Zw#RCU9jn7w9mZV8vIejQ zWldmB%38o$l(m7iDeD01P}T+3rK|_6M_C_OpE3`aN0|@Ir)&UhK-m!3kg@<+K-mb` zh_W%TF=Z2A6UwH*rj*Tq%_y4#n^P773n`0$MU=(BV#*f47L+Z4Eh$?8TTyldcBJeC z>_pia*qO2mu*;RXj{l99y=X(%`4Q^BhrG;w`@3zK70J$D@AC9nd&&-)(Hrc)9$wP& zkd)i}#Z1vbpkwcjc{MXlRrf_yM8>>FLC4%?_d9SJbH8bGhPX;IAGG}e`^KBJI{!n~ z9cli;uMTJ7k^XPpuKgj)tn*iiidp2%U-gjO20s@SnrkkshtxLtwWvtcw)nNENYu9Z zwWvtccKEfZNYr-uwWvtc_V~4^NYwWEwWvtcdi+{cBx-$rEh-YV1AZ+k6178qEh-YV z_TiTK)QXBk?TBBCibU<0UyF)F?Sx;8ibU;{UyF)F?TlZGibU<4UyF)FZOE@hMWQx} z__A2_^Fz9@Z@=sTTauyC(HAS?~CaaUu9>HUP2T#AH*C$Xw|ypjZJV z=g28~&6EpKRq^pVI5H!{x2BMaz-s6Wu(Cln$-e86oey6-RbSU90-z}@{BjA)umpLi z`nvl)B#-N!8u>1gFD?otKU((jdjBCBPkXBT$2Av&JX$DNacat6Z1&G0!Ree5Fv;z1 Xe=@pxi)`xyJNGXGXIp2{1 zk~?0BP~o&1=&fmJAfnv1po3P)3ol273tI`w8J1QH-Y57Elrq$5uN8m@pH^hqmoG>m zSa|{*W4CPX2u>|v!-4Wbpb(5nkZ^2bb7+f_ZK?-)a53<|ri#fgQKvMoCGEcmqt5zB{^OJdt0~$GY=7u~ghpxO5eMDziAgHn3*y`nd5_57 oL?8{*3K#PB2kG^rDn2_jqNVqCTar9Y9of31Zu_<0RY%GFH}tQ7a{vGU literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rest/title_feature.test b/docs/_style/prism-master/tests/languages/rest/title_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..50d2a2b58227c2774135eccd41c6e872ebfeec33 GIT binary patch literal 6890 zcmb7J+inw441C6t|6vpEkd}Au0*Rk!QwYtXMx?t{vISLKz8zoNB9M;9eHl9)k1Bi5 z&Pivp*^KGKI5G(m$TXLTl0&Au5>ax#tM9Cr31Boa(WO^tOC5KFpB%9ItV95OwTh>}C5rxHax<^jsoJ4w+s^M9Cr3 zONl5sWO^kLC5KF}C8Fez>5W8`95TI?h>}C5BZ(+EWIC3Jl0&AYM3fvdok&ENsiKz9HJ#TK1*_NmgLAR$zfTNW3nU%B!4{|I#$`qJ4f?rGj03%qSH*$ zi_773x?D}0aggF%&y)F59!C9abAB=IrqwX%Cvx0efAC+DaF)s}s2tDz=el84>4pfX z>Au2BP6AZ)L4Z}91gPi}2CFy;P|-&hR&f%bqGtlE;v_&t4;xs;Nq~x;Vz7#n02MtR zVHGC*(Kt*3|u!@ra6@6#IDoz4a^kodI zI0;bEw>+%kBtS*&1FYgCKt+8Ctl}gX zB?4+{E@34n0V?WRVHGCa$@LCjlyI;9(Uf0V;YkfK{9XsOXggR&f%b zqIVfs#Ys0Rg8sSB{B@I%Ytyv|d}pb4s@+Md-P-q#YNz(yqS~o_f2ek9-w~>v+V_BJ zr?%Ixc53_iYNxhmuXbwt@@l8H_pWwo8tiJLwu!EGY8&Nhr?wfcc4`~mYNxiTt#)b~ z*J`J>IjweT8_;T}w#lq^Y8%OFr+Fl={h}Mc^}Fq6=-1t9Sa+AhI#cKYiB?Ex;Me}lTMk^(iX6BS+<|*kYC^;y_>Y$53tWk>PNXsu$fLd6r2LOAyDpLRe literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rip/character_feature.test b/docs/_style/prism-master/tests/languages/rip/character_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..919e738f133723874a6bdd6eb22455cef8735a5c GIT binary patch literal 222 zcmYdDQ4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE(V%bqyV+DSPuZd+A4bh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rip/date_time_feature.test b/docs/_style/prism-master/tests/languages/rip/date_time_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..dda1ae6cd3c2dcd28f1e0937175ab0f2cf1e41a5 GIT binary patch literal 427 zcmXpqFf`RQu+TL&;N>#3G&j&SFa#oAE+Eg`%EZ{p2*@@tumU5Hs1aO!2toluV+gWZ zT`~a3j%Z#k&S<5S#FA7c9R($XjY_dPC^86ZVKOC|xnMmor=g3(Tn7^e*#Xmoum|ol zY|0Rp!u_fg%gY5syj*1XR~MwuIU_YWyI3JDzeoY(qGBBdkfVwf67y2P0$`pV072VV A;Q#;t literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rip/keyword_feature.test b/docs/_style/prism-master/tests/languages/rip/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c24b4f3d15accc73ce613aecf206e014bf5febba GIT binary patch literal 503 zcmbV|K@Ni;5JlIWWbQCwt-XP6dJN-&P>4jL3D8(?FN1DcSV`FMd6Ue4T~BR~pqvbW ztRd}!MhKgYY9b~1;dT7@h4j}(gy{Dar%wc97wOziURuTw+8c-G2872TX1#B#e~X4h z*Nd^CpQz>NpUYbps5M2ztt#_p&4T9I75em0(Cno`Cs75O#Z}nLWWi^%Vnj&yzTVfQ N)f~vIo-W7Xc>sh8h;RS^ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rip/number_feature.test b/docs/_style/prism-master/tests/languages/rip/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0e45d5dcde10576cea436a0e9b5d1278dd39a9cf GIT binary patch literal 314 zcmXpp;^i{dGc++YwdCc}Hnac|20$(^m#&csP)gUrRL{temkY=u1Az2J^Kx-UE9I5u zCZ!fB=_n|f7%9c-pou{pfGGiV5Eem@12Kg`4#px1_JC3>FBcGz?+fRQ)a2}9g|z%4 J1&CLQ^#G-cKiL2P literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rip/reference_feature.test b/docs/_style/prism-master/tests/languages/rip/reference_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e968f8f38f1ba6c2d761c728b80fc23928e8bf5e GIT binary patch literal 208 zcmYex&*$Yz%g>KbN-W~#;^opM1Az2J^Kx-UD;1@tr52^;C8sLsC@295Jy&;*3@*N=;9#P|{IQ0@@0;Uny1xLjuV;n9?y|=Yd@abRwoas*9CkdAWdy Xd}ljnq$XzQwf>I0+ zD#hwxhypE(fmn}CUR@ni56FE`2P(z#asd(fu5`{wP0lV>NXsu$CGzlRB@k+5C0CHwYbpQYW literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rip/symbol_feature.test b/docs/_style/prism-master/tests/languages/rip/symbol_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5067d43e9996833d7518df8923d0dc5950908d99 GIT binary patch literal 242 zcmcCY%g^WKvI3GxiA5$x5N14(&CA8hrAr0?>5Jy&;*3@*uFOr!&r#A*Py!jR6sv

        +I736(c} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/roboconf/comment_feature.test b/docs/_style/prism-master/tests/languages/roboconf/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..09493ab5819ca0cc339c458ff65a11a56142c210 GIT binary patch literal 201 zcmY%9Q4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE>=j(FH(S7S*!;DoBAp{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/roboconf/component_feature.test b/docs/_style/prism-master/tests/languages/roboconf/component_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0e934863e43d5a01014c02445e44b66cf62773d8 GIT binary patch literal 362 zcmbV{F%H5o3`J)wEI)vC@R4>fIq75EAWDkI&!V|F>dY&u30A zPB_g9o);p!K=ScQkAX;v2LC=oMCl^L36|e!Bv^wsX^sd(GP@4|lFAg_Tf$<4%nkws#BY==3 zIq^$ThuZWbIT@|AOi7oU)bf2t{cE} JfN%J4`T(gvb>RR2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/roboconf/optional_feature.test b/docs/_style/prism-master/tests/languages/roboconf/optional_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bf3e090666372d5a24ec61834a307a2d3f0fa976 GIT binary patch literal 188 zcmdPMFDS{(&r8hFaYie_j8f83P||>LG?ij`xqyg#!<{oyle3Ez R((;QGV1_EBY-!SK1Rr39F>Z?wy_jw-@Z0YrnJx>O~)M{+zD@jaboDT zqH9h?xT(nELcmh>Ads_!2BZ`}vP>FU};sOh@=m%=19TB@xG+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/roboconf/wildcard_feature.test b/docs/_style/prism-master/tests/languages/roboconf/wildcard_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e08e18d5208c4d21a81970410f81825377405d4d GIT binary patch literal 229 zcmd1FPfXEGO3X>jOHS2IOv*{s)8ggg<Q4a&aoHrl-E0t&Fq$DR6rGNyrlwx_gfQWntIA^3LXBR7^V+45QW#Z&i(^$y&&yw{|TzqJ+)yo0pc7 zPoqoNGF5ZfdYMz_4>R$iesraUBHzL8+#a=rqA{FR??$_hk~D!rv>XcK(se1JnrA;Xh2TaGJZ_0uW@nu5n zTDB3fzdE9Ap{@vqIwLql-v3rI0*(&GKr|Qy!NEA5-)pZnDER6uyb_&;adh5@_{EB7 z$6!swlT}BQf_G7L^fIQ=+XyGGk4Pu;qj=v8h^6L0_@-G#^wTQd|&tXixi+9EY<@65)oYv literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ruby/constant_feature.test b/docs/_style/prism-master/tests/languages/ruby/constant_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..220cf7463ce7f66fe65be1499721a80764f9b617 GIT binary patch literal 330 zcmZ?E&reD$;^lJl_m6jS42m}~05>6J`l5NcIHQ%4^Ye;J z67x!wbQF}_z;-Id>R`&iU4c~=tDwI>Herz4v5QA3D#h}00TKCLa?VIi&MsC+%P&%Z I`KwqD02roBY5)KL literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ruby/issue1336.test b/docs/_style/prism-master/tests/languages/ruby/issue1336.test new file mode 100644 index 0000000000000000000000000000000000000000..431bdf2ee62000f415d26c0e54aeeb526f7fc378 GIT binary patch literal 312 zcmbV{u?oUK42EY9?j6FpRzV65HwyX!j-|udo_NqE(&W&-y}3?;P7NW$m;66}{DsIG z9p0b9WQ{eu6;*VNHJirqJl<$<6*#Y^uB{f@5wZl7!oTn{V<$OCB3u-D4vqUme@ry1 vYpu~1|c?FpoNf0swY+(JNSptx1U$;){Hds7C@_ICtp=u zl~mPp!MkFOi?cPiclQsE*1X6sAF*X|2Wuu*1Z!}m+*mWq{|M9-Q?^DuG~R2PTYxRfh7eIcDpnt`BwVTInp2gj zYNR#$cUR%PwwK^1YqIkiF^lGq<*j**lch|p?=>IwwziB=MFN7BwhB(IivZOnrwvKV!re>{>&sf<~*d# z(x;Xf`WQ2gxu&=eI<@HJQv;-cb7%uGs8}$p>Or{53B}MC#vwQacLkzcC5alKQG}~# iQ4AF$yvy47WDWk`*R~&vOouW+-Uk=La2C08ZOv~o!O~a& literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ruby/method_definition_feature.test b/docs/_style/prism-master/tests/languages/ruby/method_definition_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ee8b5ec530e09e711866a6bf4bb589b4415e0694 GIT binary patch literal 1643 zcmcIlO>4t2488kT2=CH`b%P!YgTYQa3!dV)&F%mjSeIF~GslHJ&TOy~~LvoTsw?Pjr5|l-^WjcbMDP69^ zp+nD+A++lW5q_8!Y}2|r)7WK+Yo6(20BLOL4+#(h|3{vqOEpTBE7=<+jic)>TH-pX z@$wX&$9a26)_KOoIOCM=5tEW01<&pYuDT9GN|V`;cx4)2(KT_jWIEC~MvnK!UcAeC zqoilr@0AU+?vh^eH;JqWxnkzc33+aifAwG*W+03!_t%Kyst2YK8u8h*_BB`mS6U-C H?T-8b?djC& literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ruby/regex_feature.test b/docs/_style/prism-master/tests/languages/ruby/regex_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0dee02d34d0d116e8614f6e2d9557e23b91bcf10 GIT binary patch literal 1209 zcmd6m!EVAZ42I7{$~&}1NJDhw&=Uf&1CNpAP*`BmXj5gaG^y&lV>b#TTTh%?MQZf* zxAWVLg*;oU-o>$S;$lk9gv6~98Sd7?Y&l!F6eVv+=Uu*8<$X%*C1y)vUCer7l>Q-B z5!=OV&lzX0PdpSSIh#pv`l5dzOF;N??)8AeLSn&C9`Zy&-BzcjEgEAh3eNtku?3^j z?O&;c-#%e338reatL-&pC!=WOLtjm4@Dm+4?|d5MRa+iC%s2i-TWeP|b`Y*SdJx?M zql7(RgJ%khgB0);)lL?}Z<~b0<*3DQizZa(aH%I@QH@#*Gd2l}d$hJ4H z=d*wEfq$?sinOv;t7unM{uF+?$Z54+)m<9~kijly3Mq(ucQZYk#j9xzHfi-Z8MICy zej3Cxh|hz#g*Y3;ImB;+cnNVr1rw^6P|1X9CR8-0qA?YXsc1|^V=9_b(Ugj&R5Ycc zDHUy~XhTICD%w!dhKOqQe8=G*f2P$#W{;=3C_nAoWHyRyp3iBkv(ApShj})ZaDFb` z9^;&=UFj#}?ZJJQag}g^FmXroTAA*Ef9@xs1*X0!vqgE@)<4yLbt4WkZ~UH1#bEmzS0Pd{*apY7 zlT-}0!*RtY6@zVYT&GIKU|Sql*HSUq7RNn-R1CJoaVH}cgKcr#e@Vq)TO4tCNX1}V9IGKxG1wNz8je&9w#BjXBo%{gajcg~#b8?;t9(*1 q*cQjyq*RQH#kGQ(-2H{q_pj~8_tEUC+FJ2zML#g{+Zk0x~h literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ruby/symbol_feature.test b/docs/_style/prism-master/tests/languages/ruby/symbol_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6a517580569faf0c4bc8230b979dade212099959 GIT binary patch literal 258 zcmcDD=jF0W%g+arPL4tLAS$sc-o!|emy4H6mka>X7tPDX8Ld=YnVXcKqokvtWEHOz qtAj2Ev=oad$Pw6tA&ydt<>dk*@?GYfk(!)ctdN#pqyTYVu^s?9zc=&% literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/ruby/variable_feature.test b/docs/_style/prism-master/tests/languages/ruby/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3b7b7c748668ca272ad11ac0f3b36c93eb073348 GIT binary patch literal 398 zcmY$1=jBpK%g+arPL4tLAS$sc-o!|emy4In0VwGJmUMtfIv`2vk^w-5M)PuUMk|#i z7G)+T<)kXS1iao ZWQ2k)NS|{?YI1h5LRx;20xT?w^#Gc5>6J`l5NcIHQ#kOG=6|lS)fc om2?!8lp!`L#p+;@!?0WlXgx(PaL!0g&MsC+%P&%ZJEK?+0ILN#TmS$7 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rust/char_feature.test b/docs/_style/prism-master/tests/languages/rust/char_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9a1948411ad5d988016930422e263ed4e54d9ecd GIT binary patch literal 190 zcmY#SROjVVf3Rc+kmBXiB?Ex;Me}lTMk^&}Bo-;@C@85Xsw>6npbCL(P>SW{0wVIQ Uan49h&MsC+%P&#@*;T9u01gu;FaQ7m literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rust/closure-params_feature.test b/docs/_style/prism-master/tests/languages/rust/closure-params_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..83bf90004c2dc9b76fbf6dd28a554c05816514b5 GIT binary patch literal 580 zcmb=auu{m(E74J?1k*JNx^^JGLUk=KS4|C=;^opM1MqV3az*oUaYid8=j0cc7NzPI zBo-y+7Axr}fP{hK1*Lh(C8dcanfZA@L8Tg{SRIgrQiT$j#!z4dQvh-x4mCP(HI+D2 z5Mv6^DL|LRg587R3|%{j9ZKME0(l4BC)Gd&n4+~{ZRCUqh6Q-thtqamE}*Z-k4)!` U)a2}9g|z%41!#;aKw?x609XZ-S^xk5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rust/comment_feature.test b/docs/_style/prism-master/tests/languages/rust/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..936702840ee4d102924d9565135d4298bf309be2 GIT binary patch literal 285 zcmdPb=jGDZS4hjxPf9ETGPSfo0$LyeUM`@J0*KGcrAr0?>5Jy&;*3^G&d<$F%_~vT zQBcy?SBlla6ofhen;g(ZScO4aVv1t&AdXau<>dk*@?Gkjk(!)c3^cSz0qWdhJpi^D BKNJ7} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rust/function_feature.test b/docs/_style/prism-master/tests/languages/rust/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..63fcc8b94dc4a2c25041b33195ab49aec2f8ddf3 GIT binary patch literal 511 zcmYex&sWgkr2}0YD}LjpB?}N-NDv zF3HT#Q_@jT0=hvdR!1RPsQ@Hcng|ou0E%K$40I+*>Y>iYqX(NUig?sxdI0Dq>>8qR wcmfudxNPC&iUoxh8G)<|(&wC!nw(v%kd|Mh01N73g~YrRh1|sCqWoe#0JL6*umAu6 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rust/issue1339.test b/docs/_style/prism-master/tests/languages/rust/issue1339.test new file mode 100644 index 0000000000000000000000000000000000000000..1dd3208f5971cf9ec34bdc1fe9f4acd364b95f49 GIT binary patch literal 1145 zcmcIj!D_-l5Ir}Le;B5q1`?rqsu)4+(NjIHp)7GzgK;S8W+oL}X;`k;Z>#0&%Vq|Hq0&_6DUkXr-BX!B32LhdjGG)a`kBs4hQsz>`zusrcp zpG*^iTkh=2BPdEHsTR_L0|yp)#&mvU5#?Oi&aXk03y#&2Bo6N_iC|srE;#8@kGsIS zi+lB%ndJQ4HoV2j7M(_mUMFlgobf9e?X0Uho88Wx);$BMBQ&EH4s2C0s*?SzQ@1Pq z##mK>c00Ru!zy*Py4|GzN**{rnkL16xb$noYn7I(XQ$r6FZPPf+y5X}dzK!QSq%wp i{%|`W1vv-FXc3uvEq1^@>9H)B8pDP$czl{ppU2x5OGxX?+ZaJ9kIOlT-!QnPN>i( zI?1Gv;y@=e6G--Cz0`nCrf?7ixhL&PfZTnrXBUrRH z_V+tecPZxHuYA=n^6+6Iyv>u?3V;=5QW!8;tnIP(_W%S=(5TJ+e3qb!Q#h>d-~4cbkPi}MzNiI89%_xdog1! z$xH=|cV8h|Fj=b+VT^Ye6PhbbG325ZU5X18VM?YT%n{~2XoWr_V5ke=yh+_HLb0X!D)F|JxIrc4)D;!MYeuv8i)TAQ)ZG-8+#2&d#`)M`y`gSC!y zB!q-ktAwSd0NH&b)#qZ0o3zU4Eqw5a)>Ua;xvoevpf3otQdgktD}AI>B$XOm3{XQh z7WqPIGt^8&ZZ4HdYq(vIhP+*zC%8NGvsPNY{^P~>eQNdcIb3nS#WW8m7|de>hVu#j z{%~xFOh1|6gNl>lLK9ca^tBw#G zP1KX|IxI!^oGWp2az}=(Evnh-0v^_vn4_R0%-JA{TUJO)vC)OGx9}D& zqWlP(9_H|oyqV?M@Q-v7)h(?$l+ugnvr3Dz;j9(C|DS2^7o4t{lb-%XJUqfJzx@EA CqVV|u literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rust/lifetime-annotation_feature.test b/docs/_style/prism-master/tests/languages/rust/lifetime-annotation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..02c813debc62055df6c2efc56cd846ee0250ffaa GIT binary patch literal 308 zcmY#S%g^WKQcvXNvQba8aYifUWTvH-Wag&oCg$bkmn4>C=I1Ht zC@84|tx<~A!K)+@rXar{wJ5P9zX+t!1}Lb2+gOkupfs`$JEd4&E+8V`C(aqE$=SsU QY57G8Fz+ZJyi=?P04=Xg6aWAK literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rust/macro-rules_feature.test b/docs/_style/prism-master/tests/languages/rust/macro-rules_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9d30051c3a7bbfdbd7916ec066c71ebf3d9d24af GIT binary patch literal 265 zcmYex&sXH-O3TlWPf9F8u;NXOfE->fT`~YjUofnsY{Ka(1yoT7HoN*nJ9M_vrxuTdY4b literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/rust/number_feature.test b/docs/_style/prism-master/tests/languages/rust/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..61d6e8a5e7bdb21a154bbde6b6bb0d676d22c1b8 GIT binary patch literal 816 zcmbV~(F%hg6o#)S_zuzSD$=ZNw;S6_#E@#nVr)Sn?D2QBrIB7GLFb$=e>>+l{hq4_ zzg3OEDD4l7a6&T(>l79zurOkjLxNG35XMQ)PY?>G^86YffhUF7Gx!kp8952S2zDy5 zl9Cj&YNtXYEHkRLJN?%3vVfERCv;OxTZLIdTa{xJZ&+$yiP5eMKk{9RA&i31{(N|k z)@+`Q2ieA4IL*$jo0dIDFi%kr!>#`(qrv)@7hbp<7v6ZFZ3(<``P3D7=OWV>c9<%4BhCi(8e6QMhqxmTkb@LnM`nj$B*Su?xL-)c@Oje%!9l1@~#j_HK1O3u&CP0cG& z(os-?+oBY!1C&#WDT>JhS`Ukbw|)E5-71 X0TKC*cg{#n&MpQ9OOXQ92gP~-bn;2` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sas/datalines_feature.test b/docs/_style/prism-master/tests/languages/sas/datalines_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..48c32cf505faa2e59d7950640ee34003af6507d6 GIT binary patch literal 701 zcmb`E!3x4K42I7Z`VOJzDQ!2cWk(-Fcc|M$nXFPbM4#TII`JSXVxcYMYx1Z0E7!UG zuC0$bXUf_XbTU^KRHC$mOlwH3f>{c79(jg5Gluv~!cE!>s`0=Ezw*Q z38jctShepbaDVY;2J}M2a<6nyrifynI*v2MzCLvOG~z!AM~l7^CPDP@c3r-Z=d2*Z Ue(-rrd5djbHb>a_01vk(SBl=O-2eap literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sas/datetime_feature.test b/docs/_style/prism-master/tests/languages/sas/datetime_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..86f8d4801ada576125c8d7c0ef96dd605ed2906e GIT binary patch literal 316 zcmY#4%u38NGB7k&PvPZKx3n@cwKB9U$W<=^@(eA&at6j$Kyh;`1JlG@^%S54FPAPE z0HiOPmy0u6DJ8KawInk)RY^xdNgZLoQmhW9G?I(3%42t|%wq X{2~RAYjqSr?k!eG%u50D!8|D dSY9q5BHwGy8L7$H#h|cLNX*Gmfcmjm4*;IUT7v)p literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sas/number_feature.test b/docs/_style/prism-master/tests/languages/sas/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cf55129e9cfe89f89080e0448cf07e8f4515bf60 GIT binary patch literal 354 zcmXpp;^i{dGc++YwFEJYQVk7wxeWA7QgtnOxeWD8T(yA;oDx&q5|dLac)57Fbjbi9 zebKyJoY6{orMXF|MM^pfN+w21u{vmCP={cX067d(9O6(+afrh)#bF*%isj`3BJzFX loRONGU96CnU!;(dnw*)Nn4^%Gm!go7T9F9jL%dq72LNz3PkaCX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sas/operator_feature.test b/docs/_style/prism-master/tests/languages/sas/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7554862e8da60a4765383f5588df7400408c7bef GIT binary patch literal 928 zcmbV~F>b>!3`OS>;2pj+WN?z^0;bm1mjfP9WkO6+OqB`INYPX##Jozg z{x8jSQgvQotro0^UPB<=m{Dj*<-7v4k6V!d literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sass/atrule-line_feature.test b/docs/_style/prism-master/tests/languages/sass/atrule-line_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3f2a9669d3d4293586ff5d64ce31751840e1a40f GIT binary patch literal 543 zcmZ?B&8*1GQ%K9tPf9G}<#NbPP037D(8$fq(=E?TDao)>Ff%YHsLw@$- VXQU=)7X!nzNFlLA7ZeS}dH@u%h5i5l literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sass/comment_feature.test b/docs/_style/prism-master/tests/languages/sass/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c8e693e94bb643fe51d7337fb92013de7763d54a GIT binary patch literal 348 zcmdPb=jGDZS4hjxPf9ETGPOV$#O3AU1d9M^xPSs!gcC?r@pAEU>5>6J`l5kmMk^)f z=jNv7l_=>bDCz4f#p+-RLS2PTP7A9bNJC6fOkPY0(4hoWfcyec3-XRqEH4)jk?$wx SjMU`pVxR+x6rdg})&l@(#!)!{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sass/property-line_feature.test b/docs/_style/prism-master/tests/languages/sass/property-line_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..499f223a974983efdc1c168604c0ff7a8c8eeebf GIT binary patch literal 968 zcmbVK!A`?43_Vk+|6mNaEz=O)*UQtH&3>P6+GHnn$;Dbyvrg^h7D6= zIeeG1+Z7mO`=-?(UOzv8*U8NM5Krq~NN9MqWJ zOtQ<}(FDvdBl6d>386W)u2_2EzNh^^4>!xl64d`$A6*f>e#<{sc}m?PA(voH*&R2< pF~gBZhLS%Mh=tTDHULVphc(kAdU<`spI>eH)G#MG;Iah42neOqi1)iEM6$y8l`h|ESx$~|xYJ{$Fn LV10n&52DxsosVxB literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sass/variable-line_feature.test b/docs/_style/prism-master/tests/languages/sass/variable-line_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a7f62ffcfbd6fce4120660f833e00294ce77d10f GIT binary patch literal 545 zcmbVJ%MOAt5IozY|FEgO0p7gy>Sq`Z1xjc{N=nfLWle=CzZ5q#tKrpYEVM#g`{x%uyeVh9lG-^TjbBAe_mCjgCL^C=$3grV!{}i=c l@xko7sBnz1h!R}5{w#+|<);oxV_|Xvh01G*R`JWb-2>L5hu;7I literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scala/builtin_feature.test b/docs/_style/prism-master/tests/languages/scala/builtin_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..50e42b02bb405c24c033f2f088c4ecb38239f9c4 GIT binary patch literal 545 zcmbV|u?oU45Qb+1d50r&^&M2>Jao3vf@IyEFDd|ZzEzmh`d z-*E8+SB#I+VjwBI-XLpB`Eau=wu}U%rr+6951J literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scala/keyword_feature.test b/docs/_style/prism-master/tests/languages/scala/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c17e96050ed060ea3ece72830ff495c5242ab5d9 GIT binary patch literal 1291 zcmbW1L2kk@5JlIuDZ^&Z0M3vJRWOi1Kfgwfcu`Q$6P$t1qpNFlKVTOdqV z8X%(a*lHEgcMz{55~SWmUMS33@n7J3CR!jZBf@07R+Ax^d*=~mmwH$ndN$B%`@}2n zJ8JcEY|gmMf!byR&2HO#Y~TUy4~(+-QF$M-(C497AWy6KJi3%q5o$gq$$~)n6f2&$ zV-@mp%ysIQiVtT%s@Gfy?(z@*KcahZq`Cx2;2f-qO-Y&%bMhqPBnr4Dv*LS?s@QRh zuH&CA6Zt&~@qo0M9lq@$o@0CR~_tPX}0*kza!CPtWIP?uwo vNHxI}1p5qA80b?>L9ov;g~1`A6wAv6MC1pDb4F@%cCkWQevtwsOp5gY%{E(8 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scala/string_feature.test b/docs/_style/prism-master/tests/languages/scala/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..978b1c20638066df2b68b4aa4fe210a98a9c1c8a GIT binary patch literal 606 zcmbVJK?=hl5Ik4#56fPJkTfau2Yp612Wyk2lqjhEf7LWJv_eZnm)#j>)lo>nnV?70 z91kheDf$pOLkw#$gyt-5$RiSJG@L~s(F;)5pv*M&+ONpL7^sVdfTD)Ekw`?U(m~aR z5wFv7wrkOOd(&4e0fiLUm7gHJo|mO`Ug0w^A>nrqiVo52QJ#;w5mWVlkS4i-_M hl{h4TPEd;F(nw(v%kd|Mh0C7yQ9speQHD3S# literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scheme/boolean_feature.test b/docs/_style/prism-master/tests/languages/scheme/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6c10017e3f42c8ea9b9a4f3e761e3b4f893bc388 GIT binary patch literal 191 zcmY!`;pI|JaYid8<>%+5Cgv&WC@3kHD8=ev2&O5;@^S$Y`4%~6 Sq$Xzr%VyXg;4IXCy+!^~W=GS*kK-jz5&Q>u)=wg(N-q^6sN#u&PpqQc72hHH?nJpoUREXF!*B*av`ZsA_T2{w C=QDHw literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scheme/character_feature.test b/docs/_style/prism-master/tests/languages/scheme/character_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..14e40cdbdeae91423d0d95e7204d8e2a14480ef2 GIT binary patch literal 302 zcmY$6N#s(FDK1D%P6g7X1_maEK>FNnAfd^{rAr3j;)>?tj8;m{NGwWBE=es?(os-S zj)_TBiq*j;4z?PH9N0NHQ4a&bm0CFkenrskC>=_n{!E5+(yh(Rq&PYwpE(V%bqyV+DSPuaBk}BH( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scheme/function_feature.test b/docs/_style/prism-master/tests/languages/scheme/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f7c6547b586378c660abad4ec6e3aad59f4b46cb GIT binary patch literal 758 zcmbtS%L;=q5Ii@Kf7s@vpau0@d+29`9;_x*s!8zy{rv74OKFNwGz7xVCNrCz4Rmva z1k#YRKsRk|Acc$q^(@Na+pc&h%>gZPD1E~W%vJla~MX(hMtRLNMtBh;%g3kKtzy0#* pH&;DbzxC_$*bt4N*+CzF+(*MW!@Yi}&No%wd*tunJwyG0vlq9a&BFiy literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scheme/issue1331.test b/docs/_style/prism-master/tests/languages/scheme/issue1331.test new file mode 100644 index 0000000000000000000000000000000000000000..b8026d9328d1e6f0a202de35c9b9efdf5179804d GIT binary patch literal 386 zcmbu5O%8%E5QWz^=^b9`0!YxLZ~zaXJHn!9kx8&6bb5aaEZpEmCz;JRZ~k6B8JaK1 za*e7eq>$qDLo9ub6o*Dl(cL*3Cht@Um8-Tyqq;~V(@NHTiSDVhO}#(E#aCzNWvJd{ zA5iV~72l{7?LUv+Y~TPM45OzxFt$VBdl-zA00lVD80a~SDcL??LMrx)ImwwbuGZqH I>sm|k2B02eIsgCw literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scheme/keyword_feature.test b/docs/_style/prism-master/tests/languages/scheme/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1abc8282a7809ffbe62ac7833b409d8606a4a677 GIT binary patch literal 2131 zcmb`IOK!s;5Qf)9;tsA?NfdgC9>dCFjK?Vou@fF`-P4y>8(OK0X6y~azK{FrRB6#Y#=@%ytHjmM zE{%T&dGo?}o%Y9>xZ~rDvyQWeuD$q4IuB0GQ@d~4O?%ikU34vSy2LBhB3`LJ@k&*RS879oQd{EH+L54? h1Y=223UmT57Z8!3G@LV1le3Ez((;QGU@4(k4*;0hs0jc7 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scheme/string_feature.test b/docs/_style/prism-master/tests/languages/scheme/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..736942437f086946e8d4bc30b21da92a047fa8ab GIT binary patch literal 369 zcmbV{K@Ng25JlHEnLA8o10?7rJO;2R&?-SYrY#}d-f5~aMpv|5OkVRR?-PL{%Pn!Q zz05^i{A@N*MOByR@?ujtz|-*!Ly%}K#@4Hu;L}wZ-4S1 z%XR2NkYY9;P+K^0Hv84v*w^rp-xVuoDWte?QeT?^?(M+wj{wL_^+Kds4bN)SPMb)+ zN;B00l6Ds@4#c9$j#RrS#XyF-=zMBd#iD9&#c^-DxW}lSP2_2!M(;-Q@tCRnm8VcW zK?n32zfCq#HZ_$V2CbeI&Z=eG#b2Wys7s;VXA4sBHl%prVyeWgd+L4y?3{=7W&`DR ifKU1p2eX8)o*-(oB?#mX6u?!TBF{L+3aTw9MN21u4@7O@m{-W1U$|ClwtD0)g^nHgo6=P$;YT?R+ tTkN%XlNOy^@FhB+%5{}b-u=**JDHimh6n`;Dn1-sIKMZ;^opM1Az2J^Kx-UD z=_r7>Kt7bGqTvD1?l9`_eRI8+ckSNM8NG&R<1eu@&ccM}(4vkh& zjY<$dC}B5VQz;f`EyRpyB{aLM!A2+m0ftm9NFNZ9A1KZlsma;J3TgR83W+7Upui~B F0|0$)U4#Gt literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scss/boolean_feature.test b/docs/_style/prism-master/tests/languages/scss/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4019c444f8b53c40620226d2914ad19fd46effee GIT binary patch literal 201 zcmXRZDoy3(N=wWs22#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H<8xk|A*=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040MAk^8UO$Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scss/comment_feature.test b/docs/_style/prism-master/tests/languages/scss/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..90eb0bfb7c76ff933d3ca85bb1e5323931b026f2 GIT binary patch literal 287 zcmdPb=jGDZS4hjxPf9ETGPSfo0$LyeUM`@J0*DWSx?}*5zGz-9&S<6N{M_8syb>iH z1toobrC1$IL8ue3$pPJjRT!itrYI&4;!LGjUM?Ua-=)qOsma;JKtqcZpw2DU0|4An BKPvzL literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scss/keyword_feature.test b/docs/_style/prism-master/tests/languages/scss/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..90ca11d5192034b48a72492e61ecd32f18e896e1 GIT binary patch literal 736 zcmbV~K@P$o5JlHE=^ZA-r7nyY;2y?BZ3jEC1%qJq_Ri3DVZe>7$eZ~C{EsFB8ixnM zx~VH|oM+gyJ?N>Y0U6PFcRnzE1+*Q54lnV_^~PJ!BfZE$N^Sqg65Xk;HYat%_vC!1cAzvFb>6`@TV7f&FwKVW zO$*IzO-_?lr5Uq#xnTCPq)6uG0x>(M$^6okC5>FMrc)BlapjsNz9jkKQo_&1Q*#+m cBG^*l1POh{inCXl<;!naTaK!(&i{Xm53PC2;Q#;t literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scss/null_feature.test b/docs/_style/prism-master/tests/languages/scss/null_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1283944abea7feb34e5df0392baf255296e3c3e2 GIT binary patch literal 163 zcmc~R&B@{A;^opM1Az2J^Kx-UE9C)AQPNR>(6PK+Kt#Tg&Kar6*~JQJ`9%sKbM*k) Cf*@`H literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scss/operator_feature.test b/docs/_style/prism-master/tests/languages/scss/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..54f97131c4a8ba5e6c7a6c53086960217a5325da GIT binary patch literal 1101 zcmbtTK?=e!5Ih^mAGQH6)+$JEw!Qd_>LF@GQ4&eh|GSA>sG`{CDGJ7sLW)+3 zi7G+Op;hi~ybjLeLltU=H>}d&-rGayb+|YiXKS2A+SYIF2Wrlz&iK?NpE~7J>zdEa z{@_-8+v*S7hHu;aw#A)l)!w1lbD>Ek)M;2TBM|-pail4 pXs%MM4lY@c1MoY;sfyLGYE%LS0s{_lwx8Ce|K95f-y*JNJ_UmJKdd$@*)wr zRQJM~R$oq>MaophCL(NfzLXEqakh(mrZyTWwtFMueK#O_s#CS$mO^>a#};dp&V$BZ zLiU_-7XPt4E+ys^YHMn=?g4*!%w!Fq`EVzl*Sq%~*i5*T qZ?H{JYBbFExr|~?wpyoK8li`bGy48F;rWK@-iWKQVsv7O&G7}d67Wm_ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scss/selector_feature.test b/docs/_style/prism-master/tests/languages/scss/selector_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cb305dfbd6726de35313dbe3138947e0067fcaf0 GIT binary patch literal 860 zcmcIi%MOAt5IozY|IjSzN&En>eg@&Nlr<2Ml2V8X;ot4@@DaTzv4?guo1JEM236Nf zQSDTkw?i46j7iX{y?+N_d&o>ncC5oXPl?++6=+jBx;lj$e_OiH2zTq63ewKl{*chg z*b$c^{NYF;MI^;4f|(R{Dgsmx$6QoRsa=CEH>Gbt2cOX1qwgG(>g7Z)J6lZWHKC=_ zv79Z-fyseCFyH-L%ngq;3EjK_c!0TyM%gb9m^rS{fk|Sq2wn8&$M8{UDr@ zfRr-wdxI`%P|nwZ2`uxTY@-iul)KP5yZ}XbMokV|o2+2>sg}<3+2@4g)!53Bmd>67 gzB>3cJ-v&s=lHJ9nf&Ke`y-a8Uev~lr*j`a0D(Gf$p8QV literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/scss/url_feature.test b/docs/_style/prism-master/tests/languages/scss/url_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..42e38707353f973b91bbd06209f7610c772510f6 GIT binary patch literal 365 zcmXRd%F$3y%g@&<$V*q(|%wq{33Nr^=eRy>%cTn!Sf<>i7fK+HK1DoZTN zOiap2Rnk#V0$HXMtAkY>WH&B3kW;Y9L7k6V3hW`=(qJzt#qx3i5&8af&PYwpE>=j( LFH(Scwpb4U#JyeQ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smalltalk/block-arguments_feature.test b/docs/_style/prism-master/tests/languages/smalltalk/block-arguments_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9de3b3eaa231814c50afd826c3d3970278104feb GIT binary patch literal 446 zcmbVIK@P$o5ImQJKWsR+K7gywARHEgN?O5C@YKhbVkHp|#_nxrXJ;lOfLmB7k(3DF z2wd$OCBuQCB{M=} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smalltalk/character_feature.test b/docs/_style/prism-master/tests/languages/smalltalk/character_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..096cf713b49faa1ea91e0a08d0c7c6cc0cd8b364 GIT binary patch literal 251 zcmY#MQ4a&bm0C1)fSB_@}o7Aff{D5)eW#p+-YHo-2e fhg~>MDVCQDh{$)Eb4F@%cCkWQevty)eZ_hJS9djq literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smalltalk/comment_feature.test b/docs/_style/prism-master/tests/languages/smalltalk/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..844e7ba3d16713ae02d9a76331e63d40eb19c335 GIT binary patch literal 237 zcmY#N%g;|rEK=g-QUbD+lz?nruB5~&pa3tIE*Su%FPfK&Gg>J*KQ}iuuS7{lK`91g wIMC=AC8by$tdcQ6H6R5=F?m4SLF#z9fQWoIIA^3LXBR7^e|)%}G-zE-gqcQpig!=jGz%(j^0c^hNV>aYid;r&gBd z7o{laC@AG+<|xJLD4>Xeti})oI|V3;ZUD$_7>dDe#SjI$T`88A3y8?~fOAG_a(1yo MT7HoN)EC8i08U^{NdN!< literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smalltalk/number_feature.test b/docs/_style/prism-master/tests/languages/smalltalk/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7fbdcb5638e4d16995f281db9be49071f62d9c53 GIT binary patch literal 378 zcmXpp;^i{dGc++YwFEL!EqJ*M^o&wzt9AoL#JtmS3a*@p7>q0OIpdi2wiq literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smalltalk/operator_feature.test b/docs/_style/prism-master/tests/languages/smalltalk/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..363789379647b87df37e2a35f8ff34ee6f3e6497 GIT binary patch literal 658 zcmbV~%?g7s5QNWN*moFn@Sw4|ixHuZ;SWf$6e?J>N6E7{9(pLdCzmDce#{Jnr1VT4 zKAyoN1f~jATx!&@ISeT41$1-2=q2LJ#7 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smalltalk/string_feature.test b/docs/_style/prism-master/tests/languages/smalltalk/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cd832ddda175898d5da2c0ab9be5d429bee5c817 GIT binary patch literal 228 zcmY#S%g;|rEK=v?QU|is)q!kYuB5~&pa3tIE*Su%FPfK&Gg_&*q$o2lT}ekl31l?L q5~WxjEHYqAV~S$(K-Mb7@^S$Y`F1;Jq$XzSW{0wVIg5>6J`l5NcIHQ$HQgaLPixP_} zb;}ZqG82<>Qj3*z6hLx7$%4|n4ZTD1}MTA zu6tEEsTHBKzwL@UXClQrv5I(r)?p%|pneL&ou2g4g@iCZk-Th)1UM2D)Tdb69cp3> z-&A*G>x@(l3Fnkr4x828aO2c-Zh0z)$@Y@ZfnoZjzx=AcE9bnE__x)-$C%Fl`1LNT Phh?=kjQq;7cfwvig`k!( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smarty/comment_feature.test b/docs/_style/prism-master/tests/languages/smarty/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..616ed1fc9d88a20a56696f537ea664de0cfef7f5 GIT binary patch literal 249 zcmb={(yHa*rrP$b59sG(wZiy+1$%D8Cq=A0kDgHC4n&H*Dt{PKO2_y7NnGMy8)>3!uefPQPh&<9f=*i3`Xh%pUshSUl#rDCV z&D6k&M;+hjhD`StoEu*@t5oEocCSAs(m&PBvsL3PR*lQesv1cB{hh}d)#iG?pD*2y LUI02#YU&>wW}V-e literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smarty/number_feature.test b/docs/_style/prism-master/tests/languages/smarty/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3f2101c8a4d9e40ed01ebe8b4f53b62b53321171 GIT binary patch literal 742 zcmb<6sBlV5aZ5~2t>xvaHZcN`#(IV(hNhNafmCx4WvXZ5s%s2l8R;3MY8x5=nY>)O zWB`!9XkISPXrg2b5Iq-(|1gbQ4sF>=rAOehKcniwAx;S7145vsrT=}$hK$E6TiUJKaI)V# zk7vfje)Ey1ASB#@h+zz30kav19aMD->Yyr!k1&C{0byVb zb-Y*2OY(!JJQ|8Y^vVl5>8Nj=%Q{I6(*SycYo9vS5h?}Z-4G;>F^9ObEg);LBF3hm zz;W7{GBn}3rLpCZ;do`nYvkdiFq0Ar9CyL%AZ=;NIypy?)-}YknZ@#5dlxuA?Kd0M z;A}V;f8nRsJr4(0&(W@wO?!;)K~Hg>s3I@(Ry7DkAJNPG8BX`rqRs0{qj^g3K{mOJ z3#DNp39d0V+1AF#9ia|6CYY1QggWE}!JIss5$v!Nf}LbOqZiEO#borYc`MqFM|Vr8 z6P&FbCqMYf8Nr-#Wha8A`=VgyZ1UtT4 zg1PV0iC~AlC-}$e;p}&y{djclt3;G)U&iN4bV3+khL>Y^xBlBE`i-L{{UrQK`|-%> zc_pjO^^q{XB9v>;zkRI9pWVaOv!5!wQ4Bn%%dw+a@R~y@2c4Z&2l=w;J`vVWx<}fN zr(4-a&iT8(d)cAv{R#mk6?t)-TaD09>VBD#*;~np?*9(n){mF92>7-tp`XnCLIVY? z|6u%5BXsIkY4FsufN#G}2>JF41r*r+!2LoYm8)n56c4k%1igP`}GGv+YojD literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smarty/smarty_in_markup_feature.test b/docs/_style/prism-master/tests/languages/smarty/smarty_in_markup_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a7c6043ba9d0ddd80de052ae2fcd8a3df0c7bf21 GIT binary patch literal 951 zcmcIjO>4t23_UmC|6s(9{b2XBFm~=`?PWM2Xi2)6=A$@HV3hv%S@xP@OkoYo7t4CG zBtJdJg&a2Lr$gIb;uYB}ip|FJ3cGF%4gurMvTV0~dE37~8_T&_#G=K7MfU`YW&$*R z!km-sAI$00H@WUn%eFBg5JNhruo;-{fUMLxg2)Y|26m``u12N5Z$*l-lC{*OqNL~F zqyh$15@~ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smarty/string_feature.test b/docs/_style/prism-master/tests/languages/smarty/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..31f6e79576b7fc9aad1fd4ad4043e7589185178b GIT binary patch literal 551 zcmbOe7dkQj)^%cV;O0O^b7<>HK1D$Y$TDydY` zQ2=p){FKz3%-qb9)FPmeQnga74n(-Pq$o2l9V8Y5gm7UL)wN2oK*h0OEo2!C^j8eT qw=}XsU7aQ_2So@pM(~@@%LNP}@?*?7BQ-g@SRpOHNC6Tb#d-kg$c4)Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/smarty/variable_feature.test b/docs/_style/prism-master/tests/languages/smarty/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c2db9b4683245f6ac172d0cfeeccefa56084ad5e GIT binary patch literal 1057 zcmc&z(F%ev6n$>6e~{Iq`Vc+$(l7KjMoe2ZvL?M?Z_BNc&o0CmH_wDzZANKi6_i&34AFNj(@iJpd;H;0o ReXD~?k43OEHt5nU;ycjv60QIM literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/soy/boolean_feature.test b/docs/_style/prism-master/tests/languages/soy/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9cc18f13d80a71b7e7e29de3115b9b7480fac853 GIT binary patch literal 525 zcmc(cy$*vQ6h`Ng@D7C8*4?#_VHi-aDG{aN$Hoxfy+8?#QxlgmanA?2hl_u5&1bR- zBRUBUvDyKtcZ~co7`ZeMIY!qLE8c4{y0p}&jaDS?Lot99v#_88qMowqgD2QtN)Hhx zixQ*?^7-ui4c*dP$E{FHyxEkXQ%V9)Fg~yFL-%^8EOckd;oq8R+CMxo3clxm0$EPg3(+4rBRqfEy5#RA*dN|%-_hoDq4tp`9p)^W? zu4Z7@W0DCEO7lLFGB#e9&V#Fs4&j1A8IQcuZlOkLkFkJhuUOr*TVHw}7#Ej_w*zY) zTjP-KOtn2PD8(VepVbX*lomI3VVcXaMNbKx6nK6Y)}iauaH*@)Kxtmm4&yLAlE*Ng zX(~U5Hv#5eO~)BegZUR-@1k;?@o|_gE(_g0O3SN+{AEE6>-7p~c}C-Y`wo8oz;Y8V P8_NcH80}IYE(q}r1US&+ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/soy/comment_feature.test b/docs/_style/prism-master/tests/languages/soy/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8abf7b85cb5c2b01c5ee040dbbf0cb6e259b5763 GIT binary patch literal 551 zcmbV|O$x#=5QWzc%pHbVhU#3PxDmWWl0{o9inM`L1U{MdR~!Tcjj+)?xhGeo zHFs_p`tcqLmascpYpWkbTGm8kCOZ2IPp*wOWADb4)Kt2AwyWr0ATxRXXj}Sd)mDLgU5xM literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/soy/function_feature.test b/docs/_style/prism-master/tests/languages/soy/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3ba6df056f178e140ab9d1ab090d5686490c791f GIT binary patch literal 1895 zcmb_dO>f&U3_UME{sUq7-~j0^Z7&5-u04>x zwNm|PtU|L9HTn=%23@{ZjV!XXrUk54aOsg!X-El3f)?@#vs5;_dy;5EkF->(-E2Mb zfUiFOTm95+P6hp{h5VyM9XjShLkm_naw9Cl4P3zzO5wUXcs{%M#Lw3~&S&2q6Qkaf zCHQCer@)GKj<0s1WS^{;UHBQ_UzIL=kV=lK8nv)0Cl%@(TSZ$>=^q z?j)``b|%rG%x{yUwcIckA>MmVICG+CwYtxUUmSN1pB5u0s$bJ2zr*Il(yvzB;-LK{ z$G(oKvju+Z@JOPOBV|Z(`al)$9E_Z(O7B1?XmcjvAv5Q7lP!<0+ds}YMfG@jY@=NH zrIeg6|0kv1!+D<3q1`ZWSimcejgprP!EWOq5It|C{DWoXm~QV?)vnafXmY>~PG~S#fVUe(`S+a}2qjLm(xygo4mKW` z=f{9&n8|UaPV?DuW$5bg%A{bnXtXZiRx#?SnUvU9Gt232E#5Y~VZ9`+4VULZ(Ck>f zXImNyPmZ^pWR4!W^aywt4T3a)UBUR)Zs}3e8yjsnt9Qjh6hajXpo5)WLo@*B4k(Zn zT{&@(!g0go>G*hV!H58>Sj#QYA`(i_Y&vFGi~7F?tydHpg0>yD?Wb_{4qNG5{)o+& zHd^edV2WsYz#wwYh^lv-OqTXkS`&{{R(s2)qDE>)^Gk(7U5P%fUa)iR)eEGs?isXS zhSXcup?qn9uG(I8tKM&cl!WTriqmqXQV%eM?~MS_eD-k15B1*XvmfuJ)rWFfU>hD_ zYl#-u97N@@Tra(N&kvv4Y*4sbsVKe}eJa;5cugvIpqebGE(0ok%@McOZOhc=ftf9u zv4lNadLw{26T2}RR7&&!Wiae`7DQJONsS3>c@9{6HpgJkeQOs5=b3>o7&McC0Xew# zJhac=H3K>ZoJ_Ey$pD;$#T@85hYJfqJM#U_j9``IM?qM`T&7 za3YBlACIoAa)9z2p(Y%L>AN9Ozrfa6F9S@m4LKHgjN$9HEm=z!}*3gJCw{ z*9^!e$0ujI3`~7mk^wkl9EPMR1L46oqutCyW2nO8_40J zcs!RdD#MskPMj!axD%%c3HQVqQvN@2j!-z5IKz*rFEbWvCT>Hl9RWos9Ow=zZ4QzM zaH7v%lz33T8wSH(CO$c+fBo0o2BBnmWd&acyT+WlA+XXn@wM`W$BC1S>wlwK`K`*) gm`4dH%l_Mp^BGi1?=RcF?RdS%zY|Om9EAP(7lHelBLDyZ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/soy/literal_feature.test b/docs/_style/prism-master/tests/languages/soy/literal_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..926ca05cc224f7dc7ad89310f730adf0dcbdcbab GIT binary patch literal 1368 zcmcIk&5nXF5I#%7J2VqcMwb^rFMIJF&_jiyjiud`%EmOj`?l3W6+<>8l0fMEeDlpu zM>DF3#H`Z^7dv`7GxMrWr(PaMIynz=FV0HZqJrV3*?>+eAv)L^Q(B?qh^0Yu-;`Ee zmKsy53n4vBx9#%GbxAF0t+=6E$uPqgqwu!ky|V&J~Co6hM{M0r~F!g zFrEM5&ttCeX=p)kFnoTlyiixHsNlBx*&~w$n1KP?oSr#WO0GGs@430L8`5&h7PG6< zTE8*&#$%77?!l}49J{#~Ls-KnQZMwk;e71np1->ck4XvYkV9}7N6q}?ys63rfys_~ o$QUgDN4B_WR5&GR(`bKQhv4Z~y=R literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/soy/number_feature.test b/docs/_style/prism-master/tests/languages/soy/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3f852480fd0008cfce09661a32470cd1ac057c61 GIT binary patch literal 1264 zcmd6ny$*sf5XWapc!#E|Kmco0Hbi_0!cd_G!bc4s5kh!(TR=nx2Nvnn`(3a1zqEJF z17|n^cS;R_^i~v_3D_wb()OnrRTXtc4rF_rAzj(qvW8|=Uh8AOF&;7C1E6sx?m9{kKk0V2!hU99RMI aqMQw}4EV$g6C4Aa`XC?`e%pQX=E@6N8%2`< literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/soy/operator_feature.test b/docs/_style/prism-master/tests/languages/soy/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..b37cd5066ba4481d9269500f4203c46d53e5fe5d GIT binary patch literal 2544 zcmds3O>e?53_Y(B|G`8<;&Y{Z9Z(C0{S4qxpllV;pf+qni2ptZhTT>{Ok7s2hpN0h z+s}@JbKC?9o>x*1;n{~Vv|$Ji*r$?p%&r(<2VCfYA1(3ideF_AIWWQ%8RKhYT=qPS zrR^Okd&tU#tyUdqK&J*a`mRH-1{LT-3kG>&Br%7%A7^n`htbj#D)>?Y^C?-a2Oe!V zDOpbwk;sE+g8s%I%U~03LlwjbiKCb`FYr1ze9CyKL98CZAATJA^G%@bg)X+3T`hL| zXrcDL3T33NhBs_{wvf9Z_LV$G9uqylB#RjCJVE^u?0b8nCfW^(E|w>2WCo7N_jUGV8kGwTLskFZ|_ zs}P-o^$AM{YZ1!K0bvE&)U;?E?<6rhN^$1%VEhC1v6iXyy+G*82B}P|=W~>(IE>yj ld3wH;Oa&Qaw4Z*4Z^^QK_GilbOl BUZDU0 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/soy/property_feature.test b/docs/_style/prism-master/tests/languages/soy/property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2c43149e0d3b49f258072a7c7f3fe51c58df1fb7 GIT binary patch literal 1332 zcmcIk!EVAZ3_Y(>|G}~*ae@9p57T~OI~5LD>y?NmsgjfpA^v@FD4~;(5FmPL{9^0* z`8j*#T2Lgk)NP5{3>u*!SC{y)CipS7f!Uj_*K$iU7#uYq90=fxbC3lUAT&t*ZLAVr z8V$}HO9dYCY~Kqj6x2q0(jGQaHzlsU>LS>YhgU_;iIzsp)31-1C)Ibt6BMm6ZAYJ0 zf*8CByhKkWI&Wp|aZDSm-^X^&D5wNXmwW+5zluL`UOUHc(!E}O9kHv!YqUGDC@iK*`O5gk`{(&Ynsg@vCK ex@gus3#PsQMR;FRy>Sp;weWmJ$zbFw$rXQLX>ghV literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/soy/soy_in_markup_feature.test b/docs/_style/prism-master/tests/languages/soy/soy_in_markup_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bade0e21e3fa0ae0b05f70a66dea2cd28b2b6f75 GIT binary patch literal 1164 zcmbVLJ#T|B5S@d>f3QxBNu%y0OV?H%GF5<(3r?^Cc4Ql*2=U)*;}SwFqy#Vic=z${ z`7X?9vu}e+p1N>r&b}Aw4P_;kat9Ux^IEh)L2ypl>60|1?DSijribsJcfGa2k@L>? zd~dU08NbN)RuL$Cf;BSd=|$fzHOo|u73EBuKnTg&n5{t51#?R5gJZdeM8g)1K=SLD zAtxoRs3O8dZ2u!h&|pFFZ%K?H7;WGdd*abeBEP_WyO8_~Ddsa^rNoBe%9huE^jKdH zHn^;Nv=`VBbT`CykQhejPH6L)6X6D_4KORV<7MT(eYD#XCjIlButdxPY|~Bp$RRpk z-u(m(qC4(mozE5nv546?jXlW;#Toq{)z?EjuzK(qTHW`w!po=pqafK?q9YgRz^{lh NNppg}usGM3w?BDt8?XQX literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/soy/string_feature.test b/docs/_style/prism-master/tests/languages/soy/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..da1371a77e6dc230fcd2503d8a1802168ca5d7ba GIT binary patch literal 1040 zcmc&zT}#6-6n$Qy|KV~G@=^;^L=g5Q`U`w(`;fNj7S=W;N!3~U-@Qp^rvqV3#e~q_ zliZJ-b2Bt%4W%%}3ULgB;b1;01u5oSrwAeOK=(qt@io}XMFUU}2i z;trlR0*tVrD(JLq1hjpV3vECe7_K6?j^HMO+X$9RT4cp>JjOUuyfC;tV>rJg3>FC* zwZjP9KN+Q{Wh1T71mS>LG{IZ3dr`V{Al-Y0JFPmQt@9^OQ_LF<=2rPAs~I&`%XaM! zJ340gOU@B9N}2h@|5ck8G@T@+&m`*a75vP#QRwXhO&`Ow%;XvTO+eE6kZeK}HN) zOLbVBkFQ)CP(ia=iR%|Z(wtGy;`)&gLn-+1-%Q$;fvF#JKw*M~XxGQEzqLo_m4>BoB zp^f5VZTnfwQBk0;_4wt!!Qi?_-EzGAp%F0Z-#$+a!#d3F^)KX}71^-Ehg8(I0qCks zI>ya;uQ=>H^Q~$vI)UXhS7=LneKosB^0VRGb5-^=IS))97gT;m$sJR~NJp)}?{&>C z<-qy1yx9b|2!1x!1ldfnRIs+QJpl*oo!BV(=O+CM{Y@^Xi JDpX~s!%s;s3uyoV literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sql/boolean_feature.test b/docs/_style/prism-master/tests/languages/sql/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cc6bb4fdd68f209dad3a359376c83208996e9ddc GIT binary patch literal 230 zcmWFu3U%e>a&zdk*@*Uxvk(!)ctdN#pqyTkEu^s>yS1}&| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sql/comment_feature.test b/docs/_style/prism-master/tests/languages/sql/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e058dc2b6be702a8e95ee76ff73a14ed589922ae GIT binary patch literal 391 zcmb7AI|_g>44n<+4yD~nYYyQt)ImiNq!z08M`PT~Vjz&bm){F{PYC4Ak~6|M6vKIp z?1B;VB(Xzq5;6bZ5D;2~s9m&}ButEenM~t|-rARi&7w2DDITRGpAg#bRvi3ABW}FsteUwEmvtEZVR* z1^#`V>x#Khe51a<&&f`2iXdIpgo*H); zKG6f#i4W}4hV{4^4CdYj`OqB)ySl^V>VG(A9r|{I-6K2~->&^*7Q^%stLf+c2W+DC A_W%F@ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sql/keyword_feature.test b/docs/_style/prism-master/tests/languages/sql/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..67ea82ca65fcbde9b2113c3c670200cfeb5ca69c GIT binary patch literal 12265 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 BImQ40 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sql/operator_feature.test b/docs/_style/prism-master/tests/languages/sql/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ec5be04a3c0314635c586ace1c2602f49f9093b2 GIT binary patch literal 1020 zcmbW0!D_=W42I7W=pB?meQ2BY1sub=m=QLTk#t+3v`|XNV1v6GEU65DXcEkWi8%Sh6`;o*i!-f+Lrc;|;=HRUpj$;?4UC zq2%|eeDnxay+EiNMlC{7z9KaK!7rbA9RzLtQWY%?AIqpj$gX%|+zR1lm3CkIe*4|^ z>6Fq*x}MU1lu0y}XvRon%cX84(MF<^mMutKh)k32DD literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sql/string_feature.test b/docs/_style/prism-master/tests/languages/sql/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3dfeb990a9395811f48579239ec27bd81e56a1f4 GIT binary patch literal 463 zcmbtQF%H5o5Suya{t$V&rSJ)!(dz(+0z&FZ3I7)tE}a?{NERoSE!zMSW>eVtlmi=6 zU=b#9PAV5TxQ0ba3dSAGA3zntZJ72yoT?j{b|cCwKb9MY1oew)*!+4fjnvhU65&sw#0?UJisUux?bTdlTvYL!o(=)^SrGt}{Zy*x{rEvHzk9GKp1C~ztO literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/sql/variable_feature.test b/docs/_style/prism-master/tests/languages/sql/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8024a25e9605aaa5772dfd26675d78ba3d04517f GIT binary patch literal 448 zcmbV|Jqp7x429cT3RY_py#jr(@j&1vH7GYp{FS^8<^x> zW610EB7lhrd5i`^MqwxHIy+%6>^u9G=Ms0)L4E_{fm7;c1E(3kAwNTWZ#Y;igW)o$ z@jkGcrs9FB3(E8fnNZagYt>s*IaO5rR>Mu?RgrXJy}Ygk7XxyS@8#?7 zGl0?AD1&|@G*DLa${AP literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/atrule-declaration_feature.test b/docs/_style/prism-master/tests/languages/stylus/atrule-declaration_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d0e6505d5fc0dc43ba4ee78cd46a7b3ab987af90 GIT binary patch literal 763 zcmbVK!EVDK3_Uke{sH;aN~IsrQ>1-H%7GE5Lrp>iMA{Vf-)Do8YB_a591Qk*wx3<~ z*jOz_Z--bGmF-98qX3TqTlN;^^#b^uQhl34@o0{YQ)O9MO- zCT*~@y(J&>Qd24X05tcE+=e_sF*55&&Q0#?lACvC$-Rj=B??76boVdS#}}GM5Uuk< JN6D)dF2CDc(`x_# literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/boolean_feature.test b/docs/_style/prism-master/tests/languages/stylus/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..37eff87d7a5d48555a3dd00c09954aeda0ab8527 GIT binary patch literal 367 zcmbVIK@P$|2t2#V{(*3A{XtJYquB%7(%85W!&cuf)TZ%fEGII|FfariEc)aavUL-c zYHbYdfpT3R!>Pv?=}ftBJMvISX_@7Y4fybDY6udh=7Y+EjVS79x1(94Fu550N=!yh gtK=V-yzl$zvL>+E#9(&Ev$$M&xK)@$VSA&V-zi~OfB*mh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/comment_feature.test b/docs/_style/prism-master/tests/languages/stylus/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..90f974cf3d4be8b4026f9d9bd9d5d6f1196b273a GIT binary patch literal 285 zcmdPb($eSU($`W*%g^WKN=htJ0P{g&`XDi&2rm~emo6Cqq%WG6i!)j&IX^cyHLpZT zM?py+XrEH74yG{3vY4WnJctvpDZ#1_=18SjUM?Ua-=)qOsma;JKvxtgK%HBx2LP(F BKNJ7} literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/func_feature.test b/docs/_style/prism-master/tests/languages/stylus/func_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7f2c346774843c0fba5b340f6c1286067f51118b GIT binary patch literal 989 zcmb_byN-h}5UjDpKUiB4DWpqz)qMt{z+iMJ;I)jcB=_~VHdqReG+b!VdS)Nq84EOx zG`Xpo&W)KmrHu3ZF2$|0xp>963ebSRd*>T!%33r7@0517uum<>Hb^>8mW**;PM6 z+ZuZ`yhY3?Oj&;5^La(ek^)+%YB+Nr%#rO-(FrV?LwTMUn)udLk(A8bJ$6f#ZBkS8p OuZLccw=$W1y!-*!_79B! literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/hexcode_feature.test b/docs/_style/prism-master/tests/languages/stylus/hexcode_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d85fcb9189bdc3b5eb2f3de980fa1227bd3611bd GIT binary patch literal 647 zcmchUK?;K~5JlGwP`z@Lb3>Bg3{DT)Y9I*lWMVRp=Omolh2>bLuZ{& z#oidh8P1}}j*Bp7Op;{Lm*SM=IcJ>3D^Bp0ob5{Jyz8_dUU8+-DzApdwGfHW{ON`Y zeC7fv!@V0@9LDc!NI^!Eqt;J!l_mp(-+-htS^l0y%i1h!VzF7=gnEwSj5fL+`nA@0 V>xFS%5Gh5_o4c~&q3o#p!yB|jtp)%9 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/important_feature.test b/docs/_style/prism-master/tests/languages/stylus/important_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..225c1e05395922be98876004c70d19c85b1569b6 GIT binary patch literal 435 zcmbVJF%E+;44fM&e+ZtT4`8a)XCQ_sxGHKIN3N0D-#00NGBA-b=ex7-9C_l_Fb<{~ zpOIK>5Unow77T;A5t)jjj1;WbN~`9;%e+pjQwNbLBFm>4(0R)?>q2cZxIyy|xV#wj zeO<6AIGGj#v@iqk+Z@W!dO%Wu|2fbnjajJ!D?EAJUtq>Ex!k|H0mT-!RR>|ym UOxHWQ$1BCon>vh5O{^`PzdRRl)c^nh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/keyword_feature.test b/docs/_style/prism-master/tests/languages/stylus/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..51827751913dde1033fb478907d712c5dbf0f75d GIT binary patch literal 1004 zcmbVLL2AP=5Ik3)KP-EWO-#ro!BFTkj1Ouo6OlwVl1!VvzAM>Q6qB|zKAF*IW~5oQ zodE?(Ly_lO&QuEm$`Ur5ePv2F@^c3T4Eijsh1Ut%b7rI)jD}t)Qx!GPw(z^I{pORr zLQA?H^3q3PkDPIqJ@NT{6=yFMS|^;mNbPV19wCT~K04D7faHhu%EL(K!SGjM*GnTD zEfGWMiBO>)F7GmcMZ{8So=5mb-C|AhbujrWjcQ{U@i0tTK5*FFIrPRya@VYphqIt# zs7~LGKCgNNr(SRjM;Fr%`rw9n3+^76-A^HF=r*ZO+gj66*BN6=Dz%W;w b(R@AsNZyX}aI)du#oMCZ(nZ=vEoxHI)Zgiy^rIGpqFIG`%=^v5D^($H z5QUuWw1y2V{U8cfYtF7^VGl8c%Q}IBa5hV@GP;t+-n~NRCt-vw zwZa8B@B?)de01(GO&1-insX)%VHky&(yT)gya-c@>?FUF4yaqClsM2iBf{#IaPykJ zMfxsAN}5Ek7XQEK_8{|P4Lfb1 SYpn*M3ZPnZsjS$`+J6FMMVhPt literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/operator_feature.test b/docs/_style/prism-master/tests/languages/stylus/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..79f656710004a7b14423e92c0c6a8d2c59c18863 GIT binary patch literal 4690 zcmb`L&2Hi_5XaAJ$?q_D1(m`A>Y*3Zl*2v->cL5z5C{q614@PZ>^lx5&Z?ti*DaTf zCu9HSKXE<=2`-F0&OAJNFmge1=A-?Az5tItOrbWX^(lp}0A}EGreKCsI1AAw!O><^ zPjDOvwC%VMa<)NV1dE%wa6xevqiX|Wh_pGbqqgXJoX?*)+ubZ}CTQ;98Md75(M;eO z$DE~T@8Ja!&N4Jpc)>Ae2edO-;drTsM_9RV;4DY?5!~7?VCh26S&6;^CKGK}XqRxk zLc!Sy?FwWXK*`w|2PepKs5pB=`w`+4&YWHJguGG^7xj^|_l_scN(g0ApiC*z|Bhj4 z2^Spd68{XtP*0TbkVl?;K)0?oo1V2jpx>IpbDN z^qttTkz-k=ZLgfQNUOc4>c{*e89AS~ZWH<>Uag+_yLPSaQ?}9gFUfpoHc4+b0>3<{ zr}OiDmVm9@mEI3v6B^r83G=e!rUTqP$$e?%CU)3t0GrZSBX@7dJq&O&lDlfX%jX*(8>2h-GF+GP9LYe6UlTlk1vgkECMP1XywllDjnP=5~5Ya$U1*LF$=I?$ZQV za;pJuNpi2(mRs2AJq>Uxl8ens3oh-z=K=7E1Y>h>>lOr5cHFmK?(pj%ZXRg@&UP7G z1~TxnEKyQ-OG0;iWOQuy|EF-Px8ysCY4-hEe4-G25;l|AKDG;WrqsQu<@;OqH;4k8 zUFwyo8{m5?0xot}O7{1QYq3#peikTwsdSIsO7DJY=)Su>QIvU{Mmql1iQCqszo8Vm zwWo{HwEMQ;=Dz>CXEpnztK4h`Oz7T+afV-U_J1z?-Y9=pK!|^k$RvS=R?PnZm2s4q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/property-declaration_feature.test b/docs/_style/prism-master/tests/languages/stylus/property-declaration_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..275eb43d926140ec7e5d23bc6d982b93185d278f GIT binary patch literal 1053 zcmcIj!ES>v3_XLyKSVy4s)wHFai4)WK$5OeQxb)w>xB6C*`bJ*PMd}_6d}dWezu<- zp{`k)d??{hY`?QNyl|t9E0~i4FHOzQ@6Lo)6s*xf9Q9E=P z?mieE?PMlXzT%^}5{XLaq?X(p2OCxbRsdDCiGX#+O6NawA-S$y?UiZC2|)~-&=?l` zq(G!-!=;hL2KybL1?&wlWCd#!?9OUK%YB$?fFd%JmMghujekr)qlq0Z@*kjj=xHe- z`!1x%M1NM6v`%0yHV2vw>91NZoi%!rB#wmuA+@?F1Zf1A6#uwHv7#qvh%F>I7-Aet zqq)8cO*qi9jmckpp2b)YV488AmLiev$UJY-?|b&It&bgI3K9g*`giqqlKkAUqj79{ KCG6o1b=xl^Qy;eg literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/selector_feature.test b/docs/_style/prism-master/tests/languages/stylus/selector_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1908c4bed70dd711fcf279c773509297e1c8f2ea GIT binary patch literal 1119 zcmcgr!D@ss5Ir}Le+cQN1>HlBLQnk+*Mpm6F*Hp=j6xCry)zN5s|%&ur5+SB^WMC9 zGm*Ndr1iBe&(6J`>QGU_m~h4g7L=rf5~+Kpt?yz+N%|HxHo0iDkxwu7d6)kPOn7(z zwxT$xvkMCUH?-?CHc+yvIbzuXXht>w$yhY5S7BEuzu`gVl9Gp#x5_9HUEmojIrMl8 zM|)ueuPW#mGJSAfh4`6EB}^UasGUXBcO-G71`xzJTDQQrg(fo-#CKN2ZYJazM=%Px z;`73HPdPY*h4@0~dU{L7|CMIf{24&VeP*&TegxxpO92Nkd~Kr&-kEtwxIB0+mC+v> zVjz@*FnFVvX_?j`phm=``*(b>`akjU>1uE&@n>f!0i~4OaH(>{y){a_w+wDOn-{4) Fd;vSmL2dv5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/string_feature.test b/docs/_style/prism-master/tests/languages/stylus/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..934f94f077e51565f52f2930df0c706f9321a43e GIT binary patch literal 648 zcmchVF%H8Z3`OT6aR=muCFudO<`^kML`fSp!Vx$_ZeP=oia7%?eI8%m*jV)BJaq~{ z3i}rmVyU$*pk~NgiuS@vzCnuH0BgY21=`!Ev&$Gpn$bg}5-eysfm|0D(`34NOWSFI y4o(m$%>KnDc<=_p*AG*LJZ?+fNUdu=@Hh4xCcbRLd7!N(VT(L zC?G_&7DTH<+$?Bd18I*W!S^~KlJ$1~(z)ATtAldwPf42N_~EWMqo;)p4)eDb{sOsI Bb^!nY literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/stylus/variable-declaration_feature.test b/docs/_style/prism-master/tests/languages/stylus/variable-declaration_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1d68f9dfe016543c8e450c8e6f93008368163bc3 GIT binary patch literal 600 zcmbV}u@ZtX42EZW*LTQuVE~-qj)lp`;22UY%87(4=-|_vA_4=0wo~&b>DTT()5lfG#pTrU4+od`_9@-tuFXVFJPEUrKXXz~&i*9fYS=nT aHY229)BJaOx|-@XKus3Di-pZ%hvOSyVU>sg literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/swift/atrule_feature.test b/docs/_style/prism-master/tests/languages/swift/atrule_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ae307f5561644f9217d3176de6f5a9be24a55c26 GIT binary patch literal 649 zcmbV}!HxnU42I7;$-Kjav-%99?qv?@!FV#pRJJ>d5=x*X`u4)8yKd}B!lCf}4fOxp zZnjEnk?X4MW}g^M@8Do@I8HSiazoj<=uz_>X$vv#eIO=HHVg3VDKLKJ(osN8p|ma6 zbMhDC`k`KcgMN_E;i&V~rki?ijfV2d0!(Rv#I)CzVhZ^Wbv1rtmA-9VeQXtQNEX$o zQF*xAoN70EMSpXP_~wI%o_rDbf1d=w!#4pvd=${HuOhqqEU@CcaQ%{lpn1+k?dmG; U_rsb0pgzUsn?eITE)m7a74xRI5C8xG literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/swift/builtin_feature.test b/docs/_style/prism-master/tests/languages/swift/builtin_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9bc07e5e73e71589f6f590830f6a2deb7ac3ced5 GIT binary patch literal 2410 zcmbVN!E)Om5It8j`~%~2+K-5voYI-hbebMAIbdn!kRnh4C2qgI4}`4Piw}**0`zwG zfq;E`>zrt=l^2a@)GkQXy(-(1R7UTu>zDpPnTg;L0{JLgXQR?KU@+PAiuT6PKsE-^ zbhMlH_g=%Y4vm$a4l!}V!@KcT`v3=w?o=8~!zjs419=tULcb?vWUoymkIr^zQox?# zgSrEgXaMS#g4E$=7~>!L;5hH9qTBnXMZ}hT4c85dq5&`Y&Pk<}PoZ3=TV& z8tPyljmBF9Z}_R>GlpJwR65tgBLl84!BgMsgA8x@g6O`c9sUjnyBAG#^GHUoY-k-= zCfkvx5cPn)+@{kJ&18e>=~~D1Y4Qzo-W(#qvAfef!4<1c=#T98ZHj7V=pI{&1GsF# zaj!weJCn~e1u0(3!HMSc2Y%^>K8ohk<7PMET4=kulABxSHcwaQDDHDc&v9IE;PQl_ zTzHPp32+I|$C4*GUC^8%ENaP^iUFrnN0*GM%(CVc3tdgda$`xs8s(CcJgDR-Hy~#j zc+BC-96703#GK?6*me~VBEZn2D8O=l=0zn~Oi>MnClz5}Qk4pKU1nG`WT%21Duk;p z@qo&*R^4Lm?{us(&mwFr>?m~Hl7z29Rg{qV&&pVVvr<;@telkzW({Ql@1&L6pt4nv z(v3R5Az6#L`%#-Krli#uVAt2CcrWHWFpE2fA@&SB5&z0eOEutuOLbrtUM(uTC*^}t z)XGVPWGxk^_2oZYlYpNe;7VKSO?7>z73l)aT%tBlqQU>;b!z)e?XMtv=Vd8Y;mbcT CG7bv> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/swift/constant_feature.test b/docs/_style/prism-master/tests/languages/swift/constant_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cd72339744ffebf531df60cb656239b8ad269d31 GIT binary patch literal 298 zcmd1H%;Dv7bmHZ5^Y@Q;atz|-%63cw5^nkV@kxnAyj;9ox?}*5zGz-9&S<6N{Ji3l z#JmzE9R;Pl%p9dy9SmVdCv2in2Vs)}IuWZd)X_?@yj(y;zRR66Qj@cb71HvH6kyIT G)&l_gzD7#` literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/swift/keyword_feature.test b/docs/_style/prism-master/tests/languages/swift/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..75fb886640ad854d129ba74b557809ed11550b1f GIT binary patch literal 2763 zcmbVO+fExX6nw5F|3j2#$`9~}S_z551Mq}UWH#Q!!m+o$WJ$libG(~?)QMDq$l5z& zdyg+?#wKfJa*mxd#qC`=X!V+`dDE&h*~+tYTNECRu29BMT&P0Cu(!e4(BWlmdsBUB z6`Q1R!O5#zKUgUveurRot~*s84+DByFJG~t?(lpsHe?rrR=x4QY*VZoe7twTcoY#M z_cdUMjSRY}Catw{J$}0(CO{5dUFhAr6cT_7v9_Yv)CO^wuQz`%O>cWJUPjv0g4u_S zR>6*#WrzVm;rT(t!6s8Af;bd}C;`R2P06j%bcngMuMWv}c0DZ$>NDo{rbw$4OY9Y-_2;F)aR=6=R+Z|)kd)%P#_X{FV(R^OhNZ}u?8 zv|e5;mL@M>F8&2Son^we!%c8G?G(n^F+U5G)Vx?-*8tl`u#jR-sE z6=!UsxEy>&v{Yn7WZ;yn=NUOUgq3t=F!Gzh$Al-`Ck0@vNCLwnTNDuu(ikejP>~ga zyPknfco-2V2tlAY-LfWLwE3iFjAA(s9CNVbJA~4^8Fi9Q+V2Cl6*!r4M*Na|%Af2r(9di|{iT zrbA%yA_Bvl7~0&55@KJBIQkjoU~mj?jz@^LM(1#rIWS4m{EYUUY?O4FeU&n2)*H@C znu`@PSiG6yFl&ZS?oF5vJE!F2@0>arKBcD{!16^a{D1u#aJ{wNTVCKYxWFB8G2aLB HrB;6d(u^+Z literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/swift/number_feature.test b/docs/_style/prism-master/tests/languages/swift/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ca8b7371d43fe6845b146dc9f466ce2865430167 GIT binary patch literal 471 zcmbVIK?;K~5Ii@KKZKlZNYbeESPOnaB*Yj|s}U}gk|KyXPZ zh2TP%V4=J^gmA+I1awMNB~zu%e5a|1$t{r)dpZ>@oQO*1#yvd~v5Z2ef#7^#W?crs zDZ}>N6=uKz!h+*G@UYpdkFVZ+X365?Tedy!KkE*^W#1v!E^rQk+vA1YYoi|{s`>$y dMmL>m15}$y{hnUGREv}?QPEg6e9%(fNWNo3ZQ1|; literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/swift/string_feature.test b/docs/_style/prism-master/tests/languages/swift/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a55d2e659346c7277ba57488b3f2828f826fbf95 GIT binary patch literal 882 zcmbtS%Z`IE3_Led{=xF4P_>Ix^$+?Pgaf5yH`38(WMg=>o(>0>+xBYyali>)IaLNz9WMV6)%=I#_iy+*GMSs+okY n8L3_hdy_kl{Ev?Gl76}WG=7U`e`hPmfm^y{AJ|95Pk_P`gNR-{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tap/pass_fail_feature.test b/docs/_style/prism-master/tests/languages/tap/pass_fail_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d0782990a3b947bcfec8a007666c9d6294217e86 GIT binary patch literal 410 zcmbVIF$%*l44kW193C>IOX&~#jF2I?N^KmhU~9?mYbS&bT}*^Pa7d@Si=vP~aUXa- zpw4HMR>ydAw#l#RB|_#MQqD@{Ktk&>-7gf;K)1onlV3~^bI3Co`+u}ihdFN7Dd);4 m;bi+E%}g}XMOQD!Hk5Enil~p#p?ZYMhfCrKR#IZC%SK;3N_12J literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tap/plan_feature.test b/docs/_style/prism-master/tests/languages/tap/plan_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8bdcd4e7a61ec357b1ab706e355eef308d811fe8 GIT binary patch literal 207 zcmXri(=#;SG6azd$_go&MXAXpnPsV5T)JccF0N=U&S<5AoWwjO9R($@sY(j5Iv9e; aRsj`o#gc2Eb4F@%cCkW;V}Jt4RxSWq1S^aH literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tap/pragma_feature.test b/docs/_style/prism-master/tests/languages/tap/pragma_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7775f2e535dae65ac10dbfe0debb88b25dcc6014 GIT binary patch literal 219 zcmXRYN=(m9RM0LiDauSP;VOV|b)j4?T`~X{S2P!Av=YQ9B^?DQ3ucE>tPWObsGUl& UT(Mka+UuN=nw(v%0I``1032U7CIA2c literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tap/version_feature.test b/docs/_style/prism-master/tests/languages/tap/version_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..600bcccc3bc059bab5ddafe352d0e041ec197f24 GIT binary patch literal 181 zcmWG>3{WUbEh^5;&r>io=Hk*N18{Lgb8$v1L5)$;QBVp&F;z(+mMfNAqn$HSle3Ez JkWA#|0s!$;C(!@^ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tap/yamlish_feature.test b/docs/_style/prism-master/tests/languages/tap/yamlish_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..be4a19e3d82362298f22b08bcfc05b9002cb7ffe GIT binary patch literal 1140 zcmc&z%WlIU5Il#kSaI1<#c$0sG$ckd($cEn9>RaoeC3c#v(^peRfW+Bn#m zL92w1N*156uiP<(omUzmC7n#i6Tsd$Is%Yz3dw|Y5<>u_QoVm*3a1F+p~J$Vxh zuf+2HPTbxs#d`IcO9;W3Z^^G0V;P%eypz`QIdD_+d>(+KY@5oK9`pBsFzCV!(p5$W zp3gH9{Y{O>fW$cv`iY+sZe3sLeF)fGF|Z9My_lV5NAPrdK2CO{gMYX$^ZfcS=&xhn z3iUqtA(Kq<9sS&sNi$J+EHzq+(CJDuu7{=xZ9Wk(hLZsaz7!wn|60Sl#(ebrg~$6} cz;iasbC&=0H$0SB)E0vM0oyGqFwx0l#slpb1%G*sH6cHQGI+U~HCQ$-AX(cu68Yg`;cq`bu$ z!G%601d4HqQeJ(K^UWE-7a#}qZbV>jC?q-yLfSbOzKvv- fN~2n@@S26fzv0*pLH6~8o+G&_8F9j#F{Q@`#KfY# literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tcl/comment_feature.test b/docs/_style/prism-master/tests/languages/tcl/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..054d6023d168b01d574d26410f92bb4d88dd8417 GIT binary patch literal 201 zcmY%9Q4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE(V%bqyV+DSPuZd+A4bh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tcl/function_feature.test b/docs/_style/prism-master/tests/languages/tcl/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a05e18c20f55e1ffa5e44772ea2c0d6be34a54da GIT binary patch literal 324 zcmXRY%1>5E%g^WKDgd$E^7E4ti=Z5!a6FI~Z(_vD#ml8j1_0@c=H=pyR!S<(%qhvt zQ_@jT0$HRKtD_LDlvbLTT#}g&76n=c6eLb9#Fa!VNBBc2mX`~N$oGtMMrv|)F)+Z2 K6kv`o)&l?tvr^;$ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tcl/keyword_feature.test b/docs/_style/prism-master/tests/languages/tcl/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..090ef7d7543619d584dac72cd9b3b2228d46a1fa GIT binary patch literal 3655 zcmbVO%Z}SP5IjeK{$b#Avj4ENrv-vdfDMpC5E!)Flo?Z`LQ?k3-)}WVdj{E30>m&R zs;ZlhZmGMBEt2}q%(H}Jz58d}QZjm5O5Dqn4Ds9^+%(5j+JlcqUDRkgyKt1J_Vj%* z-r3s(NwPGTX10$Wj)zfFidg*Mf=RF*Oc_qNfg4UH;OgUmm2u00TMV%1yWk+7 zVTeZ;MvS7x1zXkYj7jZ5odt7QI9fL@32qqASjjrC54g%j0w&U7Fq49Q$=JjwCFAPj zq3=#Em#7;&l`{983j^kN!A89ze89d%hyD6n7`@5ajf%9e;GRVT=P?(qSZyp=W(}cF zCX86yCz(Z$r~_|?6}m{$V~$@O@VX zzsGy}!G4Yj8_-9K2)}oSRNo)~xtLTw*ni}y+>ILcG0DZnCExKYW_iR}&VR070o?D< zqaXm-4X`4*0SqoCAs9uxZpG=_QV^n&YH*iu4)KbkEn&^-f|SE=nUAKxbeTO~Hh5mH zM$gxG?|$Q_eqZ|T&6nL-o^`Xkw+}m`+uwbC`#-#X)tvCp4A<|T;V*??i(MK@*Rn?l)Io-#FcSDy zDH#xKbjOsbYK;SVL zijTn)1630eyop50Y-pq^Bbh_hm6WJLlQ30z?!NXN{=Y9j|2oNV&JU2s4^4ySKmG$^ CNl=*p literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tcl/operator_feature.test b/docs/_style/prism-master/tests/languages/tcl/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..84426a0a84c2454f25d0ac653cee3f89f5ae5772 GIT binary patch literal 772 zcmbV~!D<5`6h+s)aR1?r5EmwCen8ElpAixW#nPc+CYf|8`S$9fi}t-$L=X<=-lyQ2 z*b)z7kRcI4LLhd;iii@E#7JbxNpdDqGrV|DRH>EN6DOkFh^Y|c)XtG;jZdteI}k4i zH($$g{+<`N5w~{7je=VXJ}fviD1RG=WQjqGp))mmXTg;Pqppm7_P_hY?x`_Zi`fY0 z?x}DxpXha^?@Yz37Help+*|Nu!E&?cR4h797M(_SB-(!dcfEa<_piHr%!`~a7y12W G_tziYpS}wK literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tcl/scope_feature.test b/docs/_style/prism-master/tests/languages/tcl/scope_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..87076a7d165a36bb1351a59143840b04b05fcad3 GIT binary patch literal 234 zcmYe#$xlkm;pHkVC`&Bj9U5Ih^`KZK>n)`NJ;Rp?K&MOuw06$7a#R{VEo6JixhrRGpFli8hpG~O8# zi8wQ+uIzfbz+EZN;j0u_CPCkUfgTK6eU^X{*n=#@gX%ox()5Zxo0mi){o}BC9*G&n zl*pVel|5ATQ3DVRs7&~+u*K>7{Z-5t{69Jku*P1EAVrY@@0qHFOUSOac~mepYT2tB3+N=`c>^Eyfn9k+u6kGy0V zCJfpwW}S0`3n`z~Mx#T7FfJxxUT~GCdYNZ5A$NXW|JwTC9=TGg{Fcgp{-?ER#dCX~;@I0Fe|`Wg$#((( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/textile/block-tag_feature.test b/docs/_style/prism-master/tests/languages/textile/block-tag_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4598b14ea0d6189cb596cac7647531d18f2a3a80 GIT binary patch literal 2408 zcmcguT~C8B6n&P2|8P@Zw#1PPeex?&6XSnC9txC|i0xLo#Ay8Q-nLsa8Mr|*d1`Oz zJ?C8R2YepE3!?>7Fb{(;;PJgT#Kw@VB6xtTmiZg3)>2blNns9_w-G!`X_t2qJW}PX zc>j@p+V#Y~k(rZhW13E<{u-Z8N-1~tal%CEUGdAWT-H)ugJQ+E_sXx5Ql(#-edt-i za;Yq%>$N})btTx%_v9QQom-0?2D1^5QILeeSwfav(T0%=Fk9T)V9YdK7*j&rg77&> zaZi?Ok?XZ3h36z9X_{V`i^K<-;MN%rI5*c2aElNl!p8J2i>j=cauiya_a4)*-{WIk zv^m8`bMkbu)j`2~iE}i{Z{^D)h2IVkj=6hcHg^NqVELSw4aTM;J%^+Umi37_P6k8_ zzaLijt9ljKTTaYt+8MiE>!!F47vK0CwB4qo7g*CiFb39q{Jf@3Gph>In6UNssj^P~ zLqtzQ>k*MSzBLu5^AaXH`KKfu#(#Y2@k?Z2!4k6DkhlEvrZN4Q?9MUF@S*g^W;eh3 zn_g=&w8C4ezVJH9m}FkxAHx{+`uAIa9Z6{>cPA{?+OV*>_Tc(L7~tjce*sUNhipEQ&TU0y22Hbjbi9ebKyJoY6`J8AXZ3sY*HuATFnpTYf%>t(2CZ zUy_$!0+s+OD$PqSDNQWN%+CYLDn%>B0!c%#LNuvZrP$b59k5X`MKO6mXA*0ii4jio cfX2lFy-Ja9oikFCvx^nd@{52N;Cn7MJ?oQwn9Nu%>VW z?AGjAjf?NCwYQu!EpC|L#t8-xZLFiQXwfQSUE#=PGA%(Cg9hlj9P>HcHQ5yfxh~8~ zO(tHgs%&$X8iDAc-S{ulnM@s9!?_=zS#MEIEi#rfs+{7il4d>J4=J5q9wfCZh#meQ zHtKU4|Ewr;aaK<P_xPzGh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/textile/inline_feature.test b/docs/_style/prism-master/tests/languages/textile/inline_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e56e17bbd93efb02a6995486e5a48012035c8433 GIT binary patch literal 8150 zcmeHMQI4B15dB^x?qE?x+J({s><^K8j3_|_oP;ff6o}MnwK;od#t>NBI8J`5s6;ER z!Q=iHpO;^FK%Fx`7v6;=IO^X#MZAda7RRrO_? z)Gw=Dy(TYyop=nBFWy`JyM;;8s!rOxDql}!#_J+4`3FwN{1q?Pgab1JdYr^8j<<2l z!0#wx%WTO49Jcn?z z}Q}LhIf20_$$|WT6xDqoiyD0%J31M z^AdLppP}zmrtOI~5?*+|w}#gqZXfoG#+u%#mhk>M;0=giY6BSy9|bkY%dV;Q6RfR3 zZ$!0(jUwSJ5*Fi2|8?O+LmNMr9UkzW@bJG55A1BwC0eOKE1B>v>69Z8GvUR28@nMf@cI?Nv?t6aCU~BQ0-L2?F6DNq@ps~ zJsL^Or?aAXC}~WlMH>Xh45m{UVwoDjL0Zg^8g1F>BRHsv84;-p{`Bnf_Ifxlv)W=I zDhEo$(kU6F#O#sKl3WMTYX~N0HHem%C?7KcjP5B)^qYzBS!-t^JTeh1nV_WO>r{}q z<4q{S;DDLyG8erGJwQ9F{4?vptOxkj3|@wZJA^sA&orPbtKs4{tHA@S0akBa?lkg1 zb6tIWJy5vqrTPo*5G1o=QKb*J$5B-TRf6t1I*Pj)Qr0Y}5j3~kdutfb0}YyO4WlVI zCa7?4!Ew+>@3w+NTP@sHaJ=1Ka12$OkyvUBXI?3l_kYGKO|qRTy@yj~P9t(9|G>l= za*2^x(u!wR&8#A=>wglaj6NY(wyaWLqo;n13S3bF*n$-hx7QdQsyev1r$@DuJG i9~}4nz|$WM+f_9abpvbKKLu}CQf92=O`DhdZ+`)z+Yem; literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/textile/link-ref_feature.test b/docs/_style/prism-master/tests/languages/textile/link-ref_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..12fa1da21c76be7997d31902338a7fe89e6f28a7 GIT binary patch literal 495 zcmbVI%L>CF5Ik4#AH;JW_g?!M;=#(Mu}M@`gZ=!jgb+wCCE{gg#@TVy5P}|aj`zNg z=+g2|oec|T>S=H%N+}(D%o1nVNY2^|hcmL}?51QK(Ik+Ks3Xm@^HYm3>`0ZY-saV0 z7d)X-N!?T}F)5?-uL@H313o>_2eaZ_)xW=#x?1YZ`Em*>>e%&fic_U~63U|~6y56; VKSr=q5<@^ydrg9h1q5#)bzc}BeY*ev literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/textile/link_feature.test b/docs/_style/prism-master/tests/languages/textile/link_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..99a70fb2fbb99ba26a8462ce83214a13b8b9bc38 GIT binary patch literal 1020 zcmbtT%Wi`(5Ih%&e?WUmq>$X*TPyV^s1J@~iW_4i+elHW{(E zcyq2g3JRd>E89j{{w1Apo*m7o zp1-jX7`B#0S=0+2TGy1tQv*ZiMNqJ-D8!hyo+B!cR>o08?JQ>D9f0qs5lc~BBIS@v zI^C`C-ulWw*0H;r?V zH%Jrpl17A3>k~qLGlLK4qomnxDNND(&Ndy#de>QvEvW>b}oX;LZo0JQnZLa2rrA~jfdje zve>nJI(rp*UNcgmUrd-ugJ-dNUes)yg@IRG;!7;Jl=U_+xNiaH)ELJaO@)Z&noRaw zU1tW<`$r2e&@E9%Ys#LelL4ei|C3X~8gs78?Nflhs1O>{#c{+zyhw9+N~1#{T70!w z^chR#N$z;wG$(8HCC@+hBZ%YH{fLa-wjdl^N}e_Zjzkgf`^Wcn?)4aOO`g%kF*Enq G@bL>syv$4h literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/textile/mark_feature.test b/docs/_style/prism-master/tests/languages/textile/mark_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a1f39f466378ddf179e8cef9b53704445f0f08f5 GIT binary patch literal 423 zcmWG2$}G;+aMtAIa?8)x2=Rq5k`jwFf`Ck3E?qJJNMAHB7iY9mK}JzxajKGz0*K40 z6acae#8b*mEXoEkfJ#d9l1oYxOEUBGfC5SyO0huF8LS9RN>eE|HdY60P)t!w9?-qS z7!~46oLN9G6JuNuPSb!6i;d;w0wVH5%{e1AIlEXPEx$+s6hg%c#g(~9`8maU090&h ATmS$7 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/textile/table_feature.test b/docs/_style/prism-master/tests/languages/textile/table_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3f8a9c79f1d76a1d922382231fb138a4829fd537 GIT binary patch literal 5885 zcmd5=UvJtl5Pu#L-@(mPDbSKiJhHBItF*U0b#IU&lNiVvY?K6Tqi#R@?rewA#6Tdl zS|1u?pYMM6$9MM0kw+#%5P1!QF-?fPQG*qc&4#?bF{`fYn&nmt2YUI%tUj2v&;ORL zx@K+&0}#+`0CW7OcMiKRnl;Rtxn{!!x|Szhm}_}o=?W0IAI;pyjmg0z@jW?U+&5HD zfrv%YBjb3vTe(@{0mglC=A>)G7xW;+3E=bpksyKlD{x{ z`9Azt#|pmttIcLjQMs>NflT%YVw$F%D8!-!hO{aICt5Mtd91gk-cpULjt9(A1CImO zqb(MNN~uu1F22=);f<>XvQm-VQlbw4^naLYpp6n!K2`B#cc1?r;Z%UaxYb|Ppd1}Z zL7J)ve0BMT45}P^+S9ZaRl3+$lXtX^g*%l!t-$lZ9t(Jd$iw`#3a?%spu?K1Ah6)* ziCs=LM<04H*NBTxq8)fG1_I-NfmYTC-89f{&EG1-(LD#2p90X0^cL|r;_6*gvUOYQ zkFQ2`Xw(4wUM?&^na4wkOGQ}+2&*p*9&xCJe*Y@n%+RXct|wnL?M4R*+%Hib(Iai$ z?`!q(nU7ULeQj<t~b`)%Q1xx|zKoH8!dxhb1PRX(Sy z2n$l6-0hLF-SZ%J^Z8KrhIyBj^YXeOHE?K<2>xfTut5vXhA}UMVm@bF`PJH|vs!Ui zj{$S!33PD2!5v>QqKQ2$l>*L>?>6Q30Nkjl%?4ZtkMBO-%~JyM18{Lgb8$v1CFSSmq$cJm=_n|b08Lbi)j<;lTcH%o6-%x) U&Kar6*~JQJ`9%s)%Zl~50N6MyhyVZp literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/toml/comment_feature.test b/docs/_style/prism-master/tests/languages/toml/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..190fa48b4f1078741649d025282641777262c125 GIT binary patch literal 209 zcmY#Z@Kn!LNK{D9&&^HEE74J?%r8|hN>#|qFVW-T(j^0MaYb`+Mk_%LRMJsUQpRJ4 aQY=?2x%N0`q$XzL#{~c<{xMeo literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/toml/date_feature.test b/docs/_style/prism-master/tests/languages/toml/date_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2956efd873faae26e7c4b1f5c84c7e448ce59247 GIT binary patch literal 631 zcmbV|!3u*g5Jbd)70CPkt$wsTQ6VtgrTj!3KB??g(S)FZP}#}}NSS3I=9j>ZW%-^Ttvsq5pZ=HjOu EZ!>CvF#rGn literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/toml/key_feature.test b/docs/_style/prism-master/tests/languages/toml/key_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a03e11d288fdd00e4e7cc8c20f3770b9f16e9c79 GIT binary patch literal 742 zcmbtSyAFde44m;-L|#~E{(z~UK^S6-wg?F-9z%urcN~Z)w1@#BB~tFrC+8eXtYU?h z7-2fMHyv6etoxvKM{gR8kv+*2NDYX{O;N%#;kKmAj^8B(ZbI2 z4i>qE;o3AXR09;PwFt5FO>~X``@3mhHm_~_&h0VnkB5}H|27Ui?AeklqYqWheH{Y3 z4n&sU;tJ$cSd;~M3OuW@gphLQK&j&YIMKM)I8;UDs$@zJneJmnb>V%8O+)9W_FIu$ufME^l z>MaOun1WHRDX2R~LvRaEPC;s;1iN6Fg4Tx;yn1K^LCFIcN*zE^Duc72EpKoDOWnSK xrcUmHCpYJjF@DM}U@B2SRU+f6Gyz$O0(Q2;?oqhkPU++8y6VoC)rk1Dz#l3k_4NP% literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/toml/string_feature.test b/docs/_style/prism-master/tests/languages/toml/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fa87009b611b9932802b5ca62f190361f37e4d3e GIT binary patch literal 399 zcmbVIK@P$&3_I7asLUaku}|=fr3aXRA*3O#`@eAMWuiN+Rnyc-ZN(&by^V@a!VGrO z`9TH>3aTQM%v7zflHq({0RzIoye_Z#$u3G%vZ?zArMZi{?|v|AI5b9!d6~=ERtl^3 h>}zSzRe_elY||tgn2?TIahdMpJIBXoiPezY;|nohTjc-% literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/toml/table_feature.test b/docs/_style/prism-master/tests/languages/toml/table_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c0be8b7e0b0bd96e73fb7e7f05ecee5191d42d95 GIT binary patch literal 331 zcmazpNleN~jpd4tPAn=)tc;E2;?gApaB)R*aYic@l;$OulqQyB=I1HtC@4iM#p-~B z!FGTIAPk5gn%Y>9T0CZ;DaSAx?0l$wXllVmW4aC~%tf|$oikFCvx^nd@{1I}o+{Sk F0swCwRWJYm literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tsx/tag_feature.test b/docs/_style/prism-master/tests/languages/tsx/tag_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..3d5c0e9f96e0b90941047709e5abf200a2ee6d38 GIT binary patch literal 2083 zcmb_dO^=%}5Iuv$f3W7XD{aUR$j2pJX)moRbq|$j4lX!d6u`(B+9=9@?~Dxu%(B}? z8*zxoGvk>z&(954EI)lpo5xJ#qR?!^)=Ap1IOA3Ih38@e2PuIqx2wQ!jPth7M= z0#~|L1zVR)7P~BskC^@?t-_f8Kk*{Tgt}~>M3zbRTdFJx*UOUX^)7*rU*Iop_)%Ph zIU+cU6Q)hzfdL`_`v^MOer&eeCU%*G`2Lv1~rfhkGja8`xrwd_NJq_*qn{dd0;KY{~Y@b-3FQR`AV z5qC58`x$$GLN88WWwP_XWzOYWn$v3U>^*q*8cet_U`gKv1Cn;z#48HalLx1I75_QC zdWSWRT4g*f78)l{QapT3Zh&;zbpQ^g&e)w2#?Qg3JJ<=rw(N5=vV-Xs_4oGYZucVM SW5o_qvFC5!8B(YU1OG1xbtx7A literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tt2/comment_feature.test b/docs/_style/prism-master/tests/languages/tt2/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..48530564511b24287fbe26cb305a0fe588073c10 GIT binary patch literal 831 zcmbVKL2kk@5Io0{|FCtH8?*?n&`X~Yaxi2|tj1pCETI0r>m((h78T)xwYwV6jK?nW zXW-hkfPq~^sASu+J0i%;?E*!tAdprd%UfoQP}51u@CA(vC@6+gwEGq)umJN?t0ISi zR#+@-$$R1NNVrC}u!8w4F@oS)N?OT82Z%Mvcm<0yU}>p&^9W4zw0uoXucFoTfu)uB z(<&4tcaMT73g> C>ef2| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tt2/delimiter_feature.test b/docs/_style/prism-master/tests/languages/tt2/delimiter_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d246ecb3ea54720b021cc9def6235ec728803a4a GIT binary patch literal 414 zcma!6)m2c9<>iW2RnUddx)6o}6hy1?aw&k7@N(&r0eHE9hVyc9Mk|$+7%Ax}L`N&7 zq~>JiW|pKD0l7-is=7+CKw(r-)mWw2*jOFB`as&y^#T1rSR*zIiPDJ8Mu>&HT);3S YKY*MwQj@cb71HvH6ySkVtjEg*098?7#{d8T literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tt2/keyword_feature.test b/docs/_style/prism-master/tests/languages/tt2/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..eadf7c10baecb57dba6619024eb53127a08bd9f2 GIT binary patch literal 4967 zcmc&&-*4J55PmKa|AQ9|^`+&3ZjY6kf@!0r0VP4K%6JH1AZtiieyroa-(8%LA-zSnh~BY{&XbKMZTBNp-s#jOgv`j>OT6@n$0gV|`}2#E;Tv;BZYo4XP<>g0_+r{5Hm9 z>DMf&HLB*uhUrq9?6Q5$VQg5sNtOxofnB|BVpAOmACmYx8f91{3-QEc@2O*36J?qP4Oxr=3VoTJ-67tZHS z>UJ*Q@z?FZMd)_UJT1!x+6D1EZOy`9A7m_nq2~3p1xU3gc6^SLHHwOhgi_dc22(%% zB=DCZ!#N&NzU2g`x6l@g#l^pA!t42lqSH&OPN733g;Bm=ayJaF)Tw}TBNbU@x}pIL+Im3$lJ62lcLQ=t)}8tMh`Vu#h(S7^tAZE5FxY8mS`8liX{@_~NOgTx3pE(-8MEpGvds12N`FS(qS) zqs-K(@Z_~MEH0AQVk*}bq$b{;8WaSQsj@C83^;-IN{sPqQ#gDX00k=0TME&N`bUC{ zb4YZTKk^t#o69syf@q6LQ~RbB|76D%H4{V==XmDBWU0bLEWZRNS?5VjCYH2Uiglg9 zlZt_+nAXLg*wLOrQ9uG9_)xaEE;!1d%hY(4`S(2v$U*5UjFtHn^(?2*kUmm4KMm(e ztEyjt*`6a-&;n2PQ^U37Wwuz}UOiUd+z$${c&RVZd;4C>-GJhoSoRdEtl~Y1Dm3V6 z5UL@y{il)!yD4SH72Oy|lW!ZgXCPIU0I~%cUuR;G;JpC^wq1{nP z1N%zU))3A7AWgKtTCV+wcq$SVZ+SVI93fB&_};k!W(OqYKrDu0Lm6MckE(q r`>>Q7ue literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tt2/operator_feature.test b/docs/_style/prism-master/tests/languages/tt2/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a8a6058d4698a393ebaf87591f8fa0d3ea7071c0 GIT binary patch literal 2324 zcmc(h!ES>v42I8*ly@+Z;MDD~GvTtwh&ZHerlJ8xkg*F7KNsl6a5ZUFML5A9%fC&c zd^Rz>Sr0mcBUY7#IG4hZh6q~2!L~~!VoD0@n3Tn2EGAef8 z<45Pf)+cCe?7672kJ~VWG!N(y!7 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tt2/string-interpolation_feature.test b/docs/_style/prism-master/tests/languages/tt2/string-interpolation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9a977dbd8b7050339488a6cd48eec7d0d02e9182 GIT binary patch literal 359 zcmbtPF%H5o44hM`e{e0bwG4cLg+HVn0yPkkCM8LEKTZQuXRs72*7@#yN&=q9THnIX z>4_QyIn-5Mbw5<*sk#yhQ#xSFKaof7IFdD!NffXJR1$|3g^c*+Y^i%LKGE346pXv^ zQXvY!{(D~$6ao~!bTFD(S!_M~qsJgNJt8My*Nw;4T@D4$OZ@&yd%V--5#j0s7{}>m QZ*?->@f6KSP~yb>8<(0-Hvj+t literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tt2/string_feature.test b/docs/_style/prism-master/tests/languages/tt2/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..51a5f792facc7b1d9e185c95739e0c5bf9a97127 GIT binary patch literal 893 zcmbtS!D@ss5IrmS4`GUU(G_~^wV&a5usZF^#>6!v+t2T$y2@G$(h7#;B`+`Y-V|{Z z!kM{uFL_R%Ro81e)wat)aP_2&WmPEwIx_6BZq(dnx-}Gqj)&HKc$8dS_0%YY>u8xA z0-Bp0F3301T23T;8j0Xr4UhfQ@aUqE%o>UE60#MSQ5c2UA3o13qA)0c`596r)4;D~ zgobq6wM>KHP{dHC_YFI~Y0AD|(PXm;sVV?>okW202zTqmQQqnn4rr$59OW*a;*y-q za1L)u@8K>df$!7~`}wY({mR=`ogCooReXfER(o$DoO@^$eMmhnL0T&a{2>3o+U)gA O^~I@oJE$omclrWT5dn$- literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/tt2/variable_feature.test b/docs/_style/prism-master/tests/languages/tt2/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..7504dd996683fe3668df098530cf3e442444ff58 GIT binary patch literal 613 zcmbVK-3o&s6uwsI9Yoe$6V@JKkC9#2G?H8nm2K?lcg$i0d6VdOem)h?cWg>hVANZi zkafZ>UcJ~$%&{8q%dSiAq$jC9DF8$)0!nA!))@)$ASUU-j*|^w%eKJh1EatNZs3}R zhEUTgz81w8kV<9rLkHy`Pn(jq)k3_4)1osf=ApJM5lhRHb)MRYlHZne%JSUti3c9o z>hO?#&@AizO|#Pb)GYp=+6Y#*6ncVC1XwVScjz{#`{+q;9r60{G>WV(@bEW&p7@og literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/twig+pug/twig_inclusion.test b/docs/_style/prism-master/tests/languages/twig+pug/twig_inclusion.test new file mode 100644 index 0000000000000000000000000000000000000000..90f32d1452f998e554515a987898b3fcd06064be GIT binary patch literal 362 zcmcCYEGfw0<>IWaHZiKL<>lh#(j^0c^hE%qdAN(gm5Sq@w^5Qvd?EcwS;| zDo|X>3alVj2QFWdm=0AB)sT|{;zuhLl;$OulqQyB=I4PlR#z*<#)9=h)#a7uCZ!gE zq)d#IkR^(+8&F#dG5~5Xm;oYyhebM+Q$-{4;$8xv~?N5qoR6mm>#NgpA9h(O9^=O5*ASL@T`ZXJGt_9)HP HzQXwpyO@W> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/twig/comment_feature.test b/docs/_style/prism-master/tests/languages/twig/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..41c2cf774ab8ce450220059f00214f97cc9044b0 GIT binary patch literal 260 zcmb5{tlmUM^iS052CWS2QmdXS7mser|4RUWt;9f>Jfm rE~QuHQCI!3?3K{~#2`fh zTj?QllR9#rg5+BpfisKs*w=c-+!o;`I+VVR~J zIVD7Pc}3UePB19%vGFoj+^pVzw1o1r1KC{kxjv@tJ%P}5Q3@?Hp1SzHLa_lC3QYqM z#0#6qP0y+#kvc`nw8$DN%@coUD-E|5@vU$*f}Mwh?&FKa;~||#d}YAHp$+M3)jRGf e@8w4E<6l>%3FbHcN_%;4s(ptW)6%8D?)e9iGmHQL literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/twig/number_feature.test b/docs/_style/prism-master/tests/languages/twig/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4ac52710497501f7a33ce0eb1bb3e806e483813b GIT binary patch literal 928 zcmchV%L>9U5JlGp@()9{wxz8p=vL96C|$%h+F~El2NXj7-Ncx#+*l!5-8;$5AMi`|SZBjC_JMlnk zW$Hrflsu<4A15|eU8@R22$E%)XWq0^bLG7*FFzsnuK(UIrS4blX2@Sq8oQ)@HsTbi tw(gQ=lI4^l?V;KpWYSvK8X z%8WneH)CV|_BMoqD_}5$dkA;!)^}o{~AW{1Ov#8qkz!>RB2(-A&40BW?2MNkU3;hVa{beLWt3^29e7tra)V>#LWxZ7Qi22+;bjPxY!R_~0zcB|bQw_D%FfnxLE4(Kx)X+)pL!FrR; z)P^Y`Gjs&oFqoh}Sn`)=nNyztcT_N$Oz!l!buQODS1;7UbYF5XC3A8OwJY1Kro43A zqeG7@XLBQlJDMH4=nx;o+atW64j0;9ya(;Fp`vD? zC|n)NQ!3sp6@{x&J!+R-s<>Gw3Rj2nlxp5A6@{x&-D;Ozs-#&c3Ri>bxlp26C<<4D zdUK%`%|cPQ8dTSXS~d$s;p$KxsPe&i)B}tsrc)y$U_Fy%$Z_RYRe2k(DaTQC1!71ObXplu5qEgTi`0`As$X5dn2s zS+FL|_p)GA5!f|((j9C1ap3KnSKdZ)C^VYAt|J1Yx?A!UW$mA(>3NlP6|}(L>cjF{ z1Rep6cMzA96r>i>c220cowdTNjywFMvOG_NyNTl6>PV)ZZ6)@{g1sd4^)RU(*(#S} zJ-R3!4O(6eD=-__BMtQmy0;~dU@I?~-g!Mbs$6b&T93G)>#BFwlM?5j7x$oN?44{~ zrYr7~M`?2EApNQhbf~hOWA!NT@eCLLYla?0Cg{+0)t2e#qiJC!o!tbAuEUq7l5 sU$s&m4Yz-UsnAYtL+7#P?-#Az!uOE#UweKge73{~CVaCp8?gBP8|H?M@c;k- literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/twig/string_feature.test b/docs/_style/prism-master/tests/languages/twig/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ab108d02e018c2ce4660703142a60f876bc96150 GIT binary patch literal 815 zcmd5)yAA>&5UeHHe<0h?oc@HL0Tk!?x@b59TyunfcY%aLX}p*y)$C*jCd`Jwh2Sv) z3xOk6bm$e@Itm)aQgpz!D-JMV64*wf?=RT#glV`R6PEax&EV(WkCPz+LqM%{S2WJs z(PYn?PM{|HtDD$rw(SREOd7hs2)~<3VKY{u{~#AqmnxOp__?1)%!THJVrd2ZtXg1H U@%nw;Ur)o$@$+PP*+I8^0!G!?y8r+H literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/typescript/builtin_feature.test b/docs/_style/prism-master/tests/languages/typescript/builtin_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6430d93c52d8e16f1966ca17dc1b3c3c8aebab67 GIT binary patch literal 506 zcmbV|!3x4K42I7J@(!ct={tzv+57OYj;du_0?n%I?aj7&k(^d~DF4?${!gY9>4|X7 z)J>5Ip`{st^5{cC@XSMKH9e=)YA*BWc|hoxLuA;#7R~lw2e4jT6~#t|6D=@FP~ZbpnHtg8|OAmboDU?SdGQ^*#_S>SAnq| zam|a9S$tL>Jk(VzEG$AazLzj6;j_fi^rCaT>P@x)XT;Jra~O(4Al}T97T91aD-3;c zu5Hu~=*?U~EYaSL#=pdnrOz^8S}x8aZ^+jWyha=)mxvIed=#s%pL8FDlhrPjMRSu@ zTXUKx4Jc1BtQaEP^R~c8@4ENh!1x|4c3LN^fx;2rVzc6awawpO{M7Hm@ zbT6mQ?A6e{zkH(-1yL^y*8(DVttf(PiBTB&VYn6{@YA_lv>po58oa*18?)9@{Rw~6 zE@x{o6Y5#rl&a-UnOgsp(S~3|AfUDkgV93_u1!UW+GSvlC2{XXvJ#q;q3Biy@9j${ z^fN*2$iT0T2YD?1hc2+SJO!W1aeRZPz8v>p9aUwCM1&F{=tH;&@ug&plNIQ(w5b4+ zB?9{@yF?Q6T{9`Oizwr&suJQUvy@WZr9>5C!a$iBTBVv1s@)8)VonHEcM3!986G!= w;wbn5rr!cb1~Jz&guwMsVK`110@q`wdv6>3e}DG;o20*`6V&6hA3*8#Kl(3#kpKVy literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vala/class-name_feature.test b/docs/_style/prism-master/tests/languages/vala/class-name_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6ee97d9cefb209686010d28bba1c14340ac6bdb1 GIT binary patch literal 769 zcmbV~O%8%E5QWz^=^dI`L4qE@r6yjYVNq*|L}^U{jhx<@V$~3u7zhhGeIN7YM_*Oj zii2~U8QV8vr#xr1?ToLKHgw#nfioRtVmnGCB1h#*&hD;0(GN1z3Jet}81Q4rIpb`- z;2}aJH^?JQNbO(*(fnIJNOi~~tgWu$)kLz9c)ihR9Ig?5gOp5)G=d@_Je0s^PnQqxNT`FRiGY7s0)t^=UUR%m~hs literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vala/keyword_feature.test b/docs/_style/prism-master/tests/languages/vala/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f69ca59df532d4890abf427f482e6c5b89576036 GIT binary patch literal 3009 zcmbVO%Wm5+5Ik3a{=x7$EszI{-uoFrP|y->5ur(!54rBwcXmmqKry}~2uNv$OL1v( zX7@4rahMj9#$k?i@9j7od^BYoLiM1s`(uCNEq^?ej>tJ;1JGDAE#r`EsR&>u>=N&=eC!C@+o_p+pTk^HbvnwuulHcs|jcKm3OneH=2`8Z)SgGErR zz|SU`6YykZyKs1-^b%1P2V6fO{q?L=&3c+vdJ+Xy4qkH9!r9R1GW z#~sI?pE$mIA-G&s0_)W!xXJ*-`QlY5?hL2PZ&Gq6f+nD1!vgN5pmIb4Zu&$h5iAD( zQ!v7+Oo*fr?nC1U*F=vHs)7W+$s(cVNI+;NM@2~q)1;LUsqTytwe zz`hCU0t4Av#PP{klmG-pO+e6ABoG2s13_CE!3dg)6dGi3t2`K?r3fLkHX*ncD->s1 fsO8M|Z5;6b`I_d(VyE}Kf!uCTscm|3lfV510;X_T literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vala/number_feature.test b/docs/_style/prism-master/tests/languages/vala/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..dc88051097677647c1d9b2324a31024c92b20548 GIT binary patch literal 444 zcmbV|!3u*g42I7Og-F*20SH3wWeOj}dAJC8f}Si_@jZ**lHMruwTGVbIgpA89lb z5HVuLfEW>ila#P5PHylhSe*n#RE&yQF(^_}TUU5RQLO5ugEwh$qEJO=%PO-`as?f=C0x9{lW<=AiE=l%4v?fn6L=-&?tjju9Y@f>!>kLTg_WzLE|Z<9i{a_ z|J5Xad%B+|O{+t5+{|vAD{aKqZcHA{+lh_myYTh%{Qh;t$F}2ix!}=`S8MNIJ-Y~t literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vala/punctuation_feature.test b/docs/_style/prism-master/tests/languages/vala/punctuation_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4772f37dd1446eabf2cffcec08af21774c460d1d GIT binary patch literal 388 zcmbWzJqmy@6a(PdcZ%?)3bhBYqsJ(35K$Dtia(QhcX4ybWX6w>Apsr{wImoW+;AvG zsvi+aQY2l^r8~~{nDU|?8q_>t&pC3gUnVPw*NyYV`R436mug~v4{FA~n|BO(!{??T E4^-}B-v9sr literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vala/string_feature.test b/docs/_style/prism-master/tests/languages/vala/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cda10f8fd92e1107aa8187e21299675c524d7938 GIT binary patch literal 899 zcmcIj!ES>v3_TNxe~7F~bW+=I=(O{`pxGgXbc+^}F3|1w_Z%`{g2Pm4fSkn7Ht!ij zR0_HTMFAUZiJot+x6)Z}O40Sv`d2s^J0dQ~%~?kr^I?nALqaQEm7-ErvI@2o`#Ubq zJC&k1QGWMMlEO_dyM-6D6^Lgr!BKzhenL>IT65!*l;|KE0Xx yy_1&^r4O;yPHNxCPZQ7h{H+|gb%#&&9O> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vbnet/comment_feature.test b/docs/_style/prism-master/tests/languages/vbnet/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c50d9289107d27b326ca1ac2e0090765c69a16f5 GIT binary patch literal 297 zcmY#P%g;|rEaK$~a`jb!v3a@Ffe69VB?Its@p47;a&bm0CFkenrskC>=_o`iDMAcY zijCDlmy1@)POU7@FG>L_R06t2DHcdWorFcbk~&ZUni)z^H!H>Rasd%97a8u>1?h9n QNKMWz23lUE0Cjya0C!zRa{vGU literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vbnet/keyword_feature.test b/docs/_style/prism-master/tests/languages/vbnet/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4097b476af8ea97c6112b015ad5d19df0da59640 GIT binary patch literal 7170 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/velocity/unparsed_feature.test b/docs/_style/prism-master/tests/languages/velocity/unparsed_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..32dc1f58cea7ac3aa5f1778ded682bf184ab71ee GIT binary patch literal 566 zcmb`EK?=e!5JlGpa))6eR7>k6yn?$Vi_)f8tVvCp`#Y%?iV9*eWHI@lnS9;|DYX`y z2`NwKE&yHYMi?p|Ofx&8Yj+sj)xa&f(FBBS@yhnpEb1e``u_J5^ zY-ou1)?IV007X*=_JY_lv4_=Rwbgf-62o-2g<-$LqSp~t8ww9}r#Ql(ERR#v>#D|L zkX@6fQQD(sM}?i4@2Q%xY0MZJ?Er7tDAq-haVA+Ho48RpcXSWZ{q8;}ap9e-DK?Fb zr4%c2Jg*OHUQ(c+)Q5qmc%+>w=U^d7ZAV^&6+t&ec)`i^pywZRR53|9tJpHwW@sd@ zQF~jptZ0*Uweas6pDLCMb7kyTnslrviKj(Bm48iDrr)MAY(hYF}ljQ(KIN7ZRM05|mq6E#(-8^lsp+Sqe)aOqt?_6phw z{=dt_nZ{B{qN)tSZ#wF4QwMPw=Xz2#OF5HjK~1iW(26**;*&%Qnq51~W_OG~*)GG< hp9$FUB+GE89x~$c>G<;t-@I1-t|)P`S0i#2{st_}sU!dZ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/velocity/velocity-comment_feature.test b/docs/_style/prism-master/tests/languages/velocity/velocity-comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0b66639e35bb74dfbb8c0ccecfd2e468f7cef14e GIT binary patch literal 387 zcmY$^(o*K-Qr7Y<%_+&u$;?Ytut~`*v*YDT&d<$F%_{-Rf>bCg1ZU=@=cFot6+vZT zig~$o$pE}uyj;<|T%6HLWvMy&$(bdUx=?eKbQF}7fi6>u)xjf==H{59m^`?v@#@5H fE*_sM#qx3i5&7PA&PYwpE>=j(FH(RywO9`T!AxbE literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/verilog/comment_feature.test b/docs/_style/prism-master/tests/languages/verilog/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d8aacbb2aa40bca27854e2fdea00afc285f8feae GIT binary patch literal 285 zcmdPb=jGDZS8&VEPf9ETGPSfo0$K`b`T4wDKp_PXpO;IQ3;@y>&CA6Zt(2Ufo12KYiB?Ex;Me}lTMk^)f=M|SE=9MVvC@3XBj8}@) p!IXkps1(b~1w`cA>YS09oL#JtmS3b$TAW&>0I@Pf0p^ZkJpj7bHKqUn literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/verilog/function_feature.test b/docs/_style/prism-master/tests/languages/verilog/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f33fe3f7d6f845110c87ae4eedd461358c345c79 GIT binary patch literal 386 zcmYex&)3l8HK1%FHduFDgmQD^b!>P=Y!V>|~`_9h?e4Zo(&@mWD?bEQQl(u-ys{c=X3Z sLIj@*P$1!v2TAgB0TKCu=bVw6oL#JtmS3chlb@cMtdNwG4;0V?0QZoMJpcdz literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/verilog/keyword_feature.test b/docs/_style/prism-master/tests/languages/verilog/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0f751f1b1599d86d61f2684ce3f43f7f7099037c GIT binary patch literal 7508 zcmbVQ?QY{X5d2*Oeup5xuSM?}`WS~pKueU&S|(LevXguI&Mc)kX@~dYfTHGDIgo2DCT@>fwtn_)P;#baBew zT~MqPtV0<7+{&*g-xl=HO&AV^EBt})Yb}1D@Y96v8Izi=ju2fFRZ<)Rf2CM3 zloi>9SnG>_-6|oj)J`{_w_?m`owxd&szy$nM(;5jTXgRSw@&B+mDy!?Wo?5(aVO5G z4;;8p$Aj-j{Pq(U;b{we>XKNgOSIa)1pe6OkLs|-ZV3sN#E;QOpB-((A9bpzVVXV< zuB-BE>Q_zy!0ftkzMG-FraOr^}e3&U3T|ExZ4-7a-uXur6E zjq`EE!u`$Ds{R#fwM_I6SQrgqHC8evKZNM8V?)Sgd4Z>NXZ%R8IzAkLKI1ka`m6v( zf&B6}_5rnbLp-d2+RdTuIgIBY@E4AbOCH|@W!vrRd~ zt`F!7<+S$Hi7*!@9b#IsrV!^^lu+TaI5UoU3HM;+ygzJ)Rf`#>u7Ted7hzqi)wxYB zbBm^Mn#^fX$u6VKlsXP?#pY*I8hOU16mhsPr>pC7+Be+H>S6S&?*lgnKwaD3BHAI2 zn5a2r^!MW-+KGXAP)+5W?j2VJ6Twwu!Wj72;j|LQjVsR{+runol6N;_g?ctykDW)= zx}Q_2Lw@i=R8tOgJ2+r<#)l`Ow!m=K8OFoj&L}WCi$2}q5Ula6qAb2FZ4)(!_s8)gP4t~+UP?)iow;4<17dP(l zfKGWIqQLdUayQA!4O#C{Iv(s^xMAOM?lJRQ$ji#jyrqDjcgK10`;v0cwcl;vJKiMB zh6Sc`KL=i<_b}nc&Q!Cm?_t61#V_xrJ7@Z8=jWBxBmp>N48x@mzHnJJK=nvn0Yn}jTw(}-Q965^GkfExd4M46{gqAj0FCB{3a z#PWC{{9=@;+qc}8N^MUf+VUD;dw`~g+=I3T%2-xI@9~s|YiOgfEiP$*dpz8NEhcG# z7BOpddy5<37Gr4C-rE*b)J4ZITq!UPQgRE_HGtSd0v5_QkgQID1^YtbL-eoEq%H%? z4|HoL3=KqIEKDY}g5?+r+L8_d{luYbS|W66p3(x;`xDeNhSWy%5eDWH3V0+x3jL4` zDcI5@1z5hM0VYrqv5ZP0h$E#O35Jw23DbaOWfIaoS>C4G*Q~mQF|!jGQ@e(kxnB!v zY@TI@LT5`CHNyN+AxtP+^442tDW_Dj98@45l2VBx`SD2J&Dwr(B0PpK>w~jjm)I^NEizjzVich>S{F$W~c7 zJoyXJn&Pe{*YP1$c1l8Nk{VHRup|vJnE(l?XABv?Y-@arL`c9$fQ*a+NYN-cIU6M> zVbPN7d~&CGgx1dcD5xD9?#z(VB56dbNMjE^PvJ%;DS+&fl9O&y@=6;wkk;E$87id& z>PKd?8;7M;z;3AnTUjopLfT8q$%8c!HApLRuhg07id>o!gIts1oo!Q~K3|{sxP}@D zIt6Ku-zdC>f_|&8ld^qK_C;f9+#K}vhW7H&gIwPuBoWngDz_*QBOA3G?4txK9jPFh zj~ihrT7$t<(v8woP~|uk0@726$$vJ)l@^ttd}oX}Rn5tyDmkfDCEvJK3CV|#JgjU@ mdR76_VMySL#$a@xzaJ0y|8-jTue0wi)5h(VKmG;kbmDIS literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/verilog/number_feature.test b/docs/_style/prism-master/tests/languages/verilog/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..09af48ada5e12f96e7dd7056e66c3d6ec65bd44b GIT binary patch literal 556 zcmbV|%?g7s41muIlSX%q9+q3wx@fRT%LdCXXDuv6Gyb6( z@((sWwK9`tMwTKn^#REU?hM8Sth00*G(2ZZD^O{JQ76@?6Eip&$K<*l&0ssI2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/verilog/property_feature.test b/docs/_style/prism-master/tests/languages/verilog/property_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fd3f5890184068b25d6253075442d3b55c6773bd GIT binary patch literal 233 zcmY#M$t*6&Nvzb+aYic@6y+DB7L`;g=_n|vK+RQ()lmS-l;$Ou ylqQyB=I4PVHL!|mD#h}00TKDmaL!0g&MsC+%P&&MPA$qy%~41LSq!wbSPuX!tT%fA literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/verilog/string_feature.test b/docs/_style/prism-master/tests/languages/verilog/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9f6374776b668c000cc67104d4132b89132de1dc GIT binary patch literal 257 zcmY#V;^k6G%a2jYPf9F;u=8VhxgZ=~E?qJJFBdOYG%putv{G?NQD$Dcl8%B>3=k^C u>R^ZhZH|H1jY}S+peQB}=pc{^UM?Ua-&xKXsma;J3TgR83J|vy>j3~rt2#;m literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vhdl/boolean_feature.test b/docs/_style/prism-master/tests/languages/vhdl/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4019c444f8b53c40620226d2914ad19fd46effee GIT binary patch literal 201 zcmXRZDoy3(N=wWs22#9Sx?}*5zGz-9&S<5i{QR8M#5^S(1*H<8xk|A*=)z!&lwx_g YfQWqCoHJ6Bvx^nd@{1IpRu=040MAk^8UO$Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vhdl/comment_feature.test b/docs/_style/prism-master/tests/languages/vhdl/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c9028e7d3483039221e2c36def6e1aba1dd6579b GIT binary patch literal 211 zcmdPZRdCDC=jGDXP0P-CTABbq~#YWKbD3uncD#hwx2t(~s bisj`3BJwSC&PYwpE>=j(FH(TnTC4{EI7%+2 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vhdl/function_feature.test b/docs/_style/prism-master/tests/languages/vhdl/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d4af875eeddf1d027dd02be5981eaa6d2733b80a GIT binary patch literal 877 zcmbu8!ES>v42I7`;vFoXXw^==A+B~CUz!Ea%qa@W= z;1mP0M_N`zWk?CRg3Rs(l_ZKLVCB9yzhk+)#P=Q&Y=LkF7&!ZLv5WJea&ZX^3Qn5*Um(|xwZ#WXHz_REK-R0>qwD-OPP(0Q z-`&XAe{lnNvo}j;5ZjBijkpWwvt}dnd7o>G(=Co7(Kyo20No~EUCGC*^v3QFbH2Cx i&pbZ8OL3@R&l+0$6_Cn-OR34eD&UjUN2a_`Z;#)A%k+5w literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vhdl/keyword_feature.test b/docs/_style/prism-master/tests/languages/vhdl/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e67f11ef5147e0fea0f667ac677483d6c02898b0 GIT binary patch literal 4133 zcmbVPTW;ex5d2;PzC+-j`I+521bd8`K|s-z%#BQH`LL7QZ*^0C0Tp^NL10Q<#a6RP zb(dbh8C(3xZ8xvqOtvoUeVF8CFj7QqCF$~<1*jkMfk(4k>_fy_%E2AWd$+FEy7&~$%V1j zWrShI;u4108@ZdoG07f$akkVX#FWe@hMZkO2&Rj@l7utI2xmuwpWv{y!F^y#sFFC@7s+*8ocxvpHW8!vT#RjwmMB@o2`G{j zgtMe*-Cm>7OWBkb+`9Y8*_c2~NO#uFO70)cRC3K*a@Z<7F}qpqS&olpDj$pG2_G^hrHJ+wuFtHBqk_oqcNzND_Zj!yq0f|V@tpA_yLXMI>#KF3J_W6*OStP^`$Iix zZLdvz1f&l#yEH~>Ujumba@RW9BLOUkgo}dt z3i9g<^sofgIBZ4}Jp`edXtId012s0`L?NgiW@krAwH6_-;)^1x#ux&5M$FJ_#0mjN ztsg9Ok$8lCshtno5m~xK6*31Z6B$4=xC%+a7Y#?vtJGxJMSFgQWwu|UPRWG3#`Tbl zreE2FRnSsM6fOn6SZ33}WJVLk6lf}$K`NUWpgNiXO;{5|lr}R*W|S|sFBT}`oJ_f? zbqYehQ#G+h~z2lHNLNIp&+ zflDWylimt~R_>HUgs>7)%WQ|Bgg$OvO(wPZMr7J7m3H@4EJ;%7Bu0?ycwb#kRc&m6 zkp8h;UyiWI+4KE4n}#J3EJ4a|)fnfLld=EEM-`nW=Y9bH06(1(1Z!rJ> literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vhdl/operator_feature.test b/docs/_style/prism-master/tests/languages/vhdl/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1277e5dfbdf20e87f131dd624d09b3aa8cff5a0e GIT binary patch literal 811 zcmbu7u?oU45Qb+D?j4Q}4%O;j+AcnZI7F=orj1-2e0={1F5XRANYj3NNg)3}$j~!& z(&61=tfXP8Wy`b_{DxzeIXz@bXVGzD$}vh-j2JKnCQVT^sf76~Ntx#I@ti@P7?_!u znjfCBZqKyXSLr@#cqFaXQVrE%EnlbyGh%1O&J|miuI%#0JEpeY*7KIubI-+vTN4Rb zh)66%Mu6rrkeYQ7qXT1bpcZI$MfBE17c4|4EPRV*)6yU7mO?qygKv}R@K5h{*YR}A LazTSX<;$BFC=lFu literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vhdl/string_feature.test b/docs/_style/prism-master/tests/languages/vhdl/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..982ec897841bf3ff6e5d48640c7e173d9c78f02a GIT binary patch literal 257 zcmY#V;^k6G%a2jYhcjY$xsno#fLvZKT`~YjUoaCZ;GR59lJ0Dqb!iBHvxk8L7$H#R_TpMG6qd73%>2uW>n) literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vhdl/vhdl-vectors_feature.test b/docs/_style/prism-master/tests/languages/vhdl/vhdl-vectors_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..1159abe3b16b3edd4a8ecc4fde3ec272a7e04bf4 GIT binary patch literal 385 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vim/keyword_feature.test b/docs/_style/prism-master/tests/languages/vim/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..f015204d3592fe882dbdf547729a987e5761ce82 GIT binary patch literal 25627 zcmbW9+m7SPt%k2Nz`Vo4Tqk*n-0nTd3@{ax)EayYQ(<$5rMHgI_ z^T{!nvsntB2FG5`=Y->Q3|7lId5u$--x0h9yd}K!S4TB&?S|p&m*YWc2?Vsy`8oRQ z)KWhx(PM9HKTh{$IKPU+@x{MkS?zb&cnI%B-ph0vUWVR0uKx886MgqDy(-Ib+ICK} zzGm0hbW^recd81*x904hnMVhhbGVT!`<#PthscHMTA%mf8kA0MneMC0aeHx1s+Ht> z=}i}|6TUgKx9d1XjokHdALf3#Df6B3&}F-ZM~$k_E?c!z#>6n3##H`9^p9C-I7sys z&M+z)(L4gmc6SK=TlXrz+3XqXoJePiZk(L=&OGg^37zwE^Lt5xD7+NL}A zo4MNAGbg{<*vafkjQrK&>*MuswWy`5y6Ik>_UkD)zeY&kz0HTsnSPbmWe9h;ICOM< zr9?yt#%LCm!{{u`&<1H z<^}^Dh!4TpIhbuuT%@EGgzEwDXUsk1TkBV%P(3w^k{pj9gDD@YP z%Gx`Yl%ulWUr#R*)NssFp9!BeXq2@@A3v2p!c`Rt*cO#cu3F3RHTqlvyL;ds1x)yL~$IjJkDNXq@ zUD|LbQx)kmy0nt~V{!xjA*9n*2{hQf^{Spx<+4XK;k3|RCG&UdvSSW8;WVu-|JN@@ zq)xX_#S14ya6BkMf%7dS%^Ert^r(KSCK@$LjQbE_g)(})8Qt{+Li3N- zoJME$Q%IcG7Kdv1W9{eSjGyU>2-#JGee2bz>97(Fwf|msY3E=W5-(?x>@4xsO3n zV_9Jr5jxWemB_`D839X;m8rk%EQjlAIn$?!-}=X*GG9FU2=wb31CzWegkkSCyS%A> znxhQpGe0g7cT&DI(KLZQmb%NIs&Rp+kISF-?_>S-_|{7uL?f!^vgOop*>3KZ%1=1i z+}BAZ5YQlz!%yq_KhG~bR$OnFqXpvX;XojocS?5QBs-5m)76SwEuW1yS%V3v0(_*gP%eMO6kXG{oV6JmYsV6*lr-HGlciUi2}leBcanx# z)N1(=ezlP>iC7Lw-Cu{ha@RcDVe|TD=~XWRQeFKL-wB34)o6>AuE0ThQ;rH_xTtbe z-T=`Ci<8fFS~#ZmXDs04zZr2ms<4L6za8gLuBs!PXyV05+^$

        lX>kBE2wNJ(*a& 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vim/number_feature.test b/docs/_style/prism-master/tests/languages/vim/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..66b6453951a770f486bcac7837034ec5c6af9955 GIT binary patch literal 236 zcmXr0a7s*ZOH5AXaYifUmF6a;7Aff{C>g+P nP>R(-lQJ>F6oa}zDVCQDh{$(_b4F@%cCkWQevtyiEya2OCSNhh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/vim/operator_feature.test b/docs/_style/prism-master/tests/languages/vim/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9f2ebf937cb1f1b21a40467b839bab1fbd4f1659 GIT binary patch literal 1116 zcmbVLyKciU44f-K|3KP^hd5S#K#!rH5o8F86g3*uftAtlxA$D2L(7|DNTPAPBWamj z7U??gitObmJMVhwlXrs*ID-V7NfOqIm(;>yrvh8NQ_&;}kHVwyC_K7(qC_ZT3xi!? z0A|Sma|?rAU;vI)#`-lqyhGL}o=tc1?&Z`>_v?IlOmlOPW?7o^LH=T02h1>wCGIVB zw9t-4>n*QOj5t{0K#9Q;10`ll-k6fHB->x?8jnwiK+a*Vfj9<4xaH@ot0yHE0olAIiHK)YUOHsmH`%6NNilDVCQDh{$)lb4F@%cCkWQevtyi H1I2m(1N1_r literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/visual-basic/boolean_feature.test b/docs/_style/prism-master/tests/languages/visual-basic/boolean_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..cae281b7761cbff6a0ec92f953c3271767f21901 GIT binary patch literal 236 zcmWG3Doy3(a!br922y_cB^jA{>AYOLT)JcckiKYMF3xDBr2PDx)Wkd`9R;Njpan{? lI_Sb+8?lH(ouCxU%LPQ_yTdsnH95OjAuYd10qU4yJpiO^HWvT@ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/visual-basic/comment_feature.test b/docs/_style/prism-master/tests/languages/visual-basic/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..41e14eaa1b5c0988999f5447e882baa695fb5dcf GIT binary patch literal 459 zcmY%AdkrZ~OlDblCtPZ9q*o845C&nmYRRMH1E^(+kaY)a^C5}g1v{H6z zWqE#43ed?)z>okMf$3;WML@*}LwUJkK_Ng!!0CeYIcKCMXBR7^wsiDWQ0C=QMu>xWXp%54SjrHp5v)zY5UO7RCL91Z zkC#iA48Y69%N5Pb#Tl)Xl30?eq@$pujNQRXu{x;AkerVp2Xj5hr8p(A$iRGrO&8eP tn1;c$fC51&mX`~N$PWqUjMU`pVuiH)A_Y)z6e}d=r6`nS=B5_w0RWklSmXcz literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/visual-basic/directive_feature.test b/docs/_style/prism-master/tests/languages/visual-basic/directive_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..643a5c594ec8fddb2fe3d2fa5e2d4d35bb8a8d95 GIT binary patch literal 863 zcmbV}O=|)%5QfiP*#8jXrGkpPi61HSWP9*jZ$>1WozYZ7Xt&xbwGJT+ zlX+(*^Ry;fS%)4Vt5*}91G+~uQ$rlJro};Ywg%;6k19vgA~;(IMv0dvT^k9vSl;o? zW@EH=yj0+-I^zzk>j_(JaR-rpd#^qg9#opFK|b61_0L+%I6~g=dy*157>>r>;QY8k zoQX_+_~u`NM5Gy!6b8jG8Kr~?$}%RH>=TxZDa#3EgMPtMQizPvF~xr7IO<+uK{t=1 zn>o%)1Jadm;OD@t)4Rrt&WYS#>pz{gBXZ{L7!nVZ8cYqRZ%}+k>P#_@{uthwynWM# x=S6Lo+;A1J@(a0!Sr0`2Wy^6JFXG6b>k03Ehze~`WuP)zg0-bup$59`eF7h#^eX@W literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/visual-basic/keyword_feature.test b/docs/_style/prism-master/tests/languages/visual-basic/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..73309df28cdc0c3354ac4bf82934d312850b3064 GIT binary patch literal 5008 zcmbVQ(QYC+5PUu){vqOd@BSeHl0$+_#E@mB)jk-;1Yd?R^2{XR@2|=>OLkSf>}usP zUG28rZnvv*TUGy>rmAfi4sNR|*tRWp=+@4(_%u~)ZtK>g1IeBDwKWYor=^AB-Kn!| zznXeD7@In_Ekt9}ZTI+a06$T0Jl-2jG@cla8c#NaCU%Q90kft-w8iE> zw7zMH_@;AB&#`5;SnhowQby&nqxse8NR{Vg?K#1&vp z*xJ6t1y0-nKV7ifZfrRJ1YVfWq?Y#J-|WwOx3q14fR~oG>jSotL%T#Aa(5*Uq1>Cwzhh141WweZxG&*2I=}2p z$9c=n;%v%}Cxpuo-HLC&g=wlWRLWDco%`+UaIo52%(vR(0PsQltO8bvCWSjAkG|za zN@4PxBH(}T1V9tD)~>^aVH^E|y{r+0HhJb7Pi;8( z`w#wc-1p(&ukWK*dwTbw8hyDLA(v(Uj(&U*U`lifW9C!xrqWX8MujLNIeQBAm`$NE9A_;Qrs#lF-I$Pu2ag9#g&}dTgjPgrF}E5;F&N}G>|lH(OnV&o7d z=6j>%@c~j$ytWeHRh58V67H+g=517R-cBjMvg34l#fU4Xm7hvAAibRuiI1s7((9@q zcaYNa`>Q~8_0kJ1wE1K!F<$R0;@M6CG8M#UUuySiTag$jbutAdCv{MAa0wyKN6J?!0x}H}1LT2Th>{wSn3F;pDNNi-Lh%*7 zf<*SEFqO?BKNHFzY)a~s??~yCGB}Y zf&3(&63c8_<$ zD?`2V3-=t!xEhfNIVt~j)T&!@;qPK#CiDtP3|}IN@@pv701AsmfdDR5f&z2dAR*Kd zQvRv1kT@$139$4Kz%^2niW4Ci7D-Z@Rg(r% z8Kp4!I-LtGF@Tkq6r&VVa`nogPE)F>dQ(U&=LB%B?-ay>Ps!t7Qxw3GP{?zQC=eEn zN~}E;%Sxr5>r4rCiuPS9Q8ngVnhFfH>gdOCfd7A9u#We3``X^@e7Hf$c9SdD_MiU& Da%-g@ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/visual-basic/number_feature.test b/docs/_style/prism-master/tests/languages/visual-basic/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..167a73a4af1cbb98ece9afef8b2497d340db2406 GIT binary patch literal 584 zcmbV}!3%;g6vodD_CLrDUDDC!Gwo-A*)@Mvd-?1|0z-mg&o*zbXZO*sOxjb8^Po(2-8;pL_ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/visual-basic/operator_feature.test b/docs/_style/prism-master/tests/languages/visual-basic/operator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..c5450c2556f3dc3e6404462668c34ba433e30733 GIT binary patch literal 845 zcmb`GO>4qH5QfhknE&v)e&9z^sb>|Xr{07fU6nL$t4KFtv!VF!n~*HTZa|O@dwS=2 zcb1vi2|}hZrc4rhra2Z^G7Zqhim8V_I!y2R2R7!c?GOhh6tRg+^!x19;LaCZ64WkqDyM%oXs8|YNIq#H^yDx z(5SJ_oV_8|E8#MK3I;v5{)AB6;*4v;~d6i8G1!&rYb-7D&X+*%q1XkSnH0=qywE!@@B!oe!Lt*D#$Lj9>rm zpQtMsxoGQ+S4r*0VwzAY#g+NCrcT0m)9WmD5n5Vk7ZFmX9-}Af2Y=7~Aj^t@T6aT~HoL@;H$YPXdX1AG~Dt zm%9m)8j}231IGvOP1p8A5Q-$3N+h63fVj<{U}rN#;@BNGEy2-RZ7Iee`f(kI!`K93 zTmMR-BQo~VyF=m<8M##()pS09UlY+kM|J(PPe3A*x^9T=z8eTj&a=lvu*V=y9)k`Z zg9sjj2p)q-9!HW)fJ`1oGIE2*;IX5)2aiDnkC_M_M>44k9)lS?rpQ-oq#qHj+XrIf zYV?a(yQU)(L=JvzH%YMaj>eGq{fmzjcaB*!97J&Eh(PBer*0!ry#`{_9p8G)D?Gui z;0%c142b9qsN@XDCPM{o8F{|G}unhrRE9Q(M)(?RXtnH{Isva&j&DP? zri|EB4b~63KGp5E_HKi;*;Ye^tM87>g=^e_u04b?y12X^J6=Xu_udUp`=(o0&_Xm! zF&SB8tUd%lY{D`HwZT{1yX{DR97fn}sU`ekFBiwkSFnuLYot_0%tnuur-wu2BYxFS zhKY{a`=KJ|V($j$Qp51eJ1` zs-m|Jrn;l^6@IAku==rje0=&+}0f2NQ+YGr4Q?z_AQSuYJWx#pYaW)Lza53oYusoHI!; z!g74(ko3}Aj8tq|X}~Yl`37~EIWr8H6&M|6&JBj$%blBz$(K7BIP0fka28i=5M7a$ zRWmfa?~!4aqdLqSb^}&s&F)+CNA8(5=Ga2zgTi(zABPP?J_wtOd=NGw`5@jNmca^E zAl`Q7TjNc2J`CI0d=OrPvS%2!$@w5`sY^iEewV>Yh6~&Jd}H(pKt`DhfHsp&kT#Po zkTsJnoH~;&kUEnskUEnskTH|zU`lFOFk>dq!3wOYGug7GO-c)+&SVRu&SV>;&g3~* zK>#r)m6>cAQ)jaI27qsE;`BE`_%4?ZqHlQlDE{7;595zN`LNdUcf@=keRIr5X^WH@ zd~K03LE0i^g0M*C_X*!q3qaLtJ}7;sm66s|QIp;RsY!2v^rW{?M$%g_Bk3)ene-M= zPkIZbCcOnxlimWUNpFGFq_;q7(wiVH=`E0%^ycmh=L_OYnE~ZvT9=QZGmavZ^7Cr# zDCz7Z-xi&-3YZPB@qjIz>DO(q+ZZ%9if%Z{E*GpK?<=*eW+(v!(T z>B%&MD(RP+OqMM*nauYL_af$niBa;x#54u3X!`<8BQJoaZ+it}MO%xTh0)?>VYIke z7%grVMvI$;QQ~I)sHFpHG3!j^n?U_QJq1@l3-47MUXJ$x@l^AUGGdN$sc z;{j~Mdme1WdmgOE+gu6G3I)WFT?N-8eifVx5dO+K0wjH#HLbrFO~_a)=vTz;8n_X+ zYv4xQu7PurM}FTY1tB8XT-2u3A2d4BsG+PyKk7bH06|HCIqXvfEig-kJk4Rqh0%blDm+O9n1}ZWV*zc7=N+Vb7NNrp@Bs7Sj4b?@0w5Fcw zj|B0UJeSc36-p9f#7pNz@KD1faAU2{r8rkP34l=cBsNeTl+X|gqr`?(DWx=Ok>Xk^ x0i&hzsoF}yp!`Z=qaI6OPYSeFkIM!A%d52hdv=?j{mriPH<)TSv0SUa{U6a0FPH!T literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/wasm/number_feature.test b/docs/_style/prism-master/tests/languages/wasm/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d0224e84d619c8848e6a205b7c71fc4839ffd29b GIT binary patch literal 1080 zcmbVK(Q1P*6n&oHKZvh3l5{D`-nLSo_g=~+(@4u!S6T*s{!S8WM{o90k>uQSt})3u zGEMZ7l&;dG&`UQEM)6!KtyTe$Rs^Um1WlEjM71gEFew5k>QYK=g>owZ)3uP}o9PgOamO)| zBJAV=Z+C+CgiG)!LORbl?LCas@RSQTkK@|pITz;)M5S9MxIAYhE=`%?qR$YgL#Cp9 z$QYOA%*CaUL9YGDyY|O`3pOJ1%Chl literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/wasm/string_feature.test b/docs/_style/prism-master/tests/languages/wasm/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a55a21a28f3dbf977a3b05a71da3fac37778cba8 GIT binary patch literal 448 zcmbV|%?iRW5QNVL@(y7yDpbj#w;YAOL|2MR{6R<{sVC{XJKHKK=F|{Kc6Ju#TOzHf ziIIu|yW#2t=b(pm081Utr~NuwgU+s@$LO%e|k4h(#;h S`D@u-{pp^u?qsIjTUSrt%Es2t-XSI~KB1X z7tPDX8Ld>7Sd^KVl#{BYqoAY$v{@-u2U8sC7OZkASVb}23vsYgEH4)jk?(5fjMU`p OVuiH)A_bV!i}e6bi$k~o literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/wiki/block-comment_feature.test b/docs/_style/prism-master/tests/languages/wiki/block-comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4d4b87a170500cceb70908d31a7c8105ddc32f1d GIT binary patch literal 278 zcmdPb($eSU($`W*%g5{tlmUM^iS052CWS2QmdXS7mMPJVK>ZgPHZZfahM yl8%CsKF~&`SRGuFP=^pu5mOYC2XUcNEH4)jk?&0BjMU`pVxYA}3Q$)T>j407K0cfP literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/wiki/emphasis_feature.test b/docs/_style/prism-master/tests/languages/wiki/emphasis_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..952dacbac432b13ca92b089478e031f0c750c8cc GIT binary patch literal 482 zcmbVIK@Ni;5ImQJKM*clte@yJ42OkkB(-1!FMYkc)~*M8Xx#&lnam73#^7`*(PgB- z!@;yY9lQvW;(B68*GO?`bo(58$RX=W5rD`zM_*i=MH_9aH|f%FSE0ZVJdyY} zroQV?W>@iVQS3%Rlzf^ld(tYjoA;YRlLuIUl&}UPH;LVFNy|R1cPboiU7y>dn#_ zsTD@XS&K(ZzDGToP8r+WTcxla{;uGy+BW$QhzVIhz@1%0%*aE=ZX~7@L1jM^bIP!D e0E$UfL~;}*_??dbqV*v9=L~l}fsy7V=F11|GT^=d literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/wiki/hr_feature.test b/docs/_style/prism-master/tests/languages/wiki/hr_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..8b09825ab16312f2850ad7c9f844f85dfa8b4518 GIT binary patch literal 198 zcmdPZ)z#(Y0umq!$^i3-CqVk5dAT^Fl`@KybQF|8I+bE|&_sYjyj(y;z8%gPsma;J Z3TgR83K{uDnN|6DC5br-Mfv5$dI0~YCWHV0 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/wiki/nowiki_feature.test b/docs/_style/prism-master/tests/languages/wiki/nowiki_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..0d15443b70e0d9cde6a8cd9d6e9a75cacf3be5ac GIT binary patch literal 1101 zcmd5+OA3Q95M3L{9foY&*m{BBrpG8Q;-?xciI_;C;@vyZxM}M`5!yf&FY{)2yvz(& z`XL*c48u+9afC3;L>Gp@Gx1D#?4y)$qx&u|*LXgPytZ2SjtQ&^{*fNgr$z)kAK&rL1QNG(c@jpgO4tE&SOP!dS-a_N!*K>DJ2xj3VhiYs%I z@^h4Q6qJ-SC`2oj7J)@k8~~I-(*$%7RzV!1Kw(}kAR^z@&Kar6*~JQJ`9%sv csVSL7smUe93W<3s3dNb}d5I;ZMXAMl0BG7#rvLx| literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/wiki/url_feature.test b/docs/_style/prism-master/tests/languages/wiki/url_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..35ce30fbd86406bc5fdd090af7fee7549b34fb56 GIT binary patch literal 670 zcmbV}&rgFe6vxjt>HqN3GcB$g4mfT~vV)7!i%COFMK%^%SPBa}82@(HjTu1>hIi`w z^?k3OCqxsbMHrPvOZB!jQfp~GFD|rh9AhN1y55Jb+cXVJ6icLLGGT|@{nFcHUSP(I-?%gT6k@9!Q7|8 zk6F>@XbC>&7(G3%?k_Kl=m@i70;3y24n`3Ni1-&05<8uyk$lcFzlD0RdSklT<4|@G y<4|Fj>7PYfz`f2ZZF0Ko`M4v9Q;U3=rAc1FrZk{-MP4~z|K@-lD~k`XgV;B@Or-(< literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/wiki/variable_feature.test b/docs/_style/prism-master/tests/languages/wiki/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e78a8103263eed56c584c8ee1690053482253dfb GIT binary patch literal 368 zcma!#_wx_&caD$e<*Kf(Hmt3!1u+yMRIq1=tDmE*PYp`VOGzzqDJ@DY$;{6Kit=*lk^w;aqItPE zqm`2L^NLFn^GcL-6hHz%k%H2^6{T1piRv1VVl3)nV|7R|6VpF9&E@5a XrNpbw8L7$H#R_TpMG7$g7V7~3^nG03 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xeora/directive-block-close_feature.test b/docs/_style/prism-master/tests/languages/xeora/directive-block-close_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..911b8919a2a0a219a58bcee58ad660f8679b64d1 GIT binary patch literal 283 zcmb=ma?Z~yDay|=R^jF1<Q4a&bm0rDPVRCYNNErRpZ- literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xeora/directive-block-open_feature.test b/docs/_style/prism-master/tests/languages/xeora/directive-block-open_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..d1f1bca3ce3a6b9078786585f76b1e080a771bca GIT binary patch literal 1553 zcmdT^&rgFe6h2GB{{UsjVS-0)q&9MJY*IWC4h*Z3O^WdF!ar}z&};=4!{Rb~Y4U!4 z{rcWF!!G6pRD65mwz@XMmZKQrRa&tE`lv+lTFy~Fbt$C4-b4YnHG?JguunuA-}M2? zki9pomY$FVwR_JkwzVqLq6(NkWr4Dt_V zueUtg*t}!~nj6w7yk%2l(4>&_&WHpUlq7QleNiPt2T{A2p}iHkB70Kbt`Vd!;zpJu z3;o>r{OIBxD+dEIN=?!Q4yn0pTL0_wXiw|+>W%)%v2m3{mI74yx&bD$)vrS)lKapv v^z;Gud#HPA@MmBZjhPPmWHtCLy^8F0h;=PFMgH(B%Qm&~%qwF|1MBNgW{l5Q literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xeora/directive-block-separator_feature.test b/docs/_style/prism-master/tests/languages/xeora/directive-block-separator_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..e8d9999f6e2dc13c0001c0c8c82469006d931933 GIT binary patch literal 310 zcmb=ma?Z~yDay|=wyNgk;^opM1Az2J^Kx-UE2U%>r6!kTmZj<@<>V)4>lUXLBo-x> z~0*J`> Ym~%#Ia(1yoT7Hp28p!EDcNgmc0PAf_y#N3J literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xeora/directive-inline_feature.test b/docs/_style/prism-master/tests/languages/xeora/directive-inline_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..fb1878b9dbd66868a3ab72734351976ee8674172 GIT binary patch literal 814 zcmcgqu@1r@6r3gD9|&bECOCHG2iyq*K~!P`hSGk&fI3i((I%FK@b0+x4vz4Sdl!T6 zcLV~$8&;piUIpXggClFOVIN=!=z;|S1OkGMzy}+Qj&?HCy52g2TaTt}zlsG{{Q z7ct=-ma;|o>7-O&Sc#KZKWi7Us7`6e4a*|A=Un}t6NtOJ>L=b>l!dtNaNj-8iWVS{ XIYbMxNAo>?Hu^H4qYr4Fz+rm>KJe(x literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xeora/function-block_feature.test b/docs/_style/prism-master/tests/languages/xeora/function-block_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2bf2f330b5855312c4dba45991ffb60e5242aec0 GIT binary patch literal 963 zcmds0Jqv>{5S<&ye~`n`3hgMA4h5%DIttR^lt@F>l&FQ$kKf+JnhKRTNT+5=c=ztO zd+*{#VQ|~>M54T|H#t_-4h!aoO_}P)BZxwm5_g>Ct@bFfSlplOz3j3mnNK*BP!dxz ziy>1@)LfMFBp2xkJV(O{KWn@}9a12;aPV{hq7d50fDv?zLEvUmI|VHHYeV}8WFh*7 zX!Nu29=3)|r}kOYv})KxJMv#ibV126$(ib7Bx@Cb1S$+rH8eycZANdZ^tP qt#Th$dG=M7eU+~b`+;4QDBGrgh|Q6ur^?BMbUwd=mpLz4<-Y(t^8Y>n literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xeora/function-inline_feature.test b/docs/_style/prism-master/tests/languages/xeora/function-inline_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..2449eecc5262dff950e5d8a07aabdb69825cbb42 GIT binary patch literal 721 zcmd5)Jqv>{5S<(FKgi*zLLCd@P;e@xyEvSpG}JGm77F5T?QcB(MvaooO z@gf0JmvI6r3A89N3If#yp(!C4>j!mP5xt4_Yj1;SPsFMF4W0oZr43c`zpVF-f@72^ z?^br0)TJIkStSCSQb;RZ8G>PwF!V)!@2Yfbm3~%nW|igCM(;F69v=TH*Jl#HYCSE5 JzW6V-{RON3z)AoB literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xeora/variable_feature.test b/docs/_style/prism-master/tests/languages/xeora/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..6fed61c994ec36c1f532135813ed7c778eb7d240 GIT binary patch literal 1191 zcmcJOy$XXc6h`L;@(vO+`S%8b(6K`c9VJ2xDcXvW7zz3D@ zBuU@~b}~%8FcUYe>g|wF!tDRIlFRKx7)$$wjzYAOI@DC9 z*jOD5Nx1#kWTTa`Q!C5!i&B8*C;^?P6bqygrtxycf@~zip}HV_&Kar6*~JQJ`9%s) U=N2m@=A|eUrRF9UWf$uK0G8QDGynhq literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xojo/keyword_feature.test b/docs/_style/prism-master/tests/languages/xojo/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..52a419b245aa393a6cfd1681ceaf600f924cc749 GIT binary patch literal 1957 zcmbVM%Wm5+5Ik3a{=v{W?LRn<+#0Bzz>nq-)|T(56$UmOOvr={%F{V^?E5VOy-iD~g?VtP>f-NJZ}6V0*SLXKEsVG(iPMe8v&&mK%Lhs$}F z#_GPwm9NMdV@WA41$n~wSNXW9rNkj%mzA_qArv0_uKZ5N(L`IR7i_*7I=$L;BM8@1 zu7h68Iw0}Q)(?8Vjf`;wan;g;A3X*COS3s#-?J z2ZnkIYAX;zdxOE~ge&lD#|T$56#Yfv)Nq7J9mw!=OESg>f}Wd}5H$IjBa!HHhNAHa zJZG1s(m-ON6$E`34?=ya2_ciNT*H&zFj57G;#bg5iK4Sqvj}k(F;1`|Qki4XN%trr z>|-QlB;hKR3}$ViV#;CzQ?0YylJKOz3|B!WxGFS*RkDlcJj3&K-JUd3?fcQrhtWm6 H`yYP+q!J`8 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xojo/number_feature.test b/docs/_style/prism-master/tests/languages/xojo/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..209a7bce07f996cf6ea761744393a9092841ee03 GIT binary patch literal 439 zcmXpp;^i{dGc++YwdCb8&@)Z7;N>#aGf&kuH{s<{OENGtGyu}cPKhaQiOH!Tb_SFU zWagWj0JW=?0=4pT>5>6J`l5NcIHQ&FN^_G^i_03yYO6oc21-voXpaiEg4l>qFeNF7fA3aMu)8NiPLG)(WG165 zr_3T)vN^(vQd%NxsG$=AgQDw#i?O~^aqkey@i{oEBHsdG>pR-H2krcbPzO5rKzn!Y zza|8P^p7+7jtGmR@q-KJ(Fc=|$xNHj4CM;5%!GM@Gqat{Lb#H`RHCJ3-AG;2NOsb^ z>RY}aDMPppE#_U2R98`Bg_gjjN-ejnKtE~$b&yhChJ-&;F)ae$|Mybf+@+6n%WW*r= literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xojo/string_feature.test b/docs/_style/prism-master/tests/languages/xojo/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4da4f5521661e847aeabf4e1adc6684b53f30b02 GIT binary patch literal 250 zcmY#V;^k5T0wC#@pRb^#l$2Nm=JImsk^y+Rc)6l^xj3Vhic5+z^U{@c6qI6sP$^ai oizqG`kV`;vK(~M>kak`!AR^yQ&Kar6*~JQJ`9%s4hZXAq03Hl9p#T5? literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xojo/symbol_feature.test b/docs/_style/prism-master/tests/languages/xojo/symbol_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..980c0f13ed72eb019a99febf21a61cec3026c16f GIT binary patch literal 323 zcmY%POylKJcFieHg;EfHUP>lNJfJ8sJvWh;i&CA6ZtyEl@o0OlUq@$pu z?3tz%tAj2GvLA;qcJ(0lVbK6_uTm^87Z8!}Xy=U7FB8aDun3tkZ01h2J0A=V-Bme*a literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xquery/axis_feature.test b/docs/_style/prism-master/tests/languages/xquery/axis_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..08aade5d9d7c056c6cb3bbacae0e093566565ce4 GIT binary patch literal 1161 zcmb`G!488U42I7m;T;TT*#mgpV;Bzzb&?Sp%@ngApI4 z62TDQIB3DNPd#cZbz3s?-pYRV5K;!ClzB`2OdRTDueRXCEUY-DIXG`@NR9RpJXzo% zVp(*KER5)dgAqn8Mz@x*MLJSfBz%Q*b=8t-*4)p`OQXX@a~e(Rzj~df{>LVOpU!0{ zQN|qF-q#$+J`Y78vG+N!b^dY)aaKz(N;GQUlbi?bkZT%a)P=RWu#Gg-Jx1U!R}IEi IYyo%w05U37djJ3c literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xquery/builtin_feature.test b/docs/_style/prism-master/tests/languages/xquery/builtin_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..11bee0221051e08874d02aef86b332617aa77291 GIT binary patch literal 2640 zcmbW3O>f&U42I7$;QtWh-0U>$uv^=tfU(ut8t)JkJt(&72z8{)mWO!1ew1iAZbJId zpgqjZ+Qv~~@)jdmNf#hL)+U!tqjb4Yy0LYeTV-?{ zS$Tq@Q}a#e?$(-v%Cqh$LuMTReoB0LCmQ+n%bn7q?l56YB?XKHqwG41#f2CJnL31Q z=i+5s3!ENG3Yn{esC;>0+FjL4$C_1|C0VlCc#;3H_2Fw}1TMc^3S3S3XtdpXis1mZ zQq-7t(OI^ar_pYbrPn0Or`5wb!kLwOz_4WamZikODxu3(l(^{1=+Y}v(eF6DA3`ll z*!5qTjH=VeZ2f(eVhzSPl{Pvh^pO5(8g)60HZ?p#^-mTXI2B+Cj5);Rc)sQNW5 zt=XFzw+2Te)Z6gZta+38dRyJ7Qp@5lyylRAJ^4L^-#@~G2#L)wL#r*Eu%egy7!RJ$ zbm7&U&qy3CKJba7IC_qwPtWsRt17GX{AM;6;nK`sZah2vX=U9l&Up~QeF}I~+Fvk& zgd0bo{t5=t&la-mT=ZoPql^~iZZDC(yw0q|-ES7cg{Rrr0T=~Z0t4aj(8QSrPn>gb z^qs9RBJ>#sdgEbO??f~W)-*x4H1p;~Bj;ue@xC?1_)=$kOy%H+G#@OI#>tY)gNaU{ z4b8w_S>Sw^hQWv#3Wh`zXMzmz-c7R$Gp9wpyH7&q8C?56J<4@M;B@ah1g%Q@mO;~t z9zu(JQ=yUXG7R!KYiB?Ex;Me}lTMk}ROl%(brXXfWA i=_n{^;Ic<4mX`~N$hXWnBQ-g@SRpOHNC9qRu^s?KaxmWj literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xquery/function_feature.test b/docs/_style/prism-master/tests/languages/xquery/function_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..4a06f577f8ed6c1a923d1c363c064ffd528a0c2a GIT binary patch literal 1026 zcmbVL!ES^g5Ixt#e;}j>-0bcL?6vo%J-a=yFj}$*2C&`!eE}CjjHb;R6ZOr!c{9V4 zYeq1mj!NAhZ-c~5UG<>APzMLW$@6G5_t?#z-e2he1Y2i>>g~xthLFvHNooLflVVP2 zg#zQm^rYOIf3s+=VG*?mBn+S&2`LkE&8`WkuRRy7tBy(w#8<7W!vj~~wRQE>;?xb^ zBg{3!ANvT8p~;DcK0|~geAW-px!lGXr-TKuNqDJK>@9^Cw5<0)lJyvTuT7YHw^1=CuXc8sgmfZ$E4w-sD!Yz8Pl5HGTfD%%a$WiR@n7TR O6WGGUH3?1ML3c!-TQ^~tXhubq|+y^lncd~YG_hr((_p~DeFZt!i9Tb1cc2W zV~%SOR*fI%ag*F`WTYIbWWRPkaO?N$pZKdROQvO6m?o1hpJXYHWYTKU`O8iIX@)I( vwaF9}izc&*WLBYeuu`*`T03pDcrlmXBk26!VY?H>p}0=6d)dsrZC18V5;*EK literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xquery/keyword_feature.test b/docs/_style/prism-master/tests/languages/xquery/keyword_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..db622bdcbee3770f56d7b1d41735df955d88d26e GIT binary patch literal 2056 zcmbW1O^)Lr5QW!+#2qZJJAH{cMynSDS30O|@BmKY+s_04MA1CYqN4;ueFap?RnH`? zOtRuT=f5z`TAfXj(-a+MVe*}c^C^wSidGh+j=3?|XG7nc?1C>-pK_e+wi@S?H-prD z@a)9)CSq?V7c=#^q?6~R(wAdp81vkGMKM_tJeGAYrY^h%D|ne$hP4vXGAFbHOY88L)z>T&HJCZ^%Edt*LENfK}H3FGp=LhJ;W z)kkwi6m=%uI;k0a?uwG9hzJsLlrBz?hh(oZ7(By(V^cQg5&|;kEaECpM3%3DT{+-a zl2KEg=TXw#WqZ|X^82+n)4LA&(&}cSTTVlMQhg_P{Be-SpQ&a{tJ4oYT50v6)vu5C zTjo11Zr_^Lr1taeU*lRujAdfn>Wrb6!Xpl)61lnLi;=BXDSH+##V^%NJl682q}Dqn zTLTbSI)a&BTIA57_6(zI6ERe}irLpTBM5!RtZO3@J;2-p>Zv0XAa+|+>3MN}9lDsyCq>>MHKjtGQ_p#Q|SNEg|&YZ+rz+!%n`F>{qa z3W^>c0QTyNViNZpm~quqhIWx9a93TzHW{X9(Pf4fp(dm%H?c2L-hOI@@6Yx8_f_n7 MYS6&VD(dO|FOe5!LjV8( literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xquery/number_feature.test b/docs/_style/prism-master/tests/languages/xquery/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..85b4261f8214d97ba398943e15675c9421908c68 GIT binary patch literal 258 zcmXruX!6Q!rJwF?1VP1F$axqLcCJ9L(vWMGBfhCI#~1nlhVFom2GR+7S1SYq~Y&+Pa}l z<7|Yk3dv1|#2B3p25yB&8YSFatsWr?g3%I{h*lvyv~K--mk!_QEQie2;x5%RVNhwy zIAElv{Cap?tN~-;@B&mOu%onBpED0=fy2L<%GfUFNUS^IEMtsbqE5#~c*_yIdWLsK z;@Nyeb*z^LWbzCiS1-(9e{hEHZlnbdrvSMl{_PC(#6)RE2u;5zZUb7s#(~<;Rl^O{ rzKBQr!{wf&<3F41d*;DU-%uY%o}LPFkc!-dB0COO&IK_SFW&zE1@n&N literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xquery/string_feature.test b/docs/_style/prism-master/tests/languages/xquery/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bc645744756f3f61024c3324f3be1a53aabc9bd0 GIT binary patch literal 399 zcmY#V;^k6u%gGiS><8WK{|J@dHgWI5zn z#aD3@M}o;-)FkJU?TL~^3;3O_6)`{@p$0s}f25y!TEAUFN^*G^Ak*sd5ogzLJ1Kbm zkkXxG!eZ0769OqLok)7d50Mvfv?xH*2S^Bh&k04feSI%`DtS|@E0Dt`!D|bsxbkDM z*ciG1Dy2x#Khy*&vM^^o)2i1zEgmSox&x=W0QS-f)^*0FhK0a9C`Wf+v7V{mbX%c* z(D|G2Jh5!TYFZ|!Yy^s}$8!WP!MGWk9blt9u-=6i(2-eWJOC@rHsZ>uit;*@>_u55 z;40BzIpuNzJIsnr2^Q^%`xox~M0^4RHaHfCjzMr|>6ChYslZ^&e3xANjNExa*(`p7 zOS&`-z&V89I`oeA7^^Gj4=-AiD$tl7+2Lm+N-P31O#=mb3V58{Q9c7WsLtV*Ko=Fze#s1@&hyPHDu;@B|Xjg{X@SnO>lL;d8;=xIH2kG0hAjE11x5nya^N+XmSPpTdws{<#@xDq? c?)nG2f9%Mv5#;u!XW~G3-SLtURbJiqS2^vv0{{R3 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xquery/variable_feature.test b/docs/_style/prism-master/tests/languages/xquery/variable_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bf9d87747771f346834d2fe15adde1ccf1f57298 GIT binary patch literal 264 zcmY#M%g^WKQUQ{>Nr^>3R&hyDW?p)+l}~C(NotWJFBdPDE*Su%FPfK&Gg_%Eu_!Y! wDJNA)M?nc>k5a4-R&kL1Smn@Mq!i1`1w`aK%Q+)8IlEXPEx$+s=C)!z0Kq*!fdBvi literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xquery/xquery-attribute_feature.test b/docs/_style/prism-master/tests/languages/xquery/xquery-attribute_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..db2d131c7530299ea8da4fe7390202e039255687 GIT binary patch literal 399 zcmYc+DJjZKDlJJ>NXyUXLw)?p$S=mg?PDi$pE}uyj;<|T%6HLNu`-NC7F3j zItof~3zcGZz;YFZrKv@gx(IQgBB0Y?(qw1_d4mG&ATKM$@^S$Y`Tlm!NKMWz28MBw aLPQ|Qg9>mDDkSIU6_*s1CYR(F=>Y(3BX6_- literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xquery/xquery-comment_feature.test b/docs/_style/prism-master/tests/languages/xquery/xquery-comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..5baff67eb21be4a0734f7f90cbb21d4544c37b23 GIT binary patch literal 394 zcmdO}veM+`(y&qp&df{CNmaXc#o=UpTEJe3DT>Jh rc?Lwoy@OAe0^FNQvAkSBM8030Gg6bYixtxHixeUPK^}&Mb+H}*$6jY8 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/xquery/xquery-element_feature.test b/docs/_style/prism-master/tests/languages/xquery/xquery-element_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..a50319706af3dbc62ef1f75dc212dedffee0a1ef GIT binary patch literal 382 zcmYezNzF~oD^bWO$<5*AN`>;$^7D0*5{pm-tiS@iT)JccUM^m)XkISPXr-jm%$$g9BEV5EaOUx+-vU$05$p9dI(Y#!o(MkoSdC4WEi6xo& zc}hA8N}01gaIQ2+n{ literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/yaml/comment_feature.test b/docs/_style/prism-master/tests/languages/yaml/comment_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..054d6023d168b01d574d26410f92bb4d88dd8417 GIT binary patch literal 201 zcmY%9Q4a&bm0CFkenrskC>=_n{EE5+(yh(Rq&PYwpE(V%bqyV+DSPuZd+A4bh literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/yaml/datetime_feature.test b/docs/_style/prism-master/tests/languages/yaml/datetime_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..645680d9f61d64c42d636d04f7adb8988b05f10f GIT binary patch literal 836 zcmbV~!A`^=5Qfi^@D3Bsr5V^_l&i1c$;}=J#n`OUjj#vbUSNwhxG~y>LmB@082%Z~ zIVINk*-zHIYLJM63(19gM5)!i9(KKWqGSs5-7SihV2Dyw0diCtk&}i zC8LS12+}2K4V1*`%>_-#4F`c*?Y{rC#6IsS;Tyi3w@Q4a&bm0rDPVRCYNNEr7GztD5=6sSBlla fA`7%oDVCQDh{(6qIU_YWyI3JDzeoXYb+H}*vJovc literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/yaml/important_feature.test b/docs/_style/prism-master/tests/languages/yaml/important_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..bf4aea8410c802e63bf5be941e12d166f07b1a07 GIT binary patch literal 283 zcmY#$GUVk_bL8dH0%En`U?2lT@N(&r0YLhqdAT^Fl`?Y+@{39m^GcL-6qMAQ43%Pa ou!uWi71qKo40IfJQ4a&bm06_n;Bmy{-!Waj57 z=_n`x%~Fch0n22kR)R!;mI6f-FjQJWMDt2>lTwR73Qf>7LR?9lUQ?x5UM?Ua-#5+~ Ssma;J3TgR83P6V!>j3}|+D32y literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/yaml/null_feature.test b/docs/_style/prism-master/tests/languages/yaml/null_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..ca12f2307878fb65bbaae4bc45451efeceee215c GIT binary patch literal 310 zcmdPZ)#c?%%g?t`$Scjs;pIw7EV5FlaYic@l;$OulqQyB=I1Ht zC@2BVQi|09%Veikf<%CJ0!0)sR9eB*f!qU92&Pf>0v$=5-a4gNUM?Ua-#5+~sma;J S3TgR8-~duc%u7+I(*pn;_((he literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/yaml/number_feature.test b/docs/_style/prism-master/tests/languages/yaml/number_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..409163f108f83465c8e5cf149ca0400fd74fc94a GIT binary patch literal 854 zcmbVK%MODe5ImQJe;`~H;{#*su}%F6<3TN^jj1#~66@D@QS3o4D&YXj%w(1w#u!G0 zlp(SEYx;=NTws)?HQZ(3b9EjmESQxnE(~CdGR*FyNTUo} zI0y z0?cogP(QVz4_oQnU2u1}*Yj8i?C=gFT#+|BpQgUx?{IIAL0Ry3m>;vXqHnf8#gQf$ U!9JeJ+f(FaLkd}wDOQd312o6g(*OVf literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/yaml/scalar_feature.test b/docs/_style/prism-master/tests/languages/yaml/scalar_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..02a3c99d485b2f4a21a0f236d1241574ede26107 GIT binary patch literal 427 zcmbVJF%H8Z44iApf3TQCAHa~MQa=$g5R|A@DyV=Asq*-mCM?ZRHB9Dw-1&@@5@GOO zQH^lAdQY7RTy^G!z@?&Pk0Zzf2LYjBu|_;6XVYZT-8)f{U@g&BpU&9N8R3B#p&e5d z-j_mM@Mz7$ge;+hb~IL{^hfj_rHA*+8p@6p7=u$F1Ox}kp>@V^@`^= Dp!aMI literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/languages/yaml/string_feature.test b/docs/_style/prism-master/tests/languages/yaml/string_feature.test new file mode 100644 index 0000000000000000000000000000000000000000..9ba3ae3161ab42404cf3cdfdcc9d48311d48cedd GIT binary patch literal 694 zcmbtSK@Ni;5ImQJKalN#i}V3r`wa15jkd-JjpCud?=0w{dZ{fWgv{&?yR#T$q-ed* z6_FITYQ&}WmOQQiBBS-fXfT=?04WD2sj~vKhA;~RgcMSk9~S2oQk)8U&aMt~6*})I zQv@w4v&i(#ixGal%+xM2U*o1QcJ9uh7JEgPY;N)EY_x8ZEjyh9RcQTt4eb76|3>6M x0hT?B9l*8P4@2Vu+Y@KFkv-s#=CLO;KSX0?Qk4Jvh3liK`w2g4RB4>k@0{{{WE8zeD literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/tests/run.js b/docs/_style/prism-master/tests/run.js new file mode 100644 index 0000000..46366cc --- /dev/null +++ b/docs/_style/prism-master/tests/run.js @@ -0,0 +1,45 @@ +"use strict"; + +var TestDiscovery = require("./helper/test-discovery"); +var TestCase = require("./helper/test-case"); +var path = require("path"); +var argv = require("yargs").argv; + +var testSuite; +if (argv.language) { + testSuite = TestDiscovery.loadSomeTests(__dirname + "/languages", argv.language); +} else { + // load complete test suite + testSuite = TestDiscovery.loadAllTests(__dirname + "/languages"); +} + +// define tests for all tests in all languages in the test suite +for (var language in testSuite) { + if (!testSuite.hasOwnProperty(language)) { + continue; + } + + (function (language, testFiles) { + describe("Testing language '" + language + "'", function () { + this.timeout(10000); + + testFiles.forEach( + function (filePath) { + var fileName = path.basename(filePath, path.extname(filePath)); + + it("– should pass test case '" + fileName + "'", + function () { + + if (path.extname(filePath) === '.test') { + TestCase.runTestCase(language, filePath); + } else { + TestCase.runTestsWithHooks(language, require(filePath)); + } + + } + ); + } + ); + }); + })(language, testSuite[language]); +} \ No newline at end of file diff --git a/docs/_style/prism-master/tests/testrunner-tests.js b/docs/_style/prism-master/tests/testrunner-tests.js new file mode 100644 index 0000000..24ad32c --- /dev/null +++ b/docs/_style/prism-master/tests/testrunner-tests.js @@ -0,0 +1,166 @@ +"use strict"; + +var assert = require("chai").assert; +var TokenStreamTransformer = require("./helper/token-stream-transformer"); +var TestCase = require("./helper/test-case"); + + +//region Token Stream Transformer +describe("The token stream transformer", + function () { + it("should handle all kinds of simple transformations", + function () { + var tokens = [ + {type: "type", content: "content"}, + "string" + ]; + + var expected = [ + ["type", "content"], + "string" + ]; + + assert.deepEqual(TokenStreamTransformer.simplify(tokens), expected); + } + ); + + + it("should handle nested structures", + function () { + var tokens = [ + { + type: "type", + content: [ + { + type: "insideType", content: + [ + {type: "insideInsideType", content: "content"} + ] + } + ] + } + ]; + + var expected = [ + ["type", [ + ["insideType", [ + ["insideInsideType", "content"] + ]] + ]] + ]; + + assert.deepEqual(TokenStreamTransformer.simplify(tokens), expected); + } + ); + + + it("should strip empty tokens", + function () { + var tokenStream = [ + "", + "\r\n", + "\t", + " " + ]; + + var expectedSimplified = []; + + assert.deepEqual(TokenStreamTransformer.simplify(tokenStream), expectedSimplified); + } + ); + + + it("should strip empty token tree branches", + function () { + var tokenStream = [ + { + type: "type", + content: [ + ["", ""], + "", + {type: "nested", content: [""]} + ] + }, + [[[[[[[""]]]]]]] + ]; + + var expectedSimplified = [ + ["type", [ + ["nested", []] + ]] + ]; + + assert.deepEqual(TokenStreamTransformer.simplify(tokenStream), expectedSimplified); + } + ); + + + it("should ignore all properties in tokens except value and content", + function () { + + var tokenStream = [ + {type: "type", content: "content", alias: "alias"} + ]; + + var expectedSimplified = [ + ["type", "content"] + ]; + + assert.deepEqual(TokenStreamTransformer.simplify(tokenStream), expectedSimplified); + } + ); + } +); +//endregion + + +//region Language name parsing +describe("The language name parsing", + function () { + it("should use the last language as the main language if no language is specified", + function () { + assert.deepEqual( + TestCase.parseLanguageNames("a"), + { + languages: ["a"], + mainLanguage: "a" + } + ); + + assert.deepEqual( + TestCase.parseLanguageNames("a+b+c"), + { + languages: ["a", "b", "c"], + mainLanguage: "c" + } + ); + } + ); + + + it("should use the specified language as main language", + function () { + assert.deepEqual( + TestCase.parseLanguageNames("a+b!+c"), + { + languages: ["a", "b", "c"], + mainLanguage: "b" + } + ); + } + ); + + + it("should throw an error if there are multiple main languages", + function () { + assert.throw( + function () { + TestCase.parseLanguageNames("a+b!+c!"); + }, + "There are multiple main languages defined." + ); + } + ); + } +); +//endregion diff --git a/docs/_style/prism-master/themes/prism-coy.css b/docs/_style/prism-master/themes/prism-coy.css new file mode 100644 index 0000000..d05855c --- /dev/null +++ b/docs/_style/prism-master/themes/prism-coy.css @@ -0,0 +1,225 @@ +/** + * prism.js Coy theme for JavaScript, CoffeeScript, CSS and HTML + * Based on https://github.com/tshedor/workshop-wp-theme (Example: http://workshop.kansan.com/category/sessions/basics or http://workshop.timshedor.com/category/sessions/basics); + * @author Tim Shedor + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* Code blocks */ +pre[class*="language-"] { + position: relative; + margin: .5em 0; + overflow: visible; + padding: 0; +} +pre[class*="language-"]>code { + position: relative; + border-left: 10px solid #358ccb; + box-shadow: -1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf; + background-color: #fdfdfd; + background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%); + background-size: 3em 3em; + background-origin: content-box; + background-attachment: local; +} + +code[class*="language"] { + max-height: inherit; + height: inherit; + padding: 0 1em; + display: block; + overflow: auto; +} + +/* Margin bottom to accommodate shadow */ +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background-color: #fdfdfd; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-bottom: 1em; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + position: relative; + padding: .2em; + border-radius: 0.3em; + color: #c92c2c; + border: 1px solid rgba(0, 0, 0, 0.1); + display: inline; + white-space: normal; +} + +pre[class*="language-"]:before, +pre[class*="language-"]:after { + content: ''; + z-index: -2; + display: block; + position: absolute; + bottom: 0.75em; + left: 0.18em; + width: 40%; + height: 20%; + max-height: 13em; + box-shadow: 0px 13px 8px #979797; + -webkit-transform: rotate(-2deg); + -moz-transform: rotate(-2deg); + -ms-transform: rotate(-2deg); + -o-transform: rotate(-2deg); + transform: rotate(-2deg); +} + +:not(pre) > code[class*="language-"]:after, +pre[class*="language-"]:after { + right: 0.75em; + left: auto; + -webkit-transform: rotate(2deg); + -moz-transform: rotate(2deg); + -ms-transform: rotate(2deg); + -o-transform: rotate(2deg); + transform: rotate(2deg); +} + +.token.comment, +.token.block-comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #7D8B99; +} + +.token.punctuation { + color: #5F6364; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.function-name, +.token.constant, +.token.symbol, +.token.deleted { + color: #c92c2c; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.function, +.token.builtin, +.token.inserted { + color: #2f9c0a; +} + +.token.operator, +.token.entity, +.token.url, +.token.variable { + color: #a67f59; + background: rgba(255, 255, 255, 0.5); +} + +.token.atrule, +.token.attr-value, +.token.keyword, +.token.class-name { + color: #1990b8; +} + +.token.regex, +.token.important { + color: #e90; +} + +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: rgba(255, 255, 255, 0.5); +} + +.token.important { + font-weight: normal; +} + +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.namespace { + opacity: .7; +} + +@media screen and (max-width: 767px) { + pre[class*="language-"]:before, + pre[class*="language-"]:after { + bottom: 14px; + box-shadow: none; + } + +} + +/* Plugin styles */ +.token.tab:not(:empty):before, +.token.cr:before, +.token.lf:before { + color: #e0d7d1; +} + +/* Plugin styles: Line Numbers */ +pre[class*="language-"].line-numbers.line-numbers { + padding-left: 0; +} + +pre[class*="language-"].line-numbers.line-numbers code { + padding-left: 3.8em; +} + +pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows { + left: 0; +} + +/* Plugin styles: Line Highlight */ +pre[class*="language-"][data-line] { + padding-top: 0; + padding-bottom: 0; + padding-left: 0; +} +pre[data-line] code { + position: relative; + padding-left: 4em; +} +pre .line-highlight { + margin-top: 0; +} diff --git a/docs/_style/prism-master/themes/prism-dark.css b/docs/_style/prism-master/themes/prism-dark.css new file mode 100644 index 0000000..7f45728 --- /dev/null +++ b/docs/_style/prism-master/themes/prism-dark.css @@ -0,0 +1,128 @@ +/** + * prism.js Dark theme for JavaScript, CSS and HTML + * Based on the slides of the talk “/Reg(exp){2}lained/†+ * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: white; + background: none; + text-shadow: 0 -.1em .2em black; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +pre[class*="language-"], +:not(pre) > code[class*="language-"] { + background: hsl(30, 20%, 25%); +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; + border: .3em solid hsl(30, 20%, 40%); + border-radius: .5em; + box-shadow: 1px 1px .5em black inset; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .15em .2em .05em; + border-radius: .3em; + border: .13em solid hsl(30, 20%, 40%); + box-shadow: 1px 1px .3em -.1em black inset; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: hsl(30, 20%, 50%); +} + +.token.punctuation { + opacity: .7; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol { + color: hsl(350, 40%, 70%); +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: hsl(75, 70%, 60%); +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable { + color: hsl(40, 90%, 60%); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: hsl(350, 40%, 70%); +} + +.token.regex, +.token.important { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.deleted { + color: red; +} diff --git a/docs/_style/prism-master/themes/prism-funky.css b/docs/_style/prism-master/themes/prism-funky.css new file mode 100644 index 0000000..dd3be06 --- /dev/null +++ b/docs/_style/prism-master/themes/prism-funky.css @@ -0,0 +1,116 @@ +/** + * prism.js Funky theme + * Based on “Polyfilling the gaps†talk slides http://lea.verou.me/polyfilling-the-gaps/ + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* Code blocks */ +pre[class*="language-"] { + padding: .4em .8em; + margin: .5em 0; + overflow: auto; + background: url('data:image/svg+xml;charset=utf-8,%0D%0A%0D%0A%0D%0A<%2Fsvg>'); + background-size: 1em 1em; +} + +code[class*="language-"] { + background: black; + color: white; + box-shadow: -.3em 0 0 .3em black, .3em 0 0 .3em black; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .2em; + border-radius: .3em; + box-shadow: none; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #aaa; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol { + color: #0cf; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin { + color: yellow; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.toke.variable, +.token.inserted { + color: yellowgreen; +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: deeppink; +} + +.token.regex, +.token.important { + color: orange; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.deleted { + color: red; +} diff --git a/docs/_style/prism-master/themes/prism-okaidia.css b/docs/_style/prism-master/themes/prism-okaidia.css new file mode 100644 index 0000000..8efbc07 --- /dev/null +++ b/docs/_style/prism-master/themes/prism-okaidia.css @@ -0,0 +1,122 @@ +/** + * okaidia theme for JavaScript, CSS and HTML + * Loosely based on Monokai textmate theme by http://www.monokai.nl/ + * @author ocodia + */ + +code[class*="language-"], +pre[class*="language-"] { + color: #f8f8f2; + background: none; + text-shadow: 0 1px rgba(0, 0, 0, 0.3); + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; + border-radius: 0.3em; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #272822; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #f8f8f2; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.constant, +.token.symbol, +.token.deleted { + color: #f92672; +} + +.token.boolean, +.token.number { + color: #ae81ff; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #a6e22e; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable { + color: #f8f8f2; +} + +.token.atrule, +.token.attr-value, +.token.function, +.token.class-name { + color: #e6db74; +} + +.token.keyword { + color: #66d9ef; +} + +.token.regex, +.token.important { + color: #fd971f; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/docs/_style/prism-master/themes/prism-solarizedlight.css b/docs/_style/prism-master/themes/prism-solarizedlight.css new file mode 100644 index 0000000..07657da --- /dev/null +++ b/docs/_style/prism-master/themes/prism-solarizedlight.css @@ -0,0 +1,149 @@ +/* + Solarized Color Schemes originally by Ethan Schoonover + http://ethanschoonover.com/solarized + + Ported for PrismJS by Hector Matos + Website: https://krakendev.io + Twitter Handle: https://twitter.com/allonsykraken) +*/ + +/* +SOLARIZED HEX +--------- ------- +base03 #002b36 +base02 #073642 +base01 #586e75 +base00 #657b83 +base0 #839496 +base1 #93a1a1 +base2 #eee8d5 +base3 #fdf6e3 +yellow #b58900 +orange #cb4b16 +red #dc322f +magenta #d33682 +violet #6c71c4 +blue #268bd2 +cyan #2aa198 +green #859900 +*/ + +code[class*="language-"], +pre[class*="language-"] { + color: #657b83; /* base00 */ + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + background: #073642; /* base02 */ +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + background: #073642; /* base02 */ +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; + border-radius: 0.3em; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background-color: #fdf6e3; /* base3 */ +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #93a1a1; /* base1 */ +} + +.token.punctuation { + color: #586e75; /* base01 */ +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #268bd2; /* blue */ +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.url, +.token.inserted { + color: #2aa198; /* cyan */ +} + +.token.entity { + color: #657b83; /* base00 */ + background: #eee8d5; /* base2 */ +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #859900; /* green */ +} + +.token.function, +.token.class-name { + color: #b58900; /* yellow */ +} + +.token.regex, +.token.important, +.token.variable { + color: #cb4b16; /* orange */ +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/docs/_style/prism-master/themes/prism-tomorrow.css b/docs/_style/prism-master/themes/prism-tomorrow.css new file mode 100644 index 0000000..6add2d2 --- /dev/null +++ b/docs/_style/prism-master/themes/prism-tomorrow.css @@ -0,0 +1,121 @@ +/** + * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML + * Based on https://github.com/chriskempson/tomorrow-theme + * @author Rose Pritchard + */ + +code[class*="language-"], +pre[class*="language-"] { + color: #ccc; + background: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #2d2d2d; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.block-comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #999; +} + +.token.punctuation { + color: #ccc; +} + +.token.tag, +.token.attr-name, +.token.namespace, +.token.deleted { + color: #e2777a; +} + +.token.function-name { + color: #6196cc; +} + +.token.boolean, +.token.number, +.token.function { + color: #f08d49; +} + +.token.property, +.token.class-name, +.token.constant, +.token.symbol { + color: #f8c555; +} + +.token.selector, +.token.important, +.token.atrule, +.token.keyword, +.token.builtin { + color: #cc99cd; +} + +.token.string, +.token.char, +.token.attr-value, +.token.regex, +.token.variable { + color: #7ec699; +} + +.token.operator, +.token.entity, +.token.url { + color: #67cdcc; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.inserted { + color: green; +} diff --git a/docs/_style/prism-master/themes/prism-twilight.css b/docs/_style/prism-master/themes/prism-twilight.css new file mode 100644 index 0000000..504ca70 --- /dev/null +++ b/docs/_style/prism-master/themes/prism-twilight.css @@ -0,0 +1,198 @@ +/** + * prism.js Twilight theme + * Based (more or less) on the Twilight theme originally of Textmate fame. + * @author Remy Bach + */ +code[class*="language-"], +pre[class*="language-"] { + color: white; + background: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + text-shadow: 0 -.1em .2em black; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"], +:not(pre) > code[class*="language-"] { + background: hsl(0, 0%, 8%); /* #141414 */ +} + +/* Code blocks */ +pre[class*="language-"] { + border-radius: .5em; + border: .3em solid hsl(0, 0%, 33%); /* #282A2B */ + box-shadow: 1px 1px .5em black inset; + margin: .5em 0; + overflow: auto; + padding: 1em; +} + +pre[class*="language-"]::-moz-selection { + /* Firefox */ + background: hsl(200, 4%, 16%); /* #282A2B */ +} + +pre[class*="language-"]::selection { + /* Safari */ + background: hsl(200, 4%, 16%); /* #282A2B */ +} + +/* Text Selection colour */ +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: hsla(0, 0%, 93%, 0.15); /* #EDEDED */ +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: hsla(0, 0%, 93%, 0.15); /* #EDEDED */ +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + border-radius: .3em; + border: .13em solid hsl(0, 0%, 33%); /* #545454 */ + box-shadow: 1px 1px .3em -.1em black inset; + padding: .15em .2em .05em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: hsl(0, 0%, 47%); /* #777777 */ +} + +.token.punctuation { + opacity: .7; +} + +.namespace { + opacity: .7; +} + +.token.tag, +.token.boolean, +.token.number, +.token.deleted { + color: hsl(14, 58%, 55%); /* #CF6A4C */ +} + +.token.keyword, +.token.property, +.token.selector, +.token.constant, +.token.symbol, +.token.builtin { + color: hsl(53, 89%, 79%); /* #F9EE98 */ +} + +.token.attr-name, +.token.attr-value, +.token.string, +.token.char, +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable, +.token.inserted { + color: hsl(76, 21%, 52%); /* #8F9D6A */ +} + +.token.atrule { + color: hsl(218, 22%, 55%); /* #7587A6 */ +} + +.token.regex, +.token.important { + color: hsl(42, 75%, 65%); /* #E9C062 */ +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +pre[data-line] { + padding: 1em 0 1em 3em; + position: relative; +} + +/* Markup */ +.language-markup .token.tag, +.language-markup .token.attr-name, +.language-markup .token.punctuation { + color: hsl(33, 33%, 52%); /* #AC885B */ +} + +/* Make the tokens sit above the line highlight so the colours don't look faded. */ +.token { + position: relative; + z-index: 1; +} + +.line-highlight { + background: hsla(0, 0%, 33%, 0.25); /* #545454 */ + background: linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0)); /* #545454 */ + border-bottom: 1px dashed hsl(0, 0%, 33%); /* #545454 */ + border-top: 1px dashed hsl(0, 0%, 33%); /* #545454 */ + left: 0; + line-height: inherit; + margin-top: 0.75em; /* Same as .prism’s padding-top */ + padding: inherit 0; + pointer-events: none; + position: absolute; + right: 0; + white-space: pre; + z-index: 0; +} + +.line-highlight:before, +.line-highlight[data-end]:after { + background-color: hsl(215, 15%, 59%); /* #8794A6 */ + border-radius: 999px; + box-shadow: 0 1px white; + color: hsl(24, 20%, 95%); /* #F5F2F0 */ + content: attr(data-start); + font: bold 65%/1.5 sans-serif; + left: .6em; + min-width: 1em; + padding: 0 .5em; + position: absolute; + text-align: center; + text-shadow: none; + top: .4em; + vertical-align: .3em; +} + +.line-highlight[data-end]:after { + bottom: .4em; + content: attr(data-end); + top: auto; +} diff --git a/docs/_style/prism-master/themes/prism.css b/docs/_style/prism-master/themes/prism.css new file mode 100644 index 0000000..9010cb6 --- /dev/null +++ b/docs/_style/prism-master/themes/prism.css @@ -0,0 +1,138 @@ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/docs/_style/prism-master/utopia.js b/docs/_style/prism-master/utopia.js new file mode 100644 index 0000000..f168d5b --- /dev/null +++ b/docs/_style/prism-master/utopia.js @@ -0,0 +1,463 @@ +/** + * Utopia: A JavaScript util library that assumes modern standards support and doesn't fix any browser bugs + * @author Lea Verou (http://lea.verou.me) + * MIT license (http://www.opensource.org/licenses/mit-license.php) + * Last update: 2012-4-29 + */ + +function $(expr, con) { + return typeof expr === 'string'? (con || document).querySelector(expr) : expr; +} + +function $$(expr, con) { + var elements = (con || document).querySelectorAll(expr); + + try { + return Array.prototype.slice.call(elements); + } + catch(e) { + var arr = Array(elements.length); + + for (var i = elements.length; i-- > 0;) { + arr[i] = elements[i]; + } + + return arr; + } +} + +if (!Array.prototype.forEach) { + Array.prototype.forEach = function(fn, scope) { + for (var i = 0, len = this.length; i < len; ++i) { + fn.call(scope || this, this[i], i, this); + } + } +} + +// Make each ID a global variable +// Many browsers do this anyway (it’s in the HTML5 spec), so it ensures consistency +$$('[id]').forEach(function(element) { window[element.id] = element; }); + +// Array#splice but for strings +String.prototype.splice = function(i, remove, add) { + remove = +remove || 0; + add = add || ''; + + return this.slice(0,i) + add + this.slice(i + remove); +}; + +(function(){ + +var _ = window.Utopia = { + /** + * Returns the [[Class]] of an object in lowercase (eg. array, date, regexp, string etc) + * Caution: Results for DOM elements and collections aren't reliable. + * @param {Object} obj + * + * @return {String} + */ + type: function(obj) { + if(obj === null) { return 'null'; } + + if(obj === undefined) { return 'undefined'; } + + var ret = Object.prototype.toString.call(obj).match(/^\[object\s+(.*?)\]$/)[1]; + + ret = ret? ret.toLowerCase() : ''; + + if(ret == 'number' && isNaN(obj)) { + return 'NaN'; + } + + return ret; + }, + + /** + * Iterate over the properties of an object. Checks whether the properties actually belong to it. + * Can be stopped if the function explicitly returns a value that isn't null, undefined or NaN. + * + * @param obj {Object} The object to iterate over + * @param func {Function} The function used in the iteration. Can accept 2 parameters: one of the + * value of the object and one for its name. + * @param context {Object} Context for the above function. Default is the object being iterated. + * + * @return {Object} Null or the return value of func, if it broke the loop at some point. + */ + each: function(obj, func, context) { + if(!_.type(func) == 'function') { + throw Error('The second argument in Utopia.each() must be a function'); + }; + + context = context || obj; + + for (var i in obj) { + if(obj.hasOwnProperty && obj.hasOwnProperty(i)) { + var ret = func.call(context, obj[i], i); + + if(!!ret || ret === 0 || ret === '') { + return ret; + } + } + } + + return null; + }, + + /** + * Copies the properties of one object onto another. + * When there is a collision, the later one wins + * + * @return {Object} destination object + */ + merge: function(objects) { + var ret = {}; + + for(var i=0; i + + (c) 2009-2014 Stuart Knightley + Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. + + JSZip uses the library pako released under the MIT license : + https://github.com/nodeca/pako/blob/master/LICENSE + */ +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.JSZip=a()}}(function(){var a;return function b(a,c,d){function e(g,h){if(!c[g]){if(!a[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};a[g][0].call(k.exports,function(b){var c=a[g][1][b];return e(c?c:b)},k,k.exports,b,a,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;gl?a[l++]:0,e=m>l?a[l++]:0):(b=a.charCodeAt(l++),c=m>l?a.charCodeAt(l++):0,e=m>l?a.charCodeAt(l++):0),g=b>>2,h=(3&b)<<4|c>>4,i=n>1?(15&c)<<2|e>>6:64,j=n>2?63&e:64,k.push(f.charAt(g)+f.charAt(h)+f.charAt(i)+f.charAt(j));return k.join("")},c.decode=function(a){var b,c,d,g,h,i,j,k=0,l=0;a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");var m=3*a.length/4;a.charAt(a.length-1)===f.charAt(64)&&m--,a.charAt(a.length-2)===f.charAt(64)&&m--;var n;for(n=e.uint8array?new Uint8Array(m):new Array(m);k>4,c=(15&h)<<4|i>>2,d=(3&i)<<6|j,n[l++]=b,64!==i&&(n[l++]=c),64!==j&&(n[l++]=d);return n}},{"./support":27,"./utils":29}],2:[function(a,b,c){"use strict";function d(a,b,c,d,e){this.compressedSize=a,this.uncompressedSize=b,this.crc32=c,this.compression=d,this.compressedContent=e}var e=a("./external"),f=a("./stream/DataWorker"),g=a("./stream/DataLengthProbe"),h=a("./stream/Crc32Probe"),g=a("./stream/DataLengthProbe");d.prototype={getContentWorker:function(){var a=new f(e.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new g("data_length")),b=this;return a.on("end",function(){if(this.streamInfo.data_length!==b.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),a},getCompressedWorker:function(){return new f(e.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},d.createWorkerFrom=function(a,b,c){return a.pipe(new h).pipe(new g("uncompressedSize")).pipe(b.compressWorker(c)).pipe(new g("compressedSize")).withStreamInfo("compression",b)},b.exports=d},{"./external":6,"./stream/Crc32Probe":22,"./stream/DataLengthProbe":23,"./stream/DataWorker":24}],3:[function(a,b,c){"use strict";var d=a("./stream/GenericWorker");c.STORE={magic:"\x00\x00",compressWorker:function(a){return new d("STORE compression")},uncompressWorker:function(){return new d("STORE decompression")}},c.DEFLATE=a("./flate")},{"./flate":7,"./stream/GenericWorker":25}],4:[function(a,b,c){"use strict";function d(){for(var a,b=[],c=0;256>c;c++){a=c;for(var d=0;8>d;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=h,f=d+c;a=-1^a;for(var g=d;f>g;g++)a=a>>>8^e[255&(a^b[g])];return-1^a}function f(a,b,c,d){var e=h,f=d+c;a=-1^a;for(var g=d;f>g;g++)a=a>>>8^e[255&(a^b.charCodeAt(g))];return-1^a}var g=a("./utils"),h=d();b.exports=function(a,b){if("undefined"==typeof a||!a.length)return 0;var c="string"!==g.getTypeOf(a);return c?e(0|b,a,a.length,0):f(0|b,a,a.length,0)}},{"./utils":29}],5:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!0,c.date=null,c.compression=null,c.compressionOptions=null,c.comment=null,c.unixPermissions=null,c.dosPermissions=null},{}],6:[function(a,b,c){"use strict";var d=a("es6-promise").Promise;b.exports={Promise:d}},{"es6-promise":37}],7:[function(a,b,c){"use strict";function d(a,b){h.call(this,"FlateWorker/"+a),this._pako=new f[a]({raw:!0,level:b.level||-1}),this.meta={};var c=this;this._pako.onData=function(a){c.push({data:a,meta:c.meta})}}var e="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,f=a("pako"),g=a("./utils"),h=a("./stream/GenericWorker"),i=e?"uint8array":"array";c.magic="\b\x00",g.inherits(d,h),d.prototype.processChunk=function(a){this.meta=a.meta,this._pako.push(g.transformTo(i,a.data),!1)},d.prototype.flush=function(){h.prototype.flush.call(this),this._pako.push([],!0)},d.prototype.cleanUp=function(){h.prototype.cleanUp.call(this),this._pako=null},c.compressWorker=function(a){return new d("Deflate",a)},c.uncompressWorker=function(){return new d("Inflate",{})}},{"./stream/GenericWorker":25,"./utils":29,pako:38}],8:[function(a,b,c){"use strict";function d(a,b,c,d){f.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=b,this.zipPlatform=c,this.encodeFileName=d,this.streamFiles=a,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}var e=a("../utils"),f=a("../stream/GenericWorker"),g=a("../utf8"),h=a("../crc32"),i=a("../signature"),j=function(a,b){var c,d="";for(c=0;b>c;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},k=function(a,b){var c=a;return a||(c=b?16893:33204),(65535&c)<<16},l=function(a,b){return 63&(a||0)},m=function(a,b,c,d,f,m){var n,o,p=a.file,q=a.compression,r=m!==g.utf8encode,s=e.transformTo("string",m(p.name)),t=e.transformTo("string",g.utf8encode(p.name)),u=p.comment,v=e.transformTo("string",m(u)),w=e.transformTo("string",g.utf8encode(u)),x=t.length!==p.name.length,y=w.length!==u.length,z="",A="",B="",C=p.dir,D=p.date,E={crc32:0,compressedSize:0,uncompressedSize:0};b&&!c||(E.crc32=a.crc32,E.compressedSize=a.compressedSize,E.uncompressedSize=a.uncompressedSize);var F=0;b&&(F|=8),r||!x&&!y||(F|=2048);var G=0,H=0;C&&(G|=16),"UNIX"===f?(H=798,G|=k(p.unixPermissions,C)):(H=20,G|=l(p.dosPermissions,C)),n=D.getUTCHours(),n<<=6,n|=D.getUTCMinutes(),n<<=5,n|=D.getUTCSeconds()/2,o=D.getUTCFullYear()-1980,o<<=4,o|=D.getUTCMonth()+1,o<<=5,o|=D.getUTCDate(),x&&(A=j(1,1)+j(h(s),4)+t,z+="up"+j(A.length,2)+A),y&&(B=j(1,1)+j(h(v),4)+w,z+="uc"+j(B.length,2)+B);var I="";I+="\n\x00",I+=j(F,2),I+=q.magic,I+=j(n,2),I+=j(o,2),I+=j(E.crc32,4),I+=j(E.compressedSize,4),I+=j(E.uncompressedSize,4),I+=j(s.length,2),I+=j(z.length,2);var J=i.LOCAL_FILE_HEADER+I+s+z,K=i.CENTRAL_FILE_HEADER+j(H,2)+I+j(v.length,2)+"\x00\x00\x00\x00"+j(G,4)+j(d,4)+s+z+v;return{fileRecord:J,dirRecord:K}},n=function(a,b,c,d,f){var g="",h=e.transformTo("string",f(d));return g=i.CENTRAL_DIRECTORY_END+"\x00\x00\x00\x00"+j(a,2)+j(a,2)+j(b,4)+j(c,4)+j(h.length,2)+h},o=function(a){var b="";return b=i.DATA_DESCRIPTOR+j(a.crc32,4)+j(a.compressedSize,4)+j(a.uncompressedSize,4)};e.inherits(d,f),d.prototype.push=function(a){var b=a.meta.percent||0,c=this.entriesCount,d=this._sources.length;this.accumulate?this.contentBuffer.push(a):(this.bytesWritten+=a.data.length,f.prototype.push.call(this,{data:a.data,meta:{currentFile:this.currentFile,percent:c?(b+100*(c-d-1))/c:100}}))},d.prototype.openedSource=function(a){if(this.currentSourceOffset=this.bytesWritten,this.currentFile=a.file.name,this.streamFiles&&!a.file.dir){var b=m(a,this.streamFiles,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:b.fileRecord,meta:{percent:0}})}else this.accumulate=!0},d.prototype.closedSource=function(a){this.accumulate=!1;var b=m(a,this.streamFiles,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(b.dirRecord),this.streamFiles&&!a.file.dir)this.push({data:o(a),meta:{percent:100}});else for(this.push({data:b.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},d.prototype.flush=function(){for(var a=this.bytesWritten,b=0;b0?a.substring(0,b):""},q=function(a){return"/"!==a.slice(-1)&&(a+="/"),a},r=function(a,b){return b="undefined"!=typeof b?b:i.createFolders,a=q(a),this.files[a]||o.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},s={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(a){var b,c,d;for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],c=b.slice(this.root.length,b.length),c&&b.slice(0,this.root.length)===this.root&&a(c,d))},filter:function(a){var b=[];return this.forEach(function(c,d){a(c,d)&&b.push(d)}),b},file:function(a,b,c){if(1===arguments.length){if(d(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}var f=this.files[this.root+a];return f&&!f.dir?f:null}return a=this.root+a,o.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=r.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!==a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f-this.zero;return-1},d.prototype.readAndCheckSignature=function(a){var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=this.readData(4);return b===f[0]&&c===f[1]&&d===f[2]&&e===f[3]},d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return[];var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":29,"./DataReader":15}],15:[function(a,b,c){"use strict";function d(a){this.data=a,this.length=a.length,this.index=0,this.zero=0}var e=a("../utils");d.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.lengtha)throw new Error("End of data reached (data length = "+this.length+", asked index = "+a+"). Corrupted zip ?")},setIndex:function(a){this.checkIndex(a),this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(a){},readInt:function(a){var b,c=0;for(this.checkOffset(a),b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return e.transformTo("string",this.readData(a))},readData:function(a){},lastIndexOfSignature:function(a){},readAndCheckSignature:function(a){},readDate:function(){var a=this.readInt(4);return new Date(Date.UTC((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1))}},b.exports=d},{"../utils":29}],16:[function(a,b,c){"use strict";function d(a){e.call(this,a)}var e=a("./Uint8ArrayReader"),f=a("../utils");f.inherits(d,e),d.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":29,"./Uint8ArrayReader":18}],17:[function(a,b,c){"use strict";function d(a){e.call(this,a)}var e=a("./DataReader"),f=a("../utils");f.inherits(d,e),d.prototype.byteAt=function(a){return this.data.charCodeAt(this.zero+a)},d.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)-this.zero},d.prototype.readAndCheckSignature=function(a){var b=this.readData(4);return a===b},d.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":29,"./DataReader":15}],18:[function(a,b,c){"use strict";function d(a){e.call(this,a)}var e=a("./ArrayReader"),f=a("../utils");f.inherits(d,e),d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":29,"./ArrayReader":14}],19:[function(a,b,c){"use strict";var d=a("../utils"),e=a("../support"),f=a("./ArrayReader"),g=a("./StringReader"),h=a("./NodeBufferReader"),i=a("./Uint8ArrayReader");b.exports=function(a){var b=d.getTypeOf(a);return d.checkSupport(b),"string"!==b||e.uint8array?"nodebuffer"===b?new h(a):e.uint8array?new i(d.transformTo("uint8array",a)):new f(d.transformTo("array",a)):new g(a)}},{"../support":27,"../utils":29,"./ArrayReader":14,"./NodeBufferReader":16,"./StringReader":17,"./Uint8ArrayReader":18}],20:[function(a,b,c){"use strict";c.LOCAL_FILE_HEADER="PK",c.CENTRAL_FILE_HEADER="PK",c.CENTRAL_DIRECTORY_END="PK",c.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",c.ZIP64_CENTRAL_DIRECTORY_END="PK",c.DATA_DESCRIPTOR="PK\b"},{}],21:[function(a,b,c){"use strict";function d(a){e.call(this,"ConvertWorker to "+a),this.destType=a}var e=a("./GenericWorker"),f=a("../utils");f.inherits(d,e),d.prototype.processChunk=function(a){this.push({data:f.transformTo(this.destType,a.data),meta:a.meta})},b.exports=d},{"../utils":29,"./GenericWorker":25}],22:[function(a,b,c){"use strict";function d(){e.call(this,"Crc32Probe")}var e=a("./GenericWorker"),f=a("../crc32"),g=a("../utils");g.inherits(d,e),d.prototype.processChunk=function(a){this.streamInfo.crc32=f(a.data,this.streamInfo.crc32||0),this.push(a)},b.exports=d},{"../crc32":4,"../utils":29,"./GenericWorker":25}],23:[function(a,b,c){"use strict";function d(a){f.call(this,"DataLengthProbe for "+a),this.propName=a,this.withStreamInfo(a,0)}var e=a("../utils"),f=a("./GenericWorker");e.inherits(d,f),d.prototype.processChunk=function(a){if(a){var b=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=b+a.data.length}f.prototype.processChunk.call(this,a)},b.exports=d},{"../utils":29,"./GenericWorker":25}],24:[function(a,b,c){"use strict";function d(a){f.call(this,"DataWorker");var b=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,a.then(function(a){b.dataIsReady=!0,b.data=a,b.max=a&&a.length||0,b.type=e.getTypeOf(a),b.isPaused||b._tickAndRepeat()},function(a){b.error(a)})}var e=a("../utils"),f=a("./GenericWorker"),g=16384;e.inherits(d,f),d.prototype.cleanUp=function(){f.prototype.cleanUp.call(this),this.data=null},d.prototype.resume=function(){return f.prototype.resume.call(this)?(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,e.delay(this._tickAndRepeat,[],this)),!0):!1},d.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(e.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},d.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var a=g,b=null,c=Math.min(this.max,this.index+a);if(this.index>=this.max)return this.end();switch(this.type){case"string":b=this.data.substring(this.index,c);break;case"uint8array":b=this.data.subarray(this.index,c);break;case"array":case"nodebuffer":b=this.data.slice(this.index,c)}return this.index=c,this.push({data:b,meta:{percent:this.max?this.index/this.max*100:0}})},b.exports=d},{"../utils":29,"./GenericWorker":25}],25:[function(a,b,c){"use strict";function d(a){this.name=a||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}d.prototype={push:function(a){this.emit("data",a)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(a){this.emit("error",a)}return!0},error:function(a){return this.isFinished?!1:(this.isPaused?this.generatedError=a:(this.isFinished=!0,this.emit("error",a),this.previous&&this.previous.error(a),this.cleanUp()),!0)},on:function(a,b){return this._listeners[a].push(b),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(a,b){if(this._listeners[a])for(var c=0;c "+a:a}},b.exports=d},{}],26:[function(a,b,c){(function(c){"use strict";function d(a,b,c){switch(a){case"blob":return h.newBlob(h.transformTo("arraybuffer",b),c);case"base64":return k.encode(b);default:return h.transformTo(a,b)}}function e(a,b){var d,e=0,f=null,g=0;for(d=0;dk;k++)j[k]=k>=252?6:k>=248?5:k>=240?4:k>=224?3:k>=192?2:1;j[254]=j[254]=1;var l=function(a){var b,c,d,e,f,h=a.length,i=0;for(e=0;h>e;e++)c=a.charCodeAt(e),55296===(64512&c)&&h>e+1&&(d=a.charCodeAt(e+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),e++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=g.uint8array?new Uint8Array(i):new Array(i),f=0,e=0;i>f;e++)c=a.charCodeAt(e),55296===(64512&c)&&h>e+1&&(d=a.charCodeAt(e+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),e++)),128>c?b[f++]=c:2048>c?(b[f++]=192|c>>>6,b[f++]=128|63&c):65536>c?(b[f++]=224|c>>>12,b[f++]=128|c>>>6&63,b[f++]=128|63&c):(b[f++]=240|c>>>18,b[f++]=128|c>>>12&63,b[f++]=128|c>>>6&63,b[f++]=128|63&c);return b},m=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+j[a[c]]>b?c:b},n=function(a){var b,c,d,e,g=a.length,h=new Array(2*g);for(c=0,b=0;g>b;)if(d=a[b++],128>d)h[c++]=d;else if(e=j[d],e>4)h[c++]=65533,b+=e-1;else{for(d&=2===e?31:3===e?15:7;e>1&&g>b;)d=d<<6|63&a[b++],e--;e>1?h[c++]=65533:65536>d?h[c++]=d:(d-=65536,h[c++]=55296|d>>10&1023,h[c++]=56320|1023&d)}return h.length!==c&&(h.subarray?h=h.subarray(0,c):h.length=c),f.applyFromCharCode(h)};c.utf8encode=function(a){return g.nodebuffer?h.newBuffer(a,"utf-8"):l(a)},c.utf8decode=function(a){return g.nodebuffer?f.transformTo("nodebuffer",a).toString("utf-8"):(a=f.transformTo(g.uint8array?"uint8array":"array",a),n(a))},f.inherits(d,i),d.prototype.processChunk=function(a){var b=f.transformTo(g.uint8array?"uint8array":"array",a.data);if(this.leftOver&&this.leftOver.length){if(g.uint8array){var d=b;b=new Uint8Array(d.length+this.leftOver.length),b.set(this.leftOver,0),b.set(d,this.leftOver.length)}else b=this.leftOver.concat(b);this.leftOver=null}var e=m(b),h=b;e!==b.length&&(g.uint8array?(h=b.subarray(0,e),this.leftOver=b.subarray(e,b.length)):(h=b.slice(0,e),this.leftOver=b.slice(e,b.length))),this.push({data:c.utf8decode(h),meta:a.meta})},d.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:c.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},c.Utf8DecodeWorker=d,f.inherits(e,i),e.prototype.processChunk=function(a){this.push({data:c.utf8encode(a.data),meta:a.meta})},c.Utf8EncodeWorker=e},{"./nodejsUtils":12,"./stream/GenericWorker":25,"./support":27,"./utils":29}],29:[function(a,b,c){"use strict";function d(a){var b=null;return b=i.uint8array?new Uint8Array(a.length):new Array(a.length),f(a,b)}function e(a){return a}function f(a,b){for(var c=0;c1;)try{return n.stringifyByChunk(a,d,b)}catch(f){b=Math.floor(b/2)}return n.stringifyByChar(a)}function h(a,b){for(var c=0;c=f)return String.fromCharCode.apply(null,a);for(;f>e;)"array"===b||"nodebuffer"===b?d.push(String.fromCharCode.apply(null,a.slice(e,Math.min(e+c,f)))):d.push(String.fromCharCode.apply(null,a.subarray(e,Math.min(e+c,f)))),e+=c;return d.join("")},stringifyByChar:function(a){for(var b="",c=0;cb?"0":"")+b.toString(16).toUpperCase();return d},c.delay=function(a,b,c){l(function(){a.apply(c||null,b||[])})},c.inherits=function(a,b){var c=function(){};c.prototype=b.prototype,a.prototype=new c},c.extend=function(){var a,b,c={};for(a=0;ae;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readData(b),this.zip64ExtensibleData[a]={id:a,length:b,value:c}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;aa){var b=!this.isSignature(0,g.LOCAL_FILE_HEADER);throw b?new Error("Can't find end of central directory : is this a zip file ? If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html"):new Error("Corrupted zip : can't find end of central directory")}this.reader.setIndex(a);var c=a;if(this.checkSignature(g.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===f.MAX_VALUE_16BITS||this.diskWithCentralDirStart===f.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===f.MAX_VALUE_16BITS||this.centralDirRecords===f.MAX_VALUE_16BITS||this.centralDirSize===f.MAX_VALUE_32BITS||this.centralDirOffset===f.MAX_VALUE_32BITS){if(this.zip64=!0,a=this.reader.lastIndexOfSignature(g.ZIP64_CENTRAL_DIRECTORY_LOCATOR),0>a)throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");if(this.reader.setIndex(a),this.checkSignature(g.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,g.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(g.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error("Corrupted zip : can't find the ZIP64 end of central directory");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(g.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var d=this.centralDirOffset+this.centralDirSize;this.zip64&&(d+=20,d+=12+this.zip64EndOfCentralSize);var e=c-d;if(e>0)this.isSignature(c,g.CENTRAL_FILE_HEADER)||(this.reader.zero=e);else if(0>e)throw new Error("Corrupted zip: missing "+Math.abs(e)+" bytes.")},prepareReader:function(a){this.reader=e(a)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=d},{"./reader/readerFor":19,"./signature":20,"./support":27,"./utf8":28,"./utils":29,"./zipEntry":31}],31:[function(a,b,c){"use strict";function d(a,b){this.options=a,this.loadOptions=b}var e=a("./reader/readerFor"),f=a("./utils"),g=a("./compressedObject"),h=a("./crc32"),i=a("./utf8"),j=a("./compressions"),k=a("./support"),l=0,m=3,n=function(a){for(var b in j)if(j.hasOwnProperty(b)&&j[b].magic===a)return j[b];return null};d.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readData(this.fileNameLength),a.skip(c),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(b=n(this.compressionMethod),null===b)throw new Error("Corrupted zip : compression "+f.pretty(this.compressionMethod)+" unknown (inner file : "+f.transformTo("string",this.fileName)+")");this.decompressed=new g(this.compressedSize,this.uncompressedSize,this.crc32,b,a.readData(this.compressedSize))},readCentralPart:function(a){this.versionMadeBy=a.readInt(2),a.skip(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4);var b=a.readInt(2);if(this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");a.skip(b),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var a=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),a===l&&(this.dosPermissions=63&this.externalFileAttributes),a===m&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(a){if(this.extraFields[1]){var b=e(this.extraFields[1].value);this.uncompressedSize===f.MAX_VALUE_32BITS&&(this.uncompressedSize=b.readInt(8)),this.compressedSize===f.MAX_VALUE_32BITS&&(this.compressedSize=b.readInt(8)),this.localHeaderOffset===f.MAX_VALUE_32BITS&&(this.localHeaderOffset=b.readInt(8)),this.diskNumberStart===f.MAX_VALUE_32BITS&&(this.diskNumberStart=b.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});a.indexk){for(var b=0,c=h.length-j;c>b;b++)h[b]=h[b+j];h.length-=j,j=0}}h.length=0,j=0,i=!1}function e(a){var b=1,c=new l(a),d=document.createTextNode("");return c.observe(d,{characterData:!0}),function(){b=-b,d.data=b}}function f(a){return function(){function b(){clearTimeout(c),clearInterval(d),a()}var c=setTimeout(b,0),d=setInterval(b,50)}}b.exports=c;var g,h=[],i=!1,j=0,k=1024,l=a.MutationObserver||a.WebKitMutationObserver;g="function"==typeof l?e(d):f(d),c.requestFlush=g,c.makeRequestCallFromTimer=f}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],35:[function(a,b,c){},{}],36:[function(a,b,c){function d(){k=!1,h.length?j=h.concat(j):l=-1,j.length&&e()}function e(){if(!k){var a=setTimeout(d);k=!0;for(var b=j.length;b;){for(h=j,j=[];++l1)for(var c=1;ca;a+=2){var b=ca[a],c=ca[a+1];b(c),ca[a]=void 0,ca[a+1]=void 0}X=0}function q(){try{var a=b,c=a("vertx");return T=c.runOnLoop||c.runOnContext,l()}catch(d){return o()}}function r(){}function s(){return new TypeError("You cannot resolve a promise with itself")}function t(){return new TypeError("A promises callback cannot return that same promise.")}function u(a){try{return a.then}catch(b){return ga.error=b,ga}}function v(a,b,c,d){try{a.call(b,c,d)}catch(e){return e}}function w(a,b,c){Y(function(a){var d=!1,e=v(c,b,function(c){d||(d=!0,b!==c?z(a,c):B(a,c))},function(b){d||(d=!0,C(a,b))},"Settle: "+(a._label||" unknown promise"));!d&&e&&(d=!0,C(a,e))},a)}function x(a,b){b._state===ea?B(a,b._result):b._state===fa?C(a,b._result):D(b,void 0,function(b){z(a,b)},function(b){C(a,b)})}function y(a,b){if(b.constructor===a.constructor)x(a,b);else{var c=u(b);c===ga?C(a,ga.error):void 0===c?B(a,b):g(c)?w(a,b,c):B(a,b)}}function z(a,b){a===b?C(a,s()):f(b)?y(a,b):B(a,b)}function A(a){a._onerror&&a._onerror(a._result),E(a)}function B(a,b){a._state===da&&(a._result=b,a._state=ea,0!==a._subscribers.length&&Y(E,a))}function C(a,b){a._state===da&&(a._state=fa,a._result=b,Y(A,a))}function D(a,b,c,d){var e=a._subscribers,f=e.length;a._onerror=null,e[f]=b,e[f+ea]=c,e[f+fa]=d,0===f&&a._state&&Y(E,a)}function E(a){var b=a._subscribers,c=a._state;if(0!==b.length){for(var d,e,f=a._result,g=0;gg;g++)D(d.resolve(a[g]),void 0,b,c);return e}function M(a){var b=this;if(a&&"object"==typeof a&&a.constructor===b)return a;var c=new b(r);return z(c,a),c}function N(a){var b=this,c=new b(r);return C(c,a),c}function O(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function P(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function Q(a){this._id=na++,this._state=void 0,this._result=void 0,this._subscribers=[],r!==a&&(g(a)||O(),this instanceof Q||P(),I(this,a))}function R(){var a;if("undefined"!=typeof e)a=e;else if("undefined"!=typeof self)a=self;else try{a=Function("return this")()}catch(b){throw new Error("polyfill failed because global object is unavailable in this environment")}var c=a.Promise;c&&"[object Promise]"===Object.prototype.toString.call(c.resolve())&&!c.cast||(a.Promise=oa)}var S;S=Array.isArray?Array.isArray:function(a){return"[object Array]"===Object.prototype.toString.call(a)};var T,U,V,W=S,X=0,Y=({}.toString,function(a,b){ca[X]=a,ca[X+1]=b,X+=2,2===X&&(U?U(p):V())}),Z="undefined"!=typeof window?window:void 0,$=Z||{},_=$.MutationObserver||$.WebKitMutationObserver,aa="undefined"!=typeof d&&"[object process]"==={}.toString.call(d),ba="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,ca=new Array(1e3);V=aa?k():_?m():ba?n():void 0===Z&&"function"==typeof b?q():o();var da=void 0,ea=1,fa=2,ga=new F,ha=new F;J.prototype._validateInput=function(a){return W(a)},J.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},J.prototype._init=function(){this._result=new Array(this.length)};var ia=J;J.prototype._enumerate=function(){for(var a=this,b=a.length,c=a.promise,d=a._input,e=0;c._state===da&&b>e;e++)a._eachEntry(d[e],e)},J.prototype._eachEntry=function(a,b){var c=this,d=c._instanceConstructor;h(a)?a.constructor===d&&a._state!==da?(a._onerror=null,c._settledAt(a._state,b,a._result)):c._willSettleAt(d.resolve(a),b):(c._remaining--,c._result[b]=a)},J.prototype._settledAt=function(a,b,c){var d=this,e=d.promise;e._state===da&&(d._remaining--,a===fa?C(e,c):d._result[b]=c),0===d._remaining&&B(e,d._result)},J.prototype._willSettleAt=function(a,b){var c=this;D(a,void 0,function(a){c._settledAt(ea,b,a)},function(a){c._settledAt(fa,b,a)})};var ja=K,ka=L,la=M,ma=N,na=0,oa=Q;Q.all=ja,Q.race=ka,Q.resolve=la,Q.reject=ma,Q._setScheduler=i,Q._setAsap=j,Q._asap=Y,Q.prototype={constructor:Q,then:function(a,b){var c=this,d=c._state;if(d===ea&&!a||d===fa&&!b)return this;var e=new this.constructor(r),f=c._result;if(d){var g=arguments[d-1];Y(function(){H(d,e,g,f)})}else D(c,e,a,b);return e},"catch":function(a){return this.then(null,a)}};var pa=R,qa={Promise:oa,polyfill:pa};"function"==typeof a&&a.amd?a(function(){return qa}):"undefined"!=typeof c&&c.exports?c.exports=qa:"undefined"!=typeof this&&(this.ES6Promise=qa),pa()}).call(this)}).call(this,b("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:36}],38:[function(a,b,c){"use strict";var d=a("./lib/utils/common").assign,e=a("./lib/deflate"),f=a("./lib/inflate"),g=a("./lib/zlib/constants"),h={};d(h,e,f,g),b.exports=h},{"./lib/deflate":39,"./lib/inflate":40,"./lib/utils/common":41,"./lib/zlib/constants":44}],39:[function(a,b,c){"use strict";function d(a){if(!(this instanceof d))return new d(a);this.options=i.assign({level:s,method:u,chunkSize:16384,windowBits:15,memLevel:8,strategy:t,to:""},a||{});var b=this.options;b.raw&&b.windowBits>0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=h.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==p)throw new Error(k[c]);if(b.header&&h.deflateSetHeader(this.strm,b.header),b.dictionary){var e;if(e="string"==typeof b.dictionary?j.string2buf(b.dictionary):"[object ArrayBuffer]"===m.call(b.dictionary)?new Uint8Array(b.dictionary):b.dictionary,c=h.deflateSetDictionary(this.strm,e),c!==p)throw new Error(k[c]);this._dict_set=!0}}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}function g(a,b){return b=b||{},b.gzip=!0,e(a,b)}var h=a("./zlib/deflate"),i=a("./utils/common"),j=a("./utils/strings"),k=a("./zlib/messages"),l=a("./zlib/zstream"),m=Object.prototype.toString,n=0,o=4,p=0,q=1,r=2,s=-1,t=0,u=8;d.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?o:n,"string"==typeof a?e.input=j.string2buf(a):"[object ArrayBuffer]"===m.call(a)?e.input=new Uint8Array(a):e.input=a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new i.Buf8(f),e.next_out=0,e.avail_out=f),c=h.deflate(e,d),c!==q&&c!==p)return this.onEnd(c),this.ended=!0,!1;0!==e.avail_out&&(0!==e.avail_in||d!==o&&d!==r)||("string"===this.options.to?this.onData(j.buf2binstring(i.shrinkBuf(e.output,e.next_out))):this.onData(i.shrinkBuf(e.output,e.next_out)))}while((e.avail_in>0||0===e.avail_out)&&c!==q);return d===o?(c=h.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===p):d===r?(this.onEnd(p),e.avail_out=0,!0):!0},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===p&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=d,c.deflate=e,c.deflateRaw=f,c.gzip=g},{"./utils/common":41,"./utils/strings":42,"./zlib/deflate":46,"./zlib/messages":51,"./zlib/zstream":53}],40:[function(a,b,c){"use strict";function d(a){if(!(this instanceof d))return new d(a);this.options=h.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=g.inflateInit2(this.strm,b.windowBits);if(c!==j.Z_OK)throw new Error(k[c]);this.header=new m,g.inflateGetHeader(this.strm,this.header)}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}var g=a("./zlib/inflate"),h=a("./utils/common"),i=a("./utils/strings"),j=a("./zlib/constants"),k=a("./zlib/messages"),l=a("./zlib/zstream"),m=a("./zlib/gzheader"),n=Object.prototype.toString;d.prototype.push=function(a,b){var c,d,e,f,k,l,m=this.strm,o=this.options.chunkSize,p=this.options.dictionary,q=!1;if(this.ended)return!1;d=b===~~b?b:b===!0?j.Z_FINISH:j.Z_NO_FLUSH,"string"==typeof a?m.input=i.binstring2buf(a):"[object ArrayBuffer]"===n.call(a)?m.input=new Uint8Array(a):m.input=a,m.next_in=0,m.avail_in=m.input.length;do{if(0===m.avail_out&&(m.output=new h.Buf8(o),m.next_out=0,m.avail_out=o),c=g.inflate(m,j.Z_NO_FLUSH),c===j.Z_NEED_DICT&&p&&(l="string"==typeof p?i.string2buf(p):"[object ArrayBuffer]"===n.call(p)?new Uint8Array(p):p,c=g.inflateSetDictionary(this.strm,l)),c===j.Z_BUF_ERROR&&q===!0&&(c=j.Z_OK,q=!1),c!==j.Z_STREAM_END&&c!==j.Z_OK)return this.onEnd(c),this.ended=!0,!1;m.next_out&&(0!==m.avail_out&&c!==j.Z_STREAM_END&&(0!==m.avail_in||d!==j.Z_FINISH&&d!==j.Z_SYNC_FLUSH)||("string"===this.options.to?(e=i.utf8border(m.output,m.next_out),f=m.next_out-e,k=i.buf2string(m.output,e),m.next_out=f,m.avail_out=o-f,f&&h.arraySet(m.output,m.output,e,f,0),this.onData(k)):this.onData(h.shrinkBuf(m.output,m.next_out)))),0===m.avail_in&&0===m.avail_out&&(q=!0)}while((m.avail_in>0||0===m.avail_out)&&c!==j.Z_STREAM_END);return c===j.Z_STREAM_END&&(d=j.Z_FINISH),d===j.Z_FINISH?(c=g.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===j.Z_OK):d===j.Z_SYNC_FLUSH?(this.onEnd(j.Z_OK),m.avail_out=0,!0):!0},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===j.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=d,c.inflate=e,c.inflateRaw=f,c.ungzip=e},{"./utils/common":41,"./utils/strings":42,"./zlib/constants":44,"./zlib/gzheader":47,"./zlib/inflate":49,"./zlib/messages":51,"./zlib/zstream":53}],41:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){var b,c,d,e,f,g;for(d=0,b=0,c=a.length;c>b;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;c>b;b++)f=a[b],g.set(f,e),e+=f.length;return g}},f={arraySet:function(a,b,c,d,e){for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){return[].concat.apply([],a)}};c.setTyped=function(a){a?(c.Buf8=Uint8Array,c.Buf16=Uint16Array,c.Buf32=Int32Array,c.assign(c,e)):(c.Buf8=Array,c.Buf16=Array,c.Buf32=Array,c.assign(c,f))},c.setTyped(d)},{}],42:[function(a,b,c){"use strict";function d(a,b){if(65537>b&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c="",d=0;b>d;d++)c+=String.fromCharCode(a[d]);return c}var e=a("./common"),f=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(h){f=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(h){g=!1}for(var i=new e.Buf8(256),j=0;256>j;j++)i[j]=j>=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=new e.Buf8(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;d>c;c++)b[c]=a.charCodeAt(c);return b},c.buf2string=function(a,b){var c,e,f,g,h=b||a.length,j=new Array(2*h);for(e=0,c=0;h>c;)if(f=a[c++],128>f)j[e++]=f;else if(g=i[f],g>4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&h>c;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:65536>f?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+i[a[c]]>b?c:b}},{"./common":41}],43:[function(a,b,c){"use strict";function d(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=d},{}],44:[function(a,b,c){"use strict";b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],45:[function(a,b,c){"use strict";function d(){for(var a,b=[],c=0;256>c;c++){a=c;for(var d=0;8>d;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=f,g=d+c;a^=-1;for(var h=d;g>h;h++)a=a>>>8^e[255&(a^b[h])];return-1^a}var f=d();b.exports=e},{}],46:[function(a,b,c){"use strict";function d(a,b){return a.msg=I[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(E.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){F._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,E.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=G(a.adler,b,e,c):2===a.state.wrap&&(a.adler=H(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-la?a.strstart-(a.w_size-la):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ka,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&m>f);if(d=ka-(m-f),f=m-ka,d>g){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-la)){E.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=ja)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===J)return ua;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return ua;if(a.strstart-a.block_start>=a.w_size-la&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?ua:ua}function o(a,b){for(var c,d;;){if(a.lookahead=ja&&(a.ins_h=(a.ins_h<=ja)if(d=F._tr_tally(a,a.strstart-a.match_start,a.match_length-ja),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=ja){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<=ja&&(a.ins_h=(a.ins_h<4096)&&(a.match_length=ja-1)),a.prev_length>=ja&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-ja,d=F._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-ja),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<=ja&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ka;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&f>e);a.match_length=ka-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=ja?(c=F._tr_tally(a,1,a.match_length-ja),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===J)return ua;break}if(a.match_length=0,c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function s(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e}function t(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=D[a.level].max_lazy,a.good_match=D[a.level].good_length,a.nice_match=D[a.level].nice_length,a.max_chain_length=D[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=ja-1,a.match_available=0,a.ins_h=0}function u(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=$,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new E.Buf16(2*ha),this.dyn_dtree=new E.Buf16(2*(2*fa+1)),this.bl_tree=new E.Buf16(2*(2*ga+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new E.Buf16(ia+1),this.heap=new E.Buf16(2*ea+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new E.Buf16(2*ea+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function v(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=Z,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?na:sa,a.adler=2===b.wrap?0:1,b.last_flush=J,F._tr_init(b),O):d(a,Q)}function w(a){var b=v(a);return b===O&&t(a.state),b}function x(a,b){return a&&a.state?2!==a.state.wrap?Q:(a.state.gzhead=b,O):Q}function y(a,b,c,e,f,g){if(!a)return Q;var h=1;if(b===T&&(b=6),0>e?(h=0,e=-e):e>15&&(h=2,e-=16),1>f||f>_||c!==$||8>e||e>15||0>b||b>9||0>g||g>X)return d(a,Q);8===e&&(e=9);var i=new u;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<>1,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,w(a)}function z(a,b){return y(a,b,$,aa,ba,Y)}function A(a,b){var c,h,k,l;if(!a||!a.state||b>N||0>b)return a?d(a,Q):Q;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===ta&&b!==M)return d(a,0===a.avail_out?S:Q);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===na)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=H(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=oa):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,ya),h.status=sa);else{var m=$+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=V||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=ma),m+=31-m%31,h.status=sa,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===oa)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=pa)}else h.status=pa;if(h.status===pa)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=qa)}else h.status=qa;if(h.status===qa)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=ra)}else h.status=ra;if(h.status===ra&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=sa)):h.status=sa),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,O}else if(0===a.avail_in&&e(b)<=e(c)&&b!==M)return d(a,S);if(h.status===ta&&0!==a.avail_in)return d(a,S);if(0!==a.avail_in||0!==h.lookahead||b!==J&&h.status!==ta){var o=h.strategy===V?r(h,b):h.strategy===W?q(h,b):D[h.level].func(h,b);if(o!==wa&&o!==xa||(h.status=ta),o===ua||o===wa)return 0===a.avail_out&&(h.last_flush=-1),O;if(o===va&&(b===K?F._tr_align(h):b!==N&&(F._tr_stored_block(h,0,0,!1),b===L&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,O}return b!==M?O:h.wrap<=0?P:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?O:P)}function B(a){var b;return a&&a.state?(b=a.state.status,b!==na&&b!==oa&&b!==pa&&b!==qa&&b!==ra&&b!==sa&&b!==ta?d(a,Q):(a.state=null,b===sa?d(a,R):O)):Q}function C(a,b){var c,d,e,g,h,i,j,k,l=b.length;if(!a||!a.state)return Q;if(c=a.state,g=c.wrap,2===g||1===g&&c.status!==na||c.lookahead)return Q;for(1===g&&(a.adler=G(a.adler,b,l,0)),c.wrap=0,l>=c.w_size&&(0===g&&(f(c.head),c.strstart=0,c.block_start=0,c.insert=0),k=new E.Buf8(c.w_size),E.arraySet(k,b,l-c.w_size,c.w_size,0),b=k,l=c.w_size),h=a.avail_in,i=a.next_in,j=a.input,a.avail_in=l,a.next_in=0,a.input=b,m(c);c.lookahead>=ja;){d=c.strstart,e=c.lookahead-(ja-1);do c.ins_h=(c.ins_h<q&&(p+=B[f++]<>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<q&&(p+=B[f++]<>>=w,q-=w),15>q&&(p+=B[f++]<>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<q&&(p+=B[f++]<q&&(p+=B[f++]<k){a.msg="invalid distance too far back",c.mode=d;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&c.sane){a.msg="invalid distance too far back",c.mode=d;break a}if(z=0,A=o,0===n){if(z+=l-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}else if(w>n){if(z+=l+n-w,w-=n,x>w){x-=w;do C[h++]=o[z++];while(--w);if(z=0,x>n){w=n,x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}}else if(z+=n-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}for(;x>2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(g>f&&j>h);x=q>>3,f-=x,q-=x<<3,p&=(1<f?5+(g-f):5-(f-g),a.avail_out=j>h?257+(j-h):257-(h-j),c.hold=p,c.bits=q}},{}],49:[function(a,b,c){"use strict";function d(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new s.Buf16(320),this.work=new s.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=L,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new s.Buf32(pa),b.distcode=b.distdyn=new s.Buf32(qa),b.sane=1,b.back=-1,D):G}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):G}function h(a,b){var c,d;return a&&a.state?(d=a.state,0>b?(c=0,b=-b):(c=(b>>4)+1,48>b&&(b&=15)),b&&(8>b||b>15)?G:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):G}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==D&&(a.state=null),c):G}function j(a){return i(a,sa)}function k(a){if(ta){var b;for(q=new s.Buf32(512),r=new s.Buf32(32),b=0;144>b;)a.lens[b++]=8;for(;256>b;)a.lens[b++]=9;for(;280>b;)a.lens[b++]=7;for(;288>b;)a.lens[b++]=8;for(w(y,a.lens,0,288,q,0,a.work,{bits:9}),b=0;32>b;)a.lens[b++]=5;w(z,a.lens,0,32,r,0,a.work,{bits:5}),ta=!1}a.lencode=q,a.lenbits=9,a.distcode=r,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<=f.wsize?(s.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),s.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(s.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whaven;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=u(c.check,Ba,2,0),m=0,n=0,c.mode=M;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=ma;break}if((15&m)!==K){a.msg="unknown compression method",c.mode=ma;break}if(m>>>=4,n-=4,wa=(15&m)+8,0===c.wbits)c.wbits=wa;else if(wa>c.wbits){a.msg="invalid window size",c.mode=ma;break}c.dmax=1<n;){if(0===i)break a;i--,m+=e[g++]<>8&1),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=N;case N:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<>>8&255,Ba[2]=m>>>16&255,Ba[3]=m>>>24&255,c.check=u(c.check,Ba,4,0)),m=0,n=0,c.mode=O;case O:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>8),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=P;case P:if(1024&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=Q;case Q:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wa=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),s.arraySet(c.head.extra,e,g,q,wa)),512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=R;case R:if(2048&c.flags){if(0===i)break a;q=0;do wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.name+=String.fromCharCode(wa));while(wa&&i>q);if(512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,wa)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=S;case S:if(4096&c.flags){if(0===i)break a;q=0;do wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.comment+=String.fromCharCode(wa));while(wa&&i>q);if(512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,wa)break a}else c.head&&(c.head.comment=null);c.mode=T;case T:if(512&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=W;break;case U:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<>>=7&n,n-=7&n,c.mode=ja;break}for(;3>n;){if(0===i)break a;i--,m+=e[g++]<>>=1,n-=1,3&m){case 0:c.mode=Y;break;case 1:if(k(c),c.mode=ca,b===C){m>>>=2,n-=2;break a}break;case 2:c.mode=_;break;case 3:a.msg="invalid block type",c.mode=ma}m>>>=2,n-=2;break;case Y:for(m>>>=7&n,n-=7&n;32>n;){if(0===i)break a;i--,m+=e[g++]<>>16^65535)){a.msg="invalid stored block lengths",c.mode=ma;break}if(c.length=65535&m,m=0,n=0,c.mode=Z,b===C)break a;case Z:c.mode=$;case $:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;s.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=W;break;case _:for(;14>n;){if(0===i)break a;i--,m+=e[g++]<>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=ma;break}c.have=0,c.mode=aa;case aa:for(;c.haven;){if(0===i)break a;i--,m+=e[g++]<>>=3,n-=3}for(;c.have<19;)c.lens[Ca[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,ya={bits:c.lenbits},xa=w(x,c.lens,0,19,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg="invalid code lengths set",c.mode=ma;break}c.have=0,c.mode=ba;case ba:for(;c.have>>24,ra=Aa>>>16&255,sa=65535&Aa,!(n>=qa);){if(0===i)break a;i--,m+=e[g++]<sa)m>>>=qa,n-=qa,c.lens[c.have++]=sa;else{if(16===sa){for(za=qa+2;za>n;){if(0===i)break a;i--,m+=e[g++]<>>=qa,n-=qa,0===c.have){a.msg="invalid bit length repeat",c.mode=ma;break}wa=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sa){for(za=qa+3;za>n;){if(0===i)break a;i--,m+=e[g++]<>>=qa,n-=qa,wa=0,q=3+(7&m),m>>>=3,n-=3}else{for(za=qa+7;za>n;){if(0===i)break a;i--,m+=e[g++]<>>=qa,n-=qa,wa=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=ma;break}for(;q--;)c.lens[c.have++]=wa}}if(c.mode===ma)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=ma;break}if(c.lenbits=9,ya={bits:c.lenbits},xa=w(y,c.lens,0,c.nlen,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg="invalid literal/lengths set",c.mode=ma;break}if(c.distbits=6,c.distcode=c.distdyn,ya={bits:c.distbits},xa=w(z,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,ya),c.distbits=ya.bits,xa){a.msg="invalid distances set",c.mode=ma;break}if(c.mode=ca,b===C)break a;case ca:c.mode=da;case da:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,v(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===W&&(c.back=-1);break}for(c.back=0;Aa=c.lencode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(n>=qa);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(n>=ta+qa);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,c.length=sa,0===ra){c.mode=ia;break}if(32&ra){c.back=-1,c.mode=W;break}if(64&ra){a.msg="invalid literal/length code",c.mode=ma;break}c.extra=15&ra,c.mode=ea;case ea:if(c.extra){for(za=c.extra;za>n;){if(0===i)break a;i--,m+=e[g++]<>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=fa;case fa:for(;Aa=c.distcode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(n>=qa);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(n>=ta+qa);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,64&ra){a.msg="invalid distance code",c.mode=ma;break}c.offset=sa,c.extra=15&ra,c.mode=ga;case ga:if(c.extra){for(za=c.extra;za>n;){if(0===i)break a;i--,m+=e[g++]<>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=ma;break}c.mode=ha;case ha:if(0===j)break a;if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=ma;break}q>c.wnext?(q-=c.wnext,r=c.wsize-q):r=c.wnext-q,q>c.length&&(q=c.length),pa=c.window}else pa=f,r=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pa[r++];while(--q);0===c.length&&(c.mode=da);break;case ia:if(0===j)break a;f[h++]=c.length,j--,c.mode=da;break;case ja:if(c.wrap){for(;32>n;){if(0===i)break a;i--,m|=e[g++]<n;){if(0===i)break a;i--,m+=e[g++]<=D;D++)P[D]=0;for(E=0;o>E;E++)P[b[c+E]]++;for(H=C,G=e;G>=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;G>F&&0===P[F];F++);for(F>H&&(H=F),K=1,D=1;e>=D;D++)if(K<<=1,K-=P[D],0>K)return-1;if(K>0&&(a===h||1!==G))return-1;for(Q[1]=0,D=1;e>D;D++)Q[D+1]=Q[D]+P[D];for(E=0;o>E;E++)0!==b[c+E]&&(r[Q[b[c+E]]++]=E);if(a===h?(N=R=r,y=19):a===i?(N=k,O-=257,R=l,S-=257,y=256):(N=m,R=n,y=-1),M=0,E=0,D=F,x=q,I=H,J=0,v=-1,L=1<f||a===j&&L>g)return 1;for(var T=0;;){T++,z=D-J,r[E]y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[c+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<I+J&&(K-=P[I+J],!(0>=K));)I++,K<<=1;if(L+=1<f||a===j&&L>g)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{"../utils/common":41}],51:[function(a,b,c){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],52:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length}function f(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b}function g(a){return 256>a?ia[a]:ia[256+(a>>>7)]}function h(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function i(a,b,c){a.bi_valid>X-c?(a.bi_buf|=b<>X-a.bi_valid,a.bi_valid+=c-X):(a.bi_buf|=b<>>=1,c<<=1;while(--b>0);return c>>>1}function l(a){16===a.bi_valid?(h(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function m(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;W>=f;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;V>c;c++)d=a.heap[c],f=i[2*i[2*d+1]+1]+1,f>o&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function n(a,b,c){var d,e,f=new Array(W+1),g=0;for(d=1;W>=d;d++)f[d]=g=g+c[d-1]<<1;for(e=0;b>=e;e++){var h=a[2*e+1];0!==h&&(a[2*e]=k(f[h]++,h))}}function o(){var a,b,c,d,f,g=new Array(W+1);for(c=0,d=0;Q-1>d;d++)for(ka[d]=c,a=0;a<1<d;d++)for(la[d]=f,a=0;a<1<>=7;T>d;d++)for(la[d]=f<<7,a=0;a<1<=b;b++)g[b]=0;for(a=0;143>=a;)ga[2*a+1]=8,a++,g[8]++;for(;255>=a;)ga[2*a+1]=9,a++,g[9]++;for(;279>=a;)ga[2*a+1]=7,a++,g[7]++;for(;287>=a;)ga[2*a+1]=8,a++,g[8]++;for(n(ga,S+1,g),a=0;T>a;a++)ha[2*a+1]=5,ha[2*a]=k(a,5);ma=new e(ga,ba,R+1,S,W),na=new e(ha,ca,0,T,W),oa=new e(new Array(0),da,0,U,Y)}function p(a){var b;for(b=0;S>b;b++)a.dyn_ltree[2*b]=0;for(b=0;T>b;b++)a.dyn_dtree[2*b]=0;for(b=0;U>b;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*Z]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function q(a){a.bi_valid>8?h(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function r(a,b,c,d){q(a),d&&(h(a,c),h(a,~c)),G.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function s(a,b,c,d){var e=2*b,f=2*c;return a[e]c;c++)0!==f[2*c]?(a.heap[++a.heap_len]=j=c,a.depth[c]=0):f[2*c+1]=0;for(;a.heap_len<2;)e=a.heap[++a.heap_len]=2>j?++j:0,f[2*e]=1,a.depth[e]=0,a.opt_len--,h&&(a.static_len-=g[2*e+1]);for(b.max_code=j,c=a.heap_len>>1;c>=1;c--)t(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],t(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,t(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],m(a,b),n(f,j,a.bl_count)}function w(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;c>=d;d++)e=g,g=b[2*(d+1)+1], +++hh?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*$]++):10>=h?a.bl_tree[2*_]++:a.bl_tree[2*aa]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6,j=3):(i=7,j=4))}function x(a,b,c){var d,e,f=-1,g=b[1],h=0,k=7,l=4;for(0===g&&(k=138,l=3),d=0;c>=d;d++)if(e=g,g=b[2*(d+1)+1],!(++hh){do j(a,e,a.bl_tree);while(0!==--h)}else 0!==e?(e!==f&&(j(a,e,a.bl_tree),h--),j(a,$,a.bl_tree),i(a,h-3,2)):10>=h?(j(a,_,a.bl_tree),i(a,h-3,3)):(j(a,aa,a.bl_tree),i(a,h-11,7));h=0,f=e,0===g?(k=138,l=3):e===g?(k=6,l=3):(k=7,l=4)}}function y(a){var b;for(w(a,a.dyn_ltree,a.l_desc.max_code),w(a,a.dyn_dtree,a.d_desc.max_code),v(a,a.bl_desc),b=U-1;b>=3&&0===a.bl_tree[2*ea[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function z(a,b,c,d){var e;for(i(a,b-257,5),i(a,c-1,5),i(a,d-4,4),e=0;d>e;e++)i(a,a.bl_tree[2*ea[e]+1],3);x(a,a.dyn_ltree,b-1),x(a,a.dyn_dtree,c-1)}function A(a){var b,c=4093624447;for(b=0;31>=b;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return I;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return J;for(b=32;R>b;b++)if(0!==a.dyn_ltree[2*b])return J;return I}function B(a){pa||(o(),pa=!0),a.l_desc=new f(a.dyn_ltree,ma),a.d_desc=new f(a.dyn_dtree,na),a.bl_desc=new f(a.bl_tree,oa),a.bi_buf=0,a.bi_valid=0,p(a)}function C(a,b,c,d){i(a,(L<<1)+(d?1:0),3),r(a,b,c,!0)}function D(a){i(a,M<<1,3),j(a,Z,ga),l(a)}function E(a,b,c,d){var e,f,g=0;a.level>0?(a.strm.data_type===K&&(a.strm.data_type=A(a)),v(a,a.l_desc),v(a,a.d_desc),g=y(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,e>=f&&(e=f)):e=f=c+5,e>=c+4&&-1!==b?C(a,b,c,d):a.strategy===H||f===e?(i(a,(M<<1)+(d?1:0),3),u(a,ga,ha)):(i(a,(N<<1)+(d?1:0),3),z(a,a.l_desc.max_code+1,a.d_desc.max_code+1,g+1),u(a,a.dyn_ltree,a.dyn_dtree)),p(a),d&&q(a)}function F(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(ja[c]+R+1)]++,a.dyn_dtree[2*g(b)]++),a.last_lit===a.lit_bufsize-1}var G=a("../utils/common"),H=4,I=0,J=1,K=2,L=0,M=1,N=2,O=3,P=258,Q=29,R=256,S=R+1+Q,T=30,U=19,V=2*S+1,W=15,X=16,Y=7,Z=256,$=16,_=17,aa=18,ba=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ca=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],da=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],ea=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],fa=512,ga=new Array(2*(S+2));d(ga);var ha=new Array(2*T);d(ha);var ia=new Array(fa);d(ia);var ja=new Array(P-O+1);d(ja);var ka=new Array(Q);d(ka);var la=new Array(T);d(la);var ma,na,oa,pa=!1;c._tr_init=B,c._tr_stored_block=C,c._tr_flush_block=E,c._tr_tally=F,c._tr_align=D},{"../utils/common":41}],53:[function(a,b,c){"use strict";function d(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}b.exports=d},{}]},{},[10])(10)}); \ No newline at end of file diff --git a/docs/_style/prism-master/vendor/promise.js b/docs/_style/prism-master/vendor/promise.js new file mode 100644 index 0000000..9bcc799 --- /dev/null +++ b/docs/_style/prism-master/vendor/promise.js @@ -0,0 +1,5 @@ +/** + * ES6-Promises + * https://github.com/jakearchibald/es6-promise + */ +!function(){var a,b,c,d;!function(){var e={},f={};a=function(a,b,c){e[a]={deps:b,callback:c}},d=c=b=function(a){function c(b){if("."!==b.charAt(0))return b;for(var c=b.split("/"),d=a.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(d._eak_seen=e,f[a])return f[a];if(f[a]={},!e[a])throw new Error("Could not find module "+a);for(var g,h=e[a],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)"exports"===i[l]?k.push(g={}):k.push(b(c(i[l])));var n=j.apply(this,k);return f[a]=g||n}}(),a("promise/all",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){f(a,b)}}function f(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;jul:nth-child(1) { + display: none; +} + +#main>ul:nth-child(2) { + display: none; +} + +.markdown-section h1 { + margin: 3rem 0 2rem 0; +} + +.markdown-section h2 { + margin: 2rem 0 1rem; +} + +.content, +.sidebar, +.markdown-section, +body, +.search input, +.sidebar-toggle { + background-color: rgba(243, 242, 238, 1) !important; +} + +body { + /*font-family: Microsoft YaHei, Source Sans Pro, Helvetica Neue, Arial, sans-serif !important;*/ +} + +.markdown-section>p { + font-size: 16px !important; +} + +.markdown-section pre>code { + font-family: Consolas, Roboto Mono, Monaco, courier, monospace !important; + font-size: .9rem !important; + +} + +/*.anchor span { + color: rgb(66, 185, 131); +}*/ + +section.cover h1 { + margin: 0; +} + +body>section>div.cover-main>ul>li>a { + color: #42b983; +} + +.markdown-section img { + box-shadow: 7px 9px 10px #aaa !important; +} + + +pre { + background-color: #f3f2ee !important; +} + +@media (min-width:600px) { + pre code { + /*box-shadow: 2px 1px 20px 2px #aaa;*/ + /*border-radius: 10px !important;*/ + padding-left: 20px !important; + } +} + +@media (max-width:600px) { + pre { + padding-left: 0px !important; + padding-right: 0px !important; + } +} + +.markdown-section pre { + padding-left: 0 !important; + padding-right: 0px !important; + box-shadow: 2px 1px 20px 2px #aaa; +} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..bc7ec5b --- /dev/null +++ b/docs/index.html @@ -0,0 +1,397 @@ + + + + + + CS-Notes + + + + + + + + + + + + + + + +

        + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/notes/01. 考虑使用é™æ€å·¥åŽ‚方法替代构造方法.md b/docs/notes/01. 考虑使用é™æ€å·¥åŽ‚方法替代构造方法.md new file mode 100644 index 0000000..84c17c8 --- /dev/null +++ b/docs/notes/01. 考虑使用é™æ€å·¥åŽ‚方法替代构造方法.md @@ -0,0 +1,67 @@ +# 1. 考虑使用é™æ€å·¥åŽ‚方法替代构造方法 + + +  一个类å…许客户端获å–其实例的传统方å¼æ˜¯æ供一个公共构造方法。 其实还有å¦ä¸€ç§æŠ€æœ¯åº”该æˆä¸ºæ¯ä¸ªç¨‹åºå‘˜å·¥å…·ç®±çš„一部分。 一个类å¯ä»¥æ供一个公共é™æ€å·¥åŽ‚方法,它åªæ˜¯ä¸€ä¸ªè¿”回类实例的é™æ€æ–¹æ³•ã€‚ 下é¢æ˜¯ä¸€ä¸ª `Boolean` 简å•çš„例å­ï¼ˆ`boolean` 基本类型的包装类)。 此方法将 `boolean` 基本类型转æ¢ä¸º `Boolean` 对象引用: + +```Java +public static Boolean valueOf(boolean b) { + return b ? Boolean.TRUE : Boolean.FALSE; +} +``` + +  注æ„,é™æ€å·¥åŽ‚方法与设计模å¼ä¸­çš„工厂方法模å¼ä¸åŒ[Gamma95]。本æ¡ç›®ä¸­æè¿°çš„é™æ€å·¥åŽ‚方法在设计模å¼ä¸­æ²¡æœ‰ç›´æŽ¥çš„等价。 + +  类å¯ä»¥ä¸ºå…¶å®¢æˆ·ç«¯æä¾›é™æ€å·¥åŽ‚方法,而ä¸æ˜¯å…¬å…±æž„造方法。æä¾›é™æ€å·¥åŽ‚方法而ä¸æ˜¯å…¬å…±æž„造方法有优点也有缺点。 + +  **é™æ€å·¥åŽ‚方法的一个优点是,ä¸åƒæž„造方法,它们是有å字的。** 如果构造方法的å‚数本身并ä¸æ述被返回的对象,则具有精心选择å称的é™æ€å·¥åŽ‚更易于使用,并且生æˆçš„客户端代ç æ›´æ˜“于阅读。 例如,返回一个å¯èƒ½ä¸ºç´ æ•°çš„ `BigInteger` 的构造方法 `BigInteger(int,int,Random)` å¯ä»¥æ›´å¥½åœ°è¡¨ç¤ºä¸ºå为 `BigInteger.probablePrime` çš„é™æ€å·¥åŽ‚方法。 (这个方法是在 Java 1.4 中添加的。) + + +  一个类åªèƒ½æœ‰ä¸€ä¸ªç»™å®šç­¾å的构造方法。 程åºå‘˜çŸ¥é“通过æ供两个构造方法æ¥è§£å†³è¿™ä¸ªé™åˆ¶ï¼Œè¿™ä¸¤ä¸ªæž„造方法的å‚数列表åªæœ‰å®ƒä»¬çš„å‚数类型的顺åºä¸åŒã€‚ 这是一个éžå¸¸ç³Ÿç³•çš„主æ„。 这样的 API 用户将永远ä¸ä¼šè®°å¾—哪个构造方法是哪个,最终会错误地调用。 阅读使用这些构造方法的代ç çš„人åªæœ‰åœ¨å‚考类文档的情况下æ‰çŸ¥é“代ç çš„作用。 + +  因为他们有å字,所以é™æ€å·¥åŽ‚方法ä¸ä¼šå—到上é¢è®¨è®ºä¸­çš„é™åˆ¶ã€‚在类中似乎需è¦å…·æœ‰ç›¸åŒç­¾å的多个构造方法的情况下,用é™æ€å·¥åŽ‚方法替æ¢æž„造方法,并仔细选择å称æ¥çªå‡ºå®ƒä»¬çš„差异。 + +  **é™æ€å·¥åŽ‚方法的第二个优点是,与构造方法ä¸åŒï¼Œå®ƒä»¬ä¸éœ€è¦æ¯æ¬¡è°ƒç”¨æ—¶éƒ½åˆ›å»ºä¸€ä¸ªæ–°å¯¹è±¡ã€‚** è¿™å…许ä¸å¯å˜çš„ç±» (æ¡ç›® 17) 使用预先构建的实例,或者在构造时缓存实例,并åå¤åˆ†é…它们以é¿å…创建ä¸å¿…è¦çš„é‡å¤å¯¹è±¡ã€‚`Boolean.valueof(boolean)` 方法说明了这ç§æ–¹æ³•ï¼šå®ƒä»Žä¸åˆ›å»ºå¯¹è±¡ã€‚è¿™ç§æŠ€æœ¯ç±»ä¼¼äºŽ `Flyweight` 模å¼[Gamma95]。如果ç»å¸¸è¯·æ±‚等价对象,那么它å¯ä»¥æžå¤§åœ°æ高性能,特别是如果在创建它们éžå¸¸æ˜‚贵的情况下。 + +  é™æ€å·¥åŽ‚方法从é‡å¤è°ƒç”¨è¿”回相åŒå¯¹è±¡çš„能力å…许类ä¿æŒåœ¨ä»»ä½•æ—¶å€™å­˜åœ¨çš„实例的严格控制。这样åšçš„类被称为实例控制( instance-controlled)。编写实例控制类的原因有很多。实例控制å…许一个类æ¥ä¿è¯å®ƒæ˜¯ä¸€ä¸ªå•ä¾‹ (3) 项或ä¸å¯å®žä¾‹åŒ–çš„ (æ¡ç›® 4)。åŒæ—¶,它å…许一个ä¸å¯å˜çš„值类 (æ¡ç›® 17) ä¿è¯ä¸å­˜åœ¨ä¸¤ä¸ªç›¸åŒçš„实例:当且仅当 `a == b` æ—¶ `a.equals(b)`。这是享元模å¼çš„基础[Gamma95]。`Enum` 类型 (æ¡ç›® 34) æ供了这个ä¿è¯ã€‚ + +  **é™æ€å·¥åŽ‚方法的第三个优点是,与构造方法ä¸åŒï¼Œå®ƒä»¬å¯ä»¥è¿”回其返回类型的任何å­ç±»åž‹çš„对象。** 这为你在选择返回对象的类时æ供了很大的çµæ´»æ€§ã€‚ + +  这ç§çµæ´»æ€§çš„一个应用是 API å¯ä»¥è¿”回对象而ä¸éœ€è¦å…¬å¼€å®ƒçš„类。 以这ç§æ–¹å¼éšè—实现类会使 API éžå¸¸ç´§å‡‘ I。 è¿™ç§æŠ€æœ¯é€‚用于基于接å£çš„框架(æ¡ç›® 20),其中接å£ä¸ºé™æ€å·¥åŽ‚方法æ供自然返回类型。 + +  在 Java 8 之å‰ï¼ŒæŽ¥å£ä¸èƒ½æœ‰é™æ€æ–¹æ³•ã€‚æ ¹æ®çº¦å®šï¼Œä¸€ä¸ªå为 `Type` 的接å£çš„é™æ€å·¥åŽ‚方法被放入一个éžå®žä¾‹åŒ–的伙伴类 (companion class)(æ¡ç›® 4)`Types` 类中。例如,Java 集åˆæ¡†æž¶æœ‰ 45 个接å£çš„实用工具实现,æä¾›ä¸å¯ä¿®æ”¹çš„集åˆã€åŒæ­¥é›†åˆç­‰ç­‰ã€‚几乎所有这些实现都是通过é™æ€å·¥åŽ‚方法在一个éžå®žä¾‹ç±» (`java .util. collections`) 中导出的。返回对象的类都是éžå…¬å¼€çš„。 + +  `Collections` 框架 API 的规模è¦æ¯”它之å‰è¾“出的 45 个å•ç‹¬çš„公共类è¦å°å¾—多,æ¯ä¸ªç±»æœ‰ä¸ªä¾¿åˆ©ç±»çš„实现。ä¸ä»…是 API 的大部分å‡å°‘了,还包括概念上的æƒé‡ï¼šç¨‹åºå‘˜å¿…须掌æ¡çš„概念的数é‡å’Œéš¾åº¦ï¼Œæ‰èƒ½ä½¿ç”¨ API。程åºå‘˜çŸ¥é“返回的对象æ°å¥½æœ‰å…¶æŽ¥å£æŒ‡å®šçš„ API,因此ä¸éœ€è¦ä¸ºå®žçŽ°ç±»è¯»é˜…读é¢å¤–的类文档。此外,使用这ç§é™æ€å·¥åŽ‚方法需è¦å®¢æˆ·ç«¯é€šè¿‡æŽ¥å£è€Œä¸æ˜¯å®žçŽ°ç±»æ¥å¼•ç”¨è¿”回的对象,这通常是良好的实践 (æ¡ç›® 64)。 + +  从 Java 8 开始,接å£ä¸èƒ½åŒ…å«é™æ€æ–¹æ³•çš„é™åˆ¶è¢«å–消了,所以通常没有ç†ç”±ä¸ºæŽ¥å£æ供一个ä¸å¯å®žä¾‹åŒ–çš„ä¼´éšç±»ã€‚ 很多公开的é™æ€æˆå‘˜åº”该放在这个接å£æœ¬èº«ã€‚ 但是,请注æ„,将这些é™æ€æ–¹æ³•çš„大部分实现代ç æ”¾åœ¨å•ç‹¬çš„包ç§æœ‰ç±»ä¸­ä»ç„¶æ˜¯å¿…è¦çš„。 这是因为 Java 8 è¦æ±‚所有接å£çš„é™æ€æˆå‘˜éƒ½æ˜¯å…¬å…±çš„。 Java 9 å…许ç§æœ‰é™æ€æ–¹æ³•ï¼Œä½†é™æ€å­—段和é™æ€æˆå‘˜ç±»ä»ç„¶éœ€è¦å…¬å¼€ã€‚ + +  **é™æ€å·¥åŽ‚的第四个优点是返回对象的类å¯ä»¥æ ¹æ®è¾“å…¥å‚æ•°çš„ä¸åŒè€Œä¸åŒã€‚** 声明的返回类型的任何å­ç±»éƒ½æ˜¯å…许的。 返回对象的类也å¯ä»¥éšæ¯æ¬¡å‘布而ä¸åŒã€‚ + +  `EnumSet` 类(æ¡ç›® 36)没有公共构造方法,åªæœ‰é™æ€å·¥åŽ‚。 在 OpenJDK 实现中,它们根æ®åº•å±‚枚举类型的大å°è¿”回两个å­ç±»ä¸­çš„一个的实例:如果大多数枚举类型具有 64 个或更少的元素,é™æ€å·¥åŽ‚将返回一个 `RegularEnumSet` 实例, 返回一个 `long` 类型;如果枚举类型具有六å五个或更多元素,则工厂将返回一个 `JumboEnumSet` 实例,返回一个 `long` 类型的数组。 + +  这两个实现类的存在对于客户是ä¸å¯è§çš„。 如果 `RegularEnumSet` ä¸å†ä¸ºå°æžšä¸¾ç±»åž‹æ供性能优势,则å¯ä»¥åœ¨æœªæ¥ç‰ˆæœ¬ä¸­å°†å…¶æ·˜æ±°ï¼Œè€Œä¸ä¼šäº§ç”Ÿä»»ä½•ä¸è‰¯å½±å“。 åŒæ ·ï¼Œæœªæ¥çš„版本å¯èƒ½ä¼šæ·»åŠ  `EnumSet` 的第三个或第四个实现,如果它è¯æ˜Žæœ‰åˆ©äºŽæ€§èƒ½ã€‚ 客户既ä¸çŸ¥é“也ä¸å…³å¿ƒä»–们从工厂返回的对象的类别; 他们åªå…³å¿ƒå®ƒæ˜¯ `EnumSet` 的一些å­ç±»ã€‚ + +  **é™æ€å·¥åŽ‚的第 5 个优点是,在编写包å«è¯¥æ–¹æ³•çš„类时,返回的对象的类ä¸éœ€è¦å­˜åœ¨ã€‚** è¿™ç§çµæ´»çš„é™æ€å·¥åŽ‚方法构æˆäº†æœåŠ¡æ供者框架的基础,比如 Java æ•°æ®åº“连接 API(JDBC)。æœåŠ¡æ供者框架是æ供者实现æœåŠ¡çš„系统,并且系统使得实现对客户端å¯ç”¨ï¼Œä»Žè€Œå°†å®¢æˆ·ç«¯ä»Žå®žçŽ°ä¸­åˆ†ç¦»å‡ºæ¥ã€‚ + +  æœåŠ¡æ供者框架中有三个基本组:æœåŠ¡æŽ¥å£ï¼Œå®ƒè¡¨ç¤ºå®žçŽ°ï¼›æ供者注册 API,æ供者用æ¥æ³¨å†Œå®žçŽ°ï¼›ä»¥åŠæœåŠ¡è®¿é—® API,客户端使用该 API 获å–æœåŠ¡çš„实例。æœåŠ¡è®¿é—® API å…许客户指定选择实现的标准。在缺少这样的标准的情况下,API 返回一个默认实现的实例,或者å…许客户通过所有å¯ç”¨çš„实现进行é历。æœåŠ¡è®¿é—® API 是çµæ´»çš„é™æ€å·¥åŽ‚,它构æˆäº†æœåŠ¡æ供者框架的基础。 + +  æœåŠ¡æ供者框架的一个å¯é€‰çš„第四个组件是一个æœåŠ¡æ供者接å£ï¼Œå®ƒæ述了一个生æˆæœåŠ¡æŽ¥å£å®žä¾‹çš„工厂对象。在没有æœåŠ¡æ供者接å£çš„情况下,必须对实现进行å射实例化 (æ¡ç›® 65)。在 JDBC 的情况下,`Connection` 扮演æœåŠ¡æŽ¥å£çš„一部分,`DriverManager.registerDriver` æ供程åºæ³¨å†Œ APIã€`DriverManager.getConnection` 是æœåŠ¡è®¿é—® API,`Driver` 是æœåŠ¡æ供者接å£ã€‚ + +  æœåŠ¡æ供者框架模å¼æœ‰è®¸å¤šå˜ç§ã€‚ 例如,æœåŠ¡è®¿é—® API å¯ä»¥å‘客户端返回比æ供者æ供的更丰富的æœåŠ¡æŽ¥å£ã€‚ 这是桥接模å¼[Gamma95]。 ä¾èµ–注入框架(æ¡ç›® 5)å¯ä»¥è¢«çœ‹ä½œæ˜¯å¼ºå¤§çš„æœåŠ¡æ供者。 从 Java 6 开始,平å°åŒ…å«ä¸€ä¸ªé€šç”¨çš„æœåŠ¡æ供者框架 `java.util.ServiceLoader`,所以你ä¸éœ€è¦ï¼Œä¸€èˆ¬ä¹Ÿä¸åº”该自己编写(æ¡ç›® 59)。 JDBC ä¸ä½¿ç”¨ `ServiceLoader`,因为å‰è€…早于åŽè€…。 + +  **åªæä¾›é™æ€å·¥åŽ‚方法的主è¦é™åˆ¶æ˜¯ï¼Œæ²¡æœ‰å…¬å…±æˆ–å—ä¿æŠ¤æž„造方法的类ä¸èƒ½è¢«å­ç±»åŒ–。** 例如,在 `Collections` 框架中ä¸å¯èƒ½å°†ä»»ä½•æ–¹ä¾¿å®žçŽ°ç±»å­ç±»åŒ–。å¯ä»¥è¯´ï¼Œè¿™å¯èƒ½æ˜¯å› ç¥¸å¾—ç¦ï¼Œå› ä¸ºå®ƒé¼“励程åºå‘˜ä½¿ç”¨ç»„åˆè€Œä¸æ˜¯ç»§æ‰¿ (æ¡ç›® 18),并且是ä¸å¯å˜ç±»åž‹ (æ¡ç›® 17)。 + +  **é™æ€å·¥åŽ‚方法的第二个缺点是,程åºå‘˜å¾ˆéš¾æ‰¾åˆ°å®ƒä»¬ã€‚** 它们ä¸åƒæž„造方法那样在 API 文档中çªå‡ºï¼Œå› æ­¤å¾ˆéš¾æ‰¾å‡ºå¦‚何实例化一个æä¾›é™æ€å·¥åŽ‚方法而ä¸æ˜¯æž„造方法的类。Javadoc 工具å¯èƒ½æœ‰ä¸€å¤©ä¼šå¼•èµ·å¯¹é™æ€å·¥åŽ‚方法的注æ„。与此åŒæ—¶ï¼Œå¯ä»¥é€šè¿‡å°†æ³¨æ„力å¸å¼•åˆ°ç±»æˆ–接å£æ–‡æ¡£ä¸­çš„é™æ€å·¥åŽ‚以åŠéµå®ˆé€šç”¨çš„命å约定æ¥å‡å°‘这个问题。下é¢æ˜¯ä¸€äº›é™æ€å·¥åŽ‚方法的常用å称。以下清å•å¹¶éžå®Œæ•´ï¼š + + - from——A 类型转æ¢æ–¹æ³•ï¼Œå®ƒæŽ¥å—å•ä¸ªå‚数并返回此类型的相应实例,例如:**Date d = Date.from(instant)**; + - of——一个èšåˆæ–¹æ³•ï¼ŒæŽ¥å—多个å‚数并返回该类型的实例,并把他们åˆå¹¶åœ¨ä¸€èµ·ï¼Œä¾‹å¦‚:**Set faceCards = EnumSet.of(JACK, QUEEN, KING)**; + - valueOf——from å’Œ to 更为详细的替代 æ–¹å¼ï¼Œä¾‹å¦‚:**BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE)**; + - instance 或 getinstance——返回一个由其å‚æ•° (如果有的è¯) æ述的实例,但ä¸èƒ½è¯´å®ƒå…·æœ‰ç›¸åŒçš„值,例如:**StackWalker luke = StackWalker.getInstance(options)**; + - create 或 newInstance——与 instance 或 getInstance 类似,除了该方法ä¿è¯æ¯ä¸ªè°ƒç”¨è¿”回一个新的实例,例如:**Object newArray = Array.newInstance(classObject, arrayLen)**; + - getType——与 getInstance 类似,但是如果在工厂方法中ä¸åŒçš„类中使用。**Type** 是工厂方法返回的对象类型,例如:**FileStore fs = Files.getFileStore(path)**; + - newType——与 newInstance 类似,但是如果在工厂方法中ä¸åŒçš„类中使用。Type 是工厂方法返回的对象类型,例如:**BufferedReader br = Files.newBufferedReader(path)**; + - type—— getType å’Œ newType 简æ´çš„替代方å¼ï¼Œä¾‹å¦‚:**List litany = Collections.list(legacyLitany)**; + +  总之,é™æ€å·¥åŽ‚方法和公共构造方法都有它们的用途,并且了解它们的相对优点是值得的。通常,é™æ€å·¥åŽ‚æ›´å¯å–,因此é¿å…在没有考虑é™æ€å·¥åŽ‚的情况下æ供公共构造方法。 + + + diff --git a/docs/notes/02. 当构造方法å‚数过多时使用builder模å¼.md b/docs/notes/02. 当构造方法å‚数过多时使用builder模å¼.md new file mode 100644 index 0000000..33c0896 --- /dev/null +++ b/docs/notes/02. 当构造方法å‚数过多时使用builder模å¼.md @@ -0,0 +1,287 @@ +# 2. 当构造方法å‚数过多时使用 builder æ¨¡å¼ + + +  é™æ€å·¥åŽ‚和构造方法都有一个é™åˆ¶ï¼šå®ƒä»¬ä¸èƒ½å¾ˆå¥½åœ°æ‰©å±•åˆ°å¾ˆå¤šå¯é€‰å‚数的情景。请考虑一个代表包装食å“上的è¥å…»æˆåˆ†æ ‡ç­¾çš„例å­ã€‚这些标签有几个必需的属性——æ¯æ¬¡å»ºè®®çš„æ‘„å…¥é‡ï¼Œæ¯ç½çš„份é‡å’Œæ¯ä»½å¡è·¯é‡Œ ,以åŠè¶…过 20 个å¯é€‰çš„属性——总脂肪ã€é¥±å’Œè„‚肪ã€åå¼è„‚肪ã€èƒ†å›ºé†‡ã€é’ ç­‰ç­‰ã€‚大多数产å“都有éžé›¶å€¼ï¼Œåªæœ‰å°‘数几个å¯é€‰å±žæ€§ã€‚ + +  应该为这样的类编写什么样的构造方法或é™æ€å·¥åŽ‚?传统上,程åºå‘˜ä½¿ç”¨äº†å¯ä¼¸ç¼©ï¼ˆtelescoping constructor)构造方法模å¼ï¼Œåœ¨è¿™ç§æ¨¡å¼ä¸­ï¼Œåªæ供了一个åªæ‰€éœ€å‚数的构造函数,å¦ä¸€ä¸ªåªæœ‰ä¸€ä¸ªå¯é€‰å‚数,第三个有两个å¯é€‰å‚数,等等,最终在构造函数中包å«æ‰€æœ‰å¯é€‰å‚数。这就是它在实践中的样å­ã€‚为了简便起è§ï¼Œåªæ˜¾ç¤ºäº†å››ä¸ªå¯é€‰å±žæ€§ï¼š + +```Java +// Telescoping constructor pattern - does not scale well! + +public class NutritionFacts { + private final int servingSize; // (mL) required + private final int servings; // (per container) required + private final int calories; // (per serving) optional + private final int fat; // (g/serving) optional + private final int sodium; // (mg/serving) optional + private final int carbohydrate; // (g/serving) optional + + public NutritionFacts(int servingSize, int servings) { + this(servingSize, servings, 0); + } + + public NutritionFacts(int servingSize, int servings, + int calories) { + this(servingSize, servings, calories, 0); + } + + public NutritionFacts(int servingSize, int servings, + int calories, int fat) { + this(servingSize, servings, calories, fat, 0); + } + + public NutritionFacts(int servingSize, int servings, + int calories, int fat, int sodium) { + this(servingSize, servings, calories, fat, sodium, 0); + } + + public NutritionFacts(int servingSize, int servings, + int calories, int fat, int sodium, int carbohydrate) { + this.servingSize = servingSize; + this.servings = servings; + this.calories = calories; + this.fat = fat; + this.sodium = sodium; + this.carbohydrate = carbohydrate; + } +} +``` + +  当想è¦åˆ›å»ºä¸€ä¸ªå®žä¾‹æ—¶ï¼Œå¯ä»¥ä½¿ç”¨åŒ…å«æ‰€æœ‰è¦è®¾ç½®çš„å‚数的最短å‚数列表的构造方法: + +```Java +NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27); +``` + +  通常情况下,这个构造方法的调用需è¦è®¸å¤šä½ ä¸æƒ³è®¾ç½®çš„å‚数,但是你ä¸å¾—ä¸ä¸ºå®ƒä»¬ä¼ é€’一个值。 在这ç§æƒ…况下,我们为 `fat` 属性传递了 0 值。 『åªæœ‰ã€å…­ä¸ªå‚æ•°å¯èƒ½çœ‹èµ·æ¥å¹¶ä¸é‚£ä¹ˆç³Ÿç³•ï¼Œä½†éšç€å‚æ•°æ•°é‡çš„增加,它会很快失控。 + +  简而言之,å¯ä¼¸ç¼©æž„造方法模å¼æ˜¯æœ‰æ•ˆçš„,但是当有很多å‚数时,很难编写客户端代ç ï¼Œè€Œä¸”很难读懂它。读者ä¸çŸ¥é“这些值是什么æ„æ€ï¼Œå¹¶ä¸”必须仔细地计算å‚æ•°æ‰èƒ½æ‰¾åˆ°ç­”案。一长串相åŒç±»åž‹çš„å‚æ•°å¯èƒ½ä¼šå¯¼è‡´ä¸€äº›ç»†å¾®çš„ bug。如果客户端æ„外地å转了两个这样的å‚数,编译器并ä¸ä¼šæŠ±æ€¨ï¼Œä½†æ˜¯ç¨‹åºåœ¨è¿è¡Œæ—¶ä¼šå‡ºçŽ°é”™è¯¯è¡Œä¸º (æ¡ç›® 51)。 + +当在构造方法中é‡åˆ°è®¸å¤šå¯é€‰å‚数时,å¦ä¸€ç§é€‰æ‹©æ˜¯ JavaBeans 模å¼ï¼Œåœ¨è¿™ç§æ¨¡å¼ä¸­ï¼Œè°ƒç”¨ä¸€ä¸ªæ— å‚数的构造函数æ¥åˆ›å»ºå¯¹è±¡ï¼Œç„¶åŽè°ƒç”¨ `setter` 方法æ¥è®¾ç½®æ¯ä¸ªå¿…需的å‚æ•°å’Œå¯é€‰å‚数: + +```Java +// JavaBeans Pattern - allows inconsistency, mandates mutability + +public class NutritionFacts { + // Parameters initialized to default values (if any) + private int servingSize = -1; // Required; no default value + private int servings = -1; // Required; no default value + private int calories = 0; + private int fat = 0; + private int sodium = 0; + private int carbohydrate = 0; + + public NutritionFacts() { } + + // Setters + public void setServingSize(int val) { servingSize = val; } + public void setServings(int val) { servings = val; } + public void setCalories(int val) { calories = val; } + public void setFat(int val) { fat = val; } + public void setSodium(int val) { sodium = val; } + public void setCarbohydrate(int val) { carbohydrate = val; } +} +``` + +  这ç§æ¨¡å¼æ²¡æœ‰ä¼¸ç¼©æž„造方法模å¼çš„缺点。有点冗长,但创建实例很容易,并且易于阅读所生æˆçš„代ç : + +```Java +NutritionFacts cocaCola = new NutritionFacts(); +cocaCola.setServingSize(240); +cocaCola.setServings(8); +cocaCola.setCalories(100); +cocaCola.setSodium(35); +cocaCola.setCarbohydrate(27); +``` + +  ä¸å¹¸çš„是,JavaBeans 模å¼æœ¬èº«æœ‰ä¸¥é‡çš„缺陷。由于构造方法在多次调用中被分割,所以在构造过程中 JavaBean å¯èƒ½å¤„于ä¸ä¸€è‡´çš„状æ€ã€‚该类没有通过检查构造å‚æ•°å‚数的有效性æ¥æ‰§è¡Œä¸€è‡´æ€§çš„选项。在ä¸ä¸€è‡´çš„状æ€ä¸‹å°è¯•ä½¿ç”¨å¯¹è±¡å¯èƒ½ä¼šå¯¼è‡´ä¸ŽåŒ…å« bug 的代ç å¤§ç›¸å¾„庭的错误,因此很难调试。一个相关的缺点是,JavaBeans 模å¼æŽ’除了让类ä¸å¯å˜çš„å¯èƒ½æ€§ (æ¡ç›® 17),并且需è¦åœ¨ç¨‹åºå‘˜çš„部分增加工作以确ä¿çº¿ç¨‹å®‰å…¨ã€‚ + +  当它的构造完æˆæ—¶ï¼Œæ‰‹åŠ¨â€œå†»ç»“â€å¯¹è±¡ï¼Œå¹¶ä¸”ä¸å…许它在解冻之å‰ä½¿ç”¨ï¼Œå¯ä»¥å‡å°‘这些缺点,但是这ç§å˜ä½“在实践中很难使用并且很少使用。 而且,在è¿è¡Œæ—¶ä¼šå¯¼è‡´é”™è¯¯ï¼Œå› ä¸ºç¼–译器无法确ä¿ç¨‹åºå‘˜åœ¨ä½¿ç”¨å¯¹è±¡ä¹‹å‰è°ƒç”¨ `freeze` 方法。 + +  幸è¿çš„是,还有第三ç§é€‰æ‹©ï¼Œå®ƒç»“åˆäº†å¯ä¼¸ç¼©æž„造方法模å¼çš„安全性和 JavaBean 模å¼çš„å¯è¯»æ€§ã€‚ 它是 Builder 模å¼[Gamma95] 的一ç§å½¢å¼ã€‚客户端ä¸ç›´æŽ¥è°ƒç”¨æ‰€éœ€çš„对象,而是调用构造方法 (或é™æ€å·¥åŽ‚),并使用所有必需的å‚数,并获得一个 builder 对象。然åŽï¼Œå®¢æˆ·ç«¯è°ƒç”¨ builder 对象的 `setter` 相似方法æ¥è®¾ç½®æ¯ä¸ªå¯é€‰å‚数。最åŽï¼Œå®¢æˆ·ç«¯è°ƒç”¨ä¸€ä¸ªæ— å‚çš„ `build` 方法æ¥ç”Ÿæˆå¯¹è±¡ï¼Œè¯¥å¯¹è±¡é€šå¸¸æ˜¯ä¸å¯å˜çš„。Builder 通常是它所构建的类的一个é™æ€æˆå‘˜ç±» (æ¡ç›® 24)。以下是它在实践中的示例: + +```Java +// Builder Pattern + +public class NutritionFacts { + private final int servingSize; + private final int servings; + private final int calories; + private final int fat; + private final int sodium; + private final int carbohydrate; + + public static class Builder { + // Required parameters + private final int servingSize; + private final int servings; + + // Optional parameters - initialized to default values + private int calories = 0; + private int fat = 0; + private int sodium = 0; + private int carbohydrate = 0; + + public Builder(int servingSize, int servings) { + this.servingSize = servingSize; + this.servings = servings; + } + + public Builder calories(int val) { + calories = val; + return this; + } + + public Builder fat(int val) { + fat = val; + return this; + } + + public Builder sodium(int val) { + sodium = val; + return this; + } + + public Builder carbohydrate(int val) { + carbohydrate = val; + return this; + } + + public NutritionFacts build() { + return new NutritionFacts(this); + } + } + + private NutritionFacts(Builder builder) { + servingSize = builder.servingSize; + servings = builder.servings; + calories = builder.calories; + fat = builder.fat; + sodium = builder.sodium; + carbohydrate = builder.carbohydrate; + } +} +``` + +  `NutritionFacts` 类是ä¸å¯å˜çš„,所有的å‚数默认值都在一个地方。builder çš„ setter 方法返回 builder 本身,这样调用就å¯ä»¥è¢«é“¾æŽ¥èµ·æ¥ï¼Œä»Žè€Œç”Ÿæˆä¸€ä¸ªæµç•…çš„ API。下é¢æ˜¯å®¢æˆ·ç«¯ä»£ç çš„示例: + +```Java +NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8) + .calories(100).sodium(35).carbohydrate(27).build(); +``` + +  这个客户端代ç å¾ˆå®¹æ˜“编写,更é‡è¦çš„是易于阅读。 Builder 模å¼æ¨¡æ‹Ÿ Python å’Œ Scala 中的命åå¯é€‰å‚数。 + +  为了简æ´èµ·è§ï¼Œçœç•¥äº†æœ‰æ•ˆæ€§æ£€æŸ¥ã€‚ è¦å°½å¿«æ£€æµ‹æ— æ•ˆå‚数,检查 builder 的构造方法和方法中的å‚数有效性。 在 `build` 方法调用的构造方法中检查包å«å¤šä¸ªå‚æ•°çš„ä¸å˜æ€§ã€‚为了确ä¿è¿™äº›ä¸å˜æ€§ä¸å—攻击,在从 builder å¤åˆ¶å‚æ•°åŽå¯¹å¯¹è±¡å±žæ€§è¿›è¡Œæ£€æŸ¥ï¼ˆæ¡ç›® 50)。 如果检查失败,则抛出 `IllegalArgumentException` 异常(æ¡ç›® 72),其详细消æ¯æŒ‡ç¤ºå“ªäº›å‚数无效(æ¡ç›® 75)。 + +  Builder 模å¼éžå¸¸é€‚åˆç±»å±‚次结构。 使用平行层次的 builder,æ¯ä¸ªåµŒå¥—在相应的类中。 抽象类有抽象的 builder; 具体的类有具体的 builder。 例如,考虑代表å„ç§æ¯”è¨é¥¼çš„根层次结构的抽象类: + +```Java +// Builder pattern for class hierarchies + +import java.util.EnumSet; +import java.util.Objects; +import java.util.Set; + +public abstract class Pizza { + public enum Topping {HAM, MUSHROOM, ONION, PEPPER, SAUSAGE} + final Set toppings; + + abstract static class Builder> { + EnumSet toppings = EnumSet.noneOf(Topping.class); + + public T addTopping(Topping topping) { + toppings.add(Objects.requireNonNull(topping)); + return self(); + } + + abstract Pizza build(); + + // Subclasses must override this method to return "this" + protected abstract T self(); + } + + Pizza(Builder builder) { + toppings = builder.toppings.clone(); // See Item 50 + } +} +``` + +  请注æ„,`Pizza.Builder` 是一个带有递归类型å‚数( recursive type parameter)(æ¡ç›® 30)的泛型类型。 这与抽象的 `self` 方法一起,å…许方法链在å­ç±»ä¸­æ­£å¸¸å·¥ä½œï¼Œè€Œä¸éœ€è¦å¼ºåˆ¶è½¬æ¢ã€‚ Java 缺ä¹è‡ªæˆ‘类型的这ç§å˜é€šè§£å†³æ–¹æ³•è¢«ç§°ä¸ºæ¨¡æ‹Ÿè‡ªæˆ‘类型(simulated self-type)的习惯用法。 + +  这里有两个具体的 `Pizza` çš„å­ç±»ï¼Œå…¶ä¸­ä¸€ä¸ªä»£è¡¨æ ‡å‡†çš„纽约风格的披è¨ï¼Œå¦ä¸€ä¸ªæ˜¯åŠåœ†å½¢çƒ¤ä¹³é…ªé¦…饼。å‰è€…有一个所需的尺寸å‚数,而åŽè€…则å…许指定酱æ±æ˜¯å¦åº”该在里é¢æˆ–在外é¢ï¼š + +```Java +import java.util.Objects; + +public class NyPizza extends Pizza { + public enum Size { SMALL, MEDIUM, LARGE } + private final Size size; + + public static class Builder extends Pizza.Builder { + private final Size size; + + public Builder(Size size) { + this.size = Objects.requireNonNull(size); + } + + @Override public NyPizza build() { + return new NyPizza(this); + } + + @Override protected Builder self() { + return this; + } + } + + private NyPizza(Builder builder) { + super(builder); + size = builder.size; + } +} + +public class Calzone extends Pizza { + private final boolean sauceInside; + + public static class Builder extends Pizza.Builder { + private boolean sauceInside = false; // Default + + public Builder sauceInside() { + sauceInside = true; + return this; + } + + @Override public Calzone build() { + return new Calzone(this); + } + + @Override protected Builder self() { + return this; + } + } + + private Calzone(Builder builder) { + super(builder); + sauceInside = builder.sauceInside; + } +} +``` + +  请注æ„,æ¯ä¸ªå­ç±» builder 中的 `build` 方法被声明为返回正确的å­ç±»ï¼š`NyPizza.Builder` çš„ `build` 方法返回 `NyPizza`,而 `Calzone.Builder` 中的 `build` 方法返回 `Calzone`。 è¿™ç§æŠ€æœ¯ï¼Œå…¶ä¸€ä¸ªå­ç±»çš„方法被声明为返回在超类中声明的返回类型的å­ç±»åž‹ï¼Œç§°ä¸ºåå˜è¿”回类型 ( covariant return typing)。 它å…许客户端使用这些 builder,而ä¸éœ€è¦å¼ºåˆ¶è½¬æ¢ã€‚ + +  这些“分层 builderâ€çš„客户端代ç åŸºæœ¬ä¸Šä¸Žç®€å•çš„ `NutritionFacts` builder 的代ç ç›¸åŒã€‚为了简æ´èµ·è§,下é¢æ˜¾ç¤ºçš„示例客户端代ç å‡è®¾æžšä¸¾å¸¸é‡çš„é™æ€å¯¼å…¥ï¼š + +```Java +NyPizza pizza = new NyPizza.Builder(SMALL) + .addTopping(SAUSAGE).addTopping(ONION).build(); +Calzone calzone = new Calzone.Builder() + .addTopping(HAM).sauceInside().build(); +``` + +  builder 对构造方法的一个微å°çš„优势是,builder å¯ä»¥æœ‰å¤šä¸ªå¯å˜å‚数,因为æ¯ä¸ªå‚数都是在它自己的方法中指定的。或者,builder å¯ä»¥å°†ä¼ é€’给多个调用的å‚æ•°èšåˆåˆ°å•ä¸ªå±žæ€§ä¸­ï¼Œå¦‚å‰é¢çš„ `addTopping` 方法所演示的那样。 + +  Builder 模å¼éžå¸¸çµæ´»ã€‚ å•ä¸ª builder å¯ä»¥é‡å¤ä½¿ç”¨æ¥æž„建多个对象。 builder çš„å‚æ•°å¯ä»¥åœ¨æž„建方法的调用之间进行调整,以改å˜åˆ›å»ºçš„对象。 builder å¯ä»¥åœ¨åˆ›å»ºå¯¹è±¡æ—¶è‡ªåŠ¨å¡«å……一些属性,例如æ¯æ¬¡åˆ›å»ºå¯¹è±¡æ—¶å¢žåŠ çš„åºåˆ—å·ã€‚ + +  Builder 模å¼ä¹Ÿæœ‰ç¼ºç‚¹ã€‚为了创建对象,首先必须创建它的 builder。虽然创建这个 builder çš„æˆæœ¬åœ¨å®žè·µä¸­ä¸å¤ªå¯èƒ½è¢«æ³¨æ„到,但在性能关键的情况下å¯èƒ½ä¼šå‡ºçŽ°é—®é¢˜ã€‚而且,builder 模å¼æ¯”伸缩构造方法模å¼æ›´å†—长,因此åªæœ‰åœ¨æœ‰è¶³å¤Ÿçš„å‚æ•°æ—¶æ‰å€¼å¾—使用它,比如四个或更多。但是请记ä½ï¼Œå¦‚果希望在将æ¥æ·»åŠ æ›´å¤šçš„å‚数。但是,如果从构造方法或é™æ€å·¥åŽ‚开始,并切æ¢åˆ° builder,当类演化到å‚æ•°æ•°é‡å¤±æŽ§çš„时候,过时的构造方法或é™æ€å·¥åŽ‚就会é¢ä¸´å°´å°¬çš„处境。因此,所以,最好从一开始就创建一个 builder。 + +  总而言之,当设计类的构造方法或é™æ€å·¥åŽ‚çš„å‚数超过几个时,Builder 模å¼æ˜¯ä¸€ä¸ªä¸é”™çš„选择,特别是如果许多å‚数是å¯é€‰çš„或相åŒç±»åž‹çš„。客户端代ç æ¯”使用伸缩构造方法(telescoping constructors)更容易读写,并且 builder 比 JavaBeans 更安全。 diff --git a/docs/notes/03. 使用ç§æœ‰æž„造方法或枚类实现Singleton属性.md b/docs/notes/03. 使用ç§æœ‰æž„造方法或枚类实现Singleton属性.md new file mode 100644 index 0000000..8ebd21e --- /dev/null +++ b/docs/notes/03. 使用ç§æœ‰æž„造方法或枚类实现Singleton属性.md @@ -0,0 +1,59 @@ +# 3. 使用ç§æœ‰æž„造方法或枚类实现 Singleton 属性 + + +  å•ä¾‹æ˜¯ä¸€ä¸ªä»…实例化一次的类[Gamma95]。å•ä¾‹å¯¹è±¡é€šå¸¸è¡¨ç¤ºæ— çŠ¶æ€å¯¹è±¡ï¼Œå¦‚函数 (æ¡ç›® 24) 或一个本质上唯一的系统组件。让一个类æˆä¸ºå•ä¾‹ä¼šä½¿æµ‹è¯•å®ƒçš„客户å˜å¾—困难,因为除éžå®žçŽ°ä¸€ä¸ªä½œä¸ºå®ƒç±»åž‹çš„接å£ï¼Œå¦åˆ™ä¸å¯èƒ½ç”¨ä¸€ä¸ªæ¨¡æ‹Ÿå®žçŽ°æ›¿ä»£å•ä¾‹ã€‚ + +  有两ç§å¸¸è§çš„方法æ¥å®žçŽ°å•ä¾‹ã€‚两者都基于ä¿æŒæž„造方法ç§æœ‰å’Œå¯¼å‡ºå…¬å…±é™æ€æˆå‘˜ä»¥æ供对唯一实例的访问。在第一ç§æ–¹æ³•ä¸­ï¼Œæˆå‘˜æ˜¯ `final` 修饰的属性: + +```Java +// Singleton with public final field +public class Elvis { + public static final Elvis INSTANCE = new Elvis(); + private Elvis() { ... } + public void leaveTheBuilding() { ... } +} +``` + +  ç§æœ‰æž„造方法åªè°ƒç”¨ä¸€æ¬¡ï¼Œæ¥åˆå§‹åŒ–公共é™æ€ final `Elvis.INSTANCE` 属性。缺少一个公共的或å—ä¿æŠ¤çš„构造方法,ä¿è¯äº†å…¨å±€çš„唯一性:一旦 Elvis 类被åˆå§‹åŒ–,一个 Elvis 的实例就会存在——ä¸å¤šä¹Ÿä¸å°‘。客户端所åšçš„任何事情都ä¸èƒ½æ”¹å˜è¿™ä¸€ç‚¹ï¼Œä½†éœ€è¦æ³¨æ„的是:特æƒå®¢æˆ·ç«¯å¯ä»¥ä½¿ç”¨ `AccessibleObject.setAccessible` 方法,以åå°„æ–¹å¼è°ƒç”¨ç§æœ‰æž„造方法 (æ¡ç›® 65)。如果需è¦é˜²å¾¡æ­¤æ”»å‡»ï¼Œè¯·ä¿®æ”¹æž„造函数,使其在请求创建第二个实例时抛出异常。 + +  在第二个实现å•ä¾‹çš„方法中,公共æˆå‘˜æ˜¯ä¸€ä¸ªé™æ€çš„工厂方法: + +```Java +// Singleton with static factory +public class Elvis { + private static final Elvis INSTANCE = new Elvis(); + private Elvis() { ... } + public static Elvis getInstance() { return INSTANCE; } + + public void leaveTheBuilding() { ... } +} +``` + +  所有对 `Elvis.getInstance` 的调用都返回相åŒçš„对象引用,并且ä¸ä¼šåˆ›å»ºå…¶ä»–çš„ Elvis 实例(与å‰é¢æ到的警告相åŒï¼‰ã€‚ + +  公共属性方法的主è¦ä¼˜ç‚¹æ˜¯ API 明确表示该类是一个å•ä¾‹ï¼šå…¬å…±é™æ€å±žæ€§æ˜¯ final 的,所以它总是包å«ç›¸åŒçš„对象引用。 第二个好处是它更简å•ã€‚ + +  é™æ€å·¥åŽ‚方法的一个优点是,它å¯ä»¥çµæ´»åœ°æ”¹å˜ä½ çš„想法,无论该类是å¦ä¸ºå•ä¾‹è€Œä¸å¿…更改其 API。 工厂方法返回唯一的实例,但是å¯ä»¥ä¿®æ”¹ï¼Œæ¯”如,返回调用它的æ¯ä¸ªçº¿ç¨‹çš„å•ç‹¬å®žä¾‹ã€‚ 第二个好处是,如果你的应用程åºéœ€è¦å®ƒï¼Œå¯ä»¥ç¼–写一个泛型å•ä¾‹å·¥åŽ‚(generic singleton factory )(æ¡ç›® 30)。 使用é™æ€å·¥åŽ‚的最åŽä¸€ä¸ªä¼˜ç‚¹æ˜¯æ–¹æ³•å¼•ç”¨å¯ä»¥ç”¨ `supplier`,例如 `Elvis::instance` ç­‰åŒäºŽ `Supplier`。 除éžä¸Žè¿™äº›ä¼˜ç‚¹ç›¸å…³çš„,å¦åˆ™å…¬å…±å±žæ€§æ–¹æ³•æ˜¯å¯å–的。 + +  创建一个使用这两ç§æ–¹æ³•çš„å•ä¾‹ç±» (第 12 ç« ),仅仅将 `implements Serializable` 添加到声明中是ä¸å¤Ÿçš„。为了维护å•ä¾‹çš„ä¿è¯ï¼Œå£°æ˜Žæ‰€æœ‰çš„实例属性为 `transient`,并æ供一个 `readResolve` 方法 (æ¡ç›® 89)。å¦åˆ™ï¼Œæ¯å½“åºåˆ—化实例被ååºåˆ—化时,就会创建一个新的实例,在我们的例å­ä¸­ï¼Œå¯¼è‡´å‡ºçŽ°æ–°çš„ Elvis 实例。为了防止这ç§æƒ…况å‘生,将这个 `readResolve` 方法添加到 Elvis 类: + +```Java +// readResolve method to preserve singleton property +private Object readResolve() { + // Return the one true Elvis and let the garbage collector + // take care of the Elvis impersonator. + return INSTANCE; +} +``` +  实现一个å•ä¾‹çš„第三ç§æ–¹æ³•æ˜¯å£°æ˜Žå•ä¸€å…ƒç´ çš„枚举类: + +```Java +// Enum singleton - the preferred approach +public enum Elvis { + INSTANCE; + + public void leaveTheBuilding() { ... } +} +``` + +  这ç§æ–¹å¼ç±»ä¼¼äºŽå…¬å…±å±žæ€§æ–¹æ³•ï¼Œä½†æ›´ç®€æ´ï¼Œæ供了å…费的åºåˆ—化机制,并æ供了针对多个实例化的åšå›ºä¿è¯ï¼Œå³ä½¿æ˜¯åœ¨å¤æ‚çš„åºåˆ—化或å射攻击的情况下。这ç§æ–¹æ³•å¯èƒ½æ„Ÿè§‰æœ‰ç‚¹ä¸è‡ªç„¶ï¼Œä½†æ˜¯å•ä¸€å…ƒç´ æžšä¸¾ç±»é€šå¸¸æ˜¯å®žçŽ°å•ä¾‹çš„最佳方å¼ã€‚注æ„,如果å•ä¾‹å¿…须继承 `Enum` 以外的父类 (尽管å¯ä»¥å£°æ˜Žä¸€ä¸ª `Enum` æ¥å®žçŽ°æŽ¥å£),那么就ä¸èƒ½ä½¿ç”¨è¿™ç§æ–¹æ³•ã€‚ diff --git a/docs/notes/04. 使用ç§æœ‰æž„造方法执行éžå®žä¾‹åŒ–.md b/docs/notes/04. 使用ç§æœ‰æž„造方法执行éžå®žä¾‹åŒ–.md new file mode 100644 index 0000000..a7f5b70 --- /dev/null +++ b/docs/notes/04. 使用ç§æœ‰æž„造方法执行éžå®žä¾‹åŒ–.md @@ -0,0 +1,23 @@ +# 4. 使用ç§æœ‰æž„造方法执行éžå®žä¾‹åŒ– + + +  å¶å°”你会想写一个类,它åªæ˜¯ä¸€ç»„é™æ€æ–¹æ³•å’Œé™æ€å±žæ€§ã€‚ 这样的类获得了ä¸å¥½çš„å声,因为有些人滥用这些类而é¿å…以é¢å‘对象方å¼æ€è€ƒï¼Œä½†æ˜¯å®ƒä»¬ç¡®å®žæœ‰ç€ç‰¹æ®Šçš„用途。 它们å¯ä»¥ç”¨æ¥æŒ‰ç…§ `java.lang.Math` 或 `java.util.Arrays` çš„æ–¹å¼ï¼Œåœ¨åŸºæœ¬ç±»åž‹çš„数值或数组上组织相关的方法。 它们也å¯ä»¥ç”¨äºŽå°†é™æ€æ–¹æ³•ï¼ˆåŒ…括工厂(æ¡ç›® 1))分组,用于实现æŸä¸ªæŽ¥å£çš„对象,其方å¼ä¸º `java.util.Collections`。 (从 Java 8 开始,你也å¯ä»¥å°†è¿™äº›æ–¹æ³•æ”¾åœ¨æŽ¥å£ä¸­ï¼Œå‡å¦‚它是你自己修改的。)最åŽï¼Œè¿™æ ·çš„ç±»å¯ä»¥ç”¨äºŽåœ¨ final 类上对方法进行分组,因为ä¸èƒ½å°†å®ƒä»¬æ”¾åœ¨å­ç±»ä¸­ã€‚ + +  这样的实用类(utility classes)ä¸æ˜¯è®¾è®¡ç”¨æ¥è¢«å®žä¾‹åŒ–的:一个实例是没有æ„义的。然而,在没有显å¼æž„造方法的情况下,编译器æ供了一个公共的ã€æ— å‚的默认构造方法。对于用户æ¥è¯´ï¼Œè¯¥æž„造方法与其他构造方法没有什么区别。在已å‘布的 API 中ç»å¸¸çœ‹åˆ°æ— æ„识的被实例的类。 + +  **试图通过创建抽象类æ¥å¼ºåˆ¶æ‰§è¡Œéžå®žä¾‹åŒ–是行ä¸é€šçš„。** 该类å¯ä»¥è¢«å­ç±»åŒ–,å­ç±»å¯ä»¥è¢«å®žä¾‹åŒ–。此外,它误导用户认为该类是为继承而设计的 (æ¡ç›® 19)。ä¸è¿‡ï¼Œæœ‰ä¸€ä¸ªç®€å•çš„方法æ¥ç¡®ä¿éžå®žä¾‹åŒ–。åªæœ‰å½“ç±»ä¸åŒ…å«æ˜¾å¼æž„造方法时,æ‰ä¼šç”Ÿæˆä¸€ä¸ªé»˜è®¤æž„造方法,**å› æ­¤å¯ä»¥é€šè¿‡åŒ…å«ä¸€ä¸ªç§æœ‰æž„造方法æ¥å®žçŽ°ç±»çš„éžå®žä¾‹åŒ–:** + +```Java +// Noninstantiable utility class +public class UtilityClass { + // Suppress default constructor for noninstantiability + private UtilityClass() { + throw new AssertionError(); + } + ... // Remainder omitted +} +``` + +  因为显å¼æž„造方法是ç§æœ‰çš„,所以在类之外是ä¸å¯è®¿é—®çš„。`AssertionError` 异常ä¸æ˜¯ä¸¥æ ¼è¦æ±‚的,但是它æ供了一ç§ä¿è¯ï¼Œä»¥é˜²åœ¨ç±»ä¸­æ„外地调用构造方法。它ä¿è¯ç±»åœ¨ä»»ä½•æƒ…况下都ä¸ä¼šè¢«å®žä¾‹åŒ–。这个习惯用法有点è¿å直觉,好åƒæž„造方法就是设计æˆä¸èƒ½è°ƒç”¨çš„一样。因此,如å‰é¢æ‰€ç¤ºï¼Œæ·»åŠ æ³¨é‡Šæ˜¯ç§æ˜Žæ™ºçš„åšæ³•ã€‚ + +  这ç§ä¹ æƒ¯æœ‰ä¸€ä¸ªå‰¯ä½œç”¨ï¼Œé˜»æ­¢äº†ç±»çš„å­ç±»åŒ–。所有的构造方法都必须显å¼æˆ–éšå¼åœ°è°ƒç”¨çˆ¶ç±»æž„造方法,而å­ç±»åˆ™æ²¡æœ‰å¯è®¿é—®çš„父类构造方法æ¥è°ƒç”¨ã€‚ diff --git a/docs/notes/05. 使用ä¾èµ–注入å–代硬连接资æº(hardwiring resources).md b/docs/notes/05. 使用ä¾èµ–注入å–代硬连接资æº(hardwiring resources).md new file mode 100644 index 0000000..abd20ae --- /dev/null +++ b/docs/notes/05. 使用ä¾èµ–注入å–代硬连接资æº(hardwiring resources).md @@ -0,0 +1,62 @@ +# 05. 使用ä¾èµ–注入å–代硬连接资æºï¼ˆhardwiring resources) + + +  许多类ä¾èµ–于一个或多个底层资æºã€‚例如,拼写检查器ä¾èµ–于字典。将此类类实现为é™æ€å®žç”¨å·¥å…·ç±»å¹¶ä¸å°‘è§ (æ¡ç›® 4): + +```Java +// Inappropriate use of static utility - inflexible & untestable! +public class SpellChecker { + private static final Lexicon dictionary = ...; + + private SpellChecker() {} // Noninstantiable + + public static boolean isValid(String word) { ... } + public static List suggestions(String typo) { ... } +} +``` + +  åŒæ ·åœ°ï¼Œå°†å®ƒä»¬å®žçŽ°ä¸ºå•ä¾‹ä¹Ÿå¹¶ä¸å°‘è§ (æ¡ç›® 3): + + +```Java +// Inappropriate use of singleton - inflexible & untestable! +public class SpellChecker { + private final Lexicon dictionary = ...; + + private SpellChecker(...) {} + public static INSTANCE = new SpellChecker(...); + + public boolean isValid(String word) { ... } + public List suggestions(String typo) { ... } +} +``` + +  这两ç§æ–¹æ³•éƒ½ä¸ä»¤äººæ»¡æ„,因为他们å‡è®¾åªæœ‰ä¸€æœ¬å­—典值得使用。在实际中,æ¯ç§è¯­è¨€éƒ½æœ‰è‡ªå·±çš„字典,特殊的字典被用于特殊的è¯æ±‡è¡¨ã€‚å¦å¤–,使用专门的字典æ¥è¿›è¡Œæµ‹è¯•ä¹Ÿæ˜¯å¯å–的。想当然地认为一本字典就足够了,这是一厢情愿的想法。 + +  å¯ä»¥é€šè¿‡ä½¿ `dictionary` å±žæ€§è®¾ç½®ä¸ºéž `final`,并添加一个方法æ¥æ›´æ”¹çŽ°æœ‰æ‹¼å†™æ£€æŸ¥å™¨ä¸­çš„字典,从而让拼写检查器支æŒå¤šä¸ªå­—典,但是在并å‘环境中,这是笨拙的ã€å®¹æ˜“出错的和ä¸å¯è¡Œçš„。é™æ€å®žç”¨ç±»å’Œå•ä¾‹å¯¹äºŽé‚£äº›è¡Œä¸ºè¢«åº•å±‚资æºå‚数化的类æ¥è¯´æ˜¯ä¸åˆé€‚的。 + +  所需è¦çš„是能够支æŒç±»çš„多个实例 (åœ¨æˆ‘ä»¬çš„ç¤ºä¾‹ä¸­ï¼Œå³ `SpellChecker`),æ¯ä¸ªå®žä¾‹éƒ½ä½¿ç”¨å®¢æˆ·ç«¯æ‰€æœŸæœ›çš„èµ„æº (在我们的例å­ä¸­æ˜¯ `dictionary`)。满足这一需求的简å•æ¨¡å¼æ˜¯åœ¨åˆ›å»ºæ–°å®žä¾‹æ—¶å°†èµ„æºä¼ é€’到构造方法中。这是ä¾èµ–项注入(dependency injection)的一ç§å½¢å¼ï¼šå­—典是拼写检查器的一个ä¾èµ–项,当它创建时被注入到拼写检查器中。 + + +```Java +// Dependency injection provides flexibility and testability +public class SpellChecker { + private final Lexicon dictionary; + + public SpellChecker(Lexicon dictionary) { + this.dictionary = Objects.requireNonNull(dictionary); + } + + public boolean isValid(String word) { ... } + public List suggestions(String typo) { ... } +} +``` +  ä¾èµ–注入模å¼éžå¸¸ç®€å•ï¼Œè®¸å¤šç¨‹åºå‘˜ä½¿ç”¨å®ƒå¤šå¹´è€Œä¸çŸ¥é“它有一个å字。 虽然我们的拼写检查器的例å­åªæœ‰ä¸€ä¸ªèµ„æºï¼ˆå­—典),但是ä¾èµ–项注入å¯ä»¥ä½¿ç”¨ä»»æ„æ•°é‡çš„资æºå’Œä»»æ„ä¾èµ–图。 它ä¿æŒäº†ä¸å˜æ€§ï¼ˆæ¡ç›® 17),因此多个客户端å¯ä»¥å…±äº«ä¾èµ–对象(å‡è®¾å®¢æˆ·éœ€è¦ç›¸åŒçš„底层资æºï¼‰ã€‚ ä¾èµ–注入åŒæ ·é€‚用于构造方法,é™æ€å·¥åŽ‚(æ¡ç›® 1)和 builder 模å¼ï¼ˆæ¡ç›® 2)。 + +  该模å¼çš„一个有用的å˜ä½“是将资æºå·¥åŽ‚传递给构造方法。 工厂是å¯ä»¥é‡å¤è°ƒç”¨ä»¥åˆ›å»ºç±»åž‹å®žä¾‹çš„对象。 è¿™ç§å·¥åŽ‚体现了工厂方法模å¼ï¼ˆFactory Method pattern )[Gamma95]。 Java 8 中引入的 `Supplier` 接å£éžå¸¸é€‚åˆä»£è¡¨å·¥åŽ‚。 在输入上采用 `Supplier` 的方法通常应该使用有界的通é…符类型 ( bounded wildcard type)(æ¡ç›® 31)约æŸå·¥åŽ‚的类型å‚数,以å…许客户端传入工厂,创建指定类型的任何å­ç±»åž‹ã€‚ 例如,下é¢æ˜¯ä¸€ä¸ªä½¿ç”¨å®¢æˆ·ç«¯æä¾›çš„å·¥åŽ‚ç”Ÿæˆ tile 的方法: + + Mosaic create(Supplier tileFactory) { ... } + +  尽管ä¾èµ–注入æžå¤§åœ°æ高了çµæ´»æ€§å’Œå¯æµ‹è¯•æ€§ï¼Œä½†å®ƒå¯èƒ½ä½¿å¤§åž‹é¡¹ç›®å˜å¾—混乱,这些项目通常包å«æ•°åƒä¸ªä¾èµ–项。使用ä¾èµ–注入框架 (如 Dagger[Dagger]ã€Guice[Guice] 或 Spring[Spring]) å¯ä»¥æ¶ˆé™¤è¿™äº›æ··ä¹±ã€‚这些框架的使用超出了本书的范围,但是请注æ„,为手动ä¾èµ–注入而设计的 API éžå¸¸é€‚åˆè¿™äº›æ¡†æž¶çš„使用。 + +  总之,ä¸è¦ä½¿ç”¨å•ä¾‹æˆ–é™æ€çš„实用类æ¥å®žçŽ°ä¸€ä¸ªç±»ï¼Œè¯¥ç±»ä¾èµ–于一个或多个底层资æºï¼Œè¿™äº›èµ„æºçš„行为会影å“类的行为,并且ä¸è®©ç±»ç›´æŽ¥åˆ›å»ºè¿™äº›èµ„æºã€‚相å,将资æºæˆ–工厂传递给构造方法 (或é™æ€å·¥åŽ‚或 builder 模å¼)。这ç§ç§°ä¸ºä¾èµ–注入的实践将æžå¤§åœ°å¢žå¼ºç±»çš„çµæ´»æ€§ã€å¯é‡ç”¨æ€§å’Œå¯æµ‹è¯•æ€§ã€‚ diff --git a/docs/notes/06. é¿å…创建ä¸å¿…è¦çš„对象.md b/docs/notes/06. é¿å…创建ä¸å¿…è¦çš„对象.md new file mode 100644 index 0000000..d932a43 --- /dev/null +++ b/docs/notes/06. é¿å…创建ä¸å¿…è¦çš„对象.md @@ -0,0 +1,77 @@ +# 6. é¿å…创建ä¸å¿…è¦çš„对象 + + +  在æ¯æ¬¡éœ€è¦æ—¶é‡ç”¨ä¸€ä¸ªå¯¹è±¡è€Œä¸æ˜¯åˆ›å»ºä¸€ä¸ªæ–°çš„相åŒåŠŸèƒ½å¯¹è±¡é€šå¸¸æ˜¯æ°å½“的。é‡ç”¨å¯ä»¥æ›´å¿«æ›´æµè¡Œã€‚如果对象是ä¸å¯å˜çš„ (æ¡ç›® 17),它总是å¯ä»¥è¢«é‡ç”¨ã€‚ + +  作为一个ä¸åº”该这样åšçš„æžç«¯ä¾‹å­ï¼Œè¯·è€ƒè™‘以下语å¥ï¼š + +```Java +String s = new String("bikini"); // DON'T DO THIS! +``` + +  语å¥æ¯æ¬¡æ‰§è¡Œæ—¶éƒ½ä¼šåˆ›å»ºä¸€ä¸ªæ–°çš„ String 实例,而这些对象的创建都ä¸æ˜¯å¿…需的。String 构造方法 `("bikini")` çš„å‚数本身就是一个 `bikini` 实例,它与构造方法创建的所有对象的功能相åŒã€‚如果这ç§ç”¨æ³•å‘生在循环中,或者在频ç¹è°ƒç”¨çš„方法中,就å¯ä»¥æ¯«æ— å¿…è¦åœ°åˆ›å»ºæ•°ç™¾ä¸‡ä¸ª String 实例。 + +  改进åŽçš„版本如下: +```Java +String s = "bikini"; +``` + +  该版本使用å•ä¸ª String 实例,而ä¸æ˜¯æ¯æ¬¡æ‰§è¡Œæ—¶åˆ›å»ºä¸€ä¸ªæ–°å®žä¾‹ã€‚此外,它å¯ä»¥ä¿è¯å¯¹è±¡è¿è¡Œåœ¨åŒä¸€è™šæ‹Ÿæœºä¸Šçš„任何其他代ç é‡ç”¨ï¼Œè€Œè¿™äº›ä»£ç æ°å¥½åŒ…å«ç›¸åŒçš„字符串字é¢é‡[JLS,3.10.5]。 + +  通过使用é™æ€å·¥åŽ‚方法 (static factory methods(æ¡ç›® 1),å¯ä»¥é¿å…创建ä¸éœ€è¦çš„对象。例如,工厂方法 `Boolean.valueOf(String)` 比构造方法 `Boolean(String)` æ›´å¯å–,åŽè€…在 Java 9 中被弃用。构造方法æ¯æ¬¡è°ƒç”¨æ—¶éƒ½å¿…须创建一个新对象,而工厂方法永远ä¸éœ€è¦è¿™æ ·åšï¼Œåœ¨å®žè·µä¸­ä¹Ÿä¸éœ€è¦ã€‚除了é‡ç”¨ä¸å¯å˜å¯¹è±¡ï¼Œå¦‚果知é“它们ä¸ä¼šè¢«ä¿®æ”¹ï¼Œè¿˜å¯ä»¥é‡ç”¨å¯å˜å¯¹è±¡ã€‚ + +  一些对象的创建比其他对象的创建è¦æ˜‚贵得多。 如果è¦é‡å¤ä½¿ç”¨è¿™æ ·ä¸€ä¸ªâ€œæ˜‚贵的对象â€ï¼Œå»ºè®®å°†å…¶ç¼“存起æ¥ä»¥ä¾¿é‡å¤ä½¿ç”¨ã€‚ ä¸å¹¸çš„是,当创建这样一个对象时并ä¸æ€»æ˜¯å¾ˆç›´è§‚明显的。 å‡è®¾ä½ æƒ³å†™ä¸€ä¸ªæ–¹æ³•æ¥ç¡®å®šä¸€ä¸ªå­—符串是å¦æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„罗马数字。 以下是使用正则表达å¼å®Œæˆæ­¤æ“作时最简å•æ–¹æ³•ï¼š + + +```Java +// Performance can be greatly improved! +static boolean isRomanNumeral(String s) { + return s.matches("^(?=.)M*(C[MD]|D?C{0,3})" + + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); +} +``` + +  这个实现的问题在于它ä¾èµ–于 `String.matches` 方法。 虽然 `String.matches` 是检查字符串是å¦ä¸Žæ­£åˆ™è¡¨è¾¾å¼åŒ¹é…的最简å•æ–¹æ³•ï¼Œä½†å®ƒä¸é€‚åˆåœ¨æ€§èƒ½ä¸´ç•Œçš„情况下é‡å¤ä½¿ç”¨ã€‚ 问题是它在内部为正则表达å¼åˆ›å»ºä¸€ä¸ª `Pattern` 实例,并且åªä½¿ç”¨å®ƒä¸€æ¬¡ï¼Œä¹‹åŽå®ƒå°±æœ‰èµ„格进行垃圾收集。 创建 `Pattern` 实例是昂贵的,因为它需è¦å°†æ­£åˆ™è¡¨è¾¾å¼ç¼–译æˆæœ‰é™çŠ¶æ€æœºï¼ˆfinite state machine)。 + +  为了æ高性能,作为类åˆå§‹åŒ–的一部分,将正则表达å¼æ˜¾å¼ç¼–译为一个 `Pattern` 实例(ä¸å¯å˜ï¼‰ï¼Œç¼“存它,并在 `isRomanNumeral` 方法的æ¯ä¸ªè°ƒç”¨ä¸­é‡å¤ä½¿ç”¨ç›¸åŒçš„实例: + +```Java +// Reusing expensive object for improved performance +public class RomanNumerals { + private static final Pattern ROMAN = Pattern.compile( + "^(?=.)M*(C[MD]|D?C{0,3})" + + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); + + static boolean isRomanNumeral(String s) { + return ROMAN.matcher(s).matches(); + } +} +``` + +  如果ç»å¸¸è°ƒç”¨ï¼Œ`isRomanNumeral` 的改进版本的性能会显著æå‡ã€‚ 在我的机器上,原始版本在输入 8 ä¸ªå­—ç¬¦çš„å­—ç¬¦ä¸²ä¸Šéœ€è¦ 1.1 å¾®ç§’ï¼Œè€Œæ”¹è¿›çš„ç‰ˆæœ¬åˆ™éœ€è¦ 0.17 微秒,速度æ高了 6.5 å€ã€‚ 性能上ä¸ä»…有所改善,而且更明确清晰了。 为ä¸å¯è§çš„ Pattern 实例创建é™æ€ final 修饰的属性,并å…许给它一个å字,这个å字比正则表达å¼æœ¬èº«æ›´å…·å¯è¯»æ€§ã€‚ + +ã€€ã€€å¦‚æžœåŒ…å« `isRomanNumeral` 方法的改进版本的类被åˆå§‹åŒ–,但该方法从未被调用,则 ROMAN 属性则没必è¦åˆå§‹åŒ–。 在第一次调用 `isRomanNumeral` 方法时,å¯ä»¥é€šè¿‡å»¶è¿Ÿåˆå§‹åŒ–( lazily initializing)属性(æ¡ç›® 83)æ¥æŽ’除åˆå§‹åŒ–,但一般ä¸å»ºè®®è¿™æ ·åšã€‚ 延迟åˆå§‹åŒ–常常会导致实现å¤æ‚化,而性能没有å¯è¡¡é‡çš„改进(æ¡ç›® 67)。 + +  当一个对象是ä¸å¯å˜çš„时,很明显它å¯ä»¥è¢«å®‰å…¨åœ°é‡ç”¨ï¼Œä½†æ˜¯åœ¨å…¶ä»–情况下,它远没有那么明显,甚至是è¿å直觉的。考虑适é…器(adapters)的情况[Gamma95],也称为视图(views)。一个适é…器是一个对象,它委托一个支æŒå¯¹è±¡ï¼ˆbacking object),æ供一个å¯æ›¿ä»£çš„接å£ã€‚由于适é…器没有超出其支æŒå¯¹è±¡çš„状æ€ï¼Œå› æ­¤ä¸éœ€è¦ä¸ºç»™å®šå¯¹è±¡åˆ›å»ºå¤šä¸ªç»™å®šé€‚é…器的实例。 + +  例如,Map 接å£çš„ `keySet` 方法返回 Map 对象的 Set è§†å›¾ï¼ŒåŒ…å« Map 中的所有 key。 天真地说,似乎æ¯æ¬¡è°ƒç”¨ `keySet` 都必须创建一个新的 Set 实例,但是对给定 Map 对象的 `keySet` çš„æ¯æ¬¡è°ƒç”¨éƒ½è¿”回相åŒçš„ Set 实例。 尽管返回的 Set 实例通常是å¯å˜çš„,但是所有返回的对象在功能上都是相åŒçš„:当其中一个返回的对象å‘生å˜åŒ–时,所有其他对象也都å˜åŒ–,因为它们全部由相åŒçš„ Map 实例支æŒã€‚ 虽然创建 `keySet` 视图对象的多个实例基本上是无害的,但这是没有必è¦çš„,也没有任何好处。 + +  å¦ä¸€ç§åˆ›å»ºä¸å¿…è¦çš„对象的方法是自动装箱(autoboxing),它å…许程åºå‘˜æ··ç”¨åŸºæœ¬ç±»åž‹å’ŒåŒ…装的基本类型,根æ®éœ€è¦è‡ªåŠ¨è£…箱和拆箱。 自动装箱模糊ä¸æ¸…,但ä¸ä¼šæ¶ˆé™¤åŸºæœ¬ç±»åž‹å’Œè£…箱基本类型之间的区别。 有微妙的语义区别和ä¸é‚£ä¹ˆç»†å¾®çš„性能差异(æ¡ç›® 61)。 考虑下é¢çš„方法,它计算所有正整数的总和。 è¦åšåˆ°è¿™ä¸€ç‚¹ï¼Œç¨‹åºå¿…须使用 `long` 类型,因为 `int` 类型ä¸è¶³ä»¥ä¿å­˜æ‰€æœ‰æ­£æ•´æ•°çš„总和: + +```Java +// Hideously slow! Can you spot the object creation? +private static long sum() { + Long sum = 0L; + for (long i = 0; i <= Integer.MAX_VALUE; i++) + sum += i; + return sum; +} +``` + +  这个程åºçš„结果是正确的,但由于写错了一个字符,è¿è¡Œçš„结果è¦æ¯”实际慢很多。å˜é‡ `sum` 被声明æˆäº† `Long` 而ä¸æ˜¯ `long`,这æ„味ç€ç¨‹åºæž„造了大约 231 ä¸å¿…è¦çš„ `Long` 实例(大约æ¯æ¬¡å¾€ `Long` 类型的 `sum` å˜é‡ä¸­å¢žåŠ ä¸€ä¸ª `long` 类型构造的实例),把 `sum` å˜é‡çš„类型由 `Long` 改为 `long`,在我的机器上è¿è¡Œæ—¶é—´ä»Ž 6.3 秒é™ä½Žåˆ° 0.59 秒。这个教训很明显:优先使用基本类型而ä¸æ˜¯è£…箱的基本类型,也è¦æ³¨æ„æ— æ„识的自动装箱。 + +  这个æ¡ç›®ä¸åº”该被误解为暗示对象创建是昂贵的,应该é¿å…创建对象。 相å,使用构造方法创建和回收å°çš„对象是éžå¸¸å»‰ä»·ï¼Œæž„造方法åªä¼šåšå¾ˆå°‘的显示工作,尤其是在现代 JVM 实现上。 创建é¢å¤–的对象以增强程åºçš„清晰度,简å•æ€§æˆ–功能性通常是件好事。 + +  相å,除éžæ± ä¸­çš„对象éžå¸¸é‡é‡çº§ï¼Œå¦åˆ™é€šè¿‡ç»´æŠ¤è‡ªå·±çš„对象池æ¥é¿å…对象创建是一个å主æ„。对象池的典型例å­å°±æ˜¯æ•°æ®åº“连接。建立连接的æˆæœ¬éžå¸¸é«˜ï¼Œå› æ­¤é‡ç”¨è¿™äº›å¯¹è±¡æ˜¯æœ‰æ„义的。但是,一般æ¥è¯´ï¼Œç»´æŠ¤è‡ªå·±çš„对象池会使代ç æ··ä¹±ï¼Œå¢žåŠ å†…å­˜å ç”¨ï¼Œå¹¶æŸå®³æ€§èƒ½ã€‚现代 JVM 实现具有高度优化的垃圾收集器,它们在轻é‡çº§å¯¹è±¡ä¸Šè½»æ¾èƒœè¿‡æ­¤ç±»å¯¹è±¡æ± ã€‚ + +  这个æ¡ç›®çš„对应点是针对æ¡ç›® 50 的防御性å¤åˆ¶ï¼ˆdefensive copying)。 ç›®å‰çš„æ¡ç›®è¯´ï¼šâ€œå½“你应该é‡ç”¨ä¸€ä¸ªçŽ°æœ‰çš„对象时,ä¸è¦åˆ›å»ºä¸€ä¸ªæ–°çš„对象â€ï¼Œè€Œæ¡ç›® 50 说:“ä¸è¦é‡å¤ä½¿ç”¨çŽ°æœ‰çš„对象,当你应该创建一个新的对象时。â€è¯·æ³¨æ„,é‡ç”¨é˜²å¾¡æ€§å¤åˆ¶æ‰€è¦æ±‚的对象所付出的代价,è¦è¿œè¿œå¤§äºŽä¸å¿…è¦åœ°åˆ›å»ºé‡å¤çš„对象。 未能在需è¦çš„情况下防御性å¤åˆ¶ä¼šå¯¼è‡´æ½œåœ¨çš„错误和安全æ¼æ´žï¼›è€Œä¸å¿…è¦åœ°åˆ›å»ºå¯¹è±¡åªä¼šå½±å“程åºçš„风格和性能。 diff --git a/docs/notes/07. 消除过期的对象引用.md b/docs/notes/07. 消除过期的对象引用.md new file mode 100644 index 0000000..274d159 --- /dev/null +++ b/docs/notes/07. 消除过期的对象引用.md @@ -0,0 +1,75 @@ +# 7. 消除过期的对象引用 + + +  如果你从使用手动内存管ç†çš„语言 (如 C 或 C++) 切æ¢åˆ°åƒ Java 这样的带有垃圾收集机制的语言,那么作为程åºå‘˜çš„工作就会å˜å¾—容易多了,因为你的对象在使用完毕以åŽå°±è‡ªåŠ¨å›žæ”¶äº†ã€‚当你第一次体验它的时候,它就åƒé­”法一样。这很容易让人觉得你ä¸éœ€è¦è€ƒè™‘内存管ç†ï¼Œä½†è¿™å¹¶ä¸å®Œå…¨æ­£ç¡®ã€‚ + +  考虑以下简å•çš„堆栈实现: + +```Java +// Can you spot the "memory leak"? +public class Stack { + private Object[] elements; + private int size = 0; + private static final int DEFAULT_INITIAL_CAPACITY = 16; + + public Stack() { + elements = new Object[DEFAULT_INITIAL_CAPACITY]; + } + + public void push(Object e) { + ensureCapacity(); + elements[size++] = e; + } + + public Object pop() { + if (size == 0) + throw new EmptyStackException(); + return elements[--size]; + } + + /** + * Ensure space for at least one more element, roughly + * doubling the capacity each time the array needs to grow. + */ + private void ensureCapacity() { + if (elements.length == size) + elements = Arrays.copyOf(elements, 2 * size + 1); + } +} +``` +  这个程åºæ²¡æœ‰ä»€ä¹ˆæ˜Žæ˜¾çš„错误(但是对于泛型版本,请å‚阅æ¡ç›® 29)。 ä½ å¯ä»¥å¯¹å®ƒè¿›è¡Œè¯¦å°½çš„测试,它都会æˆåŠŸåœ°é€šè¿‡æ¯ä¸€é¡¹æµ‹è¯•ï¼Œä½†æœ‰ä¸€ä¸ªæ½œåœ¨çš„问题。 笼统地说,程åºæœ‰ä¸€ä¸ªâ€œå†…存泄æ¼â€ï¼Œç”±äºŽåžƒåœ¾å›žæ”¶å™¨çš„活动的增加,或内存å ç”¨çš„增加,é™é»˜åœ°è¡¨çŽ°ä¸ºæ€§èƒ½ä¸‹é™ã€‚ 在æžç«¯çš„情况下,这样的内存泄æ¼å¯èƒ½ä¼šå¯¼è‡´ç£ç›˜åˆ†é¡µï¼ˆ disk paging),甚至导致内存溢出(OutOfMemoryError)的失败,但是这样的故障相对较少。 + +  那么哪里å‘生了内存泄æ¼ï¼Ÿ 如果一个栈增长åŽæ”¶ç¼©ï¼Œé‚£ä¹ˆä»Žæ ˆå¼¹å‡ºçš„对象ä¸ä¼šè¢«åžƒåœ¾æ”¶é›†ï¼Œå³ä½¿ä½¿ç”¨æ ˆçš„程åºä¸å†å¼•ç”¨è¿™äº›å¯¹è±¡ã€‚ 这是因为栈维护对这些对象的过期引用( obsolete references)。 过期引用简å•æ¥è¯´å°±æ˜¯æ°¸è¿œä¸ä¼šè§£é™¤çš„引用。 在这ç§æƒ…况下,元素数组“活动部分(active portion)â€ä¹‹å¤–的任何引用都是过期的。 活动部分是由索引下标å°äºŽ size 的元素组æˆã€‚ + +  垃圾收集语言中的内存泄æ¼ï¼ˆæ›´é€‚当地称为无æ„的对象ä¿ç•™ unintentional object retentions)是éšè”½çš„。 如果无æ„中ä¿ç•™äº†å¯¹è±¡å¼•ç”¨ï¼Œé‚£ä¹ˆä¸ä»…这个对象排除在垃圾回收之外,而且该对象引用的任何对象也是如此。 å³ä½¿åªæœ‰å°‘数对象引用被无æ„地ä¿ç•™ä¸‹æ¥ï¼Œä¹Ÿå¯ä»¥é˜»æ­¢åžƒåœ¾å›žæ”¶æœºåˆ¶å¯¹è®¸å¤šå¯¹è±¡çš„回收,这对性能产生很大的影å“。 + +  这类问题的解决方法很简å•ï¼šä¸€æ—¦å¯¹è±¡å¼•ç”¨è¿‡æœŸï¼Œå°†å®ƒä»¬è®¾ç½®ä¸º null。 在我们的 `Stack` 类的情景下,åªè¦ä»Žæ ˆä¸­å¼¹å‡ºï¼Œå…ƒç´ çš„引用就设置为过期。 `pop` 方法的修正版本如下所示: + +```Java +public Object pop() { + if (size == 0) + throw new EmptyStackException(); + Object result = elements[--size]; + elements[size] = null; // Eliminate obsolete reference + return result; +} +``` +  å–消过期引用的å¦ä¸€ä¸ªå¥½å¤„是,如果它们éšåŽè¢«é”™è¯¯åœ°å¼•ç”¨ï¼Œç¨‹åºç«‹å³æŠ›å‡º `NullPointerException` 异常,而ä¸æ˜¯æ‚„悄地åšç»§ç»­åšé”™è¯¯çš„事情。尽å¯èƒ½å¿«åœ°å‘现程åºä¸­çš„错误是有好处的。 + +  当程åºå‘˜ç¬¬ä¸€æ¬¡è¢«è¿™ä¸ªé—®é¢˜å›°æ‰°æ—¶ï¼Œä»–们å¯èƒ½ä¼šåœ¨ç¨‹åºç»“æŸåŽç«‹å³æ¸…空所有对象引用。这既ä¸æ˜¯å¿…è¦çš„,也ä¸æ˜¯å¯å–的;它ä¸å¿…è¦åœ°æžä¹±äº†ç¨‹åºã€‚**清空对象引用应该是例外而ä¸æ˜¯è§„范。**消除过期引用的最好方法是让包å«å¼•ç”¨çš„å˜é‡è¶…出范围。如果在最近的作用域范围内定义æ¯ä¸ªå˜é‡ (æ¡ç›® 57),这ç§è‡ªç„¶å°±ä¼šå‡ºçŽ°è¿™ç§æƒ…况。 + +  那么什么时候应该清空一个引用呢?`Stack` 类的哪个方é¢ä½¿å®ƒå®¹æ˜“å—到内存泄æ¼çš„å½±å“?简å•åœ°è¯´ï¼Œå®ƒç®¡ç†è‡ªå·±çš„内存。存储池(storage pool)由 `elements` æ•°ç»„çš„å…ƒç´ ç»„æˆ (对象引用å•å…ƒï¼Œè€Œä¸æ˜¯å¯¹è±¡æœ¬èº«)。数组中活动部分的元素 (如å‰é¢å®šä¹‰çš„) 被分é…,其余的元素都是空闲的。垃圾收集器没有办法知é“这些;对于垃圾收集器æ¥è¯´ï¼Œ`elements` 数组中的所有对象引用都åŒæ ·æœ‰æ•ˆã€‚åªæœ‰ç¨‹åºå‘˜çŸ¥é“数组的éžæ´»åŠ¨éƒ¨åˆ†ä¸é‡è¦ã€‚程åºå‘˜å¯ä»¥å‘垃圾收集器传达这样一个事实,一旦数组中的元素å˜æˆéžæ´»åŠ¨çš„一部分,就å¯ä»¥æ‰‹åŠ¨æ¸…空这些元素的引用。 + +  一般æ¥è¯´ï¼Œ**当一个类自己管ç†å†…存时,程åºå‘˜åº”该警惕内存泄æ¼é—®é¢˜ã€‚** æ¯å½“一个元素被释放时,元素中包å«çš„任何对象引用都应该被清除。 + +  **å¦ä¸€ä¸ªå¸¸è§çš„内存泄æ¼æ¥æºæ˜¯ç¼“存。** 一旦将对象引用放入缓存中,很容易忘记它的存在,并且在它å˜å¾—无关紧è¦ä¹‹åŽï¼Œä»ç„¶ä¿ç•™åœ¨ç¼“存中。对于这个问题有几ç§è§£å†³æ–¹æ¡ˆã€‚如果你正好想实现了一个缓存:åªè¦åœ¨ç¼“存之外存在对æŸä¸ªé¡¹ï¼ˆentry)的键(key)引用,那么这项就是明确有关è”的,就å¯ä»¥ç”¨ `WeakHashMap` æ¥è¡¨ç¤ºç¼“存;这些项在过期之åŽè‡ªåŠ¨åˆ é™¤ã€‚è®°ä½ï¼Œåªæœ‰å½“缓存中æŸä¸ªé¡¹çš„生命周期是由外部引用到键(key)而ä¸æ˜¯å€¼ï¼ˆvalue)决定时,`WeakHashMap` æ‰æœ‰ç”¨ã€‚ + +  更常è§çš„情况是,缓存项有用的生命周期ä¸å¤ªæ˜Žç¡®ï¼Œéšç€æ—¶é—´çš„推移一些项å˜å¾—越æ¥è¶Šæ²¡æœ‰ä»·å€¼ã€‚在这ç§æƒ…况下,缓存应该å¶å°”清ç†æŽ‰å·²ç»åºŸå¼ƒçš„项。这å¯ä»¥é€šè¿‡ä¸€ä¸ªåŽå°çº¿ç¨‹ (也许是 `ScheduledThreadPoolExecutor`) 或将新的项添加到缓存时顺便清ç†ã€‚`LinkedHashMap` 类使用它的 `removeEldestEntry` 方法实现了åŽä¸€ç§æ–¹æ¡ˆã€‚对于更å¤æ‚的缓存,å¯èƒ½ç›´æŽ¥éœ€è¦ä½¿ç”¨ `java.lang.ref`。 + +  第三个常è§çš„内存泄æ¼æ¥æºæ˜¯ç›‘å¬å™¨å’Œå…¶ä»–回调。如果你实现了一个 API,其客户端注册回调,但是没有显å¼åœ°æ’¤é”€æ³¨å†Œå›žè°ƒï¼Œé™¤éžé‡‡å–一些æ“作,å¦åˆ™å®ƒä»¬å°†ä¼šç´¯ç§¯ã€‚ç¡®ä¿å›žè°ƒæ˜¯åžƒåœ¾æ”¶é›†çš„一ç§æ–¹æ³•æ˜¯åªå­˜å‚¨å¼±å¼•ç”¨ï¼ˆweak references),例如,仅将它们ä¿å­˜åœ¨ `WeakHashMap` 的键(key)中。 + +  因为内存泄æ¼é€šå¸¸ä¸ä¼šè¡¨çŽ°ä¸ºæ˜Žæ˜¾çš„故障,所以它们å¯èƒ½ä¼šåœ¨ç³»ç»Ÿä¸­ä¿æŒå¤šå¹´ã€‚ 通常仅在仔细的代ç æ£€æŸ¥æˆ–借助堆分æžå™¨ï¼ˆ heap profiler)的调试工具æ‰ä¼šè¢«å‘现。 因此,学习如何预è§è¿™äº›é—®é¢˜ï¼Œå¹¶é˜²æ­¢è¿™äº›é—®é¢˜å‘生,是éžå¸¸å€¼å¾—的。 + + + + diff --git a/docs/notes/08. é¿å…使用Finalizerå’ŒCleaner机制.md b/docs/notes/08. é¿å…使用Finalizerå’ŒCleaner机制.md new file mode 100644 index 0000000..2019e5c --- /dev/null +++ b/docs/notes/08. é¿å…使用Finalizerå’ŒCleaner机制.md @@ -0,0 +1,98 @@ +# 8. é¿å…使用 Finalizer å’Œ Cleaner 机制 + +  Finalizer 机制是ä¸å¯é¢„知的,往往是å±é™©çš„,而且通常是ä¸å¿…è¦çš„。 它们的使用会导致ä¸ç¨³å®šçš„行为,糟糕的性能和移æ¤æ€§é—®é¢˜ã€‚ Finalizer 机制有一些特殊的用途,我们ç¨åŽä¼šåœ¨è¿™ä¸ªæ¡ç›®ä¸­ä»‹ç»ï¼Œä½†æ˜¯é€šå¸¸åº”该é¿å…它们。 从 Java 9 开始,Finalizer 机制已被弃用,但ä»è¢« Java 类库所使用。 Java 9 中 Cleaner 机制代替了 Finalizer 机制。 Cleaner 机制ä¸å¦‚ Finalizer 机制那样å±é™©ï¼Œä½†ä»ç„¶æ˜¯ä¸å¯é¢„测,è¿è¡Œç¼“慢并且通常是ä¸å¿…è¦çš„。 + +  æ醒 C++程åºå‘˜ä¸è¦æŠŠ Java 中的 Finalizer 或 Cleaner 机制当æˆçš„ C ++æžæž„函数的等价物。 在 C++中,æžæž„函数是回收对象相关资æºçš„正常方å¼ï¼Œæ˜¯ä¸Žæž„造方法相对应的。 在 Java 中,当一个对象å˜å¾—ä¸å¯è¾¾æ—¶ï¼Œåžƒåœ¾æ”¶é›†å™¨å›žæ”¶ä¸Žå¯¹è±¡ç›¸å…³è”的存储空间,ä¸éœ€è¦å¼€å‘人员åšé¢å¤–的工作。 C ++æžæž„函数也被用æ¥å›žæ”¶å…¶ä»–éžå†…存资æºã€‚ 在 Java 中,try-with-resources 或 try-finally å—用于此目的(æ¡ç›® 9)。 + +  Finalizer å’Œ Cleaner 机制的一个缺点是ä¸èƒ½ä¿è¯ä»–们能够åŠæ—¶æ‰§è¡Œ[JLS,12.6]。 在一个对象å˜å¾—无法访问时,到 Finalizer å’Œ Cleaner 机制开始è¿è¡Œæ—¶ï¼Œè¿™æœŸé—´çš„时间是任æ„长的。 è¿™æ„味ç€ä½ æ°¸è¿œä¸åº”该 Finalizer å’Œ Cleaner 机制åšä»»ä½•æ—¶é—´æ•æ„Ÿï¼ˆtime-critical)的事情。 例如,ä¾èµ–于 Finalizer å’Œ Cleaner 机制æ¥å…³é—­æ–‡ä»¶æ˜¯ä¸¥é‡çš„错误,因为打开的文件æ述符是有é™çš„资æºã€‚ 如果由于系统迟迟没有è¿è¡Œ Finalizer å’Œ Cleaner 机制而导致许多文件被打开,程åºå¯èƒ½ä¼šå¤±è´¥ï¼Œå› ä¸ºå®ƒä¸èƒ½å†æ‰“开文件了。 + +  åŠæ—¶æ‰§è¡Œ Finalizer å’Œ Cleaner 机制是垃圾收集算法的一个功能,这ç§ç®—法在ä¸åŒçš„实现中有很大的ä¸åŒã€‚程åºçš„行为ä¾èµ–于 Finalizer å’Œ Cleaner 机制的åŠæ—¶æ‰§è¡Œï¼Œå…¶è¡Œä¸ºä¹Ÿå¯èƒ½å¤§ä¸ä¸åŒã€‚ 这样的程åºå®Œå…¨å¯ä»¥åœ¨ä½ æµ‹è¯•çš„ JVM 上完美è¿è¡Œï¼Œç„¶è€Œåœ¨ä½ æœ€é‡è¦çš„客户的机器上å¯èƒ½è¿è¡Œå°±ä¼šå¤±è´¥ã€‚ + +  延迟终结(finalization)ä¸åªæ˜¯ä¸€ä¸ªç†è®ºé—®é¢˜ã€‚为一个类æ供一个 Finalizer 机制å¯ä»¥ä»»æ„拖延它的实例的回收。一ä½åŒäº‹è°ƒè¯•äº†ä¸€ä¸ªé•¿æ—¶é—´è¿è¡Œçš„ GUI 应用程åºï¼Œè¿™ä¸ªåº”用程åºæ­£åœ¨è¢«ä¸€ä¸ª OutOfMemoryError 错误神秘地死掉。分æžæ˜¾ç¤ºï¼Œåœ¨å®ƒæ­»äº¡çš„时候,应用程åºçš„ Finalizer 机制队列上有æˆåƒä¸Šä¸‡çš„图形对象正在等待被终结和回收。ä¸å¹¸çš„是,Finalizer 机制线程的è¿è¡Œä¼˜å…ˆçº§ä½ŽäºŽå…¶ä»–应用程åºçº¿ç¨‹ï¼Œæ‰€ä»¥å¯¹è±¡è¢«å›žæ”¶çš„速度低于进入队列的速度。语言规范并ä¸ä¿è¯å“ªä¸ªçº¿ç¨‹æ‰§è¡Œ Finalizer 机制,因此除了é¿å…使用 Finalizer 机制之外,没有轻便的方法æ¥é˜²æ­¢è¿™ç±»é—®é¢˜ã€‚在这方é¢ï¼Œ Cleaner 机制比 Finalizer 机制è¦å¥½ä¸€äº›ï¼Œå› ä¸º Java 类的创建者å¯ä»¥æŽ§åˆ¶è‡ªå·± cleaner 机制的线程,但 cleaner 机制ä»ç„¶åœ¨åŽå°è¿è¡Œï¼Œåœ¨åžƒåœ¾å›žæ”¶å™¨çš„控制下è¿è¡Œï¼Œä½†ä¸èƒ½ä¿è¯åŠæ—¶æ¸…ç†ã€‚ + +  Java 规范ä¸èƒ½ä¿è¯ Finalizer å’Œ Cleaner 机制能åŠæ—¶è¿è¡Œï¼›å®ƒç”šè‡³ä¸èƒ½èƒ½ä¿è¯å®ƒä»¬æ˜¯å¦ä¼šè¿è¡Œã€‚当一个程åºç»“æŸåŽï¼Œä¸€äº›ä¸å¯è¾¾å¯¹è±¡ä¸Šçš„ Finalizer å’Œ Cleaner 机制ä»ç„¶æ²¡æœ‰è¿è¡Œã€‚因此,ä¸åº”该ä¾èµ–于 Finalizer å’Œ Cleaner 机制æ¥æ›´æ–°æŒä¹…化状æ€ã€‚例如,ä¾èµ–于 Finalizer å’Œ Cleaner 机制æ¥é‡Šæ”¾å¯¹å…±äº«èµ„æº (如数æ®åº“) çš„æŒä¹…é”,这是一个使整个分布å¼ç³»ç»Ÿé™·å…¥åœæ»žçš„好方法。 + +  ä¸è¦ç›¸ä¿¡ `System.gc` å’Œ `System.runFinalization` 方法。 他们å¯èƒ½ä¼šå¢žåŠ  Finalizer å’Œ Cleaner 机制被执行的几率,但ä¸èƒ½ä¿è¯ä¸€å®šä¼šæ‰§è¡Œã€‚ 曾ç»å£°ç§°åšå‡ºè¿™ç§ä¿è¯çš„两个方法:`System.runFinalizersOnExit` 和它的孪生兄弟 `Runtime.runFinalizersOnExit`,包å«è‡´å‘½çš„缺陷,并已被弃用了几åå¹´[ThreadStop]。 + +  Finalizer 机制的å¦ä¸€ä¸ªé—®é¢˜æ˜¯åœ¨æ‰§è¡Œ Finalizer 机制过程中,未æ•èŽ·çš„异常会被忽略,并且该对象的 Finalizer 机制也会终止 [JLS, 12.6]。未æ•èŽ·çš„异常会使其他对象陷入一ç§æŸå的状æ€ï¼ˆcorrupt state)。如果å¦ä¸€ä¸ªçº¿ç¨‹è¯•å›¾ä½¿ç”¨è¿™æ ·ä¸€ä¸ªæŸå的对象,å¯èƒ½ä¼šå¯¼è‡´ä»»æ„ä¸ç¡®å®šçš„行为。通常情况下,未æ•èŽ·çš„异常将终止线程并打å°å †æ ˆè·Ÿè¸ªï¼ˆ stacktrace),但如果å‘生在 Finalizer 机制中,则ä¸ä¼šå‘出警告。Cleaner 机制没有这个问题,因为使用 Cleaner 机制的类库å¯ä»¥æŽ§åˆ¶å…¶çº¿ç¨‹ã€‚ + +  使用 finalizer å’Œ cleaner 机制会导致严é‡çš„性能æŸå¤±ã€‚ 在我的机器上,创建一个简å•çš„ `AutoCloseable` 对象,使用 try-with-resources 关闭它,并让垃圾回收器回收它的时间大约是 12 纳秒。 使用 finalizer 机制,而时间增加到 550 纳秒。 æ¢å¥è¯è¯´ï¼Œä½¿ç”¨ finalizer 机制创建和销æ¯å¯¹è±¡çš„速度è¦æ…¢ 50 å€ã€‚ 这主è¦æ˜¯å› ä¸º finalizer 机制会阻ç¢æœ‰æ•ˆçš„垃圾收集。 如果使用它们æ¥æ¸…ç†ç±»çš„所有实例 (在我的机器上的æ¯ä¸ªå®žä¾‹å¤§çº¦æ˜¯ 500 纳秒),那么 cleaner 机制的速度与 finalizer 机制的速度相当,但是如果仅将它们用作安全网( safety net),则 cleaner 机制è¦å¿«å¾—多,如下所述。 在这ç§çŽ¯å¢ƒä¸‹ï¼Œåˆ›å»ºï¼Œæ¸…ç†å’Œé”€æ¯ä¸€ä¸ªå¯¹è±¡åœ¨æˆ‘的机器上需è¦å¤§çº¦ 66 纳秒,这æ„味ç€å¦‚果你ä¸ä½¿ç”¨å®‰å…¨ç½‘çš„è¯ï¼Œéœ€è¦æ”¯ä»˜ 5 å€ (而ä¸æ˜¯ 50 å€) çš„ä¿é™©ã€‚ + +  finalizer 机制有一个严é‡çš„安全问题:它们会打开你的类æ¥è¿›è¡Œ finalizer 机制攻击。finalizer 机制攻击的想法很简å•ï¼šå¦‚果一个异常是从构造方法或它的åºåˆ—化中抛出的——`readObject` å’Œ `readResolve` 方法 (第 12 ç« )——æ¶æ„å­ç±»çš„ finalizer 机制å¯ä»¥è¿è¡Œåœ¨æœ¬åº”该“中途夭折(died on the vine)â€çš„部分构造对象上。finalizer 机制å¯ä»¥åœ¨é™æ€å­—属性记录对对象的引用,防止其被垃圾收集。一旦记录了有缺陷的对象,就å¯ä»¥ç®€å•åœ°è°ƒç”¨è¯¥å¯¹è±¡ä¸Šçš„ä»»æ„方法,而这些方法本æ¥å°±ä¸åº”该å…许存在。从构造方法中抛出异常应该足以防止对象出现;而在 finalizer 机制存在下,则ä¸æ˜¯ã€‚这样的攻击会带æ¥å¯æ€•çš„åŽæžœã€‚Final ç±»ä¸å— finalizer 机制攻击的影å“,因为没有人å¯ä»¥ç¼–写一个 final 类的æ¶æ„å­ç±»ã€‚为了ä¿æŠ¤éž final ç±»ä¸å— finalizer 机制攻击,编写一个 final çš„ `finalize` 方法,它什么都ä¸åšã€‚ + +  那么,你应该怎样åšå‘¢ï¼Ÿä¸ºå¯¹è±¡å°è£…需è¦ç»“æŸçš„èµ„æº (如文件或线程),而ä¸æ˜¯ä¸ºè¯¥ç±»ç¼–写 Finalizer å’Œ Cleaner 机制?让你的类实现 `AutoCloseable` 接å£å³å¯ï¼Œå¹¶è¦æ±‚客户在在ä¸å†éœ€è¦æ—¶è°ƒç”¨æ¯ä¸ªå®žä¾‹ close 方法,通常使用 try-with-resources ç¡®ä¿ç»ˆæ­¢ï¼Œå³ä½¿é¢å¯¹æœ‰å¼‚常抛出情况(æ¡ç›® 9)。一个值得一æ的细节是实例必须跟踪是å¦å·²ç»å…³é—­ï¼šclose 方法必须记录在对象里ä¸å†æœ‰æ•ˆçš„属性,其他方法必须检查该属性,如果在对象关闭åŽè°ƒç”¨å®ƒä»¬ï¼Œåˆ™æŠ›å‡º IllegalStateException 异常。 + +  那么,Finalizer å’Œ Cleaner 机制有什么好处呢?它们å¯èƒ½æœ‰ä¸¤ä¸ªåˆæ³•ç”¨é€”。一个是作为一个安全网(safety net),以防资æºçš„拥有者忽略了它的 `close` 方法。虽然ä¸èƒ½ä¿è¯ Finalizer å’Œ Cleaner 机制会迅速è¿è¡Œ (或者根本就没有è¿è¡Œ),最好是把资æºé‡Šæ”¾æ™šç‚¹å‡ºæ¥ï¼Œä¹Ÿè¦å¥½è¿‡å®¢æˆ·ç«¯æ²¡æœ‰è¿™æ ·åšã€‚如果你正在考虑编写这样的安全网 Finalizer 机制,请仔细考虑一下这样ä¿æŠ¤æ˜¯å¦å€¼å¾—付出对应的代价。一些 Java 库类,如 `FileInputStream`ã€`FileOutputStream`ã€`ThreadPoolExecutor` å’Œ `java.sql.Connection`,都有作为安全网的 Finalizer 机制。 + +  第二ç§åˆç†ä½¿ç”¨ Cleaner 机制的方法与本地对等类(native peers)有关。本地对等类是一个由普通对象委托的本地 (éž Java) 对象。由于本地对等类ä¸æ˜¯æ™®é€šçš„ Java 对象,所以垃圾收集器并ä¸çŸ¥é“它,当它的 Java 对等对象被回收时,本地对等类也ä¸ä¼šå›žæ”¶ã€‚å‡è®¾æ€§èƒ½æ˜¯å¯ä»¥æŽ¥å—的,并且本地对等类没有关键的资æºï¼Œé‚£ä¹ˆ Finalizer å’Œ Cleaner 机制å¯èƒ½æ˜¯è¿™é¡¹ä»»åŠ¡çš„åˆé€‚的工具。但如果性能是ä¸å¯æŽ¥å—的,或者本地对等类æŒæœ‰å¿…须迅速回收的资æºï¼Œé‚£ä¹ˆç±»åº”该有一个 `close` 方法,正如å‰é¢æ‰€è¿°ã€‚ + +  Cleaner 机制使用起æ¥æœ‰ç‚¹æ£˜æ‰‹ã€‚下é¢æ˜¯æ¼”示该功能的一个简å•çš„ `Room` 类。å‡è®¾ `Room` 对象必须在被回收å‰æ¸…ç†å¹²å‡€ã€‚`Room` 类实现 `AutoCloseable` 接å£ï¼›å®ƒçš„自动清ç†å®‰å…¨ç½‘使用的是一个 Cleaner 机制,这仅仅是一个实现细节。与 Finalizer 机制ä¸åŒï¼ŒCleaner 机制ä¸æ±¡æŸ“一个类的公共 API: + +```Java +// An autocloseable class using a cleaner as a safety net +public class Room implements AutoCloseable { + private static final Cleaner cleaner = Cleaner.create(); + + // Resource that requires cleaning. Must not refer to Room! + private static class State implements Runnable { + int numJunkPiles; // Number of junk piles in this room + + State(int numJunkPiles) { + this.numJunkPiles = numJunkPiles; + } + + // Invoked by close method or cleaner + @Override + public void run() { + System.out.println("Cleaning room"); + numJunkPiles = 0; + } + } + + // The state of this room, shared with our cleanable + private final State state; + + // Our cleanable. Cleans the room when it’s eligible for gc + private final Cleaner.Cleanable cleanable; + + public Room(int numJunkPiles) { + state = new State(numJunkPiles); + cleanable = cleaner.register(this, state); + } + + @Override + public void close() { + cleanable.clean(); + } +} +``` +  é™æ€å†…部 `State` 类拥有 Cleaner 机制清ç†æˆ¿é—´æ‰€éœ€çš„资æºã€‚ åœ¨è¿™é‡Œï¼Œå®ƒä»…ä»…åŒ…å« `numJunkPiles` 属性,它代表混乱房间的数é‡ã€‚ 更实际地说,它å¯èƒ½æ˜¯ä¸€ä¸ª final 修饰的 `long` 类型的指å‘本地对等类的指针。 `State` 类实现了 `Runnable` 接å£ï¼Œå…¶ `run` 方法最多åªèƒ½è°ƒç”¨ä¸€æ¬¡ï¼Œåªèƒ½è¢«æˆ‘们在 Room 构造方法中用 `Cleaner` 机制注册 `State` 实例时得到的 `Cleanable` 调用。 对 `run` 方法的调用通过以下两ç§æ–¹æ³•è§¦å‘:通常,通过调用 `Room` çš„ `close` 方法内调用 `Cleanable` çš„ `clean` 方法æ¥è§¦å‘。 如果在 `Room` 实例有资格进行垃圾回收的时候客户端没有调用 `close` 方法,那么 `Cleaner` 机制将(希望)调用 `State` çš„ `run` 方法。 + +  一个 `State` 实例ä¸å¼•ç”¨å®ƒçš„ `Room` 实例是éžå¸¸é‡è¦çš„。如果它引用了,则创建了一个循环,阻止了 `Room` 实例æˆä¸ºåžƒåœ¾æ”¶é›†çš„资格 (以åŠè‡ªåŠ¨æ¸…除)。因此,`State` 必须是é™æ€çš„嵌内部类,因为éžé™æ€å†…部类包å«å¯¹å…¶å®¿ä¸»ç±»çš„实例的引用 (æ¡ç›® 24)。åŒæ ·ï¼Œä½¿ç”¨ lambda 表达å¼ä¹Ÿæ˜¯ä¸æ˜Žæ™ºçš„,因为它们很容易获å–对宿主类对象的引用。 + +  就åƒæˆ‘们之å‰è¯´çš„,`Room` çš„ Cleaner 机制仅仅被用作一个安全网。如果客户将所有 `Room` 的实例放在 try-with-resource å—中,则永远ä¸éœ€è¦è‡ªåŠ¨æ¸…ç†ã€‚行为良好的客户端如下所示: + +```Java +public class Adult { + public static void main(String[] args) { + try (Room myRoom = new Room(7)) { + System.out.println("Goodbye"); + } + } +} +``` +  正如你所预料的,è¿è¡Œ `Adult` 程åºä¼šæ‰“å° `Goodbye` 字符串,éšåŽæ‰“å° `Cleaning room` 字符串。但是如果时ä¸åˆè§„矩的程åºï¼Œå®ƒä»Žæ¥ä¸æ¸…ç†å®ƒçš„房间会是什么样的? + +```Java +public class Teenager { + public static void main(String[] args) { + new Room(99); + System.out.println("Peace out"); + } +} +``` +  你å¯èƒ½æœŸæœ›å®ƒæ‰“å°å‡º `Peace out`,然åŽæ‰“å° `Cleaning room` 字符串,但在我的机器上,它从ä¸æ‰“å° `Cleaning room` 字符串;仅仅是程åºé€€å‡ºäº†ã€‚ 这是我们之å‰è°ˆåˆ°çš„ä¸å¯é¢„è§æ€§ã€‚ Cleaner 机制的规范说:“`System.exit` 方法期间的清ç†è¡Œä¸ºæ˜¯ç‰¹å®šäºŽå®žçŽ°çš„。 ä¸ä¿è¯æ¸…ç†è¡Œä¸ºæ˜¯å¦è¢«è°ƒç”¨ã€‚â€è™½ç„¶è§„范没有说明,但对于正常的程åºé€€å‡ºä¹Ÿæ˜¯å¦‚此。 在我的机器上,将 `System.gc()` 方法添加到 `Teenager` 类的 `main` 方法足以让程åºé€€å‡ºä¹‹å‰æ‰“å° `Cleaning room`,但ä¸èƒ½ä¿è¯åœ¨ä½ çš„机器上会看到相åŒçš„行为。 + +  总之,除了作为一个安全网或者终止éžå…³é”®çš„本地资æºï¼Œä¸è¦ä½¿ç”¨ Cleaner 机制,或者是在 Java 9 å‘布之å‰çš„ finalizers 机制。å³ä½¿æ˜¯è¿™æ ·ï¼Œä¹Ÿè¦å½“心ä¸ç¡®å®šæ€§å’Œæ€§èƒ½å½±å“。 + + diff --git a/docs/notes/09. 使用try-with-resources语å¥æ›¿ä»£try-finally语å¥.md b/docs/notes/09. 使用try-with-resources语å¥æ›¿ä»£try-finally语å¥.md new file mode 100644 index 0000000..93f8dbf --- /dev/null +++ b/docs/notes/09. 使用try-with-resources语å¥æ›¿ä»£try-finally语å¥.md @@ -0,0 +1,91 @@ +# 9. 使用 try-with-resources 语å¥æ›¿ä»£ try-finally è¯­å¥ + +  Java 类库中包å«è®¸å¤šå¿…须通过调用 `close` 方法手动关闭的资æºã€‚ 比如 `InputStream`,`OutputStream` å’Œ `java.sql.Connection`。 客户ç»å¸¸å¿½è§†å…³é—­èµ„æºï¼Œå…¶æ€§èƒ½ç»“æžœå¯æƒ³è€ŒçŸ¥ã€‚ 尽管这些资æºä¸­æœ‰å¾ˆå¤šä½¿ç”¨ finalizer 机制作为安全网,但 finalizer 机制å´ä¸èƒ½å¾ˆå¥½åœ°å·¥ä½œï¼ˆæ¡ç›® 8)。 + +  从以往æ¥çœ‹ï¼Œtry-finally 语å¥æ˜¯ä¿è¯èµ„æºæ­£ç¡®å…³é—­çš„最佳方å¼ï¼Œå³ä½¿æ˜¯åœ¨ç¨‹åºæŠ›å‡ºå¼‚常或返回的情况下: + +```Java +// try-finally - No longer the best way to close resources! +static String firstLineOfFile(String path) throws IOException { + BufferedReader br = new BufferedReader(new FileReader(path)); + try { + return br.readLine(); + } finally { + br.close(); + } +} +``` + +  这å¯èƒ½çœ‹èµ·æ¥å¹¶ä¸å,但是当添加第二个资æºæ—¶ï¼Œæƒ…况会å˜å¾—更糟: + +```Java +// try-finally is ugly when used with more than one resource! +static void copy(String src, String dst) throws IOException { + InputStream in = new FileInputStream(src); + try { + OutputStream out = new FileOutputStream(dst); + try { + byte[] buf = new byte[BUFFER_SIZE]; + int n; + while ((n = in.read(buf)) >= 0) + out.write(buf, 0, n); + } finally { + out.close(); + } + } finally { + in.close(); + } +} +``` +  这å¯èƒ½å¾ˆéš¾ç›¸ä¿¡ï¼Œä½†å³ä½¿æ˜¯ä¼˜ç§€çš„程åºå‘˜ï¼Œå¤§å¤šæ•°æ—¶å€™ä¹Ÿä¼šçŠ¯é”™è¯¯ã€‚首先,我在 Java Puzzlers[Bloch05] 的第 88 页上弄错了,多年æ¥æ²¡æœ‰äººæ³¨æ„到。事实上,2007 å¹´ Java 类库中使用 `close` 方法的三分之二都是错误的。 + +  å³ä½¿æ˜¯ç”¨ try-finally 语å¥å…³é—­èµ„æºçš„正确代ç ï¼Œå¦‚å‰é¢ä¸¤ä¸ªä»£ç ç¤ºä¾‹æ‰€ç¤ºï¼Œä¹Ÿæœ‰ä¸€ä¸ªå¾®å¦™çš„缺陷。 try-with-resources å—å’Œ finally å—中的代ç éƒ½å¯ä»¥æŠ›å‡ºå¼‚常。 例如,在 `firstLineOfFile` 方法中,由于底层物ç†è®¾å¤‡å‘生故障,对 `readLine` 方法的调用å¯èƒ½ä¼šå¼•å‘异常,并且由于相åŒçš„原因,调用 `close` 方法å¯èƒ½ä¼šå¤±è´¥ã€‚ 在这ç§æƒ…况下,第二个异常完全冲掉了第一个异常。 在异常堆栈跟踪中没有第一个异常的记录,这å¯èƒ½ä½¿å®žé™…系统中的调试éžå¸¸å¤æ‚——通常这是你想è¦è¯Šæ–­é—®é¢˜çš„第一个异常。 虽然å¯ä»¥ç¼–写代ç æ¥æŠ‘制第二个异常,但是实际上没有人这样åšï¼Œå› ä¸ºå®ƒå¤ªå†—长了。 + +  当 Java 7 引入了 try-with-resources 语å¥æ—¶ï¼Œæ‰€æœ‰è¿™äº›é—®é¢˜ä¸€ä¸‹å­éƒ½å¾—到了解决[JLS,14.20.3]。è¦ä½¿ç”¨è¿™ä¸ªæž„造,资æºå¿…须实现 `AutoCloseable` 接å£ï¼Œè¯¥æŽ¥å£ç”±ä¸€ä¸ªè¿”回为 `void` çš„ `close` 组æˆã€‚Java 类库和第三方类库中的许多类和接å£çŽ°åœ¨éƒ½å®žçŽ°æˆ–继承了 `AutoCloseable` 接å£ã€‚如果你编写的类表示必须关闭的资æºï¼Œé‚£ä¹ˆè¿™ä¸ªç±»ä¹Ÿåº”该实现 `AutoCloseable` 接å£ã€‚ + +  以下是我们的第一个使用 try-with-resources 的示例: + +```Java +// try-with-resources - the the best way to close resources! +static String firstLineOfFile(String path) throws IOException { + try (BufferedReader br = new BufferedReader( + new FileReader(path))) { + return br.readLine(); + } +} +``` + +  以下是我们的第二个使用 try-with-resources 的示例: + +```Java +// try-with-resources on multiple resources - short and sweet +static void copy(String src, String dst) throws IOException { + try (InputStream in = new FileInputStream(src); + OutputStream out = new FileOutputStream(dst)) { + byte[] buf = new byte[BUFFER_SIZE]; + int n; + while ((n = in.read(buf)) >= 0) + out.write(buf, 0, n); + } +} +``` +  ä¸ä»… try-with-resources 版本比原始版本更精简,更好的å¯è¯»æ€§ï¼Œè€Œä¸”它们æ供了更好的诊断。 考虑 `firstLineOfFile` 方法。 如果调用 `readLine` 和(ä¸å¯è§ï¼‰`close` 方法都抛出异常,则åŽä¸€ä¸ªå¼‚常将被抑制(suppressed),而ä¸æ˜¯å‰è€…。 事实上,为了ä¿ç•™ä½ çœŸæ­£æƒ³çœ‹åˆ°çš„异常,å¯èƒ½ä¼šæŠ‘制多个异常。 这些抑制的异常没有被抛弃, 而是打å°åœ¨å †æ ˆè·Ÿè¸ªä¸­ï¼Œå¹¶æ ‡æ³¨ä¸ºè¢«æŠ‘制了。 你也å¯ä»¥ä½¿ç”¨ `getSuppressed` 方法以编程方å¼è®¿é—®å®ƒä»¬ï¼Œè¯¥æ–¹æ³•åœ¨ Java 7 中已添加到的 `Throwable` 中。 + +  å¯ä»¥åœ¨ try-with-resources 语å¥ä¸­æ·»åŠ  catch å­å¥ï¼Œå°±åƒåœ¨å¸¸è§„çš„ try-finally 语å¥ä¸­ä¸€æ ·ã€‚è¿™å…许你处ç†å¼‚常,而ä¸ä¼šåœ¨å¦ä¸€å±‚嵌套中污染代ç ã€‚作为一个ç¨å¾®æœ‰äº›åšä½œçš„例å­ï¼Œè¿™é‡Œæœ‰ä¸€ä¸ªç‰ˆæœ¬çš„ `firstLineOfFile` 方法,它ä¸ä¼šæŠ›å‡ºå¼‚常,但是如果它ä¸èƒ½æ‰“开或读å–文件,则返回默认值: + + +```Java +// try-with-resources with a catch clause +static String firstLineOfFile(String path, String defaultVal) { + try (BufferedReader br = new BufferedReader( + new FileReader(path))) { + return br.readLine(); + } catch (IOException e) { + return defaultVal; + } +} +``` + +  结论明确:在处ç†å¿…须关闭的资æºæ—¶ï¼Œä½¿ç”¨ try-with-resources 语å¥æ›¿ä»£ try-finally 语å¥ã€‚ 生æˆçš„代ç æ›´ç®€æ´ï¼Œæ›´æ¸…晰,并且生æˆçš„异常更有用。 try-with-resources 语å¥åœ¨ç¼–写必须关闭资æºçš„代ç æ—¶ä¼šæ›´å®¹æ˜“,也ä¸ä¼šå‡ºé”™ï¼Œè€Œä½¿ç”¨ try-finally 语å¥å®žé™…上是ä¸å¯èƒ½çš„。 + + diff --git a/docs/notes/10. é‡å†™equals方法时éµå®ˆé€šç”¨çº¦å®š.md b/docs/notes/10. é‡å†™equals方法时éµå®ˆé€šç”¨çº¦å®š.md new file mode 100644 index 0000000..02ff2f3 --- /dev/null +++ b/docs/notes/10. é‡å†™equals方法时éµå®ˆé€šç”¨çº¦å®š.md @@ -0,0 +1,377 @@ +# 10. é‡å†™ equals 方法时éµå®ˆé€šç”¨çº¦å®š + + +  虽然 `Object` 是一个具体的类,但它主è¦æ˜¯ä¸ºç»§æ‰¿è€Œè®¾è®¡çš„ã€‚å®ƒçš„æ‰€æœ‰éž final 方法 (equalsã€hashCodeã€toStringã€clone å’Œ finalize) 都有清晰的通用约定( general contracts),因为它们被设计为被å­ç±»é‡å†™ã€‚任何类都有义务é‡å†™è¿™äº›æ–¹æ³•ï¼Œä»¥éµä»Žä»–们的通用约定;如果ä¸è¿™æ ·åšï¼Œå°†ä¼šé˜»æ­¢å…¶ä»–ä¾èµ–于约定的类 (例如 HashMap å’Œ HashSet) 与此类一起正常工作。 + +  本章论述何时以åŠå¦‚何é‡å†™ `Object` ç±»çš„éž final 的方法。这一章çœç•¥äº† finalize 方法,因为它在æ¡ç›® 8 中进行了讨论。`Comparable.compareTo` 方法虽然ä¸æ˜¯ `Object` 中的方法,因为具有很多的相似性,所以也在这里讨论。 + +  é‡å†™ equals 方法看起æ¥å¾ˆç®€å•ï¼Œä½†æ˜¯æœ‰å¾ˆå¤šæ–¹å¼ä¼šå¯¼è‡´é‡å†™å‡ºé”™ï¼Œå…¶ç»“æžœå¯èƒ½æ˜¯å¯æ€•çš„。é¿å…此问题的最简å•æ–¹æ³•æ˜¯ä¸è¦†ç›– equals 方法,在这ç§æƒ…况下,类的æ¯ä¸ªå®žä¾‹åªä¸Žè‡ªèº«ç›¸ç­‰ã€‚如果满足以下任一下æ¡ä»¶ï¼Œåˆ™è¯´æ˜Žæ˜¯æ­£ç¡®çš„åšæ³•ï¼š + + - æ¯ä¸ªç±»çš„实例都是固有唯一的。 å¯¹äºŽåƒ Thread 这样代表活动实体而ä¸æ˜¯å€¼çš„ç±»æ¥è¯´ï¼Œè¿™æ˜¯æ­£ç¡®çš„。 Object æ供的 equals 实现对这些类完全是正确的行为。 + - ç±»ä¸éœ€è¦æ供一个“逻辑相等(logical equality)â€çš„测试功能。例如 `java.util.regex.Pattern` å¯ä»¥é‡å†™ equals 方法检查两个是å¦ä»£è¡¨å®Œå…¨ç›¸åŒçš„æ­£åˆ™è¡¨è¾¾å¼ Pattern 实例,但是设计者并ä¸è®¤ä¸ºå®¢æˆ·éœ€è¦æˆ–希望使用此功能。在这ç§æƒ…况下,从 Object 继承的 equals 实现是最åˆé€‚的。 + - 父类已ç»é‡å†™äº† equals 方法,则父类行为完全适åˆäºŽè¯¥å­ç±»ã€‚例如,大多数 Set 从 AbstractSet 继承了 equals 实现ã€List 从 AbstractList 继承了 equals 实现,Map 从 AbstractMap çš„ Map 继承了 equals 实现。 + - 类是ç§æœ‰çš„或包级ç§æœ‰çš„,å¯ä»¥ç¡®å®šå®ƒçš„ equals 方法永远ä¸ä¼šè¢«è°ƒç”¨ã€‚如果你éžå¸¸åŽŒæ¶é£Žé™©ï¼Œå¯ä»¥é‡å†™ equals 方法,以确ä¿ä¸ä¼šè¢«æ„外调用: + +```Java +@Override +public boolean equals(Object o) { + throw new AssertionError(); // Method is never called +} +``` + +  什么时候需è¦é‡å†™ equals 方法呢?如果一个类包å«ä¸€ä¸ªé€»è¾‘相等( logical equality)的概念,此概念有别于对象标识(object identity),而且父类还没有é‡å†™è¿‡ equals 方法。这通常用在值类( value classes)的情况。值类åªæ˜¯ä¸€ä¸ªè¡¨ç¤ºå€¼çš„类,例如 Integer 或 String 类。程åºå‘˜ä½¿ç”¨ equals 方法比较值对象的引用,期望å‘现它们在逻辑上是å¦ç›¸ç­‰ï¼Œè€Œä¸æ˜¯å¼•ç”¨ç›¸åŒçš„对象。é‡å†™ equals 方法ä¸ä»…å¯ä»¥æ»¡è¶³ç¨‹åºå‘˜çš„期望,它还支æŒé‡å†™è¿‡ equals 的实例作为 Map 的键(key),或者 Set 里的元素,以满足预期和期望的行为。 + +  一ç§ä¸éœ€è¦ equals 方法é‡å†™çš„值类是使用实例控制(instance control)(æ¡ç›® 1)的类,以确ä¿æ¯ä¸ªå€¼è‡³å¤šå­˜åœ¨ä¸€ä¸ªå¯¹è±¡ã€‚ 枚举类型(æ¡ç›® 34)属于这个类别。 对于这些类,逻辑相等与对象标识是一样的,所以 Object çš„ equals 方法作用逻辑 equals 方法。 + +  当你é‡å†™ equals 方法时,必须éµå®ˆå®ƒçš„通用约定。Object 的规范如下: +equals 方法实现了一个等价关系(equivalence relation)。它有以下这些属性: + + - **自å性:** 对于任何éžç©ºå¼•ç”¨ x,`x.equals(x)` 必须返回 true。 + - **对称性:** 对于任何éžç©ºå¼•ç”¨ x å’Œ y,如果且仅当 `y.equals(x)` 返回 true æ—¶ `x.equals(y)` 必须返回 true。 + - **传递性:** 对于任何éžç©ºå¼•ç”¨ xã€yã€z,如果 `x.equals(y)` 返回 true,`y.equals(z)` 返回 true,则 `x.equals(z)` 必须返回 true。 + - **一致性:** 对于任何éžç©ºå¼•ç”¨ x å’Œ y,如果在 equals 比较中使用的信æ¯æ²¡æœ‰ä¿®æ”¹ï¼Œåˆ™ `x.equals(y)` 的多次调用必须始终返回 true 或始终返回 false。 + - 对于任何éžç©ºå¼•ç”¨ x,`x.equals(null)` 必须返回 false。 + +  除éžä½ å–œæ¬¢æ•°å­¦ï¼Œå¦åˆ™è¿™çœ‹èµ·æ¥æœ‰ç‚¹å“人,但ä¸è¦å¿½ç•¥å®ƒï¼å¦‚果一旦è¿å了它,很å¯èƒ½ä¼šå‘现你的程åºè¿è¡Œå¼‚常或崩溃,并且很难确定失败的根æºã€‚å¥—ç”¨çº¦ç¿°Â·å¤šæ© (John Donne) 的说法,没有哪个类是孤立存在的。一个类的实例常常被传递给å¦ä¸€ä¸ªç±»çš„实例。许多类,包括所有的集åˆç±»ï¼Œéƒ½ä¾èµ–于传递给它们éµå®ˆ equals 约定的对象。 + +  既然已ç»æ„识到è¿å equals 约定的å±é™©ï¼Œè®©æˆ‘们详细地讨论一下这个约定。好消æ¯æ˜¯ï¼Œè¡¨é¢ä¸Šçœ‹ï¼Œè¿™å¹¶ä¸æ˜¯å¾ˆå¤æ‚。一旦你ç†è§£äº†ï¼Œå°±ä¸éš¾éµå®ˆè¿™ä¸€çº¦å®šã€‚ + +  那么什么是等价关系? 笼统地说,它是一个è¿ç®—符,它将一组元素划分为彼此元素相等的å­é›†ã€‚ 这些å­é›†è¢«ç§°ä¸ºç­‰ä»·ç±»ï¼ˆequivalence classes)。 为了使 equals 方法有用,æ¯ä¸ªç­‰ä»·ç±»ä¸­çš„所有元素必须从用户的角度æ¥è¯´æ˜¯å¯ä»¥äº’æ¢ï¼ˆinterchangeable)的。 现在让我们ä¾æ¬¡çœ‹ä¸‹è¿™ä¸ªäº”个è¦æ±‚: + +  **自å性(Reflexivity**)——第一个è¦æ±‚åªæ˜¯è¯´ä¸€ä¸ªå¯¹è±¡å¿…须与自身相等。 很难想象无æ„中è¿å了这个规定。 如果你è¿å了它,然åŽæŠŠç±»çš„实例添加到一个集åˆä¸­ï¼Œé‚£ä¹ˆ `contains` 方法å¯èƒ½ä¼šè¯´é›†åˆä¸­æ²¡æœ‰åŒ…å«åˆšæ·»åŠ çš„实例。 + +  **对称性(Symmetry)**——第二个è¦æ±‚是,任何两个对象必须在是å¦ç›¸ç­‰çš„问题上达æˆä¸€è‡´ã€‚与第一个è¦æ±‚ä¸åŒçš„是,我们ä¸éš¾æƒ³è±¡åœ¨æ— æ„中è¿å了这一è¦æ±‚。例如,考虑下é¢çš„类,它实现了ä¸åŒºåˆ†å¤§å°å†™çš„字符串。字符串被 toString ä¿å­˜ï¼Œä½†åœ¨ equals 比较中被忽略: + +```Java +import java.util.Objects; + +public final class CaseInsensitiveString { + private final String s; + + public CaseInsensitiveString(String s) { + this.s = Objects.requireNonNull(s); + } + + // Broken - violates symmetry! + @Override + public boolean equals(Object o) { + if (o instanceof CaseInsensitiveString) + return s.equalsIgnoreCase( + ((CaseInsensitiveString) o).s); + if (o instanceof String) // One-way interoperability! + return s.equalsIgnoreCase((String) o); + return false; + } + ...// Remainder omitted +} +``` + +  上é¢ç±»ä¸­çš„ equals 试图与正常的字符串进行æ“作,å‡è®¾æˆ‘们有一个ä¸åŒºåˆ†å¤§å°å†™çš„字符串和一个正常的字符串: +```Java +CaseInsensitiveString cis = new CaseInsensitiveString("Polish"); +String s = "polish"; + +System.out.println(cis.equals(s)); // true +System.out.println(s.equals(cis)); // false +``` + +  正如所料,`cis.equals(s)` 返回 true。 问题是,尽管 `CaseInsensitiveString` 类中的 equals 方法知é“正常字符串,但 String 类中的 equals 方法å´å¿½ç•¥äº†ä¸åŒºåˆ†å¤§å°å†™çš„字符串。 因此,`s.equals(cis)` 返回 false,明显è¿å对称性。 å‡è®¾æŠŠä¸€ä¸ªä¸åŒºåˆ†å¤§å°å†™çš„字符串放入一个集åˆä¸­ï¼š + +```Java +List list = new ArrayList<>(); +list.add(cis);List list = new ArrayList<>(); +list.add(cis); +``` + +  `list.contains(s)` 返回了什么?è°çŸ¥é“呢?在当å‰çš„ OpenJDK 实现中,它会返回 false,但这åªæ˜¯ä¸€ä¸ªå®žçŽ°æž„件。在å¦ä¸€ä¸ªå®žçŽ°ä¸­ï¼Œå®ƒå¯ä»¥å¾ˆå®¹æ˜“地返回 true 或抛出è¿è¡Œæ—¶å¼‚常。一旦è¿å了 equals 约定,就ä¸çŸ¥é“其他对象在é¢å¯¹ä½ çš„对象时会如何表现了。 + +  è¦æ¶ˆé™¤è¿™ä¸ªé—®é¢˜ï¼Œåªéœ€åˆ é™¤ equals 方法中与 String 类相互æ“作的æ¶æ„å°è¯•ã€‚这样åšä¹‹åŽï¼Œå¯ä»¥å°†è¯¥æ–¹æ³•é‡æž„为å•ä¸ªè¿”回语å¥: + +```Java +@Override +public boolean equals(Object o) { + return o instanceof CaseInsensitiveString && + ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); +} +``` +  **传递性(Transitivity)**——equals 约定的第三个è¦æ±‚是,如果第一个对象等于第二个对象,第二个对象等于第三个对象,那么第一个对象必须等于第三个对象。åŒæ ·ï¼Œä¹Ÿä¸éš¾æƒ³è±¡ï¼Œæ— æ„中è¿å了这一è¦æ±‚。考虑å­ç±»çš„情况, 将新值组件( value component)添加到其父类中。æ¢å¥è¯è¯´ï¼Œå­ç±»æ·»åŠ äº†ä¸€ä¸ªä¿¡æ¯ï¼Œå®ƒå½±å“了 equals 方法比较。让我们从一个简å•ä¸å¯å˜çš„二维整数类型 Point 类开始: + +```Java +public class Point { + private final int x; + private final int y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof Point)) + return false; + Point p = (Point) o; + return p.x == x && p.y == y; + } + + ... // Remainder omitted +} +``` + +  å‡è®¾æƒ³ç»§æ‰¿è¿™ä¸ªç±»ï¼Œå°†è¡¨ç¤ºé¢œè‰²çš„ Color 类添加到 Point 类中: + +```Java +public class ColorPoint extends Point { + private final Color color; + + public ColorPoint(int x, int y, Color color) { + super(x, y); + this.color = color; + } + + ... // Remainder omitted +} +``` + +  equals 方法应该是什么样å­?如果完全忽略,则实现是从 Point 类上继承的,颜色信æ¯åœ¨ equals 方法比较中被忽略。虽然这并ä¸è¿å equals 约定,但这显然是ä¸å¯æŽ¥å—的。å‡è®¾ä½ å†™äº†ä¸€ä¸ª equals 方法,它åªåœ¨å®ƒçš„å‚数是å¦ä¸€ä¸ªå…·æœ‰ç›¸åŒä½ç½®å’Œé¢œè‰²çš„ ColorPoint 实例时返回 true: + + +```Java +// Broken - violates symmetry! +@Override +public boolean equals(Object o) { + if (!(o instanceof ColorPoint)) + return false; + return super.equals(o) && ((ColorPoint) o).color == color; +} +``` + +  当你比较 Point 对象和 ColorPoint 对象时,å¯ä»¥ä¼šå¾—到ä¸åŒçš„结果,å之亦然。å‰è€…的比较忽略了颜色属性,而åŽè€…的比较会一直返回 false,因为å‚数的类型是错误的。为了让问题更加具体,我们创建一个 Point 对象和 ColorPoint 对象: + +```Java +Point p = new Point(1, 2); +ColorPoint cp = new ColorPoint(1, 2, Color.RED); +``` + +  p.equals(cp) 返回 true,但是 cp.equals(p) 返回 false。你å¯èƒ½æƒ³ä½¿ç”¨ ColorPoint.equals 通过混åˆæ¯”较的方å¼æ¥è§£å†³è¿™ä¸ªé—®é¢˜ã€‚ + +```Java +@Override +public boolean equals(Object o) { + if (!(o instanceof Point)) + return false; + + // If o is a normal Point, do a color-blind comparison + if (!(o instanceof ColorPoint)) + return o.equals(this); + + // o is a ColorPoint; do a full comparison + return super.equals(o) && ((ColorPoint) o).color == color; +} +``` + +  这ç§æ–¹æ³•ç¡®å®žæ供了对称性,但是丧失了传递性: + +```Java +ColorPoint p1 = new ColorPoint(1, 2, Color.RED); +Point p2 = new Point(1, 2); +ColorPoint p3 = new ColorPoint(1, 2, Color.BLUE); +``` + +  现在,`p1.equals(p2)` å’Œ `p2.equals(p3)` 返回了 true,但是 `p1.equals(p3)` å´è¿”回了 false,很明显è¿èƒŒäº†ä¼ é€’性的è¦æ±‚。å‰ä¸¤ä¸ªæ¯”较都是ä¸è€ƒè™‘颜色信æ¯çš„,而第三个比较时å´åŒ…å«é¢œè‰²ä¿¡æ¯ã€‚ + +  此外,这ç§æ–¹æ³•å¯èƒ½å¯¼è‡´æ— é™é€’归:å‡è®¾æœ‰ä¸¤ä¸ª Point çš„å­ç±»ï¼Œæ¯”如 ColorPoint å’Œ SmellPoint,æ¯ä¸ªéƒ½æœ‰è¿™ç§ equals 方法。 然åŽè°ƒç”¨ `myColorPoint.equals(mySmellPoint)` 将抛出一个 StackOverflowError 异常。 + +  那么解决方案是什么? 事实è¯æ˜Žï¼Œè¿™æ˜¯é¢å‘对象语言中关于等价关系的一个基本问题。 除éžæ‚¨æ„¿æ„放弃é¢å‘对象抽象的好处,å¦åˆ™æ— æ³•ç»§æ‰¿å¯å®žä¾‹åŒ–的类,并在ä¿ç•™ equals 约定的åŒæ—¶æ·»åŠ ä¸€ä¸ªå€¼ç»„件。 + +  你å¯èƒ½å¬è¯´è¿‡ï¼Œå¯ä»¥ç»§æ‰¿ä¸€ä¸ªå¯å®žä¾‹åŒ–的类并添加一个值组件,åŒæ—¶é€šè¿‡åœ¨ equals 方法中使用一个 getClass 测试代替 instanceof 测试æ¥ä¿ç•™ equals 约定: + +```Java +@Override +public boolean equals(Object o) { + if (o == null || o.getClass() != getClass()) + return false; + Point p = (Point) o; + return p.x == x && p.y == y; +} +``` + +  åªæœ‰å½“对象具有相åŒçš„实现类时,æ‰ä¼šäº§ç”Ÿç›¸åŒçš„效果。这看起æ¥å¯èƒ½ä¸æ˜¯é‚£ä¹ˆç³Ÿç³•ï¼Œä½†æ˜¯ç»“果是ä¸å¯æŽ¥å—çš„:一个 Point ç±»å­ç±»çš„实例ä»ç„¶æ˜¯ä¸€ä¸ª Point 的实例,它ä»ç„¶éœ€è¦ä½œä¸ºä¸€ä¸ª Point æ¥è¿è¡Œï¼Œä½†æ˜¯å¦‚果你采用这个方法,就会失败ï¼å‡è®¾æˆ‘们è¦å†™ä¸€ä¸ªæ–¹æ³•æ¥åˆ¤æ–­ä¸€ä¸ª Point 对象是å¦åœ¨ unitCircle 集åˆä¸­ã€‚我们å¯ä»¥è¿™æ ·åšï¼š + +```Java +private static final Set unitCircle = Set.of( + new Point( 1, 0), new Point( 0, 1), + new Point(-1, 0), new Point( 0, -1)); + +public static boolean onUnitCircle(Point p) { + return unitCircle.contains(p); +} +``` + +  虽然这å¯èƒ½ä¸æ˜¯å®žçŽ°åŠŸèƒ½çš„最快方法,但它å¯ä»¥æ­£å¸¸å·¥ä½œã€‚å‡è®¾ä»¥ä¸€ç§ä¸æ·»åŠ å€¼ç»„件的简å•æ–¹å¼ç»§æ‰¿ Point 类,比如让它的构造方法跟踪记录创建了多少实例: + +```Java +public class CounterPoint extends Point { + private static final AtomicInteger counter = + new AtomicInteger(); + + public CounterPoint(int x, int y) { + super(x, y); + counter.incrementAndGet(); + } + + public static int numberCreated() { + return counter.get(); + } +} +``` + +  里æ°æ›¿ä»£åŽŸåˆ™ï¼ˆ Liskov substitution principle)指出,任何类型的é‡è¦å±žæ€§éƒ½åº”该适用于所有的å­ç±»åž‹ï¼Œå› æ­¤ä»»ä½•ä¸ºè¿™ç§ç±»åž‹ç¼–写的方法都应该在其å­ç±»ä¸ŠåŒæ ·é€‚用[Liskov87]。 这是我们之å‰å£°æ˜Žçš„一个正å¼é™ˆè¿°ï¼Œå³ Point çš„å­ç±»ï¼ˆå¦‚ CounterPoint)ä»ç„¶æ˜¯ä¸€ä¸ª Point,必须作为一个 Point ç±»æ¥çœ‹å¾…。 但是,å‡è®¾æˆ‘们将一个 CounterPoint 对象传递给 onUnitCircle 方法。 如果 Point 类使用基于 getClass çš„ equals 方法,则无论 CounterPoint 实例的 x å’Œ y å标如何,onUnitCircle 方法都将返回 false。 这是因为大多数集åˆï¼ˆåŒ…括 onUnitCircle 方法使用的 HashSet)都使用 equals 方法æ¥æµ‹è¯•æ˜¯å¦åŒ…å«å…ƒç´ ï¼Œå¹¶ä¸” CounterPoint 实例并ä¸ç­‰äºŽä»»ä½• Point 实例。 但是,如果在 Point 上使用了适当的基于 `instanceof` çš„ equals 方法,则在使用 CounterPoint 实例呈现时,åŒæ ·çš„ onUnitCircle 方法å¯ä»¥æ­£å¸¸å·¥ä½œã€‚ + +  虽然没有令人满æ„的方法æ¥ç»§æ‰¿ä¸€ä¸ªå¯å®žä¾‹åŒ–的类并添加一个值组件,但是有一个很好的å˜é€šæ–¹æ³•ï¼šæŒ‰ç…§æ¡ç›® 18 的建议,“优先使用组åˆè€Œä¸æ˜¯ç»§æ‰¿â€ã€‚å–代继承 Point 类的 ColorPoint 类,å¯ä»¥åœ¨ ColorPoint 类中定义一个ç§æœ‰ Point 属性,和一个公共的试图(view)(æ¡ç›® 6)方法,用æ¥è¿”回具有相åŒä½ç½®çš„ ColorPoint 对象。 + +```Java +// Adds a value component without violating the equals contract +public class ColorPoint { + private final Point point; + private final Color color; + + public ColorPoint(int x, int y, Color color) { + point = new Point(x, y); + this.color = Objects.requireNonNull(color); + } + + /** + * Returns the point-view of this color point. + */ + public Point asPoint() { + return point; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ColorPoint)) + return false; + ColorPoint cp = (ColorPoint) o; + return cp.point.equals(point) && cp.color.equals(color); + } + + ... // Remainder omitted +} +``` + +  Java å¹³å°ç±»åº“中有一些类å¯ä»¥ç»§æ‰¿å¯å®žä¾‹åŒ–的类并添加一个值组件。 例如,`java.sql.Timestamp` 继承了 `java.util.Date` 并添加了一个 nanoseconds 字段。 Timestamp 的等价 equals 确实è¿å了对称性,并且如果 Timestamp å’Œ Date 对象在åŒä¸€ä¸ªé›†åˆä¸­ä½¿ç”¨ï¼Œæˆ–者以其他方å¼æ··åˆä½¿ç”¨ï¼Œåˆ™å¯èƒ½å¯¼è‡´ä¸ç¨³å®šçš„行为。 Timestamp 类有一个å…责声明,告诫程åºå‘˜ä¸è¦æ··ç”¨ Timestamp å’Œ Date。 虽然åªè¦å°†å®ƒä»¬åˆ†å¼€ä½¿ç”¨å°±ä¸ä¼šé‡åˆ°éº»çƒ¦ï¼Œä½†æ²¡æœ‰ä»€ä¹ˆå¯ä»¥é˜»æ­¢ä½ å°†å®ƒä»¬æ··åˆåœ¨ä¸€èµ·ï¼Œå¹¶ä¸”由此产生的错误å¯èƒ½å¾ˆéš¾è°ƒè¯•ã€‚ Timestamp 类的这ç§è¡Œä¸ºæ˜¯ä¸€ä¸ªé”™è¯¯ï¼Œä¸åº”该被仿效。 + +  你å¯ä»¥å°†å€¼ç»„件添加到抽象类的å­ç±»ä¸­ï¼Œè€Œä¸ä¼šè¿å equals 约定。这对于通过éµå¾ªç¬¬ 23 个æ¡ç›®ä¸­â€œä¼˜å…ˆè€ƒè™‘类层级(class hierarchies)æ¥ä»£æ›¿æ ‡è®°ç±»ï¼ˆtagged classes)â€ä¸­çš„建议而获得的类层级,是éžå¸¸é‡è¦çš„。例如,å¯ä»¥æœ‰ä¸€ä¸ªæ²¡æœ‰å€¼ç»„件的抽象类 Shape,å­ç±» Circle 有一个 radius 属性,å¦ä¸€ä¸ªå­ç±» Rectangle åŒ…å« length å’Œ width 属性 。 åªè¦ä¸ç›´æŽ¥åˆ›å»ºçˆ¶ç±»å®žä¾‹ï¼Œå°±ä¸ä¼šå‡ºçŽ°å‰é¢æ‰€ç¤ºçš„问题。 + +  **一致性(Consistent)**——equals 约定的第四个è¦æ±‚是,如果两个对象是相等的,除éžä¸€ä¸ªï¼ˆæˆ–两个)对象被修改了, 那么它们必须始终ä¿æŒç›¸ç­‰ã€‚ æ¢å¥è¯è¯´ï¼Œå¯å˜å¯¹è±¡å¯ä»¥åœ¨ä¸åŒæ—¶æœŸå¯ä»¥ä¸Žä¸åŒçš„对象相等,而ä¸å¯å˜å¯¹è±¡åˆ™ä¸ä¼šã€‚ 当你写一个类时,è¦è®¤çœŸæ€è€ƒå®ƒæ˜¯å¦åº”该设计为ä¸å¯å˜çš„(æ¡ç›® 17)。 如果你认为应该这样åšï¼Œé‚£ä¹ˆç¡®ä¿ä½ çš„ equals 方法强制执行这样的é™åˆ¶ï¼šç›¸ç­‰çš„对象永远相等,ä¸ç›¸ç­‰çš„对象永远都ä¸ä¼šç›¸ç­‰ã€‚ + +  ä¸ç®¡ä¸€ä¸ªç±»æ˜¯ä¸æ˜¯ä¸å¯å˜çš„,都ä¸è¦å†™ä¸€ä¸ªä¾èµ–于ä¸å¯é èµ„æºçš„ equals 方法。 如果è¿å这一ç¦ä»¤ï¼Œæ»¡è¶³ä¸€è‡´æ€§è¦æ±‚是éžå¸¸å›°éš¾çš„。 例如,`java.net.URL` 类中的 equals 方法ä¾èµ–于与 URL å…³è”的主机的 IP 地å€çš„比较。 将主机å转æ¢ä¸º IP 地å€å¯èƒ½éœ€è¦è®¿é—®ç½‘络,并且ä¸èƒ½ä¿è¯éšç€æ—¶é—´çš„推移会产生相åŒçš„结果。 è¿™å¯èƒ½ä¼šå¯¼è‡´ URL 类的 equals 方法è¿å equals 约定,并在实践中造æˆé—®é¢˜ã€‚ URL 类的 equals 方法的行为是一个很大的错误,ä¸åº”该被效仿。 ä¸å¹¸çš„是,由于兼容性的è¦æ±‚,它ä¸èƒ½æ”¹å˜ã€‚ 为了é¿å…è¿™ç§é—®é¢˜ï¼Œequals 方法应该åªå¯¹å†…存驻留对象执行确定性计算。 + +  **éžç©ºæ€§ï¼ˆNon-nullity)**â€”â€”æœ€åŽ equals 约定的è¦æ±‚没有官方的å称,所以我冒昧地称之为“éžç©ºæ€§â€ã€‚æ„æ€æ˜¯è¯´è¯´æ‰€æœ‰çš„对象都必须ä¸ç­‰äºŽ null。虽然很难想象在调用 `o.equals(null)` çš„å“应中æ„外地返回 true,但ä¸éš¾æƒ³è±¡ä¸å°å¿ƒæŠ›å‡º `NullPointerException` 异常的情况。通用的约定ç¦æ­¢æŠ›å‡ºè¿™æ ·çš„异常。许多类中的 equals 方法都会明确阻止对象为 null 的情况: + +```Java +@Override +public boolean equals(Object o) { + if (o == null) + return false; + ... +} +``` + +  这个判断是ä¸å¿…è¦çš„。 为了测试它的å‚数是å¦ç›¸ç­‰ï¼Œequals 方法必须首先将其å‚数转æ¢ä¸ºåˆé€‚类型,以便调用访问器或å…许访问的属性。 在执行类型转æ¢ä¹‹å‰ï¼Œè¯¥æ–¹æ³•å¿…须使用 instanceof è¿ç®—符æ¥æ£€æŸ¥å…¶å‚数是å¦æ˜¯æ­£ç¡®çš„类型: + +```Java +@Override +public boolean equals(Object o) { + if (!(o instanceof MyType)) + return false; + MyType mt = (MyType) o; + ... +} +``` + +  如果此类型检查æ¼æŽ‰ï¼Œå¹¶ä¸” equals 方法传递了错误类型的å‚数,那么 equals 方法将抛出 `ClassCastException` 异常,这è¿å了 equals 约定。 但是,如果第一个æ“作数为 null,则指定 instanceof è¿ç®—符返回 false,而ä¸ç®¡ç¬¬äºŒä¸ªæ“作数中出现何ç§ç±»åž‹[JLS,15.20.2]。 因此,如果传入 null,类型检查将返回 false,因此ä¸éœ€è¦ 明确的 null 检查。 + +  综åˆèµ·æ¥ï¼Œä»¥ä¸‹æ˜¯ç¼–å†™é«˜è´¨é‡ equals 方法的é…方(recipe): + + 1. 使用 == è¿ç®—符检查å‚数是å¦ä¸ºè¯¥å¯¹è±¡çš„引用。如果是,返回 true。这åªæ˜¯ä¸€ç§æ€§èƒ½ä¼˜åŒ–,但是如果这ç§æ¯”较å¯èƒ½å¾ˆæ˜‚贵的è¯ï¼Œé‚£å°±å€¼å¾—去åšã€‚ + 2. 使用 `instanceof` è¿ç®—符æ¥æ£€æŸ¥å‚数是å¦å…·æœ‰æ­£ç¡®çš„类型。 如果ä¸æ˜¯ï¼Œåˆ™è¿”回 false。 通常,正确的类型是 equals 方法所在的那个类。 有时候,改类实现了一些接å£ã€‚ 如果类实现了一个接å£ï¼Œè¯¥æŽ¥å£å¯ä»¥æ”¹è¿› equals 约定以å…许实现接å£çš„类进行比较,那么使用接å£ã€‚ 集åˆæŽ¥å£ï¼ˆå¦‚ Set,List,Map å’Œ Map.Entry)具有此特性。 + 3. å‚数转æ¢ä¸ºæ­£ç¡®çš„类型。因为转æ¢æ“作在 instanceof 中已ç»å¤„ç†è¿‡ï¼Œæ‰€ä»¥å®ƒè‚¯å®šä¼šæˆåŠŸã€‚ + 4. 对于类中的æ¯ä¸ªâ€œé‡è¦â€çš„属性,请检查该å‚数属性是å¦ä¸Žè¯¥å¯¹è±¡å¯¹åº”的属性相匹é…。如果所有这些测试æˆåŠŸï¼Œè¿”回 true,å¦åˆ™è¿”回 false。如果步骤 2 中的类型是一个接å£ï¼Œé‚£ä¹ˆå¿…须通过接å£æ–¹æ³•è®¿é—®å‚数的属性;如果类型是类,则å¯ä»¥ç›´æŽ¥è®¿é—®å±žæ€§ï¼Œè¿™å–决于属性的访问æƒé™ã€‚ + +ã€€ã€€å¯¹äºŽç±»åž‹ä¸ºéž float 或 double 的基本类型,使用 == è¿ç®—符进行比较;对于对象引用属性,递归地调用 equals 方法;对于 float 基本类型的属性,使用é™æ€ `Float.compare(float, float)` 方法;对于 double 基本类型的属性,使用 `Double.compare(double, double)` 方法。由于存在 `Float.NaN`,`-0.0f` 和类似的 double 类型的值,所以需è¦å¯¹ float å’Œ double 属性进行特殊的处ç†ï¼›æœ‰å…³è¯¦ç»†ä¿¡æ¯ï¼Œè¯·å‚阅 JLS 15.21.1 或 Float.equals 方法的详细文档。 虽然你å¯ä»¥ä½¿ç”¨é™æ€æ–¹æ³• Float.equals å’Œ Double.equals 方法对 float å’Œ double 基本类型的属性进行比较,这会导致æ¯æ¬¡æ¯”较时å‘生自动装箱,引å‘éžå¸¸å·®çš„性能。 对于数组属性,将这些准则应用于æ¯ä¸ªå…ƒç´ ã€‚ 如果数组属性中的æ¯ä¸ªå…ƒç´ éƒ½å¾ˆé‡è¦ï¼Œè¯·ä½¿ç”¨å…¶ä¸­ä¸€ä¸ªé‡è½½çš„ Arrays.equals 方法。 + +  æŸäº›å¯¹è±¡å¼•ç”¨çš„属性å¯èƒ½åˆæ³•åœ°åŒ…å« null。 为é¿å…出现 NullPointerException 异常,请使用é™æ€æ–¹æ³• Objects.equals(Object, Object) 检查这些属性是å¦ç›¸ç­‰ã€‚ + +  对于一些类,例如上的 `CaseInsensitiveString` 类,属性比较相对于简å•çš„相等性测试è¦å¤æ‚得多。在这ç§æƒ…况下,你想è¦ä¿å­˜å±žæ€§çš„一个规范形å¼ï¼ˆ canonical form),这样 equals 方法就å¯ä»¥åŸºäºŽè¿™ä¸ªè§„范形å¼åŽ»åšå¼€é”€å¾ˆå°çš„精确比较,æ¥å–代开销很大的éžæ ‡å‡†æ¯”较。这ç§æ–¹å¼å…¶å®žæœ€é€‚åˆä¸å¯å˜ç±»ï¼ˆæ¡ç›® 17)。一旦对象å‘生改å˜ï¼Œä¸€å®šè¦ç¡®ä¿æŠŠå¯¹åº”的规范形å¼æ›´æ–°åˆ°æœ€æ–°ã€‚ + +  equals 方法的性能å¯èƒ½å—到属性比较顺åºçš„å½±å“。 为了获得最佳性能,你应该首先比较最å¯èƒ½ä¸åŒçš„属性,开销比较å°çš„属性,或者最好是两者都满足(derived fields)。 ä½ ä¸è¦æ¯”较ä¸å±žäºŽå¯¹è±¡é€»è¾‘状æ€çš„属性,例如用于åŒæ­¥æ“作的 lock 属性。 ä¸éœ€è¦æ¯”较å¯ä»¥ä»Žâ€œé‡è¦å±žæ€§â€è®¡ç®—出æ¥çš„派生属性,但是这样åšå¯ä»¥æ高 equals 方法的性能。 如果派生属性相当于对整个对象的摘è¦æ述,比较这个属性将节çœåœ¨æ¯”较失败时å†åŽ»æ¯”较实际数æ®çš„开销。 例如,å‡è®¾æœ‰ä¸€ä¸ª Polygon 类,并缓存该区域。 如果两个多边形的é¢ç§¯ä¸ç›¸ç­‰ï¼Œåˆ™ä¸å¿…费心比较它们的边和顶点。 + +  当你完æˆç¼–写完 equals 方法时,问你自己三个问题:它是对称的å—?它是传递å—?它是一致的å—?除此而外,编写å•å…ƒæµ‹è¯•åŠ ä»¥æŽ’查,除éžä½¿ç”¨ AutoValue 框架 (第 49 页) æ¥ç”Ÿæˆ equals 方法,在这ç§æƒ…况下å¯ä»¥å®‰å…¨åœ°çœç•¥æµ‹è¯•ã€‚如果æŒæœ‰çš„属性失败,找出原因,并相应地修改 equals 方法。当然,equals 方法也必须满足其他两个属性 (自å性和éžç©ºæ€§),但这两个属性通常都会满足。 + +  在下é¢è¿™ä¸ªç®€å•çš„ `PhoneNumber` 类中展示了根æ®ä¹‹å‰çš„é…方构建的 equals 方法: + +```Java +public final class PhoneNumber { + + private final short areaCode, prefix, lineNum; + + public PhoneNumber(int areaCode, int prefix, int lineNum) { + this.areaCode = rangeCheck(areaCode, 999, "area code"); + this.prefix = rangeCheck(prefix, 999, "prefix"); + this.lineNum = rangeCheck(lineNum, 9999, "line num"); + } + + private static short rangeCheck(int val, int max, String arg) { + if (val < 0 || val > max) + throw new IllegalArgumentException(arg + ": " + val); + + return (short) val; + } + + @Override + public boolean equals(Object o) { + if (o == this) + return true; + if (!(o instanceof PhoneNumber)) + return false; + + PhoneNumber pn = (PhoneNumber) o; + + return pn.lineNum == lineNum && pn.prefix == prefix + && pn.areaCode == areaCode; + } + + ... // Remainder omitted +} +``` + +  以下是一些最åŽæ醒: + + 1. **当é‡å†™ equals 方法时,åŒæ—¶ä¹Ÿè¦é‡å†™ hashCode 方法(æ¡ç›® 11)**。 + 2. **ä¸è¦è®© equals 方法试图太èªæ˜Žã€‚**如果åªæ˜¯ç®€å•åœ°æµ‹è¯•ç”¨äºŽç›¸ç­‰çš„属性,那么è¦éµå®ˆ equals 约定并ä¸å›°éš¾ã€‚如果你在寻找相等方é¢è¿‡äºŽæ¿€è¿›ï¼Œé‚£ä¹ˆå¾ˆå®¹æ˜“陷入麻烦。一般æ¥è¯´ï¼Œè€ƒè™‘到任何形å¼çš„别å通常是一个å主æ„。例如,File ç±»ä¸åº”该试图将引用的符å·é“¾æŽ¥ç­‰åŒäºŽåŒä¸€æ–‡ä»¶å¯¹è±¡ã€‚幸好 File 类并没这么åšã€‚ + 3. **在 equal 时方法声明中,ä¸è¦å°†å‚æ•° Object 替æ¢æˆå…¶ä»–类型。**对于程åºå‘˜æ¥è¯´ï¼Œç¼–写一个看起æ¥åƒè¿™æ ·çš„ equals 方法并ä¸å°‘è§ï¼Œç„¶åŽèŠ±ä¸Šå‡ ä¸ªå°æ—¶è‹¦è‹¦æ€ç´¢ä¸ºä»€ä¹ˆå®ƒä¸èƒ½æ­£å¸¸å·¥ä½œï¼šåœ¨ equal 时方法声明中,ä¸è¦å°†å‚æ•° Object 替æ¢æˆå…¶ä»–类型。对于程åºå‘˜æ¥è¯´ï¼Œç¼–写一个看起æ¥åƒè¿™æ ·çš„ equals 方法并ä¸å°‘è§ï¼Œç„¶åŽèŠ±ä¸Šå‡ ä¸ªå°æ—¶è‹¦è‹¦æ€ç´¢ä¸ºä»€ä¹ˆå®ƒä¸èƒ½æ­£å¸¸å·¥ä½œã€‚ + +```Java +// Broken - parameter type must be Object! +public boolean equals(MyClass o) { + … +} +``` + +  问题在于这个方法并没有é‡å†™ Object.equals 方法,它的å‚数是 Object 类型的,这样写åªæ˜¯é‡è½½äº† equals 方法(Item 52)。 å³ä½¿é™¤äº†æ­£å¸¸çš„方法之外,æ供这ç§â€œå¼ºç±»åž‹â€çš„ equals 方法也是ä¸å¯æŽ¥å—的,因为它å¯èƒ½ä¼šå¯¼è‡´å­ç±»ä¸­çš„ Override 注解产生误报,æä¾›ä¸å®‰å…¨çš„错觉。 +在这里,使用 Override 注解会阻止你犯这个错误 (æ¡ç›® 40)。这个 equals 方法ä¸ä¼šç¼–译,错误消æ¯ä¼šå‘Šè¯‰ä½ åˆ°åº•é”™åœ¨å“ªé‡Œï¼š + +```Java +// Still broken, but won’t compile +@Override +public boolean equals(MyClass o) { + … +} +``` +  编写和测试 equals(å’Œ hashCode) 方法很ç¹ç,生的代ç ä¹Ÿå¾ˆæ™®é€šã€‚替代手动编写和测试这些方法的优雅的手段是,使用谷歌 AutoValue å¼€æºæ¡†æž¶ï¼Œè¯¥æ¡†æž¶è‡ªåŠ¨ä¸ºä½ ç”Ÿæˆè¿™äº›æ–¹æ³•ï¼Œåªéœ€åœ¨ç±»ä¸Šæ·»åŠ ä¸€ä¸ªæ³¨è§£å³å¯ã€‚在大多数情况下,AutoValue 框架生æˆçš„方法与你自己编写的方法本质上是相åŒçš„。 + +  很多 IDE(例如 Eclipse,NetBeans,IntelliJ IDEA ç­‰ï¼‰ä¹Ÿæœ‰ç”Ÿæˆ equals å’Œ hashCode 方法的功能,但是生æˆçš„æºä»£ç æ¯”使用 AutoValue 框架的代ç æ›´å†—é•¿ã€å¯è¯»æ€§æ›´å·®ï¼Œä¸ä¼šè‡ªåŠ¨è·Ÿè¸ªç±»ä¸­çš„更改,因此需è¦è¿›è¡Œæµ‹è¯•ã€‚这就是说,使用 IDE å·¥å…·ç”Ÿæˆ equals(å’Œ hashCode) 方法通常比手动编写它们更å¯å–,因为 IDE 工具ä¸ä¼šçŠ¯ç²—心大æ„的错误,而人类则会。 + +  总之,除éžå¿…须:在很多情况下,ä¸è¦é‡å†™ equals 方法,从 Object 继承的实现完全是你想è¦çš„。 如果你确实é‡å†™äº† equals 方法,那么一定è¦æ¯”较这个类的所有é‡è¦å±žæ€§ï¼Œå¹¶ä¸”以ä¿æŠ¤å‰é¢ equals 约定里五个规定的方å¼åŽ»æ¯”较。 diff --git a/docs/notes/11. é‡å†™equals方法时åŒæ—¶ä¹Ÿè¦é‡å†™hashcode方法.md b/docs/notes/11. é‡å†™equals方法时åŒæ—¶ä¹Ÿè¦é‡å†™hashcode方法.md new file mode 100644 index 0000000..58cd7db --- /dev/null +++ b/docs/notes/11. é‡å†™equals方法时åŒæ—¶ä¹Ÿè¦é‡å†™hashcode方法.md @@ -0,0 +1,128 @@ +# 11. é‡å†™ equals 方法时åŒæ—¶ä¹Ÿè¦é‡å†™ hashcode 方法 + +  **在æ¯ä¸ªç±»ä¸­ï¼Œåœ¨é‡å†™ equals 方法的时侯,一定è¦é‡å†™ hashcode 方法。** 如果ä¸è¿™æ ·åšï¼Œä½ çš„ç±»è¿å了 hashCode 的通用约定,这会阻止它在 HashMap å’Œ HashSet 这样的集åˆä¸­æ­£å¸¸å·¥ä½œã€‚æ ¹æ® Object 规范,以下时具体约定。 + + 1. 当在一个应用程åºæ‰§è¡Œè¿‡ç¨‹ä¸­ï¼Œå¦‚果在 equals 方法比较中没有修改任何信æ¯ï¼Œåœ¨ä¸€ä¸ªå¯¹è±¡ä¸Šé‡å¤è°ƒç”¨ hashCode 方法时,它必须始终返回相åŒçš„值。从一个应用程åºåˆ°å¦ä¸€ä¸ªåº”用程åºçš„æ¯ä¸€æ¬¡æ‰§è¡Œè¿”回的值å¯ä»¥æ˜¯ä¸ä¸€è‡´çš„。 + 2. å¦‚æžœä¸¤ä¸ªå¯¹è±¡æ ¹æ® equals(Object) 方法比较是相等的,那么在两个对象上调用 hashCode 就必须产生的结果是相åŒçš„整数。 + 3. å¦‚æžœä¸¤ä¸ªå¯¹è±¡æ ¹æ® equals(Object) 方法比较并ä¸ç›¸ç­‰ï¼Œåˆ™ä¸è¦æ±‚在æ¯ä¸ªå¯¹è±¡ä¸Šè°ƒç”¨ hashCode 都必须产生ä¸åŒçš„结果。 但是,程åºå‘˜åº”该æ„识到,为ä¸ç›¸ç­‰çš„对象生æˆä¸åŒçš„结果å¯èƒ½ä¼šæ高散列表(hash tables)的性能。 + +  **当无法é‡å†™ hashCode 时,所è¿å第二个关键æ¡æ¬¾æ˜¯ï¼šç›¸ç­‰çš„对象必须具有相等的哈希ç ï¼ˆ hash codes)。** æ ¹æ®ç±»çš„ equals 方法,两个ä¸åŒçš„实例å¯èƒ½åœ¨é€»è¾‘上是相åŒçš„,但是对于 Object 类的 hashCode 方法,它们åªæ˜¯ä¸¤ä¸ªæ²¡æœ‰ä»€ä¹ˆå…±åŒä¹‹å¤„的对象。因此, Object 类的 hashCode 方法返回两个看似éšæœºçš„数字,而ä¸æ˜¯æŒ‰çº¦å®šè¦æ±‚的两个相等的数字。 + +举例说明,å‡è®¾ä½ ä½¿ç”¨æ¡ç›® 10 中的 `PhoneNumber` 类的实例åšä¸º HashMap 的键(key): + +```Java +Map m = new HashMap<>(); + +m.put(new PhoneNumber(707, 867, 5309), "Jenny"); +``` + +  你å¯èƒ½æœŸæœ› `m.get(new PhoneNumber(707, 867, 5309))` 方法返回 `Jenny` 字符串,但实际上,返回了 null。注æ„,这里涉åŠåˆ°ä¸¤ä¸ª `PhoneNumber` 实例:一个实例æ’入到 HashMap 中,å¦ä¸€ä¸ªä½œä¸ºåˆ¤æ–­ç›¸ç­‰çš„实例用æ¥æ£€ç´¢ã€‚`PhoneNumber` 类没有é‡å†™ hashCode 方法导致两个相等的实例返回了ä¸åŒçš„哈希ç ï¼Œè¿å了 hashCode 约定。put 方法把 `PhoneNumber` 实例ä¿å­˜åœ¨äº†ä¸€ä¸ªå“ˆå¸Œæ¡¶ï¼ˆ hash bucket)中,但 get 方法å´æ˜¯ä»Žä¸åŒçš„哈希桶中去查找,å³ä½¿æ°å¥½ä¸¤ä¸ªå®žä¾‹æ”¾åœ¨åŒä¸€ä¸ªå“ˆå¸Œæ¡¶ä¸­ï¼Œget 方法几乎肯定也会返回 null。因为 HashMap åšäº†ä¼˜åŒ–,缓存了与æ¯ä¸€é¡¹ï¼ˆentry)相关的哈希ç ï¼Œå¦‚果哈希ç ä¸åŒ¹é…,则ä¸ä¼šæ£€æŸ¥å¯¹è±¡æ˜¯å¦ç›¸ç­‰äº†ã€‚ + +  解决这个问题很简å•ï¼Œåªéœ€è¦ä¸º `PhoneNumber` ç±»é‡å†™ä¸€ä¸ªåˆé€‚çš„ hashCode 方法。hashCode 方法是什么样的?写一个ä¸è§„范的方法的是很简å•çš„。以下示例,虽然永远是åˆæ³•çš„,但ç»å¯¹ä¸èƒ½è¿™æ ·ä½¿ç”¨ï¼š + + +```Java +// The worst possible legal hashCode implementation - never use! + +@Override public int hashCode() { return 42; } +``` + +  这是åˆæ³•çš„,因为它确ä¿äº†ç›¸ç­‰çš„对象具有相åŒçš„哈希ç ã€‚这很糟糕,因为它确ä¿äº†æ¯ä¸ªå¯¹è±¡éƒ½æœ‰ç›¸åŒçš„哈希ç ã€‚因此,æ¯ä¸ªå¯¹è±¡å“ˆå¸Œåˆ°åŒä¸€ä¸ªæ¡¶ä¸­ï¼Œå“ˆå¸Œè¡¨é€€åŒ–为链表。应该在线性时间内è¿è¡Œçš„程åºï¼Œè¿è¡Œæ—¶é—´å˜æˆäº†å¹³æ–¹çº§åˆ«ã€‚对于数æ®å¾ˆå¤§çš„哈希表而言,会影å“到能够正常工作。 + +  一个好的 hash 方法趋å‘于为ä¸ç›¸ç­‰çš„实例生æˆä¸ç›¸ç­‰çš„哈希ç ã€‚这也正是 hashCode 约定中第三æ¡çš„表达。ç†æƒ³æƒ…况下,hash 方法为集åˆä¸­ä¸ç›¸ç­‰çš„实例å‡åŒ€åœ°åˆ†é… int 范围内的哈希ç ã€‚实现这ç§ç†æƒ³æƒ…况å¯èƒ½æ˜¯å›°éš¾çš„。 幸è¿çš„是,è¦èŽ·å¾—一个åˆç†çš„近似的方å¼å¹¶ä¸éš¾ã€‚ 以下是一个简å•çš„é…方: + + 1. 声明一个 int 类型的å˜é‡ result,并将其åˆå§‹åŒ–为对象中第一个é‡è¦å±žæ€§ `c` 的哈希ç ï¼Œå¦‚下é¢æ­¥éª¤ 2.a 中所计算的那样。(回顾æ¡ç›® 10,é‡è¦çš„属性是影å“比较相等的领域。) + 2. 对于对象中剩余的é‡è¦å±žæ€§ `f`,请执行以下æ“作:
        + a. 比较属性 `f` 与属性 `c` çš„ int 类型的哈希ç ï¼š
        + +     -- i. 如果这个属性是基本类型的,使用 `Type.hashCode(f)` 方法计算,其中 `Type` 类是对应属性 `f` 基本类型的包装类。
        +     -- ii. 如果该属性是一个对象引用,并且该类的 equals 方法通过递归调用 equals æ¥æ¯”较该属性,并递归地调用 hashCode 方法。 如果需è¦æ›´å¤æ‚的比较,则计算此字段的“范å¼ï¼ˆâ€œcanonical representation)â€ï¼Œå¹¶åœ¨èŒƒå¼ä¸Šè°ƒç”¨ hashCode。 如果该字段的值为空,则使用 0(也å¯ä»¥ä½¿ç”¨å…¶ä»–常数,但通常æ¥ä½¿ç”¨ 0 表示)。
        +      -- iii. 如果属性 `f` 是一个数组,把它看作æ¯ä¸ªé‡è¦çš„元素都是一个独立的属性。 也就是说,通过递归地应用这些规则计算æ¯ä¸ªé‡è¦å…ƒç´ çš„哈希ç ï¼Œå¹¶ä¸”å°†æ¯ä¸ªæ­¥éª¤ 2.b 的值åˆå¹¶ã€‚ 如果数组没有é‡è¦çš„元素,则使用一个常é‡ï¼Œæœ€å¥½ä¸è¦ä¸º 0。如果所有元素都很é‡è¦ï¼Œåˆ™ä½¿ç”¨ `Arrays.hashCode` 方法。
        + + b. 将步骤 2.a 中属性 c 计算出的哈希ç åˆå¹¶ä¸ºå¦‚下结果:`result = 31 * result + c;` + + 3. 返回 result 值。 + +  当你写完 hashCode 方法åŽï¼Œé—®è‡ªå·±æ˜¯å¦ç›¸ç­‰çš„实例有相åŒçš„哈希ç ã€‚ 编写å•å…ƒæµ‹è¯•æ¥éªŒè¯ä½ çš„直觉(除éžä½ ä½¿ç”¨ AutoValue 框架æ¥ç”Ÿæˆä½ çš„ equals å’Œ hashCode 方法,在这ç§æƒ…况下,你å¯ä»¥æ”¾å¿ƒåœ°å¿½ç•¥è¿™äº›æµ‹è¯•ï¼‰ã€‚ 如果相åŒçš„实例有ä¸ç›¸ç­‰çš„哈希ç ï¼Œæ‰¾å‡ºåŽŸå› å¹¶è§£å†³é—®é¢˜ã€‚ + +  å¯ä»¥ä»Žå“ˆå¸Œç è®¡ç®—中排除派生属性(derived fields)。æ¢å¥è¯è¯´ï¼Œå¦‚果一个属性的值å¯ä»¥æ ¹æ®å‚与计算的其他属性值计算出æ¥ï¼Œé‚£ä¹ˆå¯ä»¥å¿½ç•¥è¿™æ ·çš„属性。您必须排除在 equals 比较中没有使用的任何属性,å¦åˆ™å¯èƒ½ä¼šè¿å hashCode 约定的第二æ¡ã€‚ + +  步骤 2.b 中的乘法计算结果å–决于属性的顺åºï¼Œå¦‚果类中具有多个相似属性,则产生更好的散列函数。 例如,如果乘法计算从一个 String 散列函数中被çœç•¥ï¼Œåˆ™æ‰€æœ‰çš„字符将具有相åŒçš„散列ç ã€‚ 之所以选择 31,因为它是一个奇数的素数。 如果它是å¶æ•°ï¼Œå¹¶ä¸”乘法溢出,信æ¯å°†ä¼šä¸¢å¤±ï¼Œå› ä¸ºä¹˜ä»¥ 2 相当于移ä½ã€‚ 使用素数的好处ä¸å¤ªæ˜Žæ˜¾ï¼Œä½†ä¹ æƒ¯ä¸Šéƒ½æ˜¯è¿™ä¹ˆåšçš„。 31 的一个很好的特性,是在一些体系结构中乘法å¯ä»¥è¢«æ›¿æ¢ä¸ºç§»ä½å’Œå‡æ³•ä»¥èŽ·å¾—更好的性能:`31 * i ==(i << 5) - i`。 现代 JVM å¯ä»¥è‡ªåŠ¨è¿›è¡Œè¿™ç§ä¼˜åŒ–。 + +  让我们把上述办法应用到 `PhoneNumber` 类中: + +```Java +// Typical hashCode method + +@Override +public int hashCode() { + + int result = Short.hashCode(areaCode); + + result = 31 * result + Short.hashCode(prefix); + + result = 31 * result + Short.hashCode(lineNum); + + return result; + +} +``` + +  因为这个方法返回一个简å•çš„确定性计算的结果,它的唯一的输入是 `PhoneNumber` 实例中的三个é‡è¦çš„属性,所以显然相等的 `PhoneNumber` 实例具有相åŒçš„哈希ç ã€‚ 实际上,这个方法是 `PhoneNumber` 的一个éžå¸¸å¥½çš„ hashCode 实现,与 Java å¹³å°ç±»åº“中的实现一样。 它很简å•ï¼Œé€Ÿåº¦ç›¸å½“快,并且åˆç†åœ°å°†ä¸ç›¸åŒçš„电è¯å·ç åˆ†æ•£åˆ°ä¸åŒçš„哈希桶中。 + +  虽然在这个项目的方法产生相当好的哈希函数,但并ä¸æ˜¯æœ€å…ˆè¿›çš„。 它们的质é‡ä¸Ž Java å¹³å°ç±»åº“的值类型中找到的哈希函数相当,对于大多数用途æ¥è¯´éƒ½æ˜¯è¶³å¤Ÿçš„。 如果真的需è¦å“ˆå¸Œå‡½æ•°è€Œä¸å¤ªå¯èƒ½äº§ç”Ÿç¢°æ’žï¼Œè¯·å‚阅 Guava 框架的的[com.google.common.hash.Hashing][1] [Guava] 方法。 + +  `Objects` 类有一个é™æ€æ–¹æ³•ï¼Œå®ƒæŽ¥å—ä»»æ„æ•°é‡çš„对象并为它们返回一个哈希ç ã€‚ 这个å为 hash 的方法å¯ä»¥è®©ä½ ç¼–写一行 hashCode 方法,其质é‡ä¸Žæ ¹æ®è¿™ä¸ªé¡¹ç›®ä¸­çš„上é¢ç¼–写的方法相当。 ä¸å¹¸çš„是,它们的è¿è¡Œé€Ÿåº¦æ›´æ…¢ï¼Œå› ä¸ºå®ƒä»¬éœ€è¦åˆ›å»ºæ•°ç»„以传递å¯å˜æ•°é‡çš„å‚数,以åŠå¦‚果任何å‚数是基本类型,则进行装箱和å–消装箱。 è¿™ç§å“ˆå¸Œå‡½æ•°çš„风格建议仅在性能ä¸é‡è¦çš„情况下使用。 以下是使用这ç§æŠ€æœ¯ç¼–写的 `PhoneNumber` 的哈希函数: + + +```Java +// One-line hashCode method - mediocre performance + +@Override +public int hashCode() { + + return Objects.hash(lineNum, prefix, areaCode); + +} +``` + +  如果一个类是ä¸å¯å˜çš„,并且计算哈希ç çš„代价很大,那么å¯ä»¥è€ƒè™‘在对象中缓存哈希ç ï¼Œè€Œä¸æ˜¯åœ¨æ¯æ¬¡è¯·æ±‚æ—¶é‡æ–°è®¡ç®—哈希ç ã€‚ 如果你认为这ç§ç±»åž‹çš„大多数对象将被用作哈希键,那么应该在创建实例时计算哈希ç ã€‚ å¦åˆ™ï¼Œå¯ä»¥é€‰æ‹©åœ¨é¦–次调用 hashCode 时延迟åˆå§‹åŒ–(lazily initialize)哈希ç ã€‚ 需è¦æ³¨æ„ç¡®ä¿ç±»åœ¨å­˜åœ¨å»¶è¿Ÿåˆå§‹åŒ–属性的情况下ä¿æŒçº¿ç¨‹å®‰å…¨ï¼ˆé¡¹ç›® 83)。 `PhoneNumber` ç±»ä¸é€‚åˆè¿™ç§æƒ…况,但åªæ˜¯ä¸ºäº†å±•ç¤ºå®ƒæ˜¯å¦‚何完æˆçš„。 请注æ„,属性 hashCode çš„åˆå§‹å€¼ï¼ˆåœ¨æœ¬ä¾‹ä¸­ä¸º 0)ä¸åº”该是通常创建的实例的哈希ç ï¼š + +```Java +// hashCode method with lazily initialized cached hash code + +private int hashCode; // Automatically initialized to 0 + +@Override +public int hashCode() { + + int result = hashCode; + + if (result == 0) { + + result = Short.hashCode(areaCode); + + result = 31 * result + Short.hashCode(prefix); + + result = 31 * result + Short.hashCode(lineNum); + + hashCode = result; + + } + + return result; + +} +``` + +  **ä¸è¦è¯•å›¾ä»Žå“ˆå¸Œç è®¡ç®—中排除é‡è¦çš„属性æ¥æ高性能。** 由此产生的哈希函数å¯èƒ½è¿è¡Œå¾—更快,但其质é‡è¾ƒå·®å¯èƒ½ä¼šé™ä½Žå“ˆå¸Œè¡¨çš„性能,使其无法使用。 具体æ¥è¯´ï¼Œå“ˆå¸Œå‡½æ•°å¯èƒ½ä¼šé‡åˆ°å¤§é‡ä¸åŒçš„实例,这些实例主è¦åœ¨ä½ å¿½ç•¥çš„区域中有所ä¸åŒã€‚ 如果å‘生这ç§æƒ…况,哈希函数将把所有这些实例映射到少许哈希ç ä¸Šï¼Œè€Œåº”该以线性时间è¿è¡Œçš„程åºå°†ä¼šè¿è¡Œå¹³æ–¹çº§çš„时间。 + +  这ä¸ä»…仅是一个ç†è®ºé—®é¢˜ã€‚ 在 Java 2 之å‰ï¼ŒString 类哈希函数在整个字符串中最多使用 16 个字符,从第一个字符开始,在整个字符串中å‡åŒ€åœ°é€‰å–。 对于大é‡çš„带有层次å称的集åˆï¼ˆå¦‚ URL),此功能正好显示了å‰é¢æè¿°çš„ç—…æ€è¡Œä¸ºã€‚ + +  **ä¸è¦ä¸º hashCode 返回的值æ供详细的规范,因此客户端ä¸èƒ½åˆç†åœ°ä¾èµ–它; ä½ å¯ä»¥æ”¹å˜å®ƒçš„çµæ´»æ€§ã€‚** Java 类库中的许多类(例如 String å’Œ Integer)都将 hashCode 方法返回的确切值指定为实例值的函数。 è¿™ä¸æ˜¯ä¸€ä¸ªå¥½ä¸»æ„,而是一个我们ä¸å¾—ä¸å¿å—的错误:它妨ç¢äº†åœ¨æœªæ¥ç‰ˆæœ¬ä¸­æ”¹è¿›å“ˆå¸Œå‡½æ•°çš„能力。 如果未指定细节并在散列函数中å‘现缺陷,或者å‘现了更好的哈希函数,则å¯ä»¥åœ¨åŽç»­ç‰ˆæœ¬ä¸­å¯¹å…¶è¿›è¡Œæ›´æ”¹ã€‚ + +  总之,æ¯æ¬¡é‡å†™ equals 方法时都必须é‡å†™ hashCode 方法,å¦åˆ™ç¨‹åºå°†æ— æ³•æ­£å¸¸è¿è¡Œã€‚ä½ çš„ hashCode 方法必须éµä»Ž Object 类指定的常规约定,并且必须执行åˆç†çš„工作,将ä¸ç›¸ç­‰çš„哈希ç åˆ†é…ç»™ä¸ç›¸ç­‰çš„实例。如果使用第 51 页的é…方,这很容易实现。如æ¡ç›® 10 所述,AutoValue 框架为手动编写 equals å’Œ hashCode 方法æ供了一个很好的选择,IDE 也æ供了一些这样的功能。 + + + + [1]: http://com.google.common.hash.hashing/ diff --git a/docs/notes/12. 始终é‡å†™ toString 方法.md b/docs/notes/12. 始终é‡å†™ toString 方法.md new file mode 100644 index 0000000..f6cd289 --- /dev/null +++ b/docs/notes/12. 始终é‡å†™ toString 方法.md @@ -0,0 +1,74 @@ +# 12. 始终é‡å†™ toString 方法 + +  虽然 Object ç±»æ供了 toString 方法的实现,但它返回的字符串通常ä¸æ˜¯ä½ çš„类的用户想è¦çœ‹åˆ°çš„。 它由类ååŽè·Ÿä¸€ä¸ªâ€œatâ€ç¬¦å·ï¼ˆ@)和哈希ç çš„无符å·å六进制表示组æˆï¼Œä¾‹å¦‚ `PhoneNumber@163b91`。 toString 的通用约定è¦æ±‚,返回的字符串应该是“一个简æ´ä½†å†…容丰富的表示,对人们æ¥è¯´æ˜¯å¾ˆå®¹æ˜“阅读的â€ã€‚虽然å¯ä»¥è®¤ä¸º `PhoneNumber@163b91` 简æ´æ˜“读,但相比于 `707-867-5309`,但并ä¸æ˜¯å¾ˆä¸°å¯Œ 。 toString 通用约定“建议所有的å­ç±»é‡å†™è¿™ä¸ªæ–¹æ³•â€ã€‚å¥½çš„å»ºè®®ï¼Œçš„ç¡®å¦‚æ­¤ï¼ + +  虽然它并ä¸åƒéµå®ˆ equals å’Œ hashCode 约定那样é‡è¦ (æ¡ç›® 10 å’Œ 11),但是æ供一个良好的 toString 实现使你的类更易于使用,并对使用此类的系统更易于调试。当对象被传递到 printlnã€printfã€å­—符串连接æ“作符或断言,或者由调试器打å°æ—¶ï¼ŒtoString 方法会自动被调用。å³ä½¿ä½ ä»Žä¸è°ƒç”¨å¯¹è±¡ä¸Šçš„ toString,其他人也å¯ä»¥ã€‚例如,对对象有引用的组件å¯èƒ½åŒ…å«åœ¨æ—¥å¿—错误消æ¯ä¸­å¯¹è±¡çš„字符串表示。如果未能é‡å†™ toString,则消æ¯å¯èƒ½æ˜¯æ— ç”¨çš„。 + +  如果为 `PhoneNumber` æ供了一个很好的 toString 方法,那么生æˆä¸€ä¸ªæœ‰ç”¨çš„诊断消æ¯å°±åƒä¸‹é¢è¿™æ ·ç®€å•ï¼š + +```Java +System.out.println("Failed to connect to " + phoneNumber); +``` + +  程åºå‘˜å°†ä»¥è¿™ç§æ–¹å¼ç”Ÿæˆè¯Šæ–­æ¶ˆæ¯ï¼Œä¸ç®¡ä½ æ˜¯å¦é‡å†™ toString,但是除éžä½ è¿™æ ·åšï¼Œå¦åˆ™è¿™äº›æ¶ˆæ¯å°†ä¸ä¼šæœ‰ç”¨ã€‚ æ供一个很好的 toString 方法的好处ä¸ä»…包括类的实例,åŒæ ·æœ‰ç›ŠäºŽåŒ…å«å®žä¾‹å¼•ç”¨çš„对象,特别是集åˆã€‚ æ‰“å° map 对象时你会看到哪一个,`{Jenny=PhoneNumber@163b91}` 还是 `{Jenny=707-867-5309}`? + +  实际上,toString 方法应该返回对象中包å«çš„所有需è¦å…³æ³¨çš„ä¿¡æ¯ï¼Œå¦‚电è¯å·ç ç¤ºä¾‹ä¸­æ‰€ç¤ºã€‚ 如果对象很大或者包å«ä¸åˆ©äºŽå­—符串表示的状æ€ï¼Œè¿™æ˜¯ä¸åˆ‡å®žé™…的。 在这ç§æƒ…况下,toString 应该返回一个摘è¦ï¼Œå¦‚ `Manhattan residential phone directory (1487536 listings)` 或线程`[main,5,main]`。 ç†æƒ³æƒ…况下,字符串应该是ä¸è¨€è‡ªæ˜Žçš„(线程示例并没有éµå®ˆè¿™ç‚¹ï¼‰ã€‚ 如果未能将所有对象的值得关注的信æ¯åŒ…å«åœ¨å­—符串表示中,则会导致一个特别烦人的处罚:测试失败报告如下所示: + + +```Java +Assertion failure: expected {abc, 123}, but was {abc, 123}. +``` + +  实现 toString 方法时,必须åšå‡ºçš„一个é‡è¦å†³å®šæ˜¯ï¼šåœ¨æ–‡æ¡£ä¸­æŒ‡å®šè¿”回值的格å¼ã€‚ 建议你对值类进行此æ“作,例如电è¯å·ç æˆ–矩阵类。 指定格å¼çš„好处是它å¯ä»¥ä½œä¸ºæ ‡å‡†çš„,明确的,å¯è¯»çš„对象表示。 è¿™ç§è¡¨ç¤ºå½¢å¼å¯ä»¥ç”¨äºŽè¾“å…¥ã€è¾“出以åŠæŒä¹…化å¯è¯»æ€§çš„æ•°æ®å¯¹è±¡ï¼Œå¦‚ CSV 文件。 如果指定了格å¼ï¼Œé€šå¸¸æ供一个匹é…çš„é™æ€å·¥åŽ‚或构造方法,是个好主æ„,所以程åºå‘˜å¯ä»¥è½»æ¾åœ°åœ¨å¯¹è±¡å’Œå­—符串表示之间æ¥å›žè½¬æ¢ã€‚ Java å¹³å°ç±»åº“中的许多值类都采用了这ç§æ–¹æ³•ï¼ŒåŒ…括 BigInteger,BigDecimal 和大部分基本类型包装类。 + +  指定 toString 返回值的格å¼çš„缺点是,å‡è®¾ä½ çš„类被广泛使用,一旦指定了格å¼ï¼Œå°±ä¼šç»ˆèº«ä½¿ç”¨ã€‚程åºå‘˜å°†ç¼–写代ç æ¥è§£æžè¡¨è¾¾å¼ï¼Œç”Ÿæˆå®ƒï¼Œå¹¶å°†å…¶åµŒå…¥åˆ°æŒä¹…æ•°æ®ä¸­ã€‚如果在将æ¥çš„版本中更改了格å¼çš„表示,那么会破å他们的代ç å’Œæ•°æ®ï¼Œå¹¶ä¸”还会抱怨。但通过选择ä¸æŒ‡å®šæ ¼å¼ï¼Œå°±å¯ä»¥ä¿ç•™åœ¨åŽç»­ç‰ˆæœ¬ä¸­æ·»åŠ ä¿¡æ¯æˆ–改进格å¼çš„çµæ´»æ€§ã€‚ + +  无论是å¦å†³å®šæŒ‡å®šæ ¼å¼ï¼Œä½ éƒ½åº”该清楚地在文档中表明你的æ„图。如果指定了格å¼ï¼Œåˆ™åº”该这样åšã€‚例如,这里有一个 toString 方法,该方法在æ¡ç›® 11 中使用 `PhoneNumber` 类: + +```Java +/** + * Returns the string representation of this phone number. + * The string consists of twelve characters whose format is + * "XXX-YYY-ZZZZ", where XXX is the area code, YYY is the + * prefix, and ZZZZ is the line number. Each of the capital + * letters represents a single decimal digit. + * + * If any of the three parts of this phone number is too small + * to fill up its field, the field is padded with leading zeros. + * For example, if the value of the line number is 123, the last + * four characters of the string representation will be "0123". + */ +@Override +public String toString() { + return String.format("%03d-%03d-%04d", + areaCode, prefix, lineNum); +} +``` + +  如果你决定ä¸æŒ‡å®šæ ¼å¼ï¼Œé‚£ä¹ˆæ–‡æ¡£æ³¨é‡Šåº”该是这样的: + +```Java +/** + * Returns a brief description of this potion. The exact details + * of the representation are unspecified and subject to change, + * but the following may be regarded as typical: + * + * "[Potion #9: type=love, smell=turpentine, look=india ink]" + */ +@Override +public String toString() { ... } +``` + +  在阅读了这æ¡æ³¨é‡Šä¹‹åŽï¼Œé‚£äº›ç”Ÿæˆä¾èµ–于格å¼ç»†èŠ‚的代ç æˆ–æŒä¹…化数æ®çš„程åºå‘˜ï¼Œåœ¨è¿™ç§æ ¼å¼å‘生改å˜çš„时候,åªèƒ½æ€ªä»–们自己。 + +  无论是å¦æŒ‡å®šæ ¼å¼ï¼Œéƒ½å¯ä»¥é€šè¿‡ç¼–程方å¼è®¿é—® toString 返回的值中包å«çš„ä¿¡æ¯ã€‚ 例如,`PhoneNumber` ç±»åº”è¯¥åŒ…å« areaCode, prefix, lineNum 这三个属性。 如果ä¸è¿™æ ·åšï¼Œå°±ä¼šå¼ºè¿«ç¨‹åºå‘˜éœ€è¦è¿™äº›ä¿¡æ¯æ¥è§£æžå­—符串。 除了é™ä½Žæ€§èƒ½å’Œç¨‹åºå‘˜åšä¸å¿…è¦çš„工作之外,这个过程很容易出错,如果改å˜æ ¼å¼å°±ä¼šä¸­æ–­ï¼Œå¹¶å¯¼è‡´è„†å¼±çš„系统。 由于未能æ供访问器,å³ä½¿å·²æŒ‡å®šæ ¼å¼å¯èƒ½ä¼šæ›´æ”¹ï¼Œä¹Ÿå¯ä»¥å°†å­—符串格å¼è½¬æ¢ä¸ºäº‹å®žä¸Šçš„ API。 + +  在é™æ€å·¥å…·ç±»ï¼ˆæ¡ç›® 4)中编写 toString 方法是没有æ„义的。 你也ä¸åº”该在大多数枚举类型(æ¡ç›® 34)中写一个 toString 方法,因为 Java 为你æ供了一个éžå¸¸å¥½çš„方法。 但是,你应该在任何抽象类中定义 toString 方法,该类的å­ç±»å…±äº«ä¸€ä¸ªå…¬å…±å­—符串表示形å¼ã€‚ 例如,大多数集åˆå®žçŽ°ä¸Šçš„ toString 方法都是从抽象集åˆç±»ç»§æ‰¿çš„。 + +  Google 的开放æºä»£ç  AutoValue 工具在æ¡ç›® 10 中讨论过,它为你生æˆä¸€ä¸ª toString 方法,就åƒå¤§å¤šæ•° IDE 工具一样。 这些方法éžå¸¸é€‚åˆå‘Šè¯‰ä½ æ¯ä¸ªå±žæ€§çš„内容,但并ä¸æ˜¯ä¸“门针对类的å«ä¹‰ã€‚ 因此,例如,为我们的 `PhoneNumber` 类使用自动生æˆçš„ toString 方法是ä¸åˆé€‚的(因为电è¯å·ç å…·æœ‰æ ‡å‡†çš„字符串表示形å¼ï¼‰ï¼Œä½†æ˜¯å¯¹äºŽæˆ‘们的 `Potion` ç±»æ¥è¯´ï¼Œè¿™æ˜¯å®Œå…¨å¯ä»¥æŽ¥å—的。 也就是说,自动生æˆçš„ toString 方法比从 Object 继承的方法è¦å¥½å¾—多,它ä¸ä¼šå‘Šè¯‰ä½ å¯¹è±¡çš„值。 + +  回顾一下,除éžçˆ¶ç±»å·²ç»è¿™æ ·åšäº†ï¼Œå¦åˆ™åœ¨æ¯ä¸ªå®žä¾‹åŒ–的类中é‡å†™ Object çš„ toString 实现。 它使得类更加舒适地使用和å助调试。 toString 方法应该以一ç§ç¾Žè§‚çš„æ ¼å¼è¿”回对象的简明有用的æ述。 + + + + diff --git a/docs/notes/13. 谨慎地é‡å†™ clone 方法.md b/docs/notes/13. 谨慎地é‡å†™ clone 方法.md new file mode 100644 index 0000000..a49826c --- /dev/null +++ b/docs/notes/13. 谨慎地é‡å†™ clone 方法.md @@ -0,0 +1,209 @@ +# 13. 谨慎地é‡å†™ clone 方法 + +  Cloneable 接å£çš„目的是作为一个 mixin æŽ¥å£ (æ¡ç›® 20),公布这样的类å…许克隆。ä¸å¹¸çš„是,它没有达到这个目的。它的主è¦ç¼ºç‚¹æ˜¯ç¼ºå°‘ clone 方法,而 Object çš„ clone 方法是å—ä¿æŠ¤çš„。你ä¸èƒ½ï¼Œä¸å€ŸåŠ©åå°„ (æ¡ç›® 65),仅仅因为它实现了 Cloneable 接å£ï¼Œå°±è°ƒç”¨å¯¹è±¡ä¸Šçš„ clone 方法。å³ä½¿æ˜¯å射调用也å¯èƒ½å¤±è´¥ï¼Œå› ä¸ºä¸èƒ½ä¿è¯å¯¹è±¡å…·æœ‰å¯è®¿é—®çš„ clone 方法。尽管存在许多缺陷,该机制在åˆç†çš„范围内使用,所以ç†è§£å®ƒæ˜¯å€¼å¾—的。这个æ¡ç›®å‘Šè¯‰ä½ å¦‚何实现一个行为良好的 clone 方法,在适当的时候讨论这个方法,并æ出替代方案。 + +  既然 Cloneable 接å£ä¸åŒ…å«ä»»ä½•æ–¹æ³•ï¼Œé‚£å®ƒç”¨æ¥åšä»€ä¹ˆï¼Ÿ 它决定了 Object çš„å—ä¿æŠ¤çš„ clone 方法实现的行为:如果一个类实现了 Cloneable 接å£ï¼Œé‚£ä¹ˆ Object çš„ clone 方法将返回该对象的é€ä¸ªå±žæ€§ï¼ˆfield-by-field)拷è´ï¼›å¦åˆ™ä¼šæŠ›å‡º `CloneNotSupportedException` 异常。这是一个éžå¸¸å常的接å£ä½¿ç”¨ï¼Œè€Œä¸åº”该被效仿。 通常情况下,实现一个接å£ç”¨æ¥è¡¨ç¤ºå¯ä»¥ä¸ºå®¢æˆ·åšä»€ä¹ˆã€‚但对于 Cloneable 接å£ï¼Œå®ƒä¼šä¿®æ”¹çˆ¶ç±»ä¸Šå—ä¿æŠ¤æ–¹æ³•çš„行为。 + +  虽然规范并没有说明,但在实践中,实现 Cloneable 接å£çš„类希望æ供一个正常è¿è¡Œçš„公共 clone 方法。为了实现这一目标,该类åŠå…¶æ‰€æœ‰çˆ¶ç±»å¿…é¡»éµå¾ªä¸€ä¸ªå¤æ‚çš„ã€ä¸å¯æ‰§è¡Œçš„ã€ç¨€ç–的文档å议。由此产生的机制是脆弱的ã€å±é™©çš„å’Œä¸å—语言影å“的(extralinguistic):它创建对象而ä¸éœ€è¦è°ƒç”¨æž„造方法。 + +  clone 方法的通用规范很薄弱的。 以下内容是从 Object 规范中å¤åˆ¶å‡ºæ¥çš„: + +  创建并返回此对象的副本。 “å¤åˆ¶ï¼ˆcopy)â€çš„确切å«ä¹‰å¯èƒ½å–决于对象的类。 一般æ„图是,对于任何对象 xï¼Œè¡¨è¾¾å¼ `x.clone() != x` 返回 true,并且 `x.clone().getClass() == x.getClass()` 也返回 true,但它们ä¸æ˜¯ç»å¯¹çš„è¦æ±‚,但通常情况下,`x.clone().equals(x)` 返回 true,当然这个è¦æ±‚也ä¸æ˜¯ç»å¯¹çš„。 + +  根æ®çº¦å®šï¼Œè¿™ä¸ªæ–¹æ³•è¿”回的对象应该通过调用 `super.clone` 方法获得的。 如果一个类和它的所有父类(Object 除外)都éµå®ˆè¿™ä¸ªçº¦å®šï¼Œæƒ…况就是如此,`x.clone().getClass() == x.getClass()`。 + +  根æ®çº¦å®šï¼Œè¿”回的对象应该独立于被克隆的对象。 为了实现这ç§ç‹¬ç«‹æ€§ï¼Œåœ¨è¿”回对象之å‰ï¼Œå¯èƒ½éœ€è¦ä¿®æ”¹ç”± super.clone 返回的对象的一个或多个属性。 + +  这ç§æœºåˆ¶ä¸Žæž„造方法链(chaining)很相似,åªæ˜¯å®ƒæ²¡æœ‰è¢«å¼ºåˆ¶æ‰§è¡Œï¼›å¦‚果一个类的 clone 方法返回一个通过调用构造方法获得而ä¸æ˜¯é€šè¿‡è°ƒç”¨ super.clone 的实例,那么编译器ä¸ä¼šæŠ±æ€¨ï¼Œä½†æ˜¯å¦‚果一个类的å­ç±»è°ƒç”¨äº† super.clone,那么返回的对象包å«é”™è¯¯çš„类,从而阻止å­ç±» clone 方法正常执行。如果一个类é‡å†™çš„ clone 方法是有 final 修饰的,那么这个约定å¯ä»¥è¢«å®‰å…¨åœ°å¿½ç•¥ï¼Œå› ä¸ºå­ç±»ä¸éœ€è¦æ‹…心。但是,如果一个 final 类有一个ä¸è°ƒç”¨ super.clone çš„ clone 方法,那么这个类没有ç†ç”±å®žçŽ° Cloneable 接å£ï¼Œå› ä¸ºå®ƒä¸ä¾èµ–于 Object çš„ clone 实现的行为。 + +  å‡è®¾ä½ å¸Œæœ›åœ¨ä¸€ä¸ªç±»ä¸­å®žçŽ° Cloneable 接å£ï¼Œå®ƒçš„父类æ供了一个行为良好的 clone 方法。首先调用 super.clone。 得到的对象将是原始的完全功能的å¤åˆ¶å“。 在你的类中声明的任何属性将具有与原始属性相åŒçš„值。 如果æ¯ä¸ªå±žæ€§åŒ…å«åŽŸå§‹å€¼æˆ–对ä¸å¯å˜å¯¹è±¡çš„引用,则返回的对象å¯èƒ½æ­£æ˜¯ä½ æ‰€éœ€è¦çš„,在这ç§æƒ…况下,ä¸éœ€è¦è¿›ä¸€æ­¥çš„处ç†ã€‚ 例如,对于æ¡ç›® 11 中的 `PhoneNumber` 类,情况就是这样,但是请注æ„,ä¸å¯å˜ç±»æ°¸è¿œä¸åº”该æä¾› clone 方法,因为这åªä¼šæµªè´¹å¤åˆ¶ã€‚ 有了这个警告,以下是 `PhoneNumber` 类的 clone 方法: + +```Java +// Clone method for class with no references to mutable state +@Override public PhoneNumber clone() { + try { + return (PhoneNumber) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(); // Can't happen + } +} +``` + +  为了使这个方法起作用,`PhoneNumber` 的类声明必须被修改,以表明它实现了 Cloneable 接å£ã€‚ 虽然 Object 类的 clone 方法返回 Object 类,但是这个 clone 方法返回 `PhoneNumber` 类。 这样åšæ˜¯åˆæ³•å’Œå¯å–的,因为 Java 支æŒåå˜è¿”回类型。 æ¢å¥è¯è¯´ï¼Œé‡å†™æ–¹æ³•çš„返回类型å¯ä»¥æ˜¯é‡å†™æ–¹æ³•çš„返回类型的å­ç±»ã€‚ 这消除了在客户端转æ¢çš„需è¦ã€‚ 在返回之å‰ï¼Œæˆ‘们必须将 Object çš„ super.clone 的结果强制转æ¢ä¸º `PhoneNumber`,但ä¿è¯å¼ºåˆ¶è½¬æ¢æˆåŠŸã€‚ + +  super.clone 的调用包å«åœ¨ä¸€ä¸ª try-catch å—中。 这是因为 Object 声明了它的 clone 方法æ¥æŠ›å‡º CloneNotSupportedException 异常,这是一个检查时异常。 由于 `PhoneNumber` 实现了 Cloneable 接å£ï¼Œæ‰€ä»¥æˆ‘们知é“调用 super.clone 会æˆåŠŸã€‚ 这里引用的需è¦è¡¨æ˜Ž `CloneNotSupportedException` 应该是未被检查的(æ¡ç›® 71)。 + +  如果对象包å«å¼•ç”¨å¯å˜å¯¹è±¡çš„属性,则å‰é¢æ˜¾ç¤ºçš„ç®€å• clone 实现å¯èƒ½æ˜¯ç¾éš¾æ€§çš„。 例如,考虑æ¡ç›® 7 中的 Stack 类: + +```Java +public class Stack { + + private Object[] elements; + private int size = 0; + private static final int DEFAULT_INITIAL_CAPACITY = 16; + + public Stack() { + this.elements = new Object[DEFAULT_INITIAL_CAPACITY]; + } + + public void push(Object e) { + ensureCapacity(); + elements[size++] = e; + } + + public Object pop() { + if (size == 0) + throw new EmptyStackException(); + Object result = elements[--size]; + + elements[size] = null; // Eliminate obsolete reference + return result; + } + + // Ensure space for at least one more element. + private void ensureCapacity() { + if (elements.length == size) + elements = Arrays.copyOf(elements, 2 * size + 1); + } +} +``` + +  å‡è®¾ä½ æƒ³è®©è¿™ä¸ªç±»å¯ä»¥å…‹éš†ã€‚ 如果 clone 方法仅返回 super.clone() 调用的对象,那么生æˆçš„ Stack 实例在其 size 属性中具有正确的值,但 elements 属性引用与原始 Stack 实例相åŒçš„数组。 修改原始实例将破å克隆中的ä¸å˜é‡ï¼Œå之亦然。 你会很快å‘现你的程åºäº§ç”Ÿäº†æ— æ„义的结果,或者抛出 `NullPointerException` 异常。 + +  这ç§æƒ…况永远ä¸ä¼šå‘生,因为调用 Stack 类中的唯一构造方法。 实际上,clone 方法作为å¦ä¸€ç§æž„造方法; 必须确ä¿å®ƒä¸ä¼šæŸå原始对象,并且å¯ä»¥åœ¨å…‹éš†ä¸Šæ­£ç¡®å»ºç«‹ä¸å˜é‡ã€‚ 为了使 Stack 上的 clone 方法正常工作,它必须å¤åˆ¶ stack 对象的内部。 最简å•çš„方法是对元素数组递归调用 clone 方法: + +```Java +// Clone method for class with references to mutable state +@Override public Stack clone() { + try { + Stack result = (Stack) super.clone(); + result.elements = elements.clone(); + return result; + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } +} +``` + +  请注æ„,我们ä¸å¿…å°† elements.clone 的结果转æ¢ä¸º Object[] 数组。 在数组上调用 clone 会返回一个数组,其è¿è¡Œæ—¶å’Œç¼–译时类型与被克隆的数组相åŒã€‚ 这是å¤åˆ¶æ•°ç»„的首选习语。 事实上,数组是 clone 机制的唯一有力的用途。 + +  还è¦æ³¨æ„,如果 elements 属性是 final 的,则以å‰çš„解决方案将ä¸èµ·ä½œç”¨ï¼Œå› ä¸ºå…‹éš†å°†è¢«ç¦æ­¢å‘该属性分é…新的值。 这是一个基本的问题:åƒåºåˆ—化一样,Cloneable 体系结构与引用å¯å˜å¯¹è±¡çš„ final 属性的正常使用ä¸å…¼å®¹ï¼Œé™¤éžå¯å˜å¯¹è±¡å¯ä»¥åœ¨å¯¹è±¡å’Œå…¶å…‹éš†ä¹‹é—´å®‰å…¨åœ°å…±äº«ã€‚ 为了使一个类å¯ä»¥å…‹éš†ï¼Œå¯èƒ½éœ€è¦ä»Žä¸€äº›å±žæ€§ä¸­ç§»é™¤ final 修饰符。 + +  仅仅递归地调用 clone 方法并ä¸æ€»æ˜¯è¶³å¤Ÿçš„。 例如,å‡è®¾æ‚¨æ­£åœ¨ä¸ºå“ˆå¸Œè¡¨ç¼–写一个 clone 方法,其内部包å«ä¸€ä¸ªå“ˆå¸Œæ¡¶æ•°ç»„,æ¯ä¸ªå“ˆå¸Œæ¡¶éƒ½æŒ‡å‘“键-值â€å¯¹é“¾è¡¨çš„第一项。 为了æ高性能,该类实现了自己的轻é‡çº§å•é“¾è¡¨ï¼Œè€Œæ²¡æœ‰ä½¿ç”¨ java 内部æ供的 java.util.LinkedList: + +```Java +public class HashTable implements Cloneable { + private Entry[] buckets = ...; + private static class Entry { + final Object key; + Object value; + Entry next; + + Entry(Object key, Object value, Entry next) { + this.key = key; + this.value = value; + this.next = next; + } + } + ... // Remainder omitted +} +``` +  å‡è®¾ä½ åªæ˜¯é€’归地克隆哈希桶数组,就åƒæˆ‘们为 Stack 所åšçš„那样: +```Java +// Broken clone method - results in shared mutable state! +@Override public HashTable clone() { + try { + HashTable result = (HashTable) super.clone(); + result.buckets = buckets.clone(); + return result; + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } +} +``` +  虽然被克隆的对象有自己的哈希桶数组,但是这个数组引用与原始数组相åŒçš„链表,这很容易导致克隆对象和原始对象中的ä¸ç¡®å®šæ€§è¡Œä¸ºã€‚ è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œä½ å¿…é¡»å¤åˆ¶åŒ…å«æ¯ä¸ªæ¡¶çš„链表。 下é¢æ˜¯ä¸€ç§å¸¸è§çš„方法: +```Java +// Recursive clone method for class with complex mutable state +public class HashTable implements Cloneable { + private Entry[] buckets = ...; + + private static class Entry { + final Object key; + Object value; + Entry next; + + Entry(Object key, Object value, Entry next) { + this.key = key; + this.value = value; + this.next = next; + } + + // Recursively copy the linked list headed by this Entry + Entry deepCopy() { + return new Entry(key, value, + next == null ? null : next.deepCopy()); + } + } + + @Override public HashTable clone() { + try { + HashTable result = (HashTable) super.clone(); + result.buckets = new Entry[buckets.length]; + for (int i = 0; i < buckets.length; i++) + if (buckets[i] != null) + result.buckets[i] = buckets[i].deepCopy(); + return result; + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + ... // Remainder omitted +} +``` +  ç§æœ‰ç±» HashTable.Entry 已被扩充以支æŒâ€œæ·±åº¦å¤åˆ¶â€æ–¹æ³•ã€‚ HashTable 上的 clone 方法分é…一个åˆé€‚大å°çš„新哈希桶数组,迭代原æ¥å“ˆå¸Œæ¡¶æ•°ç»„,深度å¤åˆ¶æ¯ä¸ªéžç©ºçš„哈希桶。 Entry 上的 deepCopy 方法递归地调用它自己以å¤åˆ¶ç”±å¤´èŠ‚点开始的整个链表。 如果哈希桶ä¸æ˜¯å¤ªé•¿ï¼Œè¿™ç§æŠ€æœ¯å¾ˆèªæ˜Žå¹¶ä¸”工作正常。但是,克隆链表ä¸æ˜¯ä¸€ä¸ªå¥½æ–¹æ³•ï¼Œå› ä¸ºå®ƒä¸ºåˆ—表中的æ¯ä¸ªå…ƒç´ æ¶ˆè€—一个栈帧(stack frame)。 如果列表很长,这很容易导致堆栈溢出。 为了防止这ç§æƒ…况å‘生,å¯ä»¥ç”¨è¿­ä»£æ¥æ›¿æ¢ deepCopy 中的递归: +```Java +// Iteratively copy the linked list headed by this Entry +Entry deepCopy() { + Entry result = new Entry(key, value, next); + for (Entry p = result; p.next != null; p = p.next) + p.next = new Entry(p.next.key, p.next.value, p.next.next); + return result; +} +``` +  克隆å¤æ‚å¯å˜å¯¹è±¡çš„最åŽä¸€ç§æ–¹æ³•æ˜¯è°ƒç”¨ super.clone,将结果对象中的所有属性设置为其åˆå§‹çŠ¶æ€ï¼Œç„¶åŽè°ƒç”¨æ›´é«˜çº§åˆ«çš„方法æ¥é‡æ–°ç”ŸæˆåŽŸå§‹å¯¹è±¡çš„状æ€ã€‚ 以 HashTable 为例,bucket 属性将被åˆå§‹åŒ–为一个新的 bucket 数组,并且 put(key, value) 方法(未示出)被调用用于被克隆的哈希表中的键值映射。 è¿™ç§æ–¹æ³•é€šå¸¸äº§ç”Ÿä¸€ä¸ªç®€å•ï¼Œåˆç†çš„优雅 clone 方法,其è¿è¡Œé€Ÿåº¦ä¸å¦‚直接æ“纵克隆内部的方法快。 虽然这ç§æ–¹æ³•æ˜¯å¹²å‡€çš„,但它与整个 Cloneable 体系结构是对立的,因为它会盲目地é‡å†™æž„æˆä½“系结构基础的é€ä¸ªå±žæ€§å¯¹è±¡å¤åˆ¶ã€‚ + +  与构造方法一样,clone 方法ç»å¯¹ä¸å¯ä»¥åœ¨æž„建过程中,调用一个å¯ä»¥é‡å†™çš„方法(æ¡ç›® 19)。如果 clone 方法调用一个在å­ç±»ä¸­é‡å†™çš„方法,则在å­ç±»æœ‰æœºä¼šåœ¨å…‹éš†ä¸­ä¿®å¤å®ƒçš„状æ€ä¹‹å‰æ‰§è¡Œè¯¥æ–¹æ³•ï¼Œå¾ˆå¯èƒ½å¯¼è‡´å…‹éš†å’ŒåŽŸå§‹å¯¹è±¡çš„æŸå。因此,我们在å‰é¢è®¨è®ºçš„ put(key, value) 方法应该时 final 或 private 修饰的。(如果时 private ä¿®é¥°ï¼Œé‚£ä¹ˆå¤§æ¦‚æ˜¯ä¸€ä¸ªéž final 公共方法的辅助方法)。 + +  Object 类的 clone 方法被声明为抛出 CloneNotSupportedException 异常,但é‡å†™æ–¹æ³•æ—¶ä¸éœ€è¦ã€‚ 公共 clone 方法应该çœç•¥ throws å­å¥ï¼Œå› ä¸ºä¸æŠ›å‡ºæ£€æŸ¥æ—¶å¼‚常的方法更容易使用(æ¡ç›® 71)。 + +  在为继承设计一个类时(æ¡ç›® 19),通常有两ç§é€‰æ‹©ï¼Œä½†æ— è®ºé€‰æ‹©å“ªä¸€ç§ï¼Œéƒ½ä¸åº”该实现 Clonable 接å£ã€‚ä½ å¯ä»¥é€‰æ‹©é€šè¿‡å®žçŽ°æ­£ç¡®è¿è¡Œçš„å—ä¿æŠ¤çš„ clone 方法æ¥æ¨¡ä»¿ Object 的行为,该方法声明为抛出 CloneNotSupportedException 异常。 这给了å­ç±»å®žçŽ° Cloneable 接å£çš„自由,就åƒç›´æŽ¥ç»§æ‰¿ Object 一样。 或者,å¯ä»¥é€‰æ‹©ä¸å®žçŽ°å·¥ä½œçš„ clone 方法,并通过æ供以下简并 clone 实现æ¥é˜»æ­¢å­ç±»å®žçŽ°å®ƒï¼š +```Java +// clone method for extendable class not supporting Cloneable +@Override +protected final Object clone() throws CloneNotSupportedException { + throw new CloneNotSupportedException(); +} +``` +  还有一个值得注æ„的细节。 如果你编写一个实现了 Cloneable 的线程安全的类,记得它的 clone 方法必须和其他方法一样(æ¡ç›® 78)需è¦æ­£ç¡®çš„åŒæ­¥ã€‚ Object 类的 clone 方法是ä¸åŒæ­¥çš„,所以å³ä½¿å®ƒçš„实现是令人满æ„的,也å¯èƒ½éœ€è¦ç¼–写一个返回 super.clone() çš„åŒæ­¥ clone 方法。 + +  回顾一下,实现 Cloneable 的所有类应该é‡å†™å…¬å…± clone 方法,而这个方法的返回类型是类本身。 这个方法应该首先调用 super.clone,然åŽä¿®å¤ä»»ä½•éœ€è¦ä¿®å¤çš„属性。 通常,这æ„味ç€å¤åˆ¶ä»»ä½•åŒ…å«å†…部“深层结构â€çš„å¯å˜å¯¹è±¡ï¼Œå¹¶ç”¨æŒ‡å‘新对象的引用æ¥ä»£æ›¿åŽŸæ¥æŒ‡å‘这些对象的引用。虽然这些内部拷è´é€šå¸¸å¯ä»¥é€šè¿‡é€’归调用 clone æ¥å®žçŽ°ï¼Œä½†è¿™å¹¶ä¸æ€»æ˜¯æœ€å¥½çš„方法。 如果类åªåŒ…å«åŸºæœ¬ç±»åž‹æˆ–对ä¸å¯å˜å¯¹è±¡çš„引用,那么很å¯èƒ½æ˜¯æ²¡æœ‰å±žæ€§éœ€è¦ä¿®å¤çš„情况。 这个规则也有例外。 例如,表示åºåˆ—å·æˆ–其他唯一 ID 的属性å³ä½¿æ˜¯åŸºæœ¬ç±»åž‹çš„或ä¸å¯å˜çš„,也需è¦è¢«ä¿®æ­£ã€‚ + +  这么å¤æ‚是å¦çœŸçš„有必è¦ï¼Ÿå¾ˆå°‘。 如果你继承一个已ç»å®žçŽ°äº† Cloneable 接å£çš„类,你别无选择,åªèƒ½å®žçŽ°ä¸€ä¸ªè¡Œä¸ºè‰¯å¥½çš„ clone 方法。 å¦åˆ™ï¼Œé€šå¸¸ä½ æœ€å¥½æä¾›å¦ä¸€ç§å¯¹è±¡å¤åˆ¶æ–¹æ³•ã€‚ 对象å¤åˆ¶æ›´å¥½çš„方法是æ供一个å¤åˆ¶æž„造方法或å¤åˆ¶å·¥åŽ‚。 å¤åˆ¶æž„造方法接å—å‚数,其类型为包å«æ­¤æž„造方法的类,例如: +```Java +// Copy constructor +public Yum(Yum yum) { ... }; +``` +  å¤åˆ¶å·¥åŽ‚类似于å¤åˆ¶æž„造方法的é™æ€å·¥åŽ‚: +```Java +// Copy factory +public static Yum newInstance(Yum yum) { ... }; +``` +  å¤åˆ¶æž„造方法åŠå…¶é™æ€å·¥åŽ‚å˜ä½“与 Cloneable/clone 相比有许多优点:它们ä¸ä¾èµ–风险很大的语言外的对象创建机制;ä¸è¦æ±‚éµå®ˆé‚£äº›ä¸å¤ªæ˜Žç¡®çš„惯例;ä¸ä¼šä¸Ž final 属性的正确使用相冲çª; ä¸ä¼šæŠ›å‡ºä¸å¿…è¦çš„检查异常; 而且ä¸éœ€è¦ç±»åž‹è½¬æ¢ã€‚ + +  此外,å¤åˆ¶æž„造方法或å¤åˆ¶å·¥åŽ‚å¯ä»¥æŽ¥å—类型为该类实现的接å£çš„å‚数。 例如,按照惯例,所有通用集åˆå®žçŽ°éƒ½æ供了一个构造方法,其å‚数的类型为 Collection 或 Map。 基于接å£çš„å¤åˆ¶æž„造方法和å¤åˆ¶å·¥åŽ‚(更适当地称为转æ¢æž„造方法和转æ¢å·¥åŽ‚)å…许客户端选择å¤åˆ¶çš„实现类型,而ä¸æ˜¯å¼ºåˆ¶å®¢æˆ·ç«¯æŽ¥å—原始实现类型。 例如,å‡è®¾ä½ æœ‰ä¸€ä¸ª HashSet,并且你想把它å¤åˆ¶ä¸ºä¸€ä¸ª TreeSet。 clone 方法ä¸èƒ½æ供这ç§åŠŸèƒ½ï¼Œä½†ä½¿ç”¨è½¬æ¢æž„造方法很容易:`new TreeSet<>(s)`。 + +  考虑到与 Cloneable 接å£ç›¸å…³çš„所有问题,新的接å£ä¸åº”该继承它,新的å¯æ‰©å±•ç±»ä¸åº”该实现它。 虽然实现 Cloneable 接å£å¯¹äºŽ final 类没有什么å±å®³ï¼Œä½†åº”该将其视为性能优化的角度,仅在æžå°‘数情况下æ‰æ˜¯åˆç†çš„(æ¡ç›® 67)。 通常,å¤åˆ¶åŠŸèƒ½æœ€å¥½ç”±æž„造方法或工厂æ供。 这个规则的一个明显的例外是数组,它最好用 clone 方法å¤åˆ¶ã€‚ + + + + diff --git a/docs/notes/14. 考虑实现Comparable接å£.md b/docs/notes/14. 考虑实现Comparable接å£.md new file mode 100644 index 0000000..52f6b07 --- /dev/null +++ b/docs/notes/14. 考虑实现Comparable接å£.md @@ -0,0 +1,140 @@ +# 14. 考虑实现 Comparable æŽ¥å£ + +  与本章讨论的其他方法ä¸åŒï¼Œ`compareTo` 方法并没有在 `Object` 类中声明。 相å,它是 ``Comparable`` 接å£ä¸­çš„唯一方法。 它与 Object 类的 equals 方法在性质上是相似的,除了它å…许在简å•çš„相等比较之外的顺åºæ¯”较,它是泛型的。 通过实现 `Comparable` 接å£ï¼Œä¸€ä¸ªç±»è¡¨æ˜Žå®ƒçš„实例有一个自然顺åºï¼ˆ natural ordering)。 对实现 `Comparable` 接å£çš„对象数组排åºéžå¸¸ç®€å•ï¼Œå¦‚下所示: + +```Java +Arrays.sort(a); +``` + +  它很容易查找,计算æžç«¯æ•°å€¼ï¼Œä»¥åŠç»´æŠ¤ `Comparable` 对象集åˆçš„自动排åºã€‚例如,在下é¢çš„代ç ä¸­ï¼Œä¾èµ–于 String 类实现了 `Comparable` 接å£ï¼ŒåŽ»é™¤å‘½ä»¤è¡Œå‚数输入é‡å¤çš„字符串,并按照字æ¯é¡ºåºæŽ’åºï¼š + +```Java +public class WordList { + + public static void main(String[] args) { + Set s = new TreeSet<>(); + Collections.addAll(s, args); + System.out.println(s); + } +} +``` +  通过实现 `Comparable` 接å£ï¼Œå¯ä»¥è®©ä½ çš„类与所有ä¾èµ–此接å£çš„通用算法和集åˆå®žçŽ°è¿›è¡Œäº’æ“作。 åªéœ€å°‘é‡çš„努力就å¯ä»¥èŽ·å¾—巨大的能é‡ã€‚ 几乎 Java å¹³å°ç±»åº“中的所有值类以åŠæ‰€æœ‰æžšä¸¾ç±»åž‹ï¼ˆæ¡ç›® 34)都实现了 `Comparable` 接å£ã€‚ 如果你正在编写具有明显自然顺åºï¼ˆå¦‚å­—æ¯é¡ºåºï¼Œæ•°å­—顺åºæˆ–时间顺åºï¼‰çš„值类,则应该实现 `Comparable` 接å£ï¼š +```Java +public interface Comparable { + int compareTo(T t); +} +``` +  `compareTo` 方法的通用约定与 `equals` 相似: + +  将此对象与指定的对象按照排åºè¿›è¡Œæ¯”较。 返回值å¯èƒ½ä¸ºè´Ÿæ•´æ•°ï¼Œé›¶æˆ–正整数,因为此对象对应å°äºŽï¼Œç­‰äºŽæˆ–大于指定的对象。 如果指定对象的类型与此对象ä¸èƒ½è¿›è¡Œæ¯”è¾ƒï¼Œåˆ™å¼•å‘ `ClassCastException` 异常。 + +  下é¢çš„æè¿°ä¸­ï¼Œç¬¦å· sgn(expression) 表示数学中的 signum 函数,它根æ®è¡¨è¾¾å¼çš„值为负数ã€é›¶ã€æ­£æ•°ï¼Œå¯¹åº”返回-1ã€0 å’Œ 1。 + + - 实现类必须确ä¿æ‰€æœ‰ `x` å’Œ `y` 都满足 `sgn(x.compareTo(y)) == -sgn(y. compareTo(x))`。 (这æ„味ç€å½“且仅当 `y.compareTo(x)` 抛出异常时,`x.compareTo(y)` 必须抛出异常。) + - 实现类还必须确ä¿è¯¥å…³ç³»æ˜¯å¯ä¼ é€’的:`(x. compareTo(y) > 0 && y.compareTo(z) > 0)` æ„å‘³ç€ `x.compareTo(z) > 0`。 + - 最åŽï¼Œå¯¹äºŽæ‰€æœ‰çš„ zï¼Œå®žçŽ°ç±»å¿…é¡»ç¡®ä¿ `x.compareTo(y) == 0` æ„å‘³ç€ `sgn(x.compareTo(z)) == sgn(y.compareTo(z))`。 + - 强烈推è `x.compareTo(y) == 0) == (x.equals(y))`,但ä¸æ˜¯å¿…需的。 一般æ¥è¯´ï¼Œä»»ä½•å®žçŽ°äº† `Comparable` 接å£çš„ç±»è¿å了这个æ¡ä»¶éƒ½åº”该清楚地说明这个事实。 推è的语言是“注æ„:这个类有一个自然顺åºï¼Œä¸Ž `equals` ä¸ä¸€è‡´â€ã€‚ + +  与 `equals` 方法一样,ä¸è¦è¢«ä¸Šè¿°çº¦å®šçš„数学特性所退缩。这个约定并ä¸åƒçœ‹èµ·æ¥é‚£ä¹ˆå¤æ‚。 与 `equals` 方法ä¸åŒï¼Œ`equals` 方法在所有对象上施加了全局等价关系,`compareTo` ä¸å¿…跨越ä¸åŒç±»åž‹çš„对象:当é‡åˆ°ä¸åŒç±»åž‹çš„对象时,`compareTo` 被å…许抛出 `ClassCastException` 异常。 通常,这正是它所åšçš„。 约定确实å…许进行ä¸åŒç±»åž‹é—´æ¯”较,这ç§æ¯”较通常在由被比较的对象实现的接å£ä¸­å®šä¹‰ã€‚ + +  正如一个è¿å hashCode 约定的类å¯èƒ½ä¼šç ´åä¾èµ–于哈希的其他类一样,è¿å `compareTo` 约定的类å¯èƒ½ä¼šç ´åä¾èµ–于比较的其他类。 ä¾èµ–于比较的类,包括排åºåŽçš„é›†åˆ `TreeSet` å’Œ TreeMap 类,以åŠåŒ…å«æœç´¢å’ŒæŽ’åºç®—法的实用程åºç±» `Collections` å’Œ `Arrays`。 + +  我们æ¥çœ‹çœ‹ `compareTo` 约定的规定。 第一æ¡è§„定,如果å转两个对象引用之间的比较方å‘,则会å‘生预期的事情:如果第一个对象å°äºŽç¬¬äºŒä¸ªå¯¹è±¡ï¼Œé‚£ä¹ˆç¬¬äºŒä¸ªå¯¹è±¡å¿…须大于第一个; 如果第一个对象等于第二个,那么第二个对象必须等于第一个; 如果第一个对象大于第二个,那么第二个必须å°äºŽç¬¬ä¸€ä¸ªã€‚ 第二项约定说,如果一个对象大于第二个对象,而第二个对象大于第三个对象,则第一个对象必须大于第三个对象。 最åŽä¸€æ¡è§„定,所有比较相等的对象与任何其他对象相比,都必须得到相åŒçš„结果。 + +  这三æ¡è§„定的一个结果是,`compareTo` 方法所实施的平等测试必须éµå®ˆ equals 方法约定所施加的相åŒé™åˆ¶ï¼šè‡ªå性,对称性和传递性。 因此,åŒæ ·éœ€è¦æ³¨æ„的是:除éžä½ æ„¿æ„放弃é¢å‘对象抽象(æ¡ç›® 10)的好处,å¦åˆ™æ— æ³•åœ¨ä¿ç•™ `compareTo` 约定的情况下使用新的值组件继承å¯å®žä¾‹åŒ–的类。 åŒæ ·çš„解决方法也适用。 如果è¦å°†å€¼ç»„件添加到实现 `Comparable` 的类中,请ä¸è¦ç»§æ‰¿å®ƒï¼›ç¼–写一个包å«ç¬¬ä¸€ä¸ªç±»å®žä¾‹çš„ä¸ç›¸å…³çš„类。 然åŽæ供一个返回包å«å®žä¾‹çš„“视图â€æ–¹æ³•ã€‚ 这使你å¯ä»¥åœ¨åŒ…å«ç±»ä¸Šå®žçŽ°ä»»ä½• `compareTo` 方法,åŒæ—¶å®¢æˆ·ç«¯åœ¨éœ€è¦æ—¶ï¼ŒæŠŠåŒ…å«ç±»çš„实例视åŒä»¥ä¸€ä¸ªç±»çš„实例。 + +  `compareTo` 约定的最åŽä¸€æ®µæ˜¯ä¸€ä¸ªå¼ºçƒˆçš„建议,而ä¸æ˜¯ä¸€ä¸ªçœŸæ­£çš„è¦æ±‚,åªæ˜¯å£°æ˜Ž `compareTo` 方法施加的相等性测试,通常应该返回与 `equals` 方法相åŒçš„结果。 如果éµå®ˆè¿™ä¸ªçº¦å®šï¼Œåˆ™ `compareTo` 方法施加的顺åºè¢«è®¤ä¸ºä¸Ž `equals` 相一致。 如果è¿å,顺åºå…³ç³»è¢«è®¤ä¸ºä¸Ž `equals` ä¸ä¸€è‡´ã€‚ å…¶ `compareTo` 方法施加与 `equals` ä¸ä¸€è‡´é¡ºåºå…³ç³»çš„ç±»ä»ç„¶æœ‰æ•ˆï¼Œä½†åŒ…å«è¯¥ç±»å…ƒç´ çš„有åºé›†åˆå¯èƒ½ä¸æœä»Žç›¸åº”集åˆæŽ¥å£ï¼ˆCollection,Set 或 Map)的一般约定。 这是因为这些接å£çš„通用约定是用 `equals` 方法定义的,但是排åºåŽçš„集åˆä½¿ç”¨ `compareTo` 强加的相等性测试æ¥ä»£æ›¿ `equals`。 如果å‘生这ç§æƒ…况,虽然ä¸æ˜¯ä¸€åœºç¾éš¾ï¼Œä½†ä»æ˜¯ä¸€ä»¶å€¼å¾—注æ„的事情。 + +  例如,考虑 `BigDecimal` 类,其 `compareTo` 方法与 `equals` ä¸ä¸€è‡´ã€‚ 如果你创建一个空的 HashSet 实例,然åŽæ·»åŠ  `new BigDecimal("1.0")` å’Œ `new BigDecimal("1.00")`,则该集åˆå°†åŒ…å«ä¸¤ä¸ªå…ƒç´ ï¼Œå› ä¸ºä¸Ž `equals` 方法进行比较时,添加到集åˆçš„两个 `BigDecimal` 实例是ä¸ç›¸ç­‰çš„。 但是,如果使用 `TreeSet` 而ä¸æ˜¯ `HashSet` 执行相åŒçš„过程,则该集åˆå°†åªåŒ…å«ä¸€ä¸ªå…ƒç´ ï¼Œå› ä¸ºä½¿ç”¨ `compareTo` 方法进行比较时,两个 BigDecimal 实例是相等的。 (有关详细信æ¯ï¼Œè¯·å‚阅 BigDecimal 文档。) + +  编写 `compareTo` 方法与编写 `equals` 方法类似,但是有一些关键的区别。 因为 `Comparable` 接å£æ˜¯å‚数化的,`compareTo` 方法是é™æ€ç±»åž‹çš„,所以你ä¸éœ€è¦è¾“入检查或者转æ¢å®ƒçš„å‚数。 如果å‚数是错误的类型,那么调用将ä¸ä¼šç¼–译。 如果å‚数为 null,则调用应该抛出一个 `NullPointerException` 异常,并且一旦该方法å°è¯•è®¿é—®å…¶æˆå‘˜ï¼Œå®ƒå°±ä¼šç«‹å³æŠ›å‡ºè¿™ä¸ªå¼‚常。 + +  在 `compareTo` 方法中,比较属性的顺åºè€Œä¸æ˜¯ç›¸ç­‰ã€‚ è¦æ¯”较对象引用属性,请递归调用 `compareTo` 方法。 如果一个属性没有实现 Comparable,或者你需è¦ä¸€ä¸ªéžæ ‡å‡†çš„顺åºï¼Œé‚£ä¹ˆä½¿ç”¨ `Comparator` 接å£ã€‚ å¯ä»¥ç¼–写自己的比较器或使用现有的比较器,如在æ¡ç›® 10 中的 `CaseInsensitiveString` 类的 `compareTo` 方法中: + +```Java +// Single-field Comparable with object reference field +public final class CaseInsensitiveString + implements Comparable { + public int compareTo(CaseInsensitiveString cis) { + return String.CASE_INSENSITIVE_[ORDER.compare(s](http://ORDER.compare(s), cis.s); + } + ... // Remainder omitted +} +``` + +  请注æ„,`CaseInsensitiveString` 类实现了 `Comparable` 接å£ã€‚ è¿™æ„å‘³ç€ `CaseInsensitiveString` 引用åªèƒ½ä¸Žå¦ä¸€ä¸ª `CaseInsensitiveString` 引用进行比较。 当声明一个类æ¥å®žçŽ° `Comparable` 接å£æ—¶ï¼Œè¿™æ˜¯æ­£å¸¸æ¨¡å¼ã€‚ + +  在本书第二版中,曾ç»æŽ¨è如果比较整型基本类型的属性,使用关系è¿ç®—符“<†和 “>â€ï¼Œå¯¹äºŽæµ®ç‚¹ç±»åž‹åŸºæœ¬ç±»åž‹çš„属性,使用 `Double.compare` å’Œ `Float.compare` é™æ€æ–¹æ³•ã€‚在 Java 7 中,é™æ€æ¯”较方法被添加到 Java 的所有包装类中。 在 `compareTo` 方法中使用关系è¿ç®—符“<†和“>â€æ˜¯å†—长且容易出错的,ä¸å†æŽ¨è。 + +  如果一个类有多个é‡è¦çš„属性,那么比较他们的顺åºæ˜¯è‡³å…³é‡è¦çš„。 从最é‡è¦çš„属性开始,é€æ­¥æ¯”较所有的é‡è¦å±žæ€§ã€‚ 如果比较结果ä¸æ˜¯é›¶ï¼ˆé›¶è¡¨ç¤ºç›¸ç­‰ï¼‰ï¼Œåˆ™è¡¨ç¤ºæ¯”较完æˆ; åªæ˜¯è¿”回结果。 如果最é‡è¦çš„字段是相等的,比较下一个é‡è¦çš„属性,ä¾æ­¤ç±»æŽ¨ï¼Œç›´åˆ°æ‰¾åˆ°ä¸ç›¸ç­‰çš„属性或比较剩余ä¸é‚£ä¹ˆé‡è¦çš„属性。 以下是æ¡ç›® 11 中 `PhoneNumber` 类的 `compareTo` 方法,演示了这ç§æ–¹æ³•ï¼š + +```Java +// Multiple-field `Comparable` with primitive fields +public int compareTo(PhoneNumber pn) { + int result = [Short.compare(areaCode](http://Short.compare(areaCode), pn.areaCode); + if (result == 0) { + result = [Short.compare(prefix](http://Short.compare(prefix), pn.prefix); + if (result == 0) + result = [Short.compare(lineNum](http://Short.compare(lineNum), pn.lineNum); + } + return result; +} +``` + +  在 Java 8 中 `Comparator` 接å£æ供了一系列比较器方法,å¯ä»¥ä½¿æ¯”较器æµç•…地构建。 这些比较器å¯ä»¥ç”¨æ¥å®žçŽ° `compareTo` æ–¹æ³•ï¼Œå°±åƒ `Comparable` 接å£æ‰€è¦æ±‚的那样。 许多程åºå‘˜æ›´å–œæ¬¢è¿™ç§æ–¹æ³•çš„简æ´æ€§ï¼Œå°½ç®¡å®ƒçš„性能并ä¸å‡ºä¼—ï¼šåœ¨æˆ‘çš„æœºå™¨ä¸ŠæŽ’åº PhoneNumber 实例的数组速度慢了大约 10%。 在使用这ç§æ–¹æ³•æ—¶ï¼Œè€ƒè™‘使用 Java çš„é™æ€å¯¼å…¥ï¼Œä»¥ä¾¿å¯ä»¥é€šè¿‡å…¶ç®€å•å称æ¥å¼•ç”¨æ¯”较器é™æ€æ–¹æ³•ï¼Œä»¥ä½¿å…¶æ¸…晰简æ´ã€‚ 以下是 PhoneNumber çš„ `compareTo` 方法的使用方法: + +```Java +// Comparable with comparator construction methods +private static final Comparator COMPARATOR = + comparingInt((PhoneNumber pn) -> pn.areaCode) + .thenComparingInt(pn -> pn.prefix) + .thenComparingInt(pn -> pn.lineNum); + +public int compareTo(PhoneNumber pn) { + return COMPARATOR.compare(this, pn); +} +``` + +  此实现在类åˆå§‹åŒ–时构建比较器,使用两个比较器构建方法。第一个是 `comparingInt` 方法。它是一个é™æ€æ–¹æ³•ï¼Œå®ƒä½¿ç”¨ä¸€ä¸ªé”®æå–器函数å¼æŽ¥å£ï¼ˆ key extractor function)作为å‚数,将对象引用映射为 int 类型的键,并返回一个根æ®è¯¥é”®æŽ’åºçš„实例的比较器。在å‰é¢çš„示例中,`comparingInt` 方法使用 lambda 表达å¼ï¼Œå®ƒä»Ž `PhoneNumber` 中æå–区域代ç ï¼Œå¹¶è¿”回一个 `Comparator`,根æ®å®ƒä»¬çš„区域代ç æ¥æŽ’åºç”µè¯å·ç ã€‚注æ„,lambda 表达å¼æ˜¾å¼æŒ‡å®šäº†å…¶è¾“å…¥å‚数的类型 (PhoneNumber pn)。事实è¯æ˜Žï¼Œåœ¨è¿™ç§æƒ…况下,Java 的类型推断功能ä¸å¤Ÿå¼ºå¤§ï¼Œæ— æ³•è‡ªè¡Œåˆ¤æ–­ç±»åž‹ï¼Œå› æ­¤æˆ‘们ä¸å¾—ä¸å¸®åŠ©å®ƒä»¥ä½¿ç¨‹åºç¼–译。 + +  如果两个电è¯å·ç å®žä¾‹å…·æœ‰ç›¸åŒçš„区å·ï¼Œåˆ™éœ€è¦è¿›ä¸€æ­¥ç»†åŒ–æ¯”è¾ƒï¼Œè¿™æ­£æ˜¯ç¬¬äºŒä¸ªæ¯”è¾ƒå™¨æž„å»ºæ–¹æ³•ï¼Œå³ `thenComparingInt` 方法åšçš„。 它是 `Comparator` 上的一个实例方法,接å—一个 int 类型键æå–器函数å¼æŽ¥å£ï¼ˆ key extractor function)作为å‚数,并返回一个比较器,该比较器首先应用原始比较器,然åŽä½¿ç”¨æå–çš„é”®æ¥æ‰“破连接。 ä½ å¯ä»¥æŒ‰ç…§å–œæ¬¢çš„æ–¹å¼å¤šæ¬¡è°ƒç”¨ `thenComparingInt` 方法,从而产生一个字典顺åºã€‚ 在上é¢çš„例å­ä¸­ï¼Œæˆ‘们将两个调用å åŠ åˆ° `thenComparingInt`,产生一个排åºï¼Œå®ƒçš„二级键是 prefix,而其三级键是 lineNum。 请注æ„,我们ä¸å¿…指定传递给 `thenComparingInt` 的任何一个调用的键æå–器函数å¼æŽ¥å£çš„å‚数类型:Java 的类型推断足够èªæ˜Žï¼Œå¯ä»¥è‡ªå·±æŽ¨æ–­å‡ºå‚数的类型。 + +  `Comparator` 类具有完整的构建方法。对于 long å’Œ double 基本类型,也有对应的类似于 comparingInt å’Œ `thenComparingInt` 的方法,int 版本的方法也å¯ä»¥åº”用于å–值范围å°äºŽ int 的类型上,如 short 类型,如 PhoneNumber 实例中所示。对于 double 版本的方法也å¯ä»¥ç”¨åœ¨ float 类型上。这æ供了所有 Java 的基本数字类型的覆盖。 + +  也有对象引用类型的比较器构建方法。é™æ€æ–¹æ³• `comparing` 有两个é‡è½½æ–¹å¼ã€‚第一个方法使用键æå–器函数å¼æŽ¥å£å¹¶æŒ‰é”®çš„自然顺åºã€‚第二ç§æ–¹æ³•æ˜¯é”®æå–器函数å¼æŽ¥å£å’Œæ¯”较器,用于键的排åºã€‚`thenComparing` 方法有三ç§é‡è½½ã€‚第一个é‡è½½åªéœ€è¦ä¸€ä¸ªæ¯”较器,并使用它æ¥æ供一个二级排åºã€‚第二次é‡è½½åªéœ€è¦ä¸€ä¸ªé”®æå–器函数å¼æŽ¥å£ï¼Œå¹¶ä½¿ç”¨é”®çš„自然顺åºä½œä¸ºäºŒçº§æŽ’åºã€‚最åŽçš„é‡è½½æ–¹æ³•åŒæ—¶ä½¿ç”¨ä¸€ä¸ªé”®æå–器函数å¼æŽ¥å£å’Œä¸€ä¸ªæ¯”较器æ¥ç”¨åœ¨æå–的键上。 + +  有时,你å¯èƒ½ä¼šçœ‹åˆ° `compareTo` 或 `compare` 方法ä¾èµ–于两个值之间的差值,如果第一个值å°äºŽç¬¬äºŒä¸ªå€¼ï¼Œåˆ™ä¸ºè´Ÿï¼›å¦‚果两个值相等则为零,如果第一个值大于,则为正值。这是一个例å­ï¼š + +```Java +// BROKEN difference-based comparator - violates transitivity! + +static Comparator hashCodeOrder = new Comparator<>() { + public int compare(Object o1, Object o2) { + return o1.hashCode() - o2.hashCode(); + } +}; +``` + +  ä¸è¦ä½¿ç”¨è¿™ç§æŠ€æœ¯ï¼å®ƒå¯èƒ½ä¼šå¯¼è‡´æ•´æ•°æœ€å¤§é•¿åº¦æº¢å‡ºå’Œ IEEE 754 浮点è¿ç®—失真的å±é™©[JLS 15.20.1,15.21.1]。 此外,由此产生的方法ä¸å¯èƒ½æ¯”使用上述技术编写的方法快得多。 使用é™æ€ `compare` 方法: + +```Java +// Comparator based on static compare method +static Comparator hashCodeOrder = new Comparator<>() { + public int compare(Object o1, Object o2) { + return Integer.compare(o1.hashCode(), o2.hashCode()); + } +}; +``` + +  或者使用 `Comparator` 的构建方法: + +```Java +// Comparator based on Comparator construction method +static Comparator hashCodeOrder = + Comparator.comparingInt(o -> o.hashCode()); +``` + +  总而言之,无论何时实现具有åˆç†æŽ’åºçš„值类,你都应该让该类实现 `Comparable` 接å£ï¼Œä»¥ä¾¿åœ¨åŸºäºŽæ¯”较的集åˆä¸­è½»æ¾å¯¹å…¶å®žä¾‹è¿›è¡ŒæŽ’åºï¼Œæœç´¢å’Œä½¿ç”¨ã€‚ 比较 `compareTo` 方法的实现中的字段值时,请é¿å…使用"<"å’Œ">"è¿ç®—符。 相å,使用包装类中的é™æ€ `compare` 方法或 `Comparator` 接å£ä¸­çš„构建方法。 + + + diff --git a/docs/notes/15. 使类和æˆå‘˜çš„å¯è®¿é—®æ€§æœ€å°åŒ–.md b/docs/notes/15. 使类和æˆå‘˜çš„å¯è®¿é—®æ€§æœ€å°åŒ–.md new file mode 100644 index 0000000..1734ded --- /dev/null +++ b/docs/notes/15. 使类和æˆå‘˜çš„å¯è®¿é—®æ€§æœ€å°åŒ–.md @@ -0,0 +1,69 @@ +# 15. 使类和æˆå‘˜çš„å¯è®¿é—®æ€§æœ€å°åŒ– + +  将设计良好的组件与设计ä¸ä½³çš„组件区分开æ¥çš„最é‡è¦çš„因素是,组件将其内部数æ®å’Œå…¶ä»–组件的其他实现细节éšè—èµ·æ¥ã€‚一个设计良好的组件éšè—了它的所有实现细节,干净地将它的 API 与它的实现分离开æ¥ã€‚然åŽï¼Œç»„件åªé€šè¿‡å®ƒä»¬çš„ API 进行通信,并且对彼此的内部工作一无所知。这一概念,被称为信æ¯éšè—或å°è£…,是软件设计的基本原则[Parnas72]。 + +  信æ¯éšè—很é‡è¦æœ‰å¾ˆå¤šåŽŸå› ï¼Œå…¶ä¸­å¤§éƒ¨åˆ†æ¥æºäºŽå®ƒå°†ç»„æˆç³»ç»Ÿçš„组件分离开æ¥ï¼Œå…许它们被独立地开å‘,测试,优化,使用,ç†è§£å’Œä¿®æ”¹ã€‚这加速了系统开å‘,因为组件å¯ä»¥å¹¶è¡Œå¼€å‘。它å‡è½»äº†ç»´æŠ¤çš„负担,因为å¯ä»¥æ›´å¿«é€Ÿåœ°ç†è§£ç»„件,调试或更æ¢ç»„件,而ä¸ç”¨æ‹…心æŸå®³å…¶ä»–组件。虽然信æ¯éšè—本身并ä¸ä¼šå¯¼è‡´è‰¯å¥½çš„性能,但它å¯ä»¥æœ‰æ•ˆåœ°è¿›è¡Œæ€§èƒ½è°ƒæ•´ï¼šä¸€æ—¦ç³»ç»Ÿå®Œæˆå¹¶ä¸”分æžç¡®å®šäº†å“ªäº›ç»„件导致了性能问题(æ¡ç›® 67),则å¯ä»¥ä¼˜åŒ–这些组件,而ä¸ä¼šå½±å“别人的正确的组件。信æ¯éšè—增加了软件é‡ç”¨ï¼Œå› ä¸ºæ¾è€¦åˆçš„组件通常在除开å‘它们之外的其他环境中è¯æ˜Žæ˜¯æœ‰ç”¨çš„。最åŽï¼Œéšè—ä¿¡æ¯é™ä½Žäº†æž„建大型系统的风险,因为å³ä½¿ç³»ç»Ÿä¸èƒ½è¿è¡Œï¼Œå„个独立的组件也å¯èƒ½æ˜¯å¯ç”¨çš„。 + +  Java æ供了许多机制æ¥å¸®åŠ©ä¿¡æ¯éšè—。 访问控制机制(access control mechanism)[JLS,6.6] 指定了类,接å£å’Œæˆå‘˜çš„å¯è®¿é—®æ€§ã€‚ 实体的å¯è®¿é—®æ€§å–决于其声明的ä½ç½®ï¼Œä»¥åŠå£°æ˜Žä¸­å­˜åœ¨å“ªäº›è®¿é—®ä¿®é¥°ç¬¦ï¼ˆprivate,protected å’Œ public)。 正确使用这些修饰符对信æ¯éšè—至关é‡è¦ã€‚ + +  ç»éªŒæ³•åˆ™å¾ˆç®€å•ï¼š**让æ¯ä¸ªç±»æˆ–æˆå‘˜å°½å¯èƒ½åœ°ä¸å¯è®¿é—®ã€‚** æ¢å¥è¯è¯´ï¼Œä½¿ç”¨å°½å¯èƒ½ä½Žçš„访问级别,与你正在编写的软件的对应功能ä¿æŒä¸€è‡´ã€‚ + +  对于顶层 (éžåµŒå¥—çš„) 类和接å£ï¼Œåªæœ‰ä¸¤ä¸ªå¯èƒ½çš„访问级别:包级ç§æœ‰ï¼ˆpackage-private)和公共的(public)。如果你使用 public 修饰符声明顶级类或接å£ï¼Œé‚£ä¹ˆå®ƒæ˜¯å…¬å¼€çš„ï¼›å¦åˆ™ï¼Œå®ƒæ˜¯åŒ…级ç§æœ‰çš„。如果一个顶层类或接å£å¯ä»¥è¢«åšä¸ºåŒ…级ç§æœ‰ï¼Œé‚£ä¹ˆå®ƒåº”该是。通过将其设置为包级ç§æœ‰ï¼Œå¯ä»¥å°†å…¶ä½œä¸ºå®žçŽ°çš„一部分,而ä¸æ˜¯å¯¼å‡ºçš„ API,你å¯ä»¥ä¿®æ”¹å®ƒã€æ›¿æ¢å®ƒï¼Œæˆ–者在åŽç»­ç‰ˆæœ¬ä¸­æ¶ˆé™¤å®ƒï¼Œè€Œä¸å¿…担心æŸå®³çŽ°æœ‰çš„客户端。如果你把它公开,你就有义务永远地支æŒå®ƒï¼Œä»¥ä¿æŒå…¼å®¹æ€§ã€‚ + +  如果一个包级ç§æœ‰é¡¶çº§ç±»æˆ–接å£åªè¢«ä¸€ä¸ªç±»ä½¿ç”¨ï¼Œé‚£ä¹ˆå¯ä»¥è€ƒè™‘这个类作为使用它的唯一类的ç§æœ‰é™æ€åµŒå¥—ç±» (æ¡ç›® 24)。这将它的å¯è®¿é—®æ€§ä»ŽåŒ…级的所有类å‡å°‘到使用它的一个类。但是,å‡å°‘ä¸å¿…è¦çš„公共类的å¯è®¿é—®æ€§è¦æ¯”包级ç§æœ‰çš„顶级类更é‡è¦ï¼šå…¬å…±ç±»æ˜¯åŒ…çš„ API 的一部分,而包级ç§æœ‰çš„顶级类已ç»æ˜¯è¿™ä¸ªåŒ…实现的一部分了。 + +  对于æˆå‘˜ (属性ã€æ–¹æ³•ã€åµŒå¥—类和嵌套接å£),有四ç§å¯èƒ½çš„访问级别,在这里,按照å¯è®¿é—®æ€§ä»Žå°åˆ°å¤§åˆ—出: + + - private——该æˆå‘˜åªèƒ½åœ¨å£°æ˜Žå®ƒçš„顶级类内访问。 + - package-private——æˆå‘˜å¯ä»¥ä»Žè¢«å£°æ˜Žçš„包中的任何类中访问。从技术上讲,如果没有指定访问修饰符 (接å£æˆå‘˜é™¤å¤–,它默认是公共的),这是默认访问级别。 + - protected——æˆå‘˜å¯ä»¥ä»Žè¢«å£°æ˜Žçš„类的å­ç±»ä¸­è®¿é—® (å—一些é™åˆ¶ï¼ŒJLS,6.6.2),以åŠå®ƒå£°æ˜Žçš„包中的任何类。 + - public——该æˆå‘˜å¯ä»¥ä»Žä»»ä½•åœ°æ–¹è¢«è®¿é—®ã€‚ + +  在仔细设计你的类的公共 API 之åŽï¼Œä½ çš„å应应该是让所有其他æˆå‘˜è®¾è®¡ä¸ºç§æœ‰çš„。 åªæœ‰å½“åŒä¸€ä¸ªåŒ…中的其他类真的需è¦è®¿é—®æˆå‘˜æ—¶ï¼Œéœ€è¦åˆ é™¤ç§æœ‰ä¿®é¥°ç¬¦ï¼Œä»Žè€Œä½¿æˆå‘˜åŒ…æˆä¸ºåŒ…级ç§æœ‰çš„。 如果你å‘现自己ç»å¸¸è¿™æ ·åšï¼Œä½ åº”该é‡æ–°æ£€æŸ¥ä½ çš„系统的设计,看看å¦ä¸€ä¸ªåˆ†è§£å¯èƒ½äº§ç”Ÿæ›´å¥½çš„解耦的类。 也就是说,ç§æœ‰æˆå‘˜å’ŒåŒ…级ç§æœ‰æˆå‘˜éƒ½æ˜¯ç±»å®žçŽ°çš„一部分,通常ä¸ä¼šå½±å“其导出的 API。 但是,如果类实现 Serializable 接å£ï¼ˆæ¡ç›® 86 å’Œ 87),则这些属性å¯ä»¥â€œæ³„æ¼ï¼ˆleak)â€åˆ°å¯¼å‡ºçš„ API 中。 + +  对于公共类的æˆå‘˜ï¼Œå½“访问级别从包ç§æœ‰åˆ°å—ä¿æŠ¤çº§æ—¶ï¼Œå¯è®¿é—®æ€§ä¼šå¤§å¤§å¢žåŠ ã€‚ å—ä¿æŠ¤ï¼ˆprotected)的æˆå‘˜æ˜¯ç±»å¯¼å‡ºçš„ API 的一部分,并且必须永远支æŒã€‚ 此外,导出类的å—ä¿æŠ¤æˆå‘˜è¡¨ç¤ºå¯¹å®žçŽ°ç»†èŠ‚的公开承诺(æ¡ç›® 19)。 对å—ä¿æŠ¤æˆå‘˜çš„需求应该相对较少。 + +  有一个关键的规则é™åˆ¶äº†ä½ å‡å°‘方法访问性的能力。 如果一个方法é‡å†™ä¸€ä¸ªè¶…类方法,那么它在å­ç±»ä¸­çš„访问级别就ä¸èƒ½ä½ŽäºŽçˆ¶ç±»ä¸­çš„访问级别[JLS,8.4.8.3]。 这对于确ä¿å­ç±»çš„实例在父类的实例å¯ç”¨çš„地方是å¯ç”¨çš„(Liskov 替æ¢åŽŸåˆ™ï¼Œè§æ¡ç›® 15)是必è¦çš„。 如果è¿å此规则,编译器将在å°è¯•ç¼–译å­ç±»æ—¶ç”Ÿæˆé”™è¯¯æ¶ˆæ¯ã€‚ 这个规则的一个特例是,如果一个类实现了一个接å£ï¼Œé‚£ä¹ˆæŽ¥å£ä¸­çš„所有类方法都必须在该类中声明为 public。 + +  为了便于测试你的代ç ï¼Œä½ å¯èƒ½ä¼šæƒ³è¦è®©ä¸€ä¸ªç±»ï¼ŒæŽ¥å£æˆ–者æˆå‘˜æ›´å®¹æ˜“被访问。 这没问题。 为了测试将公共类的ç§æœ‰æˆå‘˜æŒ‡å®šä¸ºåŒ…级ç§æœ‰æ˜¯å¯ä»¥æŽ¥å—的,但是æ高到更高的访问级别å´æ˜¯ä¸å¯æŽ¥å—的。 æ¢å¥è¯è¯´ï¼Œå°†ç±»ï¼ŒæŽ¥å£æˆ–æˆå‘˜ä½œä¸ºåŒ…级导出的 API 的一部分æ¥ä¿ƒè¿›æµ‹è¯•æ˜¯ä¸å¯æŽ¥å—的。 幸è¿çš„是,这ä¸æ˜¯å¿…须的,因为测试å¯ä»¥ä½œä¸ºè¢«æµ‹è¯•åŒ…的一部分è¿è¡Œï¼Œä»Žè€ŒèŽ·å¾—对包ç§æœ‰å…ƒç´ çš„访问。 + +  **公共类的实例属性很少公开 (æ¡ç›® 16)。** å¦‚æžœä¸€ä¸ªå®žä¾‹å±žæ€§æ˜¯éž final 的,或者是对å¯å˜å¯¹è±¡çš„引用,那么通过将其公开,你就放弃了é™åˆ¶å¯ä»¥å­˜å‚¨åœ¨å±žæ€§ä¸­çš„值的能力。这æ„味ç€ä½ æ”¾å¼ƒäº†æ‰§è¡Œæ¶‰åŠè¯¥å±žæ€§çš„ä¸å˜é‡çš„能力。å¦å¤–,当属性被修改时,就放弃了采å–任何æ“作的能力,**因此公共å¯å˜å±žæ€§çš„类通常ä¸æ˜¯çº¿ç¨‹å®‰å…¨çš„** 。å³ä½¿å±žæ€§æ˜¯ final 的,并且引用了一个ä¸å¯å˜çš„对象,通过使它公开,你就放弃切æ¢åˆ°ä¸å­˜åœ¨å±žæ€§çš„新的内部数æ®è¡¨ç¤ºçš„çµæ´»æ€§ã€‚ + +  åŒæ ·çš„建议适用于é™æ€å±žæ€§ï¼Œä½†æœ‰ä¸€ä¸ªä¾‹å¤–。 å‡è®¾å¸¸é‡æ˜¯ç±»çš„抽象的一个组æˆéƒ¨åˆ†ï¼Œä½ å¯ä»¥é€šè¿‡ public static final 属性暴露常é‡ã€‚ 按照惯例,这些属性的å字由大写字æ¯ç»„æˆï¼Œå­—æ¯ç”¨ä¸‹åˆ’线分隔(æ¡ç›® 68)。 很é‡è¦çš„一点是,这些属性包å«åŸºæœ¬ç±»åž‹çš„值或对ä¸å¯å˜å¯¹è±¡çš„引用(æ¡ç›® 17)。 包å«å¯¹å¯å˜å¯¹è±¡çš„å¼•ç”¨çš„å±žæ€§å…·æœ‰éž final 属性的所有缺点。 虽然引用ä¸èƒ½è¢«ä¿®æ”¹ï¼Œä½†å¼•ç”¨çš„对象å¯ä»¥è¢«ä¿®æ”¹ï¼Œå¹¶ä¼šå¸¦æ¥ç¾éš¾æ€§çš„结果。 + +  请注æ„,éžé›¶é•¿åº¦çš„数组总是å¯å˜çš„,**所以类具有公共é™æ€ final 数组属性,或返回这样一个属性的访问器是错误的。** 如果一个类有这样的属性或访问方法,客户端将能够修改数组的内容。 这是安全æ¼æ´žçš„常è§æ¥æºï¼š + +```Java +// Potential security hole! +public static final Thing[] VALUES = { ... }; +``` + +  è¦å°å¿ƒè¿™æ ·çš„事实,一些 IDE 生æˆçš„访问方法返回对ç§æœ‰æ•°ç»„属性的引用,导致了这个问题。 有两ç§æ–¹æ³•å¯ä»¥è§£å†³è¿™ä¸ªé—®é¢˜ã€‚ ä½ å¯ä»¥ä½¿å…¬å…±æ•°ç»„ç§æœ‰å¹¶æ·»åŠ ä¸€ä¸ªå…¬å…±çš„ä¸å¯å˜åˆ—表: + +```Java +private static final Thing[] PRIVATE_VALUES = { ... }; + +public static final List VALUES = + +Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES)); +``` + +  或者,å¯ä»¥å°†æ•°ç»„设置为 private,并添加一个返回ç§æœ‰æ•°ç»„æ‹·è´çš„公共方法: + +```Java +private static final Thing[] PRIVATE_VALUES = { ... }; + +public static final Thing[] values() { + return PRIVATE_VALUES.clone(); +} +``` + +  è¦åœ¨è¿™äº›æ–¹æ³•ä¹‹é—´è¿›è¡Œé€‰æ‹©ï¼Œè¯·è€ƒè™‘客户端å¯èƒ½å¦‚何处ç†è¿”回的结果。 哪ç§è¿”回类型会更方便? 哪个会更好的表现? + +  在 Java 9 中,作为模å—系统(module system)的一部分引入了两个é¢å¤–çš„éšå¼è®¿é—®çº§åˆ«ã€‚模å—包å«ä¸€ç»„包,就åƒä¸€ä¸ªåŒ…包å«ä¸€ç»„类一样。模å—å¯ä»¥é€šè¿‡æ¨¡å—声明中的导出(export)声明显å¼åœ°å¯¼å‡ºæŸäº›åŒ… (这是 module-info.java çš„æºæ–‡ä»¶ä¸­åŒ…å«çš„约定)。模å—中的未导出包的公共和å—ä¿æŠ¤æˆå‘˜åœ¨æ¨¡å—之外是ä¸å¯è®¿é—®çš„;在模å—中,å¯è®¿é—®æ€§ä¸å—导出(export)声明的影å“。使用模å—系统å…许你在模å—之间共享类,而ä¸è®©å®ƒä»¬å¯¹æ•´ä¸ªç³»ç»Ÿå¯è§ã€‚在未导出的包中,公共和å—ä¿æŠ¤çš„公共类的æˆå‘˜ä¼šäº§ç”Ÿä¸¤ä¸ªéšå¼è®¿é—®çº§åˆ«ï¼Œè¿™æ˜¯æ™®é€šå…¬å…±å’Œå—ä¿æŠ¤çº§åˆ«çš„内部类似的情况。这ç§å…±äº«çš„需求是相对少è§çš„,并且å¯ä»¥é€šè¿‡é‡æ–°å®‰æŽ’包中的类æ¥æ¶ˆé™¤ã€‚ + +  与四个主è¦è®¿é—®çº§åˆ«ä¸åŒï¼Œè¿™ä¸¤ä¸ªåŸºäºŽæ¨¡å—的级别主è¦æ˜¯å»ºè®®ï¼ˆadvisory)。 如果将模å—çš„ JAR 文件放在应用程åºçš„类路径而ä¸æ˜¯å…¶æ¨¡å—路径中,那么模å—中的包将æ¢å¤ä¸ºéžæ¨¡å—化行为:包的公共类的所有公共类和å—ä¿æŠ¤æˆå‘˜éƒ½å…·æœ‰å…¶æ™®é€šçš„å¯è®¿é—®æ€§ï¼Œä¸ç®¡åŒ…是å¦ç”±æ¨¡å—导出[Reinhold,1.2]。 新引入的访问级别严格执行的地方是 JDK 本身:Java 类库中未导出的包在模å—之外真正无法访问。 + +  对于典型的 Java 程åºå‘˜æ¥è¯´ï¼Œä¸ä»…程åºæ¨¡å—所æ供的访问ä¿æŠ¤å­˜åœ¨å±€é™æ€§ï¼Œè€Œä¸”在本质上是很大程度上建议性的;为了利用它,你必须把你的包组åˆæˆæ¨¡å—,在模å—声明中明确所有的ä¾èµ–关系,é‡æ–°å®‰æŽ’ä½ çš„æºç æ ‘层级,并采å–特殊的行动æ¥é€‚应你的模å—内任何对éžæ¨¡å—化包的访问[Reinhold ,3]。 现在说模å—是å¦ä¼šåœ¨ JDK 之外得到广泛的使用还为时尚早。 与此åŒæ—¶ï¼Œé™¤éžä½ æœ‰è¿«åˆ‡çš„需è¦ï¼Œå¦åˆ™ä¼¼ä¹Žæœ€å¥½é¿å…它们。 + +  总而言之,应该尽å¯èƒ½åœ°å‡å°‘程åºå…ƒç´ çš„å¯è®¿é—®æ€§ï¼ˆåœ¨åˆç†èŒƒå›´å†…)。 在仔细设计一个最å°åŒ–的公共 API 之åŽï¼Œä½ åº”该防止任何散乱的类,接å£æˆ–æˆå‘˜æˆä¸º API 的一部分。 除了作为常é‡çš„公共é™æ€ `final` 属性之外,公共类ä¸åº”该有公共属性。 ç¡®ä¿ `public static final` 属性引用的对象是ä¸å¯å˜çš„。 diff --git a/docs/notes/16. 在公共类中使用访问方法而ä¸æ˜¯å…¬å…±å±žæ€§.md b/docs/notes/16. 在公共类中使用访问方法而ä¸æ˜¯å…¬å…±å±žæ€§.md new file mode 100644 index 0000000..3f42e03 --- /dev/null +++ b/docs/notes/16. 在公共类中使用访问方法而ä¸æ˜¯å…¬å…±å±žæ€§.md @@ -0,0 +1,69 @@ +# 16. 在公共类中使用访问方法而ä¸æ˜¯å…¬å…±å±žæ€§ + +  有时候,你å¯èƒ½ä¼šè¯•å›¾å†™ä¸€äº›é€€åŒ–的类([degenerate classes](https://stackoverflow.com/questions/6810982/what-is-a-degenerate-class)),除了集中实例属性之外别无用处: + +```Java +// Degenerate classes like this should not be public! +class Point { + public double x; + public double y; +} +``` + +  由于这些类的数æ®å±žæ€§å¯ä»¥ç›´æŽ¥è¢«è®¿é—®ï¼Œå› æ­¤è¿™äº›ç±»ä¸æä¾›å°è£…的好处(æ¡ç›® 15)。 如果ä¸æ›´æ”¹ API,则无法更改其表示形å¼ï¼Œæ— æ³•å¼ºåˆ¶æ‰§è¡Œä¸å˜é‡ï¼Œå¹¶ä¸”在访问属性时无法执行辅助æ“作。 åšæŒé¢å‘对象的程åºå‘˜è§‰å¾—这样的类是厌æ¶çš„,应该被具有ç§æœ‰å±žæ€§å’Œå…¬å…±è®¿é—®æ–¹æ³•çš„类(getter)所å–代,而对于å¯å˜ç±»æ¥è¯´ï¼Œå®ƒä»¬åº”该被替æ¢ä¸º setter 设值方法: + + +```Java +// Encapsulation of data by accessor methods and mutators +class Point { + private double x; + private double y; + + public Point(double x, double y) { + this.x = x; + this.y = y; + } + + public double getX() { return x; } + + public double getY() { return y; } + + public void setX(double x) { this.x = x; } + + public void setY(double y) { this.y = y; } + +} +``` + +  当然,对于公共类æ¥è¯´ï¼ŒåšæŒé¢å‘对象是正确的:**如果一个类在其包之外是å¯è®¿é—®çš„,则æ供访问方法æ¥ä¿ç•™æ›´æ”¹ç±»å†…部表示的çµæ´»æ€§ã€‚** 如果一个公共类暴露其数æ®å±žæ€§ï¼Œé‚£ä¹ˆä»¥åŽæ›´æ”¹å…¶è¡¨ç¤ºå½¢å¼åŸºæœ¬ä¸Šæ²¡æœ‰å¯èƒ½ï¼Œå› ä¸ºå®¢æˆ·ç«¯ä»£ç å¯ä»¥æ•£å¸ƒåœ¨å¾ˆå¤šåœ°æ–¹ã€‚ + +  但是,**如果一个类是包级ç§æœ‰çš„,或者是一个ç§æœ‰çš„内部类,那么暴露它的数æ®å±žæ€§å°±æ²¡æœ‰ä»€ä¹ˆæœ¬è´¨ä¸Šçš„错误——å‡è®¾å®ƒä»¬æ供足够æ述该类æ供的抽象。** 在类定义和使用它的客户端代ç ä¸­ï¼Œè¿™ç§æ–¹æ³•æ¯”访问方法产生更少的视觉混乱。 虽然客户端代ç ç»‘定到类的内部表示,但是这些代ç ä»…é™äºŽåŒ…å«è¯¥ç±»çš„包。 如果类的内部表示是å¯å–的,å¯ä»¥åœ¨ä¸è§¦ç¢°åŒ…外的任何代ç çš„情况下进行更改。 在ç§æœ‰å†…部类的情况下,更改作用范围进一步é™åˆ¶åœ¨å°é—­ç±»ä¸­ã€‚ + +  Java å¹³å°ç±»åº“中的几个类è¿å了公共类ä¸åº”直接暴露属性的建议。 ç€å的例å­åŒ…括 `java.awt` 包中的 `Point` å’Œ `Dimension` 类。 这些类别应该被视为警示性的示例,而ä¸æ˜¯æ¨¡ä»¿çš„例å­ã€‚ 如æ¡ç›® 67 所述,暴露 `Dimension` 的内部结构的决定是一个严é‡çš„性能问题,这个问题在今天ä»ç„¶å­˜åœ¨ã€‚ + +  虽然公共类直接暴露属性并ä¸æ˜¯ä¸€ä¸ªå¥½ä¸»æ„,但是如果属性是ä¸å¯å˜çš„,那么å±å®³å°±ä¸é‚£ä¹ˆå¤§äº†ã€‚当一个属性是åªè¯»çš„时候,除了更改类的 API 外,你ä¸èƒ½æ”¹å˜ç±»çš„内部表示形å¼ï¼Œä¹Ÿä¸èƒ½é‡‡å–一些辅助的行为,但是å¯ä»¥åŠ å¼ºä¸å˜æ€§ã€‚例如,下é¢çš„例å­ä¸­ä¿è¯æ¯ä¸ªå®žä¾‹è¡¨ç¤ºä¸€ä¸ªæœ‰æ•ˆçš„时间: + + +```Java +// Public class with exposed immutable fields - questionable + +public final class Time { + private static final int HOURS_PER_DAY = 24; + private static final int MINUTES_PER_HOUR = 60; + public final int hour; + public final int minute; + + public Time(int hour, int minute) { + if (hour < 0 || hour >= HOURS_PER_DAY) + throw new IllegalArgumentException("Hour: " + hour); + if (minute < 0 || minute >= MINUTES_PER_HOUR) + throw new IllegalArgumentException("Min: " + minute); + this.hour = hour; + this.minute = minute; + } + + ... // Remainder omitted +} +``` + +  总之,公共类ä¸åº”该暴露å¯å˜å±žæ€§ã€‚ 公共累暴露ä¸å¯å˜å±žæ€§çš„å±å®³è™½ç„¶ä»ç„¶å­˜åœ¨é—®é¢˜ï¼Œä½†å…¶å±å®³è¾ƒå°ã€‚ 然而,有时需è¦åŒ…级ç§æœ‰æˆ–ç§æœ‰å†…部类æ¥æš´éœ²å±žæ€§ï¼Œæ— è®ºæ­¤ç±»æ˜¯å¦æ˜¯å¯å˜çš„。 diff --git a/docs/notes/17. 最å°åŒ–å¯å˜æ€§.md b/docs/notes/17. 最å°åŒ–å¯å˜æ€§.md new file mode 100644 index 0000000..7363141 --- /dev/null +++ b/docs/notes/17. 最å°åŒ–å¯å˜æ€§.md @@ -0,0 +1,175 @@ +# 17. 最å°åŒ–å¯å˜æ€§ + +  ä¸å¯å˜ç±»ç®€å•æ¥è¯´æ˜¯å®ƒçš„实例ä¸èƒ½è¢«ä¿®æ”¹çš„类。 包å«åœ¨æ¯ä¸ªå®žä¾‹ä¸­çš„所有信æ¯åœ¨å¯¹è±¡çš„生命周期中是固定的,因此ä¸ä¼šè§‚察到任何å˜åŒ–。 Java å¹³å°ç±»åº“包å«è®¸å¤šä¸å¯å˜çš„类,包括 `String` ç±»ï¼ŒåŸºæœ¬ç±»åž‹åŒ…è£…ç±»ä»¥åŠ `BigInteger` 类和 `BigDecimal` 类。 有很多很好的ç†ç”±ï¼šä¸å¯å˜ç±»æ¯”å¯å˜ç±»æ›´å®¹æ˜“设计,实现和使用。 他们ä¸å¤ªå®¹æ˜“出错,更安全。 + +  è¦ä½¿ä¸€ä¸ªç±»ä¸å¯å˜ï¼Œè¯·éµå¾ªä»¥ä¸‹äº”æ¡è§„则: + + 1. **ä¸è¦æ供修改对象状æ€çš„方法(也称为 mutators)。** + 2. **ç¡®ä¿è¿™ä¸ªç±»ä¸èƒ½è¢«ç»§æ‰¿ã€‚** è¿™å¯ä»¥é˜²æ­¢ç²—心的或æ¶æ„çš„å­ç±»ï¼Œå‡è®¾å¯¹è±¡çš„状æ€å·²ç»æ”¹å˜ï¼Œä»Žè€Œç ´å类的ä¸å¯å˜è¡Œä¸ºã€‚ 防止å­ç±»åŒ–通常是通过 `final` 修饰类,但是我们ç¨åŽå°†è®¨è®ºå¦ä¸€ç§æ–¹æ³•ã€‚ + 3. **把所有属性设置为 final。** 通过系统强制执行,清楚地表达了你的æ„图。 å¦å¤–,如果一个新创建的实例的引用从一个线程传递到å¦ä¸€ä¸ªçº¿ç¨‹è€Œæ²¡æœ‰åŒæ­¥ï¼Œå°±å¿…é¡»ä¿è¯æ­£ç¡®çš„行为,正如内存模型[JLS,17.5; Goetz06,16] 所述。 + 4. **把所有的属性设置为 private。** è¿™å¯ä»¥é˜²æ­¢å®¢æˆ·ç«¯èŽ·å¾—对属性引用的å¯å˜å¯¹è±¡çš„访问æƒé™å¹¶ç›´æŽ¥ä¿®æ”¹è¿™äº›å¯¹è±¡ã€‚ 虽然技术上å…许ä¸å¯å˜ç±»å…·æœ‰åŒ…å«åŸºæœ¬ç±»åž‹æ•°å€¼çš„公共 `final` 属性或对ä¸å¯å˜å¯¹è±¡çš„引用,但ä¸å»ºè®®è¿™æ ·åšï¼Œå› ä¸ºå®ƒä¸å…许在以åŽçš„版本中更改内部表示(æ¡ç›® 15 å’Œ 16)。 + 5. **ç¡®ä¿å¯¹ä»»ä½•å¯å˜ç»„件的互斥访问。** 如果你的类有任何引用å¯å˜å¯¹è±¡çš„属性,请确ä¿è¯¥ç±»çš„客户端无法获得对这些对象的引用。 切勿将这样的属性åˆå§‹åŒ–为客户端æ供的对象引用,或从访问方法返回属性。 在构造方法,访问方法和 `readObject` 方法(æ¡ç›® 88)中进行防御性拷è´ï¼ˆæ¡ç›® 50)。 + + + +以å‰æ¡ç›®ä¸­çš„许多示例类都是ä¸å¯å˜çš„。 其中这样的类是æ¡ç›® 11 中的 `PhoneNumber` 类,它具有æ¯ä¸ªå±žæ€§çš„访问方法(accessors),但没有相应的设值方法(mutators)。 这是一个ç¨å¾®å¤æ‚一点的例å­ï¼š + +```Java +// Immutable complex number class + +public final class Complex { + + private final double re; + private final double im; + + public Complex(double re, double im) { + this.re = re; + this.im = im; + } + + public double realPart() { + return re; + } + + public double imaginaryPart() { + return im; + } + + public Complex plus(Complex c) { + return new Complex(re + c.re, im + c.im); + } + + public Complex minus(Complex c) { + return new Complex(re - c.re, im - c.im); + } + + public Complex times(Complex c) { + return new Complex(re * c.re - im * c.im, + re * c.im + im * c.re); + + } + public Complex dividedBy(Complex c) { + double tmp = c.re * c.re + c.im * c.im; + return new Complex((re * c.re + im * c.im) / tmp, + (im * c.re - re * c.im) / tmp); + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + + if (!(o instanceof Complex)) { + return false; + } + + Complex c = (Complex) o; + + // See page 47 to find out why we use compare instead of == + return Double.compare(c.re, re) == 0 + && Double.compare(c.im, im) == 0; + + } + + @Override + public int hashCode() { + return 31 * Double.hashCode(re) + Double.hashCode(im); + } + + @Override + public String toString() { + return "(" + re + " + " + im + "i)"; + } +} +``` + +  这个类代表了一个å¤æ•°ï¼ˆåŒ…å«å®žéƒ¨å’Œè™šéƒ¨çš„数字)。 除了标准的 `Object` 方法之外,它还为实部和虚部æ供访问方法,并æ供四个基本的算术è¿ç®—:加法,å‡æ³•ï¼Œä¹˜æ³•å’Œé™¤æ³•ã€‚ 注æ„算术è¿ç®—如何创建并返回一个新的 `Complex` 实例,而ä¸æ˜¯ä¿®æ”¹è¿™ä¸ªå®žä¾‹ã€‚ è¿™ç§æ¨¡å¼è¢«ç§°ä¸ºå‡½æ•°å¼æ–¹æ³•ï¼Œå› ä¸ºæ–¹æ³•è¿”回将æ“作数应用于函数的结果,而ä¸ä¿®æ”¹å®ƒä»¬ã€‚ 与其对应的过程(procedural)或命令(imperative)的方法相对比,在这ç§æ–¹æ³•ä¸­ï¼Œå°†ä¸€ä¸ªè¿‡ç¨‹ä½œç”¨åœ¨æ“作数上,导致其状æ€æ”¹å˜ã€‚ 请注æ„,方法å称是介è¯ï¼ˆå¦‚ plus)而ä¸æ˜¯åŠ¨è¯ï¼ˆå¦‚ add)。 这强调了方法ä¸ä¼šæ”¹å˜å¯¹è±¡çš„值的事实。 `BigInteger` å’Œ `BigDecimal` 类没有éµå®ˆè¿™ä¸ªå‘½å约定,并导致许多使用错误。 + +  如果你ä¸ç†Ÿæ‚‰å‡½æ•°å¼æ–¹æ³•ï¼Œå¯èƒ½ä¼šæ˜¾å¾—ä¸è‡ªç„¶ï¼Œä½†å®ƒå…·æœ‰ä¸å˜æ€§ï¼Œå…·æœ‰è®¸å¤šä¼˜ç‚¹ã€‚ **ä¸å¯å˜å¯¹è±¡å¾ˆç®€å•ã€‚** 一个ä¸å¯å˜çš„对象å¯ä»¥å®Œå…¨å¤„于一ç§çŠ¶æ€ï¼Œä¹Ÿå°±æ˜¯è¢«åˆ›å»ºæ—¶çš„状æ€ã€‚ 如果确ä¿æ‰€æœ‰çš„构造方法都建立了类ä¸å˜é‡ï¼Œé‚£ä¹ˆå°±ä¿è¯è¿™äº›ä¸å˜é‡åœ¨ä»»ä½•æ—¶å€™éƒ½ä¿æŒä¸å˜ï¼Œä½¿ç”¨æ­¤ç±»çš„程åºå‘˜æ— éœ€å†åšé¢å¤–的工作。 å¦ä¸€æ–¹é¢ï¼Œå¯å˜å¯¹è±¡å¯ä»¥å…·æœ‰ä»»æ„å¤æ‚的状æ€ç©ºé—´ã€‚ 如果文档没有æ供由设置(mutator)方法执行的状æ€è½¬æ¢çš„精确æ述,那么å¯é åœ°ä½¿ç”¨å¯å˜ç±»å¯èƒ½æ˜¯å›°éš¾çš„或ä¸å¯èƒ½çš„。 + +  **ä¸å¯å˜å¯¹è±¡æœ¬è´¨ä¸Šæ˜¯çº¿ç¨‹å®‰å…¨çš„; 它们ä¸éœ€è¦åŒæ­¥ã€‚** 被多个线程åŒæ—¶è®¿é—®å®ƒä»¬æ—¶å¹¶ä¸ä¼šè¢«ç ´å。 这是实现线程安全的最简å•æ–¹æ³•ã€‚ 由于没有线程å¯ä»¥è§‚察到å¦ä¸€ä¸ªçº¿ç¨‹å¯¹ä¸å¯å˜å¯¹è±¡çš„å½±å“,所以**ä¸å¯å˜å¯¹è±¡å¯ä»¥è¢«è‡ªç”±åœ°å…±äº«ã€‚** 因此,ä¸å¯å˜ç±»åº”鼓励客户端尽å¯èƒ½é‡ç”¨çŽ°æœ‰çš„实例。 一个简å•çš„方法是为常用的值æ供公共的é™æ€ final 常é‡ã€‚ 例如,`Complex` ç±»å¯èƒ½æ供这些常é‡ï¼š + +```Java +public static final Complex ZERO = new Complex(0, 0); +public static final Complex ONE = new Complex(1, 0); +public static final Complex I = new Complex(0, 1); +``` +  这ç§æ–¹æ³•å¯ä»¥æ›´è¿›ä¸€æ­¥ã€‚ 一个ä¸å¯å˜çš„ç±»å¯ä»¥æä¾›é™æ€çš„工厂(æ¡ç›® 1)æ¥ç¼“å­˜ç»å¸¸è¢«è¯·æ±‚的实例,以é¿å…在现有的实例中创建新的实例。 所有基本类型的包装类和 `BigInteger` 类都是这样åšçš„。 使用这样的é™æ€å·¥åŽ‚会使客户端共享实例而ä¸æ˜¯åˆ›å»ºæ–°å®žä¾‹ï¼Œä»Žè€Œå‡å°‘内存å ç”¨å’Œåžƒåœ¾å›žæ”¶æˆæœ¬ã€‚ 在设计新类时,选择é™æ€å·¥åŽ‚代替公共构造方法,å¯ä»¥åœ¨ä»¥åŽå¢žåŠ ç¼“存的çµæ´»æ€§ï¼Œè€Œä¸éœ€è¦ä¿®æ”¹å®¢æˆ·ç«¯ã€‚ + +  ä¸å¯å˜å¯¹è±¡å¯ä»¥è‡ªç”±åˆ†äº«çš„结果是,你永远ä¸éœ€è¦åšå‡ºé˜²å¾¡æ€§æ‹·è´ï¼ˆdefensive copies)(æ¡ç›® 50)。 事实上,永远ä¸éœ€è¦åšä»»ä½•æ‹·è´ï¼Œå› ä¸ºè¿™äº›æ‹·è´æ°¸è¿œç­‰äºŽåŽŸå§‹å¯¹è±¡ã€‚ 因此,你ä¸éœ€è¦ä¹Ÿä¸åº”该在一个ä¸å¯å˜çš„类上æ供一个 clone 方法或拷è´æž„造方法(copy constructor)(æ¡ç›® 13)。 这一点在 Java å¹³å°çš„早期阶段还ä¸æ˜¯å¾ˆå¥½ç†è§£ï¼Œæ‰€ä»¥ `String` 类有一个拷è´æž„造方法,但是它应该尽é‡å¾ˆå°‘使用(æ¡ç›® 6)。 + +  **ä¸ä»…å¯ä»¥å…±äº«ä¸å¯å˜çš„对象,而且å¯ä»¥å…±äº«å†…部信æ¯ã€‚** 例如,`BigInteger` 类在内部使用符å·æ•°å€¼è¡¨ç¤ºæ³•ã€‚ 符å·ç”¨ `int` 值表示,数值用 `int` 数组表示。 `negate` 方法生æˆäº†ä¸€ä¸ªæ•°å€¼ç›¸åŒä½†ç¬¦å·ç›¸åçš„æ–° `BigInteger` 实例。 å³ä½¿å®ƒæ˜¯å¯å˜çš„,也ä¸éœ€è¦å¤åˆ¶æ•°ç»„;新创建的 `BigInteger` 指å‘与原始相åŒçš„内部数组。 + +  **ä¸å¯å˜å¯¹è±¡ä¸ºå…¶ä»–对象æ供了很好的构件(building blocks)** ,无论是å¯å˜çš„还是ä¸å¯å˜çš„。 如果知é“一个å¤æ‚组件的内部对象ä¸ä¼šå‘生改å˜ï¼Œé‚£ä¹ˆç»´æŠ¤å¤æ‚对象的ä¸å˜é‡å°±å®¹æ˜“多了。这一原则的特例是,ä¸å¯å˜å¯¹è±¡å¯ä»¥æž„æˆ `Map` 对象的键和 `Set` 的元素,一旦ä¸å¯å˜å¯¹è±¡ä½œä¸º `Map` 的键或 `Set` 里的元素,å³ä½¿ç ´å了 `Map` å’Œ `Set` çš„ä¸å¯å˜æ€§ï¼Œä½†ä¸ç”¨æ‹…心它们的值会å‘生å˜åŒ–。 + +  **ä¸å¯å˜å¯¹è±¡æ供了å…费的原å­å¤±è´¥æœºåˆ¶ï¼ˆæ¡ç›® 76)。** 它们的状æ€æ°¸è¿œä¸ä¼šæ”¹å˜ï¼Œæ‰€ä»¥ä¸å¯èƒ½å‡ºçŽ°ä¸´æ—¶çš„ä¸ä¸€è‡´ã€‚ + +  **ä¸å¯å˜ç±»çš„主è¦ç¼ºç‚¹æ˜¯å¯¹äºŽæ¯ä¸ªä¸åŒçš„值都需è¦ä¸€ä¸ªå•ç‹¬çš„对象。** 创建这些对象å¯èƒ½ä»£ä»·å¾ˆé«˜ï¼Œç‰¹åˆ«æ˜¯å¦‚果是大型的对象下。 例如,å‡è®¾ä½ æœ‰ä¸€ä¸ªç™¾ä¸‡ä½çš„ `BigInteger` ,你想改å˜å®ƒçš„低ä½ï¼š + +```Java +BigInteger moby = ...; +moby = moby.flipBit(0); +``` + +  `flipBit` 方法创建一个新的 `BigInteger` 实例,也是一百万ä½é•¿ï¼Œä¸ŽåŽŸå§‹ä½ç½®åªæœ‰ä¸€ä½ä¸åŒã€‚ 该æ“作需è¦ä¸Ž `BigInteger` 大å°æˆæ¯”例的时间和空间。 将其与 `java.util.BitSet` 对比。 åƒ `BigInteger` 一样,`BitSet` 表示一个任æ„长度的ä½åºåˆ—,但与 `BigInteger` ä¸åŒï¼Œ`BitSet` 是å¯å˜çš„。 `BitSet` ç±»æ供了一ç§æ–¹æ³•ï¼Œå…许你在固定时间内更改百万ä½å®žä¾‹ä¸­å•ä¸ªä½çš„状æ€ï¼š + +```Java +BitSet moby = ...; +moby.flip(0); +``` +  如果执行一个多步æ“作,在æ¯ä¸€æ­¥ç”Ÿæˆä¸€ä¸ªæ–°å¯¹è±¡ï¼Œé™¤æœ€ç»ˆç»“果之外丢弃所有对象,则性能问题会被放大。这里有两ç§æ–¹å¼æ¥å¤„ç†è¿™ä¸ªé—®é¢˜ã€‚第一ç§åŠžæ³•ï¼Œå…ˆçŒœæµ‹ä¸€ä¸‹ä¼šç»å¸¸ç”¨åˆ°å“ªäº›å¤šæ­¥çš„æ“作,然åŽè®²å®ƒä»¬ä½œä¸ºåŸºæœ¬ç±»åž‹æ供。如果一个多步æ“作是作为一个基本类型æ供的,那么ä¸å¯å˜ç±»å°±ä¸å¿…在æ¯ä¸€æ­¥åˆ›å»ºä¸€ä¸ªç‹¬ç«‹çš„对象。在内部,ä¸å¯å˜çš„ç±»å¯ä»¥æ˜¯ä»»æ„çµæ´»çš„。 例如,`BigInteger` 有一个包级ç§æœ‰çš„å¯å˜çš„“伙伴类(companion class)â€ï¼Œå®ƒç”¨æ¥åŠ é€Ÿå¤šæ­¥æ“作,比如模幂è¿ç®—( modular exponentiation)。出于å‰é¢æ‰€è¿°çš„所有原因,使用å¯å˜ä¼™ä¼´ç±»æ¯”使用 `BigInteger` è¦å›°éš¾å¾—多。 幸è¿çš„是,你ä¸å¿…使用它:`BigInteger` 类的实现者为你åšäº†å¾ˆå¤šåŠªåŠ›ã€‚ + +  如果你å¯ä»¥å‡†ç¡®é¢„测客户端è¦åœ¨ä½ çš„ä¸å¯å˜ç±»ä¸Šæ‰§è¡Œå“ªäº›å¤æ‚çš„æ“作,那么包级ç§æœ‰å¯å˜ä¼™ä¼´ç±»çš„æ–¹å¼å¯ä»¥æ­£å¸¸å·¥ä½œã€‚如果ä¸æ˜¯çš„è¯ï¼Œé‚£ä¹ˆæœ€å¥½çš„办法就是æ供一个公开的å¯å˜ä¼™ä¼´ç±»ã€‚ è¿™ç§æ–¹æ³•åœ¨ Java å¹³å°ç±»åº“中的主è¦ä¾‹å­æ˜¯ `String` 类,它的å¯å˜ä¼™ä¼´ç±»æ˜¯ `StringBuilder`(åŠå…¶è¿‡æ—¶çš„å‰èº« `StringBuffer` 类)。 + +  现在你已ç»çŸ¥é“如何创建一个ä¸å¯æ”¹å˜ç±»ï¼Œå¹¶ä¸”了解ä¸å˜æ€§çš„优点和缺点,下é¢æˆ‘们æ¥è®¨è®ºå‡ ä¸ªè®¾è®¡æ–¹æ¡ˆã€‚ 回想一下,为了ä¿è¯ä¸å˜æ€§ï¼Œä¸€ä¸ªç±»ä¸å¾—å…许å­ç±»åŒ–。 è¿™å¯ä»¥é€šè¿‡ä½¿ç±»ç”¨ `final` 修饰,但是还有å¦å¤–一个更çµæ´»çš„选择。 而ä¸æ˜¯ä½¿ä¸å¯å˜ç±»è®¾ç½®ä¸º `final`,å¯ä»¥ä½¿å…¶æ‰€æœ‰çš„构造方法ç§æœ‰æˆ–包级ç§æœ‰ï¼Œå¹¶æ·»åŠ å…¬å…±é™æ€å·¥åŽ‚,而ä¸æ˜¯å…¬å…±æž„造方法(æ¡ç›® 1)。 为了具体说明这ç§æ–¹æ³•ï¼Œä¸‹é¢ä»¥ `Complex` 为例,看看如何使用这ç§æ–¹æ³•ï¼š + +```Java +// Immutable class with static factories instead of constructors + +public class Complex { + + private final double re; + private final double im; + + private Complex(double re, double im) { + this.re = re; + this.im = im; + } + + public static Complex valueOf(double re, double im) { + return new Complex(re, im); + } + + ... // Remainder unchanged +} +``` +  这ç§æ–¹æ³•å¾€å¾€æ˜¯æœ€å¥½çš„选择。 这是最çµæ´»çš„,因为它å…许使用多个包级ç§æœ‰å®žçŽ°ç±»ã€‚ 对于驻留在包之外的客户端,ä¸å¯å˜ç±»å®žé™…上是 `final` 的,因为ä¸å¯èƒ½ç»§æ‰¿æ¥è‡ªå¦ä¸€ä¸ªåŒ…的类,并且缺少公共或å—ä¿æŠ¤çš„构造方法。 除了å…许多个实现类的çµæ´»æ€§ä»¥å¤–,这ç§æ–¹æ³•è¿˜å¯ä»¥é€šè¿‡æ”¹è¿›é™æ€å·¥åŽ‚的对象缓存功能æ¥è°ƒæ•´åŽç»­ç‰ˆæœ¬ä¸­ç±»çš„性能。 + +  当 `BigInteger` å’Œ `BigDecimal` 被写入时,ä¸å¯å˜ç±»å¿…须是有效的 `final`,因此它们的所有方法都å¯èƒ½è¢«é‡å†™ã€‚ä¸å¹¸çš„是,在ä¿æŒå‘åŽå…¼å®¹æ€§çš„åŒæ—¶ï¼Œè¿™ä¸€äº‹å®žæ— æ³•çº æ­£ã€‚如果你编写一个安全性å–决于æ¥è‡ªä¸å—信任的客户端的 `BigInteger` 或 `BigDecimal` å‚æ•°çš„ä¸å˜ç±»æ—¶ï¼Œåˆ™å¿…须检查该å‚数是“真实的â€`BigInteger` 还是 `BigDecimal`,而ä¸åº”该是ä¸å—信任的å­ç±»çš„实例。如果是åŽè€…,则必须在å‡è®¾å¯èƒ½æ˜¯å¯å˜çš„情况下ä¿æŠ¤æ€§æ‹·è´ï¼ˆdefensively copy)(æ¡ç›® 50): + +```Java +public static BigInteger safeInstance(BigInteger val) { + return val.getClass() == BigInteger.class ? + val : new BigInteger(val.toByteArray()); +} +``` + +  在本æ¡ç›®å¼€å¤´å…³äºŽä¸å¯å˜ç±»çš„规则说明,没有方法å¯ä»¥ä¿®æ”¹å¯¹è±¡ï¼Œå¹¶ä¸”它的所有属性必须是 `final` 的。事实上,这些规则比实际需è¦çš„è¦å¼ºç¡¬ä¸€äº›ï¼Œå…¶å®žå¯ä»¥æœ‰æ‰€æ”¾æ¾æ¥æ高性能。 事实上,任何方法都ä¸èƒ½åœ¨å¯¹è±¡çš„状æ€ä¸­äº§ç”Ÿå¤–部å¯è§çš„å˜åŒ–。 然而,一些ä¸å¯å˜ç±»å…·æœ‰ä¸€ä¸ªæˆ–å¤šä¸ªéž `final` 属性,在第一次需è¦æ—¶å°†å¼€é”€æ˜‚贵的计算结果缓存在这些属性中。 如果å†æ¬¡è¯·æ±‚相åŒçš„值,则返回缓存的值,从而节çœäº†é‡æ–°è®¡ç®—çš„æˆæœ¬ã€‚ 这个技巧的作用æ°æ°æ˜¯å› ä¸ºå¯¹è±¡æ˜¯ä¸å¯å˜çš„,这ä¿è¯äº†å¦‚æžœé‡å¤çš„è¯ï¼Œè®¡ç®—会得到相åŒçš„结果。 + +  例如,`PhoneNumber` 类的 `hashCode` 方法(第 53 页的æ¡ç›® 11)在第一次调用改方法时计算哈希ç ï¼Œå¹¶åœ¨å†æ¬¡è°ƒç”¨æ—¶å¯¹å…¶è¿›è¡Œç¼“存。 è¿™ç§å»¶è¿Ÿåˆå§‹åŒ–(æ¡ç›® 83)的一个例å­ï¼ŒString 类也使用到了。 + +  关于åºåˆ—化应该加上一个警告。 如果你选择使您的ä¸å¯å˜ç±»å®žçŽ° `Serializable` 接å£ï¼Œå¹¶ä¸”它包å«ä¸€ä¸ªæˆ–多个引用å¯å˜å¯¹è±¡çš„属性,则必须æ供显å¼çš„ `readObject` 或 `readResolve` 方法,或者使用 `ObjectOutputStream.writeUnshared` å’Œ `ObjectInputStream.readUnshared` 方法,å³é»˜è®¤çš„åºåˆ—化形å¼ä¹Ÿæ˜¯å¯ä»¥æŽ¥å—的。 å¦åˆ™æ”»å‡»è€…å¯èƒ½ä¼šåˆ›å»ºä¸€ä¸ªå¯å˜çš„类的实例。 这个主题会在æ¡ç›® 88 中会详细介ç»ã€‚ + +  总而言之,åšå†³ä¸è¦ä¸ºæ¯ä¸ªå±žæ€§ç¼–写一个 get 方法åŽå†ç¼–写一个对应的 set 方法。 **除éžæœ‰å……分的ç†ç”±ä½¿ç±»æˆä¸ºå¯å˜ç±»ï¼Œå¦åˆ™ç±»åº”该是ä¸å¯å˜çš„。** ä¸å¯å˜ç±»æ供了许多优点,唯一的缺点是在æŸäº›æƒ…况下å¯èƒ½ä¼šå‡ºçŽ°æ€§èƒ½é—®é¢˜ã€‚ 你应该始终使用较å°çš„值对象(如 `PhoneNumber` å’Œ `Complex`),使其ä¸å¯å˜ã€‚ (Java å¹³å°ç±»åº“中有几个类,如 `java.util.Date` å’Œ `java.awt.Point`,本应该是ä¸å¯å˜çš„,但实际上并ä¸æ˜¯ï¼‰ã€‚你应该认真考虑创建更大的值对象,例如 `String` å’Œ `BigInteger` ,设æˆä¸å¯æ”¹å˜çš„。 åªæœ‰å½“你确认有必è¦å®žçŽ°ä»¤äººæ»¡æ„的性能(æ¡ç›® 67)时,æ‰åº”该为ä¸å¯æ”¹å˜ç±»æ供一个公开的å¯å˜ä¼™ä¼´ç±»ã€‚ + +  对于一些类æ¥è¯´ï¼Œä¸å˜æ€§æ˜¯ä¸åˆ‡å®žé™…的。**如果一个类ä¸èƒ½è®¾è®¡ä¸ºä¸å¯å˜ç±»ï¼Œé‚£ä¹ˆä¹Ÿè¦å°½å¯èƒ½åœ°é™åˆ¶å®ƒçš„å¯å˜æ€§** 。å‡å°‘对象å¯ä»¥å­˜åœ¨çš„状æ€æ•°é‡ï¼Œå¯ä»¥æ›´å®¹æ˜“地分æžå¯¹è±¡ï¼Œä»¥åŠé™ä½Žå‡ºé”™çš„å¯èƒ½æ€§ã€‚因此,除éžæœ‰è¶³å¤Ÿçš„ç†ç”±æŠŠå±žæ€§è®¾ç½®ä¸ºéž `final` 的情况下,å¦åˆ™åº”该æ¯ä¸ªå±žæ€§éƒ½è®¾ç½®ä¸º `final` 的。把本æ¡ç›®çš„建议与æ¡ç›® 15 的建议结åˆèµ·æ¥ï¼Œä½ è‡ªç„¶çš„倾å‘就是:**除éžæœ‰å……分的ç†ç”±ä¸è¿™æ ·åšï¼Œå¦åˆ™åº”该把æ¯ä¸ªå±žæ€§å£°æ˜Žä¸ºç§æœ‰ final 的。** + +  **构造方法应该创建完全åˆå§‹åŒ–的对象,并建立所有的ä¸å˜æ€§ã€‚** 除éžæœ‰ä»¤äººä¿¡æœçš„ç†ç”±ï¼Œå¦åˆ™ä¸è¦æ供独立于构造方法或é™æ€å·¥åŽ‚的公共åˆå§‹åŒ–方法。 åŒæ ·ï¼Œä¸è¦æ供一个“reinitializeâ€æ–¹æ³•ï¼Œä½¿å¯¹è±¡å¯ä»¥è¢«é‡ç”¨ï¼Œå°±å¥½åƒå®ƒæ˜¯ç”¨ä¸åŒçš„åˆå§‹çŠ¶æ€æž„建的。 这样的方法通常以增加的å¤æ‚度为代价,仅仅æ供很少的性能优势。 + +  `CountDownLatch` 类是这些原ç†çš„例è¯ã€‚ 它是å¯å˜çš„,但它的状æ€ç©ºé—´æœ‰æ„ä¿æŒæœ€å°èŒƒå›´å†…。 创建一个实例,使用它一次,并完æˆï¼šä¸€æ—¦ `countdown` é”的计数器已ç»è¾¾åˆ°é›¶ï¼Œä¸èƒ½å†é‡ç”¨å®ƒã€‚ + +  在这个æ¡ç›®ä¸­ï¼Œåº”该添加关于 `Complex` 类的最åŽä¸€ä¸ªæ³¨é‡Šã€‚ 这个例å­åªæ˜¯ä¸ºäº†è¯´æ˜Žä¸å˜æ€§ã€‚ è¿™ä¸æ˜¯ä¸€ä¸ªå·¥ä¸šå¼ºåº¦å¤æ‚çš„å¤æ•°å®žçŽ°ã€‚ 它对å¤æ•°ä½¿ç”¨äº†ä¹˜æ³•å’Œé™¤æ³•çš„标准公å¼ï¼Œè¿™äº›å…¬å¼ä¸æ­£ç¡®ä¼šè¿›è¡Œä¸æ­£ç¡®çš„å››èˆäº”入,没有为å¤æ•°çš„ `NaN` 和无穷大æ供良好的语义[Kahan91,Smith62,Thomas94]。 + + + diff --git a/docs/notes/18. 组åˆä¼˜äºŽç»§æ‰¿.md b/docs/notes/18. 组åˆä¼˜äºŽç»§æ‰¿.md new file mode 100644 index 0000000..a31306c --- /dev/null +++ b/docs/notes/18. 组åˆä¼˜äºŽç»§æ‰¿.md @@ -0,0 +1,198 @@ +# 18. 组åˆä¼˜äºŽç»§æ‰¿ + +  继承是实现代ç é‡ç”¨çš„有效方å¼ï¼Œä½†å¹¶ä¸æ€»æ˜¯æœ€å¥½çš„工具。使用ä¸å½“,会导致脆弱的软件。 在包中使用继承是安全的,其中å­ç±»å’Œçˆ¶ç±»çš„实现都在åŒä¸€ä¸ªç¨‹åºå‘˜çš„控制之下。对应专门为了继承而设计的,并且有文档说明的类æ¥è¯´ï¼ˆæ¡ç›® 19),使用继承也是安全的。 然而,从普通的具体类跨越包级边界继承,是å±é™©çš„。 æ醒一下,本书使用“继承â€ä¸€è¯æ¥è¡¨ç¤ºå®žçŽ°ç»§æ‰¿ï¼ˆå½“一个类继承å¦ä¸€ä¸ªç±»æ—¶ï¼‰ã€‚ 在这个项目中讨论的问题ä¸é€‚用于接å£ç»§æ‰¿ï¼ˆå½“类实现接å£æˆ–当接å£ç»§æ‰¿å¦ä¸€ä¸ªæŽ¥å£æ—¶ï¼‰ã€‚ + +  **与方法调用ä¸åŒï¼Œç»§æ‰¿æ‰“破了å°è£…[Snyder86]。** æ¢å¥è¯è¯´ï¼Œä¸€ä¸ªå­ç±»ä¾èµ–于其父类的实现细节æ¥ä¿è¯å…¶æ­£ç¡®çš„功能。 父类的实现å¯èƒ½ä¼šä»Žå‘布版本ä¸æ–­å˜åŒ–,如果是这样,å­ç±»å¯èƒ½ä¼šè¢«ç ´å,å³ä½¿å®ƒçš„代ç æ²¡æœ‰ä»»ä½•æ”¹å˜ã€‚ 因此,一个å­ç±»å¿…须与其超类一起更新而å˜åŒ–,除éžçˆ¶ç±»çš„作者为了继承的目的而专门设计它,并对应有文档的说明。 + +  为了具体说明,å‡è®¾æœ‰ä¸€ä¸ªä½¿ç”¨ `HashSet` 的程åºã€‚ 为了调整程åºçš„性能,需è¦æŸ¥è¯¢ `HashSet` ,从创建它之åŽå·²ç»æ·»åŠ äº†å¤šå°‘个元素(ä¸è¦å’Œå½“å‰çš„元素数é‡æ··æ·†ï¼Œå½“元素被删除时数é‡ä¹Ÿä¼šä¸‹é™ï¼‰ã€‚ 为了æ供这个功能,编写了一个 `HashSet` å˜ä½“,它ä¿ç•™äº†å°è¯•å…ƒç´ æ’入的数é‡ï¼Œå¹¶å¯¼å‡ºäº†è¿™ä¸ªæ’入数é‡çš„一个访问方法。 `HashSet` 类包å«ä¸¤ä¸ªæ·»åŠ å…ƒç´ çš„方法,分别是 `add` å’Œ `addAll`,所以我们é‡å†™è¿™ä¸¤ä¸ªæ–¹æ³•ï¼š + +```Java +// Broken - Inappropriate use of inheritance! +public class InstrumentedHashSet extends HashSet { + // The number of attempted element insertions + private int addCount = 0; + + public InstrumentedHashSet() { + } + + public InstrumentedHashSet(int initCap, float loadFactor) { + super(initCap, loadFactor); + } + @Override public boolean add(E e) { + addCount++; + return super.add(e); + } + @Override public boolean addAll(Collection c) { + addCount += c.size(); + return super.addAll(c); + } + public int getAddCount() { + return addCount; + } +} +``` + +  这个类看起æ¥å¾ˆåˆç†ï¼Œä½†æ˜¯ä¸èƒ½æ­£å¸¸å·¥ä½œã€‚ å‡è®¾åˆ›å»ºä¸€ä¸ªå®žä¾‹å¹¶ä½¿ç”¨ `addAll` 方法添加三个元素。 顺便æ一å¥ï¼Œè¯·æ³¨æ„,下é¢ä»£ç ä½¿ç”¨åœ¨ Java 9 中添加的é™æ€å·¥åŽ‚方法 `List.of` æ¥åˆ›å»ºä¸€ä¸ªåˆ—表;如果使用的是早期版本,请改为使用 `Arrays.asList`: + +```Java +InstrumentedHashSet s = new InstrumentedHashSet<>(); +s.addAll(List.of("Snap", "Crackle", "Pop")); +``` +  我们期望 getAddCount 方法返回的结果是 3,但实际上返回了 6。哪里出æ¥é—®é¢˜ï¼Ÿåœ¨ `HashSet` 内部,`addAll` 方法是基于它的 `add` 方法æ¥å®žçŽ°çš„,å³ä½¿ `HashSet` 文档中没有指å其实现细节,倒也是åˆç†çš„。`InstrumentedHashSet` 中的 `addAll` 方法首先给 `addCount` 属性设置为 3,然åŽä½¿ç”¨ `super.addAll` 方法调用了 `HashSet` çš„ `addAll` 实现。然åŽå过æ¥åˆè°ƒç”¨åœ¨ `InstrumentedHashSet` 类中é‡å†™çš„ `add` 方法,æ¯ä¸ªå…ƒç´ è°ƒç”¨ä¸€æ¬¡ã€‚这三次调用åˆåˆ†åˆ«ç»™ `addCount` 加 1,所以,一共增加了 6:通过 `addAll` 方法æ¯ä¸ªå¢žåŠ çš„元素都被计算了两次。 + +  我们å¯ä»¥é€šè¿‡æ¶ˆé™¤ `addAll` 方法的é‡å†™æ¥â€œä¿®å¤â€å­ç±»ã€‚ 尽管生æˆçš„ç±»å¯ä»¥æ­£å¸¸å·¥ä½œï¼Œä½†æ˜¯å®ƒä¾èµ–于它的正确方法,因为 `HashSet` çš„ `addAll` 方法是在其 `add` 方法之上实现的。 这个“自我使用(self-use)â€æ˜¯ä¸€ä¸ªå®žçŽ°ç»†èŠ‚,并ä¸ä¿è¯åœ¨ `Java` å¹³å°çš„所有实现中都å¯ä»¥é€‚用,并且å¯ä»¥éšå‘布版本而å˜åŒ–。 因此,产生的 `InstrumentedHashSet` 类是脆弱的。 + +  ç¨å¾®å¥½ä¸€ç‚¹çš„åšæ³•æ˜¯ï¼Œé‡å†™ `addAll` 方法é历指定集åˆï¼Œä¸ºæ¯ä¸ªå…ƒç´ è°ƒç”¨ `add` 方法一次。 ä¸ç®¡ `HashSet` çš„ `addAll` 方法是å¦åœ¨å…¶ `add` 方法上实现,都会ä¿è¯æ­£ç¡®çš„结果,因为 `HashSet` çš„ `addAll` 实现将ä¸å†è¢«è°ƒç”¨ã€‚然而,这ç§æŠ€æœ¯å¹¶ä¸èƒ½è§£å†³æ‰€æœ‰çš„问题。 这相当于é‡æ–°å®žçŽ°äº†çˆ¶ç±»æ–¹æ³•ï¼Œè¿™æ ·çš„方法å¯èƒ½ä¸èƒ½ç¡®å®šåˆ°åº•æ˜¯å¦æ—¶è‡ªç”¨ï¼ˆself-use)的,实现起æ¥ä¹Ÿæ˜¯å›°éš¾çš„,耗时的,容易出错的,并且å¯èƒ½ä¼šé™ä½Žæ€§èƒ½ã€‚ 此外,这ç§æ–¹å¼å¹¶ä¸èƒ½æ€»æ˜¯å¥æ•ˆï¼Œå› ä¸ºå­ç±»æ— æ³•è®¿é—®ä¸€äº›ç§æœ‰å±žæ€§ï¼Œæ‰€ä»¥æœ‰äº›æ–¹æ³•å°±æ— æ³•å®žçŽ°ã€‚ + +  导致å­ç±»è„†å¼±çš„一个相关原因是,它们的父类在åŽç»­çš„å‘布版本中å¯ä»¥æ·»åŠ æ–°çš„方法。å‡è®¾ä¸€ä¸ªç¨‹åºçš„安全性ä¾èµ–于这样一个事实:所有被æ’入到集中的元素都满足一个先决æ¡ä»¶ã€‚å¯ä»¥é€šè¿‡å¯¹é›†åˆè¿›è¡Œå­ç±»åŒ–,然åŽå¹¶é‡å†™æ‰€æœ‰æ·»åŠ å…ƒç´ çš„方法,以确ä¿åœ¨æ·»åŠ æ¯ä¸ªå…ƒç´ ä¹‹å‰æ»¡è¶³è¿™ä¸ªå…ˆå†³æ¡ä»¶ï¼Œæ¥ç¡®ä¿è¿™ä¸€é—®é¢˜ã€‚如果在åŽç»­çš„版本中,父类没有新增添加元素的方法,那么这样åšæ²¡æœ‰é—®é¢˜ã€‚但是,一旦父类增加了这样的新方法,则很有肯能由于调用了未被é‡å†™çš„新方法,将éžæ³•çš„元素添加到å­ç±»çš„实例中。这ä¸æ˜¯ä¸ªçº¯ç²¹çš„ç†è®ºé—®é¢˜ã€‚在把 `Hashtable` å’Œ `Vector` 类加入到 `Collections` 框架中的时候,就修å¤äº†å‡ ä¸ªç±»ä¼¼æ€§è´¨çš„安全æ¼æ´žã€‚ + +  这两个问题都æºäºŽé‡å†™æ–¹æ³•ã€‚ 如果仅仅添加新的方法并且ä¸è¦é‡å†™çŽ°æœ‰çš„方法,å¯èƒ½ä¼šè®¤ä¸ºç»§æ‰¿ä¸€ä¸ªç±»æ˜¯å®‰å…¨çš„。 虽然这ç§æ‰©å±•æ›´ä¸ºå®‰å…¨ï¼Œä½†è¿™å¹¶éžæ²¡æœ‰é£Žé™©ã€‚ 如果父类在åŽç»­ç‰ˆæœ¬ä¸­æ·»åŠ äº†ä¸€ä¸ªæ–°çš„方法,并且你ä¸å¹¸ç»™äº†å­ç±»ä¸€ä¸ªå…·æœ‰ç›¸åŒç­¾åå’Œä¸åŒè¿”回类型的方法,那么你的å­ç±»ç¼–译失败[JLS,8.4.8.3]。 如果已ç»ä¸ºå­ç±»æ供了一个与新的父类方法具有相åŒç­¾å和返回类型的方法,那么你现在正在é‡å†™å®ƒï¼Œå› æ­¤å°†é‡åˆ°å‰é¢æ‰€è¿°çš„问题。 此外,你的方法是å¦ä¼šå±¥è¡Œæ–°çš„父类方法的约定,这是值得怀疑的,因为在你编写å­ç±»æ–¹æ³•æ—¶ï¼Œè¿™ä¸ªçº¦å®šè¿˜æ²¡æœ‰å†™å‡ºæ¥ã€‚ + +  幸è¿çš„是,有一ç§æ–¹æ³•å¯ä»¥é¿å…上述所有的问题。ä¸è¦ç»§æ‰¿ä¸€ä¸ªçŽ°æœ‰çš„类,而应该给你的新类增加一个ç§æœ‰å±žæ€§ï¼Œè¯¥å±žæ€§æ˜¯ 现有类的实例引用,这ç§è®¾è®¡è¢«ç§°ä¸ºç»„åˆï¼ˆcomposition),因为现有的类æˆä¸ºæ–°ç±»çš„组æˆéƒ¨åˆ†ã€‚新类中的æ¯ä¸ªå®žä¾‹æ–¹æ³•è°ƒç”¨çŽ°æœ‰ç±»çš„包å«å®žä¾‹ä¸Šçš„相应方法并返回结果。这被称为转å‘(forwarding),而新类中的方法被称为转å‘方法。由此产生的类将åšå¦‚ç£çŸ³ï¼Œä¸ä¾èµ–于现有类的实现细节。å³ä½¿å°†æ–°çš„方法添加到现有的类中,也ä¸ä¼šå¯¹æ–°ç±»äº§ç”Ÿå½±å“。为了具体说用,下é¢ä»£ç ä½¿ç”¨ç»„åˆå’Œè½¬å‘方法替代 `InstrumentedHashSet` 类。请注æ„,实现分为两部分,类本身和一个å¯é‡ç”¨çš„转å‘类,其中包å«æ‰€æœ‰çš„转å‘方法,没有别的方法: + +```Java +// Reusable forwarding class +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; + +public class ForwardingSet implements Set { + + private final Set s; + + public ForwardingSet(Set s) { + this.s = s; + } + + public void clear() { + s.clear(); + } + + public boolean contains(Object o) { + return s.contains(o); + } + + public boolean isEmpty() { + return s.isEmpty(); + } + + public int size() { + return s.size(); + } + + public Iterator iterator() { + return s.iterator(); + } + + public boolean add(E e) { + return s.add(e); + } + + public boolean remove(Object o) { + return s.remove(o); + } + + public boolean containsAll(Collection c) { + return s.containsAll(c); + } + + public boolean addAll(Collection c) { + return s.addAll(c); + } + + public boolean removeAll(Collection c) { + return s.removeAll(c); + } + + public boolean retainAll(Collection c) { + return s.retainAll(c); + } + + public Object[] toArray() { + return s.toArray(); + } + + public T[] toArray(T[] a) { + return s.toArray(a); + } + + @Override + public boolean equals(Object o) { + return s.equals(o); + } + + @Override + public int hashCode() { + return s.hashCode(); + } + + @Override + public String toString() { + return s.toString(); + } +} +``` + +```Java +// Wrapper class - uses composition in place of inheritance +import java.util.Collection; +import java.util.Set; + +public class InstrumentedSet extends ForwardingSet { + + private int addCount = 0; + + public InstrumentedSet(Set s) { + super(s); + } + + @Override public boolean add(E e) { + addCount++; + return super.add(e); + } + + @Override public boolean addAll(Collection c) { + addCount += c.size(); + return super.addAll(c); + } + + public int getAddCount() { + return addCount; + } +} +``` +  `InstrumentedSet` 类的设计是通过存在的 `Set` 接å£æ¥å®žçŽ°çš„,该接å£åŒ…å« `HashSet` 类的功能特性。除了功能强大,这个设计是éžå¸¸çµæ´»çš„。`InstrumentedSet` 类实现了 `Set` 接å£ï¼Œå¹¶æœ‰ä¸€ä¸ªæž„造方法,其å‚数也是 `Set` 类型的。本质上,这个类把 `Set` 转æ¢ä¸ºå¦ä¸€ä¸ªç±»åž‹ `Set`, åŒæ—¶æ·»åŠ äº†è®¡æ•°çš„功能。与基于继承的方法ä¸åŒï¼Œè¯¥æ–¹æ³•ä»…适用于å•ä¸ªå…·ä½“类,并且父类中æ¯ä¸ªéœ€è¦æ”¯æŒæž„造方法,æä¾›å•ç‹¬çš„构造方法,所以å¯ä»¥ä½¿ç”¨åŒ…装类æ¥åŒ…装任何 `Set` 实现,并且å¯ä»¥ä¸Žä»»ä½•é¢„先存在的构造方法结åˆä½¿ç”¨ï¼š + +```Java +Set times = new InstrumentedSet<>(new TreeSet<>(cmp)); +Set s = new InstrumentedSet<>(new HashSet<>(INIT_CAPACITY)); +``` + +  `InstrumentedSet` 类甚至å¯ä»¥ç”¨äºŽä¸´æ—¶æ›¿æ¢æ²¡æœ‰è®¡æ•°åŠŸèƒ½ä¸‹ä½¿ç”¨çš„集åˆå®žä¾‹ï¼š + +```Java +static void walk(Set dogs) { + InstrumentedSet iDogs = new InstrumentedSet<>(dogs); + ... // Within this method use iDogs instead of dogs +} +``` + +  `InstrumentedSet` 类被称为包装类,因为æ¯ä¸ª `InstrumentedSet` 实例都包å«ï¼ˆâ€œåŒ…装â€ï¼‰å¦ä¸€ä¸ª Set 实例。 这也被称为装饰器模å¼[Gamma95],因为 `InstrumentedSet` 类通过添加计数功能æ¥â€œè£…饰â€ä¸€ä¸ªé›†åˆã€‚ 有时组åˆå’Œè½¬å‘的结åˆè¢«ä¸ç²¾ç¡®åœ°åœ°ç§°ä¸ºå§”托(delegation)。 从技术上讲,除éžåŒ…装对象把自身传递给被包装对象,å¦åˆ™ä¸æ˜¯å§”托[Lieberman86;Gamma95]。 + +  包装类的缺点很少。 一个警告是包装类ä¸é€‚åˆåœ¨å›žè°ƒæ¡†æž¶ï¼ˆcallback frameworks)中使用,其中对象将自我引用传递给其他对象以用于åŽç»­è°ƒç”¨ï¼ˆâ€œå›žè°ƒâ€ï¼‰ã€‚ 因为一个被包装的对象ä¸çŸ¥é“它外é¢çš„包装对象,所以它传递一个指å‘自身的引用(this),回调时并ä¸è®°å¾—外é¢çš„包装对象。 这被称为 SELF 问题[Lieberman86]。 有些人担心转å‘方法调用的性能影å“,以åŠåŒ…装对象对内存å ç”¨ã€‚ 两者在实践中都没有太大的影å“。 编写转å‘方法有些ç¹ç,但是åªéœ€ä¸ºæ¯ä¸ªæŽ¥å£ç¼–写一次å¯é‡ç”¨çš„转å‘类,并且æ供转å‘类。 例如,`Guava` 为所有的 `Collection` 接å£æ供转å‘ç±»[Guava]。 + +  åªæœ‰åœ¨å­ç±»çœŸçš„是父类的å­ç±»åž‹çš„情况下,继承æ‰æ˜¯åˆé€‚的。 æ¢å¥è¯è¯´ï¼Œåªæœ‰åœ¨ä¸¤ä¸ªç±»ä¹‹é—´å­˜åœ¨â€œis-aâ€å…³ç³»çš„情况下,B ç±»æ‰èƒ½ç»§æ‰¿ A 类。 如果你试图让 B 类继承 A 类时,问自己这个问题:æ¯ä¸ª B 都是 A å—? 如果你ä¸èƒ½å¦‚实回答这个问题,那么 B å°±ä¸åº”该继承 A。如果答案是å¦å®šçš„,那么 B 通常包å«ä¸€ä¸ª A çš„ç§æœ‰å®žä¾‹ï¼Œå¹¶ä¸”暴露一个ä¸åŒçš„ API:A ä¸æ˜¯ B çš„é‡è¦éƒ¨åˆ† ,åªæ˜¯å…¶å®žçŽ°ç»†èŠ‚。 + +  在 Java å¹³å°ç±»åº“中有一些明显的è¿å这个原则的情况。 例如,`stacks` 实例并ä¸æ˜¯ `vector` 实例,所以 `Stack` ç±»ä¸åº”该继承 `Vector` 类。 åŒæ ·ï¼Œä¸€ä¸ªå±žæ€§åˆ—表ä¸æ˜¯ä¸€ä¸ªå“ˆå¸Œè¡¨ï¼Œæ‰€ä»¥ `Properties` ä¸åº”该继承 `Hashtable` 类。 在这两ç§æƒ…况下,组åˆæ–¹å¼æ›´å¯å–。 + +  如果在åˆé€‚组åˆçš„地方使用继承,则会ä¸å¿…è¦åœ°å…¬å¼€å®žçŽ°ç»†èŠ‚。由此产生的 API 将与原始实现è”系在一起,永远é™åˆ¶ç±»çš„性能。更严é‡çš„是,通过暴露其内部,客户端å¯ä»¥ç›´æŽ¥è®¿é—®å®ƒä»¬ã€‚至少,它å¯èƒ½å¯¼è‡´æ··æ·†è¯­ä¹‰ã€‚例如,属性 `p` æŒ‡å‘ `Properties` 实例,那么 `p.getProperty(key)` å’Œ `p.get(key)` 就有å¯èƒ½è¿”回ä¸åŒçš„结果:å‰è€…考虑了默认的属性表,而åŽè€…是继承 `Hashtable` 的,它则没有考虑默认属性列表。最严é‡çš„是,客户端å¯ä»¥é€šè¿‡ç›´æŽ¥ä¿®æ”¹è¶…父类æ¥ç ´åå­ç±»çš„ä¸å˜æ€§ã€‚在 `Properties` 类,设计者希望åªæœ‰å­—符串被å…许作为键和值,但直接访问底层的 `Hashtable` å…许è¿å这个ä¸å˜æ€§ã€‚一旦è¿å,就ä¸èƒ½å†ä½¿ç”¨å±žæ€§ API 的其他部分(`load` å’Œ `store` 方法)。在å‘现这个问题的时候,纠正这个问题为时已晚,因为客户端ä¾èµ–于使用éžå­—符串键和值了。 + +  在决定使用继承æ¥ä»£æ›¿ç»„åˆä¹‹å‰ï¼Œä½ åº”该问自己最åŽä¸€ç»„问题。对于试图继承的类,它的 API 有没有缺陷呢? 如果有,你是å¦æ„¿æ„将这些缺陷传播到你的类的 API 中?继承传播父类的 API 中的任何缺陷,而组åˆå¯ä»¥è®©ä½ è®¾è®¡ä¸€ä¸ªéšè—这些缺陷的新 API。 + +  总之,继承是强大的,但它是有问题的,因为它è¿åå°è£…。 åªæœ‰åœ¨å­ç±»å’Œçˆ¶ç±»ä¹‹é—´å­˜åœ¨çœŸæ­£çš„å­ç±»åž‹å…³ç³»æ—¶æ‰é€‚用。 å³ä½¿å¦‚此,如果å­ç±»ä¸Žçˆ¶ç±»ä¸åœ¨åŒä¸€ä¸ªåŒ…中,并且父类ä¸æ˜¯ä¸ºç»§æ‰¿è€Œè®¾è®¡çš„,继承å¯èƒ½ä¼šå¯¼è‡´è„†å¼±æ€§ã€‚ 为了é¿å…è¿™ç§è„†å¼±æ€§ï¼Œä½¿ç”¨åˆæˆå’Œè½¬å‘代替继承,特别是如果存在一个åˆé€‚的接å£æ¥å®žçŽ°åŒ…装类。 包装类ä¸ä»…比å­ç±»æ›´å¥å£®ï¼Œè€Œä¸”更强大。 + + + + + + diff --git a/docs/notes/19. 如使用继承则设计,应当文档说明,å¦åˆ™ä¸è¯¥ä½¿ç”¨.md b/docs/notes/19. 如使用继承则设计,应当文档说明,å¦åˆ™ä¸è¯¥ä½¿ç”¨.md new file mode 100644 index 0000000..9f5c0a6 --- /dev/null +++ b/docs/notes/19. 如使用继承则设计,应当文档说明,å¦åˆ™ä¸è¯¥ä½¿ç”¨.md @@ -0,0 +1,122 @@ +# 19. 如使用继承则设计,应当文档说明,å¦åˆ™ä¸è¯¥ä½¿ç”¨ + +  æ¡ç›® 18 中æ醒你注æ„继承没有设计和文档说明的“外æ¥â€ç±»çš„å­ç±»åŒ–çš„å±é™©ã€‚ 那么为了继承而设计和文档说明一个类是什么æ„æ€å‘¢ï¼Ÿ + +  首先,这个类必须准确地æè¿°é‡å†™è¿™ä¸ªæ–¹æ³•å¸¦æ¥çš„å½±å“。 æ¢å¥è¯è¯´ï¼Œè¯¥ç±»å¿…须文档说明å¯é‡å†™æ–¹æ³•çš„自用性(self-use)。 对于æ¯ä¸ªå…¬å…±æˆ–å—ä¿æŠ¤çš„方法,文档必须指明方法调用哪些é‡å†™æ–¹æ³•ï¼Œä»¥ä½•ç§é¡ºåºä»¥åŠæ¯æ¬¡è°ƒç”¨çš„结果如何影å“åŽç»­å¤„ç†ã€‚ (é‡å†™æ–¹æ³•ï¼Œè¿™é‡Œæ˜¯æŒ‡éž `final` 修饰的方法,无论是公开还是ä¿æŠ¤çš„。)更一般地说,一个类必须文档说明任何å¯èƒ½è°ƒç”¨å¯é‡å†™æ–¹æ³•çš„情况。 例如,åŽå°çº¿ç¨‹æˆ–者é™æ€åˆå§‹åŒ–代ç å—å¯èƒ½ä¼šè°ƒç”¨è¿™æ ·çš„方法。 + +  调用å¯é‡å†™æ–¹æ³•çš„方法在文档注释结æŸæ—¶åŒ…å«å¯¹è¿™äº›è°ƒç”¨çš„æ述。 这些æ述在规范中特定部分,标记为“Implementation Requirementsâ€ï¼Œç”± Javadoc 标签 `@implSpec` 生æˆã€‚ 本节介ç»è¯¥æ–¹æ³•çš„内部工作原ç†ã€‚ 下é¢æ˜¯ä»Ž `java.util.AbstractCollection` 类的规范中拷è´çš„例å­ï¼š + +```Java +public boolean remove(Object o) +Removes a single instance of the specified element from this collection, if it is present (optional operation). More formally, removes an element e such that Objects.equals(o, e), if this collection contains one or more such elements. Returns true if this collection contained the specified element (or equivalently, if this collection changed as a result of the call). + +Implementation Requirements: This implementation iterates over the collection looking for the specified element. If it finds the element, it removes the element from the collection using the iterator’s remove method. Note that this implementation throws an UnsupportedOperationException if the iterator returned by this collection’s iterator method does not implement the remove method and this collection contains the specified object. +``` + +  从该集åˆä¸­åˆ é™¤æŒ‡å®šå…ƒç´ çš„å•ä¸ªå®žä¾‹ï¼ˆå¦‚果存在,optional 实例æ“作)。 æ›´æ­£å¼åœ°è¯´ï¼Œå¦‚果这个集åˆåŒ…å«ä¸€ä¸ªæˆ–多个这样的元素,删除使得 `Objects.equals(o, e)` 的一个元素 e。 如果此集åˆåŒ…å«æŒ‡å®šçš„元素(或者等åŒäºŽæ­¤é›†åˆå› è°ƒç”¨è€Œå‘生了更改),则返回 true。 + +  **实现è¦æ±‚:** 这个实现迭代é历集åˆæŸ¥æ‰¾æŒ‡å®šå…ƒç´ ã€‚ 如果找到元素,则使用迭代器的 `remove` 方法从集åˆä¸­åˆ é™¤å…ƒç´ ã€‚ 请注æ„,如果此集åˆçš„ `iterator` 方法返回的迭代器未实现 `remove` 方法,并且此集åˆåŒ…å«æŒ‡å®šçš„å¯¹è±¡ï¼Œåˆ™æ­¤å®žçŽ°å°†å¼•å‘ `UnsupportedOperationException` 异常。 + +  这个文档毫无疑问地说明,é‡å†™ `iterator` æ–¹æ³•ä¼šå½±å“ `remove` 方法的行为。 它还æ述了 `iterator` 方法返回的 `Iterator` è¡Œä¸ºå°†å¦‚ä½•å½±å“ `remove` 方法的行为。 与æ¡ç›® 18 中的情况相å,在这ç§æƒ…况下,程åºå‘˜ç»§æ‰¿ HashSet 并ä¸èƒ½è¯´æ˜Žé‡å†™ `add` 方法是å¦ä¼šå½±å“ `addAll` 方法的行为。 + +  但是,这是å¦è¿èƒŒäº†ä¸€ä¸ªè‰¯å¥½çš„ API 文档应该æ述给定的方法是什么,而ä¸æ˜¯å®ƒæ˜¯å¦‚何åšçš„呢? 是的,它确实ï¼è¿™æ˜¯ç»§æ‰¿è¿åå°è£…这一事实的ä¸å¹¸åŽæžœã€‚è¦æ–‡æ¡£è¯´æ˜Žä¸€ä¸ªç±»ä»¥ä¾¿å¯ä»¥å®‰å…¨åœ°è¿›è¡Œå­ç±»åŒ–,必须æ述清楚那些没有详细说明的实现细节。 + +  `@implSpec` 标签是在 Java 8 中添加的,并且在 Java 9 中被大é‡ä½¿ç”¨ã€‚这个标签应该默认å¯ç”¨ï¼Œä½†æ˜¯ä»Ž Java 9 开始,除éžé€šè¿‡å‘½ä»¤è¡Œå¼€å…³`-tag "apiNote:a:API Note:"`,å¦åˆ™ Javadoc 实用工具ä»ç„¶ä¼šå¿½ç•¥å®ƒã€‚ + +  设计继承涉åŠçš„ä¸ä»…仅是文档说明自用的模å¼ã€‚ 为了让程åºå‘˜èƒ½å¤Ÿå†™å‡ºæœ‰æ•ˆçš„å­ç±»è€Œä¸ä¼šå¸¦æ¥ä¸é€‚当的痛苦,一个类å¯èƒ½ä»¥æ˜Žæ™ºé€‰æ‹©çš„å—ä¿æŠ¤æ–¹æ³•çš„å½¢å¼æ供内部工作,或者在罕è§çš„情况下,æä¾›å—ä¿æŠ¤çš„属性。 例如,考虑 `java.util.AbstractList` 中的 `removeRange` 方法: + +```Java +protected void removeRange(int fromIndex, int toIndex) +Removes from this list all of the elements whose index is between fromIndex, inclusive, and toIndex, exclusive. Shifts any succeeding elements to the left (reduces their index). This call shortens the list by (toIndex - fromIndex) elements. (If toIndex == fromIndex, this operation has no effect.) +This method is called by the clear operation on this list and its sublists. Overriding this method to take advantage of the internals of the list implementation can substantially improve the performance of the clear operation on this list and its sublists. +Implementation Requirements: This implementation gets a list iterator positioned before fromIndex and repeatedly calls ListIterator.nextfollowed by ListIterator.remove, until the entire range has been removed. Note: If ListIterator.remove requires linear time, this implementation requires quadratic time. +Parameters: +fromIndex index of first element to be removed. + +toIndex index after last element to be removed. +``` + +  从此列表中删除索引介于 `fromIndex`(包å«ï¼‰å’Œ `inclusive`(ä¸å«ï¼‰ä¹‹é—´çš„所有元素。 将任何åŽç»­å…ƒç´ å‘左移(å‡å°‘索引)。 这个调用通过(`toIndex - fromIndex`)元素æ¥ç¼©çŸ­åˆ—表。 (如果 `toIndex == fromIndex`,则此æ“作无效。) + +  这个方法是通过列表åŠå…¶å­ç±»çš„ `clear` æ“作æ¥è°ƒç”¨çš„。é‡å†™è¿™ä¸ªæ–¹æ³•åˆ©ç”¨åˆ—表内部实现的优势,å¯ä»¥å¤§å¤§æ高列表和å­ç±»çš„ `clear` æ“作性能。 + +  实现è¦æ±‚:这个实现获å–一个列表迭代器,它ä½äºŽ `fromIndex` 之å‰ï¼Œå¹¶é‡å¤è°ƒç”¨ `ListIterator.remove` å’Œ `ListIterator.next` 方法,直到整个范围被删除。 注æ„:如果 `ListIterator.remove` 需è¦çº¿æ€§æ—¶é—´ï¼Œåˆ™æ­¤å®žçŽ°éœ€è¦å¹³æ–¹çº§æ—¶é—´ã€‚ + +>å‚数: +>  fromIndex è¦ç§»é™¤çš„第一个元素的索引 +>  toIndex è¦ç§»é™¤çš„最åŽä¸€ä¸ªå…ƒç´ ä¹‹åŽçš„索引 + +  这个方法对 `List` 实现的最终用户æ¥è¯´æ˜¯æ²¡æœ‰æ„义的。 它仅仅是为了使å­ç±»å¾ˆå®¹æ˜“æ供一个快速 `clear` 方法。 在没有 `removeRange` 方法的情况下,当在å­åˆ—表上调用 `clear` 方法,å­ç±»å°†ä¸å¾—ä¸ä½¿ç”¨å¹³æ–¹çº§çš„时间,å¦åˆ™ï¼Œæˆ–从头é‡å†™æ•´ä¸ª `subList` 机制——这ä¸æ˜¯ä¸€ä»¶å®¹æ˜“çš„äº‹æƒ…ï¼ + +  那么当你设计一个继承类的时候,你如何决定暴露哪些的å—ä¿æŠ¤çš„æˆå‘˜å‘¢ï¼Ÿ ä¸å¹¸çš„是,没有çµä¸¹å¦™è¯ã€‚ 所能åšçš„最好的就是努力æ€è€ƒï¼Œåšå‡ºæœ€å¥½çš„测试,然åŽé€šè¿‡ç¼–写å­ç±»æ¥è¿›è¡Œæµ‹è¯•ã€‚ 应该尽å¯èƒ½å°‘地暴露å—ä¿æŠ¤çš„æˆå‘˜ï¼Œå› ä¸ºæ¯ä¸ªæˆå‘˜éƒ½è¡¨ç¤ºå¯¹å®žçŽ°ç»†èŠ‚的承诺。 å¦ä¸€æ–¹é¢ï¼Œä½ ä¸èƒ½æš´éœ²å¤ªå°‘,因为失去了ä¿æŠ¤çš„æˆå‘˜ä¼šå¯¼è‡´ä¸€ä¸ªç±»å‡ ä¹Žä¸èƒ½ç”¨äºŽç»§æ‰¿ã€‚ + +  **测试为继承而设计的类的唯一方法是编写å­ç±»ã€‚** 如果你忽略了一个关键的å—ä¿æŠ¤çš„æˆå‘˜ï¼Œè¯•å›¾ç¼–写一个å­ç±»å°†ä¼šä½¿å¾—é—æ¼ç—›è‹¦åœ°å˜å¾—明显。 相å,如果编写的几个å­ç±»ï¼Œè€Œä¸”没有一个使用å—ä¿æŠ¤çš„æˆå‘˜ï¼Œé‚£ä¹ˆåº”该将其设为ç§æœ‰ã€‚ ç»éªŒè¡¨æ˜Žï¼Œä¸‰ä¸ªå­ç±»é€šå¸¸è¶³ä»¥æµ‹è¯•ä¸€ä¸ªå¯ç»§æ‰¿çš„类。 这些å­ç±»åº”该由父类作者以外的人编写。 + +  当你为继承设计一个å¯èƒ½è¢«å¹¿æ³›ä½¿ç”¨çš„类的时候,è¦æ„识到你永远承诺你文档说明的自用模å¼ä»¥åŠéšå«åœ¨å…¶ä¿æŠ¤çš„方法和属性中的实现决定。 这些承诺å¯èƒ½ä¼šä½¿åŽç»­ç‰ˆæœ¬ä¸­æ”¹å–„类的性能或功能å˜å¾—困难或ä¸å¯èƒ½ã€‚ 因此, **在å‘布它之å‰ï¼Œä½ å¿…须通过编写å­ç±»æ¥æµ‹è¯•ä½ çš„类。** + +  å¦å¤–,请注æ„,继承所需的特殊文档混乱了正常的文档,这是为创建类的实例并在其上调用方法的程åºå‘˜è®¾è®¡çš„。 在撰写本文时,几乎没有工具将普通的 API 文档从和仅仅针对å­ç±»å®žçŽ°çš„ä¿¡æ¯ï¼Œåˆ†ç¦»å‡ºæ¥ã€‚ + +  还有一些类必须éµå®ˆå…许继承的é™åˆ¶ã€‚ **构造方法ç»ä¸èƒ½ç›´æŽ¥æˆ–间接调用å¯é‡å†™çš„方法。** 如果è¿å这个规则,将导致程åºå¤±è´¥ã€‚ 父类构造方法在å­ç±»æž„造方法之å‰è¿è¡Œï¼Œæ‰€ä»¥åœ¨å­ç±»æž„造方法è¿è¡Œä¹‹å‰ï¼Œå­ç±»ä¸­çš„é‡å†™æ–¹æ³•è¢«è°ƒç”¨ã€‚ 如果é‡å†™æ–¹æ³•ä¾èµ–于å­ç±»æž„造方法执行的任何åˆå§‹åŒ–,则此方法将ä¸ä¼šæŒ‰é¢„期è¿è¡Œã€‚ 为了具体说明,这是一个è¿å这个规则的类: + +```Java +public class Super { + // Broken - constructor invokes an overridable method + public Super() { + overrideMe(); + } + public void overrideMe() { + } +} +``` + +  以下是一个é‡å†™ `overrideMe` 方法的å­ç±»ï¼Œ`Super` 类的唯一构造方法会错误地调用它: + +```Java +public final class Sub extends Super { + // Blank final, set by constructor + private final Instant instant; + + Sub() { + instant = Instant.now(); + } + + // Overriding method invoked by superclass constructor + @Override + public void overrideMe() { + System.out.println(instant); + } + + public static void main(String[] args) { + Sub sub = new Sub(); + sub.overrideMe(); + } +} +``` + +  你å¯èƒ½æœŸæœ›è¿™ä¸ªç¨‹åºæ‰“å°ä¸¤æ¬¡ `instant` 实例,但是它第一次打å°å‡º `null`,因为在 `Sub` 构造方法有机会åˆå§‹åŒ– `instant` 属性之å‰ï¼Œ`overrideMe` 被 `Super` 构造方法调用。 请注æ„,这个程åºè§‚察两个ä¸åŒçŠ¶æ€çš„ `final` å±žæ€§ï¼ è¿˜è¦æ³¨æ„的是,如果 `overrideMe` 方法调用了 instant 实例中任何方法,那么当父类构造方法调用 `overrideMe` 时,它将抛出一个 `NullPointerException` 异常。 这个程åºä¸ä¼šæŠ›å‡º `NullPointerException` 的唯一原因是 `println` æ–¹æ³•å®¹å¿ `null` å‚数。 + +  请注æ„,从构造方法中调用ç§æœ‰æ–¹æ³•ï¼Œå…¶ä¸­ä»»ä½•ä¸€ä¸ªæ–¹æ³•éƒ½ä¸å¯é‡å†™çš„,那么 `final` 方法和é™æ€æ–¹æ³•æ˜¯å®‰å…¨çš„。 + +  `Cloneable` å’Œ `Serializable` 接å£åœ¨è®¾è®¡ç»§æ‰¿æ—¶ä¼šå¸¦æ¥ç‰¹æ®Šçš„困难。 对于为继承而设计的类æ¥è¯´ï¼Œå®žçŽ°è¿™äº›æŽ¥å£é€šå¸¸ä¸æ˜¯ä¸€ä¸ªå¥½ä¸»æ„,因为这会给继承类的程åºå‘˜å¸¦æ¥å¾ˆå¤§çš„负担。 然而,å¯ä»¥é‡‡å–特殊的行动æ¥å…许å­ç±»å®žçŽ°è¿™äº›æŽ¥å£ï¼Œè€Œä¸éœ€è¦å¼ºåˆ¶è¿™æ ·åšã€‚ 这些æ“作在æ¡ç›® 13 å’Œæ¡ç›® 86 中有æ述。 + +  如果你决定在为继承而设计的类中实现 `Cloneable` 或 `Serializable` 接å£ï¼Œé‚£ä¹ˆåº”该知é“,由于 `clone` å’Œ `readObject` 方法与构造方法相似,所以也有类似的é™åˆ¶ï¼š **`clone` å’Œ `readObject` 都ä¸ä¼šç›´æŽ¥æˆ–间接调用å¯é‡å†™çš„方法。** 在 `readObject` 的情况下,é‡å†™æ–¹æ³•å°†åœ¨å­ç±»çš„状æ€è¢«ååºåˆ—化之å‰è¿è¡Œã€‚ 在 `clone` 的情况下,é‡å†™æ–¹æ³•å°†åœ¨å­ç±»çš„ `clone` 方法有机会修å¤å…‹éš†çš„状æ€ä¹‹å‰è¿è¡Œã€‚ 在任何一ç§æƒ…况下,都å¯èƒ½ä¼šå‡ºçŽ°ç¨‹åºæ•…障。 在 `clone` 的情况下,故障å¯èƒ½ä¼šæŸå原始对象以åŠè¢«å…‹éš†å¯¹è±¡æœ¬èº«ã€‚ 例如,如果é‡å†™æ–¹æ³•å‡å®šå®ƒæ­£åœ¨ä¿®æ”¹å¯¹è±¡çš„深层结构的拷è´ï¼Œä½†æ˜¯å°šæœªåˆ›å»ºæ‹·è´ï¼Œåˆ™å¯èƒ½å‘生这ç§æƒ…况。 + +  最åŽï¼Œå¦‚果你决定在为继承设计的类中实现 `Serializable` 接å£ï¼Œå¹¶ä¸”该类有一个 `readResolve` 或 `writeReplace` 方法,则必须使 `readResolve` 或 `writeReplace` 方法设置为å—ä¿æŠ¤è€Œä¸æ˜¯ç§æœ‰ã€‚ 如果这些方法是ç§æœ‰çš„,它们将被å­ç±»æ— å£°åœ°å¿½ç•¥ã€‚ 这是å¦ä¸€ç§æƒ…况,把实现细节æˆä¸ºç±»çš„ API 的一部分,以å…许继承。 + +  到目å‰ä¸ºæ­¢ï¼Œ**设计一个继承类需è¦å¾ˆå¤§çš„努力,并且对这个类有很大的é™åˆ¶ã€‚** è¿™ä¸æ˜¯ä¸€ä¸ªè½»çŽ‡çš„决定。 有些情况显然是正确的,比如抽象类,包括接å£çš„骨架实现(skeletal implementations)(æ¡ç›® 20)。 还有其他的情况显然是错误的,比如ä¸å¯å˜çš„类(æ¡ç›® 17)。 + +  但是普通的具体类呢? 传统上,它们既ä¸æ˜¯ `final` 的,也ä¸æ˜¯ä¸ºäº†å­ç±»åŒ–而设计和文档说明的,但是这ç§æƒ…况是å±é™©çš„。æ¯æ¬¡ä¿®æ”¹è¿™æ ·çš„类,则继承此类的å­ç±»å°†è¢«ç ´å。 è¿™ä¸ä»…仅是一个ç†è®ºé—®é¢˜ã€‚ åœ¨ä¿®æ”¹éž `final` 的具体类的内部之åŽï¼ŒæŽ¥æ”¶ä¸Žå­ç±»ç›¸å…³çš„错误报告并ä¸å°‘è§ï¼Œè¿™äº›ç±»æ²¡æœ‰ä¸ºç»§æ‰¿è€Œè®¾è®¡å’Œæ–‡æ¡£è¯´æ˜Žã€‚ + +  **解决这个问题的最好办法是,在没有想è¦å®‰å…¨åœ°å­ç±»åŒ–的设计和文档说明的类中ç¦æ­¢å­ç±»åŒ–。 有两ç§æ–¹æ³•ç¦æ­¢å­ç±»åŒ–。** 两者中较容易的是声明类为 `final`。 å¦ä¸€ç§æ–¹æ³•æ˜¯ä½¿æ‰€æœ‰çš„构造方法都是ç§æœ‰çš„或包级ç§æœ‰çš„,并且添加公共é™æ€å·¥åŽ‚æ¥ä»£æ›¿æž„造方法。 这个方案在内部æ供了使用å­ç±»çš„çµæ´»æ€§ï¼Œåœ¨æ¡ç›® 17 中讨论过。两ç§æ–¹æ³•éƒ½æ˜¯å¯ä»¥æŽ¥å—的。 + +  这个建议å¯èƒ½æœ‰äº›äº‰è®®ï¼Œå› ä¸ºè®¸å¤šç¨‹åºå‘˜å·²ç»ä¹ æƒ¯äºŽç»§æ‰¿æ™®é€šçš„具体类æ¥å¢žåŠ åŠŸèƒ½ï¼Œä¾‹å¦‚通知和åŒæ­¥ç­‰åŠŸèƒ½ï¼Œæˆ–é™åˆ¶åŽŸæœ‰ç±»çš„功能。 如果一个类实现了æ•èŽ·å…¶æœ¬è´¨çš„一些接å£ï¼Œæ¯”如 `Set`,`List` 或 `Map`,那么ä¸åº”该为了ç¦æ­¢å­ç±»åŒ–而感到愧疚。 在æ¡ç›® 18 中æ述的包装类模å¼ä¸ºå¢žå¼ºåŠŸèƒ½æ供了继承的优越选择。 + +  如果一个具体的类没有实现一个标准的接å£ï¼Œé‚£ä¹ˆä½ å¯èƒ½ä¼šé€šè¿‡ç¦æ­¢ç»§æ‰¿æ¥ç»™ä¸€äº›ç¨‹åºå‘˜å¸¦æ¥ä¸ä¾¿ã€‚ 如果你觉得你必须å…许从这样的类继承,一个åˆç†çš„方法是确ä¿ç±»ä»Žä¸è°ƒç”¨ä»»ä½•å¯é‡å†™çš„方法,并文档说明这个事实。 æ¢å¥è¯è¯´ï¼Œå®Œå…¨æ¶ˆé™¤ç±»çš„自用(self-use)的å¯é‡å†™çš„方法。 这样åšï¼Œä½ å°†åˆ›å»ºä¸€ä¸ªåˆç†å®‰å…¨çš„å­ç±»ã€‚ é‡å†™ä¸€ä¸ªæ–¹æ³•ä¸ä¼šå½±å“任何其他方法的行为。 + +  你å¯ä»¥æœºæ¢°åœ°æ¶ˆé™¤ç±»çš„自我使用的é‡å†™æ–¹æ³•ï¼Œè€Œä¸ä¼šæ”¹å˜å…¶è¡Œä¸ºã€‚ å°†æ¯ä¸ªå¯é‡å†™çš„方法的主体移动到一个ç§æœ‰çš„“帮助器方法â€ï¼Œå¹¶è®©æ¯ä¸ªå¯é‡å†™çš„方法调用其ç§æœ‰çš„帮助器方法。 然åŽç”¨ç›´æŽ¥è°ƒç”¨å¯é‡å†™æ–¹æ³•çš„专用帮助器方法æ¥æ›¿æ¢æ¯ä¸ªè‡ªç”¨çš„å¯é‡å†™æ–¹æ³•ã€‚ + + +  总之,设计一个继承类是一件很辛苦的事情。 你必须文档说明所有的自用模å¼ï¼Œä¸€æ—¦ä½ æ–‡æ¡£è¯´æ˜Žäº†å®ƒä»¬ï¼Œå¿…须承诺为他们的整个生命周期。 如果你ä¸è¿™æ ·åšï¼Œå­ç±»å¯èƒ½ä¼šä¾èµ–于父类的实现细节,并且如果父类的实现å‘生改å˜ï¼Œå­ç±»å¯èƒ½ä¼šæŸå。 为了å…许其他人编写高效的å­ç±»ï¼Œå¯èƒ½è¿˜éœ€è¦å¯¼å‡ºä¸€ä¸ªæˆ–多个å—ä¿æŠ¤çš„方法。 除éžä½ çŸ¥é“有一个真正的å­ç±»éœ€è¦ï¼Œå¦åˆ™ä½ å¯èƒ½æœ€å¥½æ˜¯é€šè¿‡å£°æ˜Žä½ çš„类为 `final` ç¦æ­¢ç»§æ‰¿ï¼Œæˆ–者确ä¿æ²¡æœ‰å¯è®¿é—®çš„构造方法。 + + + diff --git a/docs/notes/20. 接å£ä¼˜äºŽæŠ½è±¡ç±».md b/docs/notes/20. 接å£ä¼˜äºŽæŠ½è±¡ç±».md new file mode 100644 index 0000000..124ae99 --- /dev/null +++ b/docs/notes/20. 接å£ä¼˜äºŽæŠ½è±¡ç±».md @@ -0,0 +1,123 @@ +# 20. 接å£ä¼˜äºŽæŠ½è±¡ç±» + +  Java 有两ç§æœºåˆ¶æ¥å®šä¹‰å…许多个实现的类型:接å£å’ŒæŠ½è±¡ç±»ã€‚ 由于在 Java 8 [JLS 9.4.3] 中引入了接å£çš„默认方法(default methods ),因此这两ç§æœºåˆ¶éƒ½å…许为æŸäº›å®žä¾‹æ–¹æ³•æ供实现。 一个主è¦çš„区别是è¦å®žçŽ°ç”±æŠ½è±¡ç±»å®šä¹‰çš„类型,类必须是抽象类的å­ç±»ã€‚ 因为 Java åªå…许å•ä¸€ç»§æ‰¿ï¼Œæ‰€ä»¥å¯¹æŠ½è±¡ç±»çš„è¿™ç§é™åˆ¶ä¸¥æ ¼é™åˆ¶äº†å®ƒä»¬ä½œä¸ºç±»åž‹å®šä¹‰çš„使用。 任何定义所有必需方法并æœä»Žé€šç”¨çº¦å®šçš„类都å¯ä»¥å®žçŽ°ä¸€ä¸ªæŽ¥å£ï¼Œè€Œä¸ç®¡ç±»åœ¨ç±»å±‚次结构中的ä½ç½®ã€‚ + +  现有的类å¯ä»¥å¾ˆå®¹æ˜“地进行改进æ¥å®žçŽ°ä¸€ä¸ªæ–°çš„接å£ã€‚ ä½ åªéœ€æ·»åŠ æ‰€éœ€çš„方法(如果尚ä¸å­˜åœ¨çš„è¯ï¼‰ï¼Œå¹¶å‘类声明中添加一个 `implements` å­å¥ã€‚ 例如,当 `Comparable`, `Iterable`, å’Œ `Autocloseable` 接å£æ·»åŠ åˆ° Java å¹³å°æ—¶ï¼Œå¾ˆå¤šçŽ°æœ‰ç±»éœ€è¦å®žçŽ°å®ƒä»¬æ¥åŠ ä»¥æ”¹è¿›ã€‚ 一般æ¥è¯´ï¼ŒçŽ°æœ‰çš„ç±»ä¸èƒ½æ”¹è¿›ä»¥ç»§æ‰¿ä¸€ä¸ªæ–°çš„抽象类。 如果你想让两个类继承相åŒçš„抽象类,你必须把它放在类型层级结构中的上é¢ä½ç½®ï¼Œå®ƒæ˜¯ä¸¤ä¸ªç±»çš„祖先。 ä¸å¹¸çš„是,这会对类型层级结构造æˆå¾ˆå¤§çš„附带æŸå®³ï¼Œè¿«ä½¿æ–°çš„抽象类的所有åŽä»£å¯¹å®ƒè¿›è¡Œå­ç±»åŒ–,无论这些åŽä»£ç±»æ˜¯å¦åˆé€‚。 + +  接å£æ˜¯å®šä¹‰æ··åˆç±»åž‹ï¼ˆmixin)的ç†æƒ³é€‰æ‹©ã€‚ 一般æ¥è¯´ï¼Œmixin 是一个类,除了它的“主类型â€ä¹‹å¤–,还å¯ä»¥å£°æ˜Žå®ƒæ供了一些å¯é€‰çš„行为。 例如,`Comparable` 是一个类型接å£ï¼Œå®ƒå…许一个类声明它的实例相对于其他å¯ç›¸äº’比较的对象是有åºçš„。 这样的接å£è¢«ç§°ä¸ºç±»åž‹ï¼Œå› ä¸ºå®ƒå…许å¯é€‰åŠŸèƒ½è¢«â€œæ··åˆâ€åˆ°ç±»åž‹çš„主è¦åŠŸèƒ½ã€‚ 抽象类ä¸èƒ½ç”¨äºŽå®šä¹‰æ··åˆç±»ï¼Œè¿™æ˜¯å› ä¸ºå®ƒä»¬ä¸èƒ½è¢«åŠ è½½åˆ°çŽ°æœ‰çš„类中:一个类ä¸èƒ½æœ‰å¤šä¸ªçˆ¶ç±»ï¼Œå¹¶ä¸”在类层次结构中没有åˆç†çš„ä½ç½®æ¥æ’入一个类型。 + +  接å£å…许构建éžå±‚级类型的框架。 类型层级对于组织æŸäº›äº‹ç‰©æ¥è¯´æ˜¯å¾ˆå¥½çš„,但是其他的事物并ä¸æ˜¯æ•´é½åœ°è½å…¥ä¸¥æ ¼çš„层级结构中。 例如,å‡è®¾æˆ‘们有一个代表歌手的接å£ï¼Œå’Œå¦ä¸€ä¸ªä»£è¡¨ä½œæ›²å®¶çš„接å£ï¼š + +```Java +public interface Singer { + AudioClip sing(Song s); +} + +public interface Songwriter { + Song compose(int chartPosition); +} +``` + +  在现实生活中,一些歌手也是作曲家。 因为我们使用接å£è€Œä¸æ˜¯æŠ½è±¡ç±»æ¥å®šä¹‰è¿™äº›ç±»åž‹ï¼Œæ‰€ä»¥å•ä¸ªç±»å®žçŽ°æ­Œæ‰‹å’Œä½œæ›²å®¶ä¸¤ä¸ªæŽ¥å£æ˜¯å®Œå…¨å…许的。 事实上,我们å¯ä»¥å®šä¹‰ä¸€ä¸ªç»§æ‰¿æ­Œæ‰‹å’Œä½œæ›²å®¶çš„第三个接å£ï¼Œå¹¶æ·»åŠ é€‚åˆäºŽè¿™ä¸ªç»„åˆçš„新方法: + +```Java +public interface SingerSongwriter extends Singer, Songwriter { + AudioClip strum(); + void actSensitive(); +} +``` + +  你并ä¸æ€»æ˜¯éœ€è¦è¿™ç§çµæ´»æ€§ï¼Œä½†æ˜¯å½“你这样åšçš„时候,接å£æ˜¯ä¸€ä¸ªæ•‘星。 å¦ä¸€ç§æ–¹æ³•æ˜¯å¯¹äºŽæ¯ä¸ªå—支æŒçš„属性组åˆï¼ŒåŒ…å«ä¸€ä¸ªå•ç‹¬çš„类的臃肿类层级结构。 如果类型系统中有 n 个属性,则å¯èƒ½éœ€è¦æ”¯æŒ 2n ç§å¯èƒ½çš„组åˆã€‚ 这就是所谓的组åˆçˆ†ç‚¸ï¼ˆcombinatorial explosion)。 臃肿的类层级结构å¯èƒ½ä¼šå¯¼è‡´å…·æœ‰è®¸å¤šæ–¹æ³•çš„臃肿类,这些方法仅在å‚数类型上有所ä¸åŒï¼Œå› ä¸ºç±»å±‚级结构中没有类型æ¥æ•èŽ·é€šç”¨è¡Œä¸ºã€‚ + +  接å£é€šè¿‡åŒ…装类模å¼ç¡®ä¿å®‰å…¨çš„,强大的功能增强æˆä¸ºå¯èƒ½ï¼ˆæ¡ç›® 18)。 如果使用抽象类æ¥å®šä¹‰ç±»åž‹ï¼Œé‚£ä¹ˆå°±è®©ç¨‹åºå‘˜æƒ³è¦æ·»åŠ åŠŸèƒ½ï¼Œåªèƒ½ç»§æ‰¿ã€‚ 生æˆçš„类比包装类更弱,更脆弱。 + +  当其他接å£æ–¹æ³•æœ‰æ˜Žæ˜¾çš„接å£æ–¹æ³•å®žçŽ°æ—¶ï¼Œå¯ä»¥è€ƒè™‘å‘程åºå‘˜æ供默认形å¼çš„方法实现帮助。 有关此技术的示例,请å‚阅第 104 页的 `removeIf` 方法。如果æ供默认方法,请确ä¿ä½¿ç”¨`@implSpec` Javadoc 标记(æ¡ç›® 19)将它们文档说明为继承。 + +  使用默认方法å¯ä»¥æ供实现帮助多多少少是有些é™åˆ¶çš„。 尽管许多接å£æŒ‡å®šäº† `Object` 类中方法(如 `equals` å’Œ `hashCode`)的行为,但ä¸å…许为它们æ供默认方法。 此外,接å£ä¸å…许包å«å®žä¾‹å±žæ€§æˆ–éžå…¬å…±é™æ€æˆå‘˜ï¼ˆç§æœ‰é™æ€æ–¹æ³•é™¤å¤–)。 最åŽï¼Œä¸èƒ½å°†é»˜è®¤æ–¹æ³•æ·»åŠ åˆ°ä¸å—控制的接å£ä¸­ã€‚ + +  但是,你å¯ä»¥é€šè¿‡æ供一个抽象的骨架实现类(abstract skeletal implementation class)æ¥ä¸ŽæŽ¥å£ä¸€èµ·ä½¿ç”¨ï¼Œå°†æŽ¥å£å’ŒæŠ½è±¡ç±»çš„优点结åˆèµ·æ¥ã€‚ 接å£å®šä¹‰äº†ç±»åž‹ï¼Œå¯èƒ½æ供了一些默认的方法,而骨架实现类在原始接å£æ–¹æ³•çš„顶层实现了剩余的éžåŽŸå§‹æŽ¥å£æ–¹æ³•ã€‚ 继承骨架实现需è¦å¤§éƒ¨åˆ†çš„工作æ¥å®žçŽ°ä¸€ä¸ªæŽ¥å£ã€‚ 这就是模æ¿æ–¹æ³•è®¾è®¡æ¨¡å¼[Gamma95]。 + +  按照惯例,骨架实现类被称为 `AbstractInterface`,其中 `Interface` 是它们实现的接å£çš„å称。 例如,集åˆæ¡†æž¶ï¼ˆ Collections Framework)æ供了一个框架实现以é…åˆæ¯ä¸ªä¸»è¦é›†åˆæŽ¥å£ï¼š`AbstractCollection`,`AbstractSet`,`AbstractList` å’Œ `AbstractMap`。 å¯ä»¥è¯´ï¼Œå°†å®ƒä»¬ç§°ä¸º `SkeletalCollection`,`SkeletalSet`,`SkeletalList` å’Œ `SkeletalMap` 是有é“ç†çš„,但是现在已ç»ç¡®ç«‹äº†æŠ½è±¡çº¦å®šã€‚ 如果设计得当,骨架实现(无论是å•ç‹¬çš„抽象类还是仅由接å£ä¸Šçš„默认方法组æˆï¼‰å¯ä»¥ä½¿ç¨‹åºå‘˜éžå¸¸å®¹æ˜“地æ供他们自己的接å£å®žçŽ°ã€‚ 例如,下é¢æ˜¯ä¸€ä¸ªé™æ€å·¥åŽ‚方法,在 `AbstractList` 的顶层包å«ä¸€ä¸ªå®Œæ•´çš„功能é½å…¨çš„ `List` 实现: + +```Java +// Concrete implementation built atop skeletal implementation +static List intArrayAsList(int[] a) { + Objects.requireNonNull(a); + // The diamond operator is only legal here in Java 9 and later + // If you're using an earlier release, specify + return new AbstractList<>() { + @Override + public Integer get(int i) { + return a[i]; // Autoboxing ([Item 6](https://www.safaribooksonline.com/library/view/effective-java-third/9780134686097/ch2.xhtml#lev6)) + } + + @Override + public Integer set(int i, Integer val) { + int oldVal = a[I]; + a[i] = val; // Auto-unboxing + return oldVal; // Autoboxing + } + + @Override + public int size() { + return a.length; + } + }; + +} +``` + +  当你考虑一个 `List` 实现为你åšçš„所有事情时,这个例å­æ˜¯ä¸€ä¸ªéª¨æž¶å®žçŽ°çš„强大的演示。 顺便说一å¥ï¼Œè¿™ä¸ªä¾‹å­æ˜¯ä¸€ä¸ªé€‚é…器(Adapter)[Gamma95],它å…许一个 `int` 数组被看作 `Integer` 实例列表。 由于 `int` 值和整数实例(装箱和拆箱)之间的æ¥å›žè½¬æ¢ï¼Œå…¶æ€§èƒ½å¹¶ä¸æ˜¯éžå¸¸å¥½ã€‚ 请注æ„,实现采用匿å类的形å¼ï¼ˆæ¡ç›® 24)。 + +  骨架实现类的优点在于,它们æ供抽象类的所有实现的帮助,而ä¸ä¼šå¼ºåŠ æŠ½è±¡ç±»ä½œä¸ºç±»åž‹å®šä¹‰æ—¶çš„严格约æŸã€‚对于具有骨架实现类的接å£çš„大多数实现者æ¥è¯´ï¼Œç»§æ‰¿è¿™ä¸ªç±»æ˜¯æ˜¾è€Œæ˜“è§çš„选择,但它ä¸æ˜¯å¿…需的。如果一个类ä¸èƒ½ç»§æ‰¿éª¨æž¶çš„实现,这个类å¯ä»¥ç›´æŽ¥å®žçŽ°æŽ¥å£ã€‚该类ä»ç„¶å—益于接å£æœ¬èº«çš„任何默认方法。此外,骨架实现类ä»ç„¶å¯ä»¥å助接å£çš„实现。实现接å£çš„ç±»å¯ä»¥å°†æŽ¥å£æ–¹æ³•çš„调用转å‘给继承骨架实现的ç§æœ‰å†…部类的包å«å®žä¾‹ã€‚è¿™ç§è¢«ç§°ä¸ºæ¨¡æ‹Ÿå¤šé‡ç»§æ‰¿çš„技术与æ¡ç›® 18 讨论的包装类模å¼å¯†åˆ‡ç›¸å…³ã€‚它æ供了多é‡ç»§æ‰¿çš„许多好处,åŒæ—¶é¿å…了缺陷。 + +  编写一个骨架的实现是一个相对简å•çš„过程,虽然有些ä¹å‘³ã€‚ 首先,研究接å£ï¼Œå¹¶ç¡®å®šå“ªäº›æ–¹æ³•æ˜¯åŸºæœ¬çš„,其他方法å¯ä»¥æ ¹æ®å®ƒä»¬æ¥å®žçŽ°ã€‚ 这些基本方法是你的骨架实现类中的抽象方法。 接下æ¥ï¼Œä¸ºæ‰€æœ‰å¯ä»¥ç›´æŽ¥åœ¨åŸºæœ¬æ–¹æ³•ä¹‹ä¸Šå®žçŽ°çš„方法æ供接å£ä¸­çš„默认方法,回想一下,你å¯èƒ½ä¸ä¼šä¸ºè¯¸å¦‚ `Object` 类中 `equals` å’Œ `hashCode` 等方法æ供默认方法。 如果基本方法和默认方法涵盖了接å£ï¼Œé‚£ä¹ˆå°±å®Œæˆäº†ï¼Œå¹¶ä¸”ä¸éœ€è¦éª¨æž¶å®žçŽ°ç±»ã€‚ å¦åˆ™ï¼Œç¼–写一个声明实现接å£çš„类,并实现所有剩下的接å£æ–¹æ³•ã€‚ 为了适åˆäºŽè¯¥ä»»åŠ¡ï¼Œæ­¤ç±»å¯èƒ½åŒ…å«ä»»ä½•çš„éžå…¬å…±å±žæ€§å’Œæ–¹æ³•ã€‚ + +  作为一个简å•çš„例å­ï¼Œè€ƒè™‘一下 `Map.Entry` 接å£ã€‚ 显而易è§çš„基本方法是 `getKey`,`getValue` 和(å¯é€‰çš„)`setValue`。 接å£æŒ‡å®šäº† `equals` å’Œ `hashCode` 的行为,并且在基本方é¢æ–¹é¢æœ‰ä¸€ä¸ª `toString` 的明显的实现。 由于ä¸å…许为 `Object` 类方法æ供默认实现,因此所有实现å‡æ”¾ç½®åœ¨éª¨æž¶å®žçŽ°ç±»ä¸­ï¼š + +```Java +// Skeletal implementation class +public abstract class AbstractMapEntry + implements Map.Entry { + + // Entries in a modifiable map must override this method + @Override public V setValue(V value) { + throw new UnsupportedOperationException(); + } + + // Implements the general contract of Map.Entry.equals + @Override + public boolean equals(Object o) { + if (o == this) + return true; + if (!(o instanceof Map.Entry)) + return false; + Map.Entry e = (Map.Entry) o; + return Objects.equals(e.getKey(), getKey()) + && Objects.equals(e.getValue(), getValue()); + } + + // Implements the general contract of Map.Entry.hashCode + @Override + public int hashCode() { + return Objects.hashCode(getKey()) + ^ Objects.hashCode(getValue()); + } + + @Override + public String toString() { + return getKey() + "=" + getValue(); + } + +} +``` + +  请注æ„,这个骨架实现ä¸èƒ½åœ¨ `Map.Entry` 接å£ä¸­å®žçŽ°ï¼Œä¹Ÿä¸èƒ½ä½œä¸ºå­æŽ¥å£å®žçŽ°ï¼Œå› ä¸ºé»˜è®¤æ–¹æ³•ä¸å…许é‡å†™è¯¸å¦‚ `equals`,`hashCode` å’Œ `toString` ç­‰ `Object` 类方法。 + +  由于骨架实现类是为了继承而设计的,所以你应该éµå¾ªæ¡ç›® 19 中的所有设计和文档说明。为了简æ´èµ·è§ï¼Œå‰é¢çš„例å­ä¸­çœç•¥äº†æ–‡æ¡£æ³¨é‡Šï¼Œä½†æ˜¯å¥½çš„文档在骨架实现中是ç»å¯¹å¿…è¦çš„,无论它是å¦åŒ…å« ä¸€ä¸ªæŽ¥å£æˆ–一个å•ç‹¬çš„抽象类的默认方法。 + +  与骨架实现有ç¨è®¸ä¸åŒçš„是简å•å®žçŽ°ï¼Œä»¥ `AbstractMap.SimpleEntry` 为例。 一个简å•çš„实现就åƒä¸€ä¸ªéª¨æž¶å®žçŽ°ï¼Œå®ƒå®žçŽ°äº†ä¸€ä¸ªæŽ¥å£ï¼Œå¹¶ä¸”是为了继承而设计的,但是它的ä¸åŒä¹‹å¤„在于它ä¸æ˜¯æŠ½è±¡çš„:它是最简å•çš„工作实现。 ä½ å¯ä»¥æŒ‰ç…§æƒ…况使用它,也å¯ä»¥æ ¹æ®æƒ…况进行å­ç±»åŒ–。 + +  总而言之,一个接å£é€šå¸¸æ˜¯å®šä¹‰å…许多个实现的类型的最佳方å¼ã€‚ 如果你导出一个é‡è¦çš„接å£ï¼Œåº”该强烈考虑æ供一个骨架的实现类。 在å¯èƒ½çš„情况下,应该通过接å£ä¸Šçš„默认方法æ供骨架实现,以便接å£çš„所有实现者都å¯ä»¥ä½¿ç”¨å®ƒã€‚ 也就是说,对接å£çš„é™åˆ¶é€šå¸¸è¦æ±‚骨架实现类采用抽象类的形å¼ã€‚ + + diff --git a/docs/notes/21. 为åŽä»£è®¾è®¡æŽ¥å£.md b/docs/notes/21. 为åŽä»£è®¾è®¡æŽ¥å£.md new file mode 100644 index 0000000..5831126 --- /dev/null +++ b/docs/notes/21. 为åŽä»£è®¾è®¡æŽ¥å£.md @@ -0,0 +1,45 @@ +# 21. 为åŽä»£è®¾è®¡æŽ¥å£ + +  在 Java 8 之å‰ï¼Œä¸å¯èƒ½åœ¨ä¸ç ´å现有实现的情况下为接å£æ·»åŠ æ–¹æ³•ã€‚ 如果å‘接å£æ·»åŠ äº†ä¸€ä¸ªæ–°æ–¹æ³•ï¼ŒçŽ°æœ‰çš„实现通常会缺少该方法,从而导致编译时错误。 在 Java 8 中,添加了默认方法(default method)构造[JLS 9.4],目的是å…许将方法添加到现有的接å£ã€‚ 但是增加新的方法到现有的接å£æ˜¯å……满风险的。 + +  默认方法的声明包å«ä¸€ä¸ªé»˜è®¤å®žçŽ°ï¼Œè¯¥æ–¹æ³•å…许实现接å£çš„类直接使用,而ä¸å¿…实现默认方法。 虽然在 Java 中添加默认方法å¯ä»¥å°†æ–¹æ³•æ·»åŠ åˆ°çŽ°æœ‰æŽ¥å£ï¼Œä½†ä¸èƒ½ä¿è¯è¿™äº›æ–¹æ³•å¯ä»¥åœ¨æ‰€æœ‰å·²æœ‰çš„实现中使用。 默认的方法被“注入(injected)â€åˆ°çŽ°æœ‰çš„实现中,没有ç»è¿‡å®žçŽ°ç±»çš„知é“或åŒæ„。 在 Java 8 之å‰ï¼Œè¿™äº›å®žçŽ°æ˜¯ç”¨é»˜è®¤çš„接å£ç¼–写的,它们的接å£æ°¸è¿œä¸ä¼šèŽ·å¾—任何新的方法。 + +  许多新的默认方法被添加到 Java 8 的核心集åˆæŽ¥å£ä¸­ï¼Œä¸»è¦æ˜¯ä¸ºäº†æ–¹ä¾¿ä½¿ç”¨ lambda 表达å¼ï¼ˆç¬¬ 6 章)。 Java 类库的默认方法是高质é‡çš„通用实现,在大多数情况下,它们工作正常。 **但是,编写一个默认方法并ä¸æ€»æ˜¯å¯èƒ½çš„,它ä¿ç•™äº†æ¯ä¸ªå¯èƒ½çš„实现的所有ä¸å˜é‡ã€‚** + +  例如,考虑在 Java 8 中添加到 `Collection` 接å£çš„ `removeIf` 方法。此方法删除给定布尔方法(或 `Predicate` 函数å¼æŽ¥å£ï¼‰è¿”回 `true` 的所有元素。默认实现被指定为使用迭代器é历集åˆï¼Œè°ƒç”¨æ¯ä¸ªå…ƒç´ çš„è°“è¯ï¼Œå¹¶ä½¿ç”¨è¿­ä»£å™¨çš„ `remove` 方法删除谓è¯è¿”回 `true` 的元素。 æ®æŽ¨æµ‹ï¼Œè¿™ä¸ªå£°æ˜Žçœ‹èµ·æ¥åƒè¿™æ ·ï¼šé»˜è®¤å®žçŽ°è¢«æŒ‡å®šä¸ºä½¿ç”¨è¿­ä»£å™¨é历集åˆï¼Œè°ƒç”¨æ¯ä¸ªå…ƒç´ çš„ `Predicate` 函数å¼æŽ¥å£ï¼Œå¹¶ä½¿ç”¨è¿­ä»£å™¨çš„ `remove` 方法删除 `Predicate` 函数å¼æŽ¥å£è¿”回 `true` 的元素。 æ ¹æ®æŽ¨æµ‹ï¼Œè¿™ä¸ªå£°æ˜Žçœ‹èµ·æ¥åƒè¿™æ ·ï¼š + +```Java +// Default method added to the Collection interface in Java 8 +default boolean removeIf(Predicate filter) { + Objects.requireNonNull(filter); + boolean result = false; + for (Iterator it = iterator(); it.hasNext(); ) { + if (filter.test(it.next())) { + it.remove(); + result = true; + } + } + return result; +} +``` + +  这是å¯èƒ½ä¸º `removeIf` 方法编写的最好的通用实现,但é—憾的是,它在一些实际的 `Collection` 实现中失败了。 例如,考虑 `org.apache.commons.collections4.collection.SynchronizedCollection` 方法。 这个类出自 `Apache Commons` 类库中,与 `java.util` 包中的é™æ€å·¥åŽ‚ `Collections.synchronizedCollection` 方法返回的类相似。 Apache 版本还æ供了使用客户端æ供的对象进行é”定的能力,以代替集åˆã€‚ æ¢å¥è¯è¯´ï¼Œå®ƒæ˜¯ä¸€ä¸ªåŒ…装类(æ¡ç›® 18),它们的所有方法在委托给包装集åˆç±»ä¹‹å‰åœ¨ä¸€ä¸ªé”定对象上进行åŒæ­¥ã€‚ + +  Apache çš„ `SynchronizedCollection` ç±»ä»ç„¶åœ¨ç§¯æžç»´æŠ¤ï¼Œä½†åœ¨æ’°å†™æœ¬æ–‡æ—¶ï¼Œå¹¶æœªé‡å†™ `removeIf` 方法。 如果这个类与 Java 8 一起使用,它将继承 `removeIf` 的默认实现,但实际上ä¸èƒ½ä¿æŒç±»çš„基本承诺:自动åŒæ­¥æ¯ä¸ªæ–¹æ³•è°ƒç”¨ã€‚ 默认实现对åŒæ­¥ä¸€æ— æ‰€çŸ¥ï¼Œå¹¶ä¸”ä¸èƒ½è®¿é—®åŒ…å«é”定对象的属性。 如果客户端在å¦ä¸€ä¸ªçº¿ç¨‹åŒæ—¶ä¿®æ”¹é›†åˆçš„情况下调用 `SynchronizedCollection` 实例上的 `removeIf` 方法,则å¯èƒ½ä¼šå¯¼è‡´ `ConcurrentModificationException` 异常或其他未指定的行为。 + +  为了防止在类似的 Java å¹³å°ç±»åº“实现中å‘生这ç§æƒ…况,比如 `Collections.synchronizedCollection` 返回的包级ç§æœ‰çš„类,JDK 维护者必须é‡å†™é»˜è®¤çš„ `removeIf` 实现和其他类似的方法æ¥åœ¨è°ƒç”¨é»˜è®¤å®žçŽ°ä¹‹å‰æ‰§è¡Œå¿…è¦çš„åŒæ­¥ã€‚ 原æ¥ä¸å±žäºŽ Java å¹³å°çš„集åˆå®žçŽ°æ²¡æœ‰æœºä¼šä¸ŽæŽ¥å£æ›´æ”¹è¿›è¡Œç±»ä¼¼çš„改å˜ï¼Œæœ‰äº›è¿˜æ²¡æœ‰è¿™æ ·åšã€‚ + +  **在默认方法的情况下,接å£çš„现有实现类å¯ä»¥åœ¨æ²¡æœ‰é”™è¯¯æˆ–警告的情况下编译,但在è¿è¡Œæ—¶ä¼šå¤±è´¥ã€‚** 虽然ä¸æ˜¯éžå¸¸æ™®é,但这个问题也ä¸æ˜¯ä¸€ä¸ªå­¤ç«‹çš„事件。 在 Java 8 中添加到集åˆæŽ¥å£çš„一些方法已知是易å—å½±å“的,并且已知一些现有的实现会å—到影å“。 + +  应该é¿å…使用默认方法å‘现有的接å£æ·»åŠ æ–°çš„方法,除éžè¿™ä¸ªéœ€è¦æ˜¯å…³é”®çš„,在这ç§æƒ…况下,你应该仔细考虑,以确定现有的接å£å®žçŽ°æ˜¯å¦ä¼šè¢«é»˜è®¤çš„方法实现所破å。然而,默认方法对于在创建接å£æ—¶æ供标准的方法实现éžå¸¸æœ‰ç”¨ï¼Œä»¥å‡è½»å®žçŽ°æŽ¥å£çš„任务(æ¡ç›® 20)。 + +  还值得注æ„的是,默认方法ä¸æ˜¯è¢«ç”¨æ¥è®¾è®¡ï¼Œæ¥æ”¯æŒä»ŽæŽ¥å£ä¸­ç§»é™¤æ–¹æ³•æˆ–者改å˜çŽ°æœ‰æ–¹æ³•çš„ç­¾å的目的。在ä¸ç ´å现有客户端的情况下,这些接å£éƒ½ä¸å¯èƒ½å‘生更改。 + +  准则是清楚的。 尽管默认方法现在是 Java å¹³å°çš„一部分,**但是éžå¸¸æ‚‰å¿ƒåœ°è®¾è®¡æŽ¥å£ä»ç„¶æ˜¯éžå¸¸é‡è¦çš„。** 虽然默认方法å¯ä»¥å°†æ–¹æ³•æ·»åŠ åˆ°çŽ°æœ‰çš„接å£ï¼Œä½†è¿™æ ·åšæœ‰å¾ˆå¤§çš„风险。 如果一个接å£åŒ…å«ä¸€ä¸ªå°ç¼ºé™·ï¼Œå¯èƒ½ä¼šæ°¸è¿œæƒ¹æ€’用户。 如果一个接å£ä¸¥é‡ç¼ºé™·ï¼Œå¯èƒ½ä¼šç ´å包å«å®ƒçš„ API。 + +  因此,在å‘布之å‰æµ‹è¯•æ¯ä¸ªæ–°æŽ¥å£æ˜¯éžå¸¸é‡è¦çš„。 多个程åºå‘˜åº”该以ä¸åŒçš„æ–¹å¼å®žçŽ°æ¯ä¸ªæŽ¥å£ã€‚ 至少,你应该准备三ç§ä¸åŒçš„实现。 编写多个使用æ¯ä¸ªæ–°æŽ¥å£çš„实例æ¥æ‰§è¡Œå„ç§ä»»åŠ¡çš„客户端程åºåŒæ ·é‡è¦ã€‚ 这将大大确ä¿æ¯ä¸ªæŽ¥å£éƒ½èƒ½æ»¡è¶³å…¶æ‰€æœ‰çš„预期用途。 这些步骤将å…许你在å‘布之å‰å‘现接å£ä¸­çš„缺陷,但ä»ç„¶å¯ä»¥è½»æ¾åœ°ä¿®æ­£å®ƒä»¬ã€‚ **虽然在接å£è¢«å‘布åŽå¯èƒ½ä¼šä¿®æ­£ä¸€äº›å­˜åœ¨çš„缺陷,但ä¸è¦å¤ªæŒ‡æœ›è¿™ä¸€ç‚¹ã€‚** + + + + + diff --git a/docs/notes/22. 接å£ä»…用æ¥å®šä¹‰ç±»åž‹.md b/docs/notes/22. 接å£ä»…用æ¥å®šä¹‰ç±»åž‹.md new file mode 100644 index 0000000..228dd28 --- /dev/null +++ b/docs/notes/22. 接å£ä»…用æ¥å®šä¹‰ç±»åž‹.md @@ -0,0 +1,59 @@ +# 22. 接å£ä»…用æ¥å®šä¹‰ç±»åž‹ + +  当类实现接å£æ—¶ï¼Œè¯¥æŽ¥å£ä½œä¸ºä¸€ç§ç±»åž‹ï¼ˆtype),å¯ä»¥ç”¨æ¥å¼•ç”¨ç±»çš„实例。因此,一个类实现了一个接å£ï¼Œå› æ­¤è¡¨æ˜Žå®¢æˆ·ç«¯å¯ä»¥å¦‚何处ç†ç±»çš„实例。为其他目的定义接å£æ˜¯ä¸åˆé€‚的。 + +  一ç§å¤±è´¥çš„接å£å°±æ˜¯æ‰€è°“的常é‡æŽ¥å£ï¼ˆconstant interface)。 这样的接å£ä¸åŒ…å«ä»»ä½•æ–¹æ³•; 它åªåŒ…å«é™æ€ final 属性,æ¯ä¸ªè¾“出一个常é‡ã€‚ 使用这些常é‡çš„类实现接å£ï¼Œä»¥é¿å…需è¦ç”¨ç±»åé™å®šå¸¸é‡å。 这里是一个例å­ï¼š + +```Java +// Constant interface antipattern - do not use! +public interface PhysicalConstants { + // Avogadro's number (1/mol) + static final double AVOGADROS_NUMBER = 6.022_140_857e23; + + // Boltzmann constant (J/K) + static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; + + // Mass of the electron (kg) + static final double ELECTRON_MASS = 9.109_383_56e-31; +} +``` + +  **常é‡æŽ¥å£æ¨¡å¼æ˜¯å¯¹æŽ¥å£çš„糟糕使用。** 类在内部使用一些常é‡ï¼Œå®Œå…¨å±žäºŽå®žçŽ°ç»†èŠ‚。实现一个常é‡æŽ¥å£ä¼šå¯¼è‡´è¿™ä¸ªå®žçŽ°ç»†èŠ‚泄æ¼åˆ°ç±»çš„导出 API 中。对类的用户æ¥è¯´ï¼Œç±»å®žçŽ°ä¸€ä¸ªå¸¸é‡æŽ¥å£æ˜¯æ²¡æœ‰æ„义的。事实上,它甚至å¯èƒ½ä½¿ä»–们感到困惑。更糟糕的是,它代表了一个承诺:如果在将æ¥çš„版本中修改了类,ä¸å†éœ€è¦ä½¿ç”¨å¸¸é‡ï¼Œé‚£ä¹ˆå®ƒä»ç„¶å¿…须实现接å£ï¼Œä»¥ç¡®ä¿äºŒè¿›åˆ¶å…¼å®¹æ€§ã€‚å¦‚æžœä¸€ä¸ªéž final 类实现了常é‡æŽ¥å£ï¼Œé‚£ä¹ˆå®ƒçš„所有å­ç±»çš„命å空间都会被接å£ä¸­çš„常é‡æ‰€æ±¡æŸ“。 + +  Java å¹³å°ç±»åº“中有多个常é‡æŽ¥å£ï¼Œå¦‚ `java.io.ObjectStreamConstants。` 这些接å£åº”该被视为ä¸è§„范的,ä¸åº”该被效仿。 + +  如果你想导出常é‡ï¼Œæœ‰å‡ ä¸ªåˆç†çš„选择方案。 如果常é‡ä¸ŽçŽ°æœ‰çš„类或接å£ç´§å¯†ç›¸å…³ï¼Œåˆ™åº”将其添加到该类或接å£ä¸­ã€‚ 例如,所有数字基本类型的包装类,如 `Integer` å’Œ `Double`,都会导出 `MIN_VALUE` å’Œ `MAX_VALUE` 常é‡ã€‚ 如果常é‡æœ€å¥½è¢«çœ‹ä½œæžšä¸¾ç±»åž‹çš„æˆå‘˜ï¼Œåˆ™åº”该使用枚举类型(æ¡ç›® 34)导出它们。 å¦åˆ™ï¼Œä½ åº”该用一个ä¸å¯å®žä¾‹åŒ–的工具类æ¥å¯¼å‡ºå¸¸é‡ï¼ˆæ¡ç›® 4)。 下是å‰é¢æ‰€ç¤ºçš„ `PhysicalConstants` 示例的工具类的版本: + + +```Java +// Constant utility class +package com.effectivejava.science; + +public class PhysicalConstants { + private PhysicalConstants() { } // Prevents instantiation + + public static final double AVOGADROS_NUMBER = 6.022_140_857e23; + public static final double BOLTZMANN_CONST = 1.380_648_52e-23; + public static final double ELECTRON_MASS = 9.109_383_56e-31; +} +``` + +  顺便æ一下,请注æ„在数字文字中使用下划线字符(_)。 从 Java 7 开始,åˆæ³•çš„下划线对数字字é¢é‡çš„值没有影å“,但是如果使用得当的è¯å¯ä»¥ä½¿å®ƒä»¬æ›´å®¹æ˜“阅读。 无论是固定的浮点数,如果他们包å«äº”个或更多的连续数字,考虑将下划线添加到数字字é¢é‡ä¸­ã€‚ 对于底数为 10 的数字,无论是整型还是浮点型的,都应该用下划线将数字分æˆä¸‰ä¸ªæ•°å­—组,表示一åƒçš„正负幂。 + +  通常,实用工具类è¦æ±‚客户端使用类åæ¥é™å®šå¸¸é‡å,例如 `PhysicalConstants.AVOGADROS_NUMBER`。 如果大é‡ä½¿ç”¨å®žç”¨å·¥å…·ç±»å¯¼å‡ºçš„常é‡ï¼Œåˆ™é€šè¿‡ä½¿ç”¨é™æ€å¯¼å…¥æ¥é™å®šå…·æœ‰ç±»å的常é‡ï¼š + +```Java +// Use of static import to avoid qualifying constants +import static com.effectivejava.science.PhysicalConstants.*; + +public class Test { + double atoms(double mols) { + return AVOGADROS_NUMBER * mols; + } + ... + // Many more uses of PhysicalConstants justify static import +} +``` +  总之,接å£åªèƒ½ç”¨äºŽå®šä¹‰ç±»åž‹ã€‚ 它们ä¸åº”该仅用于导出常é‡ã€‚ + + diff --git a/docs/notes/23. 优先使用类层次而ä¸æ˜¯æ ‡ç­¾ç±».md b/docs/notes/23. 优先使用类层次而ä¸æ˜¯æ ‡ç­¾ç±».md new file mode 100644 index 0000000..4128a60 --- /dev/null +++ b/docs/notes/23. 优先使用类层次而ä¸æ˜¯æ ‡ç­¾ç±».md @@ -0,0 +1,95 @@ +# 23. 优先使用类层次而ä¸æ˜¯æ ‡ç­¾ç±» + +  有时你å¯èƒ½ä¼šç¢°åˆ°ä¸€ä¸ªç±»ï¼Œå®ƒçš„实例有两个或更多的风格,并且包å«ä¸€ä¸ªæ ‡ç­¾å±žæ€§ï¼ˆtag field),表示实例的风格。 例如,考虑这个类,它å¯ä»¥è¡¨ç¤ºä¸€ä¸ªåœ†å½¢æˆ–矩形: + +```Java +// Tagged class - vastly inferior to a class hierarchy! +class Figure { + enum Shape { RECTANGLE, CIRCLE }; + + // Tag field - the shape of this figure + final Shape shape; + + // These fields are used only if shape is RECTANGLE + double length; + double width; + + // This field is used only if shape is CIRCLE + double radius; + + // Constructor for circle + Figure(double radius) { + shape = Shape.CIRCLE; + this.radius = radius; + } + + // Constructor for rectangle + Figure(double length, double width) { + shape = Shape.RECTANGLE; + this.length = length; + this.width = width; + } + + double area() { + switch(shape) { + case RECTANGLE: + return length * width; + case CIRCLE: + return Math.PI * (radius * radius); + default: + throw new AssertionError(shape); + } + } +} +``` + +  这样的标签类具有许多缺点。 他们æ‚乱无章的样æ¿ä»£ç ï¼ŒåŒ…括枚举声明,标签属性和 `switch` 语å¥ã€‚ å¯è¯»æ€§æ›´å·®ï¼Œå› ä¸ºå¤šä¸ªå®žçŽ°åœ¨ä¸€ä¸ªç±»ä¸­æ··æ‚在一起。 内存使用增加,因为实例负担属于其他风格ä¸ç›¸å…³çš„领域。 属性ä¸èƒ½æˆä¸º final,除éžæž„造方法åˆå§‹åŒ–ä¸ç›¸å…³çš„属性,导致更多的样æ¿ä»£ç ã€‚ 构造方法在编译器的帮助下,必须设置标签属性并åˆå§‹åŒ–正确的数æ®å±žæ€§ï¼šå¦‚æžœåˆå§‹åŒ–错误的属性,程åºå°†åœ¨è¿è¡Œæ—¶å¤±è´¥ã€‚ 除éžå¯ä»¥ä¿®æ”¹å…¶æºæ–‡ä»¶ï¼Œå¦åˆ™ä¸èƒ½å°†å…¶æ·»åŠ åˆ°æ ‡è®°çš„类中。 如果你添加一个风格,你必须记得给æ¯ä¸ª `switch` 语å¥æ·»åŠ ä¸€ä¸ª `case`,å¦åˆ™è¿™ä¸ªç±»å°†åœ¨è¿è¡Œæ—¶å¤±è´¥ã€‚ 最åŽï¼Œä¸€ä¸ªå®žä¾‹çš„æ•°æ®ç±»åž‹æ²¡æœ‰æ供任何关于风格的线索。 总之,**标签类是冗长的,容易出错的,而且效率低下。** + +  幸è¿çš„æ˜¯ï¼Œåƒ Java 这样的é¢å‘对象的语言为定义一个能够表示多ç§é£Žæ ¼å¯¹è±¡çš„å•ä¸€æ•°æ®ç±»åž‹æ供了更好的选择:å­ç±»åž‹åŒ–(subtyping)。标签类仅仅是一个类层次的简å•çš„模仿。 + +  è¦å°†æ ‡ç­¾ç±»è½¬æ¢ä¸ºç±»å±‚次,首先定义一个包å«æŠ½è±¡æ–¹æ³•çš„抽象类,该标签类的行为å–决于标签值。 在 `Figure` 类中,åªæœ‰ä¸€ä¸ªè¿™æ ·çš„方法,就是 `area` 方法。 这个抽象类是类层次的根。 如果有任何方法的行为ä¸ä¾èµ–于标签的值,把它们放在这个类中。 åŒæ ·ï¼Œå¦‚果有所有的方法使用的数æ®å±žæ€§ï¼ŒæŠŠå®ƒä»¬æ”¾åœ¨è¿™ä¸ªç±»ã€‚`Figure` 类中ä¸å­˜åœ¨è¿™ç§ä¸Žç±»åž‹æ— å…³çš„方法或属性。 + +  接下æ¥ï¼Œä¸ºåŽŸå§‹æ ‡ç­¾ç±»çš„æ¯ç§ç±»åž‹å®šä¹‰ä¸€ä¸ªæ ¹ç±»çš„具体å­ç±»ã€‚ 在我们的例å­ä¸­ï¼Œæœ‰ä¸¤ä¸ªç±»åž‹ï¼šåœ†å½¢å’ŒçŸ©å½¢ã€‚ 在æ¯ä¸ªå­ç±»ä¸­åŒ…å«ç‰¹å®šäºŽæ”¹ç±»åž‹çš„æ•°æ®å­—段。 在我们的例å­ä¸­ï¼ŒåŠå¾„属性是属于圆的,长度和宽度属性都是矩形的。 还è¦åœ¨æ¯ä¸ªå­ç±»ä¸­åŒ…å«æ ¹ç±»ä¸­æ¯ä¸ªæŠ½è±¡æ–¹æ³•çš„适当实现。 这里是对应于 `Figure` 类的类层次: + +```Java +// Class hierarchy replacement for a tagged class +abstract class Figure { + abstract double area(); +} + +class Circle extends Figure { + final double radius; + + Circle(double radius) { this.radius = radius; } + + @Override double area() { return Math.PI * (radius * radius); } +} +class Rectangle extends Figure { + final double length; + final double width; + + Rectangle(double length, double width) { + this.length = length; + this.width = width; + } + @Override double area() { return length * width; } +} +``` + +  这个类层次纠正了之å‰æ到的标签类的æ¯ä¸ªç¼ºç‚¹ã€‚ 代ç ç®€å•æ˜Žäº†ï¼Œä¸åŒ…å«åŽŸæ–‡ä¸­çš„æ ·æ¿æ–‡ä»¶ã€‚ æ¯ç§ç±»åž‹çš„实现都是由自己的类æ¥åˆ†é…的,而这些类都没有被无关的数æ®å±žæ€§æ‰€å ç”¨ã€‚ 所有的属性是 `final` 的。 编译器确ä¿æ¯ä¸ªç±»çš„构造方法åˆå§‹åŒ–其数æ®å±žæ€§ï¼Œå¹¶ä¸”æ¯ä¸ªç±»éƒ½æœ‰ä¸€ä¸ªé’ˆå¯¹åœ¨æ ¹ç±»ä¸­å£°æ˜Žçš„æ¯ä¸ªæŠ½è±¡æ–¹æ³•çš„实现。 这消除了由于缺少 `switch-case` 语å¥è€Œå¯¼è‡´çš„è¿è¡Œæ—¶å¤±è´¥çš„å¯èƒ½æ€§ã€‚ 多个程åºå‘˜å¯ä»¥ç‹¬ç«‹åœ°ç»§æ‰¿ç±»å±‚次,并且å¯ä»¥ç›¸äº’æ“作,而无需访问根类的æºä»£ç ã€‚ æ¯ç§ç±»åž‹éƒ½æœ‰ä¸€ä¸ªç‹¬ç«‹çš„æ•°æ®ç±»åž‹ä¸Žä¹‹ç›¸å…³è”,å…许程åºå‘˜æŒ‡å‡ºå˜é‡çš„类型,并将å˜é‡å’Œè¾“å…¥å‚æ•°é™åˆ¶ä¸ºç‰¹å®šçš„类型。 + +  类层次的å¦ä¸€ä¸ªä¼˜ç‚¹æ˜¯å¯ä»¥ä½¿å®ƒä»¬å映类型之间的自然层次关系,从而æ高了çµæ´»æ€§ï¼Œå¹¶æ高了编译时类型检查的效率。 å‡è®¾åŽŸå§‹ç¤ºä¾‹ä¸­çš„标签类也å…许使用正方形。 类层次å¯ä»¥ç”¨æ¥å映一个正方形是一ç§ç‰¹æ®Šçš„矩形(å‡è®¾å®ƒä»¬æ˜¯ä¸å¯å˜çš„): + +```Java +class Square extends Rectangle { + Square(double side) { + super(side, side); + } +} +``` +  请注æ„,上述层中的属性是直接访问的,而ä¸æ˜¯è®¿é—®æ–¹æ³•ã€‚ 这里是为了简æ´èµ·è§ï¼Œå¦‚果类层次是公开的(æ¡ç›® 16),这将是一个糟糕的设计。 + +  总之,标签类很少有适用的情况。 如果你想写一个带有明显标签属性的类,请考虑标签属性是å¦å¯ä»¥è¢«åˆ é™¤ï¼Œè€Œç±»æ˜¯å¦è¢«ç±»å±‚次替æ¢ã€‚ 当é‡åˆ°ä¸€ä¸ªå¸¦æœ‰æ ‡ç­¾å±žæ€§çš„现有类时,å¯ä»¥è€ƒè™‘将其é‡æž„为一个类层次中。 + + + diff --git a/docs/notes/24. 优先考虑é™æ€æˆå‘˜ç±».md b/docs/notes/24. 优先考虑é™æ€æˆå‘˜ç±».md new file mode 100644 index 0000000..88ead87 --- /dev/null +++ b/docs/notes/24. 优先考虑é™æ€æˆå‘˜ç±».md @@ -0,0 +1,50 @@ +# 24. 优先考虑é™æ€æˆå‘˜ç±» + +  嵌套类(nested class)是在å¦ä¸€ä¸ªç±»ä¸­å®šä¹‰çš„类。 嵌套类应该åªå­˜åœ¨äºŽå…¶å®¿ä¸»ç±»ï¼ˆenclosing class)中。 如果一个嵌套类在其他一些情况下是有用的,那么它应该是一个顶级类。 有四ç§åµŒå¥—类:é™æ€æˆå‘˜ç±»ï¼Œéžé™æ€æˆå‘˜ç±»ï¼ŒåŒ¿å类和局部类。 除了第一ç§ä»¥å¤–,剩下的三ç§éƒ½è¢«ç§°ä¸ºå†…部类(inner class)。 这个æ¡ç›®å‘Šè¯‰ä½ ä»€ä¹ˆæ—¶å€™ä½¿ç”¨å“ªç§ç±»åž‹çš„嵌套类以åŠä¸ºä»€ä¹ˆä½¿ç”¨ã€‚ + +  é™æ€æˆå‘˜ç±»æ˜¯æœ€ç®€å•çš„嵌套类。 最好把它看作是一个普通的类,æ°å¥½åœ¨å¦ä¸€ä¸ªç±»ä¸­å£°æ˜Žï¼Œå¹¶ä¸”å¯ä»¥è®¿é—®æ‰€æœ‰å®¿ä¸»ç±»çš„æˆå‘˜ï¼Œç”šè‡³æ˜¯é‚£äº›è¢«å£°æ˜Žä¸ºç§æœ‰ç±»çš„æˆå‘˜ã€‚ é™æ€æˆå‘˜ç±»æ˜¯å…¶å®¿ä¸»ç±»çš„é™æ€æˆå‘˜ï¼Œå¹¶éµå¾ªä¸Žå…¶ä»–é™æ€æˆå‘˜ç›¸åŒçš„å¯è®¿é—®æ€§è§„则。 如果它被声明为 `private`,则åªèƒ½åœ¨å®¿ä¸»ç±»ä¸­è®¿é—®ï¼Œç­‰ç­‰ã€‚ + +  é™æ€æˆå‘˜ç±»çš„一个常è§ç”¨é€”是作为公共帮助类,仅在与其外部类一起使用时æ‰æœ‰ç”¨ã€‚ 例如,考虑一个æ述计算器支æŒçš„æ“作的枚举类型(æ¡ç›® 34)。 `Operation` 枚举应该是 `Calculator` 类的公共é™æ€æˆå‘˜ç±»ã€‚ `Calculator` 客户端å¯ä»¥ä½¿ç”¨ `Calculator.Operation.PLUS` å’Œ `Calculator.Operation.MINUS` ç­‰å称æ¥å¼•ç”¨æ“作。 + +  在语法上,é™æ€æˆå‘˜ç±»å’Œéžé™æ€æˆå‘˜ç±»ä¹‹é—´çš„唯一区别是é™æ€æˆå‘˜ç±»åœ¨å…¶å£°æ˜Žä¸­å…·æœ‰ `static` 修饰符。 尽管å¥æ³•ç›¸ä¼¼ï¼Œä½†è¿™ä¸¤ç§åµŒå¥—类是éžå¸¸ä¸åŒçš„。 éžé™æ€æˆå‘˜ç±»çš„æ¯ä¸ªå®žä¾‹éƒ½éšå«åœ°ä¸Žå…¶åŒ…å«çš„类的宿主实例相关è”。 在éžé™æ€æˆå‘˜ç±»çš„实例方法中,å¯ä»¥è°ƒç”¨å®¿ä¸»å®žä¾‹ä¸Šçš„方法,或者使用é™å®šçš„构造[JLS,15.8.4] 获得对宿主实例的引用。 如果嵌套类的实例å¯ä»¥ä¸Žå…¶å®¿ä¸»ç±»çš„实例隔离存在,那么嵌套类必须是é™æ€æˆå‘˜ç±»ï¼šä¸å¯èƒ½åœ¨æ²¡æœ‰å®¿ä¸»å®žä¾‹çš„情况下创建éžé™æ€æˆå‘˜ç±»çš„实例。 + +  éžé™æ€æˆå‘˜ç±»å®žä¾‹å’Œå…¶å®¿ä¸»å®žä¾‹ä¹‹é—´çš„å…³è”是在创建æˆå‘˜ç±»å®žä¾‹æ—¶å»ºç«‹çš„,并且之åŽä¸èƒ½è¢«ä¿®æ”¹ã€‚ 通常情况下,通过在宿主类的实例方法中调用éžé™æ€æˆå‘˜ç±»æž„造方法æ¥è‡ªåŠ¨å»ºç«‹å…³è”。 尽管很少有å¯èƒ½ä½¿ç”¨è¡¨è¾¾å¼ `enclosingInstance.new MemberClass(args)` 手动建立关è”。 正如你所预料的那样,该关è”在éžé™æ€æˆå‘˜ç±»å®žä¾‹ä¸­å ç”¨äº†ç©ºé—´ï¼Œå¹¶ä¸ºå…¶æž„建添加了时间开销。 + +  éžé™æ€æˆå‘˜ç±»çš„一个常è§ç”¨æ³•æ˜¯å®šä¹‰ä¸€ä¸ª `Adapter` [Gamma95],它å…许将外部类的实例视为æŸä¸ªä¸ç›¸å…³ç±»çš„实例。 例如,`Map` 接å£çš„实现通常使用éžé™æ€æˆå‘˜ç±»æ¥å®žçŽ°å®ƒä»¬çš„集åˆè§†å›¾ï¼Œè¿™äº›è§†å›¾ç”± `Map` çš„ `keySet`,`entrySet` å’Œ `values` 方法返回。 åŒæ ·ï¼Œé›†åˆæŽ¥å£ï¼ˆå¦‚ `Set` å’Œ `List`)的实现通常使用éžé™æ€æˆå‘˜ç±»æ¥å®žçŽ°å®ƒä»¬çš„迭代器: + + +```Java +// Typical use of a nonstatic member class +public class MySet extends AbstractSet { + ... // Bulk of the class omitted + + @Override + public Iterator iterator() { + return new MyIterator(); + } + + private class MyIterator implements Iterator { + ... + } +} +``` + +  **如果你声明了一个ä¸éœ€è¦è®¿é—®å®¿ä¸»å®žä¾‹çš„æˆå‘˜ç±»ï¼Œæ€»æ˜¯æŠŠ static 修饰符放在它的声明中,使它æˆä¸ºä¸€ä¸ªé™æ€æˆå‘˜ç±»ï¼Œè€Œä¸æ˜¯éžé™æ€çš„æˆå‘˜ç±»ã€‚** 如果你忽略了这个修饰符,æ¯ä¸ªå®žä¾‹éƒ½ä¼šæœ‰ä¸€ä¸ªéšè—的外部引用给它的宿主实例。 如å‰æ‰€è¿°ï¼Œå­˜å‚¨è¿™ä¸ªå¼•ç”¨éœ€è¦å ç”¨æ—¶é—´å’Œç©ºé—´ã€‚ 更严é‡çš„是,并且会导致å³ä½¿å®¿ä¸»ç±»åœ¨æ»¡è¶³åžƒåœ¾å›žæ”¶çš„æ¡ä»¶æ—¶å´ä»ç„¶é©»ç•™åœ¨å†…存中(æ¡ç›® 7)。 由此产生的内存泄æ¼å¯èƒ½æ˜¯ç¾éš¾æ€§çš„。 由于引用是ä¸å¯è§çš„,所以通常难以检测到。 + +  ç§æœ‰é™æ€æˆå‘˜ç±»çš„常è§ç”¨æ³•æ˜¯è¡¨ç¤ºç”±å®ƒä»¬çš„宿主类表示的对象的组件。 例如,考虑将键与值相关è”çš„ `Map` 实例。 许多 `Map` 实现对于映射中的æ¯ä¸ªé”®å€¼å¯¹éƒ½æœ‰ä¸€ä¸ªå†…部的 `Entry` 对象。 当æ¯ä¸ª `entry` 都与 `Map` å…³è”时,`entry` 上的方法 (`getKey`,`getValue` å’Œ `setValue`) ä¸éœ€è¦è®¿é—® `Map`。 因此,使用éžé™æ€æˆå‘˜ç±»æ¥è¡¨ç¤º `entry` 将是浪费的:ç§æœ‰é™æ€æˆå‘˜ç±»æ˜¯æœ€å¥½çš„。 如果æ„外地忽略了 `entry` 声明中的 `static` 修饰符,`Map` ä»ç„¶å¯ä»¥å·¥ä½œï¼Œä½†æ˜¯æ¯ä¸ª `entry` 都会包å«å¯¹ `Map` 的引用,浪费空间和时间。 + +  如果所讨论的类是导出类的公共或å—ä¿æŠ¤æˆå‘˜ï¼Œåˆ™åœ¨é™æ€å’Œéžé™æ€æˆå‘˜ç±»ä¹‹é—´æ­£ç¡®é€‰æ‹©æ˜¯éžå¸¸é‡è¦çš„。 在这ç§æƒ…况下,æˆå‘˜ç±»æ˜¯å¯¼å‡ºçš„ API 元素,如果ä¸è¿åå‘åŽå…¼å®¹æ€§ï¼Œå°±ä¸èƒ½åœ¨åŽç»­ç‰ˆæœ¬ä¸­ä»Žéžé™æ€å˜ä¸ºé™æ€æˆå‘˜ç±»ã€‚ + +  正如你所期望的,一个匿å类没有å字。 它ä¸æ˜¯å…¶å®¿ä¸»ç±»çš„æˆå‘˜ã€‚ 它ä¸æ˜¯ä¸Žå…¶ä»–æˆå‘˜ä¸€èµ·å£°æ˜Žï¼Œè€Œæ˜¯åœ¨ä½¿ç”¨æ—¶åŒæ—¶å£°æ˜Žå’Œå®žä¾‹åŒ–。 在表达å¼åˆæ³•çš„代ç ä¸­ï¼ŒåŒ¿å类是å…许的。 当且仅当它们出现在éžé™æ€ä¸Šä¸‹æ–‡ä¸­æ—¶ï¼ŒåŒ¿åç±»æ‰ä¼šå°è£…实例。 但是,å³ä½¿å®ƒä»¬å‡ºçŽ°åœ¨é™æ€ä¸Šä¸‹æ–‡ä¸­ï¼Œå®ƒä»¬ä¹Ÿä¸èƒ½æœ‰é™¤å¸¸é‡åž‹å˜é‡ä¹‹å¤–的任何é™æ€æˆå‘˜ï¼Œè¿™äº›å¸¸é‡åž‹å˜é‡åŒ…括 `final` 的基本类型,或者åˆå§‹åŒ–常é‡è¡¨è¾¾å¼çš„字符串属性[JLS,4.12.4]。 + +  匿å类的适用性有很多é™åˆ¶ã€‚ 除了在声明的时候之外,ä¸èƒ½å®žä¾‹åŒ–它们。 ä½ ä¸èƒ½æ‰§è¡Œ `instanceof` 方法测试或者åšä»»ä½•å…¶ä»–需è¦ä½ å‘½å的类。 ä¸èƒ½å£°æ˜Žä¸€ä¸ªåŒ¿åç±»æ¥å®žçŽ°å¤šä¸ªæŽ¥å£ï¼Œæˆ–者继承一个类并åŒæ—¶å®žçŽ°ä¸€ä¸ªæŽ¥å£ã€‚ 匿å类的客户端ä¸èƒ½è°ƒç”¨é™¤çˆ¶ç±»åž‹ç»§æ‰¿çš„æˆå‘˜ä»¥å¤–的任何æˆå‘˜ã€‚ 因为匿å类在表达å¼ä¸­å‡ºçŽ°ï¼Œæ‰€ä»¥å®ƒä»¬å¿…é¡»ä¿æŒçŸ­â€”—约å行或更少——å¦åˆ™å¯è¯»æ€§å°†å—æŸã€‚ + +  在将 lambda 表达å¼æ·»åŠ åˆ° Java(第 6 章)之å‰ï¼ŒåŒ¿å类是创建å°æ–¹æ³•å¯¹è±¡å’Œå¤„ç†å¯¹è±¡çš„首选方法,但 lambda 表达å¼çŽ°åœ¨æ˜¯é¦–选(æ¡ç›® 42)。 匿å类的å¦ä¸€ä¸ªå¸¸è§ç”¨é€”是实现é™æ€å·¥åŽ‚方法(请å‚阅æ¡ç›® 20 中的 intArrayAsList)。 + +  局部类是四ç§åµŒå¥—类中使用最少的。 一个局部类å¯ä»¥åœ¨ä»»ä½•å¯ä»¥å£°æ˜Žå±€éƒ¨å˜é‡çš„地方声明,并éµå®ˆç›¸åŒçš„作用域规则。 局部类与其他类型的嵌套类具有共åŒçš„属性。 åƒæˆå‘˜ç±»ä¸€æ ·ï¼Œä»–们有å字,å¯ä»¥é‡å¤ä½¿ç”¨ã€‚ å°±åƒåŒ¿å类一样,åªæœ‰åœ¨éžé™æ€ä¸Šä¸‹æ–‡ä¸­å®šä¹‰å®ƒä»¬æ—¶ï¼Œå®ƒä»¬æ‰ä¼šåŒ…å«å®žä¾‹ï¼Œå¹¶ä¸”它们ä¸èƒ½åŒ…å«é™æ€æˆå‘˜ã€‚ åƒåŒ¿å类一样,应该ä¿æŒç®€çŸ­ï¼Œä»¥å…æŸå®³å¯è¯»æ€§ã€‚ + +  回顾一下,有四ç§ä¸åŒçš„嵌套类,æ¯ä¸ªéƒ½æœ‰å®ƒçš„用途。 如果一个嵌套的类需è¦åœ¨ä¸€ä¸ªæ–¹æ³•ä¹‹å¤–å¯è§ï¼Œæˆ–者太长而ä¸èƒ½å¾ˆå¥½åœ°é€‚应一个方法,使用一个æˆå‘˜ç±»ã€‚ 如果一个æˆå‘˜ç±»çš„æ¯ä¸ªå®žä¾‹éƒ½éœ€è¦ä¸€ä¸ªå¯¹å…¶å®¿ä¸»å®žä¾‹çš„引用,使其æˆä¸ºéžé™æ€çš„; å¦åˆ™ï¼Œä½¿å…¶é™æ€ã€‚ å‡è®¾è¿™ä¸ªç±»å±žäºŽä¸€ä¸ªæ–¹æ³•å†…部,如果你åªéœ€è¦ä»Žä¸€ä¸ªåœ°æ–¹åˆ›å»ºå®žä¾‹ï¼Œå¹¶ä¸”存在一个预置类型æ¥è¯´æ˜Žè¿™ä¸ªç±»çš„特å¾ï¼Œé‚£ä¹ˆæŠŠå®ƒä½œä¸ºä¸€ä¸ªåŒ¿åç±»; å¦åˆ™ï¼ŒæŠŠå®ƒå˜æˆå±€éƒ¨ç±»ã€‚ + + + + diff --git a/docs/notes/25. å°†æºæ–‡ä»¶é™åˆ¶ä¸ºå•ä¸ªé¡¶çº§ç±».md b/docs/notes/25. å°†æºæ–‡ä»¶é™åˆ¶ä¸ºå•ä¸ªé¡¶çº§ç±».md new file mode 100644 index 0000000..c1e0ae7 --- /dev/null +++ b/docs/notes/25. å°†æºæ–‡ä»¶é™åˆ¶ä¸ºå•ä¸ªé¡¶çº§ç±».md @@ -0,0 +1,67 @@ +# 25. å°†æºæ–‡ä»¶é™åˆ¶ä¸ºå•ä¸ªé¡¶çº§ç±» + +  虽然 Java 编译器å…许在å•ä¸ªæºæ–‡ä»¶ä¸­å®šä¹‰å¤šä¸ªé¡¶çº§ç±»ï¼Œä½†è¿™æ ·åšæ²¡æœ‰ä»»ä½•å¥½å¤„,并且存在é‡å¤§é£Žé™©ã€‚ 风险æºäºŽåœ¨æºæ–‡ä»¶ä¸­å®šä¹‰å¤šä¸ªé¡¶çº§ç±»ä½¿å¾—为类æ供多个定义æˆä¸ºå¯èƒ½ã€‚ 使用哪个定义会å—到æºæ–‡ä»¶ä¼ é€’给编译器的顺åºçš„å½±å“。 + +  为了具体说明,请考虑下é¢æºæ–‡ä»¶ï¼Œå…¶ä¸­åªåŒ…å«ä¸€ä¸ªå¼•ç”¨å…¶ä»–两个顶级类(`Utensil` å’Œ `Dessert` 类)的æˆå‘˜çš„ Main 类: +```Java +public class Main { + public static void main(String[] args) { + System.out.println(Utensil.NAME + [Dessert.NAME](http://Dessert.NAME)); + } +} +``` + +  现在å‡è®¾åœ¨ `Utensil.java` çš„æºæ–‡ä»¶ä¸­åŒæ—¶å®šä¹‰äº† `Utensil` å’Œ `Dessert`: + +```Java +// Two classes defined in one file. Don't ever do this! +class Utensil { + static final String NAME = "pan"; +} + +class Dessert { + static final String NAME = "cake"; +} +``` + +  当然,`main` æ–¹æ³•ä¼šæ‰“å° `pancake`。 + +  现在å‡è®¾ä½ ä¸å°å¿ƒåˆ›å»ºäº†å¦ä¸€ä¸ªå为 `Dessert.java` çš„æºæ–‡ä»¶ï¼Œå®ƒå®šä¹‰äº†ç›¸åŒçš„两个类: + +```Java +// Two classes defined in one file. Don't ever do this! +class Utensil { + static final String NAME = "pot"; +} + +class Dessert { + static final String NAME = "pie"; +} +``` + +  如果你足够幸è¿ï¼Œä½¿ç”¨å‘½ä»¤ `javac Main.java Dessert.java` 编译程åºï¼Œç¼–译将失败,编译器会告诉你,你已ç»å¤šæ¬¡å®šä¹‰äº†ç±» `Utensil` å’Œ `Dessert`。 这是因为编译器首先编译 `Main.java`,当它看到对 `Utensil` 的引用(它在 `Dessert` 的引用之å‰ï¼‰æ—¶ï¼Œå®ƒå°†åœ¨ `Utensil.java` 中查找这个类并找到 `Utensil` å’Œ `Dessert`。 当编译器在命令行上é‡åˆ° `Dessert.java` 时,它也将拉入该文件,导致它é‡åˆ° `Utensil` å’Œ `Dessert` 的定义。 + +  如果使用命令 `javac Main.java` 或 `javac Main.java Utensil.java` 编译程åºï¼Œå®ƒçš„行为与在编写 `Dessert.java` 文件(å³æ‰“å° `pancake`)之å‰çš„行为相åŒã€‚ 但是,如果使用命令 `javac Dessert.java Main.java 编译程åº`ï¼Œå®ƒå°†æ‰“å° `potpie`。 程åºçš„行为因此å—到æºæ–‡ä»¶ä¼ é€’给编译器的顺åºçš„å½±å“,这显然是ä¸å¯æŽ¥å—的。 + +  解决这个问题很简å•ï¼Œå°†é¡¶å±‚类(如我们的例å­ä¸­çš„ `Utensil` å’Œ `Dessert`)分割æˆå•ç‹¬çš„æºæ–‡ä»¶ã€‚ 如果试图将多个顶级类放入å•ä¸ªæºæ–‡ä»¶ä¸­ï¼Œè¯·è€ƒè™‘使用é™æ€æˆå‘˜ç±»ï¼ˆæ¡ç›® 24)作为将类拆分为å•ç‹¬çš„æºæ–‡ä»¶çš„替代方法。 如果这些类从属于å¦ä¸€ä¸ªç±»ï¼Œé‚£ä¹ˆå°†å®ƒä»¬å˜æˆé™æ€æˆå‘˜ç±»é€šå¸¸æ˜¯æ›´å¥½çš„选择,因为它æ高了å¯è¯»æ€§ï¼Œå¹¶ä¸”å¯ä»¥é€šè¿‡å£°æ˜Žå®ƒä»¬ä¸ºç§æœ‰ï¼ˆæ¡ç›® 15)æ¥å‡å°‘类的å¯è®¿é—®æ€§ã€‚下é¢æ˜¯æˆ‘们的例å­çœ‹èµ·æ¥å¦‚何使用é™æ€æˆå‘˜ç±»ï¼š + +```Java +// Static member classes instead of multiple top-level classes +public class Test { + public static void main(String[] args) { + System.out.println(Utensil.NAME + [Dessert.NAME](http://Dessert.NAME)); + } + + private static class Utensil { + static final String NAME = "pan"; + } + + private static class Dessert { + static final String NAME = "cake"; + } +} +``` +  这个教训很清楚:永远ä¸è¦å°†å¤šä¸ªé¡¶çº§ç±»æˆ–接å£æ”¾åœ¨ä¸€ä¸ªæºæ–‡ä»¶ä¸­ã€‚ éµå¾ªè¿™ä¸ªè§„则ä¿è¯åœ¨ç¼–译时ä¸èƒ½æœ‰å¤šä¸ªå®šä¹‰ã€‚ è¿™åˆä¿è¯äº†ç¼–译生æˆçš„类文件以åŠç”Ÿæˆçš„程åºçš„行为与æºæ–‡ä»¶ä¼ é€’给编译器的顺åºæ— å…³ã€‚ + + + diff --git a/docs/notes/26. ä¸è¦ä½¿ç”¨åŽŸå§‹ç±»åž‹.md b/docs/notes/26. ä¸è¦ä½¿ç”¨åŽŸå§‹ç±»åž‹.md new file mode 100644 index 0000000..50ab420 --- /dev/null +++ b/docs/notes/26. ä¸è¦ä½¿ç”¨åŽŸå§‹ç±»åž‹.md @@ -0,0 +1,162 @@ + +  自 Java 5 以æ¥ï¼Œæ³›åž‹å·²ç»æˆä¸ºè¯¥è¯­è¨€çš„一部分。 在泛型之å‰ï¼Œä½ å¿…须转æ¢ä»Žé›†åˆä¸­è¯»å–çš„æ¯ä¸ªå¯¹è±¡ã€‚ 如果有人ä¸å°å¿ƒæ’入了错误类型的对象,则在è¿è¡Œæ—¶å¯èƒ½ä¼šå¤±è´¥ã€‚ 使用泛型,你告诉编译器在æ¯ä¸ªé›†åˆä¸­å…许哪些类型的对象。 编译器会自动æ’入强制转æ¢ï¼Œå¹¶åœ¨ç¼–译时告诉你是å¦å°è¯•æ’入错误类型的对象。 这样åšçš„结果是既安全åˆæ¸…晰的程åºï¼Œä½†è¿™äº›ç›Šå¤„,ä¸é™äºŽé›†åˆï¼Œæ˜¯æœ‰ä»£ä»·çš„。 本章告诉你如何最大é™åº¦åœ°æ高益处,并将并å‘ç—‡é™è‡³æœ€ä½Žã€‚ + + +# 26. ä¸è¦ä½¿ç”¨åŽŸå§‹ç±»åž‹ + +  首先,有几个术语。一个类或接å£ï¼Œå®ƒçš„声明有一个或多个类型å‚数(type parameters ),被称之为泛型类或泛型接å£[JLS,8.1.2,9.1.2]。 例如,`List` 接å£å…·æœ‰å•ä¸ªç±»åž‹å‚æ•° E,表示其元素类型。 接å£çš„å…¨å是 `List`(读作“Eâ€çš„列表),但是人们ç»å¸¸ç§°å®ƒä¸º `List`。 泛型类和接å£ç»Ÿç§°ä¸ºæ³›åž‹ç±»åž‹ï¼ˆgeneric types)。 + +  æ¯ä¸ªæ³›åž‹å®šä¹‰äº†ä¸€ç»„å‚数化类型(parameterized types),它们由类或接å£å称组æˆï¼ŒåŽè·Ÿä¸€ä¸ªä¸Žæ³›åž‹ç±»åž‹çš„å½¢å¼ç±»åž‹å‚æ•°[JLS,4.4,4.5] 相对应的实际类型å‚数的尖括å·â€œ<>â€åˆ—表。 例如,`List`(读作“字符串列表â€ï¼‰æ˜¯ä¸€ä¸ªå‚数化类型,表示其元素类型为 String 的列表。 (`String` 是与形å¼ç±»åž‹å‚æ•° `E` 相对应的实际类型å‚数)。 + +  最åŽï¼Œæ¯ä¸ªæ³›åž‹å®šä¹‰äº†ä¸€ä¸ªåŽŸå§‹ç±»åž‹ï¼ˆraw type),它是没有任何类型å‚数的泛型类型的å称[JLS,4.8]。 例如,对应于 `List` 的原始类型是 `List`。 原始类型的行为就åƒæ‰€æœ‰çš„泛型类型信æ¯éƒ½ä»Žç±»åž‹å£°æ˜Žä¸­è¢«æ¸…除一样。 它们的存在主è¦æ˜¯ä¸ºäº†ä¸Žæ²¡æœ‰æ³›åž‹ä¹‹å‰çš„代ç ç›¸å…¼å®¹ã€‚ + +  在泛型被添加到 Java 之å‰ï¼Œè¿™æ˜¯ä¸€ä¸ªå…¸åž‹çš„集åˆå£°æ˜Žã€‚ 从 Java 9 开始,它ä»ç„¶æ˜¯åˆæ³•çš„,但并ä¸æ˜¯å…¸åž‹çš„声明方å¼äº†ï¼š + +```Java +// Raw collection type - don't do this! + +// My stamp collection. Contains only Stamp instances. +private final Collection stamps = ... ; +``` + +  如果你今天使用这个声明,然åŽä¸å°å¿ƒæŠŠ `coin` 实例放入你的 `stamp` 集åˆä¸­ï¼Œé”™è¯¯çš„æ’入编译和è¿è¡Œæ²¡æœ‰é”™è¯¯ï¼ˆå°½ç®¡ç¼–译器å‘出一个模糊的警告): + +```Java +// Erroneous insertion of coin into stamp collection +stamps.add(new Coin( ... )); // Emits "unchecked call" warning +``` + +  直到您å°è¯•ä»Ž `stamp` 集åˆä¸­æ£€ç´¢ `coin` 实例时æ‰ä¼šå‘生错误: + +```Java +// Raw iterator type - don't do this! +for (Iterator i = stamps.iterator(); i.hasNext(); ) + Stamp stamp = (Stamp) i.next(); // Throws ClassCastException + stamp.cancel(); +``` + +  正如本书所æ到的,在编译完æˆä¹‹åŽå°½å¿«å‘现错误是值得的,ç†æƒ³æƒ…况是在编译时。 在这ç§æƒ…况下,直到è¿è¡Œæ—¶æ‰å‘现错误,在错误å‘生åŽçš„很长一段时间,以åŠå¯èƒ½è¿œç¦»åŒ…å«é”™è¯¯çš„代ç çš„代ç ä¸­ã€‚ 一旦看到 `ClassCastException`,就必须æœç´¢ä»£ç ç±»åº“,查找将 `coin` 实例放入 `stamp` 集åˆçš„方法调用。 编译器ä¸èƒ½å¸®åŠ©ä½ ï¼Œå› ä¸ºå®ƒä¸èƒ½ç†è§£é‚£ä¸ªè¯´â€œä»…åŒ…å« `stamp` 实例â€çš„注释。 + +  对于泛型,类型声明包å«çš„ä¿¡æ¯ï¼Œè€Œä¸æ˜¯æ³¨é‡Šï¼š + +```Java +// Parameterized collection type - typesafe +private final Collection stamps = ... ; +``` + +ã€€ã€€ä»Žè¿™ä¸ªå£°æ˜Žä¸­ï¼Œç¼–è¯‘å™¨çŸ¥é“ `stamps` 集åˆåº”该åªåŒ…å« `Stamp` 实例,并ä¿è¯å®ƒæ˜¯ `true`,å‡è®¾ä½ çš„整个代ç ç±»åº“编译时ä¸å‘出(或者抑制;å‚è§æ¡ç›® 27)任何警告。 当使用å‚数化类型声明声明 `stamps` 时,错误的æ’入会生æˆä¸€ä¸ªç¼–译时错误消æ¯ï¼Œå‘Šè¯‰ä½ åˆ°åº•å‘生了什么错误: + +```Java +Test.java:9: error: incompatible types: Coin cannot be converted +to Stamp + c.add(new Coin()); + ^ +``` + +  当从集åˆä¸­æ£€ç´¢å…ƒç´ æ—¶ï¼Œç¼–译器会为你æ’å…¥ä¸å¯è§çš„强制转æ¢ï¼Œå¹¶ä¿è¯å®ƒä»¬ä¸ä¼šå¤±è´¥ï¼ˆå†å‡è®¾ä½ çš„所有代ç éƒ½ä¸ä¼šç”Ÿæˆæˆ–ç¦æ­¢ä»»ä½•ç¼–译器警告)。 虽然æ„外地将 `coin` 实例æ’å…¥ `stamp` 集åˆçš„预期å¯èƒ½çœ‹èµ·æ¥å¾ˆç‰µå¼ºï¼Œä½†è¿™ä¸ªé—®é¢˜æ˜¯çœŸå®žçš„。 例如,很容易想象将 `BigInteger` 放入一个åªåŒ…å« `BigDecimal` 实例的集åˆä¸­ã€‚ + +  如å‰æ‰€è¿°ï¼Œä½¿ç”¨åŽŸå§‹ç±»åž‹ï¼ˆæ²¡æœ‰ç±»åž‹å‚数的泛型)是åˆæ³•çš„,但是你ä¸åº”该这样åšã€‚ **如果你使用原始类型,则会丧失泛型的所有安全性和表达上的优势。** 鉴于你ä¸åº”该使用它们,为什么语言设计者首先å…许原始类型呢? 答案是为了兼容性。 泛型被添加时,Java å³å°†è¿›å…¥ç¬¬äºŒä¸ªå年,并且有大é‡çš„代ç æ²¡æœ‰ä½¿ç”¨æ³›åž‹ã€‚ 所有这些代ç éƒ½æ˜¯åˆæ³•çš„,并且与使用泛型的新代ç è¿›è¡Œäº¤äº’æ“作被认为是至关é‡è¦çš„。 å°†å‚数化类型的实例传递给为原始类型设计的方法必须是åˆæ³•çš„,å之亦然。 这个需求,被称为è¿ç§»å…¼å®¹æ€§ï¼Œé©±ä½¿å†³ç­–支æŒåŽŸå§‹ç±»åž‹ï¼Œå¹¶ä½¿ç”¨æ“¦é™¤æ¥å®žçŽ°æ³›åž‹ï¼ˆæ¡ç›® 28)。 + +  虽然ä¸åº”使用诸如 `List` 之类的原始类型,但å¯ä»¥ä½¿ç”¨å‚数化类型æ¥å…许æ’入任æ„对象(如 `List`)。 原始类型 List å’Œå‚数化类型 `List` 之间有什么区别? æ¾æ•£åœ°è¯´ï¼Œå‰è€…å·²ç»é€‰æ‹©äº†æ³›åž‹ç±»åž‹ç³»ç»Ÿï¼Œè€ŒåŽè€…明确地告诉编译器,它能够ä¿å­˜ä»»ä½•ç±»åž‹çš„对象。 虽然å¯ä»¥å°† `List` 传递给 `List` 类型的å‚数,但ä¸èƒ½å°†å…¶ä¼ é€’ç»™ `List` 类型的å‚数。 泛型有å­ç±»åž‹çš„规则,`List` 是原始类型 `List` çš„å­ç±»åž‹ï¼Œä½†ä¸æ˜¯å‚数化类型 `List` çš„å­ç±»åž‹ï¼ˆæ¡ç›® 28)。 因此,如果使用诸如 `List` 之类的原始类型,则会丢失类型安全性,但是如果使用å‚数化类型(例如 `List`)则ä¸ä¼šã€‚ + +  为了具体说明,请考虑以下程åºï¼š + +```Java +// Fails at runtime - unsafeAdd method uses a raw type (List)! +public static void main(String[] args) { + List strings = new ArrayList<>(); + unsafeAdd(strings, Integer.valueOf(42)); + String s = strings.get(0); // Has compiler-generated cast +} + +private static void unsafeAdd(List list, Object o) { + list.add(o); +} +``` + +  此程åºå¯ä»¥ç¼–译,它使用原始类型列表,但会收到警告: + +```Java +Test.java:10: warning: [unchecked] unchecked call to add(E) as a +member of the raw type List + list.add(o); + ^ +``` +  实际上,如果è¿è¡Œè¯¥ç¨‹åºï¼Œåˆ™å½“程åºå°è¯•è°ƒç”¨ `strings.get(0)` 的结果(一个 `Integer`)转æ¢ä¸ºä¸€ä¸ª `String` 时,会得到 `ClassCastException` 异常。 这是一个编译器生æˆçš„强制转æ¢ï¼Œå› æ­¤é€šå¸¸ä¼šä¿è¯æˆåŠŸï¼Œä½†åœ¨è¿™ç§æƒ…况下,我们忽略了编译器警告并付出了代价。 + +  如果用 `unsafeAdd` 声明中的å‚数化类型 `List` 替æ¢åŽŸå§‹ç±»åž‹ `List`,并å°è¯•é‡æ–°ç¼–译该程åºï¼Œåˆ™ä¼šå‘现它ä¸å†ç¼–译,而是å‘出错误消æ¯ï¼š + + +```Java +Test.java:5: error: incompatible types: List cannot be +converted to List + unsafeAdd(strings, Integer.valueOf(42)); +``` +  你å¯èƒ½ä¼šè¯•å›¾ä½¿ç”¨åŽŸå§‹ç±»åž‹æ¥å¤„ç†å…ƒç´ ç±»åž‹æœªçŸ¥ä¸”无关紧è¦çš„集åˆã€‚ 例如,å‡è®¾ä½ æƒ³ç¼–写一个方法,它需è¦ä¸¤ä¸ªé›†åˆå¹¶è¿”回它们共åŒæ‹¥æœ‰çš„元素的数é‡ã€‚ 如果是泛型新手,那么您å¯ä»¥è¿™æ ·å†™ï¼š + +```Java +// Use of raw type for unknown element type - don't do this! +static int numElementsInCommon(Set s1, Set s2) { + int result = 0; + for (Object o1 : s1) + if (s2.contains(o1)) + result++; + return result; +} +``` + +  这ç§æ–¹æ³•å¯ä»¥å·¥ä½œï¼Œä½†å®ƒä½¿ç”¨åŽŸå§‹ç±»åž‹ï¼Œè¿™æ˜¯å±é™©çš„。 安全替代方å¼æ˜¯ä½¿ç”¨æ— é™åˆ¶é€šé…符类型(unbounded wildcard types)。 如果è¦ä½¿ç”¨æ³›åž‹ç±»åž‹ï¼Œä½†ä¸çŸ¥é“或关心实际类型å‚数是什么,则å¯ä»¥ä½¿ç”¨é—®å·æ¥ä»£æ›¿ã€‚ 例如,泛型类型 `Set` çš„æ— é™åˆ¶é€šé…符类型是 `Set`(读å–“æŸç§ç±»åž‹çš„集åˆâ€ï¼‰ã€‚ 它是最通用的å‚数化的 `Set` 类型,能够ä¿æŒä»»ä½•é›†åˆã€‚ 下é¢æ˜¯ `numElementsInCommon` 方法使用无é™åˆ¶é€šé…符类型声明的情况: +。 + +```Java +// Uses unbounded wildcard type - typesafe and flexible +static int numElementsInCommon(Set s1, Set s2) { ... } +``` + +  无é™åˆ¶é€šé…符 `Set` 与原始类型 `Set` 之间有什么区别? é—®å·çœŸçš„给你放任何东西å—? è¿™ä¸æ˜¯è¦ç‚¹ï¼Œä½†é€šé…符类型是安全的,原始类型ä¸æ˜¯ã€‚ ä½ å¯ä»¥å°†ä»»ä½•å…ƒç´ æ”¾å…¥å…·æœ‰åŽŸå§‹ç±»åž‹çš„集åˆä¸­ï¼Œè½»æ˜“ç ´å集åˆçš„类型ä¸å˜æ€§ï¼ˆå¦‚第 119 页上的 `unsafeAdd` 方法所示); ä½ ä¸èƒ½æŠŠä»»ä½•å…ƒç´ ï¼ˆé™¤ null 之外)放入一个 `Collection` 中。 试图这样åšä¼šäº§ç”Ÿä¸€ä¸ªåƒè¿™æ ·çš„编译时错误消æ¯ï¼š + +```Java +WildCard.java:13: error: incompatible types: String cannot be +converted to CAP#1 + c.add("verboten"); + ^ + where CAP#1 is a fresh type-variable: + CAP#1 extends Object from capture of ? +``` + +  ä¸å¯å¦è®¤çš„是,这个错误信æ¯ç•™ä¸‹äº†ä¸€äº›éœ€è¦çš„东西,但是编译器已ç»å®Œæˆäº†å®ƒçš„工作,ä¸ç®¡å®ƒçš„元素类型是什么,都ä¸ä¼šç ´å集åˆçš„类型ä¸å˜æ€§ã€‚ ä½ ä¸ä»…å¯ä»¥å°†ä»»ä½•å…ƒç´ ï¼ˆé™¤ `null` 以外)放入一个 `Collection` 中,但是ä¸èƒ½ä¿è¯ä½ æ‰€å¾—到的对象的类型。 如果这些é™åˆ¶æ˜¯ä¸å¯æŽ¥å—的,å¯ä»¥ä½¿ç”¨æ³›åž‹æ–¹æ³•ï¼ˆæ¡ç›® 30)或有é™åˆ¶é…符类型(æ¡ç›® 31)。 + +  对于ä¸åº”该使用原始类型的规则,有一些å°ä¾‹å¤–。 **你必须在类字é¢å€¼ï¼ˆclass literals)中使用原始类型。** 规范中ä¸å…许使用å‚数化类型(尽管它å…许数组类型和基本类型)[JLS,15.8.2]。 æ¢å¥è¯è¯´ï¼Œ`List.class`,`String[].class` å’Œ `int.class` 都是åˆæ³•çš„,但 `List.class` å’Œ `List.class` ä¸æ˜¯åˆæ³•çš„。 + +ã€€ã€€è§„åˆ™çš„ç¬¬äºŒä¸ªä¾‹å¤–æ¶‰åŠ `instanceof` æ“作符。 因为泛型类型信æ¯åœ¨è¿è¡Œæ—¶è¢«åˆ é™¤ï¼Œæ‰€ä»¥åœ¨æ— é™åˆ¶é€šé…符类型以外的å‚数化类型上使用 `instanceof` è¿ç®—符是éžæ³•çš„。 使用无é™åˆ¶é€šé…符类型代替原始类型ä¸ä¼šä»¥ä»»ä½•æ–¹å¼å½±å“ `instanceof` è¿ç®—符的行为。 在这ç§æƒ…况下,尖括å·å’Œé—®å·å°±æ˜¾å¾—多余。 **以下是使用泛型类型的 `instanceof` è¿ç®—符的首选方法:** + +```Java +// Legitimate use of raw type - instanceof operator +if (o instanceof Set) { // Raw type + Set s = (Set) o; // Wildcard type + ... +} +``` + +  请注æ„,一旦确定 `o` 对象是一个 `Set`,则必须将其转æ¢ä¸ºé€šé…符 `Set`,而ä¸æ˜¯åŽŸå§‹ç±»åž‹ `Set`。 这是一个强制转æ¢ï¼Œæ‰€ä»¥ä¸ä¼šå¯¼è‡´ç¼–译器警告。 + +  总之,使用原始类型å¯èƒ½å¯¼è‡´è¿è¡Œæ—¶å¼‚常,所以ä¸è¦ä½¿ç”¨å®ƒä»¬ã€‚ 它们仅用于与泛型引入之å‰çš„传统代ç çš„兼容性和互æ“作性。 作为一个快速回顾,`Set` 是一个å‚数化类型,表示一个å¯ä»¥åŒ…å«ä»»ä½•ç±»åž‹å¯¹è±¡çš„集åˆï¼Œ`Set` 是一个通é…符类型,表示一个åªèƒ½åŒ…å«æŸäº›æœªçŸ¥ç±»åž‹å¯¹è±¡çš„集åˆï¼Œ`Set` 是一个原始类型,它ä¸åœ¨æ³›åž‹ç±»åž‹ç³»ç»Ÿä¹‹åˆ—。 å‰ä¸¤ä¸ªç±»åž‹æ˜¯å®‰å…¨çš„,最åŽä¸€ä¸ªä¸æ˜¯ã€‚ + +  为了快速å‚考,下表中总结了本æ¡ç›®ï¼ˆä»¥åŠæœ¬ç« ç¨åŽä»‹ç»çš„一些)中介ç»çš„术语: + +|术语|中文å«ä¹‰| 举例|所在æ¡ç›®| +|:--:|:--:|:--:|:--:| +|Parameterized type|å‚数化类型|`List`|æ¡ç›® 26| +|Actual type parameter |实际类型å‚æ•°|`String`|æ¡ç›® 26| +|Generic type|泛型类型 |`List`|æ¡ç›® 26| +|Formal type parameter|å½¢å¼ç±»åž‹å‚æ•° |`E`|æ¡ç›® 26| +|Unbounded wildcard type|æ— é™åˆ¶é€šé…符类型|`List`|æ¡ç›® 26| +|Raw type|原始类型|`List`|æ¡ç›® 26| +|Bounded type parameter|é™åˆ¶ç±»åž‹å‚æ•°|``|æ¡ç›® 29| +|Recursive type bound|递归类型é™åˆ¶| `>`|æ¡ç›® 30| +|Bounded wildcard type|é™åˆ¶é€šé…符类型|`List`|æ¡ç›® 31| +|Generic method|泛型方法|`static List asList(E[] a)`|æ¡ç›® 30| +|Type token|类型令牌|`String.class`|æ¡ç›® 33| + + + diff --git a/docs/notes/27. 消除éžæ£€æŸ¥è­¦å‘Š.md b/docs/notes/27. 消除éžæ£€æŸ¥è­¦å‘Š.md new file mode 100644 index 0000000..a6f0acd --- /dev/null +++ b/docs/notes/27. 消除éžæ£€æŸ¥è­¦å‘Š.md @@ -0,0 +1,84 @@ +# 27. 消除éžæ£€æŸ¥è­¦å‘Š + +  使用泛型编程时,会看到许多编译器警告:未ç»æ£€æŸ¥çš„强制转æ¢è­¦å‘Šï¼Œæœªç»æ£€æŸ¥çš„方法调用警告,未ç»æ£€æŸ¥çš„å‚数化å¯å˜é•¿åº¦ç±»åž‹è­¦å‘Šä»¥åŠæœªç»æ£€æŸ¥çš„转æ¢è­¦å‘Šã€‚ 你使用泛型获得的ç»éªŒè¶Šå¤šï¼ŒèŽ·å¾—的警告越少,但ä¸è¦æœŸæœ›æ–°ç¼–写的代ç èƒ½å¤Ÿå¹²å‡€åœ°ç¼–译。 + +  许多未ç»æ£€æŸ¥çš„警告很容易消除。 例如,å‡è®¾ä½ ä¸å°å¿ƒå†™äº†ä»¥ä¸‹å£°æ˜Žï¼š + +```Java +Set exaltation = new HashSet(); +``` + +  编译器会æ醒你你åšé”™äº†ä»€ä¹ˆï¼š + +```Java +Venery.java:4: warning: [unchecked] unchecked conversion + Set exaltation = new HashSet(); + ^ + required: Set + found: HashSet。 +``` + +  然åŽå¯ä»¥è¿›è¡ŒæŒ‡ç¤ºä¿®æ­£ï¼Œè®©è­¦å‘Šæ¶ˆå¤±ã€‚ 请注æ„,实际上并ä¸éœ€è¦æŒ‡å®šç±»åž‹å‚数,åªæ˜¯ä¸ºäº†è¡¨æ˜Žå®ƒä¸Ž Java 7 中引入的钻石è¿ç®—符("<>")一åŒå‡ºçŽ°ã€‚然åŽç¼–译器会推断出正确的实际类型å‚数(在本例中为 `Lark`): + +```Java +Set exaltation = new HashSet<>(); +``` + +  但一些警告更难以消除。 本章充满了这ç§è­¦å‘Šçš„例å­ã€‚ 当你收到需è¦è¿›ä¸€æ­¥æ€è€ƒçš„警告时,åšæŒä¸æ‡ˆï¼ **å°½å¯èƒ½åœ°æ¶ˆé™¤æ¯ä¸€ä¸ªæœªç»æ£€æŸ¥çš„警告。** 如果你消除所有的警告,你å¯ä»¥æ”¾å¿ƒï¼Œä½ çš„代ç æ˜¯ç±»åž‹å®‰å…¨çš„,这是一件éžå¸¸å¥½çš„事情。 è¿™æ„味ç€åœ¨è¿è¡Œæ—¶ä½ å°†ä¸ä¼šå¾—到一个 `ClassCastException` 异常,并且增加了你的程åºå°†æŒ‰ç…§ä½ çš„æ„图行事的信心。 + +  **如果你ä¸èƒ½æ¶ˆé™¤è­¦å‘Šï¼Œä½†ä½ å¯ä»¥è¯æ˜Žå¼•å‘警告的代ç æ˜¯ç±»åž‹å®‰å…¨çš„,那么(并且åªèƒ½è¿™æ ·ï¼‰ç”¨ `@SuppressWarnings(“uncheckedâ€)` 注解æ¥æŠ‘制警告。** 如果你在没有首先è¯æ˜Žä»£ç æ˜¯ç±»åž‹å®‰å…¨çš„情况下压制警告,那么你给自己一个错误的安全感。 代ç å¯èƒ½ä¼šåœ¨ä¸å‘出任何警告的情况下进行编译,但是它ä»ç„¶å¯ä»¥åœ¨è¿è¡Œæ—¶æŠ›å‡º `ClassCastException` 异常。 但是,如果你忽略了你认为是安全的未ç»æ£€æŸ¥çš„警告(而ä¸æ˜¯æŠ‘制它们),那么当一个新的警告出现时,你将ä¸ä¼šæ³¨æ„到这是一个真正的问题。 新出现的警告就会淹没在所有的错误警告当中。 + +`SuppressWarnings` 注解å¯ç”¨äºŽä»»ä½•å£°æ˜Žï¼Œä»Žå•ä¸ªå±€éƒ¨å˜é‡å£°æ˜Žåˆ°æ•´ä¸ªç±»ã€‚ 始终在尽å¯èƒ½æœ€å°çš„范围内使用 `SuppressWarnings` 注解。 通常这是一个å˜é‡å£°æ˜Žæˆ–一个éžå¸¸çŸ­çš„方法或构造方法。 切勿在整个类上使用 `SuppressWarnings` 注解。 这样åšå¯èƒ½ä¼šæŽ©ç›–é‡è¦çš„警告。 + +  如果你å‘现自己在长度超过一行的方法或构造方法上使用 `SuppressWarnings` 注解,则å¯ä»¥å°†å…¶ç§»åˆ°å±€éƒ¨å˜é‡å£°æ˜Žä¸Šã€‚ ä½ å¯èƒ½éœ€è¦å£°æ˜Žä¸€ä¸ªæ–°çš„局部å˜é‡ï¼Œä½†è¿™æ˜¯å€¼å¾—的。 例如,考虑这个æ¥è‡ª `ArrayList` çš„ `toArray` 方法: + + +```Java +public T[] toArray(T[] a) { + if (a.length < size) + return (T[]) Arrays.copyOf(elements, size, a.getClass()); + System.arraycopy(elements, 0, a, 0, size); + if (a.length > size) + a[size] = null; + return a; +} + +如果编译 ArrayList 类,则该方法会生æˆæ­¤è­¦å‘Šï¼š +ArrayList.java:305: warning: [unchecked] unchecked cast + return (T[]) Arrays.copyOf(elements, size, a.getClass()); + ^ + required: T[] + found: Object[] +``` + +  在返回语å¥ä¸­è®¾ç½® `SuppressWarnings` 注解是éžæ³•çš„,因为它ä¸æ˜¯ä¸€ä¸ªå£°æ˜Ž[JLS,9.7]。 ä½ å¯èƒ½ä¼šè¯•å›¾æŠŠæ³¨é‡Šæ”¾åœ¨æ•´ä¸ªæ–¹æ³•ä¸Šï¼Œä½†æ˜¯ä¸è¦è¿™è¦åšã€‚ 相å,声明一个局部å˜é‡æ¥ä¿å­˜è¿”回值并标注它的声明,如下所示: + + +```Java +// Adding local variable to reduce scope of @SuppressWarnings +public T[] toArray(T[] a) { + if (a.length < size) { + // This cast is correct because the array we're creating + // is of the same type as the one passed in, which is T[]. + @SuppressWarnings("unchecked") T[] result = + (T[]) Arrays.copyOf(elements, size, a.getClass()); + return result; + } + System.arraycopy(elements, 0, a, 0, size); + if (a.length > size) + a[size] = null; + return a; +} +``` + +  所产生的方法干净地编译,并最å°åŒ–未ç»æ£€æŸ¥çš„警告被抑制的范围。 + +  **æ¯å½“使用 `@SuppressWarnings(“uncheckedâ€)` 注解时,请添加注释,说明为什么是安全的。** 这将有助于他人ç†è§£ä»£ç ï¼Œæ›´é‡è¦çš„是,这将å‡å°‘有人修改代ç çš„å¯èƒ½æ€§ï¼Œä»Žè€Œä½¿è®¡ç®—ä¸å®‰å…¨ã€‚ 如果你觉得很难写这样的注释,请继续æ€è€ƒã€‚ 毕竟,你最终å¯èƒ½ä¼šå‘现未ç»æ£€æŸ¥çš„æ“作是ä¸å®‰å…¨çš„。 + +  总之,未ç»æ£€æŸ¥çš„警告是é‡è¦çš„。 ä¸è¦å¿½è§†ä»–们。 æ¯ä¸ªæœªç»æ£€æŸ¥çš„警告代表在è¿è¡Œæ—¶å‡ºçŽ° `ClassCastException` 异常的å¯èƒ½æ€§ã€‚ 尽你所能消除这些警告。 如果无法消除未ç»æ£€æŸ¥çš„警告,并且å¯ä»¥è¯æ˜Žå¼•å‘该警告的代ç æ˜¯å®‰å…¨ç±»åž‹çš„,则å¯ä»¥åœ¨å°½å¯èƒ½å°çš„范围内使用 `@SuppressWarnings(“uncheckedâ€)` 注解æ¥ç¦æ­¢è­¦å‘Šã€‚ 记录你决定在注释中抑制此警告的ç†ç”±ã€‚ + + + + + + diff --git a/docs/notes/28. 列表优于数组.md b/docs/notes/28. 列表优于数组.md new file mode 100644 index 0000000..3d9ff4e --- /dev/null +++ b/docs/notes/28. 列表优于数组.md @@ -0,0 +1,133 @@ +# 28. 列表优于数组 + +  数组在两个é‡è¦æ–¹é¢ä¸Žæ³›åž‹ä¸åŒã€‚ 首先,数组是åå˜çš„(covariant)。 这个å“人的å•è¯æ„味ç€å¦‚æžœ Sub 是 Super çš„å­ç±»åž‹ï¼Œåˆ™æ•°ç»„类型 `Sub[]` 是数组类型 `Super[]` çš„å­ç±»åž‹ã€‚ 相比之下,泛型是ä¸å˜çš„(invariant):对于任何两ç§ä¸åŒçš„类型 `Type1` å’Œ `Type2`,`List` æ—¢ä¸æ˜¯ `List` çš„å­ç±»åž‹ä¹Ÿä¸æ˜¯çˆ¶ç±»åž‹ã€‚[JLS,4.10; Naftalin07,2.5]。 ä½ å¯èƒ½è®¤ä¸ºè¿™æ„味ç€æ³›åž‹æ˜¯ä¸è¶³çš„,但å¯ä»¥è¯´æ˜¯æ•°ç»„缺陷。 这段代ç æ˜¯åˆæ³•çš„: + +```Java +// Fails at runtime! +Object[] objectArray = new Long[1]; +objectArray[0] = "I don't fit in"; // Throws ArrayStoreException +``` + +  但这个ä¸æ˜¯ï¼š + +```Java +// Won't compile! +List ol = new ArrayList(); // Incompatible types +ol.add("I don't fit in"); +``` + +  无论哪ç§æ–¹å¼ï¼Œä½ ä¸èƒ½æŠŠä¸€ä¸ª `String` 类型放到一个 `Long` 类型容器中,但是用一个数组,你会å‘现在è¿è¡Œæ—¶äº§ç”Ÿäº†ä¸€ä¸ªé”™è¯¯ï¼›å¯¹äºŽåˆ—表,å¯ä»¥åœ¨ç¼–译时就能å‘现错误。 当然,你å®æ„¿åœ¨ç¼–译时找出错误。 + +  数组和泛型之间的第二个主è¦åŒºåˆ«æ˜¯æ•°ç»„被具体化了(reified)[JLS,4.7]。 è¿™æ„味ç€æ•°ç»„在è¿è¡Œæ—¶çŸ¥é“并强制执行它们的元素类型。 如å‰æ‰€è¿°ï¼Œå¦‚æžœå°è¯•å°†ä¸€ä¸ª `String` 放入 `Long` 数组中,得到一个 `ArrayStoreException` 异常。 相å,泛型通过擦除(erasure)æ¥å®žçŽ°[JLS,4.6]。 è¿™æ„味ç€å®ƒä»¬åªåœ¨ç¼–译时执行类型约æŸï¼Œå¹¶åœ¨è¿è¡Œæ—¶ä¸¢å¼ƒï¼ˆæˆ–擦除)它们的元素类型信æ¯ã€‚ 擦除是å…许泛型类型与ä¸ä½¿ç”¨æ³›åž‹çš„é—留代ç è‡ªç”±äº’æ“作(æ¡ç›® 26),从而确ä¿åœ¨ Java 5 中平滑过渡到泛型。 + +  由于这些基本差异,数组和泛型ä¸èƒ½å¾ˆå¥½åœ°åœ¨ä¸€èµ·æ··åˆä½¿ç”¨ã€‚ 例如,创建泛型类型的数组,å‚数化类型的数组,以åŠç±»åž‹å‚数的数组都是éžæ³•çš„。 因此,这些数组创建表达å¼éƒ½ä¸åˆæ³•ï¼š`new List[]`,`new List[]`,`new E[]`。 所有将在编译时导致泛型数组创建错误。 + +  为什么创建一个泛型数组是éžæ³•çš„? 因为它ä¸æ˜¯ç±»åž‹å®‰å…¨çš„。 如果这是åˆæ³•çš„,编译器生æˆçš„强制转æ¢ç¨‹åºåœ¨è¿è¡Œæ—¶å¯èƒ½ä¼šå› ä¸º `ClassCastException` 异常而失败。 这将è¿å泛型类型系统æ供的基本ä¿è¯ã€‚ + +  为了具体说明,请考虑下é¢çš„代ç ç‰‡æ®µï¼š + +```Java +// Why generic array creation is illegal - won't compile! +List[] stringLists = new List[1]; // (1) +List intList = List.of(42); // (2) +Object[] objects = stringLists; // (3) +objects[0] = intList; // (4) +String s = stringLists[0].get(0); // (5) +``` + +  让我们å‡è®¾ç¬¬ 1 行创建一个泛型数组是åˆæ³•çš„。第 2 行创建并åˆå§‹åŒ–包å«å•ä¸ªå…ƒç´ çš„ `List`。第 3 行将 `List` 数组存储到 Object 数组å˜é‡ä¸­ï¼Œè¿™æ˜¯åˆæ³•çš„,因为数组是åå˜çš„。第 4 行将 `List` 存储在 Object 数组的唯一元素中,这是因为泛型是通过擦除æ¥å®žçŽ°çš„:`List` 实例的è¿è¡Œæ—¶ç±»åž‹ä»…仅是 `List`,而 `List[]` 实例是 `List[]`,所以这个赋值ä¸ä¼šäº§ç”Ÿ `ArrayStoreException` 异常。现在我们é‡åˆ°äº†éº»çƒ¦ã€‚将一个 `List` 实例存储到一个声明为仅ä¿å­˜ `List` 实例的数组中。在第 5 行中,我们从这个数组的唯一列表中检索唯一的元素。编译器自动将检索到的元素转æ¢ä¸º `String`,但它是一个 `Integer`,所以我们在è¿è¡Œæ—¶å¾—到一个 `ClassCastException` 异常。为了防止å‘生这ç§æƒ…况,第 1 行(创建一个泛型数组)必须产生一个编译时错误。 + +  类型 `E`,`List` å’Œ `List` 等在技术上被称为ä¸å¯å…·ä½“化的类型(nonreifiable types)[JLS,4.7]。 直观地说,ä¸å¯å…·ä½“化的类型是其è¿è¡Œæ—¶è¡¨ç¤ºåŒ…å«çš„ä¿¡æ¯å°‘于其编译时表示的类型。 由于擦除,å¯å”¯ä¸€ç¡®å®šçš„å‚数化类型是无é™å®šé€šé…符类型,如 `List` å’Œ `Map`(æ¡ç›® 26)。 尽管很少有用,创建无é™å®šé€šé…符类型的数组是åˆæ³•çš„。 + +  ç¦æ­¢æ³›åž‹æ•°ç»„的创建å¯èƒ½ä¼šå¾ˆæ¼äººçš„。 è¿™æ„味ç€ï¼Œä¾‹å¦‚,泛型集åˆé€šå¸¸ä¸å¯èƒ½è¿”回其元素类型的数组(但是å‚è§æ¡ç›® 33 中的部分解决方案)。 这也æ„味ç€ï¼Œå½“使用å¯å˜å‚数方法(æ¡ç›® 53)和泛型时,会产生令人困惑的警告。 这是因为æ¯æ¬¡è°ƒç”¨å¯å˜å‚数方法时,都会创建一个数组æ¥ä¿å­˜å¯å˜å‚数。 如果此数组的元素类型ä¸å¯ç¡®å®šï¼Œåˆ™ä¼šæ”¶åˆ°è­¦å‘Šã€‚ `SafeVarargs` 注解å¯ä»¥ç”¨æ¥è§£å†³è¿™ä¸ªé—®é¢˜ï¼ˆæ¡ç›® 32)。 + +  当你在强制转æ¢ä¸ºæ•°ç»„类型时,得到泛型数组创建错误,或是未ç»æ£€æŸ¥çš„强制转æ¢è­¦å‘Šæ—¶ï¼Œæœ€ä½³è§£å†³æ–¹æ¡ˆé€šå¸¸æ˜¯ä½¿ç”¨é›†åˆç±»åž‹ `List` 而ä¸æ˜¯æ•°ç»„类型 `E[]`。 这样å¯èƒ½ä¼šç‰ºç‰²ä¸€äº›ç®€æ´æ€§æˆ–性能,但作为交æ¢ï¼Œä½ ä¼šèŽ·å¾—更好的类型安全性和互æ“作性。 + +  例如,å‡è®¾ä½ æƒ³ç”¨å¸¦æœ‰é›†åˆçš„构造方法æ¥ç¼–写一个 `Chooser` 类,并且有个方法返回éšæœºé€‰æ‹©çš„集åˆçš„一个元素。 æ ¹æ®ä¼ é€’给构造方法的集åˆï¼Œå¯ä»¥ä½¿ç”¨é€‰æ‹©å™¨ä½œä¸ºæ¸¸æˆæ¨¡å…·ï¼Œé­”术 8 çƒæˆ–æ•°æ®æºè¿›è¡Œè’™ç‰¹å¡ç½—模拟。 这是一个没有泛型的简å•å®žçŽ°ï¼š + +```Java +// Chooser - a class badly in need of generics! +public class Chooser { + private final Object[] choiceArray; + + + public Chooser(Collection choices) { + choiceArray = choices.toArray(); + } + + + public Object choose() { + Random rnd = ThreadLocalRandom.current(); + return choiceArray[rnd.nextInt(choiceArray.length)]; + } +} +``` + +  è¦ä½¿ç”¨è¿™ä¸ªç±»ï¼Œæ¯æ¬¡è°ƒç”¨æ–¹æ³•æ—¶ï¼Œéƒ½å¿…须将 `Object` çš„ `choose` 方法的返回值转æ¢ä¸ºæ‰€éœ€çš„类型,如果类型错误,则转æ¢åœ¨è¿è¡Œæ—¶å¤±è´¥ã€‚ 我们先根æ®æ¡ç›® 29 的建议,试图修改 `Chooser` 类,使其æˆä¸ºæ³›åž‹çš„。 + +```Java +// A first cut at making Chooser generic - won't compile +public class Chooser { + private final T[] choiceArray; + + public Chooser(Collection choices) { + choiceArray = choices.toArray(); + } + + // choose method unchanged +} +``` + +  如果你å°è¯•ç¼–译这个类,会得到这个错误信æ¯ï¼š + +```Java +Chooser.java:9: error: incompatible types: Object[] cannot be +converted to T[] + choiceArray = choices.toArray(); + ^ + where T is a type-variable: + T extends Object declared in class Chooser +``` + +  没什么大ä¸äº†çš„,将 `Object` 数组转æ¢ä¸º `T` 数组: + +```Java +choiceArray = (T[]) choices.toArray(); +``` + +  这没有了错误,而是得到一个警告: + +```Java +Chooser.java:9: warning: [unchecked] unchecked cast + choiceArray = (T[]) choices.toArray(); + ^ + required: T[], found: Object[] + where T is a type-variable: +T extends Object declared in class Chooser +``` + +  编译器告诉你在è¿è¡Œæ—¶ä¸èƒ½ä¿è¯å¼ºåˆ¶è½¬æ¢çš„安全性,因为程åºä¸ä¼šçŸ¥é“ `T` 代表什么类型——记ä½ï¼Œå…ƒç´ ç±»åž‹ä¿¡æ¯åœ¨è¿è¡Œæ—¶ä¼šè¢«æ³›åž‹åˆ é™¤ã€‚ 该程åºå¯ä»¥æ­£å¸¸å·¥ä½œå—? 是的,但编译器ä¸èƒ½è¯æ˜Žè¿™ä¸€ç‚¹ã€‚ ä½ å¯ä»¥è¯æ˜Žè¿™ä¸€ç‚¹ï¼Œåœ¨æ³¨é‡Šä¸­æ出è¯æ®ï¼Œå¹¶ç”¨æ³¨è§£æ¥æŠ‘制警告,但最好是消除警告的原因(æ¡ç›® 27)。 + +  è¦æ¶ˆé™¤æœªç»æ£€æŸ¥çš„强制转æ¢è­¦å‘Šï¼Œè¯·ä½¿ç”¨åˆ—表而ä¸æ˜¯æ•°ç»„。 下é¢æ˜¯å¦ä¸€ä¸ªç‰ˆæœ¬çš„ `Chooser` 类,编译时没有错误或警告: + +```Java +// List-based Chooser - typesafe +public class Chooser { + private final List choiceList; + + + public Chooser(Collection choices) { + choiceList = new ArrayList<>(choices); + } + + + public T choose() { + Random rnd = ThreadLocalRandom.current(); + return choiceList.get(rnd.nextInt(choiceList.size())); + } +} +``` + +  这个版本有些冗长,也许è¿è¡Œæ¯”较慢,但是值得一æ的是,在è¿è¡Œæ—¶ä¸ä¼šå¾—到 `ClassCastException` 异常。 + +  总之,数组和泛型具有éžå¸¸ä¸åŒçš„类型规则。 数组是åå˜å’Œå…·ä½“化的; 泛型是ä¸å˜çš„,类型擦除的。 因此,数组æä¾›è¿è¡Œæ—¶ç±»åž‹çš„安全性,但ä¸æ供编译时类型的安全性,å之亦然。 一般æ¥è¯´ï¼Œæ•°ç»„和泛型ä¸èƒ½å¾ˆå¥½åœ°æ··åˆå·¥ä½œã€‚ 如果你å‘现把它们混åˆåœ¨ä¸€èµ·ï¼Œå¾—到编译时错误或者警告,你的第一个冲动应该是用列表æ¥æ›¿æ¢æ•°ç»„。 \ No newline at end of file diff --git a/docs/notes/29. 优先考虑泛型.md b/docs/notes/29. 优先考虑泛型.md new file mode 100644 index 0000000..00cac6d --- /dev/null +++ b/docs/notes/29. 优先考虑泛型.md @@ -0,0 +1,173 @@ +# 29. 优先考虑泛型 + +  å‚数化声明并使用 JDK æ供的泛型类型和方法通常ä¸ä¼šå¤ªå›°éš¾ã€‚ 但编写自己的泛型类型有点困难,但值得努力学习。 + +  考虑æ¡ç›® 7 中的简å•å †æ ˆå®žçŽ°ï¼š + +```Java +// Object-based collection - a prime candidate for generics +public class Stack { + private Object[] elements; + private int size = 0; + private static final int DEFAULT_INITIAL_CAPACITY = 16; + + public Stack() { + elements = new Object[DEFAULT_INITIAL_CAPACITY]; + } + + public void push(Object e) { + ensureCapacity(); + elements[size++] = e; + } + + public Object pop() { + if (size == 0) + throw new EmptyStackException(); + Object result = elements[--size]; + elements[size] = null; // Eliminate obsolete reference + return result; + } + + public boolean isEmpty() { + return size == 0; + } + + private void ensureCapacity() { + if (elements.length == size) + elements = Arrays.copyOf(elements, 2 * size + 1); + } +} +``` + +  这个类应该已ç»è¢«å‚数化了,但是由于事实并éžå¦‚此,我们å¯ä»¥å¯¹å®ƒè¿›è¡Œæ³›åž‹åŒ–。 æ¢å¥è¯è¯´ï¼Œæˆ‘们å¯ä»¥å‚数化它,而ä¸ä¼šæŸå®³åŽŸå§‹éžå‚数化版本的客户端。 就目å‰è€Œè¨€ï¼Œå®¢æˆ·ç«¯å¿…须强制转æ¢ä»Žå †æ ˆä¸­å¼¹å‡ºçš„对象,而这些强制转æ¢å¯èƒ½ä¼šåœ¨è¿è¡Œæ—¶å¤±è´¥ã€‚ 泛型化类的第一步是在其声明中添加一个或多个类型å‚数。 在这ç§æƒ…况下,有一个类型å‚数,表示堆栈的元素类型,这个类型å‚数的常规å称是 E(æ¡ç›® 68)。 + +  下一步是用相应的类型å‚数替æ¢æ‰€æœ‰ä½¿ç”¨çš„ `Object` 类型,然åŽå°è¯•ç¼–译生æˆçš„程åºï¼š + +```Java +// Initial attempt to generify Stack - won't compile! +public class Stack { + private E[] elements; + private int size = 0; + private static final int DEFAULT_INITIAL_CAPACITY = 16; + + public Stack() { + elements = new E[DEFAULT_INITIAL_CAPACITY]; + } + + public void push(E e) { + ensureCapacity(); + elements[size++] = e; + } + + public E pop() { + if (size == 0) + throw new EmptyStackException(); + E result = elements[--size]; + elements[size] = null; // Eliminate obsolete reference + return result; + } + ... // no changes in isEmpty or ensureCapacity +} +``` + +  你通常会得到至少一个错误或警告,这个类也ä¸ä¾‹å¤–。 幸è¿çš„是,这个类åªäº§ç”Ÿä¸€ä¸ªé”™è¯¯ï¼š + +```Java +Stack.java:8: generic array creation + elements = new E[DEFAULT_INITIAL_CAPACITY]; + ^ +``` + +  如æ¡ç›® 28 所述,你ä¸èƒ½åˆ›å»ºä¸€ä¸ªä¸å¯å…·ä½“化类型的数组,例如类型 `E`。æ¯å½“编写一个由数组支æŒçš„泛型时,就会出现此问题。 有两ç§åˆç†çš„方法æ¥è§£å†³å®ƒã€‚ 第一ç§è§£å†³æ–¹æ¡ˆç›´æŽ¥è§„é¿äº†å¯¹æ³›åž‹æ•°ç»„创建的ç¦ç”¨ï¼šåˆ›å»ºä¸€ä¸ª `Object` 数组并将其转æ¢ä¸ºæ³›åž‹æ•°ç»„类型。 现在没有了错误,编译器会å‘出警告。 è¿™ç§ç”¨æ³•æ˜¯åˆæ³•çš„,但ä¸æ˜¯ï¼ˆä¸€èˆ¬ï¼‰ç±»åž‹å®‰å…¨çš„: + + +```Java +Stack.java:8: warning: [unchecked] unchecked cast +found: Object[], required: E[] + elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]; + ^ +``` + +  编译器å¯èƒ½æ— æ³•è¯æ˜Žä½ çš„程åºæ˜¯ç±»åž‹å®‰å…¨çš„,但你å¯ä»¥ã€‚ 你必须说æœè‡ªå·±ï¼Œä¸åŠ é™åˆ¶çš„类型强制转æ¢ä¸ä¼šæŸå®³ç¨‹åºçš„类型安全。 有问题的数组(元素)ä¿å­˜åœ¨ä¸€ä¸ªç§æœ‰å±žæ€§ä¸­ï¼Œæ°¸è¿œä¸ä¼šè¿”回给客户端或传递给任何其他方法。 ä¿å­˜åœ¨æ•°ç»„中的唯一元素是那些传递给 `push` 方法的元素,它们是 `E` 类型的,所以未ç»æ£€æŸ¥çš„强制转æ¢ä¸ä¼šé€ æˆä»»ä½•ä¼¤å®³ã€‚ + +  一旦è¯æ˜Žæœªç»æ£€æŸ¥çš„强制转æ¢æ˜¯å®‰å…¨çš„,请尽å¯èƒ½ç¼©å°èŒƒå›´ï¼ˆæ¡ç›® 27)。 在这ç§æƒ…况下,构造方法åªåŒ…å«æœªç»æ£€æŸ¥çš„数组创建,所以在整个构造方法中抑制警告是åˆé€‚的。 通过添加一个注解æ¥æ‰§è¡Œæ­¤æ“作,`Stack` å¯ä»¥å¹²å‡€åœ°ç¼–译,并且å¯ä»¥åœ¨æ²¡æœ‰æ˜¾å¼å¼ºåˆ¶è½¬æ¢æˆ–担心 `ClassCastException` 异常的情况下使用它: + +```Java +// The elements array will contain only E instances from push(E). +// This is sufficient to ensure type safety, but the runtime +// type of the array won't be E[]; it will always be Object[]! +@SuppressWarnings("unchecked") +public Stack() { + elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]; +} +``` + +  消除 `Stack` 中的泛型数组创建错误的第二ç§æ–¹æ³•æ˜¯å°†å±žæ€§å…ƒç´ çš„类型从 `E[]` 更改为 `Object[]`。 如果这样åšï¼Œä¼šå¾—到一个ä¸åŒçš„错误: + +```Java +Stack.java:19: incompatible types +found: Object, required: E + E result = elements[--size]; + ^ +``` + +  å¯ä»¥é€šè¿‡å°†ä»Žæ•°ç»„中检索到的元素转æ¢ä¸º `E` æ¥å°†æ­¤é”™è¯¯æ›´æ”¹ä¸ºè­¦å‘Šï¼š + +```Java +Stack.java:19: warning: [unchecked] unchecked cast +found: Object, required: E + E result = (E) elements[--size]; + ^ +``` + +  因为 `E` 是ä¸å¯å…·ä½“化的类型,编译器无法在è¿è¡Œæ—¶æ£€æŸ¥å¼ºåˆ¶è½¬æ¢ã€‚ å†ä¸€æ¬¡ï¼Œä½ å¯ä»¥å¾ˆå®¹æ˜“地å‘自己è¯æ˜Žï¼Œä¸åŠ é™åˆ¶çš„转æ¢æ˜¯å®‰å…¨çš„,所以å¯ä»¥é€‚当地抑制警告。 æ ¹æ®æ¡ç›® 27 的建议,我们åªåœ¨åŒ…å«æœªç»æ£€æŸ¥çš„强制转æ¢çš„分é…上抑制警告,而ä¸æ˜¯åœ¨æ•´ä¸ª `pop` 方法上: + +```Java +// Appropriate suppression of unchecked warning +public E pop() { + if (size == 0) + throw new EmptyStackException(); + + // push requires elements to be of type E, so cast is correct + @SuppressWarnings("unchecked") E result = + (E) elements[--size]; + + elements[size] = null; // Eliminate obsolete reference + return result; +} +``` + +  两ç§æ¶ˆé™¤æ³›åž‹æ•°ç»„创建的技术都有其追éšè€…。 第一个更å¯è¯»ï¼šæ•°ç»„被声明为 `E[]` 类型,清楚地表明它åªåŒ…å« `E` 实例。 它也更简æ´ï¼šåœ¨ä¸€ä¸ªå…¸åž‹çš„泛型类中,你从代ç ä¸­çš„许多点读å–数组; 第一ç§æŠ€æœ¯åªéœ€è¦ä¸€æ¬¡è½¬æ¢ï¼ˆåˆ›å»ºæ•°ç»„的地方),而第二ç§æŠ€æœ¯æ¯æ¬¡è¯»å–数组元素都需è¦å•ç‹¬è½¬æ¢ã€‚ 因此,第一ç§æŠ€æœ¯æ˜¯ä¼˜é€‰çš„并且在实践中更常用。 但是,它确实会造æˆå †æ±¡æŸ“(heap pollution)(æ¡ç›® 32):数组的è¿è¡Œæ—¶ç±»åž‹ä¸Žç¼–译时类型ä¸åŒ¹é…ï¼ˆé™¤éž `E` 碰巧是 `Object`)。 这使得一些程åºå‘˜éžå¸¸ä¸å®‰ï¼Œä»–们选择了第二ç§æŠ€æœ¯ï¼Œå°½ç®¡åœ¨è¿™ç§æƒ…况下堆的污染是无害的。 + +  下é¢çš„程åºæ¼”示了泛型 `Stack` 类的使用。 该程åºä»¥ç›¸å的顺åºæ‰“å°å…¶å‘½ä»¤è¡Œå‚数,并将其转æ¢ä¸ºå¤§å†™ã€‚ 对从堆栈弹出的元素调用 `String` çš„ `toUpperCase` 方法ä¸éœ€è¦æ˜¾å¼å¼ºåˆ¶è½¬æ¢ï¼Œè€Œè‡ªåŠ¨ç”Ÿæˆçš„强制转æ¢å°†ä¿è¯æˆåŠŸï¼š + + +```Java +// Little program to exercise our generic Stack +public static void main(String[] args) { + Stack stack = new Stack<>(); + for (String arg : args) + stack.push(arg); + while (!stack.isEmpty()) + System.out.println(stack.pop().toUpperCase()); +} +``` + +  上é¢çš„例å­ä¼¼ä¹Žä¸Žæ¡ç›® 28 相矛盾,æ¡ç›® 28 中鼓励使用列表优先于数组。 在泛型类型中使用列表并ä¸æ€»æ˜¯å¯è¡Œæˆ–å¯å–的。 Java 本身生æ¥å¹¶ä¸æ”¯æŒåˆ—表,所以一些泛型类型(如 `ArrayList`)必须在数组上实现。 其他的泛型类型,比如 `HashMap`,是为了æ高性能而实现的。 + +  ç»å¤§å¤šæ•°æ³›åž‹ç±»åž‹å°±åƒæˆ‘们的 `Stack` 示例一样,它们的类型å‚数没有é™åˆ¶ï¼šå¯ä»¥åˆ›å»ºä¸€ä¸ª `Stack,Stack`,`Stack>` 或者其他任何对象的 `Stack` 引用类型。 请注æ„,ä¸èƒ½åˆ›å»ºåŸºæœ¬ç±»åž‹çš„堆栈:å°è¯•åˆ›å»º `Stack` 或 `Stack` 将导致编译时错误。 这是 Java 泛型类型系统的一个基本é™åˆ¶ã€‚ å¯ä»¥ä½¿ç”¨åŸºæœ¬ç±»åž‹çš„包装类(æ¡ç›® 61)æ¥è§£å†³è¿™ä¸ªé™åˆ¶ã€‚ + +  有一些泛型类型é™åˆ¶äº†å®ƒä»¬ç±»åž‹å‚æ•°çš„å…许值。 例如,考虑 `java.util.concurrent.DelayQueue`,它的声明如下所示: + +```Java +class DelayQueue implements BlockingQueue +``` + +  类型å‚数列表(``)è¦æ±‚实际的类型å‚æ•° `E` 是 `java.util.concurrent.Delayed` çš„å­ç±»åž‹ã€‚ 这使得 DelayQueue 实现åŠå…¶å®¢æˆ·ç«¯å¯ä»¥åˆ©ç”¨ `DelayQueue` 元素上的 `Delayed` 方法,而ä¸éœ€è¦æ˜¾å¼çš„转æ¢æˆ– `ClassCastException` 异常的风险。 类型å‚æ•° `E` 被称为é™å®šç±»åž‹å‚数。 请注æ„,å­ç±»åž‹å…³ç³»è¢«å®šä¹‰ä¸ºæ¯ä¸ªç±»åž‹éƒ½æ˜¯è‡ªå·±çš„å­ç±»åž‹[JLS,4.10],因此创建 `DelayQueue` 是åˆæ³•çš„。 + +  总之,泛型类型比需è¦åœ¨å®¢æˆ·ç«¯ä»£ç ä¸­å¼ºåˆ¶è½¬æ¢çš„类型更安全,更易于使用。 当你设计新的类型时,确ä¿å®ƒä»¬å¯ä»¥åœ¨æ²¡æœ‰è¿™ç§å¼ºåˆ¶è½¬æ¢çš„情况下使用。 这通常æ„味ç€ä½¿ç±»åž‹æ³›åž‹åŒ–。 如果你有任何现有的类型,应该是泛型的但实际上å´ä¸æ˜¯ï¼Œé‚£ä¹ˆæŠŠå®ƒä»¬æ³›åž‹åŒ–。 这使这些类型的新用户的使用更容易,而ä¸ä¼šç ´å现有的客户端(æ¡ç›® 26)。 + + + + + diff --git a/docs/notes/30. 优先使用泛型方法.md b/docs/notes/30. 优先使用泛型方法.md new file mode 100644 index 0000000..77bc597 --- /dev/null +++ b/docs/notes/30. 优先使用泛型方法.md @@ -0,0 +1,143 @@ +# 30. 优先使用泛型方法 + +  正如类å¯ä»¥æ˜¯æ³›åž‹çš„,方法也å¯ä»¥æ˜¯æ³›åž‹çš„。 对å‚数化类型进行æ“作的é™æ€å·¥å…·æ–¹æ³•é€šå¸¸éƒ½æ˜¯æ³›åž‹çš„。 集åˆä¸­çš„所有“算法â€æ–¹æ³•ï¼ˆå¦‚ `binarySearch` å’Œ `sort`)都是泛型的。 + +  编写泛型方法类似于编写泛型类型。 考虑这个方法,它返回两个集åˆçš„并集: + +```Java +// Uses raw types - unacceptable! [Item 26] + +public static Set union(Set s1, Set s2) { + + Set result = new HashSet(s1); + + result.addAll(s2); + + return result; +} +``` + +  此方法å¯ä»¥ç¼–译但有两个警告: + +```Java +Union.java:5: warning: [unchecked] unchecked call to +HashSet(Collection) as a member of raw type HashSet + Set result = new HashSet(s1); + ^ +Union.java:6: warning: [unchecked] unchecked call to +addAll(Collection) as a member of raw type Set + result.addAll(s2); + ^ +``` + +  è¦ä¿®å¤è¿™äº›è­¦å‘Šå¹¶ä½¿æ–¹æ³•ç±»åž‹å®‰å…¨ï¼Œè¯·ä¿®æ”¹å…¶å£°æ˜Žä»¥å£°æ˜Žè¡¨ç¤ºä¸‰ä¸ªé›†åˆï¼ˆä¸¤ä¸ªå‚数和返回值)的元素类型的类型å‚数,并在整个方法中使用此类型å‚数。 声明类型å‚数的类型å‚数列表ä½äºŽæ–¹æ³•çš„修饰符和返回类型之间。 在这个例å­ä¸­ï¼Œç±»åž‹å‚数列表是 ``,返回类型是 `Set`。 类型å‚数的命å约定对于泛型方法和泛型类型是相åŒçš„(æ¡ç›® 29 å’Œ 68): + +```Java +// Generic method +public static Set union(Set s1, Set s2) { + Set result = new HashSet<>(s1); + result.addAll(s2); + return result; + +} +``` + +  至少对于简å•çš„泛型方法æ¥è¯´ï¼Œå°±æ˜¯è¿™æ ·ã€‚ 此方法编译时ä¸ä¼šç”Ÿæˆä»»ä½•è­¦å‘Šï¼Œå¹¶æ供类型安全性和易用性。 这是一个简å•çš„程åºæ¥è¿è¡Œè¯¥æ–¹æ³•ã€‚ 这个程åºä¸åŒ…å«å¼ºåˆ¶è½¬æ¢å’Œç¼–译时没有错误或警告:至少对于简å•çš„泛型方法æ¥è¯´ï¼Œå°±æ˜¯è¿™æ ·ã€‚ 此方法编译时ä¸ä¼šç”Ÿæˆä»»ä½•è­¦å‘Šï¼Œå¹¶æ供类型安全性和易用性。 这是一个简å•çš„程åºæ¥è¿è¡Œè¯¥æ–¹æ³•ã€‚ 这个程åºä¸åŒ…å«å¼ºåˆ¶è½¬æ¢å’Œç¼–译时没有错误或警告: + +```Java +// Simple program to exercise generic method +public static void main(String[] args) { + Set guys = Set.of("Tom", "Dick", "Harry"); + Set stooges = Set.of("Larry", "Moe", "Curly"); + Set aflCio = union(guys, stooges); + System.out.println(aflCio); +} +``` + +  当è¿è¡Œè¿™ä¸ªç¨‹åºæ—¶ï¼Œå®ƒä¼šæ‰“å°`[Moe, Tom, Harry, Larry, Curly, Dick]`(输出中元素的顺åºä¾èµ–于具体实现。) + +  `union` 方法的一个é™åˆ¶æ˜¯æ‰€æœ‰ä¸‰ä¸ªé›†åˆï¼ˆè¾“å…¥å‚数和返回值)的类型必须完全相åŒã€‚ 通过使用é™å®šé€šé…符类型( bounded wildcard types)(æ¡ç›® 31),å¯ä»¥ä½¿è¯¥æ–¹æ³•æ›´åŠ çµæ´»ã€‚ + +  有时,需è¦åˆ›å»ºä¸€ä¸ªä¸å¯æ”¹å˜ä½†é€‚用于许多ä¸åŒç±»åž‹çš„对象。 因为泛型是通过擦除æ¥å®žçŽ°çš„(æ¡ç›® 28),所以å¯ä»¥ä½¿ç”¨å•ä¸ªå¯¹è±¡è¿›è¡Œæ‰€æœ‰å¿…需的类型å‚数化,但是需è¦ç¼–写一个é™æ€å·¥åŽ‚方法æ¥é‡å¤åœ°ä¸ºæ¯ä¸ªè¯·æ±‚的类型å‚数化分é…对象。 è¿™ç§ç§°ä¸ºæ³›åž‹å•ä¾‹å·¥åŽ‚(generic singleton factory)的模å¼ç”¨äºŽæ–¹æ³•å¯¹è±¡ï¼ˆ function objects)(æ¡ç›® 42),比如 `Collections.reverseOrder` 方法,å¶å°”也用于 `Collections.emptySet` 之类的集åˆã€‚ + +  å‡è®¾ä½ æƒ³å†™ä¸€ä¸ªæ’等方法分é…器( identity function dispenser)。 类库æ供了 `Function.identity` 方法,所以没有ç†ç”±ç¼–写你自己的实现(æ¡ç›® 59),但它是有å¯å‘性的。 如果æ¯æ¬¡è¦æ±‚的时候都去创建一个新的æ’等方法对象是浪费的,因为它是无状æ€çš„。 如果 Java 的泛型被具体化,那么æ¯ä¸ªç±»åž‹éƒ½éœ€è¦ä¸€ä¸ªæ’等方法,但是由于它们被擦除以åŽï¼Œæ‰€ä»¥æ³›åž‹çš„å•ä¾‹å°±è¶³å¤Ÿäº†ã€‚ 以下是它的实例: + +```Java +// Generic singleton factory pattern +private static UnaryOperator IDENTITY_FN = (t) -> t; + +@SuppressWarnings("unchecked") +public static UnaryOperator identityFunction() { + return (UnaryOperator) IDENTITY_FN; +} +``` + +  将 `IDENTITY_FN` 转æ¢ä¸º (`UnaryFunction`) 会生æˆä¸€ä¸ªæœªç»æ£€æŸ¥çš„强制转æ¢è­¦å‘Šï¼Œå› ä¸º `UnaryOperator` 对于æ¯ä¸ª `T` 都ä¸æ˜¯ä¸€ä¸ª `UnaryOperator`。但是æ’等方法是特殊的:它返回未修改的å‚数,所以我们知é“,使用它作为一个 `UnaryFunction` 是类型安全的,无论 `T` 的值是多少。因此,我们å¯ä»¥æ”¾å¿ƒåœ°æŠ‘制由这个强制生æˆçš„未ç»æ£€æŸ¥çš„强制转æ¢è­¦å‘Šã€‚ 一旦我们完æˆäº†è¿™äº›ï¼Œä»£ç ç¼–译没有错误或警告。 + +  下é¢æ˜¯ä¸€ä¸ªç¤ºä¾‹ç¨‹åºï¼Œå®ƒä½¿ç”¨æˆ‘们的泛型å•ä¾‹ä½œä¸º `UnaryOperator` å’Œ `UnaryOperator`。 åƒå¾€å¸¸ä¸€æ ·ï¼Œå®ƒä¸åŒ…å«å¼ºåˆ¶è½¬åŒ–,编译时也没有错误和警告: + +```Java +// Sample program to exercise generic singleton +public static void main(String[] args) { + String[] strings = { "jute", "hemp", "nylon" }; + UnaryOperator sameString = identityFunction(); + + for (String s : strings) + System.out.println(sameString.apply(s)); + + Number[] numbers = { 1, 2.0, 3L }; + + UnaryOperator sameNumber = identityFunction(); + + for (Number n : numbers) + System.out.println(sameNumber.apply(n)); +} +``` + +  虽然相对较少,类型å‚æ•°å—涉åŠè¯¥ç±»åž‹å‚数本身的æŸç§è¡¨è¾¾å¼é™åˆ¶æ˜¯å…许的。 这就是所谓的递归类型é™åˆ¶ï¼ˆrecursive type bound)。 递归类型é™åˆ¶çš„常è§ç”¨æ³•ä¸Ž `Comparable` 接å£æœ‰å…³ï¼Œå®ƒå®šä¹‰äº†ä¸€ä¸ªç±»åž‹çš„自然顺åºï¼ˆæ¡ç›® 14)。 这个接å£å¦‚下所示: + +```Java +public interface Comparable { + int compareTo(T o); +} +``` + +  类型å‚æ•° T 定义了实现 `Comparable` 的类型的元素å¯ä»¥æ¯”较的类型。 在实际中,几乎所有类型都åªèƒ½ä¸Žè‡ªå·±ç±»åž‹çš„元素进行比较。 所以,例如,`String` 类实现了 `Comparable`,`Integer` 类实现了 `Comparable` 等等。 + +  许多方法采用实现 `Comparable` 的元素的集åˆæ¥å¯¹å…¶è¿›è¡ŒæŽ’åºï¼Œåœ¨å…¶ä¸­è¿›è¡Œæœç´¢ï¼Œè®¡ç®—其最å°å€¼æˆ–最大值等。 è¦åšåˆ°è¿™ä¸€ç‚¹ï¼Œè¦æ±‚集åˆä¸­çš„æ¯ä¸€ä¸ªå…ƒç´ éƒ½å¯ä»¥ä¸Žå…¶ä¸­çš„æ¯ä¸€ä¸ªå…ƒç´ ç›¸æ¯”,æ¢è¨€ä¹‹ï¼Œè¿™ä¸ªå…ƒç´ æ˜¯å¯ä»¥ç›¸äº’比较的。 以下是如何表达这一约æŸï¼š + +```Java +// Using a recursive type bound to express mutual comparability +public static > E max(Collection c); +``` + +  é™å®šçš„类型 `>` å¯ä»¥ç†è§£ä¸ºâ€œä»»ä½•å¯ä»¥ä¸Žè‡ªå·±æ¯”较的类型 Eâ€ï¼Œè¿™æˆ–多或少精确地对应于相互å¯æ¯”性的概念。 + +  这里有一个与å‰é¢çš„声明相匹é…的方法。它根æ®å…¶å…ƒç´ çš„自然顺åºæ¥è®¡ç®—集åˆä¸­çš„最大值,并编译没有错误或警告: + +```Java +// Returns max value in a collection - uses recursive type bound +public static > E max(Collection c) { + + if (c.isEmpty()) + throw new IllegalArgumentException("Empty collection"); + + E result = null; + + for (E e : c) + if (result == null || [e.compareTo(result](http://e.compareTo(result)) > 0) + result = Objects.requireNonNull(e); + + return result; + +} +``` + +  请注æ„ï¼Œå¦‚æžœåˆ—è¡¨ä¸ºç©ºï¼Œåˆ™æ­¤æ–¹æ³•å°†å¼•å‘ `IllegalArgumentException` 异常。 更好的选择是返回一个 `Optional`(æ¡ç›® 55)。 + +  递归类型é™åˆ¶å¯èƒ½å˜å¾—å¤æ‚得多,但幸è¿çš„是他们很少这样åšã€‚ 如果你ç†è§£äº†è¿™ä¸ªä¹ æƒ¯ç”¨æ³•ï¼Œå®ƒçš„通é…符å˜ä½“(æ¡ç›® 31)和模拟的自我类型用法(æ¡ç›® 2),你将能够处ç†åœ¨å®žè·µä¸­é‡åˆ°çš„大多数递归类型é™åˆ¶ã€‚ + +  总之,åƒæ³›åž‹ç±»åž‹ä¸€æ ·ï¼Œæ³›åž‹æ–¹æ³•æ¯”需è¦å®¢æˆ·ç«¯å¯¹è¾“å…¥å‚数和返回值进行显å¼å¼ºåˆ¶è½¬æ¢çš„方法更安全,更易于使用。 åƒç±»åž‹ä¸€æ ·ï¼Œä½ åº”该确ä¿ä½ çš„方法å¯ä»¥ä¸ç”¨å¼ºåˆ¶è½¬æ¢ï¼Œè¿™é€šå¸¸æ„味ç€å®ƒä»¬æ˜¯æ³›åž‹çš„。 应该泛型化现有的方法,其使用需è¦å¼ºåˆ¶è½¬æ¢ã€‚ 这使得新用户的使用更容易,而ä¸ä¼šç ´å现有的客户端(æ¡ç›® 26)。 + + + diff --git a/docs/notes/31. 使用é™å®šé€šé…符æ¥å¢žåŠ APIçš„çµæ´»æ€§.md b/docs/notes/31. 使用é™å®šé€šé…符æ¥å¢žåŠ APIçš„çµæ´»æ€§.md new file mode 100644 index 0000000..7978098 --- /dev/null +++ b/docs/notes/31. 使用é™å®šé€šé…符æ¥å¢žåŠ APIçš„çµæ´»æ€§.md @@ -0,0 +1,221 @@ +# 31. 使用é™å®šé€šé…符æ¥å¢žåŠ  API çš„çµæ´»æ€§ + +  如æ¡ç›® 28 所述,å‚数化类型是ä¸å˜çš„。æ¢å¥è¯è¯´ï¼Œå¯¹äºŽä»»ä½•ä¸¤ä¸ªä¸åŒç±»åž‹çš„ `Type1` å’Œ `Type`,`List` æ—¢ä¸æ˜¯ `List` å­ç±»åž‹ä¹Ÿä¸æ˜¯å…¶çˆ¶ç±»åž‹ã€‚尽管 `List` ä¸æ˜¯ `List` çš„å­ç±»åž‹æ˜¯è¿å直觉的,但它确实是有é“ç†çš„。 å¯ä»¥å°†ä»»ä½•å¯¹è±¡æ”¾å…¥ `List` 中,但是åªèƒ½å°†å­—符串放入 `List` 中。 由于 `List` ä¸èƒ½åš `List` 所能åšçš„所有事情,所以它ä¸æ˜¯ä¸€ä¸ªå­ç±»åž‹ï¼ˆæ¡ç›® 10 中的里æ°æ›¿ä»£åŽŸåˆ™ï¼‰ã€‚ + +  相对于æ供的ä¸å¯å˜çš„类型,有时你需è¦æ¯”此更多的çµæ´»æ€§ã€‚ 考虑æ¡ç›® 29 中的 `Stack` 类。下é¢æ˜¯å®ƒçš„公共 API: + +```Java +public class Stack { + + public Stack(); + + public void push(E e); + + public E pop(); + + public boolean isEmpty(); + +} +``` + +  å‡è®¾æˆ‘们想è¦æ·»åŠ ä¸€ä¸ªæ–¹æ³•æ¥èŽ·å–一系列元素,并将它们全部推é€åˆ°æ ˆä¸Šã€‚ 以下是第一ç§å°è¯•ï¼š + +```Java +// pushAll method without wildcard type - deficient! +public void pushAll(Iterable src) { + for (E e : src) + push(e); +} +``` + +  这ç§æ–¹æ³•å¯ä»¥å¹²å‡€åœ°ç¼–译,但ä¸å®Œå…¨ä»¤äººæ»¡æ„。 如果å¯é历的 `src` 元素类型与栈的元素类型完全匹é…,那么它工作正常。 但是,å‡è®¾æœ‰ä¸€ä¸ª `Stack`,并调用 `push(intVal)`,其中 `intVal` 的类型是 `Integer`。 这是因为 `Integer` 是 `Number` çš„å­ç±»åž‹ã€‚ 从逻辑上看,这似乎也应该起作用: + + +```Java +Stack numberStack = new Stack<>(); +Iterable integers = ... ; +numberStack.pushAll(integers); +``` + +  但是,如果你å°è¯•äº†ï¼Œä¼šå¾—到这个错误消æ¯ï¼Œå› ä¸ºå‚数化类型是ä¸å˜çš„: + +```Java +StackTest.java:7: error: incompatible types: Iterable +cannot be converted to Iterable + numberStack.pushAll(integers); + ^ +``` + +  幸è¿çš„是,有对应的解决方法。 该语言æ供了一ç§ç‰¹æ®Šçš„å‚数化类型æ¥è°ƒç”¨ä¸€ä¸ªé™å®šé€šé…符类型æ¥å¤„ç†è¿™ç§æƒ…况。 `pushAll` 的输入å‚数的类型ä¸åº”该是“`E` çš„ `Iterable` 接å£â€ï¼Œè€Œåº”该是“`E` çš„æŸä¸ªå­ç±»åž‹çš„ `Iterable` 接å£â€ï¼Œå¹¶ä¸”有一个通é…符类型,这æ„味ç€ï¼š`Iterable`。 (关键字 `extends` 的使用有点误导:回忆æ¡ç›® 29 中,å­ç±»åž‹è¢«å®šä¹‰ä¸ºæ¯ä¸ªç±»åž‹éƒ½æ˜¯å®ƒè‡ªå·±çš„å­ç±»åž‹ï¼Œå³ä½¿å®ƒæœ¬èº«æ²¡æœ‰ç»§æ‰¿ã€‚)让我们修改 `pushAll` æ¥ä½¿ç”¨è¿™ä¸ªç±»åž‹ï¼š + +```Java +// Wildcard type for a parameter that serves as an E producer +public void pushAll(Iterable src) { + for (E e : src) + push(e); +} +``` + +  有了这个改å˜ï¼Œ`Stack` ç±»ä¸ä»…å¯ä»¥å¹²å‡€åœ°ç¼–译,而且客户端代ç ä¹Ÿä¸ä¼šç”¨åŽŸå§‹çš„ pushAll 声明编译。 因为 `Stack` 和它的客户端干净地编译,你知é“一切都是类型安全的。 + +  现在å‡è®¾ä½ æƒ³å†™ä¸€ä¸ª `popAll` 方法,与 `pushAll` 方法相对应。 `popAll` 方法从栈中弹出æ¯ä¸ªå…ƒç´ å¹¶å°†å…ƒç´ æ·»åŠ åˆ°ç»™å®šçš„集åˆä¸­ã€‚ 以下是第一次å°è¯•ç¼–写 `popAll` 方法的过程: + +```Java +// popAll method without wildcard type - deficient! +public void popAll(Collection dst) { + while (!isEmpty()) + dst.add(pop()); +} +``` + +  åŒæ ·ï¼Œå¦‚果目标集åˆçš„元素类型与栈的元素类型完全匹é…,则干净编译并且工作正常。 但是,这åˆä¸å®Œå…¨ä»¤äººæ»¡æ„。 å‡è®¾ä½ æœ‰ä¸€ä¸ª `Stac` å’Œ `Object` 类型的å˜é‡ã€‚ 如果从栈中弹出一个元素并将其存储在该å˜é‡ä¸­ï¼Œå®ƒå°†ç¼–译并è¿è¡Œè€Œä¸ä¼šå‡ºé”™ã€‚ 所以你也ä¸èƒ½è¿™æ ·åšå—? + +```Java +Stack numberStack = new Stack(); + +Collection objects = ... ; + +numberStack.popAll(objects); +``` + +  如果å°è¯•å°†æ­¤å®¢æˆ·ç«¯ä»£ç ä¸Žä¹‹å‰æ˜¾ç¤ºçš„ `popAll` 版本进行编译,则会得到与我们的第一版 `pushAll` éžå¸¸ç±»ä¼¼çš„错误:`Collection` ä¸æ˜¯ `Collection` çš„å­ç±»åž‹ã€‚ 通é…符类型å†ä¸€æ¬¡æ供了一æ¡å‡ºè·¯ã€‚ `popAll` 的输入å‚数的类型ä¸åº”该是“E 的集åˆâ€ï¼Œè€Œåº”该是“E çš„æŸä¸ªçˆ¶ç±»åž‹çš„集åˆâ€ï¼ˆå…¶ä¸­çˆ¶ç±»åž‹è¢«å®šä¹‰ä¸º `E` 是它自己的父类型[JLS,4.10])。 å†æ¬¡ï¼Œæœ‰ä¸€ä¸ªé€šé…符类型,正是这个æ„æ€ï¼š`Collection`。 让我们修改 `popAll` æ¥ä½¿ç”¨å®ƒï¼š + +```Java +// Wildcard type for parameter that serves as an E consumer +public void popAll(Collection dst) { + while (!isEmpty()) + dst.add(pop()); +} +``` + +  通过这个改动,`Stack` 类和客户端代ç éƒ½å¯ä»¥å¹²å‡€åœ°ç¼–译。 +   +  这个结论很清楚。 **为了获得最大的çµæ´»æ€§ï¼Œå¯¹ä»£è¡¨ç”Ÿäº§è€…或消费者的输入å‚数使用通é…符类型。** 如果一个输入å‚数既是一个生产者åˆæ˜¯ä¸€ä¸ªæ¶ˆè´¹è€…,那么通é…符类型对你没有好处:你需è¦ä¸€ä¸ªç²¾ç¡®çš„类型匹é…,这就是没有任何通é…符的情况。 + +  这里有一个助记符æ¥å¸®åŠ©ä½ è®°ä½ä½¿ç”¨å“ªç§é€šé…符类型: **PECS 代表: producer-extends,consumer-super。** + +  æ¢å¥è¯è¯´ï¼Œå¦‚果一个å‚数化类型代表一个 `T` 生产者,使用 ``;如果它代表 `T` 消费者,则使用 ``。 在我们的 `Stack` 示例中,`pushAll` 方法的 `src` å‚数生æˆæ ˆä½¿ç”¨çš„ `E` 实例,因此 `src` çš„åˆé€‚类型为 `Iterable`ï¼›`popAll` 方法的 `dst` å‚数消费 `Stack` 中的 `E` 实例,因此 `dst` çš„åˆé€‚类型是 C`ollection `。 PECS 助记符抓ä½äº†ä½¿ç”¨é€šé…符类型的基本原则。 Naftalin å’Œ Wadler 称之为获å–和放置原则( Get and Put Principle )[Naftalin07,2.4]。 + +  记ä½è¿™ä¸ªåŠ©è®°ç¬¦ä¹‹åŽï¼Œè®©æˆ‘们æ¥çœ‹çœ‹æœ¬ç« ä¸­ä»¥å‰é¡¹ç›®çš„一些方法和构造方法声明。 æ¡ç›® 28 中的 `Chooser` 类构造方法有这样的声明: + +```Java +public Chooser(Collection choices) +``` + +  这个构造方法åªä½¿ç”¨é›†åˆé€‰æ‹©æ¥ç”Ÿäº§ç±»åž‹ T 的值(并将它们存储起æ¥ä»¥å¤‡åŽç”¨ï¼‰ï¼Œæ‰€ä»¥å®ƒçš„声明应该使用一个 extends T 的通é…符类型。下é¢æ˜¯å¾—到的构造方法声明: + +```Java +// Wildcard type for parameter that serves as an T producer + +public Chooser(Collection choices) +``` + +  这ç§æ”¹å˜åœ¨å®žè·µä¸­ä¼šæœ‰ä»€ä¹ˆä¸åŒå—? 是的,会有ä¸åŒã€‚ å‡ä½ æœ‰ä¸€ä¸ª `List`,并且想把它传递给 `Chooser` 的构造方法。 è¿™ä¸ä¼šä¸ŽåŽŸå§‹å£°æ˜Žä¸€èµ·ç¼–译,但是它åªä¼šå°†é™å®šé€šé…符类型添加到声明中。 + +  现在看看æ¡ç›® 30 中的 `union` 方法。下是声明: + +```Java +public static Set union(Set s1, Set s2) +``` + +  两个å‚æ•° s1 å’Œ s2 都是 `E` 的生产者,所以 PECS 助记符告诉我们该声明应该如下: + +```Java +public static Set union(Set s1, Set s2) +``` + +  请注æ„,返回类型ä»ç„¶æ˜¯ `Set`。 ä¸è¦ä½¿ç”¨é™å®šé€šé…符类型作为返回类型。除了会为用户æä¾›é¢å¤–çš„çµæ´»æ€§ï¼Œè¿˜å¼ºåˆ¶ä»–们在客户端代ç ä¸­ä½¿ç”¨é€šé…符类型。 通过修改åŽçš„声明,此代ç å°†æ¸…晰地编译: + +```Java +Set integers = Set.of(1, 3, 5); + +Set doubles = Set.of(2.0, 4.0, 6.0); + +Set numbers = union(integers, doubles); +``` + +  如果使用得当,类的用户几乎ä¸ä¼šçœ‹åˆ°é€šé…符类型。 他们使方法接å—他们应该接å—çš„å‚数,拒ç»ä»–们应该拒ç»çš„å‚数。 如果一个类的用户必须考虑通é…符类型,那么它的 API å¯èƒ½æœ‰é—®é¢˜ã€‚ + +  在 Java 8 之å‰ï¼Œç±»åž‹æŽ¨æ–­è§„则ä¸å¤Ÿèªæ˜Žï¼Œæ— æ³•å¤„ç†å…ˆå‰çš„代ç ç‰‡æ®µï¼Œè¿™è¦æ±‚编译器使用上下文指定的返回类型(或目标类型)æ¥æŽ¨æ–­ `E` 的类型。`union` 方法调用的目标类型如å‰æ‰€ç¤ºæ˜¯ `Set`。 如果å°è¯•åœ¨æ—©æœŸç‰ˆæœ¬çš„ Java 中编译片段(以åŠé€‚åˆçš„ `Set.of` 工厂替代版本),将会看到如此长的错综å¤æ‚的错误消æ¯ï¼š + +```Java +Union.java:14: error: incompatible types + Set numbers = union(integers, doubles); + ^ + required: Set + found: Set + where INT#1,INT#2 are intersection types: + INT#1 extends Number,Comparable + INT#2 extends Number,Comparable +``` + +  幸è¿çš„是有办法æ¥å¤„ç†è¿™ç§é”™è¯¯ã€‚ 如果编译器ä¸èƒ½æŽ¨æ–­å‡ºæ­£ç¡®çš„类型,你å¯ä»¥éšæ—¶å‘Šè¯‰å®ƒä½¿ç”¨ä»€ä¹ˆç±»åž‹çš„显å¼ç±»åž‹å‚æ•°[JLS,15.12]。 甚至在 Java 8 中引入目标类型之å‰ï¼Œè¿™ä¸æ˜¯ä½ å¿…é¡»ç»å¸¸åšçš„事情,这很好,因为显å¼ç±»åž‹å‚æ•°ä¸æ˜¯å¾ˆæ¼‚亮。 通过添加显å¼ç±»åž‹å‚数,如下所示,代ç ç‰‡æ®µåœ¨ Java 8 之å‰çš„版本中进行了干净编译: + +```Java +// Explicit type parameter - required prior to Java 8 +Set numbers = Union.union(integers, doubles); +``` + +  接下æ¥è®©æˆ‘们把注æ„力转å‘æ¡ç›® 30 中的 `max` 方法。这里是原始声明: + +```Java +public static > T max(List list) +``` + +  为了从原æ¥åˆ°ä¿®æ”¹åŽçš„声明,我们两次应用了 PECS。首先直接的应用是å‚数列表。 å®ƒç”Ÿæˆ T 实例,所以将类型从 `List` 更改为 `List`。 棘手的应用是类型å‚æ•° `T`。这是我们第一次看到通é…符应用于类型å‚数。 最åˆï¼Œ`T` 被指定为继承 `Comparable`,但 `Comparable` çš„ `T` 消费 `T` 实例(并生æˆæŒ‡ç¤ºé¡ºåºå…³ç³»çš„整数)。 因此,å‚数化类型 `Comparable` 被替æ¢ä¸ºé™å®šé€šé…符类型 `Comparable`。 `Comparable` 实例总是消费者,所以通常应该**使用 `Comparable` 优于 `Comparable`。** `Comparator` 也是如此。因此,通常应该**使用 `Comparator` 优于 `Comparator`。** + +  修改åŽçš„ `max` 声明å¯èƒ½æ˜¯æœ¬ä¹¦ä¸­æœ€å¤æ‚的方法声明。 增加的å¤æ‚性是å¦çœŸçš„起作用了å—? åŒæ ·ï¼Œå®ƒçš„确如此。 这是一个列表的简å•ä¾‹å­ï¼Œå®ƒè¢«åŽŸå§‹å£°æ˜ŽæŽ’除,但在被修改åŽçš„版本里是å…许的: + +```Java +List> scheduledFutures = ... ; +``` + +  无法将原始方法声明应用于此列表的原因是 `ScheduledFuture` ä¸å®žçŽ° `Comparable`。 相å,它是 `Delayed` çš„å­æŽ¥å£ï¼Œå®ƒç»§æ‰¿äº† `Comparable`。 æ¢å¥è¯è¯´ï¼Œä¸€ä¸ª `ScheduledFuture` 实例ä¸ä»…仅和其他的 `ScheduledFuture` 实例相比较: 它å¯ä»¥ä¸Žä»»ä½• `Delayed` 实例比较,并且足以导致原始的声明拒ç»å®ƒã€‚ æ›´æ™®é地说,通é…符è¦æ±‚æ¥æ”¯æŒæ²¡æœ‰ç›´æŽ¥å®žçŽ° `Comparable`(或 `Comparator`)的类型,但继承了一个类型。 + +  还有一个关于通é…符相关的è¯é¢˜ã€‚ 类型å‚数和通é…符之间具有åŒé‡æ€§ï¼Œè®¸å¤šæ–¹æ³•å¯ä»¥ç”¨ä¸€ä¸ªæˆ–å¦ä¸€ä¸ªå£°æ˜Žã€‚ 例如,下é¢æ˜¯ä¸¤ä¸ªå¯èƒ½çš„声明,用于交æ¢åˆ—表中两个索引项目的é™æ€æ–¹æ³•ã€‚ 第一个使用无é™åˆ¶ç±»åž‹å‚数(æ¡ç›® 30),第二个使用无é™åˆ¶é€šé…符: + +```Java +// Two possible declarations for the swap method +public static void swap(List list, int i, int j); +public static void swap(List list, int i, int j); +``` + +  这两个声明中的哪一个更å¯å–,为什么? 在公共 API 中,第二个更好,因为它更简å•ã€‚ 你传入一个列表(任何列表),该方法交æ¢ç´¢å¼•çš„元素。 没有类型å‚数需è¦æ‹…心。 通常, **如果类型å‚数在方法声明中åªå‡ºçŽ°ä¸€æ¬¡ï¼Œè¯·å°†å…¶æ›¿æ¢ä¸ºé€šé…符。** 如果它是一个无é™åˆ¶çš„类型å‚数,请将其替æ¢ä¸ºæ— é™åˆ¶çš„通é…符; 如果它是一个é™å®šç±»åž‹å‚数,则用é™å®šé€šé…符替æ¢å®ƒã€‚ + +  第二个 `swap` 方法声明有一个问题。 这个简å•çš„实现ä¸ä¼šç¼–译: + +```Java +public static void swap(List list, int i, int j) { + list.set(i, list.set(j, list.get(i))); +} +``` + +  试图编译它会产生这个ä¸å¤ªæœ‰ç”¨çš„错误信æ¯ï¼š + +```Java +Swap.java:5: error: incompatible types: Object cannot be +converted to CAP#1 + list.set(i, list.set(j, list.get(i))); + ^ + where CAP#1 is a fresh type-variable: + CAP#1 extends Object from capture of ? +``` + +  看起æ¥æˆ‘们ä¸èƒ½æŠŠä¸€ä¸ªå…ƒç´ æ”¾å›žåˆ°æˆ‘们刚刚拿出æ¥çš„列表中。 问题是列表的类型是 `List`,并且ä¸èƒ½å°†é™¤ `null` 外的任何值放入 `List` 中。 幸è¿çš„是,有一ç§æ–¹æ³•å¯ä»¥åœ¨ä¸ä½¿ç”¨ä¸å®‰å…¨çš„转æ¢æˆ–原始类型的情况下实现此方法。 这个想法是写一个ç§æœ‰è¾…助方法æ¥æ•æ‰é€šé…符类型。 辅助方法必须是泛型方法æ‰èƒ½æ•èŽ·ç±»åž‹ã€‚ 以下是它的定义: + +```Java +public static void swap(List list, int i, int j) { + swapHelper(list, i, j); +} + +// Private helper method for wildcard capture +private static void swapHelper(List list, int i, int j) { + list.set(i, list.set(j, list.get(i))); +} +``` + +  `swapHelper` 方法知é“该列表是一个 `List`。 因此,它知é“从这个列表中获得的任何值都是 `E` 类型,并且å¯ä»¥å®‰å…¨åœ°å°†ä»»ä½•ç±»åž‹çš„ E 值放入列表中。 这个ç¨å¾®å¤æ‚çš„ `swap` 的实现å¯ä»¥å¹²å‡€åœ°ç¼–译。 它å…许我们导出基于通é…符的漂亮声明,åŒæ—¶åˆ©ç”¨å†…部更å¤æ‚的泛型方法。 `swap` 方法的客户端ä¸éœ€è¦é¢å¯¹æ›´å¤æ‚çš„ `swapHelper` 声明,但他们从中å—益。 辅助方法具有我们认为对公共方法æ¥è¯´è¿‡äºŽå¤æ‚çš„ç­¾å。 + +  总之,在你的 API 中使用通é…符类型,虽然棘手,但使得 API 更加çµæ´»ã€‚ 如果编写一个将被广泛使用的类库,正确使用通é…符类型应该被认为是强制性的。 è®°ä½åŸºæœ¬è§„则: producer-extends, consumer-super(PECS)。 还è¦è®°ä½ï¼Œæ‰€æœ‰ `Comparable` å’Œ `Comparator` 都是消费者。 + + diff --git a/docs/notes/32. åˆç†åœ°ç»“åˆæ³›åž‹å’Œå¯å˜å‚æ•°.md b/docs/notes/32. åˆç†åœ°ç»“åˆæ³›åž‹å’Œå¯å˜å‚æ•°.md new file mode 100644 index 0000000..c987e83 --- /dev/null +++ b/docs/notes/32. åˆç†åœ°ç»“åˆæ³›åž‹å’Œå¯å˜å‚æ•°.md @@ -0,0 +1,142 @@ +# 32. åˆç†åœ°ç»“åˆæ³›åž‹å’Œå¯å˜å‚æ•° + +  在 Java 5 中,å¯å˜å‚数方法(æ¡ç›® 53)和泛型都被添加到平å°ä¸­ï¼Œæ‰€ä»¥ä½ å¯èƒ½å¸Œæœ›å®ƒä»¬èƒ½å¤Ÿæ­£å¸¸äº¤äº’; å¯æ‚²çš„是,他们并没有。 å¯å˜å‚数的目的是å…许客户端将一个å¯å˜æ•°é‡çš„å‚数传递给一个方法,但这是一个脆弱的抽象(leaky abstraction):当你调用一个å¯å˜å‚数方法时,会创建一个数组æ¥ä¿å­˜å¯å˜å‚数;那个应该是实现细节的数组是å¯è§çš„。 因此,当å¯å˜å‚数具有泛型或å‚数化类型时,会导致编译器警告混淆。 + +  回顾æ¡ç›® 28,éžå…·ä½“化(non-reifiable)的类型是其è¿è¡Œæ—¶è¡¨ç¤ºæ¯”其编译时表示具有更少信æ¯çš„类型,并且几乎所有泛型和å‚数化类型都是ä¸å¯å…·ä½“化的。 如果æŸä¸ªæ–¹æ³•å£°æ˜Žå…¶å¯å˜å‚数为éžå…·ä½“化的类型,则编译器将在该声明上生æˆè­¦å‘Šã€‚ 如果在推断类型ä¸å¯ç¡®å®šçš„å¯å˜å‚æ•°å‚数上调用该方法,那么编译器也会在调用中生æˆè­¦å‘Šã€‚ 警告看起æ¥åƒè¿™æ ·ï¼š + + +```Java +warning: [unchecked] Possible heap pollution from + parameterized vararg type List +``` + +  当å‚数化类型的å˜é‡å¼•ç”¨ä¸å±žäºŽè¯¥ç±»åž‹çš„对象时会å‘生堆污染(Heap pollution)[JLS,4.12.2]。 它会导致编译器的自动生æˆçš„强制转æ¢å¤±è´¥ï¼Œè¿å了泛型类型系统的基本ä¿è¯ã€‚ + +  例如,请考虑以下方法,该方法是第 127 页上的代ç ç‰‡æ®µçš„一个ä¸å¤ªæ˜Žæ˜¾çš„å˜ä½“: + +```Java +// Mixing generics and varargs can violate type safety! +static void dangerous(List... stringLists) { + List intList = List.of(42); + Object[] objects = stringLists; + objects[0] = intList; // Heap pollution + String s = stringLists[0].get(0); // ClassCastException +} +``` + +  此方法没有å¯è§çš„强制转æ¢ï¼Œä½†åœ¨è°ƒç”¨ä¸€ä¸ªæˆ–多个å‚数时抛出 `ClassCastException` 异常。 它的最åŽä¸€è¡Œæœ‰ä¸€ä¸ªç”±ç¼–译器生æˆçš„éšå½¢è½¬æ¢ã€‚ è¿™ç§è½¬æ¢å¤±è´¥ï¼Œè¡¨æ˜Žç±»åž‹å®‰å…¨æ€§å·²ç»è¢«ç ´å,并且将值ä¿å­˜åœ¨æ³›åž‹å¯å˜å‚数数组å‚数中是ä¸å®‰å…¨çš„。 + +  这个例å­å¼•å‘了一个有趣的问题:为什么声明一个带有泛型å¯å˜å‚数的方法是åˆæ³•çš„,当明确创建一个泛型数组是éžæ³•çš„时候呢? æ¢å¥è¯è¯´ï¼Œä¸ºä»€ä¹ˆå‰é¢æ˜¾ç¤ºçš„方法åªç”Ÿæˆä¸€ä¸ªè­¦å‘Šï¼Œè€Œ 127 页上的代ç ç‰‡æ®µä¼šç”Ÿæˆä¸€ä¸ªé”™è¯¯ï¼Ÿ 答案是,具有泛型或å‚数化类型的å¯å˜å‚æ•°å‚数的方法在实践中å¯èƒ½éžå¸¸æœ‰ç”¨ï¼Œå› æ­¤è¯­è¨€è®¾è®¡äººå‘˜é€‰æ‹©å¿å—è¿™ç§ä¸ä¸€è‡´ã€‚ 事实上,Java 类库导出了几个这样的方法,包括 `Arrays.asList(T... a)`,`Collections.addAll(Collection c, T... elements)`,`EnumSet.of(E first, E... rest)`。 与å‰é¢æ˜¾ç¤ºçš„å±é™©æ–¹æ³•ä¸åŒï¼Œè¿™äº›ç±»åº“方法是类型安全的。 + +  在 Java 7 中,`@SafeVarargs` 注解已添加到平å°ï¼Œä»¥å…许具有泛型å¯å˜å‚数的方法的作者自动ç¦æ­¢å®¢æˆ·ç«¯è­¦å‘Šã€‚ 实质上,`@SafeVarargs` 注解构æˆäº†ä½œè€…对类型安全的方法的承诺。 为了交æ¢è¿™ä¸ªæ‰¿è¯ºï¼Œç¼–译器åŒæ„ä¸è¦è­¦å‘Šç”¨æˆ·è°ƒç”¨å¯èƒ½ä¸å®‰å…¨çš„方法。 + +  除éžå®ƒå®žé™…上是安全的,å¦åˆ™æ³¨æ„ä¸è¦ä½¿ç”¨ `@SafeVarargs` 注解标注一个方法。 那么需è¦åšäº›ä»€ä¹ˆæ¥ç¡®ä¿è¿™ä¸€ç‚¹å‘¢ï¼Ÿ 回想一下,调用方法时会创建一个泛型数组,以容纳å¯å˜å‚数。 如果方法没有在数组中存储任何东西(它会覆盖å‚数)并且ä¸å…许对数组的引用进行转义(这会使ä¸å—信任的代ç è®¿é—®æ•°ç»„),那么它是安全的。 æ¢å¥è¯è¯´ï¼Œå¦‚æžœå¯å˜å‚数数组仅用于从调用者å‘方法传递å¯å˜æ•°é‡çš„å‚数——毕竟这是å¯å˜å‚数的目的——那么该方法是安全的。 + +  值得注æ„的是,你å¯ä»¥è¿å类型安全性,å³ä½¿ä¸ä¼šåœ¨å¯å˜å‚数数组中存储任何内容。 考虑下é¢çš„泛型å¯å˜å‚数方法,它返回一个包å«å‚数的数组。 ä¹ä¸€çœ‹ï¼Œå®ƒå¯èƒ½çœ‹èµ·æ¥åƒä¸€ä¸ªæ–¹ä¾¿çš„å°å·¥å…·ï¼š + + +```Java +// UNSAFE - Exposes a reference to its generic parameter array! +static T[] toArray(T... args) { + return args; +} +``` + +  这个方法åªæ˜¯è¿”回它的å¯å˜å‚数数组。 该方法å¯èƒ½çœ‹èµ·æ¥å¹¶ä¸å±é™©ï¼Œä½†å®ƒæ˜¯ï¼ 该数组的类型由传递给方法的å‚数的编译时类型决定,编译器å¯èƒ½æ²¡æœ‰è¶³å¤Ÿçš„ä¿¡æ¯æ¥åšå‡ºæ­£ç¡®çš„判断。 由于此方法返回其å¯å˜å‚数数组,它å¯ä»¥å°†å †æ±¡æŸ“传播到调用栈上。 + +  为了具体说明,请考虑下é¢çš„泛型方法,它接å—三个类型 T çš„å‚数,并返回一个包å«ä¸¤ä¸ªå‚数的数组,éšæœºé€‰æ‹©ï¼š + +```Java +static T[] pickTwo(T a, T b, T c) { + switch(ThreadLocalRandom.current().nextInt(3)) { + case 0: return toArray(a, b); + case 1: return toArray(a, c); + case 2: return toArray(b, c); + } + throw new AssertionError(); // Can't get here +} +``` + +  这个方法本身ä¸æ˜¯å±é™©çš„,除了调用具有泛型å¯å˜å‚æ•°çš„ `toArray` 方法之外,ä¸ä¼šäº§ç”Ÿè­¦å‘Šã€‚ + +  编译此方法时,编译器会生æˆä»£ç ä»¥åˆ›å»ºä¸€ä¸ªå°†ä¸¤ä¸ª T 实例传递给 `toArray` çš„å¯å˜å‚数数组。 这段代ç åˆ†é…了一个 `Object[]` 类型的数组,它是ä¿è¯ä¿å­˜è¿™äº›å®žä¾‹çš„最具体的类型,而ä¸ç®¡åœ¨è°ƒç”¨ä½ç½®ä¼ é€’ç»™ `pickTwo` 的对象是什么类型。 `toArray` 方法åªæ˜¯ç®€å•åœ°å°†è¿™ä¸ªæ•°ç»„返回给 `pickTwo`ï¼Œç„¶åŽ `pickTwo` 将它返回给调用者,所以 `pickTwo` 总是返回一个 `Object[]` 类型的数组。 + +```Java +public static void main(String[] args) { + String[] attributes = pickTwo("Good", "Fast", "Cheap"); +} +``` + +  这ç§æ–¹æ³•æ²¡æœ‰ä»»ä½•é—®é¢˜ï¼Œå› æ­¤å®ƒç¼–译时ä¸ä¼šäº§ç”Ÿä»»ä½•è­¦å‘Šã€‚ 但是当è¿è¡Œå®ƒæ—¶ï¼ŒæŠ›å‡ºä¸€ä¸ª `ClassCastException` 异常,尽管ä¸åŒ…å«å¯è§çš„转æ¢ã€‚ 你没有看到的是,编译器已ç»ç”Ÿæˆäº†ä¸€ä¸ªéšè—的强制转æ¢ä¸ºç”± `pickTwo` 返回的值的 `String[]` 类型,以便它å¯ä»¥å­˜å‚¨åœ¨å±žæ€§ä¸­ã€‚ 转æ¢å¤±è´¥ï¼Œå› ä¸º `Object[]` ä¸æ˜¯ `String[]` çš„å­ç±»åž‹ã€‚ è¿™ç§æ•…障相当令人ä¸å®‰ï¼Œå› ä¸ºå®ƒä»Žå®žé™…导致堆污染(`toArray`)的方法中移除了两个级别,并且在实际å‚数存储在其中之åŽï¼Œå¯å˜å‚数数组未被修改。 + +  这个例å­æ˜¯ä¸ºäº†è®©äººä»¬è®¤è¯†åˆ°ç»™å¦ä¸€ä¸ªæ–¹æ³•è®¿é—®ä¸€ä¸ªæ³›åž‹çš„å¯å˜å‚数数组是ä¸å®‰å…¨çš„,除了两个例外:将数组传递给å¦ä¸€ä¸ªå¯å˜å‚数方法是安全的,这个方法是用 `@SafeVarargs` 正确标注的, 将数组传递给一个éžå¯å˜å‚数的方法是安全的,该方法仅计算数组内容的一些方法。 + +  这里是安全使用泛型å¯å˜å‚数的典型示例。 此方法将任æ„æ•°é‡çš„列表作为å‚数,并按顺åºè¿”回包å«æ‰€æœ‰è¾“入列表元素的å•ä¸ªåˆ—表。 由于该方法使用 `@SafeVarargs` 进行标注,因此在声明或其调用站ä½ç½®ä¸Šä¸ä¼šç”Ÿæˆä»»ä½•è­¦å‘Šï¼š + + +```Java +// Safe method with a generic varargs parameter +@SafeVarargs +static List flatten(List... lists) { + List result = new ArrayList<>(); + for (List list : lists) + result.addAll(list); + return result; +} +``` + +  决定何时使用 `@SafeVarargs` 注解的规则很简å•ï¼šåœ¨æ¯ç§æ–¹æ³•ä¸Šä½¿ç”¨ `@SafeVarargs`,并使用泛型或å‚数化类型的å¯å˜å‚数,这样用户就ä¸ä¼šå› ä¸å¿…è¦çš„和令人困惑的编译器警告而担忧。 è¿™æ„味ç€ä½ ä¸åº”该写å±é™©æˆ–者 `toArray` ç­‰ä¸å®‰å…¨çš„å¯å˜å‚数方法。 æ¯æ¬¡ç¼–译器警告你å¯èƒ½ä¼šå—到æ¥è‡ªä½ æŽ§åˆ¶çš„方法中泛型å¯å˜å‚数的堆污染时,请检查该方法是å¦å®‰å…¨ã€‚ æ醒一下,在下列情况下,泛型å¯å˜å‚数方法是安全的: + +1. 它ä¸ä¼šåœ¨å¯å˜å‚数数组中存储任何东西 +2. 它ä¸ä¼šä½¿æ•°ç»„(或克隆)对ä¸å¯ä¿¡ä»£ç å¯è§ã€‚ 如果è¿å这些ç¦ä»¤ä¸­çš„任何一项,请修å¤ã€‚ + +  请注æ„,`SafeVarargs` 注解åªå¯¹ä¸èƒ½è¢«é‡å†™çš„方法是åˆæ³•çš„,因为ä¸å¯èƒ½ä¿è¯æ¯ä¸ªå¯èƒ½çš„é‡å†™æ–¹æ³•éƒ½æ˜¯å®‰å…¨çš„。 在 Java 8 中,注解仅在é™æ€æ–¹æ³•å’Œ `final` 实例方法上åˆæ³•; 在 Java 9 中,它在ç§æœ‰å®žä¾‹æ–¹æ³•ä¸­ä¹Ÿå˜ä¸ºåˆæ³•ã€‚ + +  使用 `SafeVarargs` 注解的替代方法是采用æ¡ç›® 28 的建议,并用 `List` å‚数替æ¢å¯å˜å‚数(这是一个å˜ç›¸çš„数组)。 下é¢æ˜¯åº”用于我们的 `flatten` 方法时,这ç§æ–¹æ³•çš„æ ·å­ã€‚ 请注æ„,åªæœ‰å‚数声明被更改了: + +```Java +// List as a typesafe alternative to a generic varargs parameter +static List flatten(List> lists) { + List result = new ArrayList<>(); + for (List list : lists) + result.addAll(list); + return result; +} +``` + +  然åŽå¯ä»¥å°†æ­¤æ–¹æ³•ä¸Žé™æ€å·¥åŽ‚方法 `List.of` 结åˆä½¿ç”¨ï¼Œä»¥å…许å¯å˜æ•°é‡çš„å‚数。 请注æ„,这ç§æ–¹æ³•ä¾èµ–于 `List.of` 声明使用 `@SafeVarargs` 注解: + + audience = flatten(List.of(friends, romans, countrymen)); + +  这ç§æ–¹æ³•çš„优点是编译器å¯ä»¥è¯æ˜Žè¿™ç§æ–¹æ³•æ˜¯ç±»åž‹å®‰å…¨çš„。 ä¸å¿…使用 `@SafeVarargs` 注解æ¥è¯æ˜Žå…¶å®‰å…¨æ€§ï¼Œä¹Ÿä¸ç”¨æ‹…心在确定安全性时å¯èƒ½ä¼šçŠ¯é”™ã€‚ 主è¦ç¼ºç‚¹æ˜¯å®¢æˆ·ç«¯ä»£ç æœ‰ç‚¹å†—长,è¿è¡Œå¯èƒ½ä¼šæ…¢ä¸€äº›ã€‚ + +  这个技巧也å¯ä»¥ç”¨åœ¨ä¸å¯èƒ½å†™ä¸€ä¸ªå®‰å…¨çš„å¯å˜å‚数方法的情况下,就åƒç¬¬ 147 页的 `toArray` 方法那样。它的列表模拟是 `List.of` 方法,所以我们甚至ä¸å¿…编写它; Java 类库作者已ç»ä¸ºæˆ‘们完æˆäº†è¿™é¡¹å·¥ä½œã€‚ `pickTwo` 方法然åŽå˜æˆè¿™æ ·ï¼š + + +```Java +static List pickTwo(T a, T b, T c) { + switch(rnd.nextInt(3)) { + case 0: return List.of(a, b); + case 1: return List.of(a, c); + case 2: return List.of(b, c); + } + throw new AssertionError(); +} +``` + +  `main` æ–¹å˜æˆè¿™æ ·ï¼š + +```Java +public static void main(String[] args) { + List attributes = pickTwo("Good", "Fast", "Cheap"); +} +``` + +  生æˆçš„代ç æ˜¯ç±»åž‹å®‰å…¨çš„,因为它åªä½¿ç”¨æ³›åž‹ï¼Œä¸æ˜¯æ•°ç»„。 + +  总而言之,å¯å˜å‚数和泛型ä¸èƒ½å¾ˆå¥½åœ°äº¤äº’,因为å¯å˜å‚数机制是在数组上é¢æž„建的脆弱的抽象,并且数组具有与泛型ä¸åŒçš„类型规则。 虽然泛型å¯å˜å‚æ•°ä¸æ˜¯ç±»åž‹å®‰å…¨çš„,但它们是åˆæ³•çš„。 如果选择使用泛型(或å‚数化)å¯å˜å‚数编写方法,请首先确ä¿è¯¥æ–¹æ³•æ˜¯ç±»åž‹å®‰å…¨çš„,然åŽä½¿ç”¨ `@SafeVarargs` 注解对其进行标注,以å…造æˆä½¿ç”¨ä¸æ„‰å¿«ã€‚ + + + + + diff --git a/docs/notes/33. 优先考虑类型安全的异构容器.md b/docs/notes/33. 优先考虑类型安全的异构容器.md new file mode 100644 index 0000000..0131f48 --- /dev/null +++ b/docs/notes/33. 优先考虑类型安全的异构容器.md @@ -0,0 +1,126 @@ +# 33. 优先考虑类型安全的异构容器 + +  泛型的常è§ç”¨æ³•åŒ…括集åˆï¼Œå¦‚ `Set å’Œ `Map` å’Œå•ä¸ªå…ƒç´ å®¹å™¨ï¼Œå¦‚ `ThreadLocal` å’Œ `AtomicReference`。 在所有这些用途中,它都是å‚数化的容器。 è¿™é™åˆ¶äº†æ¯ä¸ªå®¹å™¨åªèƒ½æœ‰å›ºå®šæ•°é‡çš„类型å‚数。 通常这正是你想è¦çš„。 一个 `Set` 有å•ä¸€çš„类型å‚数,表示它的元素类型; 一个 `Map` 有两个,代表它的键和值的类型;等等。 + +  然而有时候,你需è¦æ›´å¤šçš„çµæ´»æ€§ã€‚ 例如,数æ®åº“一行记录å¯ä»¥å…·æœ‰ä»»æ„多列,并且能够以类型安全的方å¼è®¿é—®å®ƒä»¬æ˜¯å¾ˆå¥½çš„。 幸è¿çš„是,有一个简å•çš„方法å¯ä»¥è¾¾åˆ°è¿™ä¸ªæ•ˆæžœã€‚ 这个想法是å‚数化键(key)而ä¸æ˜¯å®¹å™¨ã€‚ 然åŽå°†å‚数化的键æ交给容器以æ’入或检索值。 泛型类型系统用于ä¿è¯å€¼çš„类型与其键一致。 + +  作为这ç§æ–¹æ³•çš„一个简å•ç¤ºä¾‹ï¼Œè¯·è€ƒè™‘一个 `Favorites` 类,它å…许其客户端ä¿å­˜å’Œæ£€ç´¢ä»»æ„多ç§ç±»åž‹çš„ favorite 实例。 该类型的 `Class` 对象将扮演å‚数化键的一部分。其原因是这 `Class` 类是泛型的。 类的类型从字é¢ä¸Šæ¥è¯´ä¸æ˜¯ç®€å•çš„ `Class`,而是 `Class`。 例如,`String.class` 的类型为 `Class`,`Integer.class` 的类型为 `Class`。 当在方法中传递字é¢ç±»ä¼ é€’编译时和è¿è¡Œæ—¶ç±»åž‹ä¿¡æ¯æ—¶ï¼Œå®ƒè¢«ç§°ä¸ºç±»åž‹ä»¤ç‰Œï¼ˆtype token)[Bracha04]。 + +  `Favorites` 类的 `API` 很简å•ã€‚ 它看起æ¥å°±åƒä¸€ä¸ªç®€å• `Map` 类,除了该键是å‚数化的以外。 å®¢æˆ·ç«¯åœ¨è®¾ç½®å’ŒèŽ·å– favorites 实例时呈现一个 `Class` 对象。 这里是 API: + +```Java +// Typesafe heterogeneous container pattern - API +public class Favorites { + public void putFavorite(Class type, T instance); + public T getFavorite(Class type); +} +``` + +  下é¢æ˜¯ä¸€ä¸ªæ¼”示 `Favorites` 类,ä¿å­˜ï¼Œæ£€ç´¢å’Œæ‰“å°å–œæ¬¢çš„ `String`,`Integer` å’Œ `Class` 实例: + +```Java +// Typesafe heterogeneous container pattern - client +public static void main(String[] args) { + Favorites f = new Favorites(); + f.putFavorite(String.class, "Java"); + f.putFavorite(Integer.class, 0xcafebabe); + f.putFavorite(Class.class, Favorites.class); + + String favoriteString = f.getFavorite(String.class); + int favoriteInteger = f.getFavorite(Integer.class); + Class favoriteClass = f.getFavorite(Class.class); + System.out.printf("%s %x %s%n", favoriteString, + favoriteInteger, favoriteClass.getName()); +} +``` + +  正如你所期望的,这个程åºæ‰“å° `Java cafebabe Favorites`。 请注æ„,顺便说一下,`Java` çš„ `printf` 方法与 C 语言的ä¸åŒä¹‹å¤„在于,应该使用cn,而在 C 中使用\n。%n 生æˆé€‚用的特定于平å°çš„行分隔符,该分隔符在很多但ä¸æ˜¯æ‰€æœ‰å¹³å°ä¸Šéƒ½æ˜¯\n。 + +  `Favorites` 实例是类型安全的:当你请求一个字符串时它永远ä¸ä¼šè¿”回一个整数。 它也是异构的:与普通 Map ä¸åŒï¼Œæ‰€æœ‰çš„键都是ä¸åŒçš„类型。 因此,我们将 `Favorites` 称为类型安全异构容器(typesafe heterogeneous container)。 + +  Favorites 的实现éžå¸¸å°å·§ã€‚ 这是完整的代ç ï¼š + +```Java +// Typesafe heterogeneous container pattern - implementation +public class Favorites { + private Map, Object> favorites = new HashMap<>(); + + public void putFavorite(Class type, T instance) { + favorites.put(Objects.requireNonNull(type), instance); + } + + public T getFavorite(Class type) { + return type.cast(favorites.get(type)); + } +} +``` + +  这里有一些微妙的事情å‘生。 æ¯ä¸ª `Favorites` 实例都由一个å为 `favorites` ç§æœ‰çš„ `Map, Object>` æ¥æ”¯æŒã€‚ ä½ å¯èƒ½è®¤ä¸ºæ— æ³•å°†ä»»ä½•å†…容放入此 `Map` 中,因为这是无é™å®šçš„通é…符类型,但事实æ°æ°ç›¸å。 需è¦æ³¨æ„的是通é…符类型是嵌套的:它ä¸æ˜¯é€šé…符类型的 `Map` 类型,而是键的类型。 è¿™æ„味ç€æ¯ä¸ªé”®éƒ½å¯ä»¥æœ‰ä¸åŒçš„å‚数化类型:一个å¯ä»¥æ˜¯ `Class`,下一个 `Class` 等等。 这就是异构的由æ¥ã€‚ + +  接下æ¥è¦æ³¨æ„的是,`favorites` çš„ `Map` 的值类型åªæ˜¯ `Object`。 æ¢å¥è¯è¯´ï¼Œ`Map` ä¸ä¿è¯é”®å’Œå€¼ä¹‹é—´çš„类型关系,å³æ¯ä¸ªå€¼éƒ½æ˜¯ç”±å…¶é”®è¡¨ç¤ºçš„类型。 事实上,Java 的类型系统并ä¸è¶³ä»¥è¡¨è¾¾è¿™ä¸€ç‚¹ã€‚ 但是我们知é“这是真的,并在检索一个 `favorite` 时利用了这点。 + +  `putFavorite` 实现很简å•ï¼šåªéœ€å°†ç»™å®šçš„ `Class` 对象映射到给定的 `favorites` 的实例å³å¯ã€‚ 如上所述,这丢弃了键和值之间的“类型è”系(type linkage)â€ï¼›æ— æ³•çŸ¥é“这个值是ä¸æ˜¯é”®çš„一个实例。 但没关系,因为 `getFavorites` 方法å¯ä»¥å¹¶ä¸”确实é‡æ–°å»ºç«‹è¿™ç§å…³è”。 + +  `getFavorite` 的实现比 `putFavorite` æ›´å¤æ‚。 首先,它从 `favorites` Map 中获å–与给定 `Class` 对象相对应的值。 这是返回的正确对象引用,但它具有错误的编译时类型:它是 Object(favorites map 的值类型),我们需è¦è¿”回类型 `T`。因此,`getFavorite` 实现动æ€åœ°å°†å¯¹è±¡å¼•ç”¨è½¬æ¢ä¸º `Class` 对象表示的类型,使用 `Class` çš„ `cast` 方法。 + +  `cast` 方法是 Java çš„ `cast` æ“作符的动æ€æ¨¡æ‹Ÿã€‚它åªæ˜¯æ£€æŸ¥å®ƒçš„å‚数是å¦ç”± `Class` 对象表示的类型的实例。如果是,它返回å‚æ•°ï¼›å¦åˆ™ä¼šæŠ›å‡º `ClassCastException` 异常。我们知é“,å‡è®¾å®¢æˆ·ç«¯ä»£ç èƒ½å¤Ÿå¹²å‡€åœ°ç¼–译,`getFavorite` 中的强制转æ¢ä¸ä¼šæŠ›å‡º `ClassCastException` 异常。 也就是说,`favorites map` 中的值始终与其键的类型相匹é…。 + +  那么这个 `cast` 方法为我们åšäº†ä»€ä¹ˆï¼Œå› ä¸ºå®ƒåªæ˜¯è¿”回它的å‚数? `cast` çš„ç­¾å充分利用了 `Class` 类是泛型的事实。 它的返回类型是 `Class` 对象的类型å‚数: + +```Java +public class Class { + T cast(Object obj); +} +``` + +  这正是 `getFavorite` 方法所需è¦çš„。 è¿™æ­£æ˜¯ç¡®ä¿ `Favorites` 类型安全,而ä¸ç”¨æ±‚助一个未ç»æ£€æŸ¥çš„强制转æ¢çš„ `T` 类型。 + +  `Favorites` 类有两个é™åˆ¶å€¼å¾—注æ„。 首先,æ¶æ„客户å¯ä»¥é€šè¿‡ä½¿ç”¨åŽŸå§‹å½¢å¼çš„ `Class` 对象,轻æ¾ç ´å `Favorites` 实例的类型安全。 但生æˆçš„客户端代ç åœ¨ç¼–译时会生æˆæœªç»æ£€æŸ¥çš„警告。 这与正常的集åˆå®žçŽ°ï¼ˆå¦‚ `HashSet` å’Œ `HashMap`)没有什么ä¸åŒã€‚ 通过使用原始类型 `HashSet`(æ¡ç›® 26),å¯ä»¥è½»æ¾åœ°å°†å­—符串放入 `HashSet` 中。 也就是说,如果你愿æ„为此付出一点代价,就å¯ä»¥æ‹¥æœ‰è¿è¡Œæ—¶ç±»åž‹å®‰å…¨æ€§ã€‚ ç¡®ä¿ `Favorites` 永远ä¸è¿å类型ä¸å˜çš„方法是,使 putFavorite 方法检查该实例是å¦ç”± `type` 表示类型的实例,并且我们已ç»çŸ¥é“如何执行此æ“作。åªéœ€ä½¿ç”¨åŠ¨æ€è½¬æ¢ï¼š + +```Java +// Achieving runtime type safety with a dynamic cast +public void putFavorite(Class type, T instance) { + favorites.put(type, type.cast(instance)); +} +``` + +  `java.util.Collections` 中有一些集åˆåŒ…装类,å¯ä»¥å‘挥相åŒçš„诀çªã€‚ 它们被称为 `checkedSet`,`checkedList`,`checkedMap` 等等。 他们的é™æ€å·¥åŽ‚除了一个集åˆï¼ˆæˆ– `Map`)之外还有一个 `Class` 对象(或两个)。 é™æ€å·¥åŽ‚æ˜¯æ³›åž‹æ–¹æ³•ï¼Œç¡®ä¿ `Class` 对象和集åˆçš„编译时类型匹é…。 包装类为它们包装的集åˆæ·»åŠ äº†å…·ä½“化。 例如,如果有人试图将 `Coin` 放入你的 `Collection` 中,则包装类在è¿è¡Œæ—¶ä¼šæŠ›å‡º `ClassCastException`。 这些包装类对于追踪在混åˆäº†æ³›åž‹å’ŒåŽŸå§‹ç±»åž‹çš„应用程åºä¸­æ·»åŠ ä¸æ­£ç¡®ç±»åž‹çš„元素到集åˆçš„客户端代ç å¾ˆæœ‰ç”¨ã€‚ + +  Favorites 类的第二个é™åˆ¶æ˜¯å®ƒä¸èƒ½ç”¨äºŽä¸å¯å…·ä½“化的(non-reifiable)类型(æ¡ç›® 28)。 æ¢å¥è¯è¯´ï¼Œä½ å¯ä»¥ä¿å­˜ä½ æœ€å–œæ¬¢çš„ `String` 或 `String[]`,但ä¸èƒ½ä¿å­˜ `List`。 如果你å°è¯•ä¿å­˜ä½ æœ€å–œæ¬¢çš„ `List`,程åºå°†ä¸èƒ½ç¼–译。 åŽŸå› æ˜¯æ— æ³•èŽ·å– `List` çš„ `Class` 对象。 `List.class` 是语法错误,也是一件好事。 `List` å’Œ `List` 共享一个 `Class` å¯¹è±¡ï¼Œå³ `List.class`。 如果“字é¢ç±»åž‹ï¼ˆtype literals)â€`List .clas`s å’Œ `List.class` åˆæ³•å¹¶è¿”回相åŒçš„对象引用,那么它会对 `Favorites` 对象的内部造æˆä¸¥é‡ç ´å。 对于这ç§é™åˆ¶ï¼Œæ²¡æœ‰å®Œå…¨ä»¤äººæ»¡æ„的解决方法。 + +  `Favorites` 使用的类型令牌 type tokens) 是无é™åˆ¶çš„:`getFavorite` å’Œ `putFavorite` 接å—任何 `Class` 对象。 有时你å¯èƒ½éœ€è¦é™åˆ¶å¯ä¼ é€’给方法的类型。 è¿™å¯ä»¥é€šè¿‡ä¸€ä¸ªæœ‰é™å®šçš„类型令牌æ¥å®žçŽ°ï¼Œè¯¥ä»¤ç‰Œåªæ˜¯ä¸€ä¸ªç±»åž‹ä»¤ç‰Œï¼Œå®ƒä½¿ç”¨é™å®šçš„类型å‚数(æ¡ç›® 30)或é™å®šçš„通é…符(æ¡ç›® 31)æ¥æ”¾ç½®å¯ä»¥è¡¨ç¤ºçš„类型的边界。 + +  注解 API(æ¡ç›® 39)广泛使用é™å®šç±»åž‹çš„令牌。 例如,以下是在è¿è¡Œæ—¶è¯»å–注解的方法。 此方法æ¥è‡ª `AnnotatedElement` 接å£ï¼Œè¯¥æŽ¥å£ç”±è¡¨ç¤ºç±»ï¼Œæ–¹æ³•ï¼Œå±žæ€§å’Œå…¶ä»–程åºå…ƒç´ çš„å射类型实现: + +```Java +public + T getAnnotation(Class annotationType); +``` + +  å‚æ•° `annotationType` 是表示注解类型的é™å®šç±»åž‹ä»¤ç‰Œã€‚ 该方法返回该类型的元素的注解(如果它有一个);如果没有,则返回 `null`。 本质上,注解元素是一个类型安全的异构容器,其键是注解类型。 + +  å‡è®¾æœ‰ä¸€ä¸ª `Class` 类型的对象,并且想è¦å°†å®ƒä¼ é€’给需è¦é™å®šç±»åž‹ä»¤ç‰Œï¼ˆå¦‚ `getAnnotation`)的方法。 å¯ä»¥å°†å¯¹è±¡è½¬æ¢ä¸º `Class`,但是这个转æ¢æ²¡æœ‰è¢«æ£€æŸ¥ï¼Œæ‰€ä»¥å®ƒä¼šäº§ç”Ÿä¸€ä¸ªç¼–译时警告(æ¡ç›® 27)。 幸è¿çš„是,`Class` ç±»æ供了一ç§å®‰å…¨ï¼ˆåŠ¨æ€ï¼‰æ‰§è¡Œè¿™ç§ç±»åž‹è½¬æ¢çš„实例方法。 该方法被称为 `asSubclass`,并且它转æ¢æ‰€è°ƒç”¨çš„ `Class` 对象æ¥è¡¨ç¤ºç”±å…¶å‚数表示的类的å­ç±»ã€‚ 如果转æ¢æˆåŠŸï¼Œè¯¥æ–¹æ³•è¿”回它的å‚数;如果失败,则抛出 `ClassCastException` 异常。 + +  以下是如何使用 `asSubclass` 方法在编译时读å–类型未知的注解。 此方法编译时没有错误或警告: + +```Java +// Use of asSubclass to safely cast to a bounded type token +static Annotation getAnnotation(AnnotatedElement element, + String annotationTypeName) { + Class annotationType = null; // Unbounded type token + try { + annotationType = Class.forName(annotationTypeName); + } catch (Exception ex) { + throw new IllegalArgumentException(ex); + } + return element.getAnnotation( + annotationType.asSubclass(Annotation.class)); +} +``` + +  总之,泛型 API çš„é€šå¸¸ç”¨æ³•ï¼ˆä»¥é›†åˆ API 为例)é™åˆ¶äº†æ¯ä¸ªå®¹å™¨çš„固定数é‡çš„类型å‚数。 ä½ å¯ä»¥é€šè¿‡å°†ç±»åž‹å‚数放在键上而ä¸æ˜¯å®¹å™¨ä¸Šæ¥è§£å†³æ­¤é™åˆ¶ã€‚ å¯ä»¥ä½¿ç”¨ `Class` 对象作为此类型安全异构容器的键。 以这ç§æ–¹å¼ä½¿ç”¨çš„ `Class` 对象称为类型令牌。 也å¯ä»¥ä½¿ç”¨è‡ªå®šä¹‰é”®ç±»åž‹ã€‚ 例如,å¯ä»¥æœ‰ä¸€ä¸ªè¡¨ç¤ºæ•°æ®åº“行(容器)的 `DatabaseRow` 类型和一个泛型类型 `Column` 作为其键。 + + + + + diff --git a/docs/notes/34. 使用枚举类型替代整型常é‡.md b/docs/notes/34. 使用枚举类型替代整型常é‡.md new file mode 100644 index 0000000..6c1b66e --- /dev/null +++ b/docs/notes/34. 使用枚举类型替代整型常é‡.md @@ -0,0 +1,328 @@ + +  Java 支æŒä¸¤ç§å¼•ç”¨ç±»åž‹çš„特殊用途的系列:一ç§ç§°ä¸ºæžšä¸¾ç±»åž‹çš„类和一ç§ç§°ä¸ºæ³¨è§£ç±»åž‹çš„接å£ã€‚ 本章讨论使用这些类型系列的最佳实践。 + +# 34. ä½¿ç”¨æžšä¸¾ç±»åž‹æ›¿ä»£æ•´åž‹å¸¸é‡ + +  枚举是其åˆæ³•å€¼ç”±ä¸€ç»„固定的常é‡ç»„æˆçš„一ç§ç±»åž‹ï¼Œä¾‹å¦‚一年中的季节,太阳系中的行星或一副扑克牌中的套装。 在将枚举类型添加到该语言之å‰ï¼Œè¡¨ç¤ºæžšä¸¾ç±»åž‹çš„常è§æ¨¡å¼æ˜¯å£°æ˜Žä¸€ç»„å为 `int` 的常é‡ï¼Œæ¯ä¸ªç±»åž‹çš„æˆå‘˜éƒ½æœ‰ä¸€ä¸ªå¸¸é‡ï¼š + +```Java +// The int enum pattern - severely deficient! +public static final int APPLE_FUJI = 0; +public static final int APPLE_PIPPIN = 1; +public static final int APPLE_GRANNY_SMITH = 2; + +public static final int ORANGE_NAVEL = 0; +public static final int ORANGE_TEMPLE = 1; +public static final int ORANGE_BLOOD = 2;。 +``` +  这ç§è¢«ç§°ä¸º `int` 枚举模å¼çš„技术有许多缺点。 它没有æ供类型安全的方å¼ï¼Œä¹Ÿæ²¡æœ‰æ供任何表达力。 如果你将一个 `Apple` ä¼ é€’ç»™ä¸€ä¸ªéœ€è¦ `Orange` 的方法,那么编译器ä¸ä¼šå‡ºçŽ°è­¦å‘Šï¼Œè¿˜ä¼šç”¨ == è¿ç®—符比较 `Apple` 与 `Orange`,或者更糟糕的是: +```Java +// Tasty citrus flavored applesauce! +int i = (APPLE_FUJI - ORANGE_TEMPLE) / APPLE_PIPPIN; +``` +  请注æ„,æ¯ä¸ª `Apple` 常é‡çš„å称å‰ç¼€ä¸º `APPLE_`,æ¯ä¸ª `Orange` 常é‡çš„å称å‰ç¼€ä¸º `ORANGE_`。 这是因为 Java ä¸ä¸º `int` 枚举组æä¾›å称空间。 当两个 `int`a 枚举组具有相åŒçš„命å常é‡æ—¶ï¼Œå‰ç¼€å¯ä»¥é˜²æ­¢å称冲çªï¼Œä¾‹å¦‚在 `ELEMENT_MERCURY` å’Œ `PLANET_MERCURY` 之间。 + +  使用 `int` 枚举的程åºå¾ˆè„†å¼±ã€‚ 因为 `int` 枚举是编译时常é‡[JLS,4.12.4],所以它们的 `int` 值被编译到使用它们的客户端中[JLS,13.1]。 如果与 `int` 枚举关è”的值å‘生更改,则必须é‡æ–°ç¼–译其客户端。 如果没有,客户ä»ç„¶ä¼šè¿è¡Œï¼Œä½†ä»–们的行为将是ä¸æ­£ç¡®çš„。 + +  没有简å•çš„方法将 `int` 枚举常é‡è½¬æ¢ä¸ºå¯æ‰“å°çš„字符串。 如果你打å°è¿™æ ·ä¸€ä¸ªå¸¸é‡æˆ–者从调试器中显示出æ¥ï¼Œä½ çœ‹åˆ°çš„åªæ˜¯ä¸€ä¸ªæ•°å­—,这ä¸æ˜¯å¾ˆæœ‰ç”¨ã€‚ 没有å¯é çš„方法æ¥è¿­ä»£ç»„中的所有 `int` 枚举常é‡ï¼Œç”šè‡³æ— æ³•èŽ·å¾— `int` 枚举组的大å°ã€‚ + +  你å¯èƒ½ä¼šé‡åˆ°è¿™ç§æ¨¡å¼çš„å˜ä½“,其中使用了字符串常é‡æ¥ä»£æ›¿ `int` 常é‡ã€‚ è¿™ç§ç§°ä¸ºå­—符串枚举模å¼çš„å˜ä½“æ›´ä¸ç†æƒ³ã€‚ 尽管它为常é‡æ供了å¯æ‰“å°çš„字符串,但它å¯ä»¥å¯¼è‡´åˆçº§ç”¨æˆ·å°†å­—符串常é‡ç¡¬ç¼–ç ä¸ºå®¢æˆ·ç«¯ä»£ç ï¼Œè€Œä¸æ˜¯ä½¿ç”¨å±žæ€§å称。 如果这ç§ç¡¬ç¼–ç çš„字符串常é‡åŒ…å«ä¹¦å†™é”™è¯¯ï¼Œå®ƒå°†åœ¨ç¼–译时逃脱检测并导致è¿è¡Œæ—¶å‡ºçŽ°é”™è¯¯ã€‚ 此外,它å¯èƒ½ä¼šå¯¼è‡´æ€§èƒ½é—®é¢˜ï¼Œå› ä¸ºå®ƒä¾èµ–于字符串比较。 + +  幸è¿çš„是,Java æ供了一ç§é¿å… `int` å’Œ `String` 枚举模å¼çš„所有缺点的替代方法,并æ供了许多é¢å¤–的好处。 它是枚举类型[JLS,8.9]。 以下是它最简å•çš„å½¢å¼ï¼š + +```Java +public enum Apple { FUJI, PIPPIN, GRANNY_SMITH } +public enum Orange { NAVEL, TEMPLE, BLOOD } +``` + +  从表é¢ä¸Šçœ‹ï¼Œè¿™äº›æžšä¸¾ç±»åž‹å¯èƒ½çœ‹èµ·æ¥ä¸Žå…¶ä»–语言类似,比如 C,C++å’Œ C#,但事实并éžå¦‚此。 Java 的枚举类型是完整的类,比其他语言中的其他语言更强大,其枚举本质本上是 `int` 值。 + +  Java 枚举类型背åŽçš„基本æ€æƒ³å¾ˆç®€å•ï¼šå®ƒä»¬æ˜¯é€šè¿‡å…¬å…±é™æ€ `final` 属性为æ¯ä¸ªæžšä¸¾å¸¸é‡å¯¼å‡ºä¸€ä¸ªå®žä¾‹çš„类。 由于没有å¯è®¿é—®çš„构造方法,枚举类型实际上是 `final` 的。 由于客户既ä¸èƒ½åˆ›å»ºæžšä¸¾ç±»åž‹çš„实例也ä¸èƒ½ç»§æ‰¿å®ƒï¼Œé™¤äº†å£°æ˜Žçš„枚举常é‡å¤–,ä¸èƒ½æœ‰ä»»ä½•å®žä¾‹ã€‚ æ¢å¥è¯è¯´ï¼Œæžšä¸¾ç±»åž‹æ˜¯å®žä¾‹æŽ§åˆ¶çš„(第 6 页)。 它们是å•ä¾‹ï¼ˆæ¡ç›® 3)的泛型化,基本上是å•å…ƒç´ çš„枚举。 + +  枚举æ供了编译时类型的安全性。 如果声明一个å‚数为 `Apple` 类型,则å¯ä»¥ä¿è¯ä¼ é€’给该å‚数的任何éžç©ºå¯¹è±¡å¼•ç”¨æ˜¯ä¸‰ä¸ªæœ‰æ•ˆ `Apple` 值中的一个。 å°è¯•ä¼ é€’错误类型的值将导致编译时错误,因为会å°è¯•å°†ä¸€ä¸ªæžšä¸¾ç±»åž‹çš„表达å¼åˆ†é…ç»™å¦ä¸€ä¸ªç±»åž‹çš„å˜é‡ï¼Œæˆ–者使用 `==` è¿ç®—符æ¥æ¯”较ä¸åŒæžšä¸¾ç±»åž‹çš„值。 + +  具有相åŒå称常é‡çš„枚举类型å¯ä»¥å’Œå¹³å…±å­˜ï¼Œå› ä¸ºæ¯ç§ç±»åž‹éƒ½æœ‰å…¶è‡ªå·±çš„å称空间。 å¯ä»¥åœ¨æžšä¸¾ç±»åž‹ä¸­æ·»åŠ æˆ–é‡æ–°æŽ’åºå¸¸é‡ï¼Œè€Œæ— éœ€é‡æ–°ç¼–译其客户端,因为导出常é‡çš„属性在枚举类型与其客户端之间æ供了一层隔离:常é‡å€¼ä¸ä¼šç¼–译到客户端,因为它们ä½äºŽ `int` 枚举模å¼ä¸­ã€‚ 最åŽï¼Œå¯ä»¥é€šè¿‡è°ƒç”¨å…¶ `toString` 方法将枚举转æ¢ä¸ºå¯æ‰“å°çš„字符串。 + +  除了纠正 `int` 枚举的缺陷之外,枚举类型还å…许添加任æ„方法和属性并实现任æ„接å£ã€‚ 它们æ供了所有 `Object` 方法的高质é‡å®žçŽ°ï¼ˆç¬¬ 3 章),它们实现了 Compa`此处输入代ç `rable(æ¡ç›® 14)和 `Serializable`(第 12 章),并针对枚举类型的å¯ä»»æ„改å˜æ€§è®¾è®¡äº†åºåˆ—化方å¼ã€‚ + +  那么,为什么你è¦æ·»åŠ æ–¹æ³•æˆ–属性到一个枚举类型? 对于åˆå­¦è€…,å¯èƒ½æƒ³è¦å°†æ•°æ®ä¸Žå…¶å¸¸é‡å…³è”èµ·æ¥ã€‚ 例如,我们的 `Apple` å’Œ `Orange` 类型å¯èƒ½ä¼šä»Žè¿”回水果颜色的方法或返回水果图åƒçš„方法中å—益。 还å¯ä»¥ä½¿ç”¨ä»»ä½•çœ‹èµ·æ¥åˆé€‚的方法æ¥å¢žå¼ºæžšä¸¾ç±»åž‹ã€‚ 枚举类型å¯ä»¥ä½œä¸ºæžšä¸¾å¸¸é‡çš„简å•é›†åˆï¼Œå¹¶éšç€æ—¶é—´çš„推移而演å˜ä¸ºå…¨åŠŸèƒ½æŠ½è±¡ã€‚ + +  对于丰富的枚举类型的一个很好的例å­ï¼Œè€ƒè™‘我们太阳系的八颗行星。 æ¯ä¸ªè¡Œæ˜Ÿéƒ½æœ‰è´¨é‡å’ŒåŠå¾„,从这两个属性å¯ä»¥è®¡ç®—出它的表é¢é‡åŠ›ã€‚ 从而在给定物体的质é‡ä¸‹ï¼Œè®¡ç®—出一个物体在行星表é¢ä¸Šçš„é‡é‡ã€‚ 下é¢æ˜¯è¿™ä¸ªæžšä¸¾ç±»åž‹ã€‚ æ¯ä¸ªæžšä¸¾å¸¸é‡ä¹‹åŽçš„括å·ä¸­çš„数字是传递给其构造方法的å‚数。 在这ç§æƒ…况下,它们是地çƒçš„è´¨é‡å’ŒåŠå¾„: + +```Java +// Enum type with data and behavior +public enum Planet { + MERCURY(3.302e+23, 2.439e6), + VENUS (4.869e+24, 6.052e6), + EARTH (5.975e+24, 6.378e6), + MARS (6.419e+23, 3.393e6), + JUPITER(1.899e+27, 7.149e7), + SATURN (5.685e+26, 6.027e7), + URANUS (8.683e+25, 2.556e7), + NEPTUNE(1.024e+26, 2.477e7); + + private final double mass; // In kilograms + private final double radius; // In meters + private final double surfaceGravity; // In m / s^2 + // Universal gravitational constant in m^3 / kg s^2 + private static final double G = 6.67300E-11; + + // Constructor + Planet(double mass, double radius) { + this.mass = mass; + this.radius = radius; + surfaceGravity = G * mass / (radius * radius); + } + + public double mass() { return mass; } + public double radius() { return radius; } + public double surfaceGravity() { return surfaceGravity; } + + public double surfaceWeight(double mass) { + return mass * surfaceGravity; // F = ma + } +} +``` + +  编写一个丰富的枚举类型比如 `Planet` 很容易。 **è¦å°†æ•°æ®ä¸Žæžšä¸¾å¸¸é‡ç›¸å…³è”,请声明实例属性并编写一个构造方法,构造方法带有数æ®å¹¶å°†æ•°æ®ä¿å­˜åœ¨å±žæ€§ä¸­ã€‚** 枚举本质上是ä¸å˜çš„,所以所有的属性都应该是 `final` 的(æ¡ç›® 17)。 属性å¯ä»¥æ˜¯å…¬å¼€çš„,但最好将它们设置为ç§æœ‰å¹¶æ供公共访问方法(æ¡ç›® 16)。 在 `Planet` 的情况下,构造方法还计算和存储表é¢é‡åŠ›ï¼Œä½†è¿™åªæ˜¯ä¸€ç§ä¼˜åŒ–。 æ¯å½“é‡åŠ›è¢« `SurfaceWeight` 方法使用时,它å¯ä»¥ä»Žè´¨é‡å’ŒåŠå¾„é‡æ–°è®¡ç®—出æ¥ï¼Œè¯¥æ–¹æ³•è¿”回它在由常数表示的行星上的é‡é‡ã€‚ + +  虽然 `Planet` 枚举很简å•ï¼Œä½†å®ƒçš„功能éžå¸¸å¼ºå¤§ã€‚ 这是一个简短的程åºï¼Œå®ƒå°†ä¸€ä¸ªç‰©ä½“在地çƒä¸Šçš„é‡é‡ï¼ˆä»»ä½•å•ä½ï¼‰ï¼Œæ‰“å°ä¸€ä¸ªæ¼‚亮的表格,显示该物体在所有八个行星上的é‡é‡ï¼ˆä»¥ç›¸åŒå•ä½ï¼‰ï¼š + +```Java +public class WeightTable { + public static void main(String[] args) { + double earthWeight = Double.parseDouble(args[0]); + double mass = earthWeight / Planet.EARTH.surfaceGravity(); + for (Planet p : Planet.values()) + System.out.printf("Weight on %s is %f%n", + p, p.surfaceWeight(mass)); + } +} +``` + +  请注æ„,`Planet` 和所有枚举一样,都有一个é™æ€ `values` 方法,该方法以声明的顺åºè¿”回其值的数组。 å¦è¯·æ³¨æ„,`toString` 方法返回æ¯ä¸ªæžšä¸¾å€¼çš„声明å称,使 `println` å’Œ `printf` å¯ä»¥è½»æ¾æ‰“å°ã€‚ 如果你对此字符串表示形å¼ä¸æ»¡æ„,å¯ä»¥é€šè¿‡é‡å†™ `toString` 方法æ¥æ›´æ”¹å®ƒã€‚ 这是使用命令行å‚æ•° 185 è¿è¡Œ `WeightTable` 程åºï¼ˆä¸é‡å†™ `toString`)的结果: + +```Java +Weight on MERCURY is 69.912739 +Weight on VENUS is 167.434436 +Weight on EARTH is 185.000000 +Weight on MARS is 70.226739 +Weight on JUPITER is 467.990696 +Weight on SATURN is 197.120111 +Weight on URANUS is 167.398264 +Weight on NEPTUNE is 210.208751 +``` + +  直到 2006 年,在 Java 中加入枚举两年之åŽï¼Œå†¥çŽ‹æ˜Ÿä¸å†æ˜¯ä¸€é¢—行星。 这引å‘了一个问题:“当你从枚举类型中移除一个元素时会å‘生什么?â€ç­”案是,任何ä¸å¼•ç”¨ç§»é™¤å…ƒç´ çš„客户端程åºéƒ½å°†ç»§ç»­æ­£å¸¸å·¥ä½œã€‚ 所以,举例æ¥è¯´ï¼Œæˆ‘们的 `WeightTable` 程åºåªéœ€è¦æ‰“å°ä¸€è¡Œå°‘一行的表格。 什么是客户端程åºå¼•ç”¨åˆ é™¤çš„元素(在这ç§æƒ…况下,`Planet.Pluto`)? 如果é‡æ–°ç¼–译客户端程åºï¼Œç¼–译将会失败并在引用å‰ä¸€ä¸ªæ˜Ÿçƒçš„行处æ供有用的错误消æ¯; 如果无法é‡æ–°ç¼–译客户端,它将在è¿è¡Œæ—¶ä»Žæ­¤è¡Œä¸­å¼•å‘有用的异常。 这是你所希望的最好的行为,远远好于你用 `int` 枚举模å¼å¾—到的结果。 + +  一些与枚举常é‡ç›¸å…³çš„行为åªéœ€è¦åœ¨å®šä¹‰æžšä¸¾çš„类或包中使用。 这些行为最好以ç§æœ‰æˆ–包级ç§æœ‰æ–¹å¼å®žçŽ°ã€‚ 然åŽæ¯ä¸ªå¸¸é‡æºå¸¦ä¸€ä¸ªéšè—的行为集åˆï¼Œå…许包å«æžšä¸¾çš„类或包在与常é‡ä¸€èµ·å‘ˆçŽ°æ—¶ä½œå‡ºé€‚当的å应。 与其他类一样,除éžä½ æœ‰ä¸€ä¸ªä»¤äººä¿¡æœçš„ç†ç”±å°†æžšä¸¾æ–¹æ³•æš´éœ²ç»™å®ƒçš„客户端,å¦åˆ™å°†å…¶å£°æ˜Žä¸ºç§æœ‰çš„,如果需è¦çš„è¯å°†å…¶å£°æ˜Žä¸ºåŒ…级ç§æœ‰ï¼ˆæ¡ç›® 15)。 + +  如果一个枚举是广泛使用的,它应该是一个顶级类; 如果它的使用与特定的顶级类绑定,它应该是该顶级类的æˆå‘˜ç±»ï¼ˆæ¡ç›® 24)。 例如,`java.math.RoundingMode` 枚举表示å°æ•°éƒ¨åˆ†çš„èˆå…¥æ¨¡å¼ã€‚ `BigDecimal` 类使用了这些èˆå…¥æ¨¡å¼ï¼Œä½†å®ƒä»¬æ供了一ç§æœ‰ç”¨çš„抽象,它并ä¸ä¸Ž `BigDecimal` 有根本的è”系。 通过将 `RoundingMode` 设置为顶层枚举,类库设计人员鼓励任何需è¦èˆå…¥æ¨¡å¼çš„程åºå‘˜é‡ç”¨æ­¤æžšä¸¾ï¼Œä»Žè€Œæ高跨 `API` 的一致性。 + +```Java +// Enum type that switches on its own value - questionable +public enum Operation { + PLUS, MINUS, TIMES, DIVIDE; + + // Do the arithmetic operation represented by this constant + public double apply(double x, double y) { + switch(this) { + case PLUS: return x + y; + case MINUS: return x - y; + case TIMES: return x * y; + case DIVIDE: return x / y; + } + throw new AssertionError("Unknown op: " + this); + } +} +``` + +  此代ç æœ‰æ•ˆï¼Œä½†ä¸æ˜¯å¾ˆæ¼‚亮。 如果没有 `throw` 语å¥ï¼Œå°±ä¸èƒ½ç¼–译,因为该方法的结æŸåœ¨æŠ€æœ¯ä¸Šæ˜¯å¯è¾¾åˆ°çš„,尽管它永远ä¸ä¼šè¢«è¾¾åˆ°[JLS,14.21]。 更糟的是,代ç å¾ˆè„†å¼±ã€‚ 如果添加新的枚举常é‡ï¼Œä½†å¿˜è®°å‘ `switch` 语å¥æ·»åŠ ç›¸åº”çš„æ¡ä»¶ï¼Œæžšä¸¾ä»ç„¶ä¼šç¼–译,但在å°è¯•åº”用新æ“作时,它将在è¿è¡Œæ—¶å¤±è´¥ã€‚ + +  幸è¿çš„是,有一ç§æ›´å¥½çš„方法å¯ä»¥å°†ä¸åŒçš„行为与æ¯ä¸ªæžšä¸¾å¸¸é‡å…³è”èµ·æ¥ï¼šåœ¨æžšä¸¾ç±»åž‹ä¸­å£°æ˜Žä¸€ä¸ªæŠ½è±¡çš„ apply 方法,并用常é‡ç‰¹å®šçš„类主体中的æ¯ä¸ªå¸¸é‡çš„具体方法é‡å†™å®ƒã€‚ è¿™ç§æ–¹æ³•è¢«ç§°ä¸ºç‰¹å®šäºŽå¸¸é‡ï¼ˆconstant-specific)的方法实现: + +```Java +// Enum type with constant-specific method implementations +public enum Operation { + PLUS {public double apply(double x, double y){return x + y;}}, + MINUS {public double apply(double x, double y){return x - y;}}, + TIMES {public double apply(double x, double y){return x * y;}}, + DIVIDE{public double apply(double x, double y){return x / y;}}; + + public abstract double apply(double x, double y); +} +``` + +  如果å‘第二个版本的æ“作添加新的常é‡ï¼Œåˆ™ä¸å¤ªå¯èƒ½ä¼šå¿˜è®°æä¾› `apply` 方法,因为该方法紧跟在æ¯ä¸ªå¸¸é‡å£°æ˜Žä¹‹åŽã€‚ 万一忘记了,编译器会æ醒你,因为枚举类型中的抽象方法必须被所有常é‡ä¸­çš„具体方法é‡å†™ã€‚ + +  特定于常é‡çš„方法实现å¯ä»¥ä¸Žç‰¹å®šäºŽå¸¸é‡çš„æ•°æ®ç»“åˆä½¿ç”¨ã€‚ 例如,以下是 `Operation` 的一个版本,它é‡å†™ `toString` 方法以返回通常与该æ“作关è”的符å·ï¼š + +```Java +// Enum type with constant-specific class bodies and data +public enum Operation { + PLUS("+") { + public double apply(double x, double y) { return x + y; } + }, + MINUS("-") { + public double apply(double x, double y) { return x - y; } + }, + TIMES("*") { + public double apply(double x, double y) { return x * y; } + }, + DIVIDE("/") { + public double apply(double x, double y) { return x / y; } + }; + + private final String symbol; + + Operation(String symbol) { this.symbol = symbol; } + + @Override public String toString() { return symbol; } + + public abstract double apply(double x, double y); +} +``` + +  显示的 `toString` 实现å¯ä»¥å¾ˆå®¹æ˜“地打å°ç®—术表达å¼ï¼Œæ­£å¦‚这个å°ç¨‹åºæ‰€å±•ç¤ºçš„那样: + +```Java +public static void main(String[] args) { + double x = Double.parseDouble(args[0]); + double y = Double.parseDouble(args[1]); + for (Operation op : Operation.values()) + System.out.printf("%f %s %f = %f%n", + x, op, y, op.apply(x, y)); +} +``` + +  以 2 å’Œ 4 作为命令行å‚æ•°è¿è¡Œæ­¤ç¨‹åºä¼šç”Ÿæˆä»¥ä¸‹è¾“出: + +```Java +2.000000 + 4.000000 = 6.000000 +2.000000 - 4.000000 = -2.000000 +2.000000 * 4.000000 = 8.000000 +2.000000 / 4.000000 = 0.500000 +``` + +  枚举类型具有自动生æˆçš„ `valueOf(String)` 方法,该方法将常é‡å称转æ¢ä¸ºå¸¸é‡æœ¬èº«ã€‚ 如果在枚举类型中é‡å†™ `toString` 方法,请考虑编写 `fromString` 方法将自定义字符串表示法转æ¢å›žç›¸åº”的枚举类型。 下é¢çš„代ç ï¼ˆç±»åž‹å称被适当地改å˜ï¼‰å°†å¯¹ä»»ä½•æžšä¸¾éƒ½æœ‰æ•ˆï¼Œåªè¦æ¯ä¸ªå¸¸é‡å…·æœ‰å”¯ä¸€çš„字符串表示形å¼ï¼š + +```Java +// Implementing a fromString method on an enum type +private static final Map stringToEnum = + Stream.of(values()).collect( + toMap(Object::toString, e -> e)); + +// Returns Operation for string, if any +public static Optional fromString(String symbol) { + return Optional.ofNullable(stringToEnum.get(symbol)); +} +``` + +  请注æ„,`Operation` 枚举常é‡è¢«æ”¾åœ¨ `stringToEnum` çš„ `map` 中,它æ¥è‡ªäºŽåˆ›å»ºæžšä¸¾å¸¸é‡åŽè¿è¡Œçš„é™æ€å±žæ€§åˆå§‹åŒ–。å‰é¢çš„代ç åœ¨ `values()` 方法返回的数组上使用æµï¼ˆç¬¬ 7 章);在 Java 8 之å‰ï¼Œæˆ‘们创建一个空的 `hashMap` 并é历值数组,将字符串到枚举映射æ’入到 `map` 中,如果愿æ„,ä»ç„¶å¯ä»¥è¿™æ ·åšã€‚但请注æ„,å°è¯•è®©æ¯ä¸ªå¸¸é‡éƒ½å°†è‡ªå·±æ”¾å…¥æ¥è‡ªå…¶æž„造方法的 `map` 中ä¸èµ·ä½œç”¨ã€‚这会导致编译错误,这是好事,因为如果它是åˆæ³•çš„,它会在è¿è¡Œæ—¶å¯¼è‡´ `NullPointerException`。除了编译时常é‡å±žæ€§ï¼ˆæ¡ç›® 34)之外,枚举构造方法ä¸å…许访问枚举的é™æ€å±žæ€§ã€‚æ­¤é™åˆ¶æ˜¯å¿…需的,因为é™æ€å±žæ€§åœ¨æžšä¸¾æž„造方法è¿è¡Œæ—¶å°šæœªåˆå§‹åŒ–。这ç§é™åˆ¶çš„一个特例是枚举常é‡ä¸èƒ½ä»Žæž„造方法中相互访问。 + +  å¦è¯·æ³¨æ„,`fromString` 方法返回一个 `Optional`。 è¿™å…许该方法指示传入的字符串ä¸ä»£è¡¨æœ‰æ•ˆçš„æ“作,并且强制客户端é¢å¯¹è¿™ç§å¯èƒ½æ€§ï¼ˆæ¡ç›® 55)。 + +  特定于常é‡çš„方法实现的一个缺点是它们使得难以在枚举常é‡ä¹‹é—´å…±äº«ä»£ç ã€‚ 例如,考虑一个代表工资包中的工作天数的枚举。 该枚举有一个方法,根æ®å·¥äººçš„基本工资(æ¯å°æ—¶ï¼‰å’Œå½“天工作的分钟数计算当天工人的工资。 在五个工作日内,任何超过正常工作时间的工作都会产生加ç­è´¹; 在两个周末的日å­é‡Œï¼Œæ‰€æœ‰å·¥ä½œéƒ½ä¼šäº§ç”ŸåŠ ç­è´¹ã€‚ 使用 `switch` 语å¥ï¼Œé€šè¿‡å°†å¤šä¸ª `case` 标签应用于两个代ç ç‰‡æ®µä¸­çš„æ¯ä¸€ä¸ªï¼Œå¯ä»¥è½»æ¾å®Œæˆæ­¤è®¡ç®—: + +```Java +// Enum that switches on its value to share code - questionable +enum PayrollDay { + MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, + SATURDAY, SUNDAY; + + private static final int MINS_PER_SHIFT = 8 * 60; + + int pay(int minutesWorked, int payRate) { + int basePay = minutesWorked * payRate; + + int overtimePay; + switch(this) { + case SATURDAY: case SUNDAY: // Weekend + overtimePay = basePay / 2; + break; + default: // Weekday + overtimePay = minutesWorked <= MINS_PER_SHIFT ? + 0 : (minutesWorked - MINS_PER_SHIFT) * payRate / 2; + } + + return basePay + overtimePay; + } +} +``` + +  这段代ç æ— å¯å¦è®¤æ˜¯ç®€æ´çš„,但从维护的角度æ¥çœ‹æ˜¯å±é™©çš„。 å‡è®¾ä½ ç»™æžšä¸¾æ·»åŠ äº†ä¸€ä¸ªå…ƒç´ ï¼Œå¯èƒ½æ˜¯ä¸€ä¸ªç‰¹æ®Šçš„值æ¥è¡¨ç¤ºä¸€ä¸ªå‡æœŸï¼Œä½†å¿˜è®°åœ¨ `switch` 语å¥ä¸­æ·»åŠ ä¸€ä¸ªç›¸åº”çš„ `case` æ¡ä»¶ã€‚ 该程åºä»ç„¶ä¼šç¼–译,但付费方法会默默地为工作日支付相åŒæ•°é‡çš„休å‡æ—¥ï¼Œä¸Žæ™®é€šå·¥ä½œæ—¥ç›¸åŒã€‚ + +  è¦ä½¿ç”¨ç‰¹å®šäºŽå¸¸é‡çš„方法实现安全地执行工资计算,必须为æ¯ä¸ªå¸¸é‡é‡å¤åŠ ç­å·¥èµ„计算,或将计算移至两个辅助方法,一个用于工作日,å¦ä¸€ä¸ªç”¨äºŽå‘¨æœ«ï¼Œå¹¶è°ƒç”¨é€‚当的辅助方法æ¥è‡ªæ¯ä¸ªå¸¸é‡ã€‚ 这两ç§æ–¹æ³•éƒ½ä¼šäº§ç”Ÿç›¸å½“æ•°é‡çš„æ ·æ¿ä»£ç ï¼Œå¤§å¤§é™ä½Žäº†å¯è¯»æ€§å¹¶å¢žåŠ äº†å‡ºé”™æœºä¼šã€‚ + +  通过使用执行加ç­è®¡ç®—çš„å…·ä½“æ–¹æ³•æ›¿æ¢ `PayrollDay` 上的抽象 `overtimePay` 方法,å¯ä»¥å‡å°‘æ ·æ¿ã€‚ 那么åªæœ‰å‘¨æœ«çš„æ—¥å­å¿…é¡»é‡å†™è¯¥æ–¹æ³•ã€‚ 但是,这与 `switch` 语å¥å…·æœ‰ç›¸åŒçš„缺点:如果在ä¸é‡å†™ `overtimePay` 方法的情况下添加å¦ä¸€å¤©ï¼Œåˆ™ä¼šé»˜é»˜ç»§æ‰¿å‘¨æ—¥è®¡ç®—æ–¹å¼ã€‚ + +  你真正想è¦çš„是æ¯æ¬¡æ·»åŠ æžšä¸¾å¸¸é‡æ—¶è¢«è¿«é€‰æ‹©åŠ ç­è´¹ç­–略。 幸è¿çš„是,有一个很好的方法æ¥å®žçŽ°è¿™ä¸€ç‚¹ã€‚ 这个想法是将加ç­è´¹è®¡ç®—移入ç§æœ‰åµŒå¥—枚举中,并将此策略枚举的实例传递给 `PayrollDay` 枚举的构造方法。 然åŽï¼Œ`PayrollDay` 枚举将加ç­å·¥èµ„计算委托给策略枚举,从而无需在 `PayrollDay` 中实现 `switch` 语å¥æˆ–特定于常é‡çš„方法实现。 虽然这ç§æ¨¡å¼ä¸å¦‚ `switch` 语å¥ç®€æ´ï¼Œä½†å®ƒæ›´å®‰å…¨ï¼Œæ›´çµæ´»ï¼š + +```Java +// The strategy enum pattern +enum PayrollDay { + MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, + SATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND); + + private final PayType payType; + + PayrollDay(PayType payType) { this.payType = payType; } + PayrollDay() { this(PayType.WEEKDAY); } // Default + + int pay(int minutesWorked, int payRate) { + return payType.pay(minutesWorked, payRate); + } + + // The strategy enum type + private enum PayType { + WEEKDAY { + int overtimePay(int minsWorked, int payRate) { + return minsWorked <= MINS_PER_SHIFT ? 0 : + (minsWorked - MINS_PER_SHIFT) * payRate / 2; + } + }, + WEEKEND { + int overtimePay(int minsWorked, int payRate) { + return minsWorked * payRate / 2; + } + }; + + abstract int overtimePay(int mins, int payRate); + private static final int MINS_PER_SHIFT = 8 * 60; + + int pay(int minsWorked, int payRate) { + int basePay = minsWorked * payRate; + return basePay + overtimePay(minsWorked, payRate); + } + } +} +``` + +  如果对枚举的 `switch` 语å¥ä¸æ˜¯å®žçŽ°å¸¸é‡ç‰¹å®šè¡Œä¸ºçš„好选择,那么它们有什么好处呢?枚举类型的 `switch` 有利于用常é‡ç‰¹å®šçš„行为增加枚举类型。例如,å‡è®¾ `Operation` 枚举ä¸åœ¨ä½ çš„控制之下,你希望它有一个实例方法æ¥è¿”回æ¯ä¸ªç›¸åçš„æ“作。你å¯ä»¥ç”¨ä»¥ä¸‹é™æ€æ–¹æ³•æ¨¡æ‹Ÿæ•ˆæžœ: + +```Java +// Switch on an enum to simulate a missing method +public static Operation inverse(Operation op) { + switch(op) { + case PLUS: return Operation.MINUS; + case MINUS: return Operation.PLUS; + case TIMES: return Operation.DIVIDE; + case DIVIDE: return Operation.TIMES; + default: throw new AssertionError("Unknown op: " + op); + } +} +``` + +  如果æŸä¸ªæ–¹æ³•ä¸å±žäºŽæžšä¸¾ç±»åž‹ï¼Œåˆ™è¿˜åº”该在你控制的枚举类型上使用此技术。 该方法å¯èƒ½éœ€è¦ç”¨äºŽæŸäº›ç”¨é€”,但通常ä¸è¶³ä»¥ç”¨äºŽåˆ—入枚举类型。 + +  一般而言,枚举通常在性能上与 `int` 常数相当。 枚举的一个å°å°çš„性能缺点是加载和åˆå§‹åŒ–枚举类型存在空间和时间æˆæœ¬ï¼Œä½†åœ¨å®žè·µä¸­ä¸å¤ªå¯èƒ½å¼•äººæ³¨æ„。 + +  那么你应该什么时候使用枚举呢? 任何时候使用枚举都需è¦ä¸€ç»„常é‡ï¼Œè¿™äº›å¸¸é‡çš„æˆå‘˜åœ¨ç¼–译时已知。 当然,这包括“天然枚举类型â€ï¼Œå¦‚行星,星期几和棋å­ã€‚ 但是它也包å«äº†å…¶å®ƒä½ å·²ç»çŸ¥é“编译时所有å¯èƒ½å€¼çš„集åˆï¼Œä¾‹å¦‚èœå•ä¸Šçš„选项,æ“作代ç å’Œå‘½ä»¤è¡Œæ ‡å¿—。 **一个枚举类型中的常é‡é›†ä¸éœ€è¦ä¸€ç›´ä¿æŒä¸å˜**。 枚举功能是专门设计用于å…许二进制兼容的枚举类型的演å˜ã€‚ + +  总之,枚举类型优于 `int` 常é‡çš„优点是令人信æœçš„。 枚举更具å¯è¯»æ€§ï¼Œæ›´å®‰å…¨ï¼Œæ›´å¼ºå¤§ã€‚ 许多枚举ä¸éœ€è¦æ˜¾å¼æž„造方法或æˆå‘˜ï¼Œä½†å…¶ä»–人则å¯ä»¥é€šè¿‡å°†æ•°æ®ä¸Žæ¯ä¸ªå¸¸é‡å…³è”并æ供行为å—此数æ®å½±å“的方法而å—益。 使用å•ä¸€æ–¹æ³•å…³è”多个行为å¯ä»¥å‡å°‘枚举。 在这ç§ç›¸å¯¹ç½•è§çš„情况下,更喜欢使用常é‡ç‰¹å®šçš„方法æ¥æžšä¸¾è‡ªå·±çš„值。 如果一些(但ä¸æ˜¯å…¨éƒ¨ï¼‰æžšä¸¾å¸¸é‡å…±äº«å…±åŒè¡Œä¸ºï¼Œè¯·è€ƒè™‘策略枚举模å¼ã€‚ + + + + + + diff --git a/docs/notes/35. 使用实例属性替代åºæ•°.md b/docs/notes/35. 使用实例属性替代åºæ•°.md new file mode 100644 index 0000000..032df0e --- /dev/null +++ b/docs/notes/35. 使用实例属性替代åºæ•°.md @@ -0,0 +1,37 @@ +# 35. 使用实例属性替代åºæ•° + +  许多枚举通常与å•ä¸ª `int` 值关è”。所有枚举都有一个 `ordinal` 方法,它返回æ¯ä¸ªæžšä¸¾å¸¸é‡ç±»åž‹çš„数值ä½ç½®ã€‚ä½ å¯èƒ½æƒ³ä»Žåºæ•°ä¸­æ´¾ç”Ÿä¸€ä¸ªå…³è”çš„ `int` 值: + +```Java +// Abuse of ordinal to derive an associated value - DON'T DO THIS +public enum Ensemble { + SOLO, DUET, TRIO, QUARTET, QUINTET, + SEXTET, SEPTET, OCTET, NONET, DECTET; + + public int numberOfMusicians() { return ordinal() + 1; } +} +``` + +  虽然这个枚举能正常工作,但对于维护æ¥è¯´åˆ™æ˜¯ä¸€åœºå™©æ¢¦ã€‚如果常é‡è¢«é‡æ–°æŽ’åºï¼Œ`numberOfMusicians` 方法将会中断。 如果你想添加一个与你已ç»ä½¿ç”¨çš„ `int` 值相关的第二个枚举常é‡ï¼Œåˆ™æ²¡æœ‰é‚£ä¹ˆå¥½è¿äº†ã€‚ 例如,为åŒå››é‡å¥ï¼ˆdouble quartet)添加一个常é‡å¯èƒ½ä¼šå¾ˆå¥½ï¼Œå®ƒå°±åƒå…«é‡å¥ä¸€æ ·ï¼Œç”± 8 ä½æ¼”å¥å®¶ç»„æˆï¼Œä½†æ˜¯æ²¡æœ‰åŠžæ³•åšåˆ°è¿™ä¸€ç‚¹ã€‚ + +  此外,如果没有给所有这些 `int` 值添加常é‡ï¼Œä¹Ÿä¸èƒ½ä¸ºæŸä¸ª `int` 值添加一个常é‡ã€‚例如,å‡è®¾ä½ æƒ³è¦æ·»åŠ ä¸€ä¸ªå¸¸é‡ï¼Œè¡¨ç¤ºä¸€ä¸ªç”± 12 ä½æ¼”å¥å®¶ç»„æˆçš„三é‡å››é‡å¥ï¼ˆtriple quartet)。对于由 11 个演å¥å®¶ç»„æˆçš„åˆå¥æ›²ï¼Œå¹¶æ²¡æœ‰æ ‡å‡†çš„术语,因此你ä¸å¾—ä¸ä¸ºæœªä½¿ç”¨çš„ `int` 值(11)添加一个虚拟常é‡ï¼ˆdummy constant)。最多看起æ¥å°±æ˜¯æœ‰äº›ä¸å¥½çœ‹ã€‚如果许多 `int` 值是未使用的,则是ä¸åˆ‡å®žé™…的。 + +  幸è¿çš„是,这些问题有一个简å•çš„解决方案。 **永远ä¸è¦ä»Žæžšä¸¾çš„åºå·ä¸­å¾—出与它相关的值; 请将其ä¿å­˜åœ¨å®žä¾‹å±žæ€§ä¸­ï¼š** + +```Java +public enum Ensemble { + SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5), + SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8), + NONET(9), DECTET(10), TRIPLE_QUARTET(12); + + private final int numberOfMusicians; + + Ensemble(int size) { this.numberOfMusicians = size; } + public int numberOfMusicians() { return numberOfMusicians; } +} +``` + +  枚举规范对此 `ordinal` 方法说é“:“大多数程åºå‘˜å¯¹è¿™ç§æ–¹æ³•æ²¡æœ‰ç”¨å¤„。 它被设计用于基于枚举的通用数æ®ç»“构,如 `EnumSet` å’Œ `EnumMap`。“除éžä½ åœ¨ç¼–写这样数æ®ç»“构的代ç ï¼Œå¦åˆ™æœ€å¥½é¿å…使用 `ordinal` 方法。 + + + diff --git a/docs/notes/36. 使用EnumSet替代ä½å±žæ€§.md b/docs/notes/36. 使用EnumSet替代ä½å±žæ€§.md new file mode 100644 index 0000000..df869f6 --- /dev/null +++ b/docs/notes/36. 使用EnumSet替代ä½å±žæ€§.md @@ -0,0 +1,52 @@ +# 36. 使用 EnumSet 替代ä½å±žæ€§ + +  如果枚举类型的元素主è¦ç”¨äºŽé›†åˆä¸­ï¼Œä¸€èˆ¬æ¥è¯´ä½¿ç”¨ int 枚举模å¼ï¼ˆæ¡ç›® 34),下é¢å°† 2 çš„ä¸åŒå€æ•°èµ‹å€¼ç»™æ¯ä¸ªå¸¸é‡ï¼š + +```Java +// Bit field enumeration constants - OBSOLETE! +public class Text { + public static final int STYLE_BOLD = 1 << 0; // 1 + public static final int STYLE_ITALIC = 1 << 1; // 2 + public static final int STYLE_UNDERLINE = 1 << 2; // 4 + public static final int STYLE_STRIKETHROUGH = 1 << 3; // 8 + + // Parameter is bitwise OR of zero or more STYLE_ constants + public void applyStyles(int styles) { ... } +} +``` + +  这ç§è¡¨ç¤ºæ–¹å¼å…许你使用按ä½æˆ–(or)è¿ç®—将几个常é‡åˆå¹¶åˆ°ä¸€ä¸ªç§°ä¸ºä½å±žæ€§ï¼ˆbit field)的集åˆä¸­ï¼š + +```Java +text.applyStyles(STYLE_BOLD | STYLE_ITALIC); +``` + +  ä½å±žæ€§è¡¨ç¤ºè¿˜å…许你使用按ä½ç®—术有效地执行集åˆè¿ç®—,如并集和交集。 但是ä½å±žæ€§å…·æœ‰ `int` 枚举常é‡ç­‰çš„所有缺点。 当打å°ä¸ºæ•°å­—时,解释ä½å±žæ€§æ¯”简å•çš„ `int` 枚举常é‡æ›´éš¾ç†è§£ã€‚ 没有简å•çš„方法é历所有由ä½å±žæ€§è¡¨ç¤ºçš„元素。 最åŽï¼Œå¿…须预测在编写 API 时需è¦çš„最大ä½æ•°ï¼Œå¹¶ç›¸åº”地为ä½å±žæ€§ï¼ˆé€šå¸¸ä¸º `int` 或 `long`)选择一ç§ç±»åž‹ã€‚ 一旦你选择了一个类型,你就ä¸èƒ½è¶…过它的宽度(32 或 64 ä½ï¼‰è€Œä¸æ”¹å˜ API。 + +  一些程åºå‘˜ä½¿ç”¨æžšä¸¾ä¼˜äºŽ `int` 常é‡ï¼Œå½“他们需è¦ä¼ é€’常é‡é›†åˆæ—¶ä»ç„¶ä½¿ç”¨ä½å±žæ€§ã€‚ 没有ç†ç”±è¿™æ ·åšï¼Œå› ä¸ºå­˜åœ¨æ›´å¥½çš„选择。 `java.util` 包æ供了 `EnumSet` ç±»æ¥æœ‰æ•ˆåœ°è¡¨ç¤ºä»Žå•ä¸ªæžšä¸¾ç±»åž‹ä¸­æå–的值集åˆã€‚ 这个类实现了 `Set` 接å£ï¼Œæ供了所有其他 `Set` 实现的丰富性,类型安全性和互æ“作性。 但是在内部,æ¯ä¸ª `EnumSet` 都表示为一个ä½çŸ¢é‡ï¼ˆbit vector)。 如果底层的枚举类型有 64 个或更少的元素,并且大多数情况下,整个 `EnumSet` 用å•ä¸ª `long` 表示,所以它的性能与ä½å±žæ€§çš„性能相当。 批é‡æ“作(如 `removeAll` å’Œ `retainAll`)是使用按ä½ç®—术实现的,就åƒä½ ä¸ºä½å±žæ€§æ‰‹åŠ¨æ“作一样。 但是完全é¿å…了手动ä½æ··ä¹±çš„丑陋和错误倾å‘:`EnumSet` 为你åšäº†å¾ˆå¤§çš„努力。 + +  下é¢æ˜¯å‰ä¸€ä¸ªä½¿ç”¨æžšä¸¾å’Œæžšä¸¾é›†åˆæ›¿ä»£ä½å±žæ€§çš„示例。 它更短,更清晰,更安全: + +```Java +// EnumSet - a modern replacement for bit fields +public class Text { + public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH } + + // Any Set could be passed in, but EnumSet is clearly best + public void applyStyles(Set