Repository: PrismJS/prism Branch: v2 Commit: 969595530787 Files: 3077 Total size: 5.1 MB Directory structure: gitextract_l38tlemh/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── config.yml │ │ ├── feature_request.md │ │ ├── highlighting-bug-report.md │ │ └── new-language-request.md │ ├── dependabot.yml │ └── workflows/ │ ├── danger.yml │ ├── test.yml │ └── website-rebuild.yml ├── .gitignore ├── .jsdoc.json ├── .npmignore ├── .prettierrc.js ├── .vscode/ │ └── settings.json ├── CHANGELOG.md ├── CNAME ├── LICENSE ├── MAINTAINERS.md ├── README.md ├── SECURITY.md ├── _headers ├── benchmark/ │ ├── benchmark.js │ └── config.js ├── composer.json ├── dangerfile.js ├── eslint.config.mjs ├── package.json ├── scripts/ │ ├── build.js │ ├── create-changelog.js │ ├── linkify-changelog.js │ └── tasks.js ├── src/ │ ├── auto-start.js │ ├── components.json │ ├── config.js │ ├── core/ │ │ ├── classes/ │ │ │ ├── component-registry.js │ │ │ ├── hooks.js │ │ │ ├── language-registry.js │ │ │ ├── language.js │ │ │ ├── list.js │ │ │ ├── plugin-registry.js │ │ │ ├── plugin.js │ │ │ ├── prism.js │ │ │ └── token.js │ │ ├── highlight-all.js │ │ ├── highlight-element.js │ │ ├── highlight.js │ │ ├── linked-list.js │ │ ├── prism.js │ │ ├── registry.js │ │ ├── stringify.js │ │ └── tokenize/ │ │ ├── match.js │ │ ├── tokenize.js │ │ └── util.js │ ├── core.js │ ├── global.js │ ├── index.js │ ├── languages/ │ │ ├── abap.js │ │ ├── abnf.js │ │ ├── actionscript.js │ │ ├── ada.js │ │ ├── agda.js │ │ ├── al.js │ │ ├── antlr4.js │ │ ├── apacheconf.js │ │ ├── apex.js │ │ ├── apl.js │ │ ├── applescript.js │ │ ├── aql.js │ │ ├── arduino.js │ │ ├── arff.js │ │ ├── armasm.js │ │ ├── arturo.js │ │ ├── asciidoc.js │ │ ├── asm6502.js │ │ ├── asmatmel.js │ │ ├── aspnet.js │ │ ├── autohotkey.js │ │ ├── autoit.js │ │ ├── avisynth.js │ │ ├── avro-idl.js │ │ ├── awk.js │ │ ├── bash.js │ │ ├── basic.js │ │ ├── batch.js │ │ ├── bbcode.js │ │ ├── bbj.js │ │ ├── bicep.js │ │ ├── birb.js │ │ ├── bison.js │ │ ├── bnf.js │ │ ├── bqn.js │ │ ├── brainfuck.js │ │ ├── brightscript.js │ │ ├── bro.js │ │ ├── bsl.js │ │ ├── c.js │ │ ├── cfscript.js │ │ ├── chaiscript.js │ │ ├── cil.js │ │ ├── cilkc.js │ │ ├── cilkcpp.js │ │ ├── clike.js │ │ ├── clojure.js │ │ ├── cmake.js │ │ ├── cobol.js │ │ ├── coffeescript.js │ │ ├── concurnas.js │ │ ├── cooklang.js │ │ ├── coq.js │ │ ├── cpp.js │ │ ├── crystal.js │ │ ├── csharp.js │ │ ├── cshtml.js │ │ ├── csp.js │ │ ├── css-extras.js │ │ ├── css-selector.js │ │ ├── css.js │ │ ├── csv.js │ │ ├── cue.js │ │ ├── cypher.js │ │ ├── d.js │ │ ├── dart.js │ │ ├── dataweave.js │ │ ├── dax.js │ │ ├── dhall.js │ │ ├── diff.js │ │ ├── django.js │ │ ├── dns-zone-file.js │ │ ├── docker.js │ │ ├── dot.js │ │ ├── ebnf.js │ │ ├── editorconfig.js │ │ ├── eiffel.js │ │ ├── ejs.js │ │ ├── elixir.js │ │ ├── elm.js │ │ ├── erb.js │ │ ├── erlang.js │ │ ├── etlua.js │ │ ├── excel-formula.js │ │ ├── factor.js │ │ ├── false.js │ │ ├── firestore-security-rules.js │ │ ├── flow.js │ │ ├── fortran.js │ │ ├── fsharp.js │ │ ├── ftl.js │ │ ├── gap.js │ │ ├── gcode.js │ │ ├── gdscript.js │ │ ├── gedcom.js │ │ ├── gettext.js │ │ ├── gherkin.js │ │ ├── git.js │ │ ├── glsl.js │ │ ├── gml.js │ │ ├── gn.js │ │ ├── go-module.js │ │ ├── go.js │ │ ├── gradle.js │ │ ├── graphql.js │ │ ├── groovy.js │ │ ├── haml.js │ │ ├── handlebars.js │ │ ├── haskell.js │ │ ├── haxe.js │ │ ├── hcl.js │ │ ├── hlsl.js │ │ ├── hoon.js │ │ ├── hpkp.js │ │ ├── hsts.js │ │ ├── http.js │ │ ├── ichigojam.js │ │ ├── icon.js │ │ ├── icu-message-format.js │ │ ├── idris.js │ │ ├── iecst.js │ │ ├── ignore.js │ │ ├── inform7.js │ │ ├── ini.js │ │ ├── io.js │ │ ├── j.js │ │ ├── java.js │ │ ├── javadoc.js │ │ ├── javadoclike.js │ │ ├── javascript.js │ │ ├── javastacktrace.js │ │ ├── jexl.js │ │ ├── jolie.js │ │ ├── jq.js │ │ ├── js-templates.js │ │ ├── jsdoc.js │ │ ├── json.js │ │ ├── json5.js │ │ ├── jsonp.js │ │ ├── jsstacktrace.js │ │ ├── jsx.js │ │ ├── julia.js │ │ ├── keepalived.js │ │ ├── keyman.js │ │ ├── kotlin.js │ │ ├── kumir.js │ │ ├── kusto.js │ │ ├── latex.js │ │ ├── latte.js │ │ ├── less.js │ │ ├── lilypond.js │ │ ├── linker-script.js │ │ ├── liquid.js │ │ ├── lisp.js │ │ ├── livescript.js │ │ ├── llvm.js │ │ ├── log.js │ │ ├── lolcode.js │ │ ├── lua.js │ │ ├── magma.js │ │ ├── makefile.js │ │ ├── markdown.js │ │ ├── markup.js │ │ ├── mata.js │ │ ├── matlab.js │ │ ├── maxscript.js │ │ ├── mel.js │ │ ├── mermaid.js │ │ ├── metafont.js │ │ ├── mizar.js │ │ ├── mongodb.js │ │ ├── monkey.js │ │ ├── moonscript.js │ │ ├── n1ql.js │ │ ├── n4js.js │ │ ├── nand2tetris-hdl.js │ │ ├── naniscript.js │ │ ├── nasm.js │ │ ├── neon.js │ │ ├── nevod.js │ │ ├── nginx.js │ │ ├── nim.js │ │ ├── nix.js │ │ ├── nsis.js │ │ ├── objectivec.js │ │ ├── ocaml.js │ │ ├── odin.js │ │ ├── opencl-extensions.js │ │ ├── opencl.js │ │ ├── openqasm.js │ │ ├── oz.js │ │ ├── parigp.js │ │ ├── parser.js │ │ ├── pascal.js │ │ ├── pascaligo.js │ │ ├── pcaxis.js │ │ ├── peoplecode.js │ │ ├── perl.js │ │ ├── php-extras.js │ │ ├── php.js │ │ ├── phpdoc.js │ │ ├── plain.js │ │ ├── plant-uml.js │ │ ├── plsql.js │ │ ├── powerquery.js │ │ ├── powershell.js │ │ ├── processing.js │ │ ├── prolog.js │ │ ├── promql.js │ │ ├── properties.js │ │ ├── protobuf.js │ │ ├── psl.js │ │ ├── pug.js │ │ ├── puppet.js │ │ ├── pure.js │ │ ├── purebasic.js │ │ ├── purescript.js │ │ ├── python.js │ │ ├── q.js │ │ ├── qml.js │ │ ├── qore.js │ │ ├── qsharp.js │ │ ├── r.js │ │ ├── racket.js │ │ ├── reason.js │ │ ├── regex.js │ │ ├── rego.js │ │ ├── renpy.js │ │ ├── rescript.js │ │ ├── rest.js │ │ ├── rip.js │ │ ├── roboconf.js │ │ ├── robotframework.js │ │ ├── ruby.js │ │ ├── rust.js │ │ ├── sas.js │ │ ├── sass.js │ │ ├── scala.js │ │ ├── scheme.js │ │ ├── scss.js │ │ ├── shell-session.js │ │ ├── smali.js │ │ ├── smalltalk.js │ │ ├── smarty.js │ │ ├── sml.js │ │ ├── solidity.js │ │ ├── solution-file.js │ │ ├── soy.js │ │ ├── sparql.js │ │ ├── splunk-spl.js │ │ ├── sqf.js │ │ ├── sql.js │ │ ├── squirrel.js │ │ ├── stan.js │ │ ├── stata.js │ │ ├── stylus.js │ │ ├── supercollider.js │ │ ├── swift.js │ │ ├── systemd.js │ │ ├── t4-cs.js │ │ ├── t4-vb.js │ │ ├── tap.js │ │ ├── tcl.js │ │ ├── textile.js │ │ ├── toml.js │ │ ├── treeview.js │ │ ├── tremor.js │ │ ├── tsx.js │ │ ├── tt2.js │ │ ├── turtle.js │ │ ├── twig.js │ │ ├── typescript.js │ │ ├── typoscript.js │ │ ├── unrealscript.js │ │ ├── uorazor.js │ │ ├── uri.js │ │ ├── v.js │ │ ├── vala.js │ │ ├── vbnet.js │ │ ├── velocity.js │ │ ├── verilog.js │ │ ├── vhdl.js │ │ ├── vim.js │ │ ├── visual-basic.js │ │ ├── warpscript.js │ │ ├── wasm.js │ │ ├── web-idl.js │ │ ├── wgsl.js │ │ ├── wiki.js │ │ ├── wolfram.js │ │ ├── wren.js │ │ ├── xeora.js │ │ ├── xml-doc.js │ │ ├── xml.js │ │ ├── xojo.js │ │ ├── xquery.js │ │ ├── yaml.js │ │ ├── yang.js │ │ └── zig.js │ ├── load-languages.js │ ├── plugins/ │ │ ├── autolinker/ │ │ │ ├── README.md │ │ │ ├── autolinker.css │ │ │ └── autolinker.js │ │ ├── autoloader/ │ │ │ ├── README.md │ │ │ ├── autoloader.js │ │ │ └── demo.js │ │ ├── command-line/ │ │ │ ├── README.md │ │ │ ├── command-line.css │ │ │ └── command-line.js │ │ ├── copy-to-clipboard/ │ │ │ ├── README.md │ │ │ └── copy-to-clipboard.js │ │ ├── custom-class/ │ │ │ ├── README.md │ │ │ └── custom-class.js │ │ ├── data-uri-highlight/ │ │ │ ├── README.md │ │ │ └── data-uri-highlight.js │ │ ├── diff-highlight/ │ │ │ ├── README.md │ │ │ ├── diff-highlight.css │ │ │ └── diff-highlight.js │ │ ├── download-button/ │ │ │ ├── README.md │ │ │ └── download-button.js │ │ ├── file-highlight/ │ │ │ ├── README.md │ │ │ └── file-highlight.js │ │ ├── filter-highlight-all/ │ │ │ ├── README.md │ │ │ ├── demo.js │ │ │ └── filter-highlight-all.js │ │ ├── highlight-keywords/ │ │ │ ├── README.md │ │ │ └── highlight-keywords.js │ │ ├── inline-color/ │ │ │ ├── README.md │ │ │ ├── inline-color.css │ │ │ └── inline-color.js │ │ ├── jsonp-highlight/ │ │ │ ├── README.md │ │ │ ├── demo.js │ │ │ └── jsonp-highlight.js │ │ ├── keep-markup/ │ │ │ ├── README.md │ │ │ └── keep-markup.js │ │ ├── line-highlight/ │ │ │ ├── README.md │ │ │ ├── line-highlight.css │ │ │ └── line-highlight.js │ │ ├── line-numbers/ │ │ │ ├── README.md │ │ │ ├── line-numbers.css │ │ │ └── line-numbers.js │ │ ├── match-braces/ │ │ │ ├── README.md │ │ │ ├── match-braces.css │ │ │ └── match-braces.js │ │ ├── normalize-whitespace/ │ │ │ ├── README.md │ │ │ ├── demo.md │ │ │ └── normalize-whitespace.js │ │ ├── previewers/ │ │ │ ├── README.md │ │ │ ├── previewers.css │ │ │ └── previewers.js │ │ ├── show-invisibles/ │ │ │ ├── README.md │ │ │ ├── show-invisibles.css │ │ │ └── show-invisibles.js │ │ ├── show-language/ │ │ │ ├── README.md │ │ │ └── show-language.js │ │ ├── toolbar/ │ │ │ ├── README.md │ │ │ ├── demo.js │ │ │ ├── toolbar.css │ │ │ └── toolbar.js │ │ ├── treeview-icons/ │ │ │ ├── README.md │ │ │ ├── treeview-icons.css │ │ │ └── treeview-icons.js │ │ ├── unescaped-markup/ │ │ │ ├── README.md │ │ │ ├── unescaped-markup.css │ │ │ └── unescaped-markup.js │ │ └── wpd/ │ │ ├── README.md │ │ ├── wpd.css │ │ └── wpd.js │ ├── prism.global.js │ ├── shared/ │ │ ├── dom-util.js │ │ ├── languages/ │ │ │ ├── patterns.js │ │ │ ├── t4-templating.js │ │ │ └── templating.js │ │ ├── meta/ │ │ │ ├── alias-data.js │ │ │ ├── all-languages-data.js │ │ │ └── title-data.js │ │ ├── tokenize-strings.js │ │ └── util.js │ ├── shared.js │ ├── themes/ │ │ ├── coy.css │ │ ├── dark.css │ │ ├── funky.css │ │ ├── okaidia.css │ │ ├── prism.css │ │ ├── solarizedlight.css │ │ ├── tomorrow.css │ │ └── twilight.css │ ├── types.d.ts │ └── util/ │ ├── async.js │ ├── combine-callbacks.js │ ├── extend.js │ ├── grammar-patch.js │ ├── insert.js │ ├── iterables.js │ ├── language-util.js │ ├── objects.js │ └── without-tokenize.js ├── tests/ │ ├── components-test.js │ ├── core/ │ │ ├── greedy.js │ │ └── registry.js │ ├── coverage.js │ ├── helper/ │ │ ├── args.js │ │ ├── prism-dom-util.js │ │ ├── prism-loader.js │ │ ├── snapshot.js │ │ ├── test-case.js │ │ ├── test-discovery.js │ │ ├── token-stream-transformer.js │ │ └── util.js │ ├── identifier-test.js │ ├── languages/ │ │ ├── abap/ │ │ │ ├── comment_feature.test │ │ │ ├── eol-comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string-template_feature.test │ │ │ └── string_feature.test │ │ ├── abnf/ │ │ │ ├── comment_feature.test │ │ │ ├── core-rule_feature.test │ │ │ ├── definition_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── range_feature.test │ │ │ ├── repetition_feature.test │ │ │ ├── rule_feature.test │ │ │ ├── string_feature.test │ │ │ └── terminal_feature.test │ │ ├── actionscript/ │ │ │ ├── keyword_feature.test │ │ │ └── operator_feature.test │ │ ├── ada/ │ │ │ ├── attribute_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── agda/ │ │ │ ├── comment_feature.test │ │ │ ├── data_feature.test │ │ │ ├── function_feature.test │ │ │ ├── module_feature.test │ │ │ └── record_feature.test │ │ ├── al/ │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── antlr4/ │ │ │ ├── action_feature.test │ │ │ ├── annotation_feature.test │ │ │ ├── character-class_feature.test │ │ │ ├── command_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── definition_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── apacheconf/ │ │ │ ├── comment_feature.test │ │ │ ├── directive-block_feature.test │ │ │ ├── directive-flags_feature.test │ │ │ ├── directive-inline_feature.test │ │ │ ├── regex_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── apex/ │ │ │ ├── annotation_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── sql_feature.test │ │ │ ├── string_feature.test │ │ │ └── trigger_feature.test │ │ ├── apl/ │ │ │ ├── assignment_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── dfn_feature.test │ │ │ ├── dyadic-operator_feature.test │ │ │ ├── function_feature.test │ │ │ ├── monadic-operator_feature.test │ │ │ ├── number_feature.test │ │ │ ├── statement_feature.test │ │ │ ├── string_feature.test │ │ │ └── system-function_feature.test │ │ ├── applescript/ │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── aql/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── identifier_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── arduino/ │ │ │ ├── builtin_feature.test │ │ │ ├── constant_feature.test │ │ │ └── keyword_feature.test │ │ ├── arff/ │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ └── string_feature.test │ │ ├── armasm/ │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── directives_feature.test │ │ │ ├── instruction_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ ├── variable_feature.test │ │ │ └── version-symbol_feature.test │ │ ├── arturo/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin-function_feature.test │ │ │ ├── character_feature.test │ │ │ ├── color_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── label_feature.test │ │ │ ├── literal_feature.test │ │ │ ├── multistring_feature.test │ │ │ ├── number_feature.test │ │ │ ├── predicate_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── regex_feature.test │ │ │ ├── string_feature.test │ │ │ ├── sugar_feature.test │ │ │ ├── symbol_feature.test │ │ │ └── type_feature.test │ │ ├── arturo!+bash/ │ │ │ └── sh-string_feature.test │ │ ├── arturo!+css/ │ │ │ └── css-string_feature.test │ │ ├── arturo!+javascript/ │ │ │ └── js-string_feature.test │ │ ├── arturo!+markdown/ │ │ │ └── md-string_feature.test │ │ ├── arturo!+markup/ │ │ │ └── html-string_feature.test │ │ ├── arturo!+sql/ │ │ │ └── sql-string_feature.test │ │ ├── asciidoc/ │ │ │ ├── admonition_feature.test │ │ │ ├── attribute-entry_feature.test │ │ │ ├── attributes_feature.test │ │ │ ├── callout_feature.test │ │ │ ├── comment-block_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── entity_feature.html.test │ │ │ ├── entity_feature.test │ │ │ ├── hr_feature.test │ │ │ ├── indented-block_feature.test │ │ │ ├── inline_feature.test │ │ │ ├── issue3480.test │ │ │ ├── line-continuation_feature.test │ │ │ ├── list-label_feature.test │ │ │ ├── list-punctuation_feature.test │ │ │ ├── literal-block_feature.test │ │ │ ├── macro_feature.test │ │ │ ├── other-block_feature.test │ │ │ ├── page-break_feature.test │ │ │ ├── passthrough-block_feature.test │ │ │ ├── replacement_feature.test │ │ │ ├── table_feature.test │ │ │ └── title_feature.test │ │ ├── asm6502/ │ │ │ ├── comment_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── number_feature.test │ │ │ ├── opcode_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── register_feature.test │ │ │ └── string_feature.test │ │ ├── asmatmel/ │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── number_feature.test │ │ │ ├── opcode_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── register_feature.test │ │ │ └── string_feature.test │ │ ├── aspnet/ │ │ │ ├── comment_feature.test │ │ │ └── page-directive_feature.test │ │ ├── autohotkey/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── command_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── function_feature.test │ │ │ ├── issue2911.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ ├── symbol_feature.test │ │ │ ├── tag_feature.test │ │ │ └── variable_feature.test │ │ ├── autoit/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ ├── url_feature.test │ │ │ └── variable_feature.test │ │ ├── avisynth/ │ │ │ ├── clipproperties_feature.test │ │ │ ├── comments_strings_predefines_feature.test │ │ │ ├── intenalfuncs_feature.test │ │ │ ├── internalfilters_feature.test │ │ │ ├── keywords_constants_bools_last_feature.test │ │ │ ├── operators_numbers_punctuation.test │ │ │ ├── types_arguments_feature.test │ │ │ └── userfunctions_feature.test │ │ ├── avro-idl/ │ │ │ ├── annotation_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── awk/ │ │ │ ├── comment_feature.test │ │ │ ├── hashbang_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── regex_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── bash/ │ │ │ ├── arithmetic_environment_feature.test │ │ │ ├── assign-left_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── command_substitution_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── entities_in_strings_feature.test │ │ │ ├── environment_feature.test │ │ │ ├── for-or-select_feature.test │ │ │ ├── function-name_feature.test │ │ │ ├── function_feature.test │ │ │ ├── heredoc_command_feature.test │ │ │ ├── issue2436.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── parameter_feature.test │ │ │ ├── shebang_feature.test │ │ │ ├── string_feature.test │ │ │ ├── variable_feature.test │ │ │ └── variable_operator_feature.test │ │ ├── basic/ │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── batch/ │ │ │ ├── command_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── label_feature.test │ │ │ └── string_feature.test │ │ ├── bbcode/ │ │ │ └── tag_feature.test │ │ ├── bbj/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── bicep/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── datatype_feature.test │ │ │ ├── decorator_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── string_feature.test │ │ │ └── var_feature.test │ │ ├── birb/ │ │ │ ├── class-name_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── metadata_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── bison/ │ │ │ ├── c_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── property_feature.test │ │ │ └── string_feature.test │ │ ├── bnf/ │ │ │ ├── definition_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── rule_feature.test │ │ │ └── string_featrue.test │ │ ├── bqn/ │ │ │ ├── comments.test │ │ │ ├── namespace.test │ │ │ ├── strings.test │ │ │ ├── system-functions.test │ │ │ ├── tokens.test │ │ │ └── words.test │ │ ├── brainfuck/ │ │ │ └── all_feature.test │ │ ├── brightscript/ │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── directive-statement_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── bro/ │ │ │ ├── builtin_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── bsl/ │ │ │ ├── comment_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── c/ │ │ │ ├── char_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── macro_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── c+pure/ │ │ │ └── c_inclusion.test │ │ ├── cfscript/ │ │ │ ├── comment_feature.test │ │ │ ├── function-variable_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── scope_feature.test │ │ │ └── type_feature.test │ │ ├── chaiscript/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── cil/ │ │ │ ├── asm_reference.test │ │ │ ├── boolean.test │ │ │ ├── comment.test │ │ │ ├── directive_feature.test │ │ │ ├── instructions.test │ │ │ ├── keywords.test │ │ │ ├── number_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── strings.test │ │ ├── cilkc/ │ │ │ └── cilk_keywords_feature.test │ │ ├── cilkcpp/ │ │ │ └── cilk_keywords_feature.test │ │ ├── clike/ │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── issue1340.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── clojure/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── symbol_feature.test │ │ ├── cmake/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── inserted_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── namespace_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── cobol/ │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── level_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── coffeescript/ │ │ │ ├── block-regex_feature.test │ │ │ ├── class-member_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── inline-javascript_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── property_feature.test │ │ │ └── string_feature.test │ │ ├── coffeescript+haml/ │ │ │ └── coffeescript_inclusion.test │ │ ├── coffeescript+pug/ │ │ │ └── coffeescript_inclusion.test │ │ ├── concurnas/ │ │ │ ├── annotation_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── langext_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── regex_feature.test │ │ │ └── string_feature.test │ │ ├── cooklang/ │ │ │ ├── comment_feature.test │ │ │ ├── cookware_feature.test │ │ │ ├── ingredient_feature.test │ │ │ ├── meta_feature.test │ │ │ └── timer_feature.test │ │ ├── coq/ │ │ │ ├── attribute_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── cpp/ │ │ │ ├── base-clause_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── issue2347.test │ │ │ ├── issue3042.test │ │ │ ├── keyword_feature.test │ │ │ ├── module_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── raw_string_feature.test │ │ ├── cpp+pure/ │ │ │ └── cpp_inclusion.test │ │ ├── crystal/ │ │ │ ├── attribute_feature.test │ │ │ ├── char_feature.test │ │ │ ├── expansion_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── regex_feature.test │ │ │ ├── string_feature.test │ │ │ └── symbol_feature.test │ │ ├── csharp/ │ │ │ ├── attribute_feature.test │ │ │ ├── char_feature.test │ │ │ ├── class-name-declaration_feature.test │ │ │ ├── class-name-variables-parameters_feature.test │ │ │ ├── constructor-invocation_feature.test │ │ │ ├── for_feature.test │ │ │ ├── generic-constraint_feature.test │ │ │ ├── generic_feature.test │ │ │ ├── interpolation-string_feature.test │ │ │ ├── issue1091.test │ │ │ ├── issue1365.test │ │ │ ├── issue1371.test │ │ │ ├── issue2968.test │ │ │ ├── issue806.test │ │ │ ├── keyword_feature.test │ │ │ ├── named-parameter_feature.test │ │ │ ├── namespace_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── preprocessor_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── range_feature.test │ │ │ ├── return-type_feature.test │ │ │ ├── string_feature.test │ │ │ ├── switch_feature.test │ │ │ ├── type-expression_feature.test │ │ │ ├── type-list_feature.test │ │ │ └── using-directive_feature.test │ │ ├── csharp!+xml-doc/ │ │ │ └── inclusion.test │ │ ├── csharp+aspnet/ │ │ │ └── directive_feature.test │ │ ├── cshtml/ │ │ │ ├── block_feature.test │ │ │ ├── code-block_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── issue3354.test │ │ │ └── value_feature.test │ │ ├── csp/ │ │ │ ├── directive_no_value_feature.test │ │ │ ├── directive_with_source_expression_feature.test │ │ │ ├── hash_feature.test │ │ │ ├── host_feature.test │ │ │ ├── issue2661.test │ │ │ ├── keyword_safe_feature.html.test │ │ │ ├── keyword_unsafe_feature.html.test │ │ │ ├── nonce_feature.test │ │ │ ├── none_feature.test │ │ │ └── scheme_feature.test │ │ ├── css/ │ │ │ ├── atrule_feature.test │ │ │ ├── atrule_selector-function-argument_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── important_feature.test │ │ │ ├── property_feature.test │ │ │ ├── selector_feature.test │ │ │ ├── string_feature.test │ │ │ └── url_feature.test │ │ ├── css!+css-extras/ │ │ │ ├── atrule_selector-function-argument_feature.test │ │ │ ├── color_feature.test │ │ │ ├── entity_feature.test │ │ │ ├── hexcode_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── selector_attribute_feature.test │ │ │ ├── selector_feature.test │ │ │ ├── selector_n-th_feature.test │ │ │ ├── selector_pseudo-class_feature.test │ │ │ ├── unit_feature.test │ │ │ └── variable_feature.test │ │ ├── css+css-extras+sass/ │ │ │ └── issue2992.test │ │ ├── css+haml/ │ │ │ └── css+haml_usage.test │ │ ├── css+http/ │ │ │ └── css_inclusion.test │ │ ├── css+textile/ │ │ │ └── css_inclusion.test │ │ ├── css-selector/ │ │ │ └── token-types_feature.test │ │ ├── csv/ │ │ │ └── value.test │ │ ├── cue/ │ │ │ ├── attribute_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── cypher/ │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── relationship_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── d/ │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── issue2027.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── register_feature.test │ │ │ └── string_feature.test │ │ ├── dart/ │ │ │ ├── class-name_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── metadata_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── dataweave/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── dates_feature.test │ │ │ ├── functions_feature.test │ │ │ ├── keywords_feature.test │ │ │ ├── null_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operators_feature.test │ │ │ ├── property_feature.test │ │ │ ├── regex_feature.test │ │ │ └── string_feature.test │ │ ├── dax/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── datafield_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── measure_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── dhall/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── env_feature.test │ │ │ ├── hash_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── url_feature.test │ │ ├── diff/ │ │ │ ├── coord_feature.test │ │ │ └── diff_feature.test │ │ ├── django/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── delimiter_feature.test │ │ │ ├── filter_feature.test │ │ │ ├── for-loop_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── tag_feature.test │ │ │ ├── test_feature.test │ │ │ └── variable_feature.test │ │ ├── django!+css/ │ │ │ └── inclusion.test │ │ ├── django!+javascript/ │ │ │ └── inclusion.test │ │ ├── dns-zone-file/ │ │ │ ├── class_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── string_feature.test │ │ │ ├── type_featrue.test │ │ │ └── variable_feature.test │ │ ├── docker/ │ │ │ ├── comment_feature.test │ │ │ ├── instruction_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── options_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── dot/ │ │ │ ├── attribute_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── graph-name_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── node_feature.test │ │ │ ├── operator_feature.test │ │ │ └── punctuation_feature.test │ │ ├── dot!+markup/ │ │ │ └── attribute_feature.test │ │ ├── ebnf/ │ │ │ ├── comment_feature.test │ │ │ ├── definition_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── rule_feature.test │ │ │ ├── special_feature.test │ │ │ └── string_feature.test │ │ ├── editorconfig/ │ │ │ ├── comment_feature.test │ │ │ ├── key_value_feature.test │ │ │ └── section_feature.test │ │ ├── eiffel/ │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── ejs/ │ │ │ ├── comment_feature.test │ │ │ ├── ejs_feature.test │ │ │ ├── escape_feature.test │ │ │ └── markup_feature.test │ │ ├── ejs+pug/ │ │ │ └── ejs_inclusion.test │ │ ├── elixir/ │ │ │ ├── atom_feature.test │ │ │ ├── attr-name_feature.test │ │ │ ├── attribute_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── capture_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── doc_feature.test │ │ │ ├── issue1392.test │ │ │ ├── issue775.test │ │ │ ├── keyword_feature.test │ │ │ ├── module_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── regex_feature.test │ │ │ └── string_feature.test │ │ ├── elm/ │ │ │ ├── builtin_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── hvariable_feature.test │ │ │ ├── import-statement_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── erb/ │ │ │ ├── erb_feature.test │ │ │ ├── erb_in_markup_feature.test │ │ │ └── issue1767.test │ │ ├── erb+haml/ │ │ │ └── erb_inclusion.test │ │ ├── erlang/ │ │ │ ├── atom_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── etlua/ │ │ │ └── delimiter_feature.test │ │ ├── excel-formula/ │ │ │ ├── cell_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── range_feature.test │ │ │ ├── reference_feature.test │ │ │ └── string_feature.test │ │ ├── factor/ │ │ │ ├── builtin_words_feature.test │ │ │ ├── colon_words_feature.test │ │ │ ├── comments_feature.test │ │ │ ├── constructors_feature.test │ │ │ ├── normal_words_feature.test │ │ │ ├── numbers_feature.test │ │ │ ├── other_builtin_parsing_words_feature.test │ │ │ ├── quotations_feature.test │ │ │ ├── regexps_feature.test │ │ │ ├── sequences_feature.test │ │ │ ├── stack_effects_feature.test │ │ │ └── strings_feature.test │ │ ├── false/ │ │ │ ├── assembler_code_feature.test │ │ │ ├── character_code_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── non-standard_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── firestore-security-rules/ │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── method_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── path_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── flow/ │ │ │ ├── flow-punctuation_feature.test │ │ │ ├── function-variable_feature.test │ │ │ ├── keyword_feature.test │ │ │ └── type_feature.test │ │ ├── fortran/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── fortran+pure/ │ │ │ └── fortran_inclusion.test │ │ ├── fsharp/ │ │ │ ├── annotation_feature.test │ │ │ ├── char_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── computation-expression_feature.test │ │ │ ├── issue1480.test │ │ │ ├── issue2696.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── preprocessor_feature.test │ │ │ └── string_feature.test │ │ ├── fsharp!+xml-doc/ │ │ │ └── inclusion.test │ │ ├── ftl/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin-function_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── function_feature.test │ │ │ ├── interpolation_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── gap/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── shell_feature.test │ │ │ └── string_feature.test │ │ ├── gcode/ │ │ │ ├── checksum_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── property_feature.test │ │ │ └── string_feature.test │ │ ├── gdscript/ │ │ │ ├── class-name_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── gedcom/ │ │ │ ├── level_feature.test │ │ │ ├── line-value_feature.test │ │ │ ├── pointer_feature.test │ │ │ └── record_feature.test │ │ ├── gettext/ │ │ │ ├── comment_feature.html.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── gherkin/ │ │ │ ├── atrule_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── feature_feature.test │ │ │ ├── outline_feature.test │ │ │ ├── pystring_feature.test │ │ │ ├── scenario_feature.test │ │ │ ├── string_feature.test │ │ │ ├── table_feature.test │ │ │ └── tag_feature.test │ │ ├── git/ │ │ │ ├── command_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── commit-sha1_feature.test │ │ │ ├── coord_feature.test │ │ │ ├── diff_feature.test │ │ │ └── string_feature.test │ │ ├── glsl/ │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── macro_feature.test │ │ │ └── number_feature.test │ │ ├── gml/ │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── variable_feature.test │ │ ├── gn/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin-function_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── go/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── char_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── go-module/ │ │ │ ├── comment_feature.test │ │ │ ├── directives_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── version_feature.test │ │ ├── gradle/ │ │ │ ├── annotation_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── shebang_feature.test │ │ │ ├── spock-block_feature.test │ │ │ ├── string-interpolation_feature.html.test │ │ │ └── string_feature.test │ │ ├── graphql/ │ │ │ ├── advanced_tokens.html.test │ │ │ ├── atom-input_feature.test │ │ │ ├── attr-name_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── description_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── fragment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── mutation_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── scalar_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── groovy/ │ │ │ ├── annotation_feature.test │ │ │ ├── issue1049.html.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── shebang_feature.test │ │ │ ├── spock-block_feature.test │ │ │ ├── string-interpolation_feature.html.test │ │ │ └── string_feature.test │ │ ├── groovy+sas/ │ │ │ └── groovy_inclusion.test │ │ ├── haml/ │ │ │ ├── code_feature.test │ │ │ ├── doctype_feature.test │ │ │ ├── filter_feature.test │ │ │ ├── interpolation_feature.test │ │ │ ├── multiline-code_feature.test │ │ │ ├── multiline-comment_feature.test │ │ │ └── tag_feature.test │ │ ├── handlebars/ │ │ │ ├── block_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── handlebars_in_html_feature.test │ │ │ ├── handlebars_in_markup_feature.test │ │ │ ├── number_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── handlebars+pug/ │ │ │ └── handlebars_inclusion.test │ │ ├── haskell/ │ │ │ ├── builtin_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── hvariable_feature.test │ │ │ ├── import_statement_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── haxe/ │ │ │ ├── class-name_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── metadata_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── preprocessor_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── regex_feature.test │ │ │ ├── reification_feature.test │ │ │ └── string_feature.test │ │ ├── haxe!+regex/ │ │ │ └── regex_inclusion.test │ │ ├── hcl/ │ │ │ ├── comment_feature.test │ │ │ ├── interpolation_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── property_feature.test │ │ │ └── string_feature.test │ │ ├── hlsl/ │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ └── operator_feature.test │ │ ├── hoon/ │ │ │ ├── comments_and_leaves.test │ │ │ ├── core_with_arms.test │ │ │ ├── nested_strings.test │ │ │ └── strings_with_escapes.test │ │ ├── hpkp/ │ │ │ ├── max-age_feature.test │ │ │ └── sha256_pin_feature.test │ │ ├── hsts/ │ │ │ ├── include_subdomains_feature.test │ │ │ ├── max-age_feature.test │ │ │ └── preload_feature.test │ │ ├── http/ │ │ │ ├── header_feature.test │ │ │ ├── request-line_feature.test │ │ │ ├── response-status_feature.test │ │ │ └── text-plain_feature.test │ │ ├── http!+csp/ │ │ │ └── inclusion.test │ │ ├── http!+hpkp/ │ │ │ └── inclusion.test │ │ ├── http!+hsts/ │ │ │ └── inclusion.test │ │ ├── http!+uri/ │ │ │ └── request-line_feature.test │ │ ├── ichigojam/ │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── icon/ │ │ │ ├── builtin-keyword_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── icu-message-format/ │ │ │ ├── arg-skeleton_feature.test │ │ │ ├── choice-style_feature.test │ │ │ ├── plural-style_feature.test │ │ │ ├── select-style_feature.test │ │ │ └── string_feature.test │ │ ├── idris/ │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── hvariable_feature.test │ │ │ ├── import_statement_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── iecst/ │ │ │ ├── address_feature.test │ │ │ ├── block.test │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── punctuation_feature.test │ │ ├── ignore/ │ │ │ ├── comment_feature.test │ │ │ └── entry_feature.test │ │ ├── inform7/ │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── position_feature.test │ │ │ ├── property_feature.test │ │ │ ├── string_feature.test │ │ │ ├── title_feature.test │ │ │ ├── variable_feature.test │ │ │ └── verb_feature.test │ │ ├── ini/ │ │ │ ├── comment_feature.test │ │ │ ├── key_value_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── section_feature.test │ │ ├── io/ │ │ │ ├── builtin_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── j/ │ │ │ ├── adverb_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── conjunction_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── verb_feature.test │ │ ├── java/ │ │ │ ├── annotation_feature.test │ │ │ ├── char_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function_featrue.test │ │ │ ├── generics_feature.test │ │ │ ├── issue1351.test │ │ │ ├── issue3345.test │ │ │ ├── issue3350.test │ │ │ ├── keyword_feature.test │ │ │ ├── module_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── package_feature.test │ │ │ └── string_feature.test │ │ ├── javadoc/ │ │ │ ├── code_feature.test │ │ │ ├── entity_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── parameter_feature.test │ │ │ ├── reference_feature.test │ │ │ └── tag_feature.test │ │ ├── javadoc+java/ │ │ │ └── javadoc_inclusion.test │ │ ├── javascript/ │ │ │ ├── boolean_feature.test │ │ │ ├── class-method_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function-variable_feature.test │ │ │ ├── function_feature.test │ │ │ ├── getter-setter_feature.test │ │ │ ├── hashbang_feature.test │ │ │ ├── issue1337.test │ │ │ ├── issue1340.test │ │ │ ├── issue1397.test │ │ │ ├── issue1526.test │ │ │ ├── issue1807.test │ │ │ ├── issue2694.test │ │ │ ├── keyword_feature.html.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── private_fields_feature.test │ │ │ ├── property_feature.test │ │ │ ├── regex_feature.test │ │ │ ├── spread_and_keyword_feature.test │ │ │ ├── supposed-classes_feature.test │ │ │ ├── supposed-function_feature.test │ │ │ ├── template-string_feature.test │ │ │ ├── try-catch_feature.test │ │ │ └── variable_feature.test │ │ ├── javascript!+css+js-templates/ │ │ │ └── css_inclusion.test │ │ ├── javascript!+graphql+js-templates/ │ │ │ └── graphql_inclusion.test │ │ ├── javascript!+markdown+js-templates/ │ │ │ └── markdown_inclusion.test │ │ ├── javascript!+markup+js-templates/ │ │ │ └── markup_inclusion.test │ │ ├── javascript!+regex/ │ │ │ └── regex_inclusion.test │ │ ├── javascript!+sql+js-templates/ │ │ │ └── sql_inclusion.test │ │ ├── javascript+haml/ │ │ │ └── javascript_inclusion.test │ │ ├── javascript+http/ │ │ │ ├── issue2733.test │ │ │ └── javascript_inclusion.test │ │ ├── javastacktrace/ │ │ │ ├── more_feature.test │ │ │ ├── stack-frame_feature.test │ │ │ └── summary_feature.test │ │ ├── jexl/ │ │ │ ├── boolean_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── transform_feature.test │ │ ├── jolie/ │ │ │ ├── builtin_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── deployment_features.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── jq/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── dot_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── jsdoc/ │ │ │ ├── class-name_feature.test │ │ │ ├── example_feature.test │ │ │ ├── keyword_feature.test │ │ │ └── parameter_feature.test │ │ ├── jsdoc+javascript/ │ │ │ └── jsdoc_inclusion.test │ │ ├── json/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── issue1852.test │ │ │ ├── null_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── json+http/ │ │ │ ├── issue2733.test │ │ │ ├── issue3168.test │ │ │ ├── json-suffix_inclusion.test │ │ │ └── json_inclusion.test │ │ ├── json5/ │ │ │ ├── number_feature.test │ │ │ ├── property_feature.test │ │ │ └── string_feature.test │ │ ├── jsonp/ │ │ │ ├── function_feature.test │ │ │ └── punctuation_feature.test │ │ ├── jsstacktrace/ │ │ │ ├── alias_feature.test │ │ │ ├── errormessage-nodejs_feature.test │ │ │ ├── errormessage_feature.test │ │ │ ├── filename_feature.test │ │ │ ├── filenamedirect_feature.test │ │ │ ├── filenamedirectwindows_feature.test │ │ │ ├── function_feature.test │ │ │ ├── linenumber_feature.test │ │ │ └── notmycode_feature.test │ │ ├── jsx/ │ │ │ ├── dollars-in-attrs.test │ │ │ ├── issue1103.test │ │ │ ├── issue1235.test │ │ │ ├── issue1236.test │ │ │ ├── issue1294.test │ │ │ ├── issue1335.test │ │ │ ├── issue1342.test │ │ │ ├── issue1356.test │ │ │ ├── issue1364.test │ │ │ ├── issue1408.test │ │ │ ├── issue1421.test │ │ │ ├── issue2727.test │ │ │ ├── issue2753.test │ │ │ ├── plain-text_feature.test │ │ │ ├── spread_in_tags.test │ │ │ └── tag_feature.test │ │ ├── jsx!+graphql+js-templates/ │ │ │ └── graphql_inclusion.test │ │ ├── julia/ │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── issue2360.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── regex_feature.test │ │ │ └── string_feature.test │ │ ├── keepalived/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── conditional-configuration_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── ip_feature.test │ │ │ ├── path_feature.test │ │ │ ├── property_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── keyman/ │ │ │ ├── comment_feature.test │ │ │ ├── compile-target_feature.test │ │ │ ├── header-keyword.test │ │ │ ├── header-statement.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── rule-keyword_feature.test │ │ │ ├── string_feature.test │ │ │ ├── structural-keyword_feature.test │ │ │ └── virtual-key_feature.test │ │ ├── kotlin/ │ │ │ ├── annotation_feature.test │ │ │ ├── char_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── kumir/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── name_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── prolog_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ ├── system-variable_feature.test │ │ │ └── type_feature.test │ │ ├── kusto/ │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── command_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── datetime_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── verb_feature.test │ │ ├── latex/ │ │ │ ├── cdata_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── equation_feature.test │ │ │ ├── headline_feature.test │ │ │ ├── keyword_feature.test │ │ │ └── url_feature.test │ │ ├── latte/ │ │ │ ├── comment_feature.test │ │ │ ├── delimiter_feature.test │ │ │ ├── html_feature.test │ │ │ ├── n-attr_feature.test │ │ │ └── php_feature.test │ │ ├── less/ │ │ │ ├── atrule_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── selector_feature.test │ │ │ └── variable_feature.test │ │ ├── less+haml/ │ │ │ └── less_inclusion.test │ │ ├── less+pug/ │ │ │ └── less_inclusion.test │ │ ├── lilypond/ │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── embedded-scheme_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ └── string_feature.test │ │ ├── linker-script/ │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── identifier_feature.test │ │ │ ├── location-counter_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── section_feature.test │ │ ├── liquid/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── empty_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── markup_feature.test │ │ │ ├── number_feature.test │ │ │ ├── object_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── raw_feature.test │ │ │ ├── string_feature.test │ │ │ └── template_feature.test │ │ ├── lisp/ │ │ │ ├── boolean_feature.test │ │ │ ├── car_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── declare_feature.test │ │ │ ├── defun_feature.test │ │ │ ├── defvar_feature.test │ │ │ ├── heading_feature.test │ │ │ ├── interactive_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── lambda-feature.test │ │ │ ├── lisp-property_feature.test │ │ │ ├── number_boolean.test │ │ │ ├── punctuation_feature.test │ │ │ ├── quoted-symbol_feature.test │ │ │ ├── splice_feature.test │ │ │ └── string_feature.test │ │ ├── livescript/ │ │ │ ├── argument_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── identifier_feature.test │ │ │ ├── interpolated-string.test │ │ │ ├── keyword-operator_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── regex_feature.test │ │ │ └── string_feature.test │ │ ├── livescript+pug/ │ │ │ └── livescript_inclusion.test │ │ ├── llvm/ │ │ │ ├── attributes.test │ │ │ ├── example-iterative.test │ │ │ ├── example-recursive.test │ │ │ ├── langref-module-example.test │ │ │ ├── numbers.test │ │ │ └── string.test │ │ ├── log/ │ │ │ ├── _discord.test │ │ │ ├── _docker.test │ │ │ ├── _hadoop.test │ │ │ ├── _java_stack_trace.test │ │ │ ├── _minecraft.test │ │ │ ├── _nginx.test │ │ │ ├── _npm_console.test │ │ │ ├── _npm_log.test │ │ │ ├── _table.test │ │ │ ├── _tomcat.test │ │ │ ├── _windows.test │ │ │ ├── date_feature.test │ │ │ ├── email_feature.test │ │ │ ├── exception_feature.test │ │ │ ├── hash_feature.test │ │ │ ├── level_feature.test │ │ │ ├── mac-address_feature.test │ │ │ ├── number_feature.test │ │ │ ├── path_feature.test │ │ │ ├── property_feature.test │ │ │ ├── separator_feature.test │ │ │ ├── string_feature.test │ │ │ ├── time_feature.test │ │ │ ├── url_feature.test │ │ │ └── uuid_feature.test │ │ ├── log!+javastacktrace/ │ │ │ ├── _hadoop_javastacktrace_inclusion.test │ │ │ ├── _java_stack_trace_inclusion.test │ │ │ ├── _minecraft_javastacktrace_inclusion.test │ │ │ └── exception_javastacktrace_inclusion.test │ │ ├── lolcode/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ ├── symbol_feature.test │ │ │ └── variable_feature.test │ │ ├── lua/ │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── lua+sas/ │ │ │ └── lua_inclusion.test │ │ ├── magma/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── generator_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── shell_feature.test │ │ │ └── string_feature.test │ │ ├── makefile/ │ │ │ ├── builtin-target_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ ├── target_feature.test │ │ │ └── variable_feature.test │ │ ├── markdown/ │ │ │ ├── blockquote_feature.test │ │ │ ├── bold_feature.test │ │ │ ├── code-block_feature.html.test │ │ │ ├── code-block_feature.test │ │ │ ├── code_block_language_detection_feature.html.test │ │ │ ├── code_feature.test │ │ │ ├── front-matter-block_empty_feature.test │ │ │ ├── front-matter-block_feature.test │ │ │ ├── hr_feature.test │ │ │ ├── issue2966.test │ │ │ ├── italic_feature.test │ │ │ ├── list_feature.test │ │ │ ├── nested_bold_italic_feature.test │ │ │ ├── strike_feature.test │ │ │ ├── table_feature.test │ │ │ ├── title_feature.test │ │ │ ├── url-reference_feature.test │ │ │ └── url_feature.test │ │ ├── markdown+graphql/ │ │ │ └── description_feature.test │ │ ├── markdown+haml/ │ │ │ └── markdown_inclusion.test │ │ ├── markdown+pug/ │ │ │ └── markdown_inclusion.test │ │ ├── markup/ │ │ │ ├── cdata_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── doctype_feature.test │ │ │ ├── entity_feature.html.test │ │ │ ├── issue3441.test │ │ │ ├── issue585.test │ │ │ ├── issue888.test │ │ │ ├── prolog_feature.test │ │ │ ├── tag_attribute_feature.test │ │ │ └── tag_feature.test │ │ ├── markup!+css/ │ │ │ └── css_inclusion.test │ │ ├── markup!+css+javascript/ │ │ │ └── issue1240.test │ │ ├── markup!+javascript/ │ │ │ └── javascript_inclusion.test │ │ ├── markup+actionscript/ │ │ │ └── xml_feature.test │ │ ├── markup+css+wiki/ │ │ │ └── table-tag_feature.test │ │ ├── markup+haml/ │ │ │ └── markup_feature.test │ │ ├── markup+http/ │ │ │ └── html_inclusion.test │ │ ├── markup+javascript+csharp+aspnet/ │ │ │ └── script_feature.test │ │ ├── markup+php/ │ │ │ ├── issue1582.test │ │ │ ├── php_in_markup_feature.test │ │ │ └── php_with_closing_tag_in_markup_feature.test │ │ ├── markup+pug/ │ │ │ └── markup_feature.test │ │ ├── markup+tt2/ │ │ │ └── tt2_in_markup_feature.test │ │ ├── mata/ │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── missing_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── type_feature.test │ │ ├── matlab/ │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── maxscript/ │ │ │ ├── boolean_feature.test │ │ │ ├── color_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── path_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── time_feature.test │ │ ├── mel/ │ │ │ ├── code_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── flag_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── mermaid/ │ │ │ ├── arrow_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── full_classdiagram.test │ │ │ ├── full_erdiagram.test │ │ │ ├── full_flowchart.test │ │ │ ├── full_sequencediagram.test │ │ │ ├── full_statediagram.test │ │ │ ├── inter-arrow-label_feature.test │ │ │ └── operator_feature.test │ │ ├── metafont/ │ │ │ ├── boolean_feature.test │ │ │ ├── command_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── internal_quantity_feature.test │ │ │ ├── keywords_feature.test │ │ │ ├── macro_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── ponctuation_feature.test │ │ │ ├── primitive_feature.test │ │ │ ├── string_and_comment_feature.test │ │ │ ├── type_feature.test │ │ │ └── variable_feature.test │ │ ├── mizar/ │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── parameter_feature.test │ │ │ └── variable_feature.test │ │ ├── mongodb/ │ │ │ ├── document_feature.test │ │ │ ├── functions_feature.test │ │ │ ├── operations_feature.test │ │ │ ├── query_feature.test │ │ │ ├── string_url_and_ip_feature.test │ │ │ └── update_feature.test │ │ ├── monkey/ │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── preprocessor_feature.test │ │ │ ├── string_feature.test │ │ │ └── type-char_feature.test │ │ ├── moonscript/ │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── n1ql/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── identifier_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── parameter_feature.test │ │ │ └── string_feature.test │ │ ├── n4js/ │ │ │ ├── annotation_feature.test │ │ │ └── keyword_feature.test │ │ ├── nand2tetris-hdl/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── punctuation_feature.test │ │ ├── naniscript/ │ │ │ ├── command_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── define_feature.test │ │ │ ├── expression_feature.test │ │ │ ├── label_feature.test │ │ │ └── mixed_content_feature.test │ │ ├── nasm/ │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── register_feature.test │ │ │ └── string_feature.test │ │ ├── neon/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── composite.test │ │ │ ├── datetime_feature.test │ │ │ ├── json_feature.test │ │ │ ├── key_feature.test │ │ │ ├── literal_feature.test │ │ │ ├── null_feature.test │ │ │ ├── number_feature.test │ │ │ └── string_feature.test │ │ ├── nevod/ │ │ │ ├── comment_feature.test │ │ │ ├── full_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── package_feature.test │ │ │ ├── pattern_feature.test │ │ │ ├── search_feature.test │ │ │ └── string_feature.test │ │ ├── nginx/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── number_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── nim/ │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── identifier_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── nix/ │ │ │ ├── antiquotation_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── url_feature.test │ │ ├── nsis/ │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── important_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── objectivec/ │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── ocaml/ │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ ├── type-variable_feature.test │ │ │ └── variant_feature.test │ │ ├── odin/ │ │ │ ├── boolean_feature.test │ │ │ ├── character_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_parameter_sign_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── discard_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── not_a_number_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── procedure_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── raw_string_feature.test │ │ │ ├── string_feature.test │ │ │ └── undefined_feature.test │ │ ├── opencl/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin-type_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── keyword_feature.test │ │ │ └── number_feature.test │ │ ├── opencl-extensions+c/ │ │ │ ├── boolean_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function_feature.test │ │ │ └── type_feature.test │ │ ├── opencl-extensions+cpp/ │ │ │ └── type_feature.test │ │ ├── openqasm/ │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── oz/ │ │ │ ├── atom_feature.test │ │ │ ├── attr-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── parigp/ │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── parser/ │ │ │ ├── boolean_feature.test │ │ │ ├── escape_feature.test │ │ │ ├── expression_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── parser-comment_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── pascal/ │ │ │ ├── asm_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── pascaligo/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── pcaxis/ │ │ │ ├── boolean_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── string_feature.test │ │ │ └── tlist_feature.test │ │ ├── peoplecode/ │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── perl/ │ │ │ ├── comment_feature.test │ │ │ ├── filehandle_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── regex_feature.test │ │ │ ├── string_feature.test │ │ │ ├── v-string_feature.test │ │ │ └── variable_feature.test │ │ ├── php/ │ │ │ ├── argument-name_feature.test │ │ │ ├── array_feature.test │ │ │ ├── attribute_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── delimiter_feature.test │ │ │ ├── enum_feature.test │ │ │ ├── function_feature.test │ │ │ ├── issue2156.test │ │ │ ├── issue2614.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operators_feature.test │ │ │ ├── package_feature.test │ │ │ ├── property_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string-interpolation_feature.test │ │ │ ├── string_feature.test │ │ │ ├── type_feature.test │ │ │ └── variable_feature.test │ │ ├── php!+css+css-extras/ │ │ │ └── issue2008.test │ │ ├── php!+php-extras/ │ │ │ ├── global_feature.test │ │ │ ├── scope_feature.test │ │ │ └── this_feature.test │ │ ├── phpdoc/ │ │ │ ├── class-name_feature.test │ │ │ ├── issue2197.test │ │ │ ├── keyword_feature.test │ │ │ └── parameter_feature.test │ │ ├── phpdoc+php/ │ │ │ └── phpdoc_inclusion.test │ │ ├── plant-uml/ │ │ │ ├── arrow_feature.test │ │ │ ├── color_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── delimiter_feature.test │ │ │ ├── divider_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── preprocessor_feature.test │ │ │ ├── string_feature.test │ │ │ ├── text_feature.test │ │ │ ├── time_feature.test │ │ │ └── variable_feature.test │ │ ├── plsql/ │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ └── operator_feature.test │ │ ├── powerquery/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── datatype_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── quoted_identifier_feature.test │ │ │ └── string_feature.test │ │ ├── powershell/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── issue1407.test │ │ │ ├── keyword_feature.test │ │ │ ├── namespace_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── processing/ │ │ │ ├── constant_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ └── type_feature.test │ │ ├── prolog/ │ │ │ ├── builtin_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── promql/ │ │ │ ├── aggregate_selection.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── subquery_selection.test │ │ │ └── time_series_selection.test │ │ ├── properties/ │ │ │ ├── comment_feature.test │ │ │ └── key_value_feature.test │ │ ├── protobuf/ │ │ │ ├── annotation_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── map_feature.test │ │ │ ├── rpc_feature.test │ │ │ └── string_feature.test │ │ ├── psl/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function-foreach_feature.test │ │ │ ├── heredoc_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── overall_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── pug/ │ │ │ ├── code_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── doctype_feature.test │ │ │ ├── filter_feature.test │ │ │ ├── flow-control_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── mixin_feature.test │ │ │ ├── multiline-plain-text_feature.test │ │ │ ├── multiline-script_feature.test │ │ │ ├── plain-text_feature.test │ │ │ ├── script_feature.test │ │ │ └── tag_feature.test │ │ ├── puppet/ │ │ │ ├── attr-name_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── datatype_feature.test │ │ │ ├── function_feature.test │ │ │ ├── heredoc_feature.test │ │ │ ├── interpolation_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── regex_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── pure/ │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── special_feature.test │ │ │ └── string_feature.test │ │ ├── purebasic/ │ │ │ ├── asm_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── tag_feature.test │ │ ├── purescript/ │ │ │ ├── builtin_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── hvariable_feature.test │ │ │ ├── import_statement_feature.test │ │ │ ├── issue3006.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── python/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── decorator_feature.test │ │ │ ├── function_feature.test │ │ │ ├── issue1355.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string-interpolation_feature.test │ │ │ ├── string_feature.test │ │ │ └── triple-quoted-string_feature.test │ │ ├── q/ │ │ │ ├── adverb_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── datetime_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ ├── symbol_feature.test │ │ │ └── verb_feature.test │ │ ├── qml/ │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── import_feature.test │ │ │ ├── javascript-function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── property_feature.test │ │ │ └── punctuation_feature.test │ │ ├── qore/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── qsharp/ │ │ │ ├── comments_feature.test │ │ │ ├── if_with_function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── namespace_feature.test │ │ │ ├── operators_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_assignment_numbers_feature.test │ │ ├── r/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── ellipsis_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── percent-operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── racket/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── identifier_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── lambda_parameter_feature.test │ │ │ ├── lang_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── symbol_feature.test │ │ ├── reason/ │ │ │ ├── char_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constructor_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── regex/ │ │ │ ├── anchor_feature.test │ │ │ ├── backreference_feature.test │ │ │ ├── char-class_feature.test │ │ │ ├── char-set_feature.test │ │ │ ├── escape_feature.test │ │ │ ├── group_feature.test │ │ │ ├── quantifier_feature.test │ │ │ └── range_feature.test │ │ ├── rego/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── renpy/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── property_feature.test │ │ │ ├── string_feature.test │ │ │ └── tag_feature.test │ │ ├── rescript/ │ │ │ ├── attr-value_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── tag_feature.test │ │ ├── rest/ │ │ │ ├── command-line-option_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── doctest-block_feature.test │ │ │ ├── field_feature.test │ │ │ ├── hr_feature.test │ │ │ ├── inline_feature.test │ │ │ ├── issue2940.test │ │ │ ├── link-target_feature.test │ │ │ ├── link_feature.test │ │ │ ├── list-bullet_feature.test │ │ │ ├── literal-block_feature.test │ │ │ ├── quoted-literal-block_feature.test │ │ │ ├── substitution-def_feature.test │ │ │ ├── table_feature.test │ │ │ └── title_feature.test │ │ ├── rip/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── date_time_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── reference_feature.test │ │ │ ├── regex_feature.test │ │ │ ├── string_feature.test │ │ │ └── symbol_feature.test │ │ ├── roboconf/ │ │ │ ├── comment_feature.test │ │ │ ├── component_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── optional_feature.test │ │ │ ├── property_feature.test │ │ │ ├── value_feature.test │ │ │ └── wildcard_feature.test │ │ ├── robotframework/ │ │ │ ├── comment_feature.test │ │ │ ├── documentation_feature.test │ │ │ ├── name_and_property_feature.test │ │ │ ├── sections_feature.test │ │ │ ├── settings_property_feature.test │ │ │ ├── tag_feature.test │ │ │ └── variable_feature.test │ │ ├── ruby/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── command_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── issue1336.test │ │ │ ├── keyword_feature.test │ │ │ ├── method_definition_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── regex_feature.test │ │ │ ├── string_feature.test │ │ │ ├── symbol_feature.test │ │ │ └── variable_feature.test │ │ ├── ruby+haml/ │ │ │ └── ruby_inclusion.test │ │ ├── rust/ │ │ │ ├── attribute_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── closure-params_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function_feature.test │ │ │ ├── issue1339.test │ │ │ ├── issue1353.test │ │ │ ├── keyword_feature.test │ │ │ ├── lifetime-annotation_feature.test │ │ │ ├── macro_example.test │ │ │ ├── macro_feature.test │ │ │ ├── namespace_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── sas/ │ │ │ ├── comment_feature.test │ │ │ ├── datalines_feature.test │ │ │ ├── datetime_feature.test │ │ │ ├── format_feature.test │ │ │ ├── function_feature.test │ │ │ ├── input_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── macro_feature.test │ │ │ ├── macro_string_function_feature.test │ │ │ ├── macrodefinition_feature.test │ │ │ ├── macrokeyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── options_feature.test │ │ │ ├── proccas_feature.test │ │ │ ├── step_feature.test │ │ │ └── string_feature.test │ │ ├── sass/ │ │ │ ├── atrule-line_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── property-line_feature.test │ │ │ ├── selector_feature.test │ │ │ └── variable-line_feature.test │ │ ├── scala/ │ │ │ ├── builtin_feature.test │ │ │ ├── char_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── string_feature.test │ │ │ └── symbol_feature.test │ │ ├── scheme/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── identifier_feature.test │ │ │ ├── issue1331.test │ │ │ ├── issue2609.test │ │ │ ├── issue2811.test │ │ │ ├── keyword_feature.test │ │ │ ├── lambda_parameter_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── symbol_feature.test │ │ ├── scss/ │ │ │ ├── atrule_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── module-modifier_feature.test │ │ │ ├── null_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── placeholder_feature.test │ │ │ ├── property_feature.test │ │ │ ├── selector_feature.test │ │ │ ├── statement_feature.test │ │ │ ├── url_feature.test │ │ │ └── variable_feature.test │ │ ├── scss+haml/ │ │ │ └── scss_inclusion.test │ │ ├── scss+pug/ │ │ │ └── scss_inclusion.test │ │ ├── shell-session/ │ │ │ ├── command_feature.test │ │ │ ├── command_string_feature.test │ │ │ ├── info_feature.test │ │ │ ├── issue2644.test │ │ │ ├── issue2685.test │ │ │ ├── issue2871.test │ │ │ ├── issue3047_1.test │ │ │ └── issue3047_2.test │ │ ├── smali/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── field_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── number_feature.test │ │ │ ├── register_feature.test │ │ │ └── string_feature.test │ │ ├── smalltalk/ │ │ │ ├── block-arguments_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_char_feature.test │ │ │ ├── string_feature.test │ │ │ ├── symbol_feature.test │ │ │ └── temporary-variables_feature.test │ │ ├── smarty/ │ │ │ ├── attr-name_feature.test │ │ │ ├── booelan_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── php_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── smarty_in_markup_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── smarty!+php/ │ │ │ └── inclusion.test │ │ ├── sml/ │ │ │ ├── boolean_feature.test │ │ │ ├── classname_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── word_feature.test │ │ ├── solidity/ │ │ │ ├── builtin_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── version_feature.test │ │ ├── solution-file/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── guid_feature.test │ │ │ ├── object_feature.test │ │ │ ├── property_feature.test │ │ │ └── string_feature.test │ │ ├── soy/ │ │ │ ├── boolean_feature.test │ │ │ ├── command-arg.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── literal_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── parameter_feature.test │ │ │ ├── property_feature.test │ │ │ ├── soy_in_markup_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── sparql/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── string_feature.test │ │ │ ├── tag_feature.test │ │ │ ├── url_feature.test │ │ │ └── variable_feature.test │ │ ├── splunk-spl/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── date_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── sqf/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── macro_feature.test │ │ │ ├── magic-variable_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── sql/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── identifier_feature.test │ │ │ ├── issue3140.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── sql+sas/ │ │ │ └── sql_inclusion.test │ │ ├── squirrel/ │ │ │ ├── attribute_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── stan/ │ │ │ ├── comment_feature.test │ │ │ ├── constraint_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── function-arg_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── program-block_feature.html.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── stata/ │ │ │ ├── boolean_feature.test │ │ │ ├── command_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── java_inclusion.test │ │ │ ├── keyword_feature.test │ │ │ ├── mata_inclusion.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── python_inclusion.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── stylus/ │ │ │ ├── atrule-declaration_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── func_feature.test │ │ │ ├── hexcode_feature.test │ │ │ ├── important_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── property-declaration_feature.test │ │ │ ├── selector_feature.test │ │ │ ├── string_feature.test │ │ │ ├── url_feature.test │ │ │ └── variable-declaration_feature.test │ │ ├── stylus+pug/ │ │ │ └── stylus_inclusion.test │ │ ├── supercollider/ │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── symbol_feature.test │ │ ├── swift/ │ │ │ ├── attribute_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── label_feature.test │ │ │ ├── literal_feature.test │ │ │ ├── number_feature.test │ │ │ ├── omit_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── short-argument_feature.test │ │ │ └── string_feature.test │ │ ├── systemd/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── key_feature.test │ │ │ ├── section_feature.test │ │ │ └── value_feature.test │ │ ├── t4-cs/ │ │ │ ├── block_class-feature_feature.test │ │ │ ├── block_directive_feature.test │ │ │ ├── block_expression_feature.test │ │ │ └── block_standard_feature.test │ │ ├── t4-vb/ │ │ │ └── block_feature.test │ │ ├── tap/ │ │ │ ├── bail_out_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── pass_fail_feature.test │ │ │ ├── plan_feature.test │ │ │ ├── pragma_feature.test │ │ │ ├── subtest_feature.test │ │ │ ├── version_feature.test │ │ │ └── yamlish_feature.test │ │ ├── tcl/ │ │ │ ├── builtin_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── scope_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── textile/ │ │ │ ├── acronym_feature.test │ │ │ ├── block-tag_feature.test │ │ │ ├── footnote_feature.test │ │ │ ├── image_feature.test │ │ │ ├── inline_feature.test │ │ │ ├── link-ref_feature.test │ │ │ ├── link_feature.test │ │ │ ├── list_feature.test │ │ │ ├── mark_feature.test │ │ │ ├── table_feature.test │ │ │ └── tag_feature.test │ │ ├── textile+haml/ │ │ │ └── textile_inclusion.test │ │ ├── toml/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── date_feature.test │ │ │ ├── key_feature.test │ │ │ ├── number_feature.test │ │ │ ├── string_feature.test │ │ │ └── table_feature.test │ │ ├── treeview/ │ │ │ ├── ascii.html.test │ │ │ ├── box.html.test │ │ │ ├── markers_feature.html.test │ │ │ └── symlink_feature.test │ │ ├── tremor/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── extractor_feature.test │ │ │ ├── function_feature.test │ │ │ ├── identifier_feature.test │ │ │ ├── keyword_escape_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── modularity_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── tsx/ │ │ │ ├── issue2594.test │ │ │ ├── issue3089.test │ │ │ └── tag_feature.test │ │ ├── tt2/ │ │ │ ├── comment_feature.test │ │ │ ├── delimiter_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string-interpolation_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── turtle/ │ │ │ ├── blank-node_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── language-tag_feature.test │ │ │ ├── local-name-with-colons_feature.test │ │ │ ├── number_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── twig/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── markup_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── twig+pug/ │ │ │ └── twig_inclusion.test │ │ ├── typescript/ │ │ │ ├── builtin_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── decorator_feature.test │ │ │ ├── function_feature.test │ │ │ ├── issue2819.test │ │ │ ├── issue2860.test │ │ │ ├── issue3000.test │ │ │ ├── keyword_feature.html.test │ │ │ └── keyword_feature.test │ │ ├── typoscript/ │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ └── tag_string_feature.test │ │ ├── unrealscript/ │ │ │ ├── boolean_feature.test │ │ │ ├── category_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── macro_feature.test │ │ │ ├── metadata_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── uorazor/ │ │ │ ├── boolean_feature.test │ │ │ ├── breakdown_script_example_feature.test │ │ │ ├── commands_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── functions_feature.test │ │ │ ├── keyword_feature.test │ │ │ └── source_layers_feature.test │ │ ├── uri/ │ │ │ ├── authority_feature.test │ │ │ ├── full.test │ │ │ ├── query_feature.test │ │ │ ├── relative.test │ │ │ └── scheme_feature.test │ │ ├── v/ │ │ │ ├── attribute_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── char_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── vala/ │ │ │ ├── class-name_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── regex_feature.test │ │ │ └── string_feature.test │ │ ├── vbnet/ │ │ │ ├── comment_feature.test │ │ │ ├── issue2781.test │ │ │ ├── keyword_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── vbnet!+xml-doc/ │ │ │ └── inclusion.test │ │ ├── velocity/ │ │ │ ├── directive_feature.test │ │ │ ├── unparsed_feature.test │ │ │ ├── variable_feature.test │ │ │ └── velocity-comment_feature.test │ │ ├── verilog/ │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function_feature.test │ │ │ ├── important_feature.test │ │ │ ├── kernel-function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── vhdl/ │ │ │ ├── attribute_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── string_feature.test │ │ │ └── vhdl-vectors_feature.test │ │ ├── vim/ │ │ │ ├── builtin_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── visual-basic/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── date_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ └── string_feature.test │ │ ├── warpscript/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── macro_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── wasm/ │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── string_feature.test │ │ │ └── variable_feature.test │ │ ├── web-idl/ │ │ │ ├── boolean_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── namespace_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── primitive-type_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── wgsl/ │ │ │ ├── attributes_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── class_name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── literal_feature.test │ │ │ ├── operator_feature.test │ │ │ └── punctuation_feature.test │ │ ├── wiki/ │ │ │ ├── block-comment_feature.test │ │ │ ├── emphasis_feature.test │ │ │ ├── heading_feature.test │ │ │ ├── hr_feature.test │ │ │ ├── nowiki_feature.test │ │ │ ├── symbol_feature.test │ │ │ ├── url_feature.test │ │ │ └── variable_feature.test │ │ ├── wolfram/ │ │ │ ├── black_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── context_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── wren/ │ │ │ ├── attribute_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── class-name_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── constant_feature.test │ │ │ ├── function_feature.test │ │ │ ├── hashbang_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── xeora/ │ │ │ ├── constant_feature.test │ │ │ ├── directive-block-close_feature.test │ │ │ ├── directive-block-open_feature.test │ │ │ ├── directive-block-separator_feature.test │ │ │ ├── directive-inline_feature.test │ │ │ ├── function-block_feature.test │ │ │ ├── function-inline_feature.test │ │ │ └── variable_feature.test │ │ ├── xml/ │ │ │ ├── cdata_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── doctype_feature.test │ │ │ ├── entity_feature.html.test │ │ │ ├── issue3441.test │ │ │ ├── issue585.test │ │ │ ├── issue888.test │ │ │ ├── prolog_feature.test │ │ │ ├── tag_attribute_feature.test │ │ │ └── tag_feature.test │ │ ├── xml+http/ │ │ │ ├── issue2733.test │ │ │ ├── text-xml_inclusion.test │ │ │ ├── xml-suffix_inclusion.test │ │ │ └── xml_inclusion.test │ │ ├── xojo/ │ │ │ ├── comment_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── punctuation_feature.test │ │ │ └── string_feature.test │ │ ├── xquery/ │ │ │ ├── axis_feature.test │ │ │ ├── builtin_feature.test │ │ │ ├── extension_feature.test │ │ │ ├── function_feature.test │ │ │ ├── keyword-operator_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── number_feature.test │ │ │ ├── operator_feature.test │ │ │ ├── plain-text_feature.test │ │ │ ├── string_feature.test │ │ │ ├── tag_feature.test │ │ │ ├── variable_feature.test │ │ │ ├── xquery-attribute_feature.test │ │ │ ├── xquery-comment_feature.test │ │ │ └── xquery-element_feature.test │ │ ├── yaml/ │ │ │ ├── anchor_and_alias_feature.test │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── datetime_feature.test │ │ │ ├── directive_feature.test │ │ │ ├── important_feature.test │ │ │ ├── key_feature.test │ │ │ ├── null_feature.test │ │ │ ├── number_feature.test │ │ │ ├── scalar_feature.test │ │ │ ├── string_feature.test │ │ │ └── tag_feature.test │ │ ├── yaml+markdown/ │ │ │ └── front-matter_feature.test │ │ ├── yang/ │ │ │ ├── boolean_feature.test │ │ │ ├── comment_feature.test │ │ │ ├── keyword_feature.test │ │ │ ├── namespace_feature.test │ │ │ └── string_feature.test │ │ └── zig/ │ │ ├── builtin-type_feature.test │ │ ├── builtin_feature.test │ │ ├── class-name_feature.test │ │ ├── comment_feature.test │ │ ├── keyword_feature.test │ │ ├── label_feature.test │ │ ├── number_feature.test │ │ ├── operator_feature.test │ │ ├── punctuation_feature.test │ │ └── string_char_feature.test │ ├── pattern-tests.js │ ├── plugins/ │ │ ├── autolinker/ │ │ │ ├── __snapshots__/ │ │ │ │ └── basic-functionality.js.snap │ │ │ └── basic-functionality.js │ │ ├── copy-to-clipboard/ │ │ │ └── basic-functionality.js │ │ ├── custom-class/ │ │ │ ├── __snapshots__/ │ │ │ │ └── basic-functionality.js.snap │ │ │ └── basic-functionality.js │ │ ├── data-uri-highlight/ │ │ │ ├── __snapshots__/ │ │ │ │ └── basic-functionality.js.snap │ │ │ └── basic-functionality.js │ │ ├── diff-highlight/ │ │ │ ├── __snapshots__/ │ │ │ │ └── basic-functionality.js.snap │ │ │ └── basic-functionality.js │ │ ├── highlight-keywords/ │ │ │ ├── __snapshots__/ │ │ │ │ └── basic-functionality.js.snap │ │ │ └── basic-functionality.js │ │ ├── keep-markup/ │ │ │ └── test.js │ │ ├── line-highlight/ │ │ │ ├── __snapshots__/ │ │ │ │ └── basic-functionality.js.snap │ │ │ └── basic-functionality.js │ │ ├── show-invisibles/ │ │ │ ├── __snapshots__/ │ │ │ │ └── basic-functionality.js.snap │ │ │ └── basic-functionality.js │ │ ├── show-language/ │ │ │ └── basic-functionality.js │ │ ├── unescaped-markup/ │ │ │ └── basic-functionality.js │ │ └── wpd/ │ │ ├── __snapshots__/ │ │ │ └── basic-functionality.js.snap │ │ └── basic-functionality.js │ ├── run.js │ ├── testrunner-tests.js │ ├── tsconfig.json │ └── types.d.ts └── tsconfig.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ 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 ================================================ FILE: .gitattributes ================================================ * text=auto ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve. title: '' labels: '' assignees: '' --- **Information:** - Prism version: [e.g. 1.14, latest from the download page, etc.] - Plugins: [a list of plugins you are using or 'none'] - Environment: [e.g. Browser, Node, Webpack] **Description** A clear and concise description of what the bug is and how to reproduce it. If applicable, add screenshots to help explain your problem. **Example** An example which reproduces the bug. This can be a link to a website, a [JSFiddle](https://jsfiddle.net/), an attached example project, etc. ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ contact_links: - name: Questions and Help url: https://github.com/PrismJS/prism/discussions/categories/q-a about: This issue tracker is not for support questions. Please refer to the Prism's Discussion tab. ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest a new feature for Prism. title: '' labels: enhancement assignees: '' --- **Motivation** Please explain the problem you're having/why you propose this feature. Ex. I'm always frustrated when [...] **Description** A clear and concise description of what you want to happen. **Alternatives** A clear and concise description of any alternative solutions or features you've considered, if applicable. ================================================ FILE: .github/ISSUE_TEMPLATE/highlighting-bug-report.md ================================================ --- name: Highlighting bug report about: Does Prism highlight parts of your code incorrectly or is a language feature not supported? title: '' labels: language-definitions assignees: '' --- **Information** - Language: [e.g. C++, JavaScript, YAML, etc.] - Plugins: [a list of plugins you are using or 'none'] **Description** A clear and concise description of what is being highlighted incorrectly and how it should be highlighted instead. Add screenshots to illustrate the problem. **Code snippet** [Test page]()
The code being highlighted incorrectly. ``` Your code goes here ```
================================================ FILE: .github/ISSUE_TEMPLATE/new-language-request.md ================================================ --- name: New language request about: Suggest a new language Prism should support. title: '' labels: language-definitions, new language assignees: '' --- **Language** A short description of the language. **Additional resources** E.g. The official website, documentation or language specification. ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: 'github-actions' directory: '/' schedule: interval: 'weekly' ================================================ FILE: .github/workflows/danger.yml ================================================ name: Danger on: pull_request_target: jobs: run: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 with: fetch-depth: 0 # create a new branch called pr from the remote PR branch - run: git remote add pr_repo $PR_URL && git fetch pr_repo $PR_REF && git branch pr pr_repo/$PR_REF env: PR_URL: ${{github.event.pull_request.head.repo.clone_url}} PR_REF: ${{github.event.pull_request.head.ref}} - run: npm ci - name: Danger run: npx danger ci env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .github/workflows/test.yml ================================================ name: CI on: push: branches: [v2] pull_request: branches: [v2] permissions: contents: read jobs: tests: runs-on: ubuntu-latest strategy: matrix: node-version: [20.x, 22.x, 24.x] steps: - uses: actions/checkout@v6 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm test build: runs-on: ubuntu-latest strategy: matrix: node-version: [20.x, 22.x, 24.x] steps: - uses: actions/checkout@v6 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm run build lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Use Node.js 20.x uses: actions/setup-node@v3 with: node-version: 20.x - run: npm ci - run: npm run lint:ci coverage: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Use Node.js 20.x uses: actions/setup-node@v3 with: node-version: 20.x - run: npm ci - run: npm run regex-coverage ================================================ FILE: .github/workflows/website-rebuild.yml ================================================ name: Rebuild Website on: push: branches: # FIXME: Use the main branch when v2 is out - v2 jobs: trigger-rebuild: runs-on: ubuntu-latest steps: - name: Trigger Netlify Build Hook run: curl -X POST -d "{}" "${{ secrets.WEBSITE_BUILD_HOOK_URL }}?trigger_title=The+Prism+code+has+been+updated" ================================================ FILE: .gitignore ================================================ hide-*.js node_modules .idea/ .DS_Store .eslintcache dist/ types/ benchmark/remotes/ benchmark/downloads/ ================================================ FILE: .jsdoc.json ================================================ { "plugins": ["plugins/markdown", "./gulpfile.js/docs.js"], "opts": { "destination": "./docs", "encoding": "utf8", "template": "./node_modules/docdash", "access": ["public", "protected"] }, "recurseDepth": 10, "source": { "includePattern": "\\.js$", "excludePattern": "\\.min\\.js$" }, "tags": { "allowUnknownTags": true, "dictionaries": ["jsdoc", "closure"] }, "templates": { "cleverLinks": true, "monospaceLinks": true, "default": { "includeDate": false } }, "docdash": { "static": true, "sort": true, "search": true, "collapse": false, "wrap": false, "typedefs": true, "private": false, "scripts": ["styles/overwrites.css"], "openGraph": { "title": "Prism generated API documentation", "type": "website", "image": "/logo.svg", "site_name": "Prism", "url": "https://prismjs.com" }, "menu": { "PrismJS": { "href": "https://prismjs.com", "class": "menu-item", "id": "website_link" }, "GitHub": { "href": "https://github.com/PrismJS/prism", "target": "_blank", "class": "menu-item", "id": "github_link" } } } } ================================================ FILE: .npmignore ================================================ .idea *.iml hide-*.js .DS_Store CNAME .github/ benchmark/ tests/ *.tgz *.html *.svg composer.json dangerfile.js .editorconfig .gitattributes .travis.yml eslint.config.mjs .eslintcache .jsdoc.json MAINTAINERS.md SECURITY.md ================================================ FILE: .prettierrc.js ================================================ /** * @see https://prettier.io/docs/configuration * @type {import("prettier").Config} */ export default { plugins: [ '@ianvs/prettier-plugin-sort-imports', // Consider https://www.npmjs.com/package/prettier-plugin-organize-imports as an alternative 'prettier-plugin-brace-style', 'prettier-plugin-space-before-function-paren', 'prettier-plugin-merge', ], importOrder: [ '', // Node.js built-in modules '', // Imports not matched by other special words or groups. '^\\.\\./', // Parent imports '^\\./', // Sibling imports '^\\.$', // Index file '', // Type imports ], braceStyle: 'stroustrup', arrowParens: 'avoid', bracketSpacing: true, endOfLine: 'auto', semi: true, singleQuote: true, tabWidth: 4, useTabs: true, trailingComma: 'es5', quoteProps: 'preserve', printWidth: 100, overrides: [ { files: ['*.yml', '*.yaml'], options: { tabWidth: 2, }, }, { files: '*.css', options: { singleQuote: false, }, }, ], }; ================================================ FILE: .vscode/settings.json ================================================ { "editor.formatOnSave": true, "editor.formatOnSaveMode": "file", "editor.defaultFormatter": "esbenp.prettier-vscode", "prettier.enable": true } ================================================ FILE: CHANGELOG.md ================================================ # Prism Changelog ## 1.29.0 (2022-08-23) ### New components - **BBj** ([#3511](https://github.com/PrismJS/prism/issues/3511)) [`1134bdfc`](https://github.com/PrismJS/prism/commit/1134bdfc) - **BQN** ([#3515](https://github.com/PrismJS/prism/issues/3515)) [`859f99a0`](https://github.com/PrismJS/prism/commit/859f99a0) - **Cilk/C** & **Cilk/C++** ([#3522](https://github.com/PrismJS/prism/issues/3522)) [`c8462a29`](https://github.com/PrismJS/prism/commit/c8462a29) - **Gradle** ([#3443](https://github.com/PrismJS/prism/issues/3443)) [`32119823`](https://github.com/PrismJS/prism/commit/32119823) - **METAFONT** ([#3465](https://github.com/PrismJS/prism/issues/3465)) [`2815f699`](https://github.com/PrismJS/prism/commit/2815f699) - **WGSL** ([#3455](https://github.com/PrismJS/prism/issues/3455)) [`4c87d418`](https://github.com/PrismJS/prism/commit/4c87d418) ### Updated components - **AsciiDoc** - Some regexes are too greedy ([#3481](https://github.com/PrismJS/prism/issues/3481)) [`c4cbeeaa`](https://github.com/PrismJS/prism/commit/c4cbeeaa) - **Bash** - Added "sh" alias ([#3509](https://github.com/PrismJS/prism/issues/3509)) [`6b824d47`](https://github.com/PrismJS/prism/commit/6b824d47) - Added support for parameters and the `java` and `sysctl` commands. ([#3505](https://github.com/PrismJS/prism/issues/3505)) [`b9512b22`](https://github.com/PrismJS/prism/commit/b9512b22) - Added `cargo` command ([#3488](https://github.com/PrismJS/prism/issues/3488)) [`3e937137`](https://github.com/PrismJS/prism/commit/3e937137) - **BBj** - Improve regexes ([#3512](https://github.com/PrismJS/prism/issues/3512)) [`0cad9ae5`](https://github.com/PrismJS/prism/commit/0cad9ae5) - **CSS** - Fixed @-rules not accounting for strings ([#3438](https://github.com/PrismJS/prism/issues/3438)) [`0d4b6cb6`](https://github.com/PrismJS/prism/commit/0d4b6cb6) - **CSS Extras** - Added support for `RebeccaPurple` color ([#3448](https://github.com/PrismJS/prism/issues/3448)) [`646b2e0a`](https://github.com/PrismJS/prism/commit/646b2e0a) - **Hoon** - Fixed escaped strings ([#3473](https://github.com/PrismJS/prism/issues/3473)) [`64642716`](https://github.com/PrismJS/prism/commit/64642716) - **Java** - Added support for constants ([#3507](https://github.com/PrismJS/prism/issues/3507)) [`342a0039`](https://github.com/PrismJS/prism/commit/342a0039) - **Markup** - Fixed quotes in HTML attribute values ([#3442](https://github.com/PrismJS/prism/issues/3442)) [`ca8eaeee`](https://github.com/PrismJS/prism/commit/ca8eaeee) - **NSIS** - Added missing commands ([#3504](https://github.com/PrismJS/prism/issues/3504)) [`b0c2a9b4`](https://github.com/PrismJS/prism/commit/b0c2a9b4) - **Scala** - Updated keywords to support Scala 3 ([#3506](https://github.com/PrismJS/prism/issues/3506)) [`a090d063`](https://github.com/PrismJS/prism/commit/a090d063) - **SCSS** - Fix casing in title of the `scss` lang ([#3501](https://github.com/PrismJS/prism/issues/3501)) [`2aed9ce7`](https://github.com/PrismJS/prism/commit/2aed9ce7) ### Updated plugins - **Line Highlight** - Account for offset when clamping ranges ([#3518](https://github.com/PrismJS/prism/issues/3518)) [`098e3000`](https://github.com/PrismJS/prism/commit/098e3000) - Ignore ranges outside of actual lines ([#3475](https://github.com/PrismJS/prism/issues/3475)) [`9a4e725b`](https://github.com/PrismJS/prism/commit/9a4e725b) - **Normalize Whitespace** - Add configuration via attributes ([#3467](https://github.com/PrismJS/prism/issues/3467)) [`91dea0c8`](https://github.com/PrismJS/prism/commit/91dea0c8) ### Other - Added security policy ([#3070](https://github.com/PrismJS/prism/issues/3070)) [`05ee042a`](https://github.com/PrismJS/prism/commit/05ee042a) - Added list of maintainers ([#3410](https://github.com/PrismJS/prism/issues/3410)) [`866b302e`](https://github.com/PrismJS/prism/commit/866b302e) - Included githubactions in the dependabot config ([#3470](https://github.com/PrismJS/prism/issues/3470)) [`9561a9ab`](https://github.com/PrismJS/prism/commit/9561a9ab) - Set permissions for GitHub actions ([#3468](https://github.com/PrismJS/prism/issues/3468)) [`b85e1ada`](https://github.com/PrismJS/prism/commit/b85e1ada) - **Website** - Website: Added third-party tutorial for Pug template ([#3459](https://github.com/PrismJS/prism/issues/3459)) [`15272f76`](https://github.com/PrismJS/prism/commit/15272f76) - Docs: Add missing word ([#3489](https://github.com/PrismJS/prism/issues/3489)) [`9d603ef4`](https://github.com/PrismJS/prism/commit/9d603ef4) ## 1.28.0 (2022-04-17) ### New components - **Ado** & **Mata** (Stata) ([#3383](https://github.com/PrismJS/prism/issues/3383)) [`63806d57`](https://github.com/PrismJS/prism/commit/63806d57) - **ARM Assembly** ([#3376](https://github.com/PrismJS/prism/issues/3376)) [`554ff324`](https://github.com/PrismJS/prism/commit/554ff324) - **Arturo** ([#3403](https://github.com/PrismJS/prism/issues/3403)) [`e2fe1f79`](https://github.com/PrismJS/prism/commit/e2fe1f79) - **AWK** & **GAWK** ([#3374](https://github.com/PrismJS/prism/issues/3374)) [`ea8a0f40`](https://github.com/PrismJS/prism/commit/ea8a0f40) - **Cooklang** ([#3337](https://github.com/PrismJS/prism/issues/3337)) [`4eb928c3`](https://github.com/PrismJS/prism/commit/4eb928c3) - **CUE** ([#3375](https://github.com/PrismJS/prism/issues/3375)) [`a1340666`](https://github.com/PrismJS/prism/commit/a1340666) - **gettext** ([#3369](https://github.com/PrismJS/prism/issues/3369)) [`dfef9b61`](https://github.com/PrismJS/prism/commit/dfef9b61) - **GNU Linker Script** ([#3373](https://github.com/PrismJS/prism/issues/3373)) [`33f2cf95`](https://github.com/PrismJS/prism/commit/33f2cf95) - **Odin** ([#3424](https://github.com/PrismJS/prism/issues/3424)) [`8a3fef6d`](https://github.com/PrismJS/prism/commit/8a3fef6d) - **PlantUML** ([#3372](https://github.com/PrismJS/prism/issues/3372)) [`0d49553c`](https://github.com/PrismJS/prism/commit/0d49553c) - **ReScript** ([#3435](https://github.com/PrismJS/prism/issues/3435)) [`cbef9af7`](https://github.com/PrismJS/prism/commit/cbef9af7) - **SuperCollider** ([#3371](https://github.com/PrismJS/prism/issues/3371)) [`1b1d6731`](https://github.com/PrismJS/prism/commit/1b1d6731) ### Updated components - **.properties** - Use `key`, `value` for token names; `attr-name`, `attr-value` as aliases ([#3377](https://github.com/PrismJS/prism/issues/3377)) [`b94a664d`](https://github.com/PrismJS/prism/commit/b94a664d) - **ABAP** - Sorted keyword list ([#3368](https://github.com/PrismJS/prism/issues/3368)) [`7bda2bf1`](https://github.com/PrismJS/prism/commit/7bda2bf1) - **Ada** - Changed `attr-name` to `attribute`; Use `attr-name` as alias ([#3381](https://github.com/PrismJS/prism/issues/3381)) [`cde0b5b2`](https://github.com/PrismJS/prism/commit/cde0b5b2) - Added `or` keyword ([#3380](https://github.com/PrismJS/prism/issues/3380)) [`c30b736f`](https://github.com/PrismJS/prism/commit/c30b736f) - **Atmel AVR Assembly** - Fixed `&=` and `|=` operators ([#3395](https://github.com/PrismJS/prism/issues/3395)) [`8c4ae5a5`](https://github.com/PrismJS/prism/commit/8c4ae5a5) - **AutoHotkey** - Use standard tokens ([#3385](https://github.com/PrismJS/prism/issues/3385)) [`61c460e8`](https://github.com/PrismJS/prism/commit/61c460e8) - Use general pattern instead of name list for directives ([#3384](https://github.com/PrismJS/prism/issues/3384)) [`7ac84dda`](https://github.com/PrismJS/prism/commit/7ac84dda) - **CFScript** - Simplified operator regex ([#3396](https://github.com/PrismJS/prism/issues/3396)) [`6a215fe0`](https://github.com/PrismJS/prism/commit/6a215fe0) - **CMake** - Simplified `variable` and `operator` regexes ([#3398](https://github.com/PrismJS/prism/issues/3398)) [`8e59744b`](https://github.com/PrismJS/prism/commit/8e59744b) - **Erlang** - Added `begin` keyword ([#3387](https://github.com/PrismJS/prism/issues/3387)) [`cf38d059`](https://github.com/PrismJS/prism/commit/cf38d059) - **Excel Formula** - Use more fitting aliases for `function-name`, `range`, and `cell` ([#3391](https://github.com/PrismJS/prism/issues/3391)) [`ef0ec02a`](https://github.com/PrismJS/prism/commit/ef0ec02a) - **Flow** - Changed alias of `type` to `class-name` ([#3390](https://github.com/PrismJS/prism/issues/3390)) [`ce41434d`](https://github.com/PrismJS/prism/commit/ce41434d) - Recognise `[Ss]ymbol` as a type ([#3388](https://github.com/PrismJS/prism/issues/3388)) [`3916883a`](https://github.com/PrismJS/prism/commit/3916883a) - **GEDCOM** - Update `tag` to `record` ([#3386](https://github.com/PrismJS/prism/issues/3386)) [`f8f95340`](https://github.com/PrismJS/prism/commit/f8f95340) - **Groovy** - Added string interpolation without hook ([#3366](https://github.com/PrismJS/prism/issues/3366)) [`5617765f`](https://github.com/PrismJS/prism/commit/5617765f) - **Handlebars** - Added Mustache alias ([#3422](https://github.com/PrismJS/prism/issues/3422)) [`cb5229af`](https://github.com/PrismJS/prism/commit/cb5229af) - **Java** - Improved class name detection ([#3351](https://github.com/PrismJS/prism/issues/3351)) [`4cb3d038`](https://github.com/PrismJS/prism/commit/4cb3d038) - Fixed `record` false positives ([#3348](https://github.com/PrismJS/prism/issues/3348)) [`3bd8fdb1`](https://github.com/PrismJS/prism/commit/3bd8fdb1) - **JavaScript** - Added support for new regex syntax ([#3399](https://github.com/PrismJS/prism/issues/3399)) [`ca78cde6`](https://github.com/PrismJS/prism/commit/ca78cde6) - **Keyman** - Added new keywords ([#3401](https://github.com/PrismJS/prism/issues/3401)) [`bac36827`](https://github.com/PrismJS/prism/commit/bac36827) - **MEL** - Improved functions, code, and comments ([#3393](https://github.com/PrismJS/prism/issues/3393)) [`8e648dab`](https://github.com/PrismJS/prism/commit/8e648dab) - **NEON** - Change alias of `key` to `property` ([#3394](https://github.com/PrismJS/prism/issues/3394)) [`1c533f4a`](https://github.com/PrismJS/prism/commit/1c533f4a) - **PHP** - Added `never` return type + minor fix of named arguments ([#3421](https://github.com/PrismJS/prism/issues/3421)) [`4ffab525`](https://github.com/PrismJS/prism/commit/4ffab525) - Added `readonly` keyword ([#3349](https://github.com/PrismJS/prism/issues/3349)) [`4c3f1969`](https://github.com/PrismJS/prism/commit/4c3f1969) - **PureBasic** - Added support for pointer to string operator ([#3362](https://github.com/PrismJS/prism/issues/3362)) [`499b1fa0`](https://github.com/PrismJS/prism/commit/499b1fa0) - **Razor C#** - Added support for `@helper` and inline C# inside attribute values ([#3355](https://github.com/PrismJS/prism/issues/3355)) [`31a38d0c`](https://github.com/PrismJS/prism/commit/31a38d0c) - **VHDL** - Add `private`, `view` keywords; Distinguish `attribute` from `keyword` ([#3389](https://github.com/PrismJS/prism/issues/3389)) [`d1a5ce30`](https://github.com/PrismJS/prism/commit/d1a5ce30) - **Wolfram language** - Simplified `operator` regex ([#3397](https://github.com/PrismJS/prism/issues/3397)) [`10ae6da3`](https://github.com/PrismJS/prism/commit/10ae6da3) ### Updated plugins - **Autolinker** - Fixed URL regex to match more valid URLs ([#3358](https://github.com/PrismJS/prism/issues/3358)) [`17ed9160`](https://github.com/PrismJS/prism/commit/17ed9160) - **Command Line** - Add support for command continuation prefix ([#3344](https://github.com/PrismJS/prism/issues/3344)) [`b53832cd`](https://github.com/PrismJS/prism/commit/b53832cd) - Increased prompt opacity ([#3352](https://github.com/PrismJS/prism/issues/3352)) [`f95dd190`](https://github.com/PrismJS/prism/commit/f95dd190) - **Keep Markup** - Use original nodes instead of clones ([#3365](https://github.com/PrismJS/prism/issues/3365)) [`8a843a17`](https://github.com/PrismJS/prism/commit/8a843a17) ### Other - **Infrastructure** - Use terser ([#3407](https://github.com/PrismJS/prism/issues/3407)) [`11c54624`](https://github.com/PrismJS/prism/commit/11c54624) - Tests: Cache results for exp backtracking check ([#3356](https://github.com/PrismJS/prism/issues/3356)) [`ead22e1e`](https://github.com/PrismJS/prism/commit/ead22e1e) - **Website** - More documentation for language definitons ([#3427](https://github.com/PrismJS/prism/issues/3427)) [`333bd590`](https://github.com/PrismJS/prism/commit/333bd590) ## 1.27.0 (2022-02-17) ### New components - **UO Razor Script** ([#3309](https://github.com/PrismJS/prism/issues/3309)) [`3f8cc5a0`](https://github.com/PrismJS/prism/commit/3f8cc5a0) ### Updated components - **AutoIt** - Allow hyphen in directive ([#3308](https://github.com/PrismJS/prism/issues/3308)) [`bcb2e2c8`](https://github.com/PrismJS/prism/commit/bcb2e2c8) - **EditorConfig** - Change alias of `section` from `keyword` to `selector` ([#3305](https://github.com/PrismJS/prism/issues/3305)) [`e46501b9`](https://github.com/PrismJS/prism/commit/e46501b9) - **Ini** - Swap out `header` for `section` ([#3304](https://github.com/PrismJS/prism/issues/3304)) [`deb3a97f`](https://github.com/PrismJS/prism/commit/deb3a97f) - **MongoDB** - Added v5 support ([#3297](https://github.com/PrismJS/prism/issues/3297)) [`8458c41f`](https://github.com/PrismJS/prism/commit/8458c41f) - **PureBasic** - Added missing keyword and fixed constants ending with `$` ([#3320](https://github.com/PrismJS/prism/issues/3320)) [`d6c53726`](https://github.com/PrismJS/prism/commit/d6c53726) - **Scala** - Added support for interpolated strings ([#3293](https://github.com/PrismJS/prism/issues/3293)) [`441a1422`](https://github.com/PrismJS/prism/commit/441a1422) - **Systemd configuration file** - Swap out `operator` for `punctuation` ([#3306](https://github.com/PrismJS/prism/issues/3306)) [`2eb89e15`](https://github.com/PrismJS/prism/commit/2eb89e15) ### Updated plugins - **Command Line** - Escape markup in command line output ([#3341](https://github.com/PrismJS/prism/issues/3341)) [`e002e78c`](https://github.com/PrismJS/prism/commit/e002e78c) - Add support for line continuation and improved colors ([#3326](https://github.com/PrismJS/prism/issues/3326)) [`1784b175`](https://github.com/PrismJS/prism/commit/1784b175) - Added span around command and output ([#3312](https://github.com/PrismJS/prism/issues/3312)) [`82d0ca15`](https://github.com/PrismJS/prism/commit/82d0ca15) ### Other - **Core** - Added better error message for missing grammars ([#3311](https://github.com/PrismJS/prism/issues/3311)) [`2cc4660b`](https://github.com/PrismJS/prism/commit/2cc4660b) ## 1.26.0 (2022-01-06) ### New components - **Atmel AVR Assembly** ([#2078](https://github.com/PrismJS/prism/issues/2078)) [`b5a70e4c`](https://github.com/PrismJS/prism/commit/b5a70e4c) - **Go module** ([#3209](https://github.com/PrismJS/prism/issues/3209)) [`8476a9ab`](https://github.com/PrismJS/prism/commit/8476a9ab) - **Keepalived Configure** ([#2417](https://github.com/PrismJS/prism/issues/2417)) [`d908e457`](https://github.com/PrismJS/prism/commit/d908e457) - **Tremor** & **Trickle** & **Troy** ([#3087](https://github.com/PrismJS/prism/issues/3087)) [`ec25ba65`](https://github.com/PrismJS/prism/commit/ec25ba65) - **Web IDL** ([#3107](https://github.com/PrismJS/prism/issues/3107)) [`ef53f021`](https://github.com/PrismJS/prism/commit/ef53f021) ### Updated components - Use `\d` for `[0-9]` ([#3097](https://github.com/PrismJS/prism/issues/3097)) [`9fe2f93e`](https://github.com/PrismJS/prism/commit/9fe2f93e) - **6502 Assembly** - Use standard tokens and minor improvements ([#3184](https://github.com/PrismJS/prism/issues/3184)) [`929c33e0`](https://github.com/PrismJS/prism/commit/929c33e0) - **AppleScript** - Use `class-name` standard token ([#3182](https://github.com/PrismJS/prism/issues/3182)) [`9f5e511d`](https://github.com/PrismJS/prism/commit/9f5e511d) - **AQL** - Differentiate between strings and identifiers ([#3183](https://github.com/PrismJS/prism/issues/3183)) [`fa540ab7`](https://github.com/PrismJS/prism/commit/fa540ab7) - **Arduino** - Added `ino` alias ([#2990](https://github.com/PrismJS/prism/issues/2990)) [`5b7ce5e4`](https://github.com/PrismJS/prism/commit/5b7ce5e4) - **Avro IDL** - Removed char syntax ([#3185](https://github.com/PrismJS/prism/issues/3185)) [`c7809285`](https://github.com/PrismJS/prism/commit/c7809285) - **Bash** - Added `node` to known commands ([#3291](https://github.com/PrismJS/prism/issues/3291)) [`4b19b502`](https://github.com/PrismJS/prism/commit/4b19b502) - Added `vcpkg` command ([#3282](https://github.com/PrismJS/prism/issues/3282)) [`b351bc69`](https://github.com/PrismJS/prism/commit/b351bc69) - Added `docker` and `podman` commands ([#3237](https://github.com/PrismJS/prism/issues/3237)) [`8c5ed251`](https://github.com/PrismJS/prism/commit/8c5ed251) - **Birb** - Fixed class name false positives ([#3111](https://github.com/PrismJS/prism/issues/3111)) [`d7017beb`](https://github.com/PrismJS/prism/commit/d7017beb) - **Bro** - Removed `variable` and minor improvements ([#3186](https://github.com/PrismJS/prism/issues/3186)) [`4cebf34c`](https://github.com/PrismJS/prism/commit/4cebf34c) - **BSL (1C:Enterprise)** - Made `directive` greedy ([#3112](https://github.com/PrismJS/prism/issues/3112)) [`5c412cbb`](https://github.com/PrismJS/prism/commit/5c412cbb) - **C** - Added `char` token ([#3207](https://github.com/PrismJS/prism/issues/3207)) [`d85a64ae`](https://github.com/PrismJS/prism/commit/d85a64ae) - **C#** - Added `char` token ([#3270](https://github.com/PrismJS/prism/issues/3270)) [`220bc40f`](https://github.com/PrismJS/prism/commit/220bc40f) - Move everything into the IIFE ([#3077](https://github.com/PrismJS/prism/issues/3077)) [`9ed4cf6e`](https://github.com/PrismJS/prism/commit/9ed4cf6e) - **Clojure** - Added `char` token ([#3188](https://github.com/PrismJS/prism/issues/3188)) [`1c88c7da`](https://github.com/PrismJS/prism/commit/1c88c7da) - **Concurnas** - Improved tokenization ([#3189](https://github.com/PrismJS/prism/issues/3189)) [`7b34e65d`](https://github.com/PrismJS/prism/commit/7b34e65d) - **Content-Security-Policy** - Improved tokenization ([#3276](https://github.com/PrismJS/prism/issues/3276)) [`a943f2bb`](https://github.com/PrismJS/prism/commit/a943f2bb) - **Coq** - Improved attribute pattern performance ([#3085](https://github.com/PrismJS/prism/issues/3085)) [`2f9672aa`](https://github.com/PrismJS/prism/commit/2f9672aa) - **Crystal** - Improved tokenization ([#3194](https://github.com/PrismJS/prism/issues/3194)) [`51e3ecc0`](https://github.com/PrismJS/prism/commit/51e3ecc0) - **Cypher** - Removed non-standard use of `symbol` token name ([#3195](https://github.com/PrismJS/prism/issues/3195)) [`6af8a644`](https://github.com/PrismJS/prism/commit/6af8a644) - **D** - Added standard char token ([#3196](https://github.com/PrismJS/prism/issues/3196)) [`dafdbdec`](https://github.com/PrismJS/prism/commit/dafdbdec) - **Dart** - Added string interpolation and improved metadata ([#3197](https://github.com/PrismJS/prism/issues/3197)) [`e1370357`](https://github.com/PrismJS/prism/commit/e1370357) - **DataWeave** - Fixed keywords being highlighted as functions ([#3113](https://github.com/PrismJS/prism/issues/3113)) [`532212b2`](https://github.com/PrismJS/prism/commit/532212b2) - **EditorConfig** - Swap out `property` for `key`; alias with `attr-name` ([#3272](https://github.com/PrismJS/prism/issues/3272)) [`bee6ad56`](https://github.com/PrismJS/prism/commit/bee6ad56) - **Eiffel** - Removed non-standard use of `builtin` name ([#3198](https://github.com/PrismJS/prism/issues/3198)) [`6add768b`](https://github.com/PrismJS/prism/commit/6add768b) - **Elm** - Recognize unicode escapes as valid Char ([#3105](https://github.com/PrismJS/prism/issues/3105)) [`736c581d`](https://github.com/PrismJS/prism/commit/736c581d) - **ERB** - Better embedding of Ruby ([#3192](https://github.com/PrismJS/prism/issues/3192)) [`336edeea`](https://github.com/PrismJS/prism/commit/336edeea) - **F#** - Added `char` token ([#3271](https://github.com/PrismJS/prism/issues/3271)) [`b58cd722`](https://github.com/PrismJS/prism/commit/b58cd722) - **G-code** - Use standard-conforming alias for checksum ([#3205](https://github.com/PrismJS/prism/issues/3205)) [`ee7ab563`](https://github.com/PrismJS/prism/commit/ee7ab563) - **GameMaker Language** - Fixed `operator` token and added tests ([#3114](https://github.com/PrismJS/prism/issues/3114)) [`d359eeae`](https://github.com/PrismJS/prism/commit/d359eeae) - **Go** - Added `char` token and improved `string` and `number` tokens ([#3208](https://github.com/PrismJS/prism/issues/3208)) [`f11b86e2`](https://github.com/PrismJS/prism/commit/f11b86e2) - **GraphQL** - Optimized regexes ([#3136](https://github.com/PrismJS/prism/issues/3136)) [`8494519e`](https://github.com/PrismJS/prism/commit/8494519e) - **Haml** - Use `symbol` alias for filter names ([#3210](https://github.com/PrismJS/prism/issues/3210)) [`3d410670`](https://github.com/PrismJS/prism/commit/3d410670) - Improved filter and interpolation tokenization ([#3191](https://github.com/PrismJS/prism/issues/3191)) [`005ba469`](https://github.com/PrismJS/prism/commit/005ba469) - **Haxe** - Improved tokenization ([#3211](https://github.com/PrismJS/prism/issues/3211)) [`f41bcf23`](https://github.com/PrismJS/prism/commit/f41bcf23) - **Hoon** - Simplified the language definition a little ([#3212](https://github.com/PrismJS/prism/issues/3212)) [`81920b62`](https://github.com/PrismJS/prism/commit/81920b62) - **HTTP** - Added support for special header value tokenization ([#3275](https://github.com/PrismJS/prism/issues/3275)) [`3362fc79`](https://github.com/PrismJS/prism/commit/3362fc79) - Relax pattern for body ([#3169](https://github.com/PrismJS/prism/issues/3169)) [`22d0c6ba`](https://github.com/PrismJS/prism/commit/22d0c6ba) - **HTTP Public-Key-Pins** - Improved tokenization ([#3278](https://github.com/PrismJS/prism/issues/3278)) [`0f1b5810`](https://github.com/PrismJS/prism/commit/0f1b5810) - **HTTP Strict-Transport-Security** - Improved tokenization ([#3277](https://github.com/PrismJS/prism/issues/3277)) [`3d708b97`](https://github.com/PrismJS/prism/commit/3d708b97) - **Idris** - Fixed import statements ([#3115](https://github.com/PrismJS/prism/issues/3115)) [`15cb3b78`](https://github.com/PrismJS/prism/commit/15cb3b78) - **Io** - Simplified comment token ([#3214](https://github.com/PrismJS/prism/issues/3214)) [`c2afa59b`](https://github.com/PrismJS/prism/commit/c2afa59b) - **J** - Made comments greedy ([#3215](https://github.com/PrismJS/prism/issues/3215)) [`5af16014`](https://github.com/PrismJS/prism/commit/5af16014) - **Java** - Added `char` token ([#3217](https://github.com/PrismJS/prism/issues/3217)) [`0a9f909c`](https://github.com/PrismJS/prism/commit/0a9f909c) - **Java stack trace** - Removed unreachable parts of regexes ([#3219](https://github.com/PrismJS/prism/issues/3219)) [`fa55492b`](https://github.com/PrismJS/prism/commit/fa55492b) - Added missing lookbehinds ([#3116](https://github.com/PrismJS/prism/issues/3116)) [`cfb2e782`](https://github.com/PrismJS/prism/commit/cfb2e782) - **JavaScript** - Improved `number` pattern ([#3149](https://github.com/PrismJS/prism/issues/3149)) [`5a24cbff`](https://github.com/PrismJS/prism/commit/5a24cbff) - Added properties ([#3099](https://github.com/PrismJS/prism/issues/3099)) [`3b2238fa`](https://github.com/PrismJS/prism/commit/3b2238fa) - **Jolie** - Improved tokenization ([#3221](https://github.com/PrismJS/prism/issues/3221)) [`dfbb2020`](https://github.com/PrismJS/prism/commit/dfbb2020) - **JQ** - Improved performance of strings ([#3084](https://github.com/PrismJS/prism/issues/3084)) [`233415b8`](https://github.com/PrismJS/prism/commit/233415b8) - **JS stack trace** - Added missing boundary assertion ([#3117](https://github.com/PrismJS/prism/issues/3117)) [`23d9aec1`](https://github.com/PrismJS/prism/commit/23d9aec1) - **Julia** - Added `char` token ([#3223](https://github.com/PrismJS/prism/issues/3223)) [`3a876df0`](https://github.com/PrismJS/prism/commit/3a876df0) - **Keyman** - Improved tokenization ([#3224](https://github.com/PrismJS/prism/issues/3224)) [`baa95cab`](https://github.com/PrismJS/prism/commit/baa95cab) - **Kotlin** - Added `char` token and improved string interpolation ([#3225](https://github.com/PrismJS/prism/issues/3225)) [`563cd73e`](https://github.com/PrismJS/prism/commit/563cd73e) - **Latte** - Use standard token names and combined delimiter tokens ([#3226](https://github.com/PrismJS/prism/issues/3226)) [`6b168a3b`](https://github.com/PrismJS/prism/commit/6b168a3b) - **Liquid** - Removed unmatchable object variants ([#3135](https://github.com/PrismJS/prism/issues/3135)) [`05e7ab04`](https://github.com/PrismJS/prism/commit/05e7ab04) - **Lisp** - Improved `defun` ([#3130](https://github.com/PrismJS/prism/issues/3130)) [`e8f84a6c`](https://github.com/PrismJS/prism/commit/e8f84a6c) - **Makefile** - Use standard token names correctly ([#3227](https://github.com/PrismJS/prism/issues/3227)) [`21a3c2d7`](https://github.com/PrismJS/prism/commit/21a3c2d7) - **Markdown** - Fixed typo in token name ([#3101](https://github.com/PrismJS/prism/issues/3101)) [`00f77a2c`](https://github.com/PrismJS/prism/commit/00f77a2c) - **MAXScript** - Various improvements ([#3181](https://github.com/PrismJS/prism/issues/3181)) [`e9b856c8`](https://github.com/PrismJS/prism/commit/e9b856c8) - Fixed booleans not being highlighted ([#3134](https://github.com/PrismJS/prism/issues/3134)) [`c6574e6b`](https://github.com/PrismJS/prism/commit/c6574e6b) - **Monkey** - Use standard tokens correctly ([#3228](https://github.com/PrismJS/prism/issues/3228)) [`c1025aa6`](https://github.com/PrismJS/prism/commit/c1025aa6) - **N1QL** - Updated keywords + minor improvements ([#3229](https://github.com/PrismJS/prism/issues/3229)) [`642d93ec`](https://github.com/PrismJS/prism/commit/642d93ec) - **nginx** - Made some patterns greedy ([#3230](https://github.com/PrismJS/prism/issues/3230)) [`7b72e0ad`](https://github.com/PrismJS/prism/commit/7b72e0ad) - **Nim** - Added `char` token and made some tokens greedy ([#3231](https://github.com/PrismJS/prism/issues/3231)) [`2334b4b6`](https://github.com/PrismJS/prism/commit/2334b4b6) - Fixed backtick identifier ([#3118](https://github.com/PrismJS/prism/issues/3118)) [`75331bea`](https://github.com/PrismJS/prism/commit/75331bea) - **Nix** - Use standard token name correctly ([#3232](https://github.com/PrismJS/prism/issues/3232)) [`5bf6e35f`](https://github.com/PrismJS/prism/commit/5bf6e35f) - Removed unmatchable token ([#3119](https://github.com/PrismJS/prism/issues/3119)) [`dc1e808f`](https://github.com/PrismJS/prism/commit/dc1e808f) - **NSIS** - Made `comment` greedy ([#3234](https://github.com/PrismJS/prism/issues/3234)) [`969f152a`](https://github.com/PrismJS/prism/commit/969f152a) - Update regex pattern for variables ([#3266](https://github.com/PrismJS/prism/issues/3266)) [`adcc8784`](https://github.com/PrismJS/prism/commit/adcc8784) - Update regex for constants pattern ([#3267](https://github.com/PrismJS/prism/issues/3267)) [`55583fb2`](https://github.com/PrismJS/prism/commit/55583fb2) - **Objective-C** - Improved `string` token ([#3235](https://github.com/PrismJS/prism/issues/3235)) [`8e0e95f3`](https://github.com/PrismJS/prism/commit/8e0e95f3) - **OCaml** - Improved tokenization ([#3269](https://github.com/PrismJS/prism/issues/3269)) [`7bcc5da0`](https://github.com/PrismJS/prism/commit/7bcc5da0) - Removed unmatchable punctuation variant ([#3120](https://github.com/PrismJS/prism/issues/3120)) [`314d6994`](https://github.com/PrismJS/prism/commit/314d6994) - **Oz** - Improved tokenization ([#3240](https://github.com/PrismJS/prism/issues/3240)) [`a3905c04`](https://github.com/PrismJS/prism/commit/a3905c04) - **Pascal** - Added support for asm and directives ([#2653](https://github.com/PrismJS/prism/issues/2653)) [`f053af13`](https://github.com/PrismJS/prism/commit/f053af13) - **PATROL Scripting Language** - Added `boolean` token ([#3248](https://github.com/PrismJS/prism/issues/3248)) [`a5b6c5eb`](https://github.com/PrismJS/prism/commit/a5b6c5eb) - **Perl** - Improved tokenization ([#3241](https://github.com/PrismJS/prism/issues/3241)) [`f22ea9f9`](https://github.com/PrismJS/prism/commit/f22ea9f9) - **PHP** - Removed useless keyword tokens ([#3121](https://github.com/PrismJS/prism/issues/3121)) [`ee62a080`](https://github.com/PrismJS/prism/commit/ee62a080) - **PHP Extras** - Improved `scope` and `this` ([#3243](https://github.com/PrismJS/prism/issues/3243)) [`59ef51db`](https://github.com/PrismJS/prism/commit/59ef51db) - **PL/SQL** - Updated keywords + other improvements ([#3109](https://github.com/PrismJS/prism/issues/3109)) [`e7ba877b`](https://github.com/PrismJS/prism/commit/e7ba877b) - **PowerQuery** - Improved tokenization and use standard tokens correctly ([#3244](https://github.com/PrismJS/prism/issues/3244)) [`5688f487`](https://github.com/PrismJS/prism/commit/5688f487) - Removed useless `data-type` alternative ([#3122](https://github.com/PrismJS/prism/issues/3122)) [`eeb13996`](https://github.com/PrismJS/prism/commit/eeb13996) - **PowerShell** - Fixed lookbehind + refactoring ([#3245](https://github.com/PrismJS/prism/issues/3245)) [`d30a2da6`](https://github.com/PrismJS/prism/commit/d30a2da6) - **Processing** - Use standard tokens correctly ([#3246](https://github.com/PrismJS/prism/issues/3246)) [`5ee8c557`](https://github.com/PrismJS/prism/commit/5ee8c557) - **Prolog** - Removed variable token + minor improvements ([#3247](https://github.com/PrismJS/prism/issues/3247)) [`bacf9ae3`](https://github.com/PrismJS/prism/commit/bacf9ae3) - **Pug** - Improved filter tokenization ([#3258](https://github.com/PrismJS/prism/issues/3258)) [`0390e644`](https://github.com/PrismJS/prism/commit/0390e644) - **PureBasic** - Fixed token order inside `asm` token ([#3123](https://github.com/PrismJS/prism/issues/3123)) [`f3b25786`](https://github.com/PrismJS/prism/commit/f3b25786) - **Python** - Made `comment` greedy ([#3249](https://github.com/PrismJS/prism/issues/3249)) [`8ecef306`](https://github.com/PrismJS/prism/commit/8ecef306) - Add `match` and `case` (soft) keywords ([#3142](https://github.com/PrismJS/prism/issues/3142)) [`3f24dc72`](https://github.com/PrismJS/prism/commit/3f24dc72) - Recognize walrus operator ([#3126](https://github.com/PrismJS/prism/issues/3126)) [`18bd101c`](https://github.com/PrismJS/prism/commit/18bd101c) - Fixed numbers ending with a dot ([#3106](https://github.com/PrismJS/prism/issues/3106)) [`2c63efa6`](https://github.com/PrismJS/prism/commit/2c63efa6) - **QML** - Made `string` greedy ([#3250](https://github.com/PrismJS/prism/issues/3250)) [`1e6dcb51`](https://github.com/PrismJS/prism/commit/1e6dcb51) - **React JSX** - Move alias property ([#3222](https://github.com/PrismJS/prism/issues/3222)) [`18c92048`](https://github.com/PrismJS/prism/commit/18c92048) - **React TSX** - Removed `parameter` token ([#3090](https://github.com/PrismJS/prism/issues/3090)) [`0a313f4f`](https://github.com/PrismJS/prism/commit/0a313f4f) - **Reason** - Use standard tokens correctly ([#3251](https://github.com/PrismJS/prism/issues/3251)) [`809af0d9`](https://github.com/PrismJS/prism/commit/809af0d9) - **Regex** - Fixed char-class/char-set confusion ([#3124](https://github.com/PrismJS/prism/issues/3124)) [`4dde2e20`](https://github.com/PrismJS/prism/commit/4dde2e20) - **Ren'py** - Improved language + added tests ([#3125](https://github.com/PrismJS/prism/issues/3125)) [`ede55b2c`](https://github.com/PrismJS/prism/commit/ede55b2c) - **Rip** - Use standard `char` token ([#3252](https://github.com/PrismJS/prism/issues/3252)) [`2069ab0c`](https://github.com/PrismJS/prism/commit/2069ab0c) - **Ruby** - Improved tokenization ([#3193](https://github.com/PrismJS/prism/issues/3193)) [`86028adb`](https://github.com/PrismJS/prism/commit/86028adb) - **Rust** - Improved `type-definition` and use standard tokens correctly ([#3253](https://github.com/PrismJS/prism/issues/3253)) [`4049e5c6`](https://github.com/PrismJS/prism/commit/4049e5c6) - **Scheme** - Use standard `char` token ([#3254](https://github.com/PrismJS/prism/issues/3254)) [`7d740c45`](https://github.com/PrismJS/prism/commit/7d740c45) - Updates syntax for reals ([#3159](https://github.com/PrismJS/prism/issues/3159)) [`4eb81fa1`](https://github.com/PrismJS/prism/commit/4eb81fa1) - **Smalltalk** - Use standard `char` token ([#3255](https://github.com/PrismJS/prism/issues/3255)) [`a7bb3001`](https://github.com/PrismJS/prism/commit/a7bb3001) - Added `boolean` token ([#3100](https://github.com/PrismJS/prism/issues/3100)) [`51382524`](https://github.com/PrismJS/prism/commit/51382524) - **Smarty** - Improved tokenization ([#3268](https://github.com/PrismJS/prism/issues/3268)) [`acc0bc09`](https://github.com/PrismJS/prism/commit/acc0bc09) - **SQL** - Added identifier token ([#3141](https://github.com/PrismJS/prism/issues/3141)) [`4e00cddd`](https://github.com/PrismJS/prism/commit/4e00cddd) - **Squirrel** - Use standard `char` token ([#3256](https://github.com/PrismJS/prism/issues/3256)) [`58a65bfd`](https://github.com/PrismJS/prism/commit/58a65bfd) - **Stan** - Added missing keywords and HOFs ([#3238](https://github.com/PrismJS/prism/issues/3238)) [`afd77ed1`](https://github.com/PrismJS/prism/commit/afd77ed1) - **Structured Text (IEC 61131-3)** - Structured text: Improved tokenization ([#3213](https://github.com/PrismJS/prism/issues/3213)) [`d04d166d`](https://github.com/PrismJS/prism/commit/d04d166d) - **Swift** - Added support for `isolated` keyword ([#3174](https://github.com/PrismJS/prism/issues/3174)) [`18c828a6`](https://github.com/PrismJS/prism/commit/18c828a6) - **TAP** - Conform to quoted-properties style ([#3127](https://github.com/PrismJS/prism/issues/3127)) [`3ef71533`](https://github.com/PrismJS/prism/commit/3ef71533) - **Tremor** - Use standard `regex` token ([#3257](https://github.com/PrismJS/prism/issues/3257)) [`c56e4bf5`](https://github.com/PrismJS/prism/commit/c56e4bf5) - **Twig** - Improved tokenization ([#3259](https://github.com/PrismJS/prism/issues/3259)) [`e03a7c24`](https://github.com/PrismJS/prism/commit/e03a7c24) - **TypeScript** - Removed duplicate keywords ([#3132](https://github.com/PrismJS/prism/issues/3132)) [`91060fd6`](https://github.com/PrismJS/prism/commit/91060fd6) - **URI** - Fixed IPv4 regex ([#3128](https://github.com/PrismJS/prism/issues/3128)) [`599e30ee`](https://github.com/PrismJS/prism/commit/599e30ee) - **V** - Use standard `char` token ([#3260](https://github.com/PrismJS/prism/issues/3260)) [`e4373256`](https://github.com/PrismJS/prism/commit/e4373256) - **Verilog** - Use standard tokens correctly ([#3261](https://github.com/PrismJS/prism/issues/3261)) [`43124129`](https://github.com/PrismJS/prism/commit/43124129) - **Visual Basic** - Simplify regexes and use more common aliases ([#3262](https://github.com/PrismJS/prism/issues/3262)) [`aa73d448`](https://github.com/PrismJS/prism/commit/aa73d448) - **Wolfram language** - Removed unmatchable punctuation variant ([#3133](https://github.com/PrismJS/prism/issues/3133)) [`a28a86ad`](https://github.com/PrismJS/prism/commit/a28a86ad) - **Xojo (REALbasic)** - Proper token name for directives ([#3263](https://github.com/PrismJS/prism/issues/3263)) [`ffd8343f`](https://github.com/PrismJS/prism/commit/ffd8343f) - **Zig** - Added missing keywords ([#3279](https://github.com/PrismJS/prism/issues/3279)) [`deed35e3`](https://github.com/PrismJS/prism/commit/deed35e3) - Use standard `char` token ([#3264](https://github.com/PrismJS/prism/issues/3264)) [`c3f9fb70`](https://github.com/PrismJS/prism/commit/c3f9fb70) - Fixed module comments and astral chars ([#3129](https://github.com/PrismJS/prism/issues/3129)) [`09a0e2ba`](https://github.com/PrismJS/prism/commit/09a0e2ba) ### Updated plugins - **File Highlight** - File highlight+data range ([#1813](https://github.com/PrismJS/prism/issues/1813)) [`d38592c5`](https://github.com/PrismJS/prism/commit/d38592c5) - **Keep Markup** - Added `drop-tokens` option class ([#3166](https://github.com/PrismJS/prism/issues/3166)) [`b679cfe6`](https://github.com/PrismJS/prism/commit/b679cfe6) - **Line Highlight** - Expose `highlightLines` function as `Prism.plugins.highlightLines` ([#3086](https://github.com/PrismJS/prism/issues/3086)) [`9f4c0e74`](https://github.com/PrismJS/prism/commit/9f4c0e74) - **Toolbar** - Set `z-index` of `.toolbar` to 10 ([#3163](https://github.com/PrismJS/prism/issues/3163)) [`1cac3559`](https://github.com/PrismJS/prism/commit/1cac3559) ### Updated themes - Coy: Set `z-index` to make shadows visible in colored table cells ([#3161](https://github.com/PrismJS/prism/issues/3161)) [`79f250f3`](https://github.com/PrismJS/prism/commit/79f250f3) - Coy: Added padding to account for box shadow ([#3143](https://github.com/PrismJS/prism/issues/3143)) [`a6a4ce7e`](https://github.com/PrismJS/prism/commit/a6a4ce7e) ### Other - **Core** - Added `setLanguage` util function ([#3167](https://github.com/PrismJS/prism/issues/3167)) [`b631949a`](https://github.com/PrismJS/prism/commit/b631949a) - Fixed type error on null ([#3057](https://github.com/PrismJS/prism/issues/3057)) [`a80a68ba`](https://github.com/PrismJS/prism/commit/a80a68ba) - Document `disableWorkerMessageHandler` ([#3088](https://github.com/PrismJS/prism/issues/3088)) [`213cf7be`](https://github.com/PrismJS/prism/commit/213cf7be) - **Infrastructure** - Tests: Added `.html.test` files for replace `.js` language tests ([#3148](https://github.com/PrismJS/prism/issues/3148)) [`2e834c8c`](https://github.com/PrismJS/prism/commit/2e834c8c) - Added regex coverage ([#3138](https://github.com/PrismJS/prism/issues/3138)) [`5333e281`](https://github.com/PrismJS/prism/commit/5333e281) - Tests: Added `TestCaseFile` class and generalized `runTestCase` ([#3147](https://github.com/PrismJS/prism/issues/3147)) [`ae8888a0`](https://github.com/PrismJS/prism/commit/ae8888a0) - Added even more language tests ([#3137](https://github.com/PrismJS/prism/issues/3137)) [`344d0b27`](https://github.com/PrismJS/prism/commit/344d0b27) - Added more plugin tests ([#1969](https://github.com/PrismJS/prism/issues/1969)) [`a394a14d`](https://github.com/PrismJS/prism/commit/a394a14d) - Added more language tests ([#3131](https://github.com/PrismJS/prism/issues/3131)) [`2f7f7364`](https://github.com/PrismJS/prism/commit/2f7f7364) - `package.json`: Added `engines.node` field ([#3108](https://github.com/PrismJS/prism/issues/3108)) [`798ee4f6`](https://github.com/PrismJS/prism/commit/798ee4f6) - Use tabs in `package(-lock).json` ([#3098](https://github.com/PrismJS/prism/issues/3098)) [`8daebb4a`](https://github.com/PrismJS/prism/commit/8daebb4a) - Update `eslint-plugin-regexp@1.2.0` ([#3091](https://github.com/PrismJS/prism/issues/3091)) [`e6e1d5ae`](https://github.com/PrismJS/prism/commit/e6e1d5ae) - Added minified CSS ([#3073](https://github.com/PrismJS/prism/issues/3073)) [`d63d6c0e`](https://github.com/PrismJS/prism/commit/d63d6c0e) - **Website** - Readme: Clarify usage of our build system ([#3239](https://github.com/PrismJS/prism/issues/3239)) [`6f1d904a`](https://github.com/PrismJS/prism/commit/6f1d904a) - Improved CDN usage URLs ([#3285](https://github.com/PrismJS/prism/issues/3285)) [`6c21b2f7`](https://github.com/PrismJS/prism/commit/6c21b2f7) - Update download.html [`9d5424b6`](https://github.com/PrismJS/prism/commit/9d5424b6) - Autoloader: Mention how to load grammars from URLs ([#3218](https://github.com/PrismJS/prism/issues/3218)) [`cefccdd1`](https://github.com/PrismJS/prism/commit/cefccdd1) - Added PrismJS React and HTML tutorial link ([#3190](https://github.com/PrismJS/prism/issues/3190)) [`0ecdbdce`](https://github.com/PrismJS/prism/commit/0ecdbdce) - Improved readability ([#3177](https://github.com/PrismJS/prism/issues/3177)) [`4433d7fe`](https://github.com/PrismJS/prism/commit/4433d7fe) - Fixed red highlighting in Firefox ([#3178](https://github.com/PrismJS/prism/issues/3178)) [`746da79b`](https://github.com/PrismJS/prism/commit/746da79b) - Use Keep markup to highlight code section ([#3164](https://github.com/PrismJS/prism/issues/3164)) [`ebd59e32`](https://github.com/PrismJS/prism/commit/ebd59e32) - Document standard tokens and provide examples ([#3104](https://github.com/PrismJS/prism/issues/3104)) [`37551200`](https://github.com/PrismJS/prism/commit/37551200) - Fixed dead link to third-party tutorial [#3155](https://github.com/PrismJS/prism/issues/3155) ([#3156](https://github.com/PrismJS/prism/issues/3156)) [`31b4c1b8`](https://github.com/PrismJS/prism/commit/31b4c1b8) - Repositioned theme selector ([#3146](https://github.com/PrismJS/prism/issues/3146)) [`ea361e5a`](https://github.com/PrismJS/prism/commit/ea361e5a) - Adjusted TOC's line height for better readability ([#3145](https://github.com/PrismJS/prism/issues/3145)) [`c5629706`](https://github.com/PrismJS/prism/commit/c5629706) - Updated plugin header template ([#3144](https://github.com/PrismJS/prism/issues/3144)) [`faedfe85`](https://github.com/PrismJS/prism/commit/faedfe85) - Update test and example pages to use Autoloader ([#1936](https://github.com/PrismJS/prism/issues/1936)) [`3d96eedc`](https://github.com/PrismJS/prism/commit/3d96eedc) ## 1.25.0 (2021-09-16) ### New components - **AviSynth** ([#3071](https://github.com/PrismJS/prism/issues/3071)) [`746a4b1a`](https://github.com/PrismJS/prism/commit/746a4b1a) - **Avro IDL** ([#3051](https://github.com/PrismJS/prism/issues/3051)) [`87e5a376`](https://github.com/PrismJS/prism/commit/87e5a376) - **Bicep** ([#3027](https://github.com/PrismJS/prism/issues/3027)) [`c1dce998`](https://github.com/PrismJS/prism/commit/c1dce998) - **GAP (CAS)** ([#3054](https://github.com/PrismJS/prism/issues/3054)) [`23cd9b65`](https://github.com/PrismJS/prism/commit/23cd9b65) - **GN** ([#3062](https://github.com/PrismJS/prism/issues/3062)) [`4f97b82b`](https://github.com/PrismJS/prism/commit/4f97b82b) - **Hoon** ([#2978](https://github.com/PrismJS/prism/issues/2978)) [`ea776756`](https://github.com/PrismJS/prism/commit/ea776756) - **Kusto** ([#3068](https://github.com/PrismJS/prism/issues/3068)) [`e008ea05`](https://github.com/PrismJS/prism/commit/e008ea05) - **Magma (CAS)** ([#3055](https://github.com/PrismJS/prism/issues/3055)) [`a1b67ce3`](https://github.com/PrismJS/prism/commit/a1b67ce3) - **MAXScript** ([#3060](https://github.com/PrismJS/prism/issues/3060)) [`4fbdd2f8`](https://github.com/PrismJS/prism/commit/4fbdd2f8) - **Mermaid** ([#3050](https://github.com/PrismJS/prism/issues/3050)) [`148c1eca`](https://github.com/PrismJS/prism/commit/148c1eca) - **Razor C#** ([#3064](https://github.com/PrismJS/prism/issues/3064)) [`4433ccfc`](https://github.com/PrismJS/prism/commit/4433ccfc) - **Systemd configuration file** ([#3053](https://github.com/PrismJS/prism/issues/3053)) [`8df825e0`](https://github.com/PrismJS/prism/commit/8df825e0) - **Wren** ([#3063](https://github.com/PrismJS/prism/issues/3063)) [`6a356d25`](https://github.com/PrismJS/prism/commit/6a356d25) ### Updated components - **Bicep** - Added support for multiline and interpolated strings and other improvements ([#3028](https://github.com/PrismJS/prism/issues/3028)) [`748bb9ac`](https://github.com/PrismJS/prism/commit/748bb9ac) - **C#** - Added `with` keyword & improved record support ([#2993](https://github.com/PrismJS/prism/issues/2993)) [`fdd291c0`](https://github.com/PrismJS/prism/commit/fdd291c0) - Added `record`, `init`, and `nullable` keyword ([#2991](https://github.com/PrismJS/prism/issues/2991)) [`9b561565`](https://github.com/PrismJS/prism/commit/9b561565) - Added context check for `from` keyword ([#2970](https://github.com/PrismJS/prism/issues/2970)) [`158f25d4`](https://github.com/PrismJS/prism/commit/158f25d4) - **C++** - Fixed generic function false positive ([#3043](https://github.com/PrismJS/prism/issues/3043)) [`5de8947f`](https://github.com/PrismJS/prism/commit/5de8947f) - **Clojure** - Improved tokenization ([#3056](https://github.com/PrismJS/prism/issues/3056)) [`8d0b74b5`](https://github.com/PrismJS/prism/commit/8d0b74b5) - **Hoon** - Fixed mixed-case aura tokenization ([#3002](https://github.com/PrismJS/prism/issues/3002)) [`9c8911bd`](https://github.com/PrismJS/prism/commit/9c8911bd) - **Liquid** - Added all objects from Shopify reference ([#2998](https://github.com/PrismJS/prism/issues/2998)) [`693b7433`](https://github.com/PrismJS/prism/commit/693b7433) - Added `empty` keyword ([#2997](https://github.com/PrismJS/prism/issues/2997)) [`fe3bc526`](https://github.com/PrismJS/prism/commit/fe3bc526) - **Log file** - Added support for Java stack traces ([#3003](https://github.com/PrismJS/prism/issues/3003)) [`b0365e70`](https://github.com/PrismJS/prism/commit/b0365e70) - **Markup** - Made most patterns greedy ([#3065](https://github.com/PrismJS/prism/issues/3065)) [`52e8cee9`](https://github.com/PrismJS/prism/commit/52e8cee9) - Fixed ReDoS ([#3078](https://github.com/PrismJS/prism/issues/3078)) [`0ff371bb`](https://github.com/PrismJS/prism/commit/0ff371bb) - **PureScript** - Made `∀` a keyword (alias for `forall`) ([#3005](https://github.com/PrismJS/prism/issues/3005)) [`b38fc89a`](https://github.com/PrismJS/prism/commit/b38fc89a) - Improved Haskell and PureScript ([#3020](https://github.com/PrismJS/prism/issues/3020)) [`679539ec`](https://github.com/PrismJS/prism/commit/679539ec) - **Python** - Support for underscores in numbers ([#3039](https://github.com/PrismJS/prism/issues/3039)) [`6f5d68f7`](https://github.com/PrismJS/prism/commit/6f5d68f7) - **Sass** - Fixed issues with CSS Extras ([#2994](https://github.com/PrismJS/prism/issues/2994)) [`14fdfe32`](https://github.com/PrismJS/prism/commit/14fdfe32) - **Shell session** - Fixed command false positives ([#3048](https://github.com/PrismJS/prism/issues/3048)) [`35b88fcf`](https://github.com/PrismJS/prism/commit/35b88fcf) - Added support for the percent sign as shell symbol ([#3010](https://github.com/PrismJS/prism/issues/3010)) [`4492b62b`](https://github.com/PrismJS/prism/commit/4492b62b) - **Swift** - Major improvements ([#3022](https://github.com/PrismJS/prism/issues/3022)) [`8541db2e`](https://github.com/PrismJS/prism/commit/8541db2e) - Added support for `@propertyWrapper`, `@MainActor`, and `@globalActor` ([#3009](https://github.com/PrismJS/prism/issues/3009)) [`ce5e0f01`](https://github.com/PrismJS/prism/commit/ce5e0f01) - Added support for new Swift 5.5 keywords ([#2988](https://github.com/PrismJS/prism/issues/2988)) [`bb93fac0`](https://github.com/PrismJS/prism/commit/bb93fac0) - **TypeScript** - Fixed keyword false positives ([#3001](https://github.com/PrismJS/prism/issues/3001)) [`212e0ef2`](https://github.com/PrismJS/prism/commit/212e0ef2) ### Updated plugins - **JSONP Highlight** - Refactored JSONP logic ([#3018](https://github.com/PrismJS/prism/issues/3018)) [`5126d1e1`](https://github.com/PrismJS/prism/commit/5126d1e1) - **Line Highlight** - Extend highlight to full line width inside scroll container ([#3011](https://github.com/PrismJS/prism/issues/3011)) [`e289ec60`](https://github.com/PrismJS/prism/commit/e289ec60) - **Normalize Whitespace** - Removed unnecessary checks ([#3017](https://github.com/PrismJS/prism/issues/3017)) [`63edf14c`](https://github.com/PrismJS/prism/commit/63edf14c) - **Previewers** - Ensure popup is visible across themes ([#3080](https://github.com/PrismJS/prism/issues/3080)) [`c7b6a7f6`](https://github.com/PrismJS/prism/commit/c7b6a7f6) ### Updated themes - **Twilight** - Increase selector specificities of plugin overrides ([#3081](https://github.com/PrismJS/prism/issues/3081)) [`ffb20439`](https://github.com/PrismJS/prism/commit/ffb20439) ### Other - **Infrastructure** - Added benchmark suite ([#2153](https://github.com/PrismJS/prism/issues/2153)) [`44456b21`](https://github.com/PrismJS/prism/commit/44456b21) - Tests: Insert expected JSON by Default ([#2960](https://github.com/PrismJS/prism/issues/2960)) [`e997dd35`](https://github.com/PrismJS/prism/commit/e997dd35) - Tests: Improved dection of empty patterns ([#3058](https://github.com/PrismJS/prism/issues/3058)) [`d216e602`](https://github.com/PrismJS/prism/commit/d216e602) - **Website** - Highlight Keywords: More documentation ([#3049](https://github.com/PrismJS/prism/issues/3049)) [`247fd9a3`](https://github.com/PrismJS/prism/commit/247fd9a3) ## 1.24.1 (2021-07-03) ### Updated components - **Markdown** - Fixed Markdown not working in NodeJS ([#2977](https://github.com/PrismJS/prism/issues/2977)) [`151121cd`](https://github.com/PrismJS/prism/commit/151121cd) ### Updated plugins - **Toolbar** - Fixed styles being applies to nested elements ([#2980](https://github.com/PrismJS/prism/issues/2980)) [`748ecddc`](https://github.com/PrismJS/prism/commit/748ecddc) ## 1.24.0 (2021-06-27) ### New components - **CFScript** ([#2771](https://github.com/PrismJS/prism/issues/2771)) [`b0a6ec85`](https://github.com/PrismJS/prism/commit/b0a6ec85) - **ChaiScript** ([#2706](https://github.com/PrismJS/prism/issues/2706)) [`3f7d7453`](https://github.com/PrismJS/prism/commit/3f7d7453) - **COBOL** ([#2800](https://github.com/PrismJS/prism/issues/2800)) [`7e5f78ff`](https://github.com/PrismJS/prism/commit/7e5f78ff) - **Coq** ([#2803](https://github.com/PrismJS/prism/issues/2803)) [`41e25d3c`](https://github.com/PrismJS/prism/commit/41e25d3c) - **CSV** ([#2794](https://github.com/PrismJS/prism/issues/2794)) [`f9b69528`](https://github.com/PrismJS/prism/commit/f9b69528) - **DOT (Graphviz)** ([#2690](https://github.com/PrismJS/prism/issues/2690)) [`1f91868e`](https://github.com/PrismJS/prism/commit/1f91868e) - **False** ([#2802](https://github.com/PrismJS/prism/issues/2802)) [`99a21dc5`](https://github.com/PrismJS/prism/commit/99a21dc5) - **ICU Message Format** ([#2745](https://github.com/PrismJS/prism/issues/2745)) [`bf4e7ba9`](https://github.com/PrismJS/prism/commit/bf4e7ba9) - **Idris** ([#2755](https://github.com/PrismJS/prism/issues/2755)) [`e9314415`](https://github.com/PrismJS/prism/commit/e9314415) - **Jexl** ([#2764](https://github.com/PrismJS/prism/issues/2764)) [`7e51b99c`](https://github.com/PrismJS/prism/commit/7e51b99c) - **KuMir (КуМир)** ([#2760](https://github.com/PrismJS/prism/issues/2760)) [`3419fb77`](https://github.com/PrismJS/prism/commit/3419fb77) - **Log file** ([#2796](https://github.com/PrismJS/prism/issues/2796)) [`2bc6475b`](https://github.com/PrismJS/prism/commit/2bc6475b) - **Nevod** ([#2798](https://github.com/PrismJS/prism/issues/2798)) [`f84c49c5`](https://github.com/PrismJS/prism/commit/f84c49c5) - **OpenQasm** ([#2797](https://github.com/PrismJS/prism/issues/2797)) [`1a2347a3`](https://github.com/PrismJS/prism/commit/1a2347a3) - **PATROL Scripting Language** ([#2739](https://github.com/PrismJS/prism/issues/2739)) [`18c67b49`](https://github.com/PrismJS/prism/commit/18c67b49) - **Q#** ([#2804](https://github.com/PrismJS/prism/issues/2804)) [`1b63cd01`](https://github.com/PrismJS/prism/commit/1b63cd01) - **Rego** ([#2624](https://github.com/PrismJS/prism/issues/2624)) [`e38986f9`](https://github.com/PrismJS/prism/commit/e38986f9) - **Squirrel** ([#2721](https://github.com/PrismJS/prism/issues/2721)) [`fd1081d2`](https://github.com/PrismJS/prism/commit/fd1081d2) - **URI** ([#2708](https://github.com/PrismJS/prism/issues/2708)) [`bbc77d19`](https://github.com/PrismJS/prism/commit/bbc77d19) - **V** ([#2687](https://github.com/PrismJS/prism/issues/2687)) [`72962701`](https://github.com/PrismJS/prism/commit/72962701) - **Wolfram language** & **Mathematica** & **Mathematica Notebook** ([#2921](https://github.com/PrismJS/prism/issues/2921)) [`c4f6b2cc`](https://github.com/PrismJS/prism/commit/c4f6b2cc) ### Updated components - Fixed problems reported by `regexp/no-dupe-disjunctions` ([#2952](https://github.com/PrismJS/prism/issues/2952)) [`f471d2d7`](https://github.com/PrismJS/prism/commit/f471d2d7) - Fixed some cases of quadratic worst-case runtime ([#2922](https://github.com/PrismJS/prism/issues/2922)) [`79d22182`](https://github.com/PrismJS/prism/commit/79d22182) - Fixed 2 cases of exponential backtracking ([#2774](https://github.com/PrismJS/prism/issues/2774)) [`d85e30da`](https://github.com/PrismJS/prism/commit/d85e30da) - **AQL** - Update for ArangoDB 3.8 ([#2842](https://github.com/PrismJS/prism/issues/2842)) [`ea82478d`](https://github.com/PrismJS/prism/commit/ea82478d) - **AutoHotkey** - Improved tag pattern ([#2920](https://github.com/PrismJS/prism/issues/2920)) [`fc2a3334`](https://github.com/PrismJS/prism/commit/fc2a3334) - **Bash** - Accept hyphens in function names ([#2832](https://github.com/PrismJS/prism/issues/2832)) [`e4ad22ad`](https://github.com/PrismJS/prism/commit/e4ad22ad) - Fixed single-quoted strings ([#2792](https://github.com/PrismJS/prism/issues/2792)) [`e5cfdb4a`](https://github.com/PrismJS/prism/commit/e5cfdb4a) - **C++** - Added support for generic functions and made `::` punctuation ([#2814](https://github.com/PrismJS/prism/issues/2814)) [`3df62fd0`](https://github.com/PrismJS/prism/commit/3df62fd0) - Added missing keywords and modules ([#2763](https://github.com/PrismJS/prism/issues/2763)) [`88fa72cf`](https://github.com/PrismJS/prism/commit/88fa72cf) - **Dart** - Improved support for classes & generics ([#2810](https://github.com/PrismJS/prism/issues/2810)) [`d0bcd074`](https://github.com/PrismJS/prism/commit/d0bcd074) - **Docker** - Improvements ([#2720](https://github.com/PrismJS/prism/issues/2720)) [`93dd83c2`](https://github.com/PrismJS/prism/commit/93dd83c2) - **Elixir** - Added missing keywords ([#2958](https://github.com/PrismJS/prism/issues/2958)) [`114e4626`](https://github.com/PrismJS/prism/commit/114e4626) - Added missing keyword and other improvements ([#2773](https://github.com/PrismJS/prism/issues/2773)) [`e6c0d298`](https://github.com/PrismJS/prism/commit/e6c0d298) - Added `defdelagate` keyword and highlighting for function/module names ([#2709](https://github.com/PrismJS/prism/issues/2709)) [`59f725d7`](https://github.com/PrismJS/prism/commit/59f725d7) - **F#** - Fixed comment false positive ([#2703](https://github.com/PrismJS/prism/issues/2703)) [`a5d7178c`](https://github.com/PrismJS/prism/commit/a5d7178c) - **GraphQL** - Fixed `definition-query` and `definition-mutation` tokens ([#2964](https://github.com/PrismJS/prism/issues/2964)) [`bfd7fded`](https://github.com/PrismJS/prism/commit/bfd7fded) - Added more detailed tokens ([#2939](https://github.com/PrismJS/prism/issues/2939)) [`34f24ac9`](https://github.com/PrismJS/prism/commit/34f24ac9) - **Handlebars** - Added `hbs` alias ([#2874](https://github.com/PrismJS/prism/issues/2874)) [`43976351`](https://github.com/PrismJS/prism/commit/43976351) - **HTTP** - Fixed body not being highlighted ([#2734](https://github.com/PrismJS/prism/issues/2734)) [`1dfc8271`](https://github.com/PrismJS/prism/commit/1dfc8271) - More granular tokenization ([#2722](https://github.com/PrismJS/prism/issues/2722)) [`6183fd9b`](https://github.com/PrismJS/prism/commit/6183fd9b) - Allow root path in request line ([#2711](https://github.com/PrismJS/prism/issues/2711)) [`4e7b2a82`](https://github.com/PrismJS/prism/commit/4e7b2a82) - **Ini** - Consistently mimic Win32 INI parsing ([#2779](https://github.com/PrismJS/prism/issues/2779)) [`42d24fa2`](https://github.com/PrismJS/prism/commit/42d24fa2) - **Java** - Improved generics ([#2812](https://github.com/PrismJS/prism/issues/2812)) [`4ec7535c`](https://github.com/PrismJS/prism/commit/4ec7535c) - **JavaScript** - Added support for import assertions ([#2953](https://github.com/PrismJS/prism/issues/2953)) [`ab7c9953`](https://github.com/PrismJS/prism/commit/ab7c9953) - Added support for RegExp Match Indices ([#2900](https://github.com/PrismJS/prism/issues/2900)) [`415651a0`](https://github.com/PrismJS/prism/commit/415651a0) - Added hashbang and private getters/setters ([#2815](https://github.com/PrismJS/prism/issues/2815)) [`9c610ae6`](https://github.com/PrismJS/prism/commit/9c610ae6) - Improved contextual keywords ([#2713](https://github.com/PrismJS/prism/issues/2713)) [`022f90a0`](https://github.com/PrismJS/prism/commit/022f90a0) - **JS Templates** - Added SQL templates ([#2945](https://github.com/PrismJS/prism/issues/2945)) [`abab9104`](https://github.com/PrismJS/prism/commit/abab9104) - **JSON** - Fixed backtracking issue in Safari ([#2691](https://github.com/PrismJS/prism/issues/2691)) [`cf28d1b2`](https://github.com/PrismJS/prism/commit/cf28d1b2) - **Liquid** - Added Markup support, missing tokens, and other improvements ([#2950](https://github.com/PrismJS/prism/issues/2950)) [`ac1d12f9`](https://github.com/PrismJS/prism/commit/ac1d12f9) - **Log file** - Minor improvements ([#2851](https://github.com/PrismJS/prism/issues/2851)) [`45ec4a88`](https://github.com/PrismJS/prism/commit/45ec4a88) - **Markdown** - Improved code snippets ([#2967](https://github.com/PrismJS/prism/issues/2967)) [`e9477d83`](https://github.com/PrismJS/prism/commit/e9477d83) - Workaround for incorrect highlighting due to double `wrap` hook ([#2719](https://github.com/PrismJS/prism/issues/2719)) [`2b355c98`](https://github.com/PrismJS/prism/commit/2b355c98) - **Markup** - Added support for DOM event attributes ([#2702](https://github.com/PrismJS/prism/issues/2702)) [`8dbbbb35`](https://github.com/PrismJS/prism/commit/8dbbbb35) - **nginx** - Complete rewrite ([#2793](https://github.com/PrismJS/prism/issues/2793)) [`5943f4cb`](https://github.com/PrismJS/prism/commit/5943f4cb) - **PHP** - Fixed functions with namespaces ([#2889](https://github.com/PrismJS/prism/issues/2889)) [`87d79390`](https://github.com/PrismJS/prism/commit/87d79390) - Fixed string interpolation ([#2864](https://github.com/PrismJS/prism/issues/2864)) [`cf3755cb`](https://github.com/PrismJS/prism/commit/cf3755cb) - Added missing PHP 7.4 `fn` keyword ([#2858](https://github.com/PrismJS/prism/issues/2858)) [`e0ee93f1`](https://github.com/PrismJS/prism/commit/e0ee93f1) - Fixed methods with keyword names + minor improvements ([#2818](https://github.com/PrismJS/prism/issues/2818)) [`7e8cd40d`](https://github.com/PrismJS/prism/commit/7e8cd40d) - Improved constant support for PHP 8.1 enums ([#2770](https://github.com/PrismJS/prism/issues/2770)) [`8019e2f6`](https://github.com/PrismJS/prism/commit/8019e2f6) - Added support for PHP 8.1 enums ([#2752](https://github.com/PrismJS/prism/issues/2752)) [`f79b0eef`](https://github.com/PrismJS/prism/commit/f79b0eef) - Class names at the start of a string are now highlighted correctly ([#2731](https://github.com/PrismJS/prism/issues/2731)) [`04ef309c`](https://github.com/PrismJS/prism/commit/04ef309c) - Numeral syntax improvements ([#2701](https://github.com/PrismJS/prism/issues/2701)) [`01af04ed`](https://github.com/PrismJS/prism/commit/01af04ed) - **React JSX** - Added support for general spread expressions ([#2754](https://github.com/PrismJS/prism/issues/2754)) [`9f59f52d`](https://github.com/PrismJS/prism/commit/9f59f52d) - Added support for comments inside tags ([#2728](https://github.com/PrismJS/prism/issues/2728)) [`30b0444f`](https://github.com/PrismJS/prism/commit/30b0444f) - **reST (reStructuredText)** - Fixed `inline` pattern ([#2946](https://github.com/PrismJS/prism/issues/2946)) [`a7656de6`](https://github.com/PrismJS/prism/commit/a7656de6) - **Ruby** - Added heredoc literals ([#2885](https://github.com/PrismJS/prism/issues/2885)) [`20b77bff`](https://github.com/PrismJS/prism/commit/20b77bff) - Added missing regex flags ([#2845](https://github.com/PrismJS/prism/issues/2845)) [`3786f396`](https://github.com/PrismJS/prism/commit/3786f396) - Added missing regex interpolation ([#2841](https://github.com/PrismJS/prism/issues/2841)) [`f08c2f7f`](https://github.com/PrismJS/prism/commit/f08c2f7f) - **Scheme** - Added support for high Unicode characters ([#2693](https://github.com/PrismJS/prism/issues/2693)) [`0e61a7e1`](https://github.com/PrismJS/prism/commit/0e61a7e1) - Added bracket support ([#2813](https://github.com/PrismJS/prism/issues/2813)) [`1c6c0bf3`](https://github.com/PrismJS/prism/commit/1c6c0bf3) - **Shell session** - Fixed multi-line commands ([#2872](https://github.com/PrismJS/prism/issues/2872)) [`cda976b1`](https://github.com/PrismJS/prism/commit/cda976b1) - Commands prefixed with a path are now detected ([#2686](https://github.com/PrismJS/prism/issues/2686)) [`c83fd0b8`](https://github.com/PrismJS/prism/commit/c83fd0b8) - **SQL** - Added `ILIKE` operator ([#2704](https://github.com/PrismJS/prism/issues/2704)) [`6e34771f`](https://github.com/PrismJS/prism/commit/6e34771f) - **Swift** - Added `some` keyword ([#2756](https://github.com/PrismJS/prism/issues/2756)) [`cf354ef5`](https://github.com/PrismJS/prism/commit/cf354ef5) - **TypeScript** - Updated keywords ([#2861](https://github.com/PrismJS/prism/issues/2861)) [`fe98d536`](https://github.com/PrismJS/prism/commit/fe98d536) - Added support for decorators ([#2820](https://github.com/PrismJS/prism/issues/2820)) [`31cc2142`](https://github.com/PrismJS/prism/commit/31cc2142) - **VB.Net** - Improved strings, comments, and punctuation ([#2782](https://github.com/PrismJS/prism/issues/2782)) [`a68f1fb6`](https://github.com/PrismJS/prism/commit/a68f1fb6) - **Xojo (REALbasic)** - `REM` is no longer highlighted as a keyword in comments ([#2823](https://github.com/PrismJS/prism/issues/2823)) [`ebbbfd47`](https://github.com/PrismJS/prism/commit/ebbbfd47) - Added last missing Keyword "Selector" ([#2807](https://github.com/PrismJS/prism/issues/2807)) [`e32e043b`](https://github.com/PrismJS/prism/commit/e32e043b) - Added missing keywords ([#2805](https://github.com/PrismJS/prism/issues/2805)) [`459365ec`](https://github.com/PrismJS/prism/commit/459365ec) ### Updated plugins - Made Match Braces and Custom Class compatible ([#2947](https://github.com/PrismJS/prism/issues/2947)) [`4b55bd6a`](https://github.com/PrismJS/prism/commit/4b55bd6a) - Consistent Prism check ([#2788](https://github.com/PrismJS/prism/issues/2788)) [`96335642`](https://github.com/PrismJS/prism/commit/96335642) - **Command Line** - Don't modify empty code blocks ([#2896](https://github.com/PrismJS/prism/issues/2896)) [`c81c3319`](https://github.com/PrismJS/prism/commit/c81c3319) - **Copy to Clipboard** - Removed ClipboardJS dependency ([#2784](https://github.com/PrismJS/prism/issues/2784)) [`d5e14e1a`](https://github.com/PrismJS/prism/commit/d5e14e1a) - Fixed `clipboard.writeText` not working inside iFrames ([#2826](https://github.com/PrismJS/prism/issues/2826)) [`01b7b6f7`](https://github.com/PrismJS/prism/commit/01b7b6f7) - Added support for custom styles ([#2789](https://github.com/PrismJS/prism/issues/2789)) [`4d7f75b0`](https://github.com/PrismJS/prism/commit/4d7f75b0) - Make copy-to-clipboard configurable with multiple attributes ([#2723](https://github.com/PrismJS/prism/issues/2723)) [`2cb909e1`](https://github.com/PrismJS/prism/commit/2cb909e1) - **File Highlight** - Fixed Prism check ([#2827](https://github.com/PrismJS/prism/issues/2827)) [`53d34b22`](https://github.com/PrismJS/prism/commit/53d34b22) - **Line Highlight** - Fixed linkable line numbers not being initialized ([#2732](https://github.com/PrismJS/prism/issues/2732)) [`ccc73ab7`](https://github.com/PrismJS/prism/commit/ccc73ab7) - **Previewers** - Use `classList` instead of `className` ([#2787](https://github.com/PrismJS/prism/issues/2787)) [`d298d46e`](https://github.com/PrismJS/prism/commit/d298d46e) ### Other - **Core** - Add `tabindex` to code blocks to enable keyboard navigation ([#2799](https://github.com/PrismJS/prism/issues/2799)) [`dbf70515`](https://github.com/PrismJS/prism/commit/dbf70515) - Fixed greedy rematching reach bug ([#2705](https://github.com/PrismJS/prism/issues/2705)) [`b37987d3`](https://github.com/PrismJS/prism/commit/b37987d3) - Added support for plaintext ([#2738](https://github.com/PrismJS/prism/issues/2738)) [`970674cf`](https://github.com/PrismJS/prism/commit/970674cf) - **Infrastructure** - Added ESLint - Added `npm-run-all` to clean up test command ([#2938](https://github.com/PrismJS/prism/issues/2938)) [`5d3d8088`](https://github.com/PrismJS/prism/commit/5d3d8088) - Added link to Q&A to issue templates ([#2834](https://github.com/PrismJS/prism/issues/2834)) [`7cd9e794`](https://github.com/PrismJS/prism/commit/7cd9e794) - CI: Run tests with NodeJS 16.x ([#2888](https://github.com/PrismJS/prism/issues/2888)) [`b77317c5`](https://github.com/PrismJS/prism/commit/b77317c5) - Dangerfile: Trim merge base ([#2761](https://github.com/PrismJS/prism/issues/2761)) [`45b0e82a`](https://github.com/PrismJS/prism/commit/45b0e82a) - Dangerfile: Fixed how changed files are determined ([#2757](https://github.com/PrismJS/prism/issues/2757)) [`0feb266f`](https://github.com/PrismJS/prism/commit/0feb266f) - Deps: Updated regex tooling ([#2923](https://github.com/PrismJS/prism/issues/2923)) [`ad9878ad`](https://github.com/PrismJS/prism/commit/ad9878ad) - Tests: Added `--language` for patterns tests ([#2929](https://github.com/PrismJS/prism/issues/2929)) [`a62ef796`](https://github.com/PrismJS/prism/commit/a62ef796) - Tests: Fixed polynomial backtracking test ([#2891](https://github.com/PrismJS/prism/issues/2891)) [`8dbf1217`](https://github.com/PrismJS/prism/commit/8dbf1217) - Tests: Fixed languages test discovery [`a9a199b6`](https://github.com/PrismJS/prism/commit/a9a199b6) - Tests: Test discovery should ignore unsupported file extensions ([#2886](https://github.com/PrismJS/prism/issues/2886)) [`4492c5ce`](https://github.com/PrismJS/prism/commit/4492c5ce) - Tests: Exhaustive pattern tests ([#2688](https://github.com/PrismJS/prism/issues/2688)) [`53151404`](https://github.com/PrismJS/prism/commit/53151404) - Tests: Fixed pretty print incorrectly calculating print width ([#2821](https://github.com/PrismJS/prism/issues/2821)) [`5bc405e7`](https://github.com/PrismJS/prism/commit/5bc405e7) - Tests: Automatically normalize line ends ([#2934](https://github.com/PrismJS/prism/issues/2934)) [`99f3ddcd`](https://github.com/PrismJS/prism/commit/99f3ddcd) - Tests: Added `--insert` and `--update` parameters to language test ([#2809](https://github.com/PrismJS/prism/issues/2809)) [`4c8b855d`](https://github.com/PrismJS/prism/commit/4c8b855d) - Tests: Stricter `components.json` tests ([#2758](https://github.com/PrismJS/prism/issues/2758)) [`933af805`](https://github.com/PrismJS/prism/commit/933af805) - **Website** - Copy to clipboard: Fixed highlighting ([#2725](https://github.com/PrismJS/prism/issues/2725)) [`7a790bf9`](https://github.com/PrismJS/prism/commit/7a790bf9) - Readme: Mention `npm ci` ([#2899](https://github.com/PrismJS/prism/issues/2899)) [`91f3aaed`](https://github.com/PrismJS/prism/commit/91f3aaed) - Readme: Added Node and npm version requirements ([#2790](https://github.com/PrismJS/prism/issues/2790)) [`cb220168`](https://github.com/PrismJS/prism/commit/cb220168) - Readme: Update link to Chinese translation ([#2749](https://github.com/PrismJS/prism/issues/2749)) [`266cc700`](https://github.com/PrismJS/prism/commit/266cc700) - Replace `my.cdn` in code sample with Handlebars-like placeholder ([#2906](https://github.com/PrismJS/prism/issues/2906)) [`80471181`](https://github.com/PrismJS/prism/commit/80471181) - Set dummy domain for CDN ([#2905](https://github.com/PrismJS/prism/issues/2905)) [`38f1d289`](https://github.com/PrismJS/prism/commit/38f1d289) - Added MySQL to "Used by" section ([#2785](https://github.com/PrismJS/prism/issues/2785)) [`9b784ebf`](https://github.com/PrismJS/prism/commit/9b784ebf) - Improved basic usage section ([#2777](https://github.com/PrismJS/prism/issues/2777)) [`a1209930`](https://github.com/PrismJS/prism/commit/a1209930) - Updated URL in Autolinker example ([#2751](https://github.com/PrismJS/prism/issues/2751)) [`ec9767d6`](https://github.com/PrismJS/prism/commit/ec9767d6) - Added React native tutorial ([#2683](https://github.com/PrismJS/prism/issues/2683)) [`1506f345`](https://github.com/PrismJS/prism/commit/1506f345) ## 1.23.0 (2020-12-31) ### New components - **Apex** ([#2622](https://github.com/PrismJS/prism/issues/2622)) [`f0e2b70e`](https://github.com/PrismJS/prism/commit/f0e2b70e) - **DataWeave** ([#2659](https://github.com/PrismJS/prism/issues/2659)) [`0803525b`](https://github.com/PrismJS/prism/commit/0803525b) - **PromQL** ([#2628](https://github.com/PrismJS/prism/issues/2628)) [`8831c706`](https://github.com/PrismJS/prism/commit/8831c706) ### Updated components - Fixed multiple vulnerable regexes ([#2584](https://github.com/PrismJS/prism/issues/2584)) [`c2f6a644`](https://github.com/PrismJS/prism/commit/c2f6a644) - **Apache Configuration** - Update directive-flag to match `=` ([#2612](https://github.com/PrismJS/prism/issues/2612)) [`00bf00e3`](https://github.com/PrismJS/prism/commit/00bf00e3) - **C-like** - Made all comments greedy ([#2680](https://github.com/PrismJS/prism/issues/2680)) [`0a3932fe`](https://github.com/PrismJS/prism/commit/0a3932fe) - **C** - Better class name and macro name detection ([#2585](https://github.com/PrismJS/prism/issues/2585)) [`129faf5c`](https://github.com/PrismJS/prism/commit/129faf5c) - **Content-Security-Policy** - Added missing directives and keywords ([#2664](https://github.com/PrismJS/prism/issues/2664)) [`f1541342`](https://github.com/PrismJS/prism/commit/f1541342) - Do not highlight directive names with adjacent hyphens ([#2662](https://github.com/PrismJS/prism/issues/2662)) [`a7ccc16d`](https://github.com/PrismJS/prism/commit/a7ccc16d) - **CSS** - Better HTML `style` attribute tokenization ([#2569](https://github.com/PrismJS/prism/issues/2569)) [`b04cbafe`](https://github.com/PrismJS/prism/commit/b04cbafe) - **Java** - Improved package and class name detection ([#2599](https://github.com/PrismJS/prism/issues/2599)) [`0889bc7c`](https://github.com/PrismJS/prism/commit/0889bc7c) - Added Java 15 keywords ([#2567](https://github.com/PrismJS/prism/issues/2567)) [`73f81c89`](https://github.com/PrismJS/prism/commit/73f81c89) - **Java stack trace** - Added support stack frame element class loaders and modules ([#2658](https://github.com/PrismJS/prism/issues/2658)) [`0bb4f096`](https://github.com/PrismJS/prism/commit/0bb4f096) - **Julia** - Removed constants that are not exported by default ([#2601](https://github.com/PrismJS/prism/issues/2601)) [`093c8175`](https://github.com/PrismJS/prism/commit/093c8175) - **Kotlin** - Added support for backticks in function names ([#2489](https://github.com/PrismJS/prism/issues/2489)) [`a5107d5c`](https://github.com/PrismJS/prism/commit/a5107d5c) - **Latte** - Fixed exponential backtracking ([#2682](https://github.com/PrismJS/prism/issues/2682)) [`89f1e182`](https://github.com/PrismJS/prism/commit/89f1e182) - **Markdown** - Improved URL tokenization ([#2678](https://github.com/PrismJS/prism/issues/2678)) [`2af3e2c2`](https://github.com/PrismJS/prism/commit/2af3e2c2) - Added support for YAML front matter ([#2634](https://github.com/PrismJS/prism/issues/2634)) [`5cf9cfbc`](https://github.com/PrismJS/prism/commit/5cf9cfbc) - **PHP** - Added support for PHP 7.4 + other major improvements ([#2566](https://github.com/PrismJS/prism/issues/2566)) [`38808e64`](https://github.com/PrismJS/prism/commit/38808e64) - Added support for PHP 8.0 features ([#2591](https://github.com/PrismJS/prism/issues/2591)) [`df922d90`](https://github.com/PrismJS/prism/commit/df922d90) - Removed C-like dependency ([#2619](https://github.com/PrismJS/prism/issues/2619)) [`89ebb0b7`](https://github.com/PrismJS/prism/commit/89ebb0b7) - Fixed exponential backtracking ([#2684](https://github.com/PrismJS/prism/issues/2684)) [`37b9c9a1`](https://github.com/PrismJS/prism/commit/37b9c9a1) - **Sass (Scss)** - Added support for Sass modules ([#2643](https://github.com/PrismJS/prism/issues/2643)) [`deb238a6`](https://github.com/PrismJS/prism/commit/deb238a6) - **Scheme** - Fixed number pattern ([#2648](https://github.com/PrismJS/prism/issues/2648)) [`e01ecd00`](https://github.com/PrismJS/prism/commit/e01ecd00) - Fixed function and function-like false positives ([#2611](https://github.com/PrismJS/prism/issues/2611)) [`7951ca24`](https://github.com/PrismJS/prism/commit/7951ca24) - **Shell session** - Fixed false positives because of links in command output ([#2649](https://github.com/PrismJS/prism/issues/2649)) [`8e76a978`](https://github.com/PrismJS/prism/commit/8e76a978) - **TSX** - Temporary fix for the collisions of JSX tags and TS generics ([#2596](https://github.com/PrismJS/prism/issues/2596)) [`25bdb494`](https://github.com/PrismJS/prism/commit/25bdb494) ### Updated plugins - Made Autoloader and Diff Highlight compatible ([#2580](https://github.com/PrismJS/prism/issues/2580)) [`7a74497a`](https://github.com/PrismJS/prism/commit/7a74497a) - **Copy to Clipboard Button** - Set `type="button"` attribute for copy to clipboard plugin ([#2593](https://github.com/PrismJS/prism/issues/2593)) [`f59a85f1`](https://github.com/PrismJS/prism/commit/f59a85f1) - **File Highlight** - Fixed IE compatibility problem ([#2656](https://github.com/PrismJS/prism/issues/2656)) [`3f4ae00d`](https://github.com/PrismJS/prism/commit/3f4ae00d) - **Line Highlight** - Fixed top offset in combination with Line numbers ([#2237](https://github.com/PrismJS/prism/issues/2237)) [`b40f8f4b`](https://github.com/PrismJS/prism/commit/b40f8f4b) - Fixed print background color ([#2668](https://github.com/PrismJS/prism/issues/2668)) [`cdb24abe`](https://github.com/PrismJS/prism/commit/cdb24abe) - **Line Numbers** - Fixed null reference ([#2605](https://github.com/PrismJS/prism/issues/2605)) [`7cdfe556`](https://github.com/PrismJS/prism/commit/7cdfe556) - **Treeview** - Fixed icons on dark themes ([#2631](https://github.com/PrismJS/prism/issues/2631)) [`7266e32f`](https://github.com/PrismJS/prism/commit/7266e32f) - **Unescaped Markup** - Refactoring ([#2445](https://github.com/PrismJS/prism/issues/2445)) [`fc602822`](https://github.com/PrismJS/prism/commit/fc602822) ### Other - Readme: Added alternative link for Chinese translation [`071232b4`](https://github.com/PrismJS/prism/commit/071232b4) - Readme: Removed broken icon for Chinese translation ([#2670](https://github.com/PrismJS/prism/issues/2670)) [`2ea202b9`](https://github.com/PrismJS/prism/commit/2ea202b9) - Readme: Grammar adjustments ([#2629](https://github.com/PrismJS/prism/issues/2629)) [`f217ab75`](https://github.com/PrismJS/prism/commit/f217ab75) - **Core** - Moved pattern matching + lookbehind logic into function ([#2633](https://github.com/PrismJS/prism/issues/2633)) [`24574406`](https://github.com/PrismJS/prism/commit/24574406) - Fixed bug with greedy matching ([#2632](https://github.com/PrismJS/prism/issues/2632)) [`8fa8dd24`](https://github.com/PrismJS/prism/commit/8fa8dd24) - **Infrastructure** - Migrate from TravisCI -> GitHub Actions ([#2606](https://github.com/PrismJS/prism/issues/2606)) [`69132045`](https://github.com/PrismJS/prism/commit/69132045) - Added Dangerfile and provide bundle size info ([#2608](https://github.com/PrismJS/prism/issues/2608)) [`9df20c5e`](https://github.com/PrismJS/prism/commit/9df20c5e) - New `start` script to start local server ([#2491](https://github.com/PrismJS/prism/issues/2491)) [`0604793c`](https://github.com/PrismJS/prism/commit/0604793c) - Added test for exponential backtracking ([#2590](https://github.com/PrismJS/prism/issues/2590)) [`05afbb10`](https://github.com/PrismJS/prism/commit/05afbb10) - Added test for polynomial backtracking ([#2597](https://github.com/PrismJS/prism/issues/2597)) [`e644178b`](https://github.com/PrismJS/prism/commit/e644178b) - Tests: Better pretty print ([#2600](https://github.com/PrismJS/prism/issues/2600)) [`8bfcc819`](https://github.com/PrismJS/prism/commit/8bfcc819) - Tests: Fixed sorted language list test ([#2623](https://github.com/PrismJS/prism/issues/2623)) [`2d3a1267`](https://github.com/PrismJS/prism/commit/2d3a1267) - Tests: Stricter pattern for nice-token-names test ([#2588](https://github.com/PrismJS/prism/issues/2588)) [`0df60be1`](https://github.com/PrismJS/prism/commit/0df60be1) - Tests: Added strict checks for `Prism.languages.extend` ([#2572](https://github.com/PrismJS/prism/issues/2572)) [`8828500e`](https://github.com/PrismJS/prism/commit/8828500e) - **Website** - Test page: Added "Share" option ([#2575](https://github.com/PrismJS/prism/issues/2575)) [`b5f4f10e`](https://github.com/PrismJS/prism/commit/b5f4f10e) - Test page: Don't trigger ad-blockers with class ([#2677](https://github.com/PrismJS/prism/issues/2677)) [`df0738e9`](https://github.com/PrismJS/prism/commit/df0738e9) - Thousands -> millions [`9f82de50`](https://github.com/PrismJS/prism/commit/9f82de50) - Unescaped Markup: More doc regarding comments ([#2652](https://github.com/PrismJS/prism/issues/2652)) [`add3736a`](https://github.com/PrismJS/prism/commit/add3736a) - Website: Added and updated documentation ([#2654](https://github.com/PrismJS/prism/issues/2654)) [`8e660495`](https://github.com/PrismJS/prism/commit/8e660495) - Website: Updated and improved guide on "Extending Prism" page ([#2586](https://github.com/PrismJS/prism/issues/2586)) [`8e1f38ff`](https://github.com/PrismJS/prism/commit/8e1f38ff) ## 1.22.0 (2020-10-10) ### New components - **Birb** ([#2542](https://github.com/PrismJS/prism/issues/2542)) [`4d31e22a`](https://github.com/PrismJS/prism/commit/4d31e22a) - **BSL (1C:Enterprise)** & **OneScript** ([#2520](https://github.com/PrismJS/prism/issues/2520)) [`5c33f0bb`](https://github.com/PrismJS/prism/commit/5c33f0bb) - **MongoDB** ([#2518](https://github.com/PrismJS/prism/issues/2518)) [`004eaa74`](https://github.com/PrismJS/prism/commit/004eaa74) - **Naninovel Script** ([#2494](https://github.com/PrismJS/prism/issues/2494)) [`388ad996`](https://github.com/PrismJS/prism/commit/388ad996) - **PureScript** ([#2526](https://github.com/PrismJS/prism/issues/2526)) [`ad748a00`](https://github.com/PrismJS/prism/commit/ad748a00) - **SML** & **SML/NJ** ([#2537](https://github.com/PrismJS/prism/issues/2537)) [`cb75d9e2`](https://github.com/PrismJS/prism/commit/cb75d9e2) - **Stan** ([#2490](https://github.com/PrismJS/prism/issues/2490)) [`2da2beba`](https://github.com/PrismJS/prism/commit/2da2beba) - **TypoScript** & **TSConfig** ([#2505](https://github.com/PrismJS/prism/issues/2505)) [`bf115f47`](https://github.com/PrismJS/prism/commit/bf115f47) ### Updated components - Removed duplicate alternatives in various languages ([#2524](https://github.com/PrismJS/prism/issues/2524)) [`fa2225ff`](https://github.com/PrismJS/prism/commit/fa2225ff) - **Haskell** - Improvements ([#2535](https://github.com/PrismJS/prism/issues/2535)) [`e023044c`](https://github.com/PrismJS/prism/commit/e023044c) - **JS Extras** - Highlight import and export bindings ([#2533](https://github.com/PrismJS/prism/issues/2533)) [`c51ababb`](https://github.com/PrismJS/prism/commit/c51ababb) - Added control-flow keywords ([#2529](https://github.com/PrismJS/prism/issues/2529)) [`bcef22af`](https://github.com/PrismJS/prism/commit/bcef22af) - **PHP** - Added `match` keyword (PHP 8.0) ([#2574](https://github.com/PrismJS/prism/issues/2574)) [`1761513e`](https://github.com/PrismJS/prism/commit/1761513e) - **Processing** - Fixed function pattern ([#2564](https://github.com/PrismJS/prism/issues/2564)) [`35cbc02f`](https://github.com/PrismJS/prism/commit/35cbc02f) - **Regex** - Changed how languages embed regexes ([#2532](https://github.com/PrismJS/prism/issues/2532)) [`f62ca787`](https://github.com/PrismJS/prism/commit/f62ca787) - **Rust** - Fixed Unicode char literals ([#2550](https://github.com/PrismJS/prism/issues/2550)) [`3b4f14ca`](https://github.com/PrismJS/prism/commit/3b4f14ca) - **Scheme** - Added support for R7RS syntax ([#2525](https://github.com/PrismJS/prism/issues/2525)) [`e4f6ccac`](https://github.com/PrismJS/prism/commit/e4f6ccac) - **Shell session** - Added aliases ([#2548](https://github.com/PrismJS/prism/issues/2548)) [`bfb36748`](https://github.com/PrismJS/prism/commit/bfb36748) - Highlight all commands after the start of any Heredoc string ([#2509](https://github.com/PrismJS/prism/issues/2509)) [`6c921801`](https://github.com/PrismJS/prism/commit/6c921801) - **YAML** - Improved key pattern ([#2561](https://github.com/PrismJS/prism/issues/2561)) [`59853a52`](https://github.com/PrismJS/prism/commit/59853a52) ### Updated plugins - **Autoloader** - Fixed file detection regexes ([#2549](https://github.com/PrismJS/prism/issues/2549)) [`d36ea993`](https://github.com/PrismJS/prism/commit/d36ea993) - **Match braces** - Fixed JS interpolation punctuation ([#2541](https://github.com/PrismJS/prism/issues/2541)) [`6b47133d`](https://github.com/PrismJS/prism/commit/6b47133d) - **Show Language** - Added title for plain text ([#2555](https://github.com/PrismJS/prism/issues/2555)) [`a409245e`](https://github.com/PrismJS/prism/commit/a409245e) ### Other - Tests: Added an option to accept the actual token stream ([#2515](https://github.com/PrismJS/prism/issues/2515)) [`bafab634`](https://github.com/PrismJS/prism/commit/bafab634) - **Core** - Docs: Minor improvement ([#2513](https://github.com/PrismJS/prism/issues/2513)) [`206dc80f`](https://github.com/PrismJS/prism/commit/206dc80f) - **Infrastructure** - JSDoc: Fixed line ends ([#2523](https://github.com/PrismJS/prism/issues/2523)) [`bf169e5f`](https://github.com/PrismJS/prism/commit/bf169e5f) - **Website** - Website: Added new SB101 tutorial replacing the Crambler one ([#2576](https://github.com/PrismJS/prism/issues/2576)) [`655f985c`](https://github.com/PrismJS/prism/commit/655f985c) - Website: Fix typo on homepage by adding missing word add ([#2570](https://github.com/PrismJS/prism/issues/2570)) [`8ae6a4ba`](https://github.com/PrismJS/prism/commit/8ae6a4ba) - Custom class: Improved doc ([#2512](https://github.com/PrismJS/prism/issues/2512)) [`5ad6cb23`](https://github.com/PrismJS/prism/commit/5ad6cb23) ## 1.21.0 (2020-08-06) ### New components - **.ignore** & **.gitignore** & **.hgignore** & **.npmignore** ([#2481](https://github.com/PrismJS/prism/issues/2481)) [`3fcce6fe`](https://github.com/PrismJS/prism/commit/3fcce6fe) - **Agda** ([#2430](https://github.com/PrismJS/prism/issues/2430)) [`3a127c7d`](https://github.com/PrismJS/prism/commit/3a127c7d) - **AL** ([#2300](https://github.com/PrismJS/prism/issues/2300)) [`de21eb64`](https://github.com/PrismJS/prism/commit/de21eb64) - **Cypher** ([#2459](https://github.com/PrismJS/prism/issues/2459)) [`398e2943`](https://github.com/PrismJS/prism/commit/398e2943) - **Dhall** ([#2473](https://github.com/PrismJS/prism/issues/2473)) [`649e51e5`](https://github.com/PrismJS/prism/commit/649e51e5) - **EditorConfig** ([#2471](https://github.com/PrismJS/prism/issues/2471)) [`ed8fff91`](https://github.com/PrismJS/prism/commit/ed8fff91) - **HLSL** ([#2318](https://github.com/PrismJS/prism/issues/2318)) [`87a5c7ae`](https://github.com/PrismJS/prism/commit/87a5c7ae) - **JS stack trace** ([#2418](https://github.com/PrismJS/prism/issues/2418)) [`ae0327b3`](https://github.com/PrismJS/prism/commit/ae0327b3) - **PeopleCode** ([#2302](https://github.com/PrismJS/prism/issues/2302)) [`bd4d8165`](https://github.com/PrismJS/prism/commit/bd4d8165) - **PureBasic** ([#2369](https://github.com/PrismJS/prism/issues/2369)) [`d0c1c70d`](https://github.com/PrismJS/prism/commit/d0c1c70d) - **Racket** ([#2315](https://github.com/PrismJS/prism/issues/2315)) [`053016ef`](https://github.com/PrismJS/prism/commit/053016ef) - **Smali** ([#2419](https://github.com/PrismJS/prism/issues/2419)) [`22eb5cad`](https://github.com/PrismJS/prism/commit/22eb5cad) - **Structured Text (IEC 61131-3)** ([#2311](https://github.com/PrismJS/prism/issues/2311)) [`8704cdfb`](https://github.com/PrismJS/prism/commit/8704cdfb) - **UnrealScript** ([#2305](https://github.com/PrismJS/prism/issues/2305)) [`1093ceb3`](https://github.com/PrismJS/prism/commit/1093ceb3) - **WarpScript** ([#2307](https://github.com/PrismJS/prism/issues/2307)) [`cde5b0fa`](https://github.com/PrismJS/prism/commit/cde5b0fa) - **XML doc (.net)** ([#2340](https://github.com/PrismJS/prism/issues/2340)) [`caec5e30`](https://github.com/PrismJS/prism/commit/caec5e30) - **YANG** ([#2467](https://github.com/PrismJS/prism/issues/2467)) [`ed1df1e1`](https://github.com/PrismJS/prism/commit/ed1df1e1) ### Updated components - Markup & JSON: Added new aliases ([#2390](https://github.com/PrismJS/prism/issues/2390)) [`9782cfe6`](https://github.com/PrismJS/prism/commit/9782cfe6) - Fixed several cases of exponential backtracking ([#2268](https://github.com/PrismJS/prism/issues/2268)) [`7a554b5f`](https://github.com/PrismJS/prism/commit/7a554b5f) - **APL** - Added `⍥` ([#2409](https://github.com/PrismJS/prism/issues/2409)) [`0255cb6a`](https://github.com/PrismJS/prism/commit/0255cb6a) - **AutoHotkey** - Added missing `format` built-in ([#2450](https://github.com/PrismJS/prism/issues/2450)) [`7c66cfc4`](https://github.com/PrismJS/prism/commit/7c66cfc4) - Improved comments and other improvements ([#2412](https://github.com/PrismJS/prism/issues/2412)) [`ddf3cc62`](https://github.com/PrismJS/prism/commit/ddf3cc62) - Added missing definitions ([#2400](https://github.com/PrismJS/prism/issues/2400)) [`4fe03676`](https://github.com/PrismJS/prism/commit/4fe03676) - **Bash** - Added `composer` command ([#2298](https://github.com/PrismJS/prism/issues/2298)) [`044dd271`](https://github.com/PrismJS/prism/commit/044dd271) - **Batch** - Fix escaped double quote ([#2485](https://github.com/PrismJS/prism/issues/2485)) [`f0f8210c`](https://github.com/PrismJS/prism/commit/f0f8210c) - **C** - Improved macros and expressions ([#2440](https://github.com/PrismJS/prism/issues/2440)) [`8a72fa6f`](https://github.com/PrismJS/prism/commit/8a72fa6f) - Improved macros ([#2320](https://github.com/PrismJS/prism/issues/2320)) [`fdcf7ed2`](https://github.com/PrismJS/prism/commit/fdcf7ed2) - **C#** - Improved pattern matching ([#2411](https://github.com/PrismJS/prism/issues/2411)) [`7f341fc1`](https://github.com/PrismJS/prism/commit/7f341fc1) - Fixed adjacent string interpolations ([#2402](https://github.com/PrismJS/prism/issues/2402)) [`2a2e79ed`](https://github.com/PrismJS/prism/commit/2a2e79ed) - **C++** - Added support for default comparison operator ([#2426](https://github.com/PrismJS/prism/issues/2426)) [`8e9d161c`](https://github.com/PrismJS/prism/commit/8e9d161c) - Improved class name detection ([#2348](https://github.com/PrismJS/prism/issues/2348)) [`e3fe9040`](https://github.com/PrismJS/prism/commit/e3fe9040) - Fixed `enum class` class names ([#2342](https://github.com/PrismJS/prism/issues/2342)) [`30b4e254`](https://github.com/PrismJS/prism/commit/30b4e254) - **Content-Security-Policy** - Fixed directives ([#2461](https://github.com/PrismJS/prism/issues/2461)) [`537a9e80`](https://github.com/PrismJS/prism/commit/537a9e80) - **CSS** - Improved url and added keywords ([#2432](https://github.com/PrismJS/prism/issues/2432)) [`964de5a1`](https://github.com/PrismJS/prism/commit/964de5a1) - **CSS Extras** - Optimized `class` and `id` patterns ([#2359](https://github.com/PrismJS/prism/issues/2359)) [`fdbc4473`](https://github.com/PrismJS/prism/commit/fdbc4473) - Renamed `attr-{name,value}` tokens and added tokens for combinators and selector lists ([#2373](https://github.com/PrismJS/prism/issues/2373)) [`e523f5d0`](https://github.com/PrismJS/prism/commit/e523f5d0) - **Dart** - Added missing keywords ([#2355](https://github.com/PrismJS/prism/issues/2355)) [`4172ab6f`](https://github.com/PrismJS/prism/commit/4172ab6f) - **Diff** - Added `prefix` token ([#2281](https://github.com/PrismJS/prism/issues/2281)) [`fd432a5b`](https://github.com/PrismJS/prism/commit/fd432a5b) - **Docker** - Fixed strings inside comments ([#2428](https://github.com/PrismJS/prism/issues/2428)) [`37273a6f`](https://github.com/PrismJS/prism/commit/37273a6f) - **EditorConfig** - Trim spaces before key and section title ([#2482](https://github.com/PrismJS/prism/issues/2482)) [`0c30c582`](https://github.com/PrismJS/prism/commit/0c30c582) - **EJS** - Added `eta` alias ([#2282](https://github.com/PrismJS/prism/issues/2282)) [`0cfb6c5f`](https://github.com/PrismJS/prism/commit/0cfb6c5f) - **GLSL** - Improvements ([#2321](https://github.com/PrismJS/prism/issues/2321)) [`33e49956`](https://github.com/PrismJS/prism/commit/33e49956) - **GraphQL** - Added missing keywords ([#2407](https://github.com/PrismJS/prism/issues/2407)) [`de8ed16d`](https://github.com/PrismJS/prism/commit/de8ed16d) - Added support for multi-line strings and descriptions ([#2406](https://github.com/PrismJS/prism/issues/2406)) [`9e64c62e`](https://github.com/PrismJS/prism/commit/9e64c62e) - **Io** - Fixed operator pattern ([#2365](https://github.com/PrismJS/prism/issues/2365)) [`d6055771`](https://github.com/PrismJS/prism/commit/d6055771) - **Java** - Fixed `namespace` token ([#2295](https://github.com/PrismJS/prism/issues/2295)) [`62e184bb`](https://github.com/PrismJS/prism/commit/62e184bb) - **JavaDoc** - Improvements ([#2324](https://github.com/PrismJS/prism/issues/2324)) [`032910ba`](https://github.com/PrismJS/prism/commit/032910ba) - **JavaScript** - Improved regex detection ([#2465](https://github.com/PrismJS/prism/issues/2465)) [`4f55052f`](https://github.com/PrismJS/prism/commit/4f55052f) - Improved `get`/`set` and parameter detection ([#2387](https://github.com/PrismJS/prism/issues/2387)) [`ed715158`](https://github.com/PrismJS/prism/commit/ed715158) - Added support for logical assignment operators ([#2378](https://github.com/PrismJS/prism/issues/2378)) [`b28f21b7`](https://github.com/PrismJS/prism/commit/b28f21b7) - **JSDoc** - Improvements ([#2466](https://github.com/PrismJS/prism/issues/2466)) [`2805ae35`](https://github.com/PrismJS/prism/commit/2805ae35) - **JSON** - Greedy comments ([#2479](https://github.com/PrismJS/prism/issues/2479)) [`158caf52`](https://github.com/PrismJS/prism/commit/158caf52) - **Julia** - Improved strings, comments, and other patterns ([#2363](https://github.com/PrismJS/prism/issues/2363)) [`81cf2344`](https://github.com/PrismJS/prism/commit/81cf2344) - **Kotlin** - Added `kt` and `kts` aliases ([#2474](https://github.com/PrismJS/prism/issues/2474)) [`67f97e2e`](https://github.com/PrismJS/prism/commit/67f97e2e) - **Markup** - Added tokens inside DOCTYPE ([#2349](https://github.com/PrismJS/prism/issues/2349)) [`9c7bc820`](https://github.com/PrismJS/prism/commit/9c7bc820) - Added `attr-equals` alias for the attribute `=` sign ([#2350](https://github.com/PrismJS/prism/issues/2350)) [`96a0116e`](https://github.com/PrismJS/prism/commit/96a0116e) - Added alias for named entities ([#2351](https://github.com/PrismJS/prism/issues/2351)) [`ab1e34ae`](https://github.com/PrismJS/prism/commit/ab1e34ae) - Added support for SSML ([#2306](https://github.com/PrismJS/prism/issues/2306)) [`eb70070d`](https://github.com/PrismJS/prism/commit/eb70070d) - **Objective-C** - Added `objc` alias ([#2331](https://github.com/PrismJS/prism/issues/2331)) [`67c6b7af`](https://github.com/PrismJS/prism/commit/67c6b7af) - **PowerShell** - New functions pattern bases on naming conventions ([#2301](https://github.com/PrismJS/prism/issues/2301)) [`fec39bcf`](https://github.com/PrismJS/prism/commit/fec39bcf) - **Protocol Buffers** - Added support for RPC syntax ([#2414](https://github.com/PrismJS/prism/issues/2414)) [`939a17c4`](https://github.com/PrismJS/prism/commit/939a17c4) - **Pug** - Improved class and id detection in tags ([#2358](https://github.com/PrismJS/prism/issues/2358)) [`7f948ecb`](https://github.com/PrismJS/prism/commit/7f948ecb) - **Python** - Fixed empty multiline strings ([#2344](https://github.com/PrismJS/prism/issues/2344)) [`c9324476`](https://github.com/PrismJS/prism/commit/c9324476) - **Regex** - Added aliases and minor improvements ([#2325](https://github.com/PrismJS/prism/issues/2325)) [`8a72830a`](https://github.com/PrismJS/prism/commit/8a72830a) - **Ren'py** - Added `rpy` alias ([#2385](https://github.com/PrismJS/prism/issues/2385)) [`4935b5ca`](https://github.com/PrismJS/prism/commit/4935b5ca) - **Ruby** - Optimized `regex` and `string` patterns ([#2354](https://github.com/PrismJS/prism/issues/2354)) [`b526e8c0`](https://github.com/PrismJS/prism/commit/b526e8c0) - **Rust** - Improvements ([#2464](https://github.com/PrismJS/prism/issues/2464)) [`2ff40fe0`](https://github.com/PrismJS/prism/commit/2ff40fe0) - Improvements ([#2332](https://github.com/PrismJS/prism/issues/2332)) [`194c5429`](https://github.com/PrismJS/prism/commit/194c5429) - **SAS** - Improved macro string functions ([#2463](https://github.com/PrismJS/prism/issues/2463)) [`278316ca`](https://github.com/PrismJS/prism/commit/278316ca) - Handle edge case of string macro functions ([#2451](https://github.com/PrismJS/prism/issues/2451)) [`a0a9f1ef`](https://github.com/PrismJS/prism/commit/a0a9f1ef) - Improved comments in `proc groovy` and `proc lua` ([#2392](https://github.com/PrismJS/prism/issues/2392)) [`475a5903`](https://github.com/PrismJS/prism/commit/475a5903) - **Scheme** - Adjusted lookbehind for literals ([#2396](https://github.com/PrismJS/prism/issues/2396)) [`1e3f542b`](https://github.com/PrismJS/prism/commit/1e3f542b) - Improved lambda parameter ([#2346](https://github.com/PrismJS/prism/issues/2346)) [`1946918a`](https://github.com/PrismJS/prism/commit/1946918a) - Consistent lookaheads ([#2322](https://github.com/PrismJS/prism/issues/2322)) [`d2541d54`](https://github.com/PrismJS/prism/commit/d2541d54) - Improved boolean ([#2316](https://github.com/PrismJS/prism/issues/2316)) [`e27e65af`](https://github.com/PrismJS/prism/commit/e27e65af) - Added missing special keywords ([#2304](https://github.com/PrismJS/prism/issues/2304)) [`ac297ba5`](https://github.com/PrismJS/prism/commit/ac297ba5) - Improvements ([#2263](https://github.com/PrismJS/prism/issues/2263)) [`9a49f78f`](https://github.com/PrismJS/prism/commit/9a49f78f) - **Solidity (Ethereum)** - Added `sol` alias ([#2382](https://github.com/PrismJS/prism/issues/2382)) [`6352213a`](https://github.com/PrismJS/prism/commit/6352213a) - **SQL** - Added PostgreSQL `RETURNING` keyword ([#2476](https://github.com/PrismJS/prism/issues/2476)) [`bea7a585`](https://github.com/PrismJS/prism/commit/bea7a585) - **Stylus** - Fixed comments breaking declarations + minor improvements ([#2372](https://github.com/PrismJS/prism/issues/2372)) [`6d663b6e`](https://github.com/PrismJS/prism/commit/6d663b6e) - New tokens and other improvements ([#2368](https://github.com/PrismJS/prism/issues/2368)) [`2c10ef8a`](https://github.com/PrismJS/prism/commit/2c10ef8a) - Fixed comments breaking strings and URLs ([#2361](https://github.com/PrismJS/prism/issues/2361)) [`0d65d6c9`](https://github.com/PrismJS/prism/commit/0d65d6c9) - **T4 Text Templates (VB)** - Use the correct VB variant ([#2341](https://github.com/PrismJS/prism/issues/2341)) [`b6093339`](https://github.com/PrismJS/prism/commit/b6093339) - **TypeScript** - Added `asserts` keyword and other improvements ([#2280](https://github.com/PrismJS/prism/issues/2280)) [`a197cfcd`](https://github.com/PrismJS/prism/commit/a197cfcd) - **Visual Basic** - Added VBA alias ([#2469](https://github.com/PrismJS/prism/issues/2469)) [`78161d60`](https://github.com/PrismJS/prism/commit/78161d60) - Added `until` keyword ([#2423](https://github.com/PrismJS/prism/issues/2423)) [`a13ee8d9`](https://github.com/PrismJS/prism/commit/a13ee8d9) - Added missing keywords ([#2376](https://github.com/PrismJS/prism/issues/2376)) [`ba5ac1da`](https://github.com/PrismJS/prism/commit/ba5ac1da) ### Updated plugins - File Highlight & JSONP Highlight update ([#1974](https://github.com/PrismJS/prism/issues/1974)) [`afea17d9`](https://github.com/PrismJS/prism/commit/afea17d9) - Added general de/activation mechanism for plugins ([#2434](https://github.com/PrismJS/prism/issues/2434)) [`a36e96ab`](https://github.com/PrismJS/prism/commit/a36e96ab) - **Autoloader** - Fixed bug breaking Autoloader ([#2449](https://github.com/PrismJS/prism/issues/2449)) [`a3416bf3`](https://github.com/PrismJS/prism/commit/a3416bf3) - Fixed `data-dependencies` and extensions ([#2326](https://github.com/PrismJS/prism/issues/2326)) [`1654b25f`](https://github.com/PrismJS/prism/commit/1654b25f) - Improved path detection and other minor improvements ([#2245](https://github.com/PrismJS/prism/issues/2245)) [`5cdc3251`](https://github.com/PrismJS/prism/commit/5cdc3251) - **Command Line** - Some refactoring ([#2290](https://github.com/PrismJS/prism/issues/2290)) [`8c9c2896`](https://github.com/PrismJS/prism/commit/8c9c2896) - Correctly rehighlight elements ([#2291](https://github.com/PrismJS/prism/issues/2291)) [`e6b2c6fc`](https://github.com/PrismJS/prism/commit/e6b2c6fc) - **Line Highlight** - Added linkable line numbers ([#2328](https://github.com/PrismJS/prism/issues/2328)) [`eb82e804`](https://github.com/PrismJS/prism/commit/eb82e804) - **Line Numbers** - Improved resize performance ([#2125](https://github.com/PrismJS/prism/issues/2125)) [`b96ed225`](https://github.com/PrismJS/prism/commit/b96ed225) - Fixed TypeError when `lineNumberWrapper` is null ([#2337](https://github.com/PrismJS/prism/issues/2337)) [`4b61661d`](https://github.com/PrismJS/prism/commit/4b61661d) - Exposed `_resizeElement` function ([#2288](https://github.com/PrismJS/prism/issues/2288)) [`893f2a79`](https://github.com/PrismJS/prism/commit/893f2a79) - **Previewers** - Fixed XSS ([#2506](https://github.com/PrismJS/prism/issues/2506)) [`8bba4880`](https://github.com/PrismJS/prism/commit/8bba4880) - **Unescaped Markup** - No longer requires `Prism.languages.markup` ([#2444](https://github.com/PrismJS/prism/issues/2444)) [`af132dd3`](https://github.com/PrismJS/prism/commit/af132dd3) ### Updated themes - **Coy** - Minor improvements ([#2176](https://github.com/PrismJS/prism/issues/2176)) [`7109c18c`](https://github.com/PrismJS/prism/commit/7109c18c) - **Default** - Added a comment that declares the background color of `operator` tokens as intentional ([#2309](https://github.com/PrismJS/prism/issues/2309)) [`937e2691`](https://github.com/PrismJS/prism/commit/937e2691) - **Okaidia** - Update comment text color to meet WCAG contrast recommendations to AA level ([#2292](https://github.com/PrismJS/prism/issues/2292)) [`06495f90`](https://github.com/PrismJS/prism/commit/06495f90) ### Other - Changelog: Fixed v1.20.0 release date [`cb6349e2`](https://github.com/PrismJS/prism/commit/cb6349e2) - **Core** - Fixed greedy matching bug ([#2032](https://github.com/PrismJS/prism/issues/2032)) [`40285203`](https://github.com/PrismJS/prism/commit/40285203) - Added JSDoc ([#1782](https://github.com/PrismJS/prism/issues/1782)) [`4ff555be`](https://github.com/PrismJS/prism/commit/4ff555be) - **Infrastructure** - Update Git repo URL in package.json ([#2334](https://github.com/PrismJS/prism/issues/2334)) [`10f43275`](https://github.com/PrismJS/prism/commit/10f43275) - Added docs to ignore files ([#2437](https://github.com/PrismJS/prism/issues/2437)) [`05c9f20b`](https://github.com/PrismJS/prism/commit/05c9f20b) - Added `npm run build` command ([#2356](https://github.com/PrismJS/prism/issues/2356)) [`ff74a610`](https://github.com/PrismJS/prism/commit/ff74a610) - gulp: Improved `inlineRegexSource` ([#2296](https://github.com/PrismJS/prism/issues/2296)) [`abb800dd`](https://github.com/PrismJS/prism/commit/abb800dd) - gulp: Fixed language map ([#2283](https://github.com/PrismJS/prism/issues/2283)) [`11053193`](https://github.com/PrismJS/prism/commit/11053193) - gulp: Removed `premerge` task ([#2357](https://github.com/PrismJS/prism/issues/2357)) [`5ff7932b`](https://github.com/PrismJS/prism/commit/5ff7932b) - Tests are now faster ([#2165](https://github.com/PrismJS/prism/issues/2165)) [`e756be3f`](https://github.com/PrismJS/prism/commit/e756be3f) - Tests: Added extra newlines in pretty token streams ([#2070](https://github.com/PrismJS/prism/issues/2070)) [`681adeef`](https://github.com/PrismJS/prism/commit/681adeef) - Tests: Added test for identifier support across all languages ([#2371](https://github.com/PrismJS/prism/issues/2371)) [`48fac3b2`](https://github.com/PrismJS/prism/commit/48fac3b2) - Tests: Added test to sort the language list ([#2222](https://github.com/PrismJS/prism/issues/2222)) [`a3758728`](https://github.com/PrismJS/prism/commit/a3758728) - Tests: Always pretty-print token streams ([#2421](https://github.com/PrismJS/prism/issues/2421)) [`583e7eb5`](https://github.com/PrismJS/prism/commit/583e7eb5) - Tests: Always use `components.json` ([#2370](https://github.com/PrismJS/prism/issues/2370)) [`e416341f`](https://github.com/PrismJS/prism/commit/e416341f) - Tests: Better error messages for pattern tests ([#2364](https://github.com/PrismJS/prism/issues/2364)) [`10ca6433`](https://github.com/PrismJS/prism/commit/10ca6433) - Tests: Included `console` in VM context ([#2353](https://github.com/PrismJS/prism/issues/2353)) [`b4ed5ded`](https://github.com/PrismJS/prism/commit/b4ed5ded) - **Website** - Fixed typos "Prims" ([#2455](https://github.com/PrismJS/prism/issues/2455)) [`dfa5498a`](https://github.com/PrismJS/prism/commit/dfa5498a) - New assets directory for all web-only files ([#2180](https://github.com/PrismJS/prism/issues/2180)) [`91fdd0b1`](https://github.com/PrismJS/prism/commit/91fdd0b1) - Improvements ([#2053](https://github.com/PrismJS/prism/issues/2053)) [`ce0fa227`](https://github.com/PrismJS/prism/commit/ce0fa227) - Fixed Treeview page ([#2484](https://github.com/PrismJS/prism/issues/2484)) [`a0efa40b`](https://github.com/PrismJS/prism/commit/a0efa40b) - Line Numbers: Fixed class name on website [`453079bf`](https://github.com/PrismJS/prism/commit/453079bf) - Line Numbers: Improved documentation ([#2456](https://github.com/PrismJS/prism/issues/2456)) [`447429f0`](https://github.com/PrismJS/prism/commit/447429f0) - Line Numbers: Style inline code on website ([#2435](https://github.com/PrismJS/prism/issues/2435)) [`ad9c13e2`](https://github.com/PrismJS/prism/commit/ad9c13e2) - Filter highlightAll: Fixed typo ([#2391](https://github.com/PrismJS/prism/issues/2391)) [`55bf7ec1`](https://github.com/PrismJS/prism/commit/55bf7ec1) ## 1.20.0 (2020-04-04) ### New components - **Concurnas** ([#2206](https://github.com/PrismJS/prism/issues/2206)) [`b24f7348`](https://github.com/PrismJS/prism/commit/b24f7348) - **DAX** ([#2248](https://github.com/PrismJS/prism/issues/2248)) [`9227853f`](https://github.com/PrismJS/prism/commit/9227853f) - **Excel Formula** ([#2219](https://github.com/PrismJS/prism/issues/2219)) [`bf4f7bfa`](https://github.com/PrismJS/prism/commit/bf4f7bfa) - **Factor** ([#2203](https://github.com/PrismJS/prism/issues/2203)) [`f941102e`](https://github.com/PrismJS/prism/commit/f941102e) - **LLVM IR** ([#2221](https://github.com/PrismJS/prism/issues/2221)) [`43efde2e`](https://github.com/PrismJS/prism/commit/43efde2e) - **PowerQuery** ([#2250](https://github.com/PrismJS/prism/issues/2250)) [`8119e57b`](https://github.com/PrismJS/prism/commit/8119e57b) - **Solution file** ([#2213](https://github.com/PrismJS/prism/issues/2213)) [`15983d52`](https://github.com/PrismJS/prism/commit/15983d52) ### Updated components - **Bash** - Added support for escaped quotes ([#2256](https://github.com/PrismJS/prism/issues/2256)) [`328d0e0e`](https://github.com/PrismJS/prism/commit/328d0e0e) - **BBcode** - Added "shortcode" alias ([#2273](https://github.com/PrismJS/prism/issues/2273)) [`57eebced`](https://github.com/PrismJS/prism/commit/57eebced) - **C/C++/OpenCL C** - Improvements ([#2196](https://github.com/PrismJS/prism/issues/2196)) [`674f4b35`](https://github.com/PrismJS/prism/commit/674f4b35) - **C** - Improvemed `comment` pattern ([#2229](https://github.com/PrismJS/prism/issues/2229)) [`fa630726`](https://github.com/PrismJS/prism/commit/fa630726) - **C#** - Fixed keywords in type lists blocking type names ([#2277](https://github.com/PrismJS/prism/issues/2277)) [`947a55bd`](https://github.com/PrismJS/prism/commit/947a55bd) - C# improvements ([#1444](https://github.com/PrismJS/prism/issues/1444)) [`42b15463`](https://github.com/PrismJS/prism/commit/42b15463) - **C++** - Added C++20 keywords ([#2236](https://github.com/PrismJS/prism/issues/2236)) [`462ad57e`](https://github.com/PrismJS/prism/commit/462ad57e) - **CSS** - Fixed `url()` containing "@" ([#2272](https://github.com/PrismJS/prism/issues/2272)) [`504a63ba`](https://github.com/PrismJS/prism/commit/504a63ba) - **CSS Extras** - Added support for the selector function ([#2201](https://github.com/PrismJS/prism/issues/2201)) [`2e0eff76`](https://github.com/PrismJS/prism/commit/2e0eff76) - **Elixir** - Added support for attributes names ending with `?` ([#2182](https://github.com/PrismJS/prism/issues/2182)) [`5450e24c`](https://github.com/PrismJS/prism/commit/5450e24c) - **Java** - Added `record` keyword ([#2185](https://github.com/PrismJS/prism/issues/2185)) [`47910b5c`](https://github.com/PrismJS/prism/commit/47910b5c) - **Markdown** - Added support for nested lists ([#2228](https://github.com/PrismJS/prism/issues/2228)) [`73c8a376`](https://github.com/PrismJS/prism/commit/73c8a376) - **OpenCL** - Require C ([#2231](https://github.com/PrismJS/prism/issues/2231)) [`26626ded`](https://github.com/PrismJS/prism/commit/26626ded) - **PHPDoc** - Fixed exponential backtracking ([#2198](https://github.com/PrismJS/prism/issues/2198)) [`3b42536e`](https://github.com/PrismJS/prism/commit/3b42536e) - **Ruby** - Fixed exponential backtracking ([#2225](https://github.com/PrismJS/prism/issues/2225)) [`c5de5aa8`](https://github.com/PrismJS/prism/commit/c5de5aa8) - **SAS** - Fixed SAS' "peerDependencies" ([#2230](https://github.com/PrismJS/prism/issues/2230)) [`7d8ff7ea`](https://github.com/PrismJS/prism/commit/7d8ff7ea) - **Shell session** - Improvements ([#2208](https://github.com/PrismJS/prism/issues/2208)) [`bd16bd57`](https://github.com/PrismJS/prism/commit/bd16bd57) - **Visual Basic** - Added support for comments with line continuations ([#2195](https://github.com/PrismJS/prism/issues/2195)) [`a7d67ca3`](https://github.com/PrismJS/prism/commit/a7d67ca3) - **YAML** - Improvements ([#2226](https://github.com/PrismJS/prism/issues/2226)) [`5362ba16`](https://github.com/PrismJS/prism/commit/5362ba16) - Fixed highlighting of anchors and aliases ([#2217](https://github.com/PrismJS/prism/issues/2217)) [`6124c974`](https://github.com/PrismJS/prism/commit/6124c974) ### New plugins - **Treeview** ([#2265](https://github.com/PrismJS/prism/issues/2265)) [`be909b18`](https://github.com/PrismJS/prism/commit/be909b18) ### Updated plugins - **Inline Color** - Support for (semi-)transparent colors and minor improvements ([#2223](https://github.com/PrismJS/prism/issues/2223)) [`8d2c5a3e`](https://github.com/PrismJS/prism/commit/8d2c5a3e) - **Keep Markup** - Remove self & document from IIFE arguments ([#2258](https://github.com/PrismJS/prism/issues/2258)) [`3c043338`](https://github.com/PrismJS/prism/commit/3c043338) - **Toolbar** - `data-toolbar-order` is now inherited ([#2205](https://github.com/PrismJS/prism/issues/2205)) [`238f1163`](https://github.com/PrismJS/prism/commit/238f1163) ### Other - Updated all `String.propotype.replace` calls for literal strings [`5d7aab56`](https://github.com/PrismJS/prism/commit/5d7aab56) - **Core** - Linked list implementation for `matchGrammar` ([#1909](https://github.com/PrismJS/prism/issues/1909)) [`2d4c94cd`](https://github.com/PrismJS/prism/commit/2d4c94cd) - Faster `Token.stringify` ([#2171](https://github.com/PrismJS/prism/issues/2171)) [`f683972e`](https://github.com/PrismJS/prism/commit/f683972e) - Fixed scope problem in script mode ([#2184](https://github.com/PrismJS/prism/issues/2184)) [`984e5d2e`](https://github.com/PrismJS/prism/commit/984e5d2e) - **Infrastructure** - Travis: Updated NodeJS versions ([#2246](https://github.com/PrismJS/prism/issues/2246)) [`e635260b`](https://github.com/PrismJS/prism/commit/e635260b) - gulp: Inline regex source improvement ([#2227](https://github.com/PrismJS/prism/issues/2227)) [`67afc5ad`](https://github.com/PrismJS/prism/commit/67afc5ad) - Tests: Added new pattern check for octal escapes ([#2189](https://github.com/PrismJS/prism/issues/2189)) [`81e1c3dd`](https://github.com/PrismJS/prism/commit/81e1c3dd) - Tests: Fixed optional dependencies in pattern tests ([#2242](https://github.com/PrismJS/prism/issues/2242)) [`1e3070a2`](https://github.com/PrismJS/prism/commit/1e3070a2) - Tests: Added test for zero-width lookbehinds ([#2220](https://github.com/PrismJS/prism/issues/2220)) [`7d03ece4`](https://github.com/PrismJS/prism/commit/7d03ece4) - Added tests for examples ([#2216](https://github.com/PrismJS/prism/issues/2216)) [`1f7a245c`](https://github.com/PrismJS/prism/commit/1f7a245c) - **Website** - Removed invalid strings from C# example ([#2266](https://github.com/PrismJS/prism/issues/2266)) [`c917a8ca`](https://github.com/PrismJS/prism/commit/c917a8ca) - Fixed Diff highlight plugin page title ([#2233](https://github.com/PrismJS/prism/issues/2233)) [`a82770f8`](https://github.com/PrismJS/prism/commit/a82770f8) - Added link to `prism-liquibase` Bash language extension. ([#2191](https://github.com/PrismJS/prism/issues/2191)) [`0bf73dc7`](https://github.com/PrismJS/prism/commit/0bf73dc7) - Examples: Updated content header ([#2232](https://github.com/PrismJS/prism/issues/2232)) [`6232878b`](https://github.com/PrismJS/prism/commit/6232878b) - Website: Added Coy bug to the known failures page. ([#2170](https://github.com/PrismJS/prism/issues/2170)) [`e9dab85e`](https://github.com/PrismJS/prism/commit/e9dab85e) ## 1.19.0 (2020-01-13) ### New components - **Latte** ([#2140](https://github.com/PrismJS/prism/issues/2140)) [`694a81b8`](https://github.com/PrismJS/prism/commit/694a81b8) - **Neon** ([#2140](https://github.com/PrismJS/prism/issues/2140)) [`694a81b8`](https://github.com/PrismJS/prism/commit/694a81b8) - **QML** ([#2139](https://github.com/PrismJS/prism/issues/2139)) [`c40d96c6`](https://github.com/PrismJS/prism/commit/c40d96c6) ### Updated components - **Handlebars** - Added support for `:` and improved the `variable` pattern ([#2172](https://github.com/PrismJS/prism/issues/2172)) [`ef4d29d9`](https://github.com/PrismJS/prism/commit/ef4d29d9) - **JavaScript** - Added support for keywords after a spread operator ([#2148](https://github.com/PrismJS/prism/issues/2148)) [`1f3f8929`](https://github.com/PrismJS/prism/commit/1f3f8929) - Better regex detection ([#2158](https://github.com/PrismJS/prism/issues/2158)) [`a23d8f84`](https://github.com/PrismJS/prism/commit/a23d8f84) - **Markdown** - Better language detection for code blocks ([#2114](https://github.com/PrismJS/prism/issues/2114)) [`d7ad48f9`](https://github.com/PrismJS/prism/commit/d7ad48f9) - **OCaml** - Improvements ([#2179](https://github.com/PrismJS/prism/issues/2179)) [`2a570fd4`](https://github.com/PrismJS/prism/commit/2a570fd4) - **PHP** - Fixed exponential runtime of a pattern ([#2157](https://github.com/PrismJS/prism/issues/2157)) [`24c8f833`](https://github.com/PrismJS/prism/commit/24c8f833) - **React JSX** - Improved spread operator in tag attributes ([#2159](https://github.com/PrismJS/prism/issues/2159)) [`fd857e7b`](https://github.com/PrismJS/prism/commit/fd857e7b) - Made `$` a valid character for attribute names ([#2144](https://github.com/PrismJS/prism/issues/2144)) [`f018cf04`](https://github.com/PrismJS/prism/commit/f018cf04) - **Reason** - Added support for single line comments ([#2150](https://github.com/PrismJS/prism/issues/2150)) [`7f1c55b7`](https://github.com/PrismJS/prism/commit/7f1c55b7) - **Ruby** - Override 'class-name' definition ([#2135](https://github.com/PrismJS/prism/issues/2135)) [`401d4b02`](https://github.com/PrismJS/prism/commit/401d4b02) - **SAS** - Added CASL support ([#2112](https://github.com/PrismJS/prism/issues/2112)) [`99d979a0`](https://github.com/PrismJS/prism/commit/99d979a0) ### Updated plugins - **Custom Class** - Fixed TypeError when mapper is undefined ([#2167](https://github.com/PrismJS/prism/issues/2167)) [`543f04d7`](https://github.com/PrismJS/prism/commit/543f04d7) ### Updated themes - Added missing `.token` selector ([#2161](https://github.com/PrismJS/prism/issues/2161)) [`86780457`](https://github.com/PrismJS/prism/commit/86780457) ### Other - Added a check for redundant dependency declarations ([#2142](https://github.com/PrismJS/prism/issues/2142)) [`a06aca06`](https://github.com/PrismJS/prism/commit/a06aca06) - Added a check for examples ([#2128](https://github.com/PrismJS/prism/issues/2128)) [`0b539136`](https://github.com/PrismJS/prism/commit/0b539136) - Added silent option to `loadLanguages` ([#2147](https://github.com/PrismJS/prism/issues/2147)) [`191b4116`](https://github.com/PrismJS/prism/commit/191b4116) - **Infrastructure** - Dependencies: Improved `getLoader` ([#2151](https://github.com/PrismJS/prism/issues/2151)) [`199bdcae`](https://github.com/PrismJS/prism/commit/199bdcae) - Updated gulp to v4.0.2 ([#2178](https://github.com/PrismJS/prism/issues/2178)) [`e5678a00`](https://github.com/PrismJS/prism/commit/e5678a00) - **Website** - Custom Class: Fixed examples ([#2160](https://github.com/PrismJS/prism/issues/2160)) [`0c2fe405`](https://github.com/PrismJS/prism/commit/0c2fe405) - Added documentation for new dependency API ([#2141](https://github.com/PrismJS/prism/issues/2141)) [`59068d67`](https://github.com/PrismJS/prism/commit/59068d67) ## 1.18.0 (2020-01-04) ### New components - **ANTLR4** ([#2063](https://github.com/PrismJS/prism/issues/2063)) [`aaaa29a8`](https://github.com/PrismJS/prism/commit/aaaa29a8) - **AQL** ([#2025](https://github.com/PrismJS/prism/issues/2025)) [`3fdb7d55`](https://github.com/PrismJS/prism/commit/3fdb7d55) - **BBcode** ([#2095](https://github.com/PrismJS/prism/issues/2095)) [`aaf13aa6`](https://github.com/PrismJS/prism/commit/aaf13aa6) - **BrightScript** ([#2096](https://github.com/PrismJS/prism/issues/2096)) [`631f1e34`](https://github.com/PrismJS/prism/commit/631f1e34) - **Embedded Lua templating** ([#2050](https://github.com/PrismJS/prism/issues/2050)) [`0b771c90`](https://github.com/PrismJS/prism/commit/0b771c90) - **Firestore security rules** ([#2010](https://github.com/PrismJS/prism/issues/2010)) [`9f722586`](https://github.com/PrismJS/prism/commit/9f722586) - **FreeMarker Template Language** ([#2080](https://github.com/PrismJS/prism/issues/2080)) [`2f3da7e8`](https://github.com/PrismJS/prism/commit/2f3da7e8) - **GDScript** ([#2006](https://github.com/PrismJS/prism/issues/2006)) [`e2b99f40`](https://github.com/PrismJS/prism/commit/e2b99f40) - **MoonScript** ([#2100](https://github.com/PrismJS/prism/issues/2100)) [`f31946b3`](https://github.com/PrismJS/prism/commit/f31946b3) - **Robot Framework** (only the plain text format) ([#2034](https://github.com/PrismJS/prism/issues/2034)) [`f7eaa618`](https://github.com/PrismJS/prism/commit/f7eaa618) - **Solidity (Ethereum)** ([#2031](https://github.com/PrismJS/prism/issues/2031)) [`cc2cf3f7`](https://github.com/PrismJS/prism/commit/cc2cf3f7) - **SPARQL** ([#2033](https://github.com/PrismJS/prism/issues/2033)) [`c42f877d`](https://github.com/PrismJS/prism/commit/c42f877d) - **SQF: Status Quo Function (Arma 3)** ([#2079](https://github.com/PrismJS/prism/issues/2079)) [`cfac94ec`](https://github.com/PrismJS/prism/commit/cfac94ec) - **Turtle** & **TriG** ([#2012](https://github.com/PrismJS/prism/issues/2012)) [`508d57ac`](https://github.com/PrismJS/prism/commit/508d57ac) - **Zig** ([#2019](https://github.com/PrismJS/prism/issues/2019)) [`a7cf56b7`](https://github.com/PrismJS/prism/commit/a7cf56b7) ### Updated components - Minor improvements for C-like and Clojure ([#2064](https://github.com/PrismJS/prism/issues/2064)) [`7db0cab3`](https://github.com/PrismJS/prism/commit/7db0cab3) - Inlined some unnecessary rest properties ([#2082](https://github.com/PrismJS/prism/issues/2082)) [`ad3fa443`](https://github.com/PrismJS/prism/commit/ad3fa443) - **AQL** - Disallow unclosed multiline comments again ([#2089](https://github.com/PrismJS/prism/issues/2089)) [`717ace02`](https://github.com/PrismJS/prism/commit/717ace02) - Allow unclosed multi-line comments ([#2058](https://github.com/PrismJS/prism/issues/2058)) [`f3c6ba59`](https://github.com/PrismJS/prism/commit/f3c6ba59) - More pseudo keywords ([#2055](https://github.com/PrismJS/prism/issues/2055)) [`899574eb`](https://github.com/PrismJS/prism/commit/899574eb) - Added missing keyword + minor improvements ([#2047](https://github.com/PrismJS/prism/issues/2047)) [`32a4c422`](https://github.com/PrismJS/prism/commit/32a4c422) - **Clojure** - Added multiline strings (lisp style) ([#2061](https://github.com/PrismJS/prism/issues/2061)) [`8ea685b8`](https://github.com/PrismJS/prism/commit/8ea685b8) - **CSS Extras** - CSS Extras & PHP: Fixed too greedy number token ([#2009](https://github.com/PrismJS/prism/issues/2009)) [`ebe363f4`](https://github.com/PrismJS/prism/commit/ebe363f4) - **D** - Fixed strings ([#2029](https://github.com/PrismJS/prism/issues/2029)) [`010a0157`](https://github.com/PrismJS/prism/commit/010a0157) - **Groovy** - Minor improvements ([#2036](https://github.com/PrismJS/prism/issues/2036)) [`fb618331`](https://github.com/PrismJS/prism/commit/fb618331) - **Java** - Added missing `::` operator ([#2101](https://github.com/PrismJS/prism/issues/2101)) [`ee7fdbee`](https://github.com/PrismJS/prism/commit/ee7fdbee) - Added support for new Java 13 syntax ([#2060](https://github.com/PrismJS/prism/issues/2060)) [`a7b95dd3`](https://github.com/PrismJS/prism/commit/a7b95dd3) - **JavaScript** - Added Optional Chaining and Nullish Coalescing ([#2084](https://github.com/PrismJS/prism/issues/2084)) [`fdb7de0d`](https://github.com/PrismJS/prism/commit/fdb7de0d) - Tokenize `:` as an operator ([#2073](https://github.com/PrismJS/prism/issues/2073)) [`0e5c48d1`](https://github.com/PrismJS/prism/commit/0e5c48d1) - **Less** - Fixed exponential backtracking ([#2016](https://github.com/PrismJS/prism/issues/2016)) [`d03d19b4`](https://github.com/PrismJS/prism/commit/d03d19b4) - **Markup** - Improved doctype pattern ([#2094](https://github.com/PrismJS/prism/issues/2094)) [`99994c58`](https://github.com/PrismJS/prism/commit/99994c58) - **Python** - Fixed decorators ([#2018](https://github.com/PrismJS/prism/issues/2018)) [`5b8a16d9`](https://github.com/PrismJS/prism/commit/5b8a16d9) - **Robot Framework** - Rename "robot-framework" to "robotframework" ([#2113](https://github.com/PrismJS/prism/issues/2113)) [`baa78774`](https://github.com/PrismJS/prism/commit/baa78774) - **Ruby** - Made `true` and `false` booleans ([#2098](https://github.com/PrismJS/prism/issues/2098)) [`68d1c472`](https://github.com/PrismJS/prism/commit/68d1c472) - Added missing keywords ([#2097](https://github.com/PrismJS/prism/issues/2097)) [`f460eafc`](https://github.com/PrismJS/prism/commit/f460eafc) - **SAS** - Added support for embedded Groovy and Lua code ([#2091](https://github.com/PrismJS/prism/issues/2091)) [`3640b3f2`](https://github.com/PrismJS/prism/commit/3640b3f2) - Minor improvements ([#2085](https://github.com/PrismJS/prism/issues/2085)) [`07020c7a`](https://github.com/PrismJS/prism/commit/07020c7a) - Fixed `proc-args` token by removing backreferences from string pattern ([#2013](https://github.com/PrismJS/prism/issues/2013)) [`af5a36ae`](https://github.com/PrismJS/prism/commit/af5a36ae) - Major improvements ([#1981](https://github.com/PrismJS/prism/issues/1981)) [`076f6155`](https://github.com/PrismJS/prism/commit/076f6155) - **Smalltalk** - Fixed single quote character literal ([#2041](https://github.com/PrismJS/prism/issues/2041)) [`1aabcd17`](https://github.com/PrismJS/prism/commit/1aabcd17) - **Turtle** - Minor improvements ([#2038](https://github.com/PrismJS/prism/issues/2038)) [`8ccd258b`](https://github.com/PrismJS/prism/commit/8ccd258b) - **TypeScript** - Added missing keyword `undefined` ([#2088](https://github.com/PrismJS/prism/issues/2088)) [`c8b48b9f`](https://github.com/PrismJS/prism/commit/c8b48b9f) ### Updated plugins - New Match Braces plugin ([#1944](https://github.com/PrismJS/prism/issues/1944)) [`365faade`](https://github.com/PrismJS/prism/commit/365faade) - New Inline color plugin ([#2007](https://github.com/PrismJS/prism/issues/2007)) [`8403e453`](https://github.com/PrismJS/prism/commit/8403e453) - New Filter highlightAll plugin ([#2074](https://github.com/PrismJS/prism/issues/2074)) [`a7f70090`](https://github.com/PrismJS/prism/commit/a7f70090) - **Custom Class** - New class adder feature ([#2075](https://github.com/PrismJS/prism/issues/2075)) [`dab7998e`](https://github.com/PrismJS/prism/commit/dab7998e) - **File Highlight** - Made the download button its own plugin ([#1840](https://github.com/PrismJS/prism/issues/1840)) [`c6c62a69`](https://github.com/PrismJS/prism/commit/c6c62a69) ### Other - Issue template improvements ([#2069](https://github.com/PrismJS/prism/issues/2069)) [`53f07b1b`](https://github.com/PrismJS/prism/commit/53f07b1b) - Readme: Links now use HTTPS if available ([#2045](https://github.com/PrismJS/prism/issues/2045)) [`6cd0738a`](https://github.com/PrismJS/prism/commit/6cd0738a) - **Core** - Fixed null reference ([#2106](https://github.com/PrismJS/prism/issues/2106)) [`0fd062d5`](https://github.com/PrismJS/prism/commit/0fd062d5) - Fixed race condition caused by deferring the script ([#2103](https://github.com/PrismJS/prism/issues/2103)) [`a3785ec9`](https://github.com/PrismJS/prism/commit/a3785ec9) - Minor improvements ([#1973](https://github.com/PrismJS/prism/issues/1973)) [`2d858e0a`](https://github.com/PrismJS/prism/commit/2d858e0a) - Fixed greedy partial lookbehinds not working ([#2030](https://github.com/PrismJS/prism/issues/2030)) [`174ed103`](https://github.com/PrismJS/prism/commit/174ed103) - Fixed greedy targeting bug ([#1932](https://github.com/PrismJS/prism/issues/1932)) [`e864d518`](https://github.com/PrismJS/prism/commit/e864d518) - Doubly check the `manual` flag ([#1957](https://github.com/PrismJS/prism/issues/1957)) [`d49f0f26`](https://github.com/PrismJS/prism/commit/d49f0f26) - IE11 workaround for `currentScript` ([#2104](https://github.com/PrismJS/prism/issues/2104)) [`2108c60f`](https://github.com/PrismJS/prism/commit/2108c60f) - **Infrastructure** - gulp: Fixed changes task [`2f495905`](https://github.com/PrismJS/prism/commit/2f495905) - npm: Added `.github` folder to npm ignore ([#2052](https://github.com/PrismJS/prism/issues/2052)) [`1af89e06`](https://github.com/PrismJS/prism/commit/1af89e06) - npm: Updated dependencies to fix 122 vulnerabilities ([#1997](https://github.com/PrismJS/prism/issues/1997)) [`3af5d744`](https://github.com/PrismJS/prism/commit/3af5d744) - Tests: New test for unused capturing groups ([#1996](https://github.com/PrismJS/prism/issues/1996)) [`c187e229`](https://github.com/PrismJS/prism/commit/c187e229) - Tests: Simplified error message format ([#2056](https://github.com/PrismJS/prism/issues/2056)) [`007c9af4`](https://github.com/PrismJS/prism/commit/007c9af4) - Tests: New test for nice names ([#1911](https://github.com/PrismJS/prism/issues/1911)) [`3fda5c95`](https://github.com/PrismJS/prism/commit/3fda5c95) - Standardized dependency logic implementation ([#1998](https://github.com/PrismJS/prism/issues/1998)) [`7a4a0c7c`](https://github.com/PrismJS/prism/commit/7a4a0c7c) - **Website** - Added @mAAdhaTTah and @RunDevelopment to credits and footer [`5d07aa7c`](https://github.com/PrismJS/prism/commit/5d07aa7c) - Added plugin descriptions to plugin list ([#2076](https://github.com/PrismJS/prism/issues/2076)) [`cdfa60ac`](https://github.com/PrismJS/prism/commit/cdfa60ac) - Use HTTPS link to alistapart.com ([#2044](https://github.com/PrismJS/prism/issues/2044)) [`8bcc1b85`](https://github.com/PrismJS/prism/commit/8bcc1b85) - Fixed the Toolbar plugin's overflow issue ([#1966](https://github.com/PrismJS/prism/issues/1966)) [`56a8711c`](https://github.com/PrismJS/prism/commit/56a8711c) - FAQ update ([#1977](https://github.com/PrismJS/prism/issues/1977)) [`8a572af5`](https://github.com/PrismJS/prism/commit/8a572af5) - Use modern JavaScript in the NodeJS usage section ([#1942](https://github.com/PrismJS/prism/issues/1942)) [`5c68a556`](https://github.com/PrismJS/prism/commit/5c68a556) - Improved test page performance for Chromium ([#2020](https://github.com/PrismJS/prism/issues/2020)) [`3509f3e5`](https://github.com/PrismJS/prism/commit/3509f3e5) - Fixed alias example in extending page ([#2011](https://github.com/PrismJS/prism/issues/2011)) [`7cb65eec`](https://github.com/PrismJS/prism/commit/7cb65eec) - Robot Framework: Renamed example file ([#2126](https://github.com/PrismJS/prism/issues/2126)) [`9908ca69`](https://github.com/PrismJS/prism/commit/9908ca69) ## 1.17.1 (2019-07-21) ### Other - **Infrastructure** - Add .DS_Store to npmignore [`c2229ec2`](https://github.com/PrismJS/prism/commit/c2229ec2) ## 1.17.0 (2019-07-21) ### New components - **DNS zone file** ([#1961](https://github.com/PrismJS/prism/issues/1961)) [`bb84f98c`](https://github.com/PrismJS/prism/commit/bb84f98c) - **JQ** ([#1896](https://github.com/PrismJS/prism/issues/1896)) [`73d964be`](https://github.com/PrismJS/prism/commit/73d964be) - **JS Templates**: Syntax highlighting inside tagged template literals ([#1931](https://github.com/PrismJS/prism/issues/1931)) [`c8844286`](https://github.com/PrismJS/prism/commit/c8844286) - **LilyPond** ([#1967](https://github.com/PrismJS/prism/issues/1967)) [`5d992fc5`](https://github.com/PrismJS/prism/commit/5d992fc5) - **PascaLIGO** ([#1947](https://github.com/PrismJS/prism/issues/1947)) [`858201c7`](https://github.com/PrismJS/prism/commit/858201c7) - **PC-Axis** ([#1940](https://github.com/PrismJS/prism/issues/1940)) [`473f7fbd`](https://github.com/PrismJS/prism/commit/473f7fbd) - **Shell session** ([#1892](https://github.com/PrismJS/prism/issues/1892)) [`96044979`](https://github.com/PrismJS/prism/commit/96044979) - **Splunk SPL** ([#1962](https://github.com/PrismJS/prism/issues/1962)) [`c93c066b`](https://github.com/PrismJS/prism/commit/c93c066b) ### New plugins - **Diff Highlight**: Syntax highlighting inside diff blocks ([#1889](https://github.com/PrismJS/prism/issues/1889)) [`e7702ae1`](https://github.com/PrismJS/prism/commit/e7702ae1) ### Updated components - **Bash** - Major improvements ([#1443](https://github.com/PrismJS/prism/issues/1443)) [`363281b3`](https://github.com/PrismJS/prism/commit/363281b3) - **C#** - Added `cs` alias ([#1899](https://github.com/PrismJS/prism/issues/1899)) [`a8164559`](https://github.com/PrismJS/prism/commit/a8164559) - **C++** - Fixed number pattern ([#1887](https://github.com/PrismJS/prism/issues/1887)) [`3de29e72`](https://github.com/PrismJS/prism/commit/3de29e72) - **CSS** - Extended `url` inside ([#1874](https://github.com/PrismJS/prism/issues/1874)) [`f0a10669`](https://github.com/PrismJS/prism/commit/f0a10669) - Removed unnecessary flag and modifier ([#1875](https://github.com/PrismJS/prism/issues/1875)) [`74050c68`](https://github.com/PrismJS/prism/commit/74050c68) - **CSS Extras** - Added `even` & `odd` keywords to `n-th` pattern ([#1872](https://github.com/PrismJS/prism/issues/1872)) [`5e5a3e00`](https://github.com/PrismJS/prism/commit/5e5a3e00) - **F#** - Improved character literals ([#1956](https://github.com/PrismJS/prism/issues/1956)) [`d58d2aeb`](https://github.com/PrismJS/prism/commit/d58d2aeb) - **JavaScript** - Fixed escaped template interpolation ([#1931](https://github.com/PrismJS/prism/issues/1931)) [`c8844286`](https://github.com/PrismJS/prism/commit/c8844286) - Added support for private fields ([#1950](https://github.com/PrismJS/prism/issues/1950)) [`7bd08327`](https://github.com/PrismJS/prism/commit/7bd08327) - Added support for numeric separators ([#1895](https://github.com/PrismJS/prism/issues/1895)) [`6068bf18`](https://github.com/PrismJS/prism/commit/6068bf18) - Increased bracket count of interpolation expressions in template strings ([#1845](https://github.com/PrismJS/prism/issues/1845)) [`c13d6e7d`](https://github.com/PrismJS/prism/commit/c13d6e7d) - Added support for the `s` regex flag ([#1846](https://github.com/PrismJS/prism/issues/1846)) [`9e164935`](https://github.com/PrismJS/prism/commit/9e164935) - Formatting: Added missing semicolon ([#1856](https://github.com/PrismJS/prism/issues/1856)) [`e2683959`](https://github.com/PrismJS/prism/commit/e2683959) - **JSON** - Kinda fixed comment issue ([#1853](https://github.com/PrismJS/prism/issues/1853)) [`cbe05ec3`](https://github.com/PrismJS/prism/commit/cbe05ec3) - **Julia** - Added `struct` keyword ([#1941](https://github.com/PrismJS/prism/issues/1941)) [`feb1b6f5`](https://github.com/PrismJS/prism/commit/feb1b6f5) - Highlight `Inf` and `NaN` as constants ([#1921](https://github.com/PrismJS/prism/issues/1921)) [`2141129f`](https://github.com/PrismJS/prism/commit/2141129f) - Added `in` keyword ([#1918](https://github.com/PrismJS/prism/issues/1918)) [`feb3187f`](https://github.com/PrismJS/prism/commit/feb3187f) - **LaTeX** - Added TeX and ConTeXt alias ([#1915](https://github.com/PrismJS/prism/issues/1915)) [`5ad58a75`](https://github.com/PrismJS/prism/commit/5ad58a75) - Added support for $$ equations [`6f53f749`](https://github.com/PrismJS/prism/commit/6f53f749) - **Markdown** - Markdown: Added support for auto-loading code block languages ([#1898](https://github.com/PrismJS/prism/issues/1898)) [`05823e88`](https://github.com/PrismJS/prism/commit/05823e88) - Improved URLs ([#1955](https://github.com/PrismJS/prism/issues/1955)) [`b9ec6fd8`](https://github.com/PrismJS/prism/commit/b9ec6fd8) - Added support for nested bold and italic expressions ([#1897](https://github.com/PrismJS/prism/issues/1897)) [`11903721`](https://github.com/PrismJS/prism/commit/11903721) - Added support for tables ([#1848](https://github.com/PrismJS/prism/issues/1848)) [`cedb8e84`](https://github.com/PrismJS/prism/commit/cedb8e84) - **Perl** - Added `return` keyword ([#1943](https://github.com/PrismJS/prism/issues/1943)) [`2f39de97`](https://github.com/PrismJS/prism/commit/2f39de97) - **Protocol Buffers** - Full support for PB2 and PB3 syntax + numerous other improvements ([#1948](https://github.com/PrismJS/prism/issues/1948)) [`de10bd1d`](https://github.com/PrismJS/prism/commit/de10bd1d) - **reST (reStructuredText)** - Fixed exponentially backtracking pattern ([#1986](https://github.com/PrismJS/prism/issues/1986)) [`8b5d67a3`](https://github.com/PrismJS/prism/commit/8b5d67a3) - **Rust** - Added `async` and `await` keywords. ([#1882](https://github.com/PrismJS/prism/issues/1882)) [`4faa3314`](https://github.com/PrismJS/prism/commit/4faa3314) - Improved punctuation and operators ([#1839](https://github.com/PrismJS/prism/issues/1839)) [`a42b1557`](https://github.com/PrismJS/prism/commit/a42b1557) - **Sass (Scss)** - Fixed exponential url pattern ([#1938](https://github.com/PrismJS/prism/issues/1938)) [`4b6b6e8b`](https://github.com/PrismJS/prism/commit/4b6b6e8b) - **Scheme** - Added support for rational number literals ([#1964](https://github.com/PrismJS/prism/issues/1964)) [`e8811d22`](https://github.com/PrismJS/prism/commit/e8811d22) - **TOML** - Minor improvements ([#1917](https://github.com/PrismJS/prism/issues/1917)) [`3e181241`](https://github.com/PrismJS/prism/commit/3e181241) - **Visual Basic** - Added support for interpolation strings ([#1971](https://github.com/PrismJS/prism/issues/1971)) [`4a2c90c1`](https://github.com/PrismJS/prism/commit/4a2c90c1) ### Updated plugins - **Autolinker** - Improved component path guessing ([#1928](https://github.com/PrismJS/prism/issues/1928)) [`452d5c7d`](https://github.com/PrismJS/prism/commit/452d5c7d) - Improved URL regex ([#1842](https://github.com/PrismJS/prism/issues/1842)) [`eb28b62b`](https://github.com/PrismJS/prism/commit/eb28b62b) - **Autoloader** - Fixed and improved callbacks ([#1935](https://github.com/PrismJS/prism/issues/1935)) [`b19f512f`](https://github.com/PrismJS/prism/commit/b19f512f) - **Command Line** - Fix for uncaught errors for empty 'commandLine' object. ([#1862](https://github.com/PrismJS/prism/issues/1862)) [`c24831b5`](https://github.com/PrismJS/prism/commit/c24831b5) - **Copy to Clipboard Button** - Switch anchor to button ([#1926](https://github.com/PrismJS/prism/issues/1926)) [`79880197`](https://github.com/PrismJS/prism/commit/79880197) - **Custom Class** - Added mapper functions for language specific transformations ([#1873](https://github.com/PrismJS/prism/issues/1873)) [`acceb3b5`](https://github.com/PrismJS/prism/commit/acceb3b5) - **Line Highlight** - Batching DOM read/writes to avoid reflows ([#1865](https://github.com/PrismJS/prism/issues/1865)) [`632ce00c`](https://github.com/PrismJS/prism/commit/632ce00c) - **Toolbar** - Added `className` option for toolbar items ([#1951](https://github.com/PrismJS/prism/issues/1951)) [`5ab28bbe`](https://github.com/PrismJS/prism/commit/5ab28bbe) - Set opacity to 1 when focus is within ([#1927](https://github.com/PrismJS/prism/issues/1927)) [`0b1662dd`](https://github.com/PrismJS/prism/commit/0b1662dd) ### Updated themes - **Funky** - Fixed typo ([#1960](https://github.com/PrismJS/prism/issues/1960)) [`7d056591`](https://github.com/PrismJS/prism/commit/7d056591) ### Other - README: Added npm downloads badge ([#1934](https://github.com/PrismJS/prism/issues/1934)) [`d673d701`](https://github.com/PrismJS/prism/commit/d673d701) - README: Minor changes ([#1857](https://github.com/PrismJS/prism/issues/1857)) [`77e403cb`](https://github.com/PrismJS/prism/commit/77e403cb) - Clearer description for the highlighting bug report template ([#1850](https://github.com/PrismJS/prism/issues/1850)) [`2f9c9261`](https://github.com/PrismJS/prism/commit/2f9c9261) - More language examples ([#1917](https://github.com/PrismJS/prism/issues/1917)) [`3e181241`](https://github.com/PrismJS/prism/commit/3e181241) - **Core** - Removed `env.elements` from `before-highlightall` hook ([#1968](https://github.com/PrismJS/prism/issues/1968)) [`9d9e2ca4`](https://github.com/PrismJS/prism/commit/9d9e2ca4) - Made `language-none` the default language ([#1858](https://github.com/PrismJS/prism/issues/1858)) [`fd691c52`](https://github.com/PrismJS/prism/commit/fd691c52) - Removed `parent` from the `wrap` hook's environment ([#1837](https://github.com/PrismJS/prism/issues/1837)) [`65a4e894`](https://github.com/PrismJS/prism/commit/65a4e894) - **Infrastructure** - gulp: Split `gulpfile.js` and expanded `changes` task ([#1835](https://github.com/PrismJS/prism/issues/1835)) [`033c5ad8`](https://github.com/PrismJS/prism/commit/033c5ad8) - gulp: JSON formatting for partly generated files ([#1933](https://github.com/PrismJS/prism/issues/1933)) [`d4373f3a`](https://github.com/PrismJS/prism/commit/d4373f3a) - gulp: Use `async` functions & drop testing on Node v6 ([#1783](https://github.com/PrismJS/prism/issues/1783)) [`0dd44d53`](https://github.com/PrismJS/prism/commit/0dd44d53) - Tests: `lookbehind` test for patterns ([#1890](https://github.com/PrismJS/prism/issues/1890)) [`3ba786cd`](https://github.com/PrismJS/prism/commit/3ba786cd) - Tests: Added test for empty regexes ([#1847](https://github.com/PrismJS/prism/issues/1847)) [`c1e6a7fd`](https://github.com/PrismJS/prism/commit/c1e6a7fd) - **Website** - Added tutorial for using PrismJS with React ([#1979](https://github.com/PrismJS/prism/issues/1979)) [`f1e16c7b`](https://github.com/PrismJS/prism/commit/f1e16c7b) - Update footer's GitHub repository URL and capitalisation of "GitHub" ([#1983](https://github.com/PrismJS/prism/issues/1983)) [`bab744a6`](https://github.com/PrismJS/prism/commit/bab744a6) - Added known failures page ([#1876](https://github.com/PrismJS/prism/issues/1876)) [`36a5fa0e`](https://github.com/PrismJS/prism/commit/36a5fa0e) - Added basic usage for CDNs ([#1924](https://github.com/PrismJS/prism/issues/1924)) [`922ec555`](https://github.com/PrismJS/prism/commit/922ec555) - New tutorial for Drupal ([#1859](https://github.com/PrismJS/prism/issues/1859)) [`d2089d83`](https://github.com/PrismJS/prism/commit/d2089d83) - Updated website page styles to not interfere with themes ([#1952](https://github.com/PrismJS/prism/issues/1952)) [`b6543853`](https://github.com/PrismJS/prism/commit/b6543853) - Download page: Improved performance for Chromium-based browsers ([#1907](https://github.com/PrismJS/prism/issues/1907)) [`11f18e36`](https://github.com/PrismJS/prism/commit/11f18e36) - Download page: Fixed Edge's word wrap ([#1920](https://github.com/PrismJS/prism/issues/1920)) [`5d191b92`](https://github.com/PrismJS/prism/commit/5d191b92) - Examples page: Minor improvements ([#1919](https://github.com/PrismJS/prism/issues/1919)) [`a16d4a25`](https://github.com/PrismJS/prism/commit/a16d4a25) - Extending page: Fixed typo + new alias section ([#1949](https://github.com/PrismJS/prism/issues/1949)) [`24c8e717`](https://github.com/PrismJS/prism/commit/24c8e717) - Extending page: Added "Creating a new language definition" section ([#1925](https://github.com/PrismJS/prism/issues/1925)) [`ddf81233`](https://github.com/PrismJS/prism/commit/ddf81233) - Test page: Use `prism-core.js` instead of `prism.js` ([#1908](https://github.com/PrismJS/prism/issues/1908)) [`0853e694`](https://github.com/PrismJS/prism/commit/0853e694) - Copy to clipboard: Fixed typo ([#1869](https://github.com/PrismJS/prism/issues/1869)) [`59d4323f`](https://github.com/PrismJS/prism/commit/59d4323f) - JSONP Highlight: Fixed examples ([#1877](https://github.com/PrismJS/prism/issues/1877)) [`f8ae465d`](https://github.com/PrismJS/prism/commit/f8ae465d) - Line numbers: Fixed typo on webpage ([#1838](https://github.com/PrismJS/prism/issues/1838)) [`0f16eb87`](https://github.com/PrismJS/prism/commit/0f16eb87) ## 1.16.0 (2019-03-24) ### New components - **ANBF** ([#1753](https://github.com/PrismJS/prism/issues/1753)) [`6d98f0e7`](https://github.com/PrismJS/prism/commit/6d98f0e7) - **BNF** & **RBNF** ([#1754](https://github.com/PrismJS/prism/issues/1754)) [`1df96c55`](https://github.com/PrismJS/prism/commit/1df96c55) - **CIL** ([#1593](https://github.com/PrismJS/prism/issues/1593)) [`38def334`](https://github.com/PrismJS/prism/commit/38def334) - **CMake** ([#1820](https://github.com/PrismJS/prism/issues/1820)) [`30779976`](https://github.com/PrismJS/prism/commit/30779976) - **Doc comment** ([#1541](https://github.com/PrismJS/prism/issues/1541)) [`493d19ef`](https://github.com/PrismJS/prism/commit/493d19ef) - **EBNF** ([#1756](https://github.com/PrismJS/prism/issues/1756)) [`13e1c97d`](https://github.com/PrismJS/prism/commit/13e1c97d) - **EJS** ([#1769](https://github.com/PrismJS/prism/issues/1769)) [`c37c90df`](https://github.com/PrismJS/prism/commit/c37c90df) - **G-code** ([#1572](https://github.com/PrismJS/prism/issues/1572)) [`2288c25e`](https://github.com/PrismJS/prism/commit/2288c25e) - **GameMaker Language** ([#1551](https://github.com/PrismJS/prism/issues/1551)) [`e529edd8`](https://github.com/PrismJS/prism/commit/e529edd8) - **HCL** ([#1594](https://github.com/PrismJS/prism/issues/1594)) [`c939df8e`](https://github.com/PrismJS/prism/commit/c939df8e) - **Java stack trace** ([#1520](https://github.com/PrismJS/prism/issues/1520)) [`4a8219a4`](https://github.com/PrismJS/prism/commit/4a8219a4) - **JavaScript Extras** ([#1743](https://github.com/PrismJS/prism/issues/1743)) [`bb628606`](https://github.com/PrismJS/prism/commit/bb628606) - **JSON5** ([#1744](https://github.com/PrismJS/prism/issues/1744)) [`64dc049d`](https://github.com/PrismJS/prism/commit/64dc049d) - **N1QL** ([#1620](https://github.com/PrismJS/prism/issues/1620)) [`7def8f5c`](https://github.com/PrismJS/prism/commit/7def8f5c) - **Nand To Tetris HDL** ([#1710](https://github.com/PrismJS/prism/issues/1710)) [`b94b56c1`](https://github.com/PrismJS/prism/commit/b94b56c1) - **Regex** ([#1682](https://github.com/PrismJS/prism/issues/1682)) [`571704cb`](https://github.com/PrismJS/prism/commit/571704cb) - **T4** ([#1699](https://github.com/PrismJS/prism/issues/1699)) [`16f2ad06`](https://github.com/PrismJS/prism/commit/16f2ad06) - **TOML** ([#1488](https://github.com/PrismJS/prism/issues/1488)) [`5b6ad70d`](https://github.com/PrismJS/prism/commit/5b6ad70d) - **Vala** ([#1658](https://github.com/PrismJS/prism/issues/1658)) [`b48c012c`](https://github.com/PrismJS/prism/commit/b48c012c) ### Updated components - Fixed dependencies of Pug and Pure ([#1759](https://github.com/PrismJS/prism/issues/1759)) [`c9a32674`](https://github.com/PrismJS/prism/commit/c9a32674) - Add file extensions support for major languages ([#1478](https://github.com/PrismJS/prism/issues/1478)) [`0c8f6504`](https://github.com/PrismJS/prism/commit/0c8f6504) - Fixed patterns which can match the empty string ([#1775](https://github.com/PrismJS/prism/issues/1775)) [`86dd3e42`](https://github.com/PrismJS/prism/commit/86dd3e42) - More variables for better code compression ([#1489](https://github.com/PrismJS/prism/issues/1489)) [`bc53e093`](https://github.com/PrismJS/prism/commit/bc53e093) - Added missing aliases ([#1830](https://github.com/PrismJS/prism/issues/1830)) [`8d28c74c`](https://github.com/PrismJS/prism/commit/8d28c74c) - Replaced all occurrences of `new RegExp` with `RegExp` ([#1493](https://github.com/PrismJS/prism/issues/1493)) [`44fed4d3`](https://github.com/PrismJS/prism/commit/44fed4d3) - Added missing aliases to components.json ([#1503](https://github.com/PrismJS/prism/issues/1503)) [`2fb66e04`](https://github.com/PrismJS/prism/commit/2fb66e04) - **Apacheconf** - Apache config: Minor improvements + new keyword ([#1823](https://github.com/PrismJS/prism/issues/1823)) [`a91be7b2`](https://github.com/PrismJS/prism/commit/a91be7b2) - **AsciiDoc** - Added `adoc` alias for AsciiDoc ([#1685](https://github.com/PrismJS/prism/issues/1685)) [`88434f7a`](https://github.com/PrismJS/prism/commit/88434f7a) - **Bash** - Add additional commands to bash ([#1577](https://github.com/PrismJS/prism/issues/1577)) [`a2230c38`](https://github.com/PrismJS/prism/commit/a2230c38) - Added `yarn add` to bash functions ([#1731](https://github.com/PrismJS/prism/issues/1731)) [`3a32cb75`](https://github.com/PrismJS/prism/commit/3a32cb75) - Added `pnpm` function to Bash ([#1734](https://github.com/PrismJS/prism/issues/1734)) [`fccfb98d`](https://github.com/PrismJS/prism/commit/fccfb98d) - **Batch** - Remove batch's shell alias ([#1543](https://github.com/PrismJS/prism/issues/1543)) [`7155e60f`](https://github.com/PrismJS/prism/commit/7155e60f) - **C** - Improve C language ([#1697](https://github.com/PrismJS/prism/issues/1697)) [`7eccea5c`](https://github.com/PrismJS/prism/commit/7eccea5c) - **C-like** - Simplify function pattern of C-like language ([#1552](https://github.com/PrismJS/prism/issues/1552)) [`b520e1b6`](https://github.com/PrismJS/prism/commit/b520e1b6) - **C/C++/Java** - Operator fixes ([#1528](https://github.com/PrismJS/prism/issues/1528)) [`7af8f8be`](https://github.com/PrismJS/prism/commit/7af8f8be) - **C#** - Improvements to C# operator and punctuation ([#1532](https://github.com/PrismJS/prism/issues/1532)) [`3b1e0916`](https://github.com/PrismJS/prism/commit/3b1e0916) - **CSS** - Fix tokenizing !important ([#1585](https://github.com/PrismJS/prism/issues/1585)) [`c1d6cb85`](https://github.com/PrismJS/prism/commit/c1d6cb85) - Added the comma to the list of CSS punctuation [`7ea2ff28`](https://github.com/PrismJS/prism/commit/7ea2ff28) - CSS: Comma punctuation ([#1632](https://github.com/PrismJS/prism/issues/1632)) [`1b812386`](https://github.com/PrismJS/prism/commit/1b812386) - Reuse CSS selector pattern in CSS Extras ([#1637](https://github.com/PrismJS/prism/issues/1637)) [`e2f2fd19`](https://github.com/PrismJS/prism/commit/e2f2fd19) - Fixed CSS extra variable ([#1649](https://github.com/PrismJS/prism/issues/1649)) [`9de47d3a`](https://github.com/PrismJS/prism/commit/9de47d3a) - Identify CSS units and variables ([#1450](https://github.com/PrismJS/prism/issues/1450)) [`5fcee966`](https://github.com/PrismJS/prism/commit/5fcee966) - Allow multiline CSS at-rules ([#1676](https://github.com/PrismJS/prism/issues/1676)) [`4f6f3c7d`](https://github.com/PrismJS/prism/commit/4f6f3c7d) - CSS: Highlight attribute selector ([#1671](https://github.com/PrismJS/prism/issues/1671)) [`245b59d4`](https://github.com/PrismJS/prism/commit/245b59d4) - CSS: Selectors can contain any string ([#1638](https://github.com/PrismJS/prism/issues/1638)) [`a2d445d0`](https://github.com/PrismJS/prism/commit/a2d445d0) - CSS extras: Highlighting for pseudo class arguments ([#1650](https://github.com/PrismJS/prism/issues/1650)) [`70a40414`](https://github.com/PrismJS/prism/commit/70a40414) - **Django** - Django/Jinja2 improvements ([#1800](https://github.com/PrismJS/prism/issues/1800)) [`f2467488`](https://github.com/PrismJS/prism/commit/f2467488) - **F#** - Chars can only contain one character ([#1570](https://github.com/PrismJS/prism/issues/1570)) [`f96b083a`](https://github.com/PrismJS/prism/commit/f96b083a) - Improve F# ([#1573](https://github.com/PrismJS/prism/issues/1573)) [`00bfc969`](https://github.com/PrismJS/prism/commit/00bfc969) - **GraphQL** - Improved field highlighting for GraphQL ([#1711](https://github.com/PrismJS/prism/issues/1711)) [`44aeffb9`](https://github.com/PrismJS/prism/commit/44aeffb9) - Added GraphQL improvements and tests ([#1788](https://github.com/PrismJS/prism/issues/1788)) [`b2298b12`](https://github.com/PrismJS/prism/commit/b2298b12) - **Haskell** - Added `hs` alias for Haskell ([#1831](https://github.com/PrismJS/prism/issues/1831)) [`64baec3c`](https://github.com/PrismJS/prism/commit/64baec3c) - **HTTP** - Improved HTTP content highlighting ([#1598](https://github.com/PrismJS/prism/issues/1598)) [`1b75da90`](https://github.com/PrismJS/prism/commit/1b75da90) - **Ini** - Add support for # comments to INI language ([#1730](https://github.com/PrismJS/prism/issues/1730)) [`baf6bb0c`](https://github.com/PrismJS/prism/commit/baf6bb0c) - **Java** - Add Java 10 support ([#1549](https://github.com/PrismJS/prism/issues/1549)) [`8c981a22`](https://github.com/PrismJS/prism/commit/8c981a22) - Added module keywords to Java. ([#1655](https://github.com/PrismJS/prism/issues/1655)) [`6e250a5f`](https://github.com/PrismJS/prism/commit/6e250a5f) - Improve Java ([#1474](https://github.com/PrismJS/prism/issues/1474)) [`81bd8f0b`](https://github.com/PrismJS/prism/commit/81bd8f0b) - **JavaScript** - Fix regex for `catch` and `finally` ([#1527](https://github.com/PrismJS/prism/issues/1527)) [`ebd1b9a6`](https://github.com/PrismJS/prism/commit/ebd1b9a6) - Highlighting of supposed classes and functions ([#1482](https://github.com/PrismJS/prism/issues/1482)) [`c40f6047`](https://github.com/PrismJS/prism/commit/c40f6047) - Added support for JS BigInt literals ([#1542](https://github.com/PrismJS/prism/issues/1542)) [`2b62e57b`](https://github.com/PrismJS/prism/commit/2b62e57b) - Fixed lowercase supposed class names ([#1544](https://github.com/PrismJS/prism/issues/1544)) [`a47c05ad`](https://github.com/PrismJS/prism/commit/a47c05ad) - Fixes regex for JS examples ([#1591](https://github.com/PrismJS/prism/issues/1591)) [`b41fb8f1`](https://github.com/PrismJS/prism/commit/b41fb8f1) - Improve regex detection in JS ([#1473](https://github.com/PrismJS/prism/issues/1473)) [`2a4758ab`](https://github.com/PrismJS/prism/commit/2a4758ab) - Identify JavaScript function parameters ([#1446](https://github.com/PrismJS/prism/issues/1446)) [`0cc8c56a`](https://github.com/PrismJS/prism/commit/0cc8c56a) - Improved JavaScript parameter recognization ([#1722](https://github.com/PrismJS/prism/issues/1722)) [`57a92035`](https://github.com/PrismJS/prism/commit/57a92035) - Make `undefined` a keyword in JS ([#1740](https://github.com/PrismJS/prism/issues/1740)) [`d9fa29a8`](https://github.com/PrismJS/prism/commit/d9fa29a8) - Fix `function-variable` in JS ([#1739](https://github.com/PrismJS/prism/issues/1739)) [`bfbea4d6`](https://github.com/PrismJS/prism/commit/bfbea4d6) - Improved JS constant pattern ([#1737](https://github.com/PrismJS/prism/issues/1737)) [`7bcec584`](https://github.com/PrismJS/prism/commit/7bcec584) - Improved JS function pattern ([#1736](https://github.com/PrismJS/prism/issues/1736)) [`8378ac83`](https://github.com/PrismJS/prism/commit/8378ac83) - JS: Fixed variables named "async" ([#1738](https://github.com/PrismJS/prism/issues/1738)) [`3560c643`](https://github.com/PrismJS/prism/commit/3560c643) - JS: Keyword fix ([#1808](https://github.com/PrismJS/prism/issues/1808)) [`f2d8e1c7`](https://github.com/PrismJS/prism/commit/f2d8e1c7) - **JSON** / **JSONP** - Fix bugs in JSON language ([#1479](https://github.com/PrismJS/prism/issues/1479)) [`74fe81c6`](https://github.com/PrismJS/prism/commit/74fe81c6) - Adds support for comments in JSON ([#1595](https://github.com/PrismJS/prism/issues/1595)) [`8720b3e6`](https://github.com/PrismJS/prism/commit/8720b3e6) - Cleaned up JSON ([#1596](https://github.com/PrismJS/prism/issues/1596)) [`da474c77`](https://github.com/PrismJS/prism/commit/da474c77) - Added `keyword` alias to JSON's `null` ([#1733](https://github.com/PrismJS/prism/issues/1733)) [`eee06649`](https://github.com/PrismJS/prism/commit/eee06649) - Fix JSONP support ([#1745](https://github.com/PrismJS/prism/issues/1745)) [`b5041cf9`](https://github.com/PrismJS/prism/commit/b5041cf9) - Fixed JSON/JSONP examples ([#1765](https://github.com/PrismJS/prism/issues/1765)) [`ae4842db`](https://github.com/PrismJS/prism/commit/ae4842db) - **JSX** - React component tags are styled as classes in JSX ([#1519](https://github.com/PrismJS/prism/issues/1519)) [`3e1a9a3d`](https://github.com/PrismJS/prism/commit/3e1a9a3d) - Support JSX/TSX class-name with dot ([#1725](https://github.com/PrismJS/prism/issues/1725)) [`4362e42c`](https://github.com/PrismJS/prism/commit/4362e42c) - **Less** - Remove useless insertBefore in LESS ([#1629](https://github.com/PrismJS/prism/issues/1629)) [`86d31793`](https://github.com/PrismJS/prism/commit/86d31793) - **Lisp** - Fix Lisp exponential string pattern ([#1763](https://github.com/PrismJS/prism/issues/1763)) [`5bd182c0`](https://github.com/PrismJS/prism/commit/5bd182c0)) - **Markdown** - Added strike support to markdown ([#1563](https://github.com/PrismJS/prism/issues/1563)) [`9d2fddc2`](https://github.com/PrismJS/prism/commit/9d2fddc2) - Fixed Markdown headers ([#1557](https://github.com/PrismJS/prism/issues/1557)) [`c6584290`](https://github.com/PrismJS/prism/commit/c6584290) - Add support for code blocks in Markdown ([#1562](https://github.com/PrismJS/prism/issues/1562)) [`b0717e70`](https://github.com/PrismJS/prism/commit/b0717e70) - Markdown: The 'md' alias is now recognized by hooks ([#1771](https://github.com/PrismJS/prism/issues/1771)) [`8ca3d65b`](https://github.com/PrismJS/prism/commit/8ca3d65b) - **Markup** - Decouple XML from Markup ([#1603](https://github.com/PrismJS/prism/issues/1603)) [`0030a4ef`](https://github.com/PrismJS/prism/commit/0030a4ef) - Fix for markup attributes ([#1752](https://github.com/PrismJS/prism/issues/1752)) [`c3862a24`](https://github.com/PrismJS/prism/commit/c3862a24) - Markup: Added support for CSS and JS inside of CDATAs ([#1660](https://github.com/PrismJS/prism/issues/1660)) [`57127701`](https://github.com/PrismJS/prism/commit/57127701) - Markup `addInline` improvements ([#1798](https://github.com/PrismJS/prism/issues/1798)) [`af67c32e`](https://github.com/PrismJS/prism/commit/af67c32e) - **Markup Templating** - Markup-templating improvements ([#1653](https://github.com/PrismJS/prism/issues/1653)) [`b62e282b`](https://github.com/PrismJS/prism/commit/b62e282b) - **nginx** - Add new keywords to nginx ([#1587](https://github.com/PrismJS/prism/issues/1587)) [`0d73f7f5`](https://github.com/PrismJS/prism/commit/0d73f7f5) - **PHP** - Update PHP keywords ([#1690](https://github.com/PrismJS/prism/issues/1690)) [`55fb0f8e`](https://github.com/PrismJS/prism/commit/55fb0f8e) - Improve recognition of constants in PHP ([#1688](https://github.com/PrismJS/prism/issues/1688)) [`f1026b4b`](https://github.com/PrismJS/prism/commit/f1026b4b) - Made false, true, and null constants in PHP ([#1694](https://github.com/PrismJS/prism/issues/1694)) [`439e3bd7`](https://github.com/PrismJS/prism/commit/439e3bd7) - PHP: Fixed closing tag issue ([#1652](https://github.com/PrismJS/prism/issues/1652)) [`289ddd9b`](https://github.com/PrismJS/prism/commit/289ddd9b) - **Python** - Operator keywords are now keywords ([#1617](https://github.com/PrismJS/prism/issues/1617)) [`1d1fb800`](https://github.com/PrismJS/prism/commit/1d1fb800) - Add decorator support to Python ([#1639](https://github.com/PrismJS/prism/issues/1639)) [`2577b6e6`](https://github.com/PrismJS/prism/commit/2577b6e6) - Improvements to Python F-strings and string prefixes ([#1642](https://github.com/PrismJS/prism/issues/1642)) [`a69c2b62`](https://github.com/PrismJS/prism/commit/a69c2b62) - **Reason** - Added additional operators to Reason ([#1648](https://github.com/PrismJS/prism/issues/1648)) [`8b1bb469`](https://github.com/PrismJS/prism/commit/8b1bb469) - **Ruby** - Consistent Ruby method highlighting ([#1523](https://github.com/PrismJS/prism/issues/1523)) [`72775919`](https://github.com/PrismJS/prism/commit/72775919) - Ruby/ERB: Fixed block comments ([#1768](https://github.com/PrismJS/prism/issues/1768)) [`c805f859`](https://github.com/PrismJS/prism/commit/c805f859) - **Rust** - Add missing keywords ([#1634](https://github.com/PrismJS/prism/issues/1634)) [`3590edde`](https://github.com/PrismJS/prism/commit/3590edde) - **SAS** - Added new SAS keywords ([#1784](https://github.com/PrismJS/prism/issues/1784)) [`3b396ef5`](https://github.com/PrismJS/prism/commit/3b396ef5) - **Scheme** - Fix function without arguments in scheme language ([#1463](https://github.com/PrismJS/prism/issues/1463)) [`12a827e7`](https://github.com/PrismJS/prism/commit/12a827e7) - Scheme improvements ([#1556](https://github.com/PrismJS/prism/issues/1556)) [`225dd3f7`](https://github.com/PrismJS/prism/commit/225dd3f7) - Fixed operator-like functions in Scheme ([#1467](https://github.com/PrismJS/prism/issues/1467)) [`f8c8add2`](https://github.com/PrismJS/prism/commit/f8c8add2) - Scheme: Minor improvements ([#1814](https://github.com/PrismJS/prism/issues/1814)) [`191830f2`](https://github.com/PrismJS/prism/commit/191830f2) - **SCSS** - Fixed that selector pattern can take exponential time ([#1499](https://github.com/PrismJS/prism/issues/1499)) [`0f75d9d4`](https://github.com/PrismJS/prism/commit/0f75d9d4) - Move SCSS `property` definition ([#1633](https://github.com/PrismJS/prism/issues/1633)) [`0536fb14`](https://github.com/PrismJS/prism/commit/0536fb14) - Add `keyword` alias for SCSS' `null` ([#1735](https://github.com/PrismJS/prism/issues/1735)) [`bd0378f0`](https://github.com/PrismJS/prism/commit/bd0378f0) - **Smalltalk** - Allowed empty strings and comments ([#1747](https://github.com/PrismJS/prism/issues/1747)) [`5fd7577a`](https://github.com/PrismJS/prism/commit/5fd7577a) - **Smarty** - Removed useless `insertBefore` call in Smarty ([#1677](https://github.com/PrismJS/prism/issues/1677)) [`bc49c361`](https://github.com/PrismJS/prism/commit/bc49c361) - **SQL** - Added support for quote escapes to SQL strings ([#1500](https://github.com/PrismJS/prism/issues/1500)) [`a59a7926`](https://github.com/PrismJS/prism/commit/a59a7926) - SQL Quoted variables are now greedy ([#1510](https://github.com/PrismJS/prism/issues/1510)) [`42d119a2`](https://github.com/PrismJS/prism/commit/42d119a2) - **TypeScript** - Enhance definitions in TypeScript component ([#1522](https://github.com/PrismJS/prism/issues/1522)) [`11695629`](https://github.com/PrismJS/prism/commit/11695629) - **YAML** - Allow YAML strings to have trailing comments ([#1602](https://github.com/PrismJS/prism/issues/1602)) [`1c5f28a9`](https://github.com/PrismJS/prism/commit/1c5f28a9) ### Updated plugins - Better class name detection for plugins ([#1772](https://github.com/PrismJS/prism/issues/1772)) [`c9762c6f`](https://github.com/PrismJS/prism/commit/c9762c6f) - **Autolinker** - Fix Autolinker url-decoding all tokens ([#1723](https://github.com/PrismJS/prism/issues/1723)) [`8cf20d49`](https://github.com/PrismJS/prism/commit/8cf20d49) - **Autoloader** - Resolved variable name clash ([#1568](https://github.com/PrismJS/prism/issues/1568)) [`bfa5a8d9`](https://github.com/PrismJS/prism/commit/bfa5a8d9) - Autoloader: Fixed the directory of scripts ([#1828](https://github.com/PrismJS/prism/issues/1828)) [`fd4c764f`](https://github.com/PrismJS/prism/commit/fd4c764f) - Autoloader: Added support for aliases ([#1829](https://github.com/PrismJS/prism/issues/1829)) [`52889b5b`](https://github.com/PrismJS/prism/commit/52889b5b) - **Command Line** - Fixed class regex for Command Line plugin ([#1566](https://github.com/PrismJS/prism/issues/1566)) [`9f6e5026`](https://github.com/PrismJS/prism/commit/9f6e5026) - **File Highlight** - Prevent double-loading & add scope to File Highlight ([#1586](https://github.com/PrismJS/prism/issues/1586)) [`10239c14`](https://github.com/PrismJS/prism/commit/10239c14) - **JSONP Highlight** - Cleanup JSONP highlight code ([#1674](https://github.com/PrismJS/prism/issues/1674)) [`28489698`](https://github.com/PrismJS/prism/commit/28489698) - Fix typos & other issues in JSONP docs ([#1672](https://github.com/PrismJS/prism/issues/1672)) [`cd058a91`](https://github.com/PrismJS/prism/commit/cd058a91) - JSONP highlight: Fixed minified adapter names ([#1793](https://github.com/PrismJS/prism/issues/1793)) [`5dd8f916`](https://github.com/PrismJS/prism/commit/5dd8f916) - **Keep Markup** - Add unit tests to the Keep Markup plugin ([#1646](https://github.com/PrismJS/prism/issues/1646)) [`a944c418`](https://github.com/PrismJS/prism/commit/a944c418) - **Line Numbers** - Added inheritance for the `line-numbers` class ([#1799](https://github.com/PrismJS/prism/issues/1799)) [`14be7489`](https://github.com/PrismJS/prism/commit/14be7489) - **Previewers** - Fixed Previewers bug [#1496](https://github.com/PrismJS/prism/issues/1496) ([#1497](https://github.com/PrismJS/prism/issues/1497)) [`4b56f3c1`](https://github.com/PrismJS/prism/commit/4b56f3c1) - **Show Invisibles** - Updated styles of show invisibles ([#1607](https://github.com/PrismJS/prism/issues/1607)) [`2ba62268`](https://github.com/PrismJS/prism/commit/2ba62268) - Corrected load order of Show Invisibles ([#1612](https://github.com/PrismJS/prism/issues/1612)) [`6e0c6e86`](https://github.com/PrismJS/prism/commit/6e0c6e86) - Show invisibles inside tokens ([#1610](https://github.com/PrismJS/prism/issues/1610)) [`1090b253`](https://github.com/PrismJS/prism/commit/1090b253) - **Show Language** - Show Language plugin alias support and improvements ([#1683](https://github.com/PrismJS/prism/issues/1683)) [`4c66d72c`](https://github.com/PrismJS/prism/commit/4c66d72c) - **Toolbar** - Toolbar: Minor improvements ([#1818](https://github.com/PrismJS/prism/issues/1818)) [`3ad47047`](https://github.com/PrismJS/prism/commit/3ad47047) ### Updated themes - Normalized the font-size of pre and code ([#1791](https://github.com/PrismJS/prism/issues/1791)) [`878ef295`](https://github.com/PrismJS/prism/commit/878ef295) - **Coy** - Correct typo ([#1508](https://github.com/PrismJS/prism/issues/1508)) [`c322fc80`](https://github.com/PrismJS/prism/commit/c322fc80) ### Other changes - **Core** - `insertBefore` now correctly updates references ([#1531](https://github.com/PrismJS/prism/issues/1531)) [`9dfec340`](https://github.com/PrismJS/prism/commit/9dfec340) - Invoke `callback` after `after-highlight` hook ([#1588](https://github.com/PrismJS/prism/issues/1588)) [`bfbe4464`](https://github.com/PrismJS/prism/commit/bfbe4464) - Improve `Prism.util.type` performance ([#1545](https://github.com/PrismJS/prism/issues/1545)) [`2864fe24`](https://github.com/PrismJS/prism/commit/2864fe24) - Remove unused `insertBefore` overload ([#1631](https://github.com/PrismJS/prism/issues/1631)) [`39686e12`](https://github.com/PrismJS/prism/commit/39686e12) - Ignore duplicates in insertBefore ([#1628](https://github.com/PrismJS/prism/issues/1628)) [`d33d259c`](https://github.com/PrismJS/prism/commit/d33d259c) - Remove the Prism.tokenize language parameter ([#1654](https://github.com/PrismJS/prism/issues/1654)) [`fbf0b094`](https://github.com/PrismJS/prism/commit/fbf0b094) - Call `insert-before` hook properly ([#1709](https://github.com/PrismJS/prism/issues/1709)) [`393ab164`](https://github.com/PrismJS/prism/commit/393ab164) - Improved languages.DFS and util.clone ([#1506](https://github.com/PrismJS/prism/issues/1506)) [`152a68ef`](https://github.com/PrismJS/prism/commit/152a68ef) - Core: Avoid redeclaring variables in util.clone ([#1778](https://github.com/PrismJS/prism/issues/1778)) [`b06f532f`](https://github.com/PrismJS/prism/commit/b06f532f) - Made prism-core a little more editor friendly ([#1776](https://github.com/PrismJS/prism/issues/1776)) [`bac09f0a`](https://github.com/PrismJS/prism/commit/bac09f0a) - Applied Array.isArray ([#1804](https://github.com/PrismJS/prism/issues/1804)) [`11d0f75e`](https://github.com/PrismJS/prism/commit/11d0f75e) - **Infrastructure** - Linkify changelog more + add missing PR references [`2a100db7`](https://github.com/PrismJS/prism/commit/2a100db7) - Set default indentation size ([#1516](https://github.com/PrismJS/prism/issues/1516)) [`e63d1597`](https://github.com/PrismJS/prism/commit/e63d1597) - Add travis repo badge to readme ([#1561](https://github.com/PrismJS/prism/issues/1561)) [`716923f4`](https://github.com/PrismJS/prism/commit/716923f4) - Update README.md ([#1553](https://github.com/PrismJS/prism/issues/1553)) [`6d1a2c61`](https://github.com/PrismJS/prism/commit/6d1a2c61) - Mention Prism Themes in README ([#1625](https://github.com/PrismJS/prism/issues/1625)) [`5db04656`](https://github.com/PrismJS/prism/commit/5db04656) - Fixed CHANGELOG.md ([#1707](https://github.com/PrismJS/prism/issues/1707)) [`b1f8a65d`](https://github.com/PrismJS/prism/commit/b1f8a65d) ([#1704](https://github.com/PrismJS/prism/issues/1704)) [`66d2104a`](https://github.com/PrismJS/prism/commit/66d2104a) - Change tested NodeJS versions ([#1651](https://github.com/PrismJS/prism/issues/1651)) [`6ec71e0b`](https://github.com/PrismJS/prism/commit/6ec71e0b) - Inline regex source with gulp ([#1537](https://github.com/PrismJS/prism/issues/1537)) [`e894fc89`](https://github.com/PrismJS/prism/commit/e894fc89) ([#1716](https://github.com/PrismJS/prism/issues/1716)) [`217a6ea4`](https://github.com/PrismJS/prism/commit/217a6ea4) - Improve gulp error messages with pump ([#1741](https://github.com/PrismJS/prism/issues/1741)) [`671f4ca0`](https://github.com/PrismJS/prism/commit/671f4ca0) - Update gulp to version 4.0.0 ([#1779](https://github.com/PrismJS/prism/issues/1779)) [`06627f6a`](https://github.com/PrismJS/prism/commit/06627f6a) - gulp: Refactoring ([#1780](https://github.com/PrismJS/prism/issues/1780)) [`6c9fe257`](https://github.com/PrismJS/prism/commit/6c9fe257) - npm: Updated all dependencies ([#1742](https://github.com/PrismJS/prism/issues/1742)) [`9d908d5a`](https://github.com/PrismJS/prism/commit/9d908d5a) - Tests: Pretty-printed token stream ([#1801](https://github.com/PrismJS/prism/issues/1801)) [`9ea6d600`](https://github.com/PrismJS/prism/commit/9ea6d600) - Refactored tests ([#1795](https://github.com/PrismJS/prism/issues/1795)) [`832a9643`](https://github.com/PrismJS/prism/commit/832a9643) - Added issue templates ([#1805](https://github.com/PrismJS/prism/issues/1805)) [`dedb475f`](https://github.com/PrismJS/prism/commit/dedb475f) - npm: Fixed `test` script ([#1809](https://github.com/PrismJS/prism/issues/1809)) [`bc649dfa`](https://github.com/PrismJS/prism/commit/bc649dfa) - Add command to generate CHANGELOG [`212666d3`](https://github.com/PrismJS/prism/commit/212666d3) - Name in composer.json set to lowercase ([#1824](https://github.com/PrismJS/prism/issues/1824)) [`4f78f1d6`](https://github.com/PrismJS/prism/commit/4f78f1d6) - Added alias tests ([#1832](https://github.com/PrismJS/prism/issues/1832)) [`5c1a6fb2`](https://github.com/PrismJS/prism/commit/5c1a6fb2) - Travis: Fail when changed files are detected ([#1819](https://github.com/PrismJS/prism/issues/1819)) [`66b44e3b`](https://github.com/PrismJS/prism/commit/66b44e3b) - Tests: Additional checks for Prism functions ([#1803](https://github.com/PrismJS/prism/issues/1803)) [`c3e74ea3`](https://github.com/PrismJS/prism/commit/c3e74ea3) - Adjusted .npmignore ([#1834](https://github.com/PrismJS/prism/issues/1834)) [`29a30c62`](https://github.com/PrismJS/prism/commit/29a30c62) - **Website** - Add Python triple-quoted strings "known failure" ([#1449](https://github.com/PrismJS/prism/issues/1449)) [`334c7bca`](https://github.com/PrismJS/prism/commit/334c7bca) - Updated index.html to fix broken instructions ([#1462](https://github.com/PrismJS/prism/issues/1462)) [`7418dfdd`](https://github.com/PrismJS/prism/commit/7418dfdd) - Improve download page typography ([#1484](https://github.com/PrismJS/prism/issues/1484)) [`b1c2f4df`](https://github.com/PrismJS/prism/commit/b1c2f4df) - Fixed peer dependencies in download page ([#1491](https://github.com/PrismJS/prism/issues/1491)) [`9d15ff6e`](https://github.com/PrismJS/prism/commit/9d15ff6e) - Fixed empty link in extending ([#1507](https://github.com/PrismJS/prism/issues/1507)) [`74916d48`](https://github.com/PrismJS/prism/commit/74916d48) - Display language aliases ([#1626](https://github.com/PrismJS/prism/issues/1626)) [`654b527b`](https://github.com/PrismJS/prism/commit/654b527b) - Clean up Previewers' page ([#1630](https://github.com/PrismJS/prism/issues/1630)) [`b0d1823c`](https://github.com/PrismJS/prism/commit/b0d1823c) - Updated website table of contents styles ([#1681](https://github.com/PrismJS/prism/issues/1681)) [`efdd96c3`](https://github.com/PrismJS/prism/commit/efdd96c3) - Added new third-party tutorial for using Prism in Gutenberg ([#1701](https://github.com/PrismJS/prism/issues/1701)) [`ff9ccbe5`](https://github.com/PrismJS/prism/commit/ff9ccbe5) - Remove dead tutorial ([#1702](https://github.com/PrismJS/prism/issues/1702)) [`e2d3bc7e`](https://github.com/PrismJS/prism/commit/e2d3bc7e) - Fix downloads page fetching from GitHub([#1684](https://github.com/PrismJS/prism/issues/1684)) [`dbd3555e`](https://github.com/PrismJS/prism/commit/dbd3555e) - Remove parentheses from download page ([#1627](https://github.com/PrismJS/prism/issues/1627)) [`2ce0666d`](https://github.com/PrismJS/prism/commit/2ce0666d) - Line Numbers plugin instructions clarifications ([#1719](https://github.com/PrismJS/prism/issues/1719)) [`00f4f04f`](https://github.com/PrismJS/prism/commit/00f4f04f) - Fixed Toolbar plugin example ([#1726](https://github.com/PrismJS/prism/issues/1726)) [`5311ca32`](https://github.com/PrismJS/prism/commit/5311ca32) - Test page: Show tokens option ([#1757](https://github.com/PrismJS/prism/issues/1757)) [`729cb28b`](https://github.com/PrismJS/prism/commit/729cb28b) - Some encouragement for visitors of PrismJS.com to request new languages ([#1760](https://github.com/PrismJS/prism/issues/1760)) [`ea769e0b`](https://github.com/PrismJS/prism/commit/ea769e0b) - Docs: Added missing parameter ([#1774](https://github.com/PrismJS/prism/issues/1774)) [`18f2921d`](https://github.com/PrismJS/prism/commit/18f2921d) - More persistent test page ([#1529](https://github.com/PrismJS/prism/issues/1529)) [`3100fa31`](https://github.com/PrismJS/prism/commit/3100fa31) - Added scripts directory ([#1781](https://github.com/PrismJS/prism/issues/1781)) [`439ea1ee`](https://github.com/PrismJS/prism/commit/439ea1ee) - Fixed download page ([#1811](https://github.com/PrismJS/prism/issues/1811)) [`77c57446`](https://github.com/PrismJS/prism/commit/77c57446) ## 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 [[`e7b411e`](https://github.com/PrismJS/prism/commit/e7b411e)] - **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 [[`7547f83`](https://github.com/PrismJS/prism/commit/7547f83)] - **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 `
  
  
  
  
  ```
  
- 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:

```js
import Prism from 'prismjs';
import classMap from 'styles/editor-class-map.css';
Prism.plugins.customClass.map(classMap)
```

**Note:** This plugin only affects generated token elements (usually of the form `span.token`). The classes of `code` and `pre` elements as well as all elements generated by other plugins (e.g. [Toolbar](../toolbar) elements and [line number](../line-numbers) elements) will not be changed.



# Example ## Prefix and map classes Input ```html

	var foo = 'bar';
``` Options ```js Prism.plugins.customClass.map({ keyword: 'special-keyword', string: 'my-string' }); Prism.plugins.customClass.prefix('pr-'); ``` Output ```html

	var
	foo
	=
	'bar'
	;
``` Note that this plugin only affects tokens. The classes of the `code` and `pre` elements won't be prefixed. ## Add new classes Input ```html

a::after {
	content: '\2b00 ';
	opacity: .7;
}
``` Options ```js Prism.plugins.customClass.add(({language, type, content}) => { if (content === 'content' && type === 'property' && language === 'css') { return 'content-property'; } }); ``` Output ```html

a::after
{
	content
	:
	'\2b00 '
	;
	opacity
	:
	 .7
	;
}
```
================================================ FILE: src/plugins/custom-class/custom-class.js ================================================ import prism from '../../global.js'; export class CustomClass { /** * @type {ClassAdder | undefined} */ adder; /** * @type {ClassMapper | undefined} */ mapper; /** * A prefix to add to all class names. * * @type {string} * @default '' */ prefix = ''; /** * Sets the function which can be used to add custom aliases to any token. * * @param {ClassAdder} classAdder */ add (classAdder) { this.adder = classAdder; } /** * Maps all class names using the given object or map function. * * This does not affect the prefix. * * @param {object | ClassMapper} classMapper */ map (classMapper) { if (typeof classMapper === 'function') { this.mapper = classMapper; } else { this.mapper = className => classMapper[className] || className; } } /** * Applies the current mapping and prefix to the given class name. * * @param {string} className A single class name. * @returns {string} */ apply (className) { return this.prefix + (this.mapper ? this.mapper(className) : className); } } /** @type {import('../../types.d.ts').PluginProto<'custom-class'>} */ const Self = { id: 'custom-class', plugin () { return new CustomClass(); }, effect (Prism) { /** @type {CustomClass} */ const customClass = Prism.pluginRegistry.peek(Self)?.plugin; return Prism.hooks.add('wrap', env => { if (customClass['adder']) { const result = customClass['adder']({ content: env.content, type: env.type, language: env.language, }); if (Array.isArray(result)) { env.classes.push(...result); } else if (result) { env.classes.push(result); } } if (!customClass['mapper'] && !customClass.prefix) { return; } env.classes = env.classes.map(c => customClass.apply(c)); }); }, }; export default Self; prism.pluginRegistry.add(Self); /** * @callback ClassMapper * @param {string} className * @returns {string} */ /** * @callback ClassAdder * @param {ClassAdderEnvironment} env * @returns {undefined | string | string[]} */ /** * @typedef {object} ClassAdderEnvironment * @property {string} language * @property {string} type * @property {string} content */ ================================================ FILE: src/plugins/data-uri-highlight/README.md ================================================ --- title: Data URI Highlight description: Highlights data-URI contents. owner: Golmote noCSS: true resources: /plugins/autolinker.css ---
# 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 ```css div { border: 40px solid transparent; border-image: 33.334% url('data:image/svg+xml, \ \ \ \ \ '); padding: 1em; max-width: 20em; font: 130%/1.6 Baskerville, Palatino, serif; } ```
================================================ FILE: src/plugins/data-uri-highlight/data-uri-highlight.js ================================================ import prism from '../../global.js'; import { tokenizeStrings } from '../../shared/tokenize-strings.js'; /** @type {import('../../types.d.ts').PluginProto<'data-uri-highlight'>} */ const Self = { id: 'data-uri-highlight', optional: 'diff-highlight', effect (Prism) { const uri = { 'data-uri': { pattern: /(['"])data:[^,\/]+\/[^,]+,(?:(?!\1)[\s\S]|\\\1)+(?=\1)|^data:[^,\/]+\/[^,]+,[\s\S]+$/, lookbehind: true, inside: { 'language-css': { pattern: /(data:[^,\/]+\/(?:[^+,]+\+)?css,)[\s\S]+/, lookbehind: true, inside: 'css', }, 'language-javascript': { pattern: /(data:[^,\/]+\/(?:[^+,]+\+)?javascript,)[\s\S]+/, lookbehind: true, inside: 'javascript', }, 'language-json': { pattern: /(data:[^,\/]+\/(?:[^+,]+\+)?json,)[\s\S]+/, lookbehind: true, inside: 'json', }, 'language-markup': { pattern: /(data:[^,\/]+\/(?:[^+,]+\+)?(?:html|xml),)[\s\S]+/, lookbehind: true, inside: 'markup', }, }, }, }; return Prism.hooks.add('after-tokenize', env => { tokenizeStrings(env.tokens, code => Prism.tokenize(code, uri)); }); }, }; export default Self; prism.pluginRegistry.add(Self); ================================================ FILE: src/plugins/diff-highlight/README.md ================================================ --- title: Diff Highlight description: Highlight the code inside diff blocks. owner: RunDevelopment require: diff resources: /plugins/autoloader.js { type="module" } ---
# How to use Replace the `language-diff` of your code block with a `language-diff-xxxx` class to enable syntax highlighting for diff blocks. Optional: You can add the `diff-highlight` class to your code block to indicate changes using the background color of a line rather than the color of the text. ## Autoloader The [Autoloader plugin](../autoloader) understands the `language-diff-xxxx` format and will ensure that the language definitions for both Diff and the code language are loaded.
# Example Using `class="language-diff"`: ```diff @@ -4,6 +4,5 @@ - let foo = bar.baz([1, 2, 3]); - foo = foo + 1; + const foo = bar.baz([1, 2, 3]) + 1; console.log(`foo: ${foo}`); ``` Using `class="language-diff diff-highlight"`: ```diff { .diff-highlight } @@ -4,6 +4,5 @@ - let foo = bar.baz([1, 2, 3]); - foo = foo + 1; + const foo = bar.baz([1, 2, 3]) + 1; console.log(`foo: ${foo}`); ``` Using `class="language-diff-javascript"`: ```diff-javascript @@ -4,6 +4,5 @@ - let foo = bar.baz([1, 2, 3]); - foo = foo + 1; + const foo = bar.baz([1, 2, 3]) + 1; console.log(`foo: ${foo}`); ``` Using `class="language-diff-javascript diff-highlight"`: ```diff-javascript { .diff-highlight } @@ -4,6 +4,5 @@ - let foo = bar.baz([1, 2, 3]); - foo = foo + 1; + const foo = bar.baz([1, 2, 3]) + 1; console.log(`foo: ${foo}`); ``` Using `class="language-diff-rust diff-highlight"`: (Autoloader is used to load the Rust language definition.) ```diff-rust { .diff-highlight } @@ -111,6 +114,9 @@ nasty_btree_map.insert(i, MyLeafNode(i)); } + let mut zst_btree_map: BTreeMap<(), ()> = BTreeMap::new(); + zst_btree_map.insert((), ()); + // VecDeque let mut vec_deque = VecDeque::new(); vec_deque.push_back(5); ```
================================================ FILE: src/plugins/diff-highlight/diff-highlight.css ================================================ pre.diff-highlight > code .token.deleted:not(.prefix), pre > code.diff-highlight .token.deleted:not(.prefix) { background-color: rgba(255, 0, 0, 0.1); color: inherit; display: block; } pre.diff-highlight > code .token.inserted:not(.prefix), pre > code.diff-highlight .token.inserted:not(.prefix) { background-color: rgba(0, 255, 128, 0.1); color: inherit; display: block; } ================================================ FILE: src/plugins/diff-highlight/diff-highlight.js ================================================ import { getTextContent, Token } from '../../core/classes/token.js'; import prism from '../../global.js'; import diff, { PREFIXES } from '../../languages/diff.js'; /** @type {import('../../types.d.ts').PluginProto<'diff-highlight'>} */ const Self = { id: 'diff-highlight', require: diff, effect (Prism) { const LANGUAGE_REGEX = /^diff-([\w-]+)/i; /** @param {HookEnv} env */ const setMissingGrammar = env => { const lang = env.language; if (LANGUAGE_REGEX.test(lang) && !env.grammar) { env.grammar = Prism.languageRegistry.getLanguage('diff')?.resolvedGrammar; } }; return Prism.hooks.add({ 'before-sanity-check': setMissingGrammar, 'before-tokenize': setMissingGrammar, 'after-tokenize': env => { const langMatch = LANGUAGE_REGEX.exec(env.language); if (!langMatch) { return; // not a language specific diff } const diffLanguage = langMatch[1]; const diffGrammar = Prism.languageRegistry.getLanguage(diffLanguage)?.resolvedGrammar; if (!diffGrammar) { return; } for (const token of env.tokens) { if ( typeof token === 'string' || !(token.type in PREFIXES) || !Array.isArray(token.content) ) { continue; } const type = token.type; let insertedPrefixes = 0; const getPrefixToken = () => { insertedPrefixes++; return new Token('prefix', PREFIXES[type], /\w+/.exec(type)?.[0]); }; const withoutPrefixes = token.content.filter( t => typeof t === 'string' || t.type !== 'prefix' ); const prefixCount = token.content.length - withoutPrefixes.length; const diffTokens = Prism.tokenize(getTextContent(withoutPrefixes), diffGrammar); // re-insert prefixes // always add a prefix at the start diffTokens.unshift(getPrefixToken()); const LINE_BREAK = /\r\n|\n/g; /** * * @param {string} text */ const insertAfterLineBreakString = text => { /** @type {TokenStream} */ const result = []; LINE_BREAK.lastIndex = 0; let last = 0; let m; while (insertedPrefixes < prefixCount && (m = LINE_BREAK.exec(text))) { const end = m.index + m[0].length; result.push(text.slice(last, end)); last = end; result.push(getPrefixToken()); } if (result.length === 0) { return undefined; } if (last < text.length) { result.push(text.slice(last)); } return result; }; /** * * @param {TokenStream} tokens */ const insertAfterLineBreak = tokens => { for (let i = 0; i < tokens.length && insertedPrefixes < prefixCount; i++) { const token = tokens[i]; if (typeof token === 'string') { const inserted = insertAfterLineBreakString(token); if (inserted) { tokens.splice(i, 1, ...inserted); i += inserted.length - 1; } } else if (typeof token.content === 'string') { const inserted = insertAfterLineBreakString(token.content); if (inserted) { token.content = inserted; } } else { insertAfterLineBreak(token.content); } } }; insertAfterLineBreak(diffTokens); if (insertedPrefixes < prefixCount) { // we are missing the last prefix diffTokens.push(getPrefixToken()); } token.content = diffTokens; } }, }); }, }; export default Self; prism.pluginRegistry.add(Self); /** * @typedef {import('../../types.d.ts').HookEnv} HookEnv * @typedef {import('../../types.d.ts').TokenStream} TokenStream */ ================================================ FILE: src/plugins/download-button/README.md ================================================ --- title: Download Button description: A button in the toolbar of a code block adding a convenient way to download a code file. owner: Golmote require: toolbar noCSS: true resources: - /plugins/toolbar.css - /plugins/toolbar.js { type="module" } ---
# How to use Use the `data-src` and `data-download-link` attribute on a `
` elements similar to [Autoloader](../autoloader), like so:

```html

```

Optionally, the text of the button can also be customized by using a `data-download-link-label` attribute.

```html

```

# Examples The plugin’s JS code:


This page:

================================================ FILE: src/plugins/download-button/download-button.js ================================================ import prism from '../../global.js'; import { getParentPre } from '../../shared/dom-util.js'; import toolbar from '../toolbar/toolbar.js'; /** @type {import('../../types.d.ts').PluginProto<'download-button'>} */ const Self = { id: 'download-button', require: toolbar, effect (Prism) { /** @type {import('../toolbar/toolbar.js').Toolbar} */ const toolbar = Prism.pluginRegistry.peek('toolbar')?.plugin; return toolbar.registerButton('download-file', env => { const pre = getParentPre(env.element); if (!pre) { return; } const src = pre.getAttribute('data-src') || pre.getAttribute('data-download-link'); if (!src) { return; } const a = document.createElement('a'); a.textContent = pre.getAttribute('data-download-link-label') || 'Download'; a.setAttribute('download', ''); a.href = src; return a; }); }, }; export default Self; prism.pluginRegistry.add(Self); ================================================ FILE: src/plugins/file-highlight/README.md ================================================ --- title: File Highlight description: Fetch external files and highlight them with Prism. Used on the Prism website itself. owner: LeaVerou noCSS: true resources: - /plugins/line-numbers.css - /plugins/line-numbers.js { type="module" } ---
# How to use Use the `data-src` attribute on empty `
` elements, like so:

```

```

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).

Use the `data-range` attribute to display only a selected range of lines from the file, like so:

```

```

Lines start at 1, so `"1,5"` will display line 1 up to and including line 5. It's also possible to specify just a single line (e.g. `"5"` for just line 5) and open ranges (e.g. `"3,"` for all lines starting at line 3). Negative integers can be used to specify the n-th last line, e.g. `-2` for the second last line.

When `data-range` is used in conjunction with the [Line Numbers plugin](../line-numbers), this plugin will add the proper `data-start` according to the specified range. This behavior can be overridden by setting the `data-start` attribute manually.

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.

# Examples The plugin’s JS code:


This page:



File that doesn’t exist:



With line numbers, and `data-range="12,111"`:



For more examples, browse around the Prism website. Most large code samples are actually files fetched with this plugin.

================================================ FILE: src/plugins/file-highlight/file-highlight.js ================================================ import prism from '../../global.js'; import { setLanguage } from '../../shared/dom-util.js'; /** * * @param {number} status * @param {string} message * @returns {string} */ const FAILURE_MESSAGE = (status, message) => { return `✖ Error ${status} while fetching file: ${message}`; }; const LOADING_MESSAGE = 'Loading…'; const FAILURE_EMPTY_MESSAGE = '✖ Error: File does not exist or is empty'; /** * Loads the given file. * * @param {string} src The URL or path of the source file to load. * @param {(result: string) => void} success * @param {(reason: string) => void} error */ function loadFile (src, success, error) { const xhr = new XMLHttpRequest(); xhr.open('GET', src, true); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status < 400 && xhr.responseText) { success(xhr.responseText); } else { if (xhr.status >= 400) { error(FAILURE_MESSAGE(xhr.status, xhr.statusText)); } else { error(FAILURE_EMPTY_MESSAGE); } } } }; xhr.send(null); } const EXTENSIONS = { 'js': 'javascript', 'py': 'python', 'rb': 'ruby', 'ps1': 'powershell', 'psm1': 'powershell', 'sh': 'bash', 'bat': 'batch', 'h': 'c', 'tex': 'latex', }; const STATUS_ATTR = 'data-src-status'; const STATUS_LOADING = 'loading'; const STATUS_LOADED = 'loaded'; const STATUS_FAILED = 'failed'; const SELECTOR = 'pre[data-src]:not([' + STATUS_ATTR + '="' + STATUS_LOADED + '"])' + ':not([' + STATUS_ATTR + '="' + STATUS_LOADING + '"])'; export class FileHighlight { /** * @param {Prism} Prism */ Prism; /** * @package * @param {Prism} Prism */ constructor (Prism) { this.Prism = Prism; } /** * Executes the File Highlight plugin for all matching `pre` elements under the given container. * * Note: Elements which are already loaded or currently loading will not be touched by this method. * * @param {ParentNode} [container=document] Defaults to `document`. */ highlight (container = document) { const elements = container.querySelectorAll(SELECTOR); for (const element of elements) { this.Prism.highlightElement(element); } } } /** @type {import('../../types.d.ts').PluginProto<'file-highlight'>} */ const Self = { id: 'file-highlight', plugin (Prism) { return new FileHighlight(Prism); }, effect (Prism) { /** * Parses the given range. * * This returns a range with inclusive ends. * * @param {string | null | undefined} range * @returns {Array | undefined} */ function parseRange (range) { const m = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(range || ''); if (m) { const start = Number(m[1]); const comma = m[2]; const end = m[3]; if (!comma) { return [start, start]; } if (!end) { return [start, undefined]; } return [start, Number(end)]; } return undefined; } return Prism.hooks.add({ 'before-highlightall': env => { env.selector += ', ' + SELECTOR; }, 'before-sanity-check': env => { /** @type {HTMLPreElement} */ const pre = env.element; if (!pre.matches(SELECTOR)) { return; } const src = pre.getAttribute('data-src'); if (!src) { return; } env.code = ''; // fast-path the whole thing and go to complete pre.setAttribute(STATUS_ATTR, STATUS_LOADING); // mark as loading // add code element with loading message const code = pre.appendChild(document.createElement('CODE')); code.textContent = LOADING_MESSAGE; let language = env.language; if (language === 'none') { // the language might be 'none' because there is no language set; // in this case, we want to use the extension as the language const extension = /\.(\w+)$/.exec(src)?.[1] || 'none'; language = EXTENSIONS[extension] || extension; } // set language classes setLanguage(code, language); setLanguage(pre, language); // preload the language /** @type {import('../autoloader/autoloader.js').Autoloader} */ const autoloader = Prism.pluginRegistry.peek('autoloader')?.plugin; if (autoloader) { autoloader.preloadLanguages(language); } // load file loadFile( src, text => { // mark as loaded pre.setAttribute(STATUS_ATTR, STATUS_LOADED); // handle data-range const range = parseRange(pre.getAttribute('data-range')); if (range) { const lines = text.split(/\r\n?|\n/); // the range is one-based and inclusive on both ends let start = range[0]; let end = range[1] == null ? lines.length : range[1]; if (start < 0) { start += lines.length; } start = Math.max(0, Math.min(start - 1, lines.length)); if (end < 0) { end += lines.length; } end = Math.max(0, Math.min(end, lines.length)); text = lines.slice(start, end).join('\n'); // add data-start for line numbers if (!pre.hasAttribute('data-start')) { pre.setAttribute('data-start', String(start + 1)); } } // highlight code code.textContent = text; Prism.highlightElement(code); }, error => { // mark as failed pre.setAttribute(STATUS_ATTR, STATUS_FAILED); code.textContent = error; } ); }, }); }, }; export default Self; prism.pluginRegistry.add(Self); /** * @typedef {import('../../core.js').Prism} Prism */ ================================================ FILE: src/plugins/filter-highlight-all/README.md ================================================ --- title: Filter highlightAll description: Filters the elements the `highlightAll` and `highlightAllUnder` methods actually highlight. owner: RunDevelopment noCSS: true resources: - /languages/typescript.js { type="module" } - ./demo.js { defer } ---
# How to use Filter highlightAll provides you with ways to filter the element the `highlightAll` and `highlightAllUnder` methods actually highlight. This can be very useful when you use Prism's automatic highlighting when loading the page but want to exclude certain code blocks.
# API In `Prism.plugins.filterHighlightAll` you can find the following: `add(condition: (value: { element, language: string }) => boolean): void` : Adds a new filter which will only allow an element to be highlighted if the given function returns `true` for that element. This can be used to define a custom language filter. `addSelector(selector: string): void` : Adds a new filter which will only allow an element to be highlighted if the element matches the given CSS selector. `reject.add(condition: (value: { element, language: string }) => boolean): void` : Same as `add`, but only elements which do **not** fulfill the condition will be highlighted. `reject.addSelector(selector: string): void` : Same as `addSelector`, but only elements which do **not** match the selector will be highlighted. `filterKnown: boolean = false` : Set this to `true` to only allow known languages. Code blocks without a set language or an unknown language will not be highlighted. An element will only be highlighted by the `highlightAll` and `highlightAllUnder` methods if all of the above accept the element. ## Attributes You can also add the following `data-*`{ .language-none } attributes to the script which contains the Filter highlightAll plugin. ` ``` And later in your HTML: ```html




```

Finally, unlike like the [File Highlight](../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. 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:

```html

```

# 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 the GitHub REST API for [Prism's repository](https://api.github.com/repos/PrismJS/prism)):



Registered adapter (as above, but without explicitly declaring the `data-adapter` attribute):



================================================ FILE: src/plugins/jsonp-highlight/demo.js ================================================ function dump_json (x) { return `using dump_json: ${JSON.stringify(x, null, 2)}`; } Prism.plugins.jsonphighlight.registerAdapter( x => `using registerAdapter: ${JSON.stringify(x, null, 2)}` ); ================================================ FILE: src/plugins/jsonp-highlight/jsonp-highlight.js ================================================ import prism from '../../global.js'; function getGlobal () { return typeof window === 'object' ? window : {}; } let jsonpCallbackCounter = 0; /** * Makes a JSONP request. * * @param {string} src The URL of the resource to request. * @param {string | undefined | null} callbackParameter The name of the callback parameter. If falsy, `"callback"` will be used. * @param {number} timeout * @param {(data: any) => void} onSuccess * @param {(reason: 'timeout' | 'network') => void} onError * @returns {void} */ function jsonp (src, callbackParameter, timeout, onSuccess, onError) { const callbackName = `prismjsonp${jsonpCallbackCounter++}`; const uri = document.createElement('a'); uri.href = src; uri.href += (uri.search ? '&' : '?') + (callbackParameter || 'callback') + '=' + callbackName; const script = document.createElement('script'); script.src = uri.href; script.onerror = function () { cleanup(); onError('network'); }; const timeoutId = setTimeout(() => { cleanup(); onError('timeout'); }, timeout); const global = getGlobal(); function cleanup () { clearTimeout(timeoutId); document.head.removeChild(script); delete global[callbackName]; } /** * The JSONP callback function */ global[callbackName] = response => { cleanup(); onSuccess(response); }; document.head.appendChild(script); } const STATUS_ATTR = 'data-jsonp-status'; const STATUS_LOADING = 'loading'; const STATUS_LOADED = 'loaded'; const STATUS_FAILED = 'failed'; const SELECTOR = 'pre[data-jsonp]:not([' + STATUS_ATTR + '="' + STATUS_LOADED + '"])' + ':not([' + STATUS_ATTR + '="' + STATUS_LOADING + '"])'; export class JsonpHighlight { /** * The timeout after which an error message will be displayed. * * __Note:__ If the request succeeds after the timeout, it will still be processed and will override any * displayed error messages. */ timeout = 5000; /** * @type {Prism} */ Prism; /** * The list of adapter which will be used if `data-adapter` is not specified. * * @type {{ adapter: Adapter, name: string }[]} */ adapters = []; /** * @param {Prism} Prism */ constructor (Prism) { this.Prism = Prism; } /** * Returns the given adapter itself, if registered, or a registered adapter with the given name. * * If no fitting adapter is registered, `null` will be returned. * * @param {string | Adapter} adapter The adapter itself or the name of an adapter. */ getAdapter (adapter) { if (typeof adapter === 'function') { for (const item of this.adapters) { if (item.adapter.valueOf() === adapter.valueOf()) { return item.adapter; } } } else if (typeof adapter === 'string') { for (const item of this.adapters) { if (item.name === adapter) { return item.adapter; } } } return null; } /** * Adds a new function to the list of adapters. * * If the given adapter is already registered or not a function or there is an adapter with the given name already, * nothing will happen. * * @param {string} name The name of the adapter. * @param {Adapter} adapter The adapter to be registered. */ registerAdapter (name, adapter) { if (typeof adapter === 'function' && !this.getAdapter(adapter) && !this.getAdapter(name)) { this.adapters.push({ adapter, name }); } } /** * Remove the given adapter or the first registered adapter with the given name from the list of * registered adapters. * * @param {string | Adapter} adapter The adapter itself or the name of an adapter. */ removeAdapter (adapter) { const resolvedAdapter = typeof adapter === 'string' ? this.getAdapter(adapter) : adapter; if (resolvedAdapter) { const index = this.adapters.findIndex(item => item.adapter === resolvedAdapter); if (index >= 0) { this.adapters.splice(index, 1); } } } /** * Runs all registered adapters in the order they were registered using * the given arguments. The result of the first adapter that returns a * string will be returned and iteration will be stopped. * * @param {Parameters} args */ runAdapters (...args) { for (const adapter of this.adapters) { const data = adapter.adapter(...args); if (data !== null) { return data; } } return null; } /** * Highlights all `pre` elements under the given container with a `data-jsonp` attribute by requesting the * specified JSON and using the specified adapter or a registered adapter to extract the code to highlight * from the response. The highlighted code will be inserted into the `pre` element. * * Note: Elements which are already loaded or currently loading will not be touched by this method. * * @param {Element | Document} [container=document] Defaults to `document`. */ highlight (container = document) { const elements = container.querySelectorAll(SELECTOR); for (const element of elements) { this.Prism.highlightElement(element); } } } /** @type {import('../../types.d.ts').PluginProto<'jsonp-highlight'>} */ const Self = { id: 'jsonp-highlight', plugin (Prism) { const config = new JsonpHighlight(Prism); config.registerAdapter('github', rsp => { 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; }); config.registerAdapter('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}`; } const files = rsp.data.files; let filename = el.getAttribute('data-filename'); if (filename == null) { // Maybe in the future we can somehow render all files // But the standard ## With linkable line numbers





================================================
FILE: src/plugins/line-highlight/line-highlight.css
================================================
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%, 0.08);
	background: linear-gradient(to right, hsla(24, 20%, 50%, 0.1) 70%, hsla(24, 20%, 50%, 0));

	pointer-events: none;

	line-height: inherit;
	white-space: pre;
}

@media print {
	.line-highlight {
		/*
		 * This will prevent browsers from replacing the background color with white.
		 * It's necessary because the element is layered on top of the displayed code.
		 */
		-webkit-print-color-adjust: exact;
		color-adjust: exact;
	}
}

.line-highlight:before,
.line-highlight[data-end]:after {
	content: attr(data-start);
	position: absolute;
	top: 0.4em;
	left: 0.6em;
	min-width: 1em;
	padding: 0 0.5em;
	background-color: hsla(24, 20%, 50%, 0.4);
	color: hsl(24, 20%, 95%);
	font: bold 65%/1.5 sans-serif;
	text-align: center;
	vertical-align: 0.3em;
	border-radius: 999px;
	text-shadow: none;
	box-shadow: 0 1px white;
}

.line-highlight[data-end]:after {
	content: attr(data-end);
	top: auto;
	bottom: 0.4em;
}

.line-numbers .line-highlight:before,
.line-numbers .line-highlight:after {
	content: none;
}

pre[id].linkable-line-numbers span.line-numbers-rows {
	pointer-events: all;
}
pre[id].linkable-line-numbers span.line-numbers-rows > span:before {
	cursor: pointer;
}
pre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before {
	background-color: rgba(128, 128, 128, 0.2);
}


================================================
FILE: src/plugins/line-highlight/line-highlight.js
================================================
import prism from '../../global.js';
import { isActive } from '../../shared/dom-util.js';
import { lazy, noop } from '../../shared/util.js';
import { combineCallbacks } from '../../util/combine-callbacks.js';

const LINE_NUMBERS_CLASS = 'line-numbers';
const LINKABLE_LINE_NUMBERS_CLASS = 'linkable-line-numbers';
const NEW_LINE_EXP = /\n(?!$)/g;

/**
 *
 * @param {string} selector
 * @param {ParentNode} [container=document]
 * @returns {Element[]}
 */
function $$ (selector, container = document) {
	return [...container.querySelectorAll(selector)];
}

/**
 * Returns the top offset of the content box of the given parent and the content box of one of its children.
 *
 * @param {HTMLElement} parent
 * @param {HTMLElement} child
 * @returns {number}
 */
function getContentBoxTopOffset (parent, child) {
	const parentStyle = getComputedStyle(parent);
	const childStyle = getComputedStyle(child);

	/**
	 * Returns the numeric value of the given pixel value.
	 *
	 * @param {string} px
	 * @returns {number}
	 */
	function pxToNumber (px) {
		return +px.substr(0, px.length - 2);
	}

	return (
		child.offsetTop +
		pxToNumber(childStyle.borderTopWidth) +
		pxToNumber(childStyle.paddingTop) -
		pxToNumber(parentStyle.paddingTop)
	);
}

/**
 * Returns whether the given element has the given class.
 *
 * @param {Element} element
 * @param {string} className
 * @returns {boolean}
 */
function hasClass (element, className) {
	return element.classList.contains(className);
}

/**
 * Calls the given function.
 *
 * @param {() => void} func
 * @returns {void}
 */
function callFunction (func) {
	func();
}

// Some browsers round the line-height, others don't.
// We need to test for it to position the elements properly.
const isLineHeightRounded = lazy(() => {
	const 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. const result = d.offsetHeight === 38; document.body.removeChild(d); return result; }); export class LineHighlight { /** * @package */ scrollIntoView = true; /** @type {Prism} */ Prism; /** * @param {Prism} Prism */ constructor (Prism) { this.Prism = Prism; } /** * Highlights the lines of the given pre. * * This function is split into a DOM measuring and mutate phase to improve performance. * The returned function mutates the DOM when called. * * @param {HTMLElement} pre * @param {string | null} [lines] * @param {string} [classes=''] */ highlightLines (pre, lines, classes = '') { lines = typeof lines === 'string' ? lines : pre.getAttribute('data-line') || ''; const ranges = lines.replace(/\s+/g, '').split(',').filter(Boolean); const offset = Number(pre.getAttribute('data-line-offset')) || 0; const parseMethod = isLineHeightRounded() ? parseInt : parseFloat; const lineHeight = parseMethod(getComputedStyle(pre).lineHeight); const hasLineNumbers = isActive(pre, LINE_NUMBERS_CLASS); const codeElement = pre.querySelector('code'); const parentElement = hasLineNumbers ? pre : codeElement || pre; /** @type {(function():void)[]} */ const mutateActions = []; const lineBreakMatch = codeElement?.textContent?.match(NEW_LINE_EXP); const numberOfLines = lineBreakMatch ? lineBreakMatch.length + 1 : 1; /** * The top offset between the content box of the element and the content box of the parent element of * the line highlight element (either `
` or ``).
		 *
		 * This offset might not be zero for some themes where the  element has a top margin. Some plugins
		 * (or users) might also add element above the  element. Because the line highlight is aligned relative
		 * to the 
 element, we have to take this into account.
		 *
		 * This offset will be 0 if the parent element of the line highlight element is the `` element.
		 */
		const codePreOffset =
			!codeElement || parentElement === codeElement
				? 0
				: getContentBoxTopOffset(pre, codeElement);

		ranges.forEach(currentRange => {
			const range = currentRange.split('-');

			const start = +range[0];
			let end = +range[1] || start;
			end = Math.min(numberOfLines + offset, end);

			if (end < start) {
				return;
			}

			/** @type {HTMLElement} */
			const line =
				pre.querySelector('.line-highlight[data-range="' + currentRange + '"]') ||
				document.createElement('div');

			mutateActions.push(() => {
				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 && this.Prism.pluginRegistry.peek('line-numbers')?.plugin) {
				/** @type {LineNumbers} */
				const lineNumbers = this.Prism.pluginRegistry.peek('line-numbers')?.plugin;
				const startNode = lineNumbers.getLine(pre, start);
				const endNode = lineNumbers.getLine(pre, end);

				if (startNode) {
					const top = `${startNode.offsetTop + codePreOffset}px`;
					mutateActions.push(() => {
						line.style.top = top;
					});
				}

				if (startNode && endNode) {
					const height = `${endNode.offsetTop - startNode.offsetTop + endNode.offsetHeight}px`;
					mutateActions.push(() => {
						line.style.height = height;
					});
				}
			}
			else {
				mutateActions.push(() => {
					line.setAttribute('data-start', String(start));

					if (end > start) {
						line.setAttribute('data-end', String(end));
					}

					line.style.top = `${(start - offset - 1) * lineHeight + codePreOffset}px`;

					line.textContent = new Array(end - start + 2).join(' \n');
				});
			}

			mutateActions.push(() => {
				line.style.width = `${pre.scrollWidth}px`;
			});

			mutateActions.push(() => {
				// allow this to play nicely with the line-numbers plugin
				// need to attack to pre as when line-numbers is enabled, the code tag is relatively which screws up the positioning
				parentElement.appendChild(line);
			});
		});

		const id = pre.id;
		if (
			hasLineNumbers &&
			this.Prism.pluginRegistry.peek('line-numbers')?.plugin &&
			isActive(pre, LINKABLE_LINE_NUMBERS_CLASS) &&
			id
		) {
			// This implements linkable line numbers. Linkable line numbers use Line Highlight to create a link to a
			// specific line. For this to work, the pre element has to:
			//  1) have line numbers,
			//  2) have the `linkable-line-numbers` class or an ascendant that has that class, and
			//  3) have an id.

			if (!hasClass(pre, LINKABLE_LINE_NUMBERS_CLASS)) {
				// add class to pre
				mutateActions.push(() => {
					pre.classList.add(LINKABLE_LINE_NUMBERS_CLASS);
				});
			}

			const start = parseInt(pre.getAttribute('data-start') || '1');

			// iterate all line number spans
			/** @type {LineNumbers} */
			const lineNumbers = this.Prism.pluginRegistry.peek('line-numbers')?.plugin;
			lineNumbers.getLines(pre)?.forEach((lineSpan, i) => {
				const lineNumber = i + start;
				lineSpan.onclick = () => {
					const hash = `${id}.${lineNumber}`;

					// this will prevent scrolling since the span is obviously in view
					this.scrollIntoView = false;
					location.hash = hash;
					setTimeout(() => {
						this.scrollIntoView = true;
					}, 1);
				};
			});
		}

		return function () {
			mutateActions.forEach(callFunction);
		};
	}
}

/** @type {import('../../types.d.ts').PluginProto<'line-highlight'>} */
const Self = {
	id: 'line-highlight',
	optional: 'line-numbers',
	plugin (Prism) {
		return new LineHighlight(Prism);
	},
	effect (Prism) {
		if (typeof document === 'undefined') {
			return noop;
		}

		/**
		 * Returns whether the Line Highlight plugin is active for the given element.
		 *
		 * If this function returns `false`, do not call `highlightLines` for the given element.
		 *
		 * @param {Element | null | undefined} pre
		 * @returns {pre is HTMLPreElement}
		 */
		function isActiveFor (pre) {
			if (!pre || !/pre/i.test(pre.nodeName)) {
				return false;
			}

			if (pre.hasAttribute('data-line')) {
				return true;
			}

			if (pre.id && isActive(pre, LINKABLE_LINE_NUMBERS_CLASS)) {
				// Technically, the line numbers plugin is also necessary but this plugin doesn't control the classes of
				// the line numbers plugin, so we can't assume that they are present.
				return true;
			}

			return false;
		}

		const applyHash = () => {
			const hash = location.hash.slice(1);

			// Remove pre-existing temporary lines
			$$('.temporary.line-highlight').forEach(line => {
				line.remove();
			});

			const range = (hash.match(/\.([\d,-]+)$/) || [, ''])[1];

			if (!range || document.getElementById(hash)) {
				return;
			}

			const id = hash.slice(0, hash.lastIndexOf('.'));
			const pre = document.getElementById(id);

			if (!pre) {
				return;
			}

			if (!pre.hasAttribute('data-line')) {
				pre.setAttribute('data-line', '');
			}

			/** @type {LineHighlight} */
			const lineHighlight = Prism.pluginRegistry.peek(Self)?.plugin;
			const mutateDom = lineHighlight.highlightLines(pre, range, 'temporary ');
			mutateDom();

			if (lineHighlight.scrollIntoView) {
				document.querySelector('.temporary.line-highlight')?.scrollIntoView();
			}
		};
		const onResize = () => {
			$$('pre')
				.filter(isActiveFor)
				.map(pre => {
					/** @type {LineHighlight} */
					const lineHighlight = Prism.pluginRegistry.peek(Self)?.plugin;
					return lineHighlight.highlightLines(pre);
				})
				.forEach(callFunction);
		};

		window.addEventListener('hashchange', applyHash);
		window.addEventListener('resize', onResize);

		const removeEventListeners = () => {
			window.removeEventListener('hashchange', applyHash);
			window.removeEventListener('resize', onResize);
		};

		/** @type {number | NodeJS.Timeout | undefined} */
		let fakeTimer = undefined; // Hack to limit the number of times applyHash() runs

		const beforeSanityHook = Prism.hooks.add('before-sanity-check', env => {
			const pre = env.element.parentElement;
			if (!isActiveFor(pre)) {
				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. */ let num = 0; $$('.line-highlight', pre).forEach(line => { num += (line.textContent || '').length; line.remove(); }); // Remove extra whitespace if (num && /^(?: \n)+$/.test(env.code.slice(-num))) { env.code = env.code.slice(0, -num); } }); const completeHook = Prism.hooks.add('complete', env => { const pre = env.element.parentElement; if (!isActiveFor(pre)) { return; } if (fakeTimer !== undefined) { clearTimeout(fakeTimer); } /** @type {LineHighlight} */ const lineHighlight = Prism.pluginRegistry.peek(Self)?.plugin; const mutateDom = lineHighlight.highlightLines(pre); mutateDom(); fakeTimer = setTimeout(applyHash, 1); }); return combineCallbacks(removeEventListeners, beforeSanityHook, completeHook); }, }; export default Self; prism.pluginRegistry.add(Self); /** * @typedef {import('../../core.js').Prism} Prism * @typedef {import('../line-numbers/line-numbers.js').LineNumbers} LineNumbers */ ================================================ FILE: src/plugins/line-numbers/README.md ================================================ --- title: Line Numbers description: Line number at the beginning of code lines. owner: kuba-kubula ---
# How to use Obviously, this is supposed to work only for code blocks (`
`) and not for inline code.

Add the `line-numbers` class to your desired `
` or any of its ancestors, and the Line Numbers plugin will take care of the rest. To give all code blocks line numbers, add the `line-numbers` class to the `` of the page. This is part of a general activation mechanism where adding the `line-numbers` (or `no-line-numbers`) class to any element will enable (or disable) the Line Numbers plugin for all code blocks in that element.  
Example:

```html
 

	
	
...
...
...
...
``` Optional: You can specify the `data-start` (Number) attribute on the `
` element. It will shift the line counter.

Optional: To support multiline line numbers using soft wrap, apply the CSS `white-space: pre-line;` or `white-space: pre-wrap;` to your desired `
`.

# Examples ## JavaScript


## CSS

Please note that this `
` does not have the `line-numbers` class but its parent does.



## HTML

Please note the `data-start="-5"` in the code below.



## Unknown languages

```{ .language-none .line-numbers }
This raw text
is not highlighted
but it still has
line numbers
```

## Soft wrap support

Please note the `style="white-space: pre-wrap;"` in the code below.



================================================ FILE: src/plugins/line-numbers/line-numbers.css ================================================ 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 { display: block; counter-increment: linenumber; } .line-numbers-rows > span:before { content: counter(linenumber); color: #999; display: block; padding-right: 0.8em; text-align: right; } ================================================ FILE: src/plugins/line-numbers/line-numbers.js ================================================ import prism from '../../global.js'; import { getParentPre, isActive } from '../../shared/dom-util.js'; import { isNonNull, noop } from '../../shared/util.js'; import { combineCallbacks } from '../../util/combine-callbacks.js'; /** * Plugin name which is used as a class name for
 which is activating the plugin
 */
const PLUGIN_NAME = 'line-numbers';

/**
 * Regular expression used for determining line breaks
 */
const NEW_LINE_EXP = /\n(?!$)/g;

/**
 * Queries for the `line-numbers-rows` element.
 *
 * @param {Element} element
 * @returns {HTMLElement | null}
 */
function getLineNumbersRows (element) {
	return element.querySelector('.line-numbers-rows');
}

/**
 * Resizes the given elements.
 *
 * @param {Element[]} elements
 */
function resizeElements (elements) {
	elements = elements.filter(e => {
		const codeStyles = getComputedStyle(e);
		const whiteSpace = codeStyles.whiteSpace;
		return whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line';
	});

	if (elements.length === 0) {
		return;
	}

	const infos = /** @type {Info[]} */ (
		elements
			.map(element => {
				const codeElement = element.querySelector('code');
				const lineNumbersWrapper = getLineNumbersRows(element);
				if (!codeElement || !lineNumbersWrapper) {
					return undefined;
				}

				/** @type {HTMLElement | null} */
				let lineNumberSizer = element.querySelector('.line-numbers-sizer');
				// @ts-expect-error - codeElement.textContent is not null
				const codeLines = codeElement.textContent.split(NEW_LINE_EXP);

				if (!lineNumberSizer) {
					lineNumberSizer = document.createElement('span');
					lineNumberSizer.className = 'line-numbers-sizer';

					codeElement.appendChild(lineNumberSizer);
				}

				lineNumberSizer.innerHTML = '0';
				lineNumberSizer.style.display = 'block';

				const oneLinerHeight = lineNumberSizer.getBoundingClientRect().height;
				lineNumberSizer.innerHTML = '';

				return {
					element,
					lines: codeLines,
					lineHeights: [],
					oneLinerHeight,
					sizer: lineNumberSizer,
					wrapper: lineNumbersWrapper,
				};
			})
			.filter(isNonNull)
	);

	infos.forEach(info => {
		const lineNumberSizer = info.sizer;
		const lines = info.lines;
		const lineHeights = info.lineHeights;
		const oneLinerHeight = info.oneLinerHeight;

		lineHeights[lines.length - 1] = undefined;
		lines.forEach((line, index) => {
			if (line && line.length > 1) {
				const e = lineNumberSizer.appendChild(document.createElement('span'));
				e.style.display = 'block';
				e.textContent = line;
			}
			else {
				lineHeights[index] = oneLinerHeight;
			}
		});
	});

	infos.forEach(info => {
		const lineNumberSizer = info.sizer;
		const lineHeights = info.lineHeights;

		let childIndex = 0;
		for (let i = 0; i < lineHeights.length; i++) {
			if (lineHeights[i] === undefined) {
				lineHeights[i] =
					lineNumberSizer.children[childIndex++].getBoundingClientRect().height;
			}
		}
	});

	infos.forEach(info => {
		const lineNumberSizer = info.sizer;

		lineNumberSizer.style.display = 'none';
		lineNumberSizer.innerHTML = '';

		info.lineHeights.forEach((height, lineNumber) => {
			if (height !== undefined) {
				const child = /** @type {HTMLElement} */ (info.wrapper.children[lineNumber]);
				child.style.height = `${height}px`;
			}
		});
	});
}

export class LineNumbers {
	/**
	 * Whether the plugin can assume that the units font sizes and margins are not depended on the size of
	 * the current viewport.
	 *
	 * Setting this to `true` will allow the plugin to do certain optimizations for better performance.
	 *
	 * Set this to `false` if you use any of the following CSS units: `vh`, `vw`, `vmin`, `vmax`.
	 */
	assumeViewportIndependence = true;

	/**
	 * Get node for provided line number
	 *
	 * @param {Element} element pre element
	 * @param {number} number number
	 * @returns {HTMLElement | undefined}
	 */
	getLine (element, number) {
		if (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {
			return;
		}

		const lineNumberRows = getLineNumbersRows(element);
		if (!lineNumberRows) {
			return;
		}
		const lineNumberStart = parseInt(String(element.getAttribute('data-start')), 10) || 1;
		const lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);

		if (number < lineNumberStart) {
			number = lineNumberStart;
		}
		if (number > lineNumberEnd) {
			number = lineNumberEnd;
		}

		const lineIndex = number - lineNumberStart;

		return /** @type {HTMLElement} */ (lineNumberRows.children[lineIndex]);
	}

	/**
	 * Returns the nodes of all line numbers.
	 *
	 * @param {Element} element pre element
	 * @returns {HTMLElement[] | undefined}
	 */
	getLines (element) {
		if (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {
			return;
		}

		const lineNumberRows = getLineNumbersRows(element);
		if (!lineNumberRows) {
			return;
		}

		return /** @type {HTMLElement[]} */ ([...lineNumberRows.children]);
	}

	/**
	 * Resizes the line numbers of the given element.
	 *
	 * This function will not add line numbers. It will only resize existing ones.
	 *
	 * @param {Element} element A `
` element with line numbers.
	 * @returns {void}
	 */
	resize (element) {
		resizeElements([element]);
	}
}

/** @type {import('../../types.d.ts').PluginProto<'line-numbers'>} */
const Self = {
	id: 'line-numbers',
	plugin () {
		return new LineNumbers();
	},
	effect (Prism) {
		if (typeof document === 'undefined') {
			return noop;
		}

		let lastWidth = NaN;
		const listener = () => {
			/** @type {LineNumbers} */
			const lineNumbers = Prism.pluginRegistry.peek(Self)?.plugin;
			if (lineNumbers.assumeViewportIndependence && lastWidth === window.innerWidth) {
				return;
			}
			lastWidth = window.innerWidth;

			resizeElements([...document.querySelectorAll('pre.' + PLUGIN_NAME)]);
		};
		window.addEventListener('resize', listener);
		const removeListener = () => {
			window.removeEventListener('resize', listener);
		};

		const completeHook = Prism.hooks.add('complete', env => {
			if (!env.code) {
				return;
			}

			const code = env.element;
			const pre = getParentPre(code);

			// works only for  wrapped inside 
 (not inline)
			if (!pre) {
				return;
			}

			// Abort if line numbers already exists
			if (getLineNumbersRows(code)) {
				return;
			}

			// only add line numbers if  or one of its ancestors has the `line-numbers` class
			if (!isActive(code, PLUGIN_NAME)) {
				return;
			}

			// Remove the class 'line-numbers' from the 
			code.classList.remove(PLUGIN_NAME);
			// Add the class 'line-numbers' to the 
			pre.classList.add(PLUGIN_NAME);

			const match = env.code.match(NEW_LINE_EXP);
			const linesNum = match ? match.length + 1 : 1;

			const lineNumbersWrapper = document.createElement('span');
			lineNumbersWrapper.setAttribute('aria-hidden', 'true');
			lineNumbersWrapper.className = 'line-numbers-rows';
			lineNumbersWrapper.innerHTML = ''.repeat(linesNum);

			if (pre.hasAttribute('data-start')) {
				pre.style.counterReset = `linenumber ${parseInt(String(pre.getAttribute('data-start')), 10) - 1}`;
			}

			env.element.appendChild(lineNumbersWrapper);

			resizeElements([pre]);
		});

		return combineCallbacks(removeListener, completeHook);
	},
};

export default Self;

prism.pluginRegistry.add(Self);

/**
 * @typedef {object} Info
 * @property {Element} element
 * @property {string[]} lines
 * @property {(number | undefined)[]} lineHeights
 * @property {number} oneLinerHeight
 * @property {HTMLElement} sizer
 * @property {HTMLElement} wrapper
 */


================================================
FILE: src/plugins/match-braces/README.md
================================================
---
title: Match braces
description: Highlights matching braces.
owner: RunDevelopment
resources: /plugins/autoloader.js { type="module" }
---

# How to use To enable this plugin add the `match-braces` class to a code block: ```html
...
``` Just like `language-xxxx`, the `match-braces` class is inherited, so you can add the class to the `` to enable the plugin for the whole page. The plugin will highlight brace pairs when the cursor hovers over one of the braces. The highlighting effect will disappear as soon as the cursor leaves the brace pair. The hover effect can be disabled by adding the `no-brace-hover` to the code block. This class can also be inherited. You can also click on a brace to select the brace pair. To deselect the pair, click anywhere within the code block or select another pair. The selection effect can be disabled by adding the `no-brace-select` to the code block. This class can also be inherited. ## Rainbow braces 🌈 To enable rainbow braces, simply add the `rainbow-braces` class to a code block. This class can also get inherited.
# Examples ## JavaScript


```js
const func = (a, b) => {
	return `${a}:${b}`;
}
```

## Lisp

```lisp
(defun factorial (n)
	(if (= n 0) 1
		(* n (factorial (- n 1)))))
```

## Lisp with rainbow braces 🌈 but without hover

```lisp { .rainbow-braces .no-brace-hover }
(defun factorial (n)
	(if (= n 0) 1
		(* n (factorial (- n 1)))))
```

================================================ FILE: src/plugins/match-braces/match-braces.css ================================================ .token.punctuation.brace-hover, .token.punctuation.brace-selected { outline: solid 1px; } .rainbow-braces .token.punctuation.brace-level-1, .rainbow-braces .token.punctuation.brace-level-5, .rainbow-braces .token.punctuation.brace-level-9 { color: #e50; opacity: 1; } .rainbow-braces .token.punctuation.brace-level-2, .rainbow-braces .token.punctuation.brace-level-6, .rainbow-braces .token.punctuation.brace-level-10 { color: #0b3; opacity: 1; } .rainbow-braces .token.punctuation.brace-level-3, .rainbow-braces .token.punctuation.brace-level-7, .rainbow-braces .token.punctuation.brace-level-11 { color: #26f; opacity: 1; } .rainbow-braces .token.punctuation.brace-level-4, .rainbow-braces .token.punctuation.brace-level-8, .rainbow-braces .token.punctuation.brace-level-12 { color: #e0e; opacity: 1; } ================================================ FILE: src/plugins/match-braces/match-braces.js ================================================ import prism from '../../global.js'; import { getParentPre, isActive } from '../../shared/dom-util.js'; /** @type {import('../../types.d.ts').PluginProto<'match-braces'>} */ const Self = { id: 'match-braces', effect (Prism) { /** * @param {string} name */ function mapClassName (name) { /** @type {import('../custom-class/custom-class.js').CustomClass} */ const customClass = Prism.pluginRegistry.peek('custom-class')?.plugin; if (customClass) { return customClass.apply(name); } else { return name; } } const PARTNER = { '(': ')', '[': ']', '{': '}', }; // The names for brace types. // These names have two purposes: 1) they can be used for styling and 2) they are used to pair braces. Only braces // of the same type are paired. const NAMES = { '(': 'brace-round', '[': 'brace-square', '{': 'brace-curly', }; // A map for brace aliases. // This is useful for when some braces have a prefix/suffix as part of the punctuation token. const BRACE_ALIAS_MAP = { '${': '{', // JS template punctuation (e.g. `foo ${bar + 1}`) }; const LEVEL_WARP = 12; let pairIdCounter = 0; const BRACE_ID_PATTERN = /^(pair-\d+-)(close|open)$/; /** * Returns the brace partner given one brace of a brace pair. * * @param {Element} brace */ function getPartnerBrace (brace) { const match = BRACE_ID_PATTERN.exec(brace.id); if (!match) { return null; } return document.querySelector( '#' + match[1] + (match[2] === 'open' ? 'close' : 'open') ); } /** * @this {Element} */ function hoverBrace () { if (!isActive(this, 'brace-hover', true)) { return; } const partner = getPartnerBrace(this); if (!partner) { return; } [this, partner].forEach(e => { e.classList.add(mapClassName('brace-hover')); }); } /** * @this {Element} */ function leaveBrace () { const partner = getPartnerBrace(this); if (!partner) { return; } [this, partner].forEach(e => { e.classList.remove(mapClassName('brace-hover')); }); } /** * @this {Element} */ function clickBrace () { if (!isActive(this, 'brace-select', true)) { return; } const partner = getPartnerBrace(this); if (!partner) { return; } [this, partner].forEach(e => { e.classList.add(mapClassName('brace-selected')); }); } /** @type {WeakSet} */ const withEventListener = new WeakSet(); return Prism.hooks.add('complete', env => { const code = env.element; const pre = getParentPre(code); if (!pre) { return; } // find the braces to match const toMatch = []; if (isActive(code, 'match-braces')) { toMatch.push('(', '[', '{'); } if (toMatch.length === 0) { // nothing to match return; } if (!withEventListener.has(pre)) { // code blocks might be highlighted more than once withEventListener.add(pre); pre.addEventListener('mousedown', () => { // the code element might have been replaced const code = pre.querySelector('code'); const className = mapClassName('brace-selected'); code?.querySelectorAll('.' + className).forEach(e => { e.classList.remove(className); }); }); } const punctuation = [ ...code.querySelectorAll( 'span.' + mapClassName('token') + '.' + mapClassName('punctuation') ), ]; /** @type {{ index: number, open: boolean, element: Element }[]} */ const allBraces = []; toMatch.forEach(open => { const close = PARTNER[open]; const name = mapClassName(NAMES[open]); const pairs = []; /** @type {number[]} */ const openStack = []; for (let i = 0; i < punctuation.length; i++) { const element = punctuation[i]; if (element.childElementCount === 0) { let text = element.textContent || ''; text = BRACE_ALIAS_MAP[text] || text; if (text === open) { allBraces.push({ index: i, open: true, element }); element.classList.add(name); element.classList.add(mapClassName('brace-open')); openStack.push(i); } else if (text === close) { allBraces.push({ index: i, open: false, element }); element.classList.add(name); element.classList.add(mapClassName('brace-close')); const popped = openStack.pop(); if (popped !== undefined) { pairs.push([i, popped]); } } } } pairs.forEach(pair => { const pairId = `pair-${pairIdCounter++}-`; const opening = punctuation[pair[0]]; const closing = punctuation[pair[1]]; opening.id = pairId + 'open'; closing.id = pairId + 'close'; [opening, closing].forEach(e => { e.addEventListener('mouseenter', hoverBrace); e.addEventListener('mouseleave', leaveBrace); e.addEventListener('click', clickBrace); }); }); }); let level = 0; allBraces.sort((a, b) => a.index - b.index); allBraces.forEach(brace => { if (brace.open) { brace.element.classList.add( mapClassName(`brace-level-${(level % LEVEL_WARP) + 1}`) ); level++; } else { level = Math.max(0, level - 1); brace.element.classList.add( mapClassName(`brace-level-${(level % LEVEL_WARP) + 1}`) ); } }); }); }, }; export default Self; prism.pluginRegistry.add(Self); ================================================ FILE: src/plugins/normalize-whitespace/README.md ================================================ --- title: Normalize Whitespace description: Supports multiple operations to normalize whitespace in code blocks. owner: zeitgeist87 optional: unescaped-markup noCSS: true body_classes: language-markup resources: /plugins/keep-markup.js { type="module" } ---
# How to use Obviously, this is supposed to work only for code blocks (`
`) 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 `
` or `` tag.

The default settings can be overridden with the `setDefaults()`{ .language-javascript } method like so:

```js
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 and can be set via the `data-[setting]` attribute on the `
` element:

`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:


	


		let example = {
			foo: true,

			bar: false
		};


		let
		there_is_a_very_very_very_very_long_line_it_can_break_it_for_you
		 = true;
		
		if 
		(there_is_a_very_very_very_very_long_line_it_can_break_it_for_you
		 === true) {
		};


	

It is also compatible with the [keep-markup](../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: ```js let Prism = require("prismjs"); let Normalizer = require("prismjs/plugins/normalize-whitespace/normalize-whitespace"); // Create a new Normalizer object let 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 let code = "\t\t\tlet 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 let html = Prism.highlight(code, Prism.languages.javascript); ```
================================================ FILE: src/plugins/normalize-whitespace/demo.md ================================================ --- layout: null eleventyExcludeFromCollections: true ---

	


		let example = {
			foo: true,

			bar: false
		};


	


	


		let there_is_a_very_very_very_very_long_line_it_can_break_it_for_you = true;

		if (there_is_a_very_very_very_very_long_line_it_can_break_it_for_you === true) {
		};


	

================================================ FILE: src/plugins/normalize-whitespace/normalize-whitespace.js ================================================ import prism from '../../global.js'; import { getParentPre, isActive } from '../../shared/dom-util.js'; /** * @param {string} str * @returns {number} */ function tabLength (str) { let res = 0; for (let i = 0; i < str.length; ++i) { if (str.charCodeAt(i) === '\t'.charCodeAt(0)) { res += 3; } } return str.length + res; } /** @type {(keyof NormalizeWhitespaceDefaults)[]} */ const normalizationOrder = [ 'remove-trailing', 'remove-indent', 'left-trim', 'right-trim', 'break-lines', 'indent', 'remove-initial-line-feed', 'tabs-to-spaces', 'spaces-to-tabs', ]; const settingsConfig = { 'remove-trailing': 'boolean', 'remove-indent': 'boolean', 'left-trim': 'boolean', 'right-trim': 'boolean', 'break-lines': 'number', 'indent': 'number', 'remove-initial-line-feed': 'boolean', 'tabs-to-spaces': 'number', 'spaces-to-tabs': 'number', }; /** * Reads normalizations settings from the given elements's `data-*` attributes. * * @param {Element} element */ function readSetting (element) { const settings = {}; for (const key of normalizationOrder) { const attr = element.getAttribute('data-' + key); const type = settingsConfig[key]; if (attr !== null) { try { const value = JSON.parse(attr || 'true'); if (typeof value === type) { settings[key] = value; } } catch { // ignore error } } } return settings; } const normalizationMethods = { 'left-trim': input => input.replace(/^\s+/, ''), 'right-trim': input => input.replace(/(^|\S)\s+$/, '$1'), 'tabs-to-spaces': (input, spaces) => input.replace(/\t/g, ' '.repeat(spaces)), 'spaces-to-tabs': (input, spaces) => input.replace(RegExp(` {${spaces}}`, 'g'), '\t'), 'remove-trailing': input => input.replace(/\s*?$/gm, ''), 'remove-initial-line-feed': input => input.replace(/^(?:\r?\n|\r)/, ''), 'remove-indent': input => { const indents = input.match(/^[^\S\n\r]*(?=\S)/gm); if (!indents || !indents[0].length) { return input; } indents.sort((a, b) => a.length - b.length); if (!indents[0].length) { return input; } return input.replace(RegExp('^' + indents[0], 'gm'), ''); }, 'indent': (input, tabs) => input.replace(/^[^\S\n\r]*(?=\S)/gm, '\t'.repeat(tabs) + '$&'), 'break-lines': (input, characters) => { const lines = input.split('\n'); for (let i = 0; i < lines.length; ++i) { if (tabLength(lines[i]) <= characters) { continue; } const line = lines[i].split(/(\s+)/); let len = 0; for (let j = 0; j < line.length; ++j) { const tl = tabLength(line[j]); len += tl; if (len > characters) { line[j] = '\n' + line[j]; len = tl; } } lines[i] = line.join(''); } return lines.join('\n'); }, }; export class NormalizeWhitespace { defaults; constructor (defaults) { this.defaults = { ...defaults }; } setDefaults (defaults) { Object.assign(this.defaults, defaults); } /** * @param {string} input * @param {object} [settings] * @returns {string} */ normalize (input, settings) { settings = { ...this.defaults, ...settings }; for (const name of normalizationOrder) { const value = settings[name]; if (value !== undefined && value !== false) { input = normalizationMethods[name](input, value); } } return input; } } /** @type {import('../../types.d.ts').PluginProto<'normalize-whitespace'>} */ const Self = { id: 'normalize-whitespace', optional: 'unescaped-markup', plugin () { return 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*/ }); }, effect (Prism) { /** @type {NormalizeWhitespace} */ const Normalizer = Prism.pluginRegistry.peek(Self)?.plugin; return Prism.hooks.add('before-sanity-check', env => { if (!env.code) { return; } // Check classes if (!isActive(env.element, 'whitespace-normalization', true)) { return; } // Simple mode if there is no env.element if (!env.element.parentNode) { env.code = Normalizer.normalize(env.code); return; } // Normal mode const pre = getParentPre(env.element); if (!pre) { return; } const settings = readSetting(pre); const children = pre.childNodes; let before = ''; let after = ''; let codeFound = false; // Move surrounding whitespace from the
 tag into the  tag
			for (let i = 0; i < children.length; ++i) {
				const 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.pluginRegistry.has('keep-markup')) {
				env.code = before + env.code + after;
				env.code = Normalizer.normalize(env.code, settings);
			}
			else {
				// Preserve markup for keep-markup plugin
				const html = before + env.element.innerHTML + after;
				env.element.innerHTML = Normalizer.normalize(html, settings);
				env.code = env.element.textContent || '';
			}
		});
	},
};

export default Self;

prism.pluginRegistry.add(Self);

/**
 * @typedef {object} NormalizeWhitespaceDefaults
 * @property {number} break-lines
 * @property {number} indent
 * @property {boolean} left-trim
 * @property {boolean} remove-indent
 * @property {boolean} remove-initial-line-feed
 * @property {boolean} remove-trailing
 * @property {boolean} right-trim
 * @property {number} spaces-to-tabs
 * @property {number} tabs-to-spaces
 */


================================================
FILE: src/plugins/previewers/README.md
================================================
---
title: Previewers
description: Previewers for angles, colors, gradients, easing and time.
owner: Golmote
require: css-extras
resources:
  - /languages/css-extras.js { type="module" }
  - /languages/less.js { type="module" }
  - /languages/sass.js { type="module" }
  - /languages/scss.js { type="module" }
  - /languages/stylus.js { type="module" }
---

# 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 ```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 ```html ``` ## Less ```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 ```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 ```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 ```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: ```html
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);
}
``` will give the following result: ```css { data-previewers="color time" } 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.
================================================ FILE: src/plugins/previewers/previewers.css ================================================ .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; z-index: 10; opacity: 0; -webkit-transition: opacity 0.25s; -o-transition: opacity 0.25s; transition: opacity 0.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; } ================================================ FILE: src/plugins/previewers/previewers.js ================================================ import prism from '../../global.js'; import cssExtras from '../../languages/css-extras.js'; import { forEach } from '../../util/iterables.js'; /** * Returns the absolute X, Y offsets for an element. * * @param {Element} element * @returns {{ top: number, right: number, bottom: number, left: number, width: number, height: number }} */ const getOffset = element => { const elementBounds = element.getBoundingClientRect(); let left = elementBounds.left; let top = elementBounds.top; const documentBounds = document.documentElement.getBoundingClientRect(); left -= documentBounds.left; top -= documentBounds.top; return { top, right: innerWidth - left - elementBounds.width, bottom: innerHeight - top - elementBounds.height, left, width: elementBounds.width, height: elementBounds.height, }; }; const TOKEN_CLASS = 'token'; const ACTIVE_CLASS = 'active'; const FLIPPED_CLASS = 'flipped'; /** * @callback Updater * @this {HTMLDivElement} * @param {string} value * @returns {boolean} */ /** * @typedef {Previewer & { _elt: HTMLDivElement }} PreviewerE */ /** * @callback Initializer * @this {PreviewerE} * @returns {void} */ class Previewer { /** @type {string} */ type; /** @type {string | string[]} */ supportedLanguages; /** @type {Updater} */ updater; /** @type {Initializer | undefined} */ initializer; /** * @type {HTMLDivElement | null} */ _elt = null; /** * @type {Element | null} */ _token = null; /** * Previewer constructor * * @param {string} type Unique previewer type * @param {Updater} 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 {Initializer} [initializer] Function that will be called on initialization. */ constructor (type, updater, supportedLanguages = '*', initializer) { this.type = type; this.supportedLanguages = supportedLanguages; this.updater = updater; this.initializer = initializer; } /** * Creates the HTML element for the previewer. * * @returns {asserts this is PreviewerE} */ init () { 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.call(/** @type {PreviewerE} */ (this)); } } /** * @param {Element} token * @returns {boolean} */ isDisabled (token) { const previewers = token.closest('[data-previewers]')?.getAttribute('data-previewers'); const parts = (previewers || '').split(/\s+/); return !parts.includes(this.type); } /** * Checks the class name of each hovered element. * * @param {Element} token * @returns {void} */ tryShow (token) { if (token.classList.contains(TOKEN_CLASS) && this.isDisabled(token)) { return; } const target = token.closest(`.${TOKEN_CLASS}.${this.type}`); if (target && target !== this._token) { this._token = target; this.show(); } } /** * Called on mouseout */ mouseout = () => { this._token?.removeEventListener('mouseout', this.mouseout, false); this._token = null; this.hide(); }; /** * Shows the previewer positioned properly for the current token. */ show () { this.init(); if (!this._token) { return; } if (this.updater.call(this._elt, this._token.textContent || '')) { this._token.addEventListener('mouseout', this.mouseout, false); const offset = getOffset(this._token); this._elt.classList.add(ACTIVE_CLASS); if (offset.top - this._elt.offsetHeight > 0) { this._elt.classList.remove(FLIPPED_CLASS); this._elt.style.top = `${offset.top}px`; this._elt.style.bottom = ''; } else { this._elt.classList.add(FLIPPED_CLASS); 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. */ hide () { this._elt?.classList.remove(ACTIVE_CLASS); } } export class PreviewerCollection { /** * Map of all registered previewers by language. * * @type {Map} */ byLanguages = new Map(); /** * Map of all registered previewers by type. * * @type {Map} */ byType = new Map(); /** * @param {Previewer} previewer */ add (previewer) { forEach(previewer.supportedLanguages, lang => { let list = this.byLanguages.get(lang); if (list === undefined) { list = []; this.byLanguages.set(lang, list); } if (!list.includes(previewer)) { list.push(previewer); } }); this.byType.set(previewer.type, previewer); } /** * Initializes the mouseover event on the code block. * * @param {Element} elt The code block (`env.element`) * @param {string} lang The language (`env.language`) */ initEvents (elt, lang) { /** @type {Previewer[]} */ const previewers = []; previewers.push(...(this.byLanguages.get(lang) ?? [])); previewers.push(...(this.byLanguages.get('*') ?? [])); if (previewers.length === 0) { return; } elt.addEventListener( 'mouseover', e => { const target = e.target; if (target) { previewers.forEach(previewer => { previewer.tryShow(/** @type {Element} */ (target)); }); } }, false ); } } // TODO: Filthy hack to be able to load this script const Prism = { languages: {} }; const previewers = { // gradient must be defined before color and angle 'gradient': { create () { /** * Stores already processed gradients so that we don't * make the conversion every time the previewer is shown */ const 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%"]) */ function convertToW3CLinearGradient (prefix, func, values) { // Default value for angle let angle = '180deg'; const first = values[0]; if ( first && /^(?:-?(?:\d+(?:\.\d+)?|\.\d+)(?:deg|rad)|bottom|left|right|to\b|top)/.test( first ) ) { angle = first; values.shift(); if (!angle.includes('to ')) { // Angle uses old keywords // W3C syntax uses "to" + opposite keywords if (angle.includes('top')) { if (angle.includes('left')) { angle = 'to bottom right'; } else if (angle.includes('right')) { angle = 'to bottom left'; } else { angle = 'to bottom'; } } else if (angle.includes('bottom')) { if (angle.includes('left')) { angle = 'to top right'; } else if (angle.includes('right')) { angle = 'to top left'; } else { angle = 'to top'; } } else if (angle.includes('left')) { angle = 'to right'; } else if (angle.includes('right')) { angle = 'to left'; } else if (prefix) { // Angle is shifted by 90deg in prefixed gradients if (angle.includes('deg')) { angle = `${90 - parseFloat(angle)}deg`; } else if (angle.includes('rad')) { 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%"]) */ function convertToW3CRadialGradient (prefix, func, values) { if (!values[0].includes('at')) { // Looks like old syntax // Default values let position = 'center'; let shape = 'ellipse'; let size = 'farthest-corner'; if (/\b(?:bottom|center|left|right|top)\b|^\d+/.test(values[0])) { // Found a position // Remove angle value, if any position = /** @type {string} */ (values.shift()).replace( /\s*-?\d+(?:deg|rad)\s*/, '' ); } if (/\b(?:circle|closest|contain|cover|ellipse|farthest)\b/.test(values[0])) { // Found a shape and/or size const shapeSizeParts = /** @type {string} */ (values.shift()).split(/\s+/); if ( shapeSizeParts[0] && (shapeSizeParts[0] === 'circle' || shapeSizeParts[0] === 'ellipse') ) { shape = /** @type {string} */ (shapeSizeParts.shift()); } if (shapeSizeParts[0]) { size = /** @type {string} */ (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 */ function convertToW3CGradient (gradient) { if (cache[gradient]) { return cache[gradient]; } const values = gradient .replace( /^(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\(|\)$/g, '' ) .split(/\s*,\s*/); const parts = gradient.match( /^(\b|\B-[a-z]{1,10}-)((?:repeating-)?(?:linear|radial)-gradient)/ ); if (!parts) { return (cache[gradient] = ''); } // "", "-moz-", etc. const prefix = parts[1]; // "linear-gradient", "radial-gradient", etc. const func = parts[2]; if (func.includes('linear')) { return (cache[gradient] = convertToW3CLinearGradient(prefix, func, values)); } else if (func.includes('radial')) { return (cache[gradient] = convertToW3CRadialGradient(prefix, func, values)); } return (cache[gradient] = func + '(' + values.join(',') + ')'); } return new Previewer( 'gradient', function (value) { const first = /** @type {HTMLElement | null} */ (this.firstChild); if (!first) { return false; } first.style.backgroundImage = ''; first.style.backgroundImage = convertToW3CGradient(value); return !!first.style.backgroundImage; }, '*', function () { this._elt.innerHTML = '
'; } ); }, tokens: { 'gradient': { pattern: /(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:hsl|rgb)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 () { return new Previewer( 'angle', function (value) { const num = parseFloat(value); const unit = value.match(/[a-z]+$/i); let max = 1; if (!num || !unit) { return false; } switch (unit[0]) { case 'deg': max = 360; break; case 'grad': max = 400; break; case 'rad': max = 2 * Math.PI; break; case 'turn': max = 1; } const percentage = ((100 * num) / max) % 100; this[`${num < 0 ? 'set' : 'remove'}Attribute`]('data-negative', ''); const circle = this.querySelector('circle'); if (circle) { circle.style.strokeDasharray = `${Math.abs(percentage)},500`; } return true; }, '*', function () { this._elt.innerHTML = '' + '' + ''; } ); }, tokens: { 'angle': /(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\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 () { return new Previewer('color', function (value) { this.style.backgroundColor = ''; this.style.backgroundColor = value; return !!this.style.backgroundColor; }); }, tokens: { 'color': [Prism.languages.css?.['hexcode']].concat(Prism.languages.css?.['color']), }, languages: { // CSS extras is required, so css and scss are not necessary 'css': false, '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': false, '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 () { const identifierMap = { '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', }; return new Previewer( 'easing', function (value) { value = identifierMap[value] || value; const p = value.match(/-?(?:\d+(?:\.\d+)?|\.\d+)/g); if (p && p.length === 4) { const values = p .map(Number) .map((p, i) => (i % 2 ? 1 - p : p) * 100) .map(String); this.querySelector('path')?.setAttribute( 'd', 'M0,100 C' + values[0] + ',' + values[1] + ', ' + values[2] + ',' + values[3] + ', 100,0' ); const lines = this.querySelectorAll('line'); lines[0].setAttribute('x2', values[0]); lines[0].setAttribute('y2', values[1]); lines[1].setAttribute('x2', values[2]); lines[1].setAttribute('y2', values[3]); return true; } return false; }, '*', function () { this._elt.innerHTML = '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; } ); }, tokens: { 'easing': { pattern: /\bcubic-bezier\((?:-?(?:\d+(?:\.\d+)?|\.\d+),\s*){3}-?(?:\d+(?:\.\d+)?|\.\d+)\)\B|\b(?:ease(?:-in)?(?:-out)?|linear)(?=\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 () { return new Previewer( 'time', function (value) { const num = parseFloat(value); const unit = value.match(/[a-z]+$/i); if (!num || !unit) { return false; } const u = unit[0]; const circle = this.querySelector('circle'); if (circle) { circle.style.animationDuration = `${2 * num}${u}`; } return true; }, '*', function () { this._elt.innerHTML = '' + '' + ''; } ); }, tokens: { 'time': /(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\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, }, ], }, }, }; /** @type {import('../../types.d.ts').PluginProto<'previewers'>} */ const Self = { id: 'previewers', require: cssExtras, plugin () { const collection = new PreviewerCollection(); if (typeof document !== 'undefined') { for (const previewer of Object.values(previewers)) { collection.add(previewer.create()); } } return collection; }, effect (Prism) { /* Prism.hooks.add('before-highlight', (env) => { for (const previewer of Object.values(previewers)) { const languages = previewer.languages; if (languages[env.language] && !languages[env.language].initialized) { let lang = languages[env.language]; if (!Array.isArray(lang)) { lang = [lang]; } lang.forEach((lang) => { let before; let inside; let root; let 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, previewer.tokens, root); env.grammar = Prism.languages[lang]; languages[env.language] = { initialized: true }; } }); } } }); */ return Prism.hooks.add('after-highlight', env => { /** @type {PreviewerCollection} */ const previewers = Prism.pluginRegistry.peek(Self)?.plugin; previewers.initEvents(env.element, env.language); }); }, }; export default Self; prism.pluginRegistry.add(Self); ================================================ FILE: src/plugins/show-invisibles/README.md ================================================ --- title: Show Invisibles description: Show hidden characters such as tabs and line breaks. owner: LeaVerou optional: - autolinker - data-uri-highlight ---
# Examples






================================================ FILE: src/plugins/show-invisibles/show-invisibles.css ================================================ .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: #808080; opacity: 0.6; 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"; } ================================================ FILE: src/plugins/show-invisibles/show-invisibles.js ================================================ import prism from '../../global.js'; import { tokenizeStrings } from '../../shared/tokenize-strings.js'; /** @type {import('../../types.d.ts').PluginProto<'show-invisibles'>} */ const Self = { id: 'show-invisibles', optional: ['autolinker', 'data-uri-highlight', 'diff-highlight'], effect (Prism) { const invisibles = { 'tab': /\t/, 'crlf': /\r\n/, 'lf': /\n/, 'cr': /\r/, 'space': / /, }; return Prism.hooks.add('after-tokenize', env => { tokenizeStrings(env.tokens, code => Prism.tokenize(code, invisibles)); }); }, }; export default Self; prism.pluginRegistry.add(Self); ================================================ FILE: src/plugins/show-language/README.md ================================================ --- title: Show Language description: Display the highlighted language in code blocks (inline code does not show the label). owner: nauzilus require: toolbar noCSS: true resources: - /plugins/toolbar.css - /plugins/toolbar.js { type="module" } ---
# Examples ## JavaScript


## CSS



## HTML (Markup)



## SVG

The `data-language`{ .language-markup } attribute can be used to display a specific label whether it has been defined as a language or not.



## Plain text

```none
Just some text (aka. not code).
```

================================================ FILE: src/plugins/show-language/show-language.js ================================================ import prism from '../../global.js'; import { getParentPre } from '../../shared/dom-util.js'; import { getTitle } from '../../shared/meta/title-data.js'; import toolbar from '../toolbar/toolbar.js'; /** @type {import('../../types.d.ts').PluginProto<'show-language'>} */ const Self = { id: 'show-language', require: toolbar, effect (Prism) { /** @type {import('../toolbar/toolbar.js').Toolbar} */ const toolbar = Prism.pluginRegistry.peek('toolbar')?.plugin; return toolbar.registerButton('show-language', env => { const pre = getParentPre(env.element); if (!pre) { return; } const title = pre.getAttribute('data-language') || getTitle(env.language); if (!title) { return; } const element = document.createElement('span'); element.textContent = title; return element; }); }, }; export default Self; prism.pluginRegistry.add(Self); ================================================ FILE: src/plugins/toolbar/README.md ================================================ --- title: Toolbar description: Attach a toolbar for plugins to easily register buttons on the top of a code block. owner: mAAdhaTTah body_classes: language-markup resources: ./demo.js { defer } ---
# 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. ```html { data-label="Hello World!" }

```

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:

```html { data-label="my-label-button" }

```

```html

```

## Registering buttons

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 a `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`.

```js
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.

```js
Prism.plugins.toolbar.registerButton('select-code', env => {
	let button = document.createElement('button');
	button.innerHTML = 'Select Code';

	button.addEventListener('click', () => {
		// Source: http://stackoverflow.com/a/11128179/2757940
		if (document.body.createTextRange) {
			// ms
			let range = document.body.createTextRange();
			range.moveToElementText(env.element);
			range.select();
		} else if (window.getSelection) {
			// moz, opera, webkit
			let selection = window.getSelection();
			let 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.

## Ordering buttons

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, the `data-toolbar-order` attribute can be used. Given a comma-separated list of button names, it will ensure that these buttons will be displayed in the given order.  
Buttons not listed will not be displayed. This means that buttons can be disabled using this technique.

Example: The "Hello World!" button will appear before the "Select Code" button and the custom label button will not be displayed.

```html { data-toolbar-order="hello-world,select-code" data-label="Hello World!" }
``` The `data-toolbar-order` attribute is inherited, so you can define the button order for the whole document by adding the attribute to the `body` of the page. ```html ```
================================================ FILE: src/plugins/toolbar/demo.js ================================================ Prism.plugins.toolbar.registerButton('hello-world', { text: 'Hello World!', // required onClick: function (env) { // optional alert(`This code snippet is written in ${env.language}.`); }, }); Prism.plugins.toolbar.registerButton('select-code', env => { let button = document.createElement('button'); button.innerHTML = 'Select Code'; button.addEventListener('click', () => { // Source: http://stackoverflow.com/a/11128179/2757940 if (document.body.createTextRange) { // ms let range = document.body.createTextRange(); range.moveToElementText(env.element); range.select(); } else if (window.getSelection) { // moz, opera, webkit let selection = window.getSelection(); let range = document.createRange(); range.selectNodeContents(env.element); selection.removeAllRanges(); selection.addRange(range); } }); return button; }); ================================================ FILE: src/plugins/toolbar/toolbar.css ================================================ div.code-toolbar { position: relative; } div.code-toolbar > .toolbar { position: absolute; z-index: 10; top: 0.3em; right: 0.2em; transition: opacity 0.3s ease-in-out; opacity: 0; } div.code-toolbar:hover > .toolbar { opacity: 1; } /* Separate line b/c rules are thrown out if selector is invalid. IE11 and old Edge versions don't support :focus-within. */ div.code-toolbar:focus-within > .toolbar { opacity: 1; } div.code-toolbar > .toolbar > .toolbar-item { display: inline-block; } div.code-toolbar > .toolbar > .toolbar-item > a { cursor: pointer; } div.code-toolbar > .toolbar > .toolbar-item > 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 > .toolbar-item > a, div.code-toolbar > .toolbar > .toolbar-item > button, div.code-toolbar > .toolbar > .toolbar-item > span { color: #bbb; font-size: 0.8em; padding: 0 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: 0.5em; } div.code-toolbar > .toolbar > .toolbar-item > a:hover, div.code-toolbar > .toolbar > .toolbar-item > a:focus, div.code-toolbar > .toolbar > .toolbar-item > button:hover, div.code-toolbar > .toolbar > .toolbar-item > button:focus, div.code-toolbar > .toolbar > .toolbar-item > span:hover, div.code-toolbar > .toolbar > .toolbar-item > span:focus { color: inherit; text-decoration: none; } ================================================ FILE: src/plugins/toolbar/toolbar.js ================================================ import prism from '../../global.js'; import { getParentPre } from '../../shared/dom-util.js'; import { noop } from '../../shared/util.js'; /** * Returns the callback order of the given element. * * @param {Element} element */ function getOrder (element) { /** @type {Element | null} */ let e = element; for (; e; e = e.parentElement) { let order = e.getAttribute('data-toolbar-order'); if (order != null) { order = order.trim(); if (order.length) { return order.split(/\s*,\s*/); } else { return []; } } } } export class Toolbar { /** * @type {ButtonFactory[]} */ callbacks = []; /** * @type {Map} */ map = new Map(); /** * Register a button callback with the toolbar. * * The returned function will remove the added callback again when called. * * @param {string} key * @param {ButtonOptions | ButtonFactory} opts * @returns {function():void} */ registerButton (key, opts) { /** @type {ButtonFactory} */ let callback; if (typeof opts === 'function') { callback = opts; } else { callback = function (env) { const { text, url, onClick, className } = opts; let element; if (typeof onClick === 'function') { element = document.createElement('button'); element.type = 'button'; element.addEventListener('click', function () { onClick.call(this, env); }); } else if (typeof url === 'string') { element = document.createElement('a'); element.href = url; } else { element = document.createElement('span'); } if (className) { element.classList.add(className); } element.textContent = text; return element; }; } if (this.map.has(key)) { console.warn('There is a button with the key "' + key + '" registered already.'); return noop; } this.map.set(key, callback); this.callbacks.push(callback); return () => { this.map.delete(key); const index = this.callbacks.indexOf(callback); if (index !== -1) { this.callbacks.splice(index, 1); } }; } /** * @type {HookCallback} */ hook = env => { // Check if inline or actual code block (credit to line-numbers plugin) const pre = getParentPre(env.element); if (!pre) { return; } const container = pre.parentElement; if (!container) { return; } // Autoloader rehighlights, so only do this once. if (container.classList.contains('code-toolbar')) { return; } // Create wrapper for
 to prevent scrolling toolbar with content
		const wrapper = document.createElement('div');
		wrapper.classList.add('code-toolbar');
		container.insertBefore(wrapper, pre);
		wrapper.appendChild(pre);

		// Setup the toolbar
		const toolbar = document.createElement('div');
		toolbar.classList.add('toolbar');

		// order callbacks
		let elementCallbacks = this.callbacks;
		const order = getOrder(env.element);
		if (order) {
			elementCallbacks = /** @type {ButtonFactory[]} */ (
				order.map(key => this.map.get(key) || noop)
			);
		}

		elementCallbacks.forEach(callback => {
			const element = callback(env);

			if (!element) {
				return;
			}

			const 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);
	};
}

/** @type {ButtonFactory} */
const label = env => {
	const pre = getParentPre(env.element);
	if (!pre) {
		return;
	}

	if (!pre.hasAttribute('data-label')) {
		return;
	}

	let element;
	let template;
	const text = pre.getAttribute('data-label');
	try {
		// Any normal text will blow up this selector.
		if (text) {
			template = document.querySelector('template#' + text);
		}
	}
	catch {
		/* noop */
	}

	if (template) {
		element = /** @type {HTMLTemplateElement} */ (template).content;
	}
	else {
		const url = pre.getAttribute('data-url');
		if (url) {
			element = document.createElement('a');
			element.href = url;
		}
		else {
			element = document.createElement('span');
		}

		element.textContent = text;
	}

	return element;
};

/** @type {import('../../types.d.ts').PluginProto<'toolbar'>} */
const Self = {
	id: 'toolbar',
	plugin () {
		const toolbar = new Toolbar();
		toolbar.registerButton('label', label);
		return toolbar;
	},
	effect (Prism) {
		/** @type {Toolbar} */
		const toolbar = Prism.pluginRegistry.peek(Self)?.plugin;
		return Prism.hooks.add('complete', toolbar.hook);
	},
};

export default Self;

prism.pluginRegistry.add(Self);

/**
 * @typedef {import('../../types.d.ts').HookEnv} HookEnv
 * @typedef {import('../../types.d.ts').HookCallback} HookCallback
 */

/**
 * @typedef {object} ButtonOptions
 * @property {string} text The text displayed.
 * @property {string} [url] The URL of the link which will be created.
 * @property {(env: HookEnv) => void} [onClick] The event listener for the `click` event of the created button.
 * @property {string} [className] The class attribute to include with the element.
 */

/**
 * @callback ButtonFactory
 * @param {HookEnv} env
 * @returns {Node | undefined}
 */


================================================
FILE: src/plugins/treeview-icons/README.md
================================================
---
title: Treeview
description: A language with special styles to highlight file system tree structures.
owner: Golmote
---

# How to use You may use `tree -F` to get a compatible text structure. ```treeview root_folder/ |-- a first folder/ | |-- holidays.mov | |-- javascript-file.js | `-- some_picture.jpg |-- documents/ | |-- spreadsheet.xls | |-- manual.pdf | |-- document.docx | `-- presentation.ppt | `-- test |-- empty_folder/ |-- going deeper/ | |-- going deeper/ | | `-- going deeper/ | | `-- going deeper/ | | `-- .secret_file | |-- style.css | `-- index.html |-- music and movies/ | |-- great-song.mp3 | |-- S01E02.new.episode.avi | |-- S01E02.new.episode.nfo | `-- track 1.cda |-- .gitignore |-- .htaccess |-- .npmignore |-- archive 1.zip |-- archive 2.tar.gz |-- logo.svg `-- README.md ``` You can also use the following box-drawing characters to represent the tree: ```treeview root_folder/ ├── a first folder/ | ├── holidays.mov | ├── javascript-file.js | └── some_picture.jpg ├── documents/ | ├── spreadsheet.xls | ├── manual.pdf | ├── document.docx | └── presentation.ppt └── etc. ```
================================================ FILE: src/plugins/treeview-icons/treeview-icons.css ================================================ .token.treeview-part .entry-line { position: relative; text-indent: -99em; display: inline-block; vertical-align: top; width: 1.2em; } .token.treeview-part .entry-line:before, .token.treeview-part .line-h:after { content: ""; position: absolute; top: 0; left: 50%; width: 50%; height: 100%; } .token.treeview-part .line-h:before, .token.treeview-part .line-v:before { border-left: 1px solid #ccc; } .token.treeview-part .line-v-last:before { height: 50%; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; } .token.treeview-part .line-h:after { height: 50%; border-bottom: 1px solid #ccc; } .token.treeview-part .entry-name { position: relative; display: inline-block; vertical-align: top; } .token.treeview-part .entry-name.dotfile { opacity: 0.5; } /* @GENERATED-FONT */ @font-face { font-family: "PrismTreeview"; /** * This font is generated from the .svg files in the `icons` folder. See the `treeviewIconFont` function in * `scripts/build.js` for more information. * * Use the following escape sequences to refer to a specific icon: * * - \ea01 file * - \ea02 folder * - \ea03 image * - \ea04 audio * - \ea05 video * - \ea06 text * - \ea07 code * - \ea08 archive * - \ea09 pdf * - \ea0a excel * - \ea0b powerpoint * - \ea0c word */ src: url("data:application/font-woff;base64,d09GRgABAAAAAAmEAAsAAAAAEzwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAMUAAAE2JkkqGE9TLzIAAAHQAAAAQQAAAGBLtUI0Y21hcAAAAhQAAAEfAAADPGXJZIpnbHlmAAADNAAAA+MAAAlACm1VqmhlYWQAAAcYAAAAKgAAADZfxj5jaGhlYQAAB0QAAAAYAAAAJAFbANRobXR4AAAHXAAAABAAAACACGQAAGxvY2EAAAdsAAAAJQAAAEI7NDjibWF4cAAAB5QAAAAfAAAAIAEzAHZuYW1lAAAHtAAAATcAAAJSfUrk+HBvc3QAAAjsAAAAlQAAANURv2OieJxNjksSwVAQRU9IEOTnG4nPFowMjZSRoTI3UqpSRgaWYAVWYDFWYD1uOlR5Vf3S5/W9N40DtFmyprbZ7vaExfF6IcOlOuX8v3eK8+lI60eaufZtqd74pKzYcuDGnQdPXtRoMLA7IaJHTN98oSi2ro4nxZDRl9vijFwUmW+k9KZcOVO5Ur27UoyVFSrTMfLUl9kVN1SxMiZGTVVi0zJtSkd/SJjbJjN1IQspfe3RIzBH1xx9saP3QIpY+6VS5XLMPw6UD6QAAAB4nGNgYXBmnMDAysDAUMhQCyQloXQoAweDHgMDEwMrMwNWEJDmmsJwgCHxFQ/DZiBXgOEwAyOQZkRRxAUAq90IcAAAAHicvdLbboJAEAbgf0XxBKiI4AEh6WXTlzL2ZNKDMbb1AZo+UK/6TPsS9h9mkt72pl3yOZlBmM0yADoAArqiNuC+4CDrk1XX1AMMmnobH8wT9NBCiA122OOAk4/OZ9Y32OKB+dG7Jv9Zjs8kWOKC1yXzGVZIMUaMHCXvjJChxgRrTLFAgTkq/tuxS8CeHfbqsmefuxgi4utC/P3iHtNxnJcJMMrqSbO1Yl4t/6H1r1YkP+7dshpy/mpGW7Oia5PSjRnTrYnpzuR0b0raGZ4Cv60a0aPJ6MnIHp7NhPZmTQczpaNZ0Isp6NXM6c1UdDI8eu+UzKVvKUgMlMyxbyuZZd9RMuM+VJDYVZDYU5DYV5A4UDL7fqggMVKIvgF69jrmAHiclVXNbttGEN6Z/dOSXEoK/2LLkg0xIN3EdWxRJGMktR0HENo0BdoaLer2EqBAip5zywP0llMvTU699QX6fums7DSNEhoqJc7uzg535/tmdpZxxt68Ya/Z3yximyxnrJ3AGGJ1B6bFZzBv7sMszXRSFXehyOrcKfPkdy6U+E0oJS6Ex8MCYBtv3Rbyq5fciOdO/6eQgquC08Qfz5T45BWjB51gf9EvY3u0Uz0vrrZxraJtU9quaZP3tx9DNUtfK7FwC+8IKcULoQJrXhhrzY5nHxl7sJxTTjwl8Xjhpp46wS1jcgXjbVath7NN8rrNWj0t5s0sjVUn7ufPIltUPd8f+H43B5/uRJEtrTMa+MSEWvHrHvuC/bimZ8RKrPPpXcjfWrVNNmubebkPIWRprNUEyqWimKp4qYjTTgCHiAAwtCTRDmGPo7UoBaDnIYgI0RhQAqVE0Y3vG8CGFhggxIBDWPDBLvW5wmAnQMX7aDYNCokqVLT2h3Gp2MM10buk+K+NG+Z6Wpd1e1B1gjyVvZ4spdbyB4KLoxF2Y7nQZHlpDnjEAUZmxD4Ss4o9Yudrev02nS/t6ux9FNXquBPHBuICCMEC8fFV+06D14D63oVXOUFx0e4DEpsIyn2mAD+Cr2Vfsp/WxNfMtiGN+y77cq0oN4u2SvvgetN53ZYP4ASaWUbH6QSOocomkOhY5Z04c/JQAty4ASDJ1wzgF8QUOEiIIhIcdgHBggMAIcI10aQkJrONm8AFLe+QbwMIDjc3YDn1hMM5OGJc4+Js/uWBM8181l/WjZZO6LeucuUJwR7DZZusw07u7LKUahuFfn4CdZVQWdOzZu7OZ3pqNy39zzu4sLZ66EOf2AxsD0VIqen1ei/tu6fsAh8Erz7POVJx6iHfDQJ+SAbCnb/eSqy/Zt9RrH9mv65bg7JZNctSfRhPi1JplU/zsjh2hShp2qbdh+V3iU5ineqmDaFVWTsvqVs6+6zIqd53Rv+JkEqFHDGwKhv2DSAHV4ZAKk1a7l4aHEijdIkuEcI+70kuH3Bfy2tOwX3kErkQHBXlvvYoI8D4YWD6RggQgR4cYijMhTBU+84kR+0bXyFnYoWvk3VvkarO2yx3TdmSSCpdLptMd6KfbGmK9ERHkXY9PaZeN6TM8+LY87a2PC+KPG80/qC2Nuz0f3hbV7P2GOb7cAeSKmndeHmDdLo73jGhlqpHVN0ym0EguVL8Wn+HwO0gEN69rRHyIXeHbpXfdW8DIrI6gcNtqK7YTXK6F5eyqjtd9vRwYAHsYKAnxgMIgz6AZ64pIt5ZjaI687w9LY6OhN7z2D+hNgTCAHicY2BkYGAAYv3Xf7Li+W2+MnAzbGbAAP//Myxn2AJkcDAwgfgA+ZUIQwAAeJxjYGRgYNjMwAAnlzMwMqACBQA0BQIweJxjYACCzSRiKgIAUCEIZXicY2AAAjOGIoZ9jHaMM5g4mHqY/jFPY37D4saygDgIABq6EnkAAAB4nGNgZGBgUGDIYuBkAAEmIOYCQgaG/2A+AwAW0wGqAHicfZFNbsIwEIVf+KsKaoXUqouu3E03lRJgVw4AW4QQ+wB2CEri1DEg9j1HT9BzcI6eouu+pN6kEvVI42/evJmFDaCPMzyUx8NNlcvTwBWrX26S7h23yE+O2+jBd9yh/uq4ixdMHPdwhzdu8FrXVB7x7riBW3w4blL/dNwinx238YAvxx3q3467WHp9xz08e2pm4iJdGCkPsTzOZbRPQlPTasVSmiLWmRj6g5o+lZk0oZUbsTqJ4hCNrFVCGZ2Kic6sTBItcqN3cm39rbX5OAiU0/21TjGDQYwCKRYkyTiwljhizhxhjwQhO5d9lztLZsNODI0MAkO+++Af/5Q5q2ZCWN4bzqxwYi7oiTCiaqFYK3o0Nwj+WLm7dCcMTSWvejsqa+o+ttVUjjEChvrj9+niph8pXG9DAHicbcHJDoIwFEDRXm3FeZ5H/DRCX7UJWtIg8Pku3HqO6qgf1H8pHbpoDD0S+gwYMmLMhCkz5ixYsmLNhi079hw4cuLMhSs3Uu5KO19Iz4XCSjT+lT3EZB/rg6m9laAraSudBytJFvOnr6VbWmekzaUYlqGRWAb/rnQTosXhKRAClsiLjAcfaipacp6UNLyV+gLQNSS+AAAA") format("woff"); } .token.treeview-part .entry-name:before { content: "\ea01"; font-family: "PrismTreeview"; font-size: inherit; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; width: 2.5ex; display: inline-block; } .token.treeview-part .entry-name.dir:before { content: "\ea02"; } .token.treeview-part .entry-name.ext-bmp:before, .token.treeview-part .entry-name.ext-eps:before, .token.treeview-part .entry-name.ext-gif:before, .token.treeview-part .entry-name.ext-jpe:before, .token.treeview-part .entry-name.ext-jpg:before, .token.treeview-part .entry-name.ext-jpeg:before, .token.treeview-part .entry-name.ext-png:before, .token.treeview-part .entry-name.ext-svg:before, .token.treeview-part .entry-name.ext-tiff:before { content: "\ea03"; } .token.treeview-part .entry-name.ext-cfg:before, .token.treeview-part .entry-name.ext-conf:before, .token.treeview-part .entry-name.ext-config:before, .token.treeview-part .entry-name.ext-csv:before, .token.treeview-part .entry-name.ext-ini:before, .token.treeview-part .entry-name.ext-log:before, .token.treeview-part .entry-name.ext-md:before, .token.treeview-part .entry-name.ext-nfo:before, .token.treeview-part .entry-name.ext-txt:before { content: "\ea06"; } .token.treeview-part .entry-name.ext-asp:before, .token.treeview-part .entry-name.ext-aspx:before, .token.treeview-part .entry-name.ext-c:before, .token.treeview-part .entry-name.ext-cc:before, .token.treeview-part .entry-name.ext-cpp:before, .token.treeview-part .entry-name.ext-cs:before, .token.treeview-part .entry-name.ext-css:before, .token.treeview-part .entry-name.ext-h:before, .token.treeview-part .entry-name.ext-hh:before, .token.treeview-part .entry-name.ext-htm:before, .token.treeview-part .entry-name.ext-html:before, .token.treeview-part .entry-name.ext-jav:before, .token.treeview-part .entry-name.ext-java:before, .token.treeview-part .entry-name.ext-js:before, .token.treeview-part .entry-name.ext-php:before, .token.treeview-part .entry-name.ext-rb:before, .token.treeview-part .entry-name.ext-xml:before { content: "\ea07"; } .token.treeview-part .entry-name.ext-7z:before, .token.treeview-part .entry-name.ext-bz:before, .token.treeview-part .entry-name.ext-bz2:before, .token.treeview-part .entry-name.ext-gz:before, .token.treeview-part .entry-name.ext-rar:before, .token.treeview-part .entry-name.ext-tar:before, .token.treeview-part .entry-name.ext-tgz:before, .token.treeview-part .entry-name.ext-zip:before { content: "\ea08"; } .token.treeview-part .entry-name.ext-aac:before, .token.treeview-part .entry-name.ext-au:before, .token.treeview-part .entry-name.ext-cda:before, .token.treeview-part .entry-name.ext-flac:before, .token.treeview-part .entry-name.ext-mp3:before, .token.treeview-part .entry-name.ext-oga:before, .token.treeview-part .entry-name.ext-ogg:before, .token.treeview-part .entry-name.ext-wav:before, .token.treeview-part .entry-name.ext-wma:before { content: "\ea04"; } .token.treeview-part .entry-name.ext-avi:before, .token.treeview-part .entry-name.ext-flv:before, .token.treeview-part .entry-name.ext-mkv:before, .token.treeview-part .entry-name.ext-mov:before, .token.treeview-part .entry-name.ext-mp4:before, .token.treeview-part .entry-name.ext-mpeg:before, .token.treeview-part .entry-name.ext-mpg:before, .token.treeview-part .entry-name.ext-ogv:before, .token.treeview-part .entry-name.ext-webm:before { content: "\ea05"; } .token.treeview-part .entry-name.ext-pdf:before { content: "\ea09"; } .token.treeview-part .entry-name.ext-xls:before, .token.treeview-part .entry-name.ext-xlsx:before { content: "\ea0a"; } .token.treeview-part .entry-name.ext-doc:before, .token.treeview-part .entry-name.ext-docm:before, .token.treeview-part .entry-name.ext-docx:before { content: "\ea0c"; } .token.treeview-part .entry-name.ext-pps:before, .token.treeview-part .entry-name.ext-ppt:before, .token.treeview-part .entry-name.ext-pptx:before { content: "\ea0b"; } ================================================ FILE: src/plugins/treeview-icons/treeview-icons.js ================================================ import prism from '../../global.js'; import treeview from '../../languages/treeview.js'; /** @type {import('../../types.d.ts').PluginProto<'treeview-icons'>} */ const Self = { id: 'treeview-icons', require: treeview, }; export default Self; prism.pluginRegistry.add(Self); ================================================ FILE: src/plugins/unescaped-markup/README.md ================================================ --- title: Unescaped Markup description: Write markup without having to escape anything. owner: LeaVerou ---
# How to use This plugin provides several methods of achieving the same thing: - Instead of using `
` elements, use `
```

- Use an HTML-comment to escape your code:

```html
``` This will only work if the `code` element contains exactly one comment and nothing else (not even spaces). E.g. ` ` and `text` will not work.
# 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 `