prism-rails 1.19.0 → 1.29.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +22 -1
  4. data/lib/prism-rails/version.rb +1 -1
  5. data/vendor/assets/javascripts/languages/prism-abap.js +17 -17
  6. data/vendor/assets/javascripts/languages/prism-abnf.js +3 -3
  7. data/vendor/assets/javascripts/languages/prism-actionscript.js +6 -2
  8. data/vendor/assets/javascripts/languages/prism-ada.js +9 -6
  9. data/vendor/assets/javascripts/languages/prism-agda.js +24 -0
  10. data/vendor/assets/javascripts/languages/prism-al.js +25 -0
  11. data/vendor/assets/javascripts/languages/prism-antlr4.js +1 -1
  12. data/vendor/assets/javascripts/languages/prism-apacheconf.js +3 -3
  13. data/vendor/assets/javascripts/languages/prism-apex.js +65 -0
  14. data/vendor/assets/javascripts/languages/prism-apl.js +3 -3
  15. data/vendor/assets/javascripts/languages/prism-applescript.js +5 -8
  16. data/vendor/assets/javascripts/languages/prism-aql.js +14 -6
  17. data/vendor/assets/javascripts/languages/prism-arduino.js +5 -3
  18. data/vendor/assets/javascripts/languages/prism-arff.js +1 -1
  19. data/vendor/assets/javascripts/languages/prism-armasm.js +49 -0
  20. data/vendor/assets/javascripts/languages/prism-arturo.js +105 -0
  21. data/vendor/assets/javascripts/languages/prism-asciidoc.js +13 -13
  22. data/vendor/assets/javascripts/languages/prism-asm6502.js +15 -14
  23. data/vendor/assets/javascripts/languages/prism-asmatmel.js +43 -0
  24. data/vendor/assets/javascripts/languages/prism-aspnet.js +6 -6
  25. data/vendor/assets/javascripts/languages/prism-autohotkey.js +31 -14
  26. data/vendor/assets/javascripts/languages/prism-autoit.js +16 -16
  27. data/vendor/assets/javascripts/languages/prism-avisynth.js +188 -0
  28. data/vendor/assets/javascripts/languages/prism-avro-idl.js +50 -0
  29. data/vendor/assets/javascripts/languages/prism-awk.js +32 -0
  30. data/vendor/assets/javascripts/languages/prism-bash.js +60 -22
  31. data/vendor/assets/javascripts/languages/prism-basic.js +4 -4
  32. data/vendor/assets/javascripts/languages/prism-batch.js +10 -10
  33. data/vendor/assets/javascripts/languages/prism-bbcode.js +3 -1
  34. data/vendor/assets/javascripts/languages/prism-bbj.js +19 -0
  35. data/vendor/assets/javascripts/languages/prism-bicep.js +77 -0
  36. data/vendor/assets/javascripts/languages/prism-birb.js +23 -0
  37. data/vendor/assets/javascripts/languages/prism-bison.js +2 -2
  38. data/vendor/assets/javascripts/languages/prism-bqn.js +63 -0
  39. data/vendor/assets/javascripts/languages/prism-brainfuck.js +1 -1
  40. data/vendor/assets/javascripts/languages/prism-brightscript.js +2 -2
  41. data/vendor/assets/javascripts/languages/prism-bro.js +9 -20
  42. data/vendor/assets/javascripts/languages/prism-bsl.js +75 -0
  43. data/vendor/assets/javascripts/languages/prism-c.js +53 -14
  44. data/vendor/assets/javascripts/languages/prism-cfscript.js +44 -0
  45. data/vendor/assets/javascripts/languages/prism-chaiscript.js +60 -0
  46. data/vendor/assets/javascripts/languages/prism-cil.js +5 -5
  47. data/vendor/assets/javascripts/languages/prism-cilkc.js +8 -0
  48. data/vendor/assets/javascripts/languages/prism-cilkcpp.js +9 -0
  49. data/vendor/assets/javascripts/languages/prism-clike.js +7 -6
  50. data/vendor/assets/javascripts/languages/prism-clojure.js +20 -5
  51. data/vendor/assets/javascripts/languages/prism-cmake.js +7 -7
  52. data/vendor/assets/javascripts/languages/prism-cobol.js +53 -0
  53. data/vendor/assets/javascripts/languages/prism-coffeescript.js +79 -75
  54. data/vendor/assets/javascripts/languages/prism-concurnas.js +33 -20
  55. data/vendor/assets/javascripts/languages/prism-cooklang.js +146 -0
  56. data/vendor/assets/javascripts/languages/prism-coq.js +54 -0
  57. data/vendor/assets/javascripts/languages/prism-core.js +1087 -451
  58. data/vendor/assets/javascripts/languages/prism-cpp.js +99 -21
  59. data/vendor/assets/javascripts/languages/prism-crystal.js +36 -30
  60. data/vendor/assets/javascripts/languages/prism-csharp.js +343 -58
  61. data/vendor/assets/javascripts/languages/prism-cshtml.js +199 -0
  62. data/vendor/assets/javascripts/languages/prism-csp.js +67 -16
  63. data/vendor/assets/javascripts/languages/prism-css-extras.js +27 -16
  64. data/vendor/assets/javascripts/languages/prism-css.js +28 -26
  65. data/vendor/assets/javascripts/languages/prism-csv.js +6 -0
  66. data/vendor/assets/javascripts/languages/prism-cue.js +84 -0
  67. data/vendor/assets/javascripts/languages/prism-cypher.js +36 -0
  68. data/vendor/assets/javascripts/languages/prism-d.js +15 -10
  69. data/vendor/assets/javascripts/languages/prism-dart.js +76 -21
  70. data/vendor/assets/javascripts/languages/prism-dataweave.js +41 -0
  71. data/vendor/assets/javascripts/languages/prism-dax.js +27 -0
  72. data/vendor/assets/javascripts/languages/prism-dhall.js +69 -0
  73. data/vendor/assets/javascripts/languages/prism-diff.js +15 -5
  74. data/vendor/assets/javascripts/languages/prism-django.js +8 -8
  75. data/vendor/assets/javascripts/languages/prism-dns-zone-file.js +3 -3
  76. data/vendor/assets/javascripts/languages/prism-docker.js +98 -11
  77. data/vendor/assets/javascripts/languages/prism-dot.js +76 -0
  78. data/vendor/assets/javascripts/languages/prism-ebnf.js +2 -2
  79. data/vendor/assets/javascripts/languages/prism-editorconfig.js +26 -0
  80. data/vendor/assets/javascripts/languages/prism-eiffel.js +5 -8
  81. data/vendor/assets/javascripts/languages/prism-ejs.js +4 -2
  82. data/vendor/assets/javascripts/languages/prism-elixir.js +21 -12
  83. data/vendor/assets/javascripts/languages/prism-elm.js +16 -15
  84. data/vendor/assets/javascripts/languages/prism-erb.js +12 -7
  85. data/vendor/assets/javascripts/languages/prism-erlang.js +6 -6
  86. data/vendor/assets/javascripts/languages/prism-excel-formula.js +66 -0
  87. data/vendor/assets/javascripts/languages/prism-factor.js +8 -8
  88. data/vendor/assets/javascripts/languages/prism-false.js +32 -0
  89. data/vendor/assets/javascripts/languages/prism-firestore-security-rules.js +2 -2
  90. data/vendor/assets/javascripts/languages/prism-flow.js +5 -5
  91. data/vendor/assets/javascripts/languages/prism-fortran.js +6 -6
  92. data/vendor/assets/javascripts/languages/prism-fsharp.js +20 -12
  93. data/vendor/assets/javascripts/languages/prism-ftl.js +12 -11
  94. data/vendor/assets/javascripts/languages/prism-gap.js +54 -0
  95. data/vendor/assets/javascripts/languages/prism-gcode.js +4 -3
  96. data/vendor/assets/javascripts/languages/prism-gdscript.js +2 -2
  97. data/vendor/assets/javascripts/languages/prism-gedcom.js +6 -6
  98. data/vendor/assets/javascripts/languages/prism-gettext.js +43 -0
  99. data/vendor/assets/javascripts/languages/prism-gherkin.js +7 -7
  100. data/vendor/assets/javascripts/languages/prism-git.js +3 -3
  101. data/vendor/assets/javascripts/languages/prism-glsl.js +2 -15
  102. data/vendor/assets/javascripts/languages/prism-gml.js +5 -5
  103. data/vendor/assets/javascripts/languages/prism-gn.js +51 -0
  104. data/vendor/assets/javascripts/languages/prism-go-module.js +24 -0
  105. data/vendor/assets/javascripts/languages/prism-go.js +21 -5
  106. data/vendor/assets/javascripts/languages/prism-gradle.js +63 -0
  107. data/vendor/assets/javascripts/languages/prism-graphql.js +187 -7
  108. data/vendor/assets/javascripts/languages/prism-groovy.js +56 -58
  109. data/vendor/assets/javascripts/languages/prism-haml.js +23 -16
  110. data/vendor/assets/javascripts/languages/prism-handlebars.js +10 -7
  111. data/vendor/assets/javascripts/languages/prism-haskell.js +42 -14
  112. data/vendor/assets/javascripts/languages/prism-haxe.js +54 -21
  113. data/vendor/assets/javascripts/languages/prism-hcl.js +12 -14
  114. data/vendor/assets/javascripts/languages/prism-hlsl.js +20 -0
  115. data/vendor/assets/javascripts/languages/prism-hoon.js +14 -0
  116. data/vendor/assets/javascripts/languages/prism-hpkp.js +4 -10
  117. data/vendor/assets/javascripts/languages/prism-hsts.js +4 -10
  118. data/vendor/assets/javascripts/languages/prism-http.js +91 -17
  119. data/vendor/assets/javascripts/languages/prism-ichigojam.js +5 -5
  120. data/vendor/assets/javascripts/languages/prism-icon.js +2 -2
  121. data/vendor/assets/javascripts/languages/prism-icu-message-format.js +148 -0
  122. data/vendor/assets/javascripts/languages/prism-idris.js +19 -0
  123. data/vendor/assets/javascripts/languages/prism-iecst.js +32 -0
  124. data/vendor/assets/javascripts/languages/prism-ignore.js +23 -0
  125. data/vendor/assets/javascripts/languages/prism-inform7.js +10 -10
  126. data/vendor/assets/javascripts/languages/prism-ini.js +39 -8
  127. data/vendor/assets/javascripts/languages/prism-io.js +10 -19
  128. data/vendor/assets/javascripts/languages/prism-j.js +7 -4
  129. data/vendor/assets/javascripts/languages/prism-java.js +80 -19
  130. data/vendor/assets/javascripts/languages/prism-javadoc.js +59 -31
  131. data/vendor/assets/javascripts/languages/prism-javadoclike.js +2 -2
  132. data/vendor/assets/javascripts/languages/prism-javascript.js +98 -17
  133. data/vendor/assets/javascripts/languages/prism-javastacktrace.js +63 -14
  134. data/vendor/assets/javascripts/languages/prism-jexl.js +14 -0
  135. data/vendor/assets/javascripts/languages/prism-jolie.js +23 -37
  136. data/vendor/assets/javascripts/languages/prism-jq.js +8 -6
  137. data/vendor/assets/javascripts/languages/prism-js-extras.js +34 -3
  138. data/vendor/assets/javascripts/languages/prism-js-templates.js +5 -2
  139. data/vendor/assets/javascripts/languages/prism-jsdoc.js +15 -10
  140. data/vendor/assets/javascripts/languages/prism-json.js +13 -5
  141. data/vendor/assets/javascripts/languages/prism-json5.js +3 -3
  142. data/vendor/assets/javascripts/languages/prism-jsonp.js +1 -1
  143. data/vendor/assets/javascripts/languages/prism-jsstacktrace.js +49 -0
  144. data/vendor/assets/javascripts/languages/prism-jsx.js +123 -104
  145. data/vendor/assets/javascripts/languages/prism-julia.js +31 -9
  146. data/vendor/assets/javascripts/languages/prism-keepalived.js +51 -0
  147. data/vendor/assets/javascripts/languages/prism-keyman.js +43 -13
  148. data/vendor/assets/javascripts/languages/prism-kotlin.js +56 -30
  149. data/vendor/assets/javascripts/languages/prism-kumir.js +106 -0
  150. data/vendor/assets/javascripts/languages/prism-kusto.js +44 -0
  151. data/vendor/assets/javascripts/languages/prism-latex.js +6 -6
  152. data/vendor/assets/javascripts/languages/prism-latte.js +11 -17
  153. data/vendor/assets/javascripts/languages/prism-less.js +5 -5
  154. data/vendor/assets/javascripts/languages/prism-lilypond.js +3 -3
  155. data/vendor/assets/javascripts/languages/prism-linker-script.js +30 -0
  156. data/vendor/assets/javascripts/languages/prism-liquid.js +62 -8
  157. data/vendor/assets/javascripts/languages/prism-lisp.js +41 -41
  158. data/vendor/assets/javascripts/languages/prism-livescript.js +3 -3
  159. data/vendor/assets/javascripts/languages/prism-llvm.js +19 -0
  160. data/vendor/assets/javascripts/languages/prism-log.js +120 -0
  161. data/vendor/assets/javascripts/languages/prism-lolcode.js +9 -9
  162. data/vendor/assets/javascripts/languages/prism-lua.js +3 -3
  163. data/vendor/assets/javascripts/languages/prism-magma.js +35 -0
  164. data/vendor/assets/javascripts/languages/prism-makefile.js +17 -17
  165. data/vendor/assets/javascripts/languages/prism-markdown.js +103 -32
  166. data/vendor/assets/javascripts/languages/prism-markup-templating.js +2 -1
  167. data/vendor/assets/javascripts/languages/prism-markup.js +95 -12
  168. data/vendor/assets/javascripts/languages/prism-mata.js +50 -0
  169. data/vendor/assets/javascripts/languages/prism-matlab.js +4 -4
  170. data/vendor/assets/javascripts/languages/prism-maxscript.js +91 -0
  171. data/vendor/assets/javascripts/languages/prism-mel.js +24 -21
  172. data/vendor/assets/javascripts/languages/prism-mermaid.js +113 -0
  173. data/vendor/assets/javascripts/languages/prism-metafont.js +84 -0
  174. data/vendor/assets/javascripts/languages/prism-mizar.js +3 -3
  175. data/vendor/assets/javascripts/languages/prism-mongodb.js +97 -0
  176. data/vendor/assets/javascripts/languages/prism-monkey.js +16 -18
  177. data/vendor/assets/javascripts/languages/prism-moonscript.js +1 -1
  178. data/vendor/assets/javascripts/languages/prism-n1ql.js +14 -8
  179. data/vendor/assets/javascripts/languages/prism-n4js.js +2 -2
  180. data/vendor/assets/javascripts/languages/prism-nand2tetris-hdl.js +3 -3
  181. data/vendor/assets/javascripts/languages/prism-naniscript.js +170 -0
  182. data/vendor/assets/javascripts/languages/prism-nasm.js +4 -4
  183. data/vendor/assets/javascripts/languages/prism-neon.js +5 -6
  184. data/vendor/assets/javascripts/languages/prism-nevod.js +125 -0
  185. data/vendor/assets/javascripts/languages/prism-nginx.js +54 -11
  186. data/vendor/assets/javascripts/languages/prism-nim.js +23 -12
  187. data/vendor/assets/javascripts/languages/prism-nix.js +10 -13
  188. data/vendor/assets/javascripts/languages/prism-nsis.js +10 -9
  189. data/vendor/assets/javascripts/languages/prism-objectivec.js +7 -2
  190. data/vendor/assets/javascripts/languages/prism-ocaml.js +32 -15
  191. data/vendor/assets/javascripts/languages/prism-odin.js +99 -0
  192. data/vendor/assets/javascripts/languages/prism-opencl.js +19 -12
  193. data/vendor/assets/javascripts/languages/prism-openqasm.js +23 -0
  194. data/vendor/assets/javascripts/languages/prism-oz.js +11 -8
  195. data/vendor/assets/javascripts/languages/prism-parigp.js +4 -4
  196. data/vendor/assets/javascripts/languages/prism-parser.js +3 -3
  197. data/vendor/assets/javascripts/languages/prism-pascal.js +24 -8
  198. data/vendor/assets/javascripts/languages/prism-pascaligo.js +7 -7
  199. data/vendor/assets/javascripts/languages/prism-pcaxis.js +2 -2
  200. data/vendor/assets/javascripts/languages/prism-peoplecode.js +42 -0
  201. data/vendor/assets/javascripts/languages/prism-perl.js +153 -188
  202. data/vendor/assets/javascripts/languages/prism-php-extras.js +8 -5
  203. data/vendor/assets/javascripts/languages/prism-php.js +275 -63
  204. data/vendor/assets/javascripts/languages/prism-phpdoc.js +1 -1
  205. data/vendor/assets/javascripts/languages/prism-plant-uml.js +103 -0
  206. data/vendor/assets/javascripts/languages/prism-plsql.js +16 -25
  207. data/vendor/assets/javascripts/languages/prism-powerquery.js +55 -0
  208. data/vendor/assets/javascripts/languages/prism-powershell.js +16 -18
  209. data/vendor/assets/javascripts/languages/prism-processing.js +6 -9
  210. data/vendor/assets/javascripts/languages/prism-prolog.js +7 -8
  211. data/vendor/assets/javascripts/languages/prism-promql.js +99 -0
  212. data/vendor/assets/javascripts/languages/prism-properties.js +9 -5
  213. data/vendor/assets/javascripts/languages/prism-protobuf.js +16 -9
  214. data/vendor/assets/javascripts/languages/prism-psl.js +35 -0
  215. data/vendor/assets/javascripts/languages/prism-pug.js +28 -21
  216. data/vendor/assets/javascripts/languages/prism-puppet.js +6 -6
  217. data/vendor/assets/javascripts/languages/prism-pure.js +9 -6
  218. data/vendor/assets/javascripts/languages/prism-purebasic.js +70 -0
  219. data/vendor/assets/javascripts/languages/prism-purescript.js +31 -0
  220. data/vendor/assets/javascripts/languages/prism-python.js +12 -11
  221. data/vendor/assets/javascripts/languages/prism-q.js +4 -4
  222. data/vendor/assets/javascripts/languages/prism-qml.js +9 -6
  223. data/vendor/assets/javascripts/languages/prism-qore.js +5 -5
  224. data/vendor/assets/javascripts/languages/prism-qsharp.js +132 -0
  225. data/vendor/assets/javascripts/languages/prism-r.js +5 -5
  226. data/vendor/assets/javascripts/languages/prism-racket.js +18 -0
  227. data/vendor/assets/javascripts/languages/prism-reason.js +5 -8
  228. data/vendor/assets/javascripts/languages/prism-regex.js +54 -47
  229. data/vendor/assets/javascripts/languages/prism-rego.js +30 -0
  230. data/vendor/assets/javascripts/languages/prism-renpy.js +12 -12
  231. data/vendor/assets/javascripts/languages/prism-rescript.js +60 -0
  232. data/vendor/assets/javascripts/languages/prism-rest.js +16 -16
  233. data/vendor/assets/javascripts/languages/prism-rip.js +22 -16
  234. data/vendor/assets/javascripts/languages/prism-roboconf.js +3 -3
  235. data/vendor/assets/javascripts/languages/prism-robotframework.js +5 -5
  236. data/vendor/assets/javascripts/languages/prism-ruby.js +127 -88
  237. data/vendor/assets/javascripts/languages/prism-rust.js +120 -60
  238. data/vendor/assets/javascripts/languages/prism-sas.js +62 -38
  239. data/vendor/assets/javascripts/languages/prism-sass.js +15 -10
  240. data/vendor/assets/javascripts/languages/prism-scala.js +36 -3
  241. data/vendor/assets/javascripts/languages/prism-scheme.js +120 -33
  242. data/vendor/assets/javascripts/languages/prism-scss.js +11 -7
  243. data/vendor/assets/javascripts/languages/prism-shell-session.js +42 -26
  244. data/vendor/assets/javascripts/languages/prism-smali.js +87 -0
  245. data/vendor/assets/javascripts/languages/prism-smalltalk.js +12 -5
  246. data/vendor/assets/javascripts/languages/prism-smarty.js +91 -47
  247. data/vendor/assets/javascripts/languages/prism-sml.js +68 -0
  248. data/vendor/assets/javascripts/languages/prism-solidity.js +3 -1
  249. data/vendor/assets/javascripts/languages/prism-solution-file.js +2 -2
  250. data/vendor/assets/javascripts/languages/prism-soy.js +9 -9
  251. data/vendor/assets/javascripts/languages/prism-sparql.js +8 -8
  252. data/vendor/assets/javascripts/languages/prism-splunk-spl.js +3 -3
  253. data/vendor/assets/javascripts/languages/prism-sqf.js +7 -7
  254. data/vendor/assets/javascripts/languages/prism-sql.js +12 -4
  255. data/vendor/assets/javascripts/languages/prism-squirrel.js +47 -0
  256. data/vendor/assets/javascripts/languages/prism-stan.js +65 -0
  257. data/vendor/assets/javascripts/languages/prism-stata.js +76 -0
  258. data/vendor/assets/javascripts/languages/prism-stylus.js +48 -16
  259. data/vendor/assets/javascripts/languages/prism-supercollider.js +36 -0
  260. data/vendor/assets/javascripts/languages/prism-swift.js +143 -20
  261. data/vendor/assets/javascripts/languages/prism-systemd.js +74 -0
  262. data/vendor/assets/javascripts/languages/prism-t4-templating.js +2 -2
  263. data/vendor/assets/javascripts/languages/prism-t4-vb.js +1 -1
  264. data/vendor/assets/javascripts/languages/prism-tap.js +13 -11
  265. data/vendor/assets/javascripts/languages/prism-tcl.js +8 -8
  266. data/vendor/assets/javascripts/languages/prism-textile.js +55 -29
  267. data/vendor/assets/javascripts/languages/prism-toml.js +14 -8
  268. data/vendor/assets/javascripts/languages/prism-tremor.js +72 -0
  269. data/vendor/assets/javascripts/languages/prism-tsx.js +15 -2
  270. data/vendor/assets/javascripts/languages/prism-tt2.js +7 -7
  271. data/vendor/assets/javascripts/languages/prism-turtle.js +4 -4
  272. data/vendor/assets/javascripts/languages/prism-twig.js +38 -40
  273. data/vendor/assets/javascripts/languages/prism-typescript.js +59 -6
  274. data/vendor/assets/javascripts/languages/prism-typoscript.js +80 -0
  275. data/vendor/assets/javascripts/languages/prism-unrealscript.js +42 -0
  276. data/vendor/assets/javascripts/languages/prism-uorazor.js +48 -0
  277. data/vendor/assets/javascripts/languages/prism-uri.js +96 -0
  278. data/vendor/assets/javascripts/languages/prism-v.js +81 -0
  279. data/vendor/assets/javascripts/languages/prism-vala.js +20 -10
  280. data/vendor/assets/javascripts/languages/prism-vbnet.js +11 -4
  281. data/vendor/assets/javascripts/languages/prism-velocity.js +6 -6
  282. data/vendor/assets/javascripts/languages/prism-verilog.js +14 -8
  283. data/vendor/assets/javascripts/languages/prism-vhdl.js +7 -4
  284. data/vendor/assets/javascripts/languages/prism-vim.js +4 -4
  285. data/vendor/assets/javascripts/languages/prism-visual-basic.js +9 -14
  286. data/vendor/assets/javascripts/languages/prism-warpscript.js +21 -0
  287. data/vendor/assets/javascripts/languages/prism-wasm.js +3 -3
  288. data/vendor/assets/javascripts/languages/prism-web-idl.js +101 -0
  289. data/vendor/assets/javascripts/languages/prism-wgsl.js +69 -0
  290. data/vendor/assets/javascripts/languages/prism-wiki.js +4 -4
  291. data/vendor/assets/javascripts/languages/prism-wolfram.js +29 -0
  292. data/vendor/assets/javascripts/languages/prism-wren.js +100 -0
  293. data/vendor/assets/javascripts/languages/prism-xeora.js +8 -8
  294. data/vendor/assets/javascripts/languages/prism-xml-doc.js +40 -0
  295. data/vendor/assets/javascripts/languages/prism-xojo.js +9 -8
  296. data/vendor/assets/javascripts/languages/prism-xquery.js +7 -7
  297. data/vendor/assets/javascripts/languages/prism-yaml.js +19 -12
  298. data/vendor/assets/javascripts/languages/prism-yang.js +20 -0
  299. data/vendor/assets/javascripts/languages/prism-zig.js +19 -15
  300. data/vendor/assets/javascripts/prism-plugin/prism-autolinker.js +60 -65
  301. data/vendor/assets/javascripts/prism-plugin/prism-autoloader.js +199 -67
  302. data/vendor/assets/javascripts/prism-plugin/prism-command-line.js +212 -112
  303. data/vendor/assets/javascripts/prism-plugin/prism-copy-to-clipboard.js +128 -43
  304. data/vendor/assets/javascripts/prism-plugin/prism-custom-class.js +23 -8
  305. data/vendor/assets/javascripts/prism-plugin/prism-data-uri-highlight.js +2 -6
  306. data/vendor/assets/javascripts/prism-plugin/prism-diff-highlight.js +19 -12
  307. data/vendor/assets/javascripts/prism-plugin/prism-download-button.js +3 -2
  308. data/vendor/assets/javascripts/prism-plugin/prism-file-highlight.js +169 -63
  309. data/vendor/assets/javascripts/prism-plugin/prism-filter-highlight-all.js +5 -3
  310. data/vendor/assets/javascripts/prism-plugin/prism-highlight-keywords.js +10 -13
  311. data/vendor/assets/javascripts/prism-plugin/prism-inline-color.js +29 -12
  312. data/vendor/assets/javascripts/prism-plugin/prism-jsonp-highlight.js +179 -82
  313. data/vendor/assets/javascripts/prism-plugin/prism-keep-markup.js +53 -26
  314. data/vendor/assets/javascripts/prism-plugin/prism-line-highlight.js +217 -84
  315. data/vendor/assets/javascripts/prism-plugin/prism-line-numbers.js +152 -68
  316. data/vendor/assets/javascripts/prism-plugin/prism-match-braces.js +53 -47
  317. data/vendor/assets/javascripts/prism-plugin/prism-normalize-whitespace.js +203 -164
  318. data/vendor/assets/javascripts/prism-plugin/prism-previewers.js +61 -52
  319. data/vendor/assets/javascripts/prism-plugin/prism-remove-initial-line-feed.js +16 -16
  320. data/vendor/assets/javascripts/prism-plugin/prism-show-invisibles.js +4 -5
  321. data/vendor/assets/javascripts/prism-plugin/prism-show-language.js +147 -21
  322. data/vendor/assets/javascripts/prism-plugin/prism-toolbar.js +9 -8
  323. data/vendor/assets/javascripts/prism-plugin/prism-treeview.js +70 -0
  324. data/vendor/assets/javascripts/prism-plugin/prism-unescaped-markup.js +41 -23
  325. data/vendor/assets/javascripts/prism-plugin/prism-wpd.js +133 -148
  326. data/vendor/assets/javascripts/prism.js +96 -4
  327. data/vendor/assets/stylesheets/prism-plugin/prism-autolinker.min.css +1 -0
  328. data/vendor/assets/stylesheets/prism-plugin/prism-command-line.css +11 -1
  329. data/vendor/assets/stylesheets/prism-plugin/prism-command-line.min.css +1 -0
  330. data/vendor/assets/stylesheets/prism-plugin/prism-diff-highlight.min.css +1 -0
  331. data/vendor/assets/stylesheets/prism-plugin/prism-inline-color.css +26 -2
  332. data/vendor/assets/stylesheets/prism-plugin/prism-inline-color.min.css +1 -0
  333. data/vendor/assets/stylesheets/prism-plugin/prism-line-highlight.css +21 -0
  334. data/vendor/assets/stylesheets/prism-plugin/prism-line-highlight.min.css +1 -0
  335. data/vendor/assets/stylesheets/prism-plugin/prism-line-numbers.css +0 -1
  336. data/vendor/assets/stylesheets/prism-plugin/prism-line-numbers.min.css +1 -0
  337. data/vendor/assets/stylesheets/prism-plugin/prism-match-braces.min.css +1 -0
  338. data/vendor/assets/stylesheets/prism-plugin/prism-previewers.css +1 -0
  339. data/vendor/assets/stylesheets/prism-plugin/prism-previewers.min.css +1 -0
  340. data/vendor/assets/stylesheets/prism-plugin/prism-show-invisibles.min.css +1 -0
  341. data/vendor/assets/stylesheets/prism-plugin/prism-toolbar.css +13 -12
  342. data/vendor/assets/stylesheets/prism-plugin/prism-toolbar.min.css +1 -0
  343. data/vendor/assets/stylesheets/prism-plugin/prism-treeview.css +168 -0
  344. data/vendor/assets/stylesheets/prism-plugin/prism-treeview.min.css +1 -0
  345. data/vendor/assets/stylesheets/prism-plugin/prism-unescaped-markup.min.css +1 -0
  346. data/vendor/assets/stylesheets/prism-plugin/prism-wpd.min.css +1 -0
  347. data/vendor/assets/stylesheets/prism-theme/prism-base16-ateliersulphurpool.light.css +3 -3
  348. data/vendor/assets/stylesheets/prism-theme/prism-cb.css +5 -35
  349. data/vendor/assets/stylesheets/prism-theme/prism-coldark-cold.css +317 -0
  350. data/vendor/assets/stylesheets/prism-theme/prism-coldark-dark.css +317 -0
  351. data/vendor/assets/stylesheets/prism-theme/prism-coy-without-shadows.css +140 -0
  352. data/vendor/assets/stylesheets/prism-theme/prism-coy.css +5 -12
  353. data/vendor/assets/stylesheets/prism-theme/prism-coy.min.css +1 -0
  354. data/vendor/assets/stylesheets/prism-theme/prism-dark.min.css +1 -0
  355. data/vendor/assets/stylesheets/prism-theme/prism-duotone-dark.css +3 -3
  356. data/vendor/assets/stylesheets/prism-theme/prism-duotone-earth.css +3 -3
  357. data/vendor/assets/stylesheets/prism-theme/prism-duotone-forest.css +3 -3
  358. data/vendor/assets/stylesheets/prism-theme/prism-duotone-light.css +3 -3
  359. data/vendor/assets/stylesheets/prism-theme/prism-duotone-sea.css +3 -3
  360. data/vendor/assets/stylesheets/prism-theme/prism-duotone-space.css +3 -3
  361. data/vendor/assets/stylesheets/prism-theme/prism-funky.min.css +1 -0
  362. data/vendor/assets/stylesheets/prism-theme/prism-gruvbox-dark.css +143 -0
  363. data/vendor/assets/stylesheets/prism-theme/prism-gruvbox-light.css +143 -0
  364. data/vendor/assets/stylesheets/prism-theme/prism-holi-theme.css +119 -0
  365. data/vendor/assets/stylesheets/prism-theme/prism-laserwave.css +133 -0
  366. data/vendor/assets/stylesheets/prism-theme/prism-lucario.css +122 -0
  367. data/vendor/assets/stylesheets/prism-theme/prism-night-owl.css +158 -0
  368. data/vendor/assets/stylesheets/prism-theme/prism-okaidia.css +1 -1
  369. data/vendor/assets/stylesheets/prism-theme/prism-okaidia.min.css +1 -0
  370. data/vendor/assets/stylesheets/prism-theme/prism-one-dark.css +440 -0
  371. data/vendor/assets/stylesheets/prism-theme/prism-one-light.css +428 -0
  372. data/vendor/assets/stylesheets/prism-theme/prism-shades-of-purple.css +3 -7
  373. data/vendor/assets/stylesheets/prism-theme/prism-solarized-dark-atom.css +143 -0
  374. data/vendor/assets/stylesheets/prism-theme/prism-solarizedlight.min.css +1 -0
  375. data/vendor/assets/stylesheets/prism-theme/prism-tomorrow.min.css +1 -0
  376. data/vendor/assets/stylesheets/prism-theme/prism-twilight.css +3 -33
  377. data/vendor/assets/stylesheets/prism-theme/prism-twilight.min.css +1 -0
  378. data/vendor/assets/stylesheets/prism-theme/prism-vs.css +7 -3
  379. data/vendor/assets/stylesheets/prism-theme/prism-vsc-dark-plus.css +108 -49
  380. data/vendor/assets/stylesheets/prism-theme/prism-xonokai.css +3 -30
  381. data/vendor/assets/stylesheets/prism-theme/prism-z-touch.css +160 -0
  382. data/vendor/assets/stylesheets/prism.css +1 -0
  383. metadata +133 -6
@@ -1,337 +1,919 @@
1
+ /// <reference lib="WebWorker"/>
2
+
1
3
  var _self = (typeof window !== 'undefined')
2
4
  ? window // if in browser
3
5
  : (
4
6
  (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
5
- ? self // if in worker
6
- : {} // if in node js
7
+ ? self // if in worker
8
+ : {} // if in node js
7
9
  );
8
10
 
9
11
  /**
10
12
  * Prism: Lightweight, robust, elegant syntax highlighting
11
- * MIT license http://www.opensource.org/licenses/mit-license.php/
12
- * @author Lea Verou http://lea.verou.me
13
+ *
14
+ * @license MIT <https://opensource.org/licenses/MIT>
15
+ * @author Lea Verou <https://lea.verou.me>
16
+ * @namespace
17
+ * @public
13
18
  */
19
+ var Prism = (function (_self) {
14
20
 
15
- var Prism = (function (_self){
21
+ // Private helper vars
22
+ var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i;
23
+ var uniqueId = 0;
16
24
 
17
- // Private helper vars
18
- var lang = /\blang(?:uage)?-([\w-]+)\b/i;
19
- var uniqueId = 0;
25
+ // The grammar object for plaintext
26
+ var plainTextGrammar = {};
20
27
 
21
28
 
22
- var _ = {
23
- manual: _self.Prism && _self.Prism.manual,
24
- disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,
25
- util: {
26
- encode: function encode(tokens) {
27
- if (tokens instanceof Token) {
28
- return new Token(tokens.type, encode(tokens.content), tokens.alias);
29
- } else if (Array.isArray(tokens)) {
30
- return tokens.map(encode);
31
- } else {
32
- return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
33
- }
34
- },
29
+ var _ = {
30
+ /**
31
+ * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the
32
+ * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load
33
+ * additional languages or plugins yourself.
34
+ *
35
+ * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.
36
+ *
37
+ * You obviously have to change this value before the automatic highlighting started. To do this, you can add an
38
+ * empty Prism object into the global scope before loading the Prism script like this:
39
+ *
40
+ * ```js
41
+ * window.Prism = window.Prism || {};
42
+ * Prism.manual = true;
43
+ * // add a new <script> to load Prism's script
44
+ * ```
45
+ *
46
+ * @default false
47
+ * @type {boolean}
48
+ * @memberof Prism
49
+ * @public
50
+ */
51
+ manual: _self.Prism && _self.Prism.manual,
52
+ /**
53
+ * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses
54
+ * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your
55
+ * own worker, you don't want it to do this.
56
+ *
57
+ * By setting this value to `true`, Prism will not add its own listeners to the worker.
58
+ *
59
+ * You obviously have to change this value before Prism executes. To do this, you can add an
60
+ * empty Prism object into the global scope before loading the Prism script like this:
61
+ *
62
+ * ```js
63
+ * window.Prism = window.Prism || {};
64
+ * Prism.disableWorkerMessageHandler = true;
65
+ * // Load Prism's script
66
+ * ```
67
+ *
68
+ * @default false
69
+ * @type {boolean}
70
+ * @memberof Prism
71
+ * @public
72
+ */
73
+ disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,
35
74
 
36
- type: function (o) {
37
- return Object.prototype.toString.call(o).slice(8, -1);
38
- },
75
+ /**
76
+ * A namespace for utility methods.
77
+ *
78
+ * All function in this namespace that are not explicitly marked as _public_ are for __internal use only__ and may
79
+ * change or disappear at any time.
80
+ *
81
+ * @namespace
82
+ * @memberof Prism
83
+ */
84
+ util: {
85
+ encode: function encode(tokens) {
86
+ if (tokens instanceof Token) {
87
+ return new Token(tokens.type, encode(tokens.content), tokens.alias);
88
+ } else if (Array.isArray(tokens)) {
89
+ return tokens.map(encode);
90
+ } else {
91
+ return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
92
+ }
93
+ },
94
+
95
+ /**
96
+ * Returns the name of the type of the given value.
97
+ *
98
+ * @param {any} o
99
+ * @returns {string}
100
+ * @example
101
+ * type(null) === 'Null'
102
+ * type(undefined) === 'Undefined'
103
+ * type(123) === 'Number'
104
+ * type('foo') === 'String'
105
+ * type(true) === 'Boolean'
106
+ * type([1, 2]) === 'Array'
107
+ * type({}) === 'Object'
108
+ * type(String) === 'Function'
109
+ * type(/abc+/) === 'RegExp'
110
+ */
111
+ type: function (o) {
112
+ return Object.prototype.toString.call(o).slice(8, -1);
113
+ },
114
+
115
+ /**
116
+ * Returns a unique number for the given object. Later calls will still return the same number.
117
+ *
118
+ * @param {Object} obj
119
+ * @returns {number}
120
+ */
121
+ objId: function (obj) {
122
+ if (!obj['__id']) {
123
+ Object.defineProperty(obj, '__id', { value: ++uniqueId });
124
+ }
125
+ return obj['__id'];
126
+ },
127
+
128
+ /**
129
+ * Creates a deep clone of the given object.
130
+ *
131
+ * The main intended use of this function is to clone language definitions.
132
+ *
133
+ * @param {T} o
134
+ * @param {Record<number, any>} [visited]
135
+ * @returns {T}
136
+ * @template T
137
+ */
138
+ clone: function deepClone(o, visited) {
139
+ visited = visited || {};
140
+
141
+ var clone; var id;
142
+ switch (_.util.type(o)) {
143
+ case 'Object':
144
+ id = _.util.objId(o);
145
+ if (visited[id]) {
146
+ return visited[id];
147
+ }
148
+ clone = /** @type {Record<string, any>} */ ({});
149
+ visited[id] = clone;
150
+
151
+ for (var key in o) {
152
+ if (o.hasOwnProperty(key)) {
153
+ clone[key] = deepClone(o[key], visited);
154
+ }
155
+ }
156
+
157
+ return /** @type {any} */ (clone);
158
+
159
+ case 'Array':
160
+ id = _.util.objId(o);
161
+ if (visited[id]) {
162
+ return visited[id];
163
+ }
164
+ clone = [];
165
+ visited[id] = clone;
166
+
167
+ (/** @type {Array} */(/** @type {any} */(o))).forEach(function (v, i) {
168
+ clone[i] = deepClone(v, visited);
169
+ });
39
170
 
40
- objId: function (obj) {
41
- if (!obj['__id']) {
42
- Object.defineProperty(obj, '__id', { value: ++uniqueId });
171
+ return /** @type {any} */ (clone);
172
+
173
+ default:
174
+ return o;
175
+ }
176
+ },
177
+
178
+ /**
179
+ * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.
180
+ *
181
+ * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.
182
+ *
183
+ * @param {Element} element
184
+ * @returns {string}
185
+ */
186
+ getLanguage: function (element) {
187
+ while (element) {
188
+ var m = lang.exec(element.className);
189
+ if (m) {
190
+ return m[1].toLowerCase();
191
+ }
192
+ element = element.parentElement;
193
+ }
194
+ return 'none';
195
+ },
196
+
197
+ /**
198
+ * Sets the Prism `language-xxxx` class of the given element.
199
+ *
200
+ * @param {Element} element
201
+ * @param {string} language
202
+ * @returns {void}
203
+ */
204
+ setLanguage: function (element, language) {
205
+ // remove all `language-xxxx` classes
206
+ // (this might leave behind a leading space)
207
+ element.className = element.className.replace(RegExp(lang, 'gi'), '');
208
+
209
+ // add the new `language-xxxx` class
210
+ // (using `classList` will automatically clean up spaces for us)
211
+ element.classList.add('language-' + language);
212
+ },
213
+
214
+ /**
215
+ * Returns the script element that is currently executing.
216
+ *
217
+ * This does __not__ work for line script element.
218
+ *
219
+ * @returns {HTMLScriptElement | null}
220
+ */
221
+ currentScript: function () {
222
+ if (typeof document === 'undefined') {
223
+ return null;
224
+ }
225
+ if ('currentScript' in document && 1 < 2 /* hack to trip TS' flow analysis */) {
226
+ return /** @type {any} */ (document.currentScript);
227
+ }
228
+
229
+ // IE11 workaround
230
+ // we'll get the src of the current script by parsing IE11's error stack trace
231
+ // this will not work for inline scripts
232
+
233
+ try {
234
+ throw new Error();
235
+ } catch (err) {
236
+ // Get file src url from stack. Specifically works with the format of stack traces in IE.
237
+ // A stack will look like this:
238
+ //
239
+ // Error
240
+ // at _.util.currentScript (http://localhost/components/prism-core.js:119:5)
241
+ // at Global code (http://localhost/components/prism-core.js:606:1)
242
+
243
+ var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1];
244
+ if (src) {
245
+ var scripts = document.getElementsByTagName('script');
246
+ for (var i in scripts) {
247
+ if (scripts[i].src == src) {
248
+ return scripts[i];
249
+ }
250
+ }
251
+ }
252
+ return null;
253
+ }
254
+ },
255
+
256
+ /**
257
+ * Returns whether a given class is active for `element`.
258
+ *
259
+ * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated
260
+ * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the
261
+ * given class is just the given class with a `no-` prefix.
262
+ *
263
+ * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is
264
+ * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its
265
+ * ancestors have the given class or the negated version of it, then the default activation will be returned.
266
+ *
267
+ * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated
268
+ * version of it, the class is considered active.
269
+ *
270
+ * @param {Element} element
271
+ * @param {string} className
272
+ * @param {boolean} [defaultActivation=false]
273
+ * @returns {boolean}
274
+ */
275
+ isActive: function (element, className, defaultActivation) {
276
+ var no = 'no-' + className;
277
+
278
+ while (element) {
279
+ var classList = element.classList;
280
+ if (classList.contains(className)) {
281
+ return true;
282
+ }
283
+ if (classList.contains(no)) {
284
+ return false;
285
+ }
286
+ element = element.parentElement;
287
+ }
288
+ return !!defaultActivation;
43
289
  }
44
- return obj['__id'];
45
290
  },
46
291
 
47
- // Deep clone a language definition (e.g. to extend it)
48
- clone: function deepClone(o, visited) {
49
- var clone, id, type = _.util.type(o);
50
- visited = visited || {};
292
+ /**
293
+ * This namespace contains all currently loaded languages and the some helper functions to create and modify languages.
294
+ *
295
+ * @namespace
296
+ * @memberof Prism
297
+ * @public
298
+ */
299
+ languages: {
300
+ /**
301
+ * The grammar for plain, unformatted text.
302
+ */
303
+ plain: plainTextGrammar,
304
+ plaintext: plainTextGrammar,
305
+ text: plainTextGrammar,
306
+ txt: plainTextGrammar,
307
+
308
+ /**
309
+ * Creates a deep copy of the language with the given id and appends the given tokens.
310
+ *
311
+ * If a token in `redef` also appears in the copied language, then the existing token in the copied language
312
+ * will be overwritten at its original position.
313
+ *
314
+ * ## Best practices
315
+ *
316
+ * Since the position of overwriting tokens (token in `redef` that overwrite tokens in the copied language)
317
+ * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to
318
+ * understand the language definition because, normally, the order of tokens matters in Prism grammars.
319
+ *
320
+ * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens.
321
+ * Furthermore, all non-overwriting tokens should be placed after the overwriting ones.
322
+ *
323
+ * @param {string} id The id of the language to extend. This has to be a key in `Prism.languages`.
324
+ * @param {Grammar} redef The new tokens to append.
325
+ * @returns {Grammar} The new language created.
326
+ * @public
327
+ * @example
328
+ * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {
329
+ * // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token
330
+ * // at its original position
331
+ * 'comment': { ... },
332
+ * // CSS doesn't have a 'color' token, so this token will be appended
333
+ * 'color': /\b(?:red|green|blue)\b/
334
+ * });
335
+ */
336
+ extend: function (id, redef) {
337
+ var lang = _.util.clone(_.languages[id]);
338
+
339
+ for (var key in redef) {
340
+ lang[key] = redef[key];
341
+ }
51
342
 
52
- switch (type) {
53
- case 'Object':
54
- id = _.util.objId(o);
55
- if (visited[id]) {
56
- return visited[id];
57
- }
58
- clone = {};
59
- visited[id] = clone;
343
+ return lang;
344
+ },
345
+
346
+ /**
347
+ * Inserts tokens _before_ another token in a language definition or any other grammar.
348
+ *
349
+ * ## Usage
350
+ *
351
+ * This helper method makes it easy to modify existing languages. For example, the CSS language definition
352
+ * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded
353
+ * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the
354
+ * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do
355
+ * this:
356
+ *
357
+ * ```js
358
+ * Prism.languages.markup.style = {
359
+ * // token
360
+ * };
361
+ * ```
362
+ *
363
+ * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens
364
+ * before existing tokens. For the CSS example above, you would use it like this:
365
+ *
366
+ * ```js
367
+ * Prism.languages.insertBefore('markup', 'cdata', {
368
+ * 'style': {
369
+ * // token
370
+ * }
371
+ * });
372
+ * ```
373
+ *
374
+ * ## Special cases
375
+ *
376
+ * If the grammars of `inside` and `insert` have tokens with the same name, the tokens in `inside`'s grammar
377
+ * will be ignored.
378
+ *
379
+ * This behavior can be used to insert tokens after `before`:
380
+ *
381
+ * ```js
382
+ * Prism.languages.insertBefore('markup', 'comment', {
383
+ * 'comment': Prism.languages.markup.comment,
384
+ * // tokens after 'comment'
385
+ * });
386
+ * ```
387
+ *
388
+ * ## Limitations
389
+ *
390
+ * The main problem `insertBefore` has to solve is iteration order. Since ES2015, the iteration order for object
391
+ * properties is guaranteed to be the insertion order (except for integer keys) but some browsers behave
392
+ * differently when keys are deleted and re-inserted. So `insertBefore` can't be implemented by temporarily
393
+ * deleting properties which is necessary to insert at arbitrary positions.
394
+ *
395
+ * To solve this problem, `insertBefore` doesn't actually insert the given tokens into the target object.
396
+ * Instead, it will create a new object and replace all references to the target object with the new one. This
397
+ * can be done without temporarily deleting properties, so the iteration order is well-defined.
398
+ *
399
+ * However, only references that can be reached from `Prism.languages` or `insert` will be replaced. I.e. if
400
+ * you hold the target object in a variable, then the value of the variable will not change.
401
+ *
402
+ * ```js
403
+ * var oldMarkup = Prism.languages.markup;
404
+ * var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });
405
+ *
406
+ * assert(oldMarkup !== Prism.languages.markup);
407
+ * assert(newMarkup === Prism.languages.markup);
408
+ * ```
409
+ *
410
+ * @param {string} inside The property of `root` (e.g. a language id in `Prism.languages`) that contains the
411
+ * object to be modified.
412
+ * @param {string} before The key to insert before.
413
+ * @param {Grammar} insert An object containing the key-value pairs to be inserted.
414
+ * @param {Object<string, any>} [root] The object containing `inside`, i.e. the object that contains the
415
+ * object to be modified.
416
+ *
417
+ * Defaults to `Prism.languages`.
418
+ * @returns {Grammar} The new grammar object.
419
+ * @public
420
+ */
421
+ insertBefore: function (inside, before, insert, root) {
422
+ root = root || /** @type {any} */ (_.languages);
423
+ var grammar = root[inside];
424
+ /** @type {Grammar} */
425
+ var ret = {};
426
+
427
+ for (var token in grammar) {
428
+ if (grammar.hasOwnProperty(token)) {
429
+
430
+ if (token == before) {
431
+ for (var newToken in insert) {
432
+ if (insert.hasOwnProperty(newToken)) {
433
+ ret[newToken] = insert[newToken];
434
+ }
435
+ }
436
+ }
60
437
 
61
- for (var key in o) {
62
- if (o.hasOwnProperty(key)) {
63
- clone[key] = deepClone(o[key], visited);
438
+ // Do not insert token which also occur in insert. See #1525
439
+ if (!insert.hasOwnProperty(token)) {
440
+ ret[token] = grammar[token];
64
441
  }
65
442
  }
443
+ }
66
444
 
67
- return clone;
445
+ var old = root[inside];
446
+ root[inside] = ret;
68
447
 
69
- case 'Array':
70
- id = _.util.objId(o);
71
- if (visited[id]) {
72
- return visited[id];
448
+ // Update references in other language definitions
449
+ _.languages.DFS(_.languages, function (key, value) {
450
+ if (value === old && key != inside) {
451
+ this[key] = ret;
73
452
  }
74
- clone = [];
75
- visited[id] = clone;
453
+ });
454
+
455
+ return ret;
456
+ },
76
457
 
77
- o.forEach(function (v, i) {
78
- clone[i] = deepClone(v, visited);
79
- });
458
+ // Traverse a language definition with Depth First Search
459
+ DFS: function DFS(o, callback, type, visited) {
460
+ visited = visited || {};
80
461
 
81
- return clone;
462
+ var objId = _.util.objId;
82
463
 
83
- default:
84
- return o;
464
+ for (var i in o) {
465
+ if (o.hasOwnProperty(i)) {
466
+ callback.call(o, i, o[i], type || i);
467
+
468
+ var property = o[i];
469
+ var propertyType = _.util.type(property);
470
+
471
+ if (propertyType === 'Object' && !visited[objId(property)]) {
472
+ visited[objId(property)] = true;
473
+ DFS(property, callback, null, visited);
474
+ } else if (propertyType === 'Array' && !visited[objId(property)]) {
475
+ visited[objId(property)] = true;
476
+ DFS(property, callback, i, visited);
477
+ }
478
+ }
479
+ }
85
480
  }
86
481
  },
87
482
 
483
+ plugins: {},
484
+
88
485
  /**
89
- * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.
486
+ * This is the most high-level function in Prism’s API.
487
+ * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on
488
+ * each one of them.
90
489
  *
91
- * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.
490
+ * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`.
92
491
  *
93
- * @param {Element} element
94
- * @returns {string}
492
+ * @param {boolean} [async=false] Same as in {@link Prism.highlightAllUnder}.
493
+ * @param {HighlightCallback} [callback] Same as in {@link Prism.highlightAllUnder}.
494
+ * @memberof Prism
495
+ * @public
95
496
  */
96
- getLanguage: function (element) {
97
- while (element && !lang.test(element.className)) {
98
- element = element.parentElement;
99
- }
100
- if (element) {
101
- return (element.className.match(lang) || [, 'none'])[1].toLowerCase();
102
- }
103
- return 'none';
497
+ highlightAll: function (async, callback) {
498
+ _.highlightAllUnder(document, async, callback);
104
499
  },
105
500
 
106
501
  /**
107
- * Returns the script element that is currently executing.
502
+ * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls
503
+ * {@link Prism.highlightElement} on each one of them.
108
504
  *
109
- * This does __not__ work for line script element.
505
+ * The following hooks will be run:
506
+ * 1. `before-highlightall`
507
+ * 2. `before-all-elements-highlight`
508
+ * 3. All hooks of {@link Prism.highlightElement} for each element.
110
509
  *
111
- * @returns {HTMLScriptElement | null}
510
+ * @param {ParentNode} container The root element, whose descendants that have a `.language-xxxx` class will be highlighted.
511
+ * @param {boolean} [async=false] Whether each element is to be highlighted asynchronously using Web Workers.
512
+ * @param {HighlightCallback} [callback] An optional callback to be invoked on each element after its highlighting is done.
513
+ * @memberof Prism
514
+ * @public
112
515
  */
113
- currentScript: function () {
114
- if (typeof document === 'undefined') {
115
- return null;
116
- }
117
- if ('currentScript' in document) {
118
- return document.currentScript;
119
- }
516
+ highlightAllUnder: function (container, async, callback) {
517
+ var env = {
518
+ callback: callback,
519
+ container: container,
520
+ selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
521
+ };
120
522
 
121
- // IE11 workaround
122
- // we'll get the src of the current script by parsing IE11's error stack trace
123
- // this will not work for inline scripts
124
-
125
- try {
126
- throw new Error();
127
- } catch (err) {
128
- // Get file src url from stack. Specifically works with the format of stack traces in IE.
129
- // A stack will look like this:
130
- //
131
- // Error
132
- // at _.util.currentScript (http://localhost/components/prism-core.js:119:5)
133
- // at Global code (http://localhost/components/prism-core.js:606:1)
134
-
135
- var src = (/at [^(\r\n]*\((.*):.+:.+\)$/i.exec(err.stack) || [])[1];
136
- if (src) {
137
- var scripts = document.getElementsByTagName('script');
138
- for (var i in scripts) {
139
- if (scripts[i].src == src) {
140
- return scripts[i];
141
- }
142
- }
143
- }
144
- return null;
145
- }
146
- }
147
- },
523
+ _.hooks.run('before-highlightall', env);
148
524
 
149
- languages: {
150
- extend: function (id, redef) {
151
- var lang = _.util.clone(_.languages[id]);
525
+ env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));
152
526
 
153
- for (var key in redef) {
154
- lang[key] = redef[key];
155
- }
527
+ _.hooks.run('before-all-elements-highlight', env);
156
528
 
157
- return lang;
529
+ for (var i = 0, element; (element = env.elements[i++]);) {
530
+ _.highlightElement(element, async === true, env.callback);
531
+ }
158
532
  },
159
533
 
160
534
  /**
161
- * Insert a token before another token in a language literal
162
- * As this needs to recreate the object (we cannot actually insert before keys in object literals),
163
- * we cannot just provide an object, we need an object and a key.
164
- * @param inside The key (or language id) of the parent
165
- * @param before The key to insert before.
166
- * @param insert Object with the key/value pairs to insert
167
- * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
535
+ * Highlights the code inside a single element.
536
+ *
537
+ * The following hooks will be run:
538
+ * 1. `before-sanity-check`
539
+ * 2. `before-highlight`
540
+ * 3. All hooks of {@link Prism.highlight}. These hooks will be run by an asynchronous worker if `async` is `true`.
541
+ * 4. `before-insert`
542
+ * 5. `after-highlight`
543
+ * 6. `complete`
544
+ *
545
+ * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for
546
+ * the element's language.
547
+ *
548
+ * @param {Element} element The element containing the code.
549
+ * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.
550
+ * @param {boolean} [async=false] Whether the element is to be highlighted asynchronously using Web Workers
551
+ * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is
552
+ * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).
553
+ *
554
+ * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for
555
+ * asynchronous highlighting to work. You can build your own bundle on the
556
+ * [Download page](https://prismjs.com/download.html).
557
+ * @param {HighlightCallback} [callback] An optional callback to be invoked after the highlighting is done.
558
+ * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.
559
+ * @memberof Prism
560
+ * @public
168
561
  */
169
- insertBefore: function (inside, before, insert, root) {
170
- root = root || _.languages;
171
- var grammar = root[inside];
172
- var ret = {};
173
-
174
- for (var token in grammar) {
175
- if (grammar.hasOwnProperty(token)) {
176
-
177
- if (token == before) {
178
- for (var newToken in insert) {
179
- if (insert.hasOwnProperty(newToken)) {
180
- ret[newToken] = insert[newToken];
181
- }
182
- }
183
- }
184
-
185
- // Do not insert token which also occur in insert. See #1525
186
- if (!insert.hasOwnProperty(token)) {
187
- ret[token] = grammar[token];
188
- }
189
- }
562
+ highlightElement: function (element, async, callback) {
563
+ // Find language
564
+ var language = _.util.getLanguage(element);
565
+ var grammar = _.languages[language];
566
+
567
+ // Set language on the element, if not present
568
+ _.util.setLanguage(element, language);
569
+
570
+ // Set language on the parent, for styling
571
+ var parent = element.parentElement;
572
+ if (parent && parent.nodeName.toLowerCase() === 'pre') {
573
+ _.util.setLanguage(parent, language);
190
574
  }
191
575
 
192
- var old = root[inside];
193
- root[inside] = ret;
576
+ var code = element.textContent;
194
577
 
195
- // Update references in other language definitions
196
- _.languages.DFS(_.languages, function(key, value) {
197
- if (value === old && key != inside) {
198
- this[key] = ret;
199
- }
200
- });
578
+ var env = {
579
+ element: element,
580
+ language: language,
581
+ grammar: grammar,
582
+ code: code
583
+ };
201
584
 
202
- return ret;
203
- },
585
+ function insertHighlightedCode(highlightedCode) {
586
+ env.highlightedCode = highlightedCode;
204
587
 
205
- // Traverse a language definition with Depth First Search
206
- DFS: function DFS(o, callback, type, visited) {
207
- visited = visited || {};
588
+ _.hooks.run('before-insert', env);
208
589
 
209
- var objId = _.util.objId;
590
+ env.element.innerHTML = env.highlightedCode;
210
591
 
211
- for (var i in o) {
212
- if (o.hasOwnProperty(i)) {
213
- callback.call(o, i, o[i], type || i);
592
+ _.hooks.run('after-highlight', env);
593
+ _.hooks.run('complete', env);
594
+ callback && callback.call(env.element);
595
+ }
214
596
 
215
- var property = o[i],
216
- propertyType = _.util.type(property);
597
+ _.hooks.run('before-sanity-check', env);
217
598
 
218
- if (propertyType === 'Object' && !visited[objId(property)]) {
219
- visited[objId(property)] = true;
220
- DFS(property, callback, null, visited);
221
- }
222
- else if (propertyType === 'Array' && !visited[objId(property)]) {
223
- visited[objId(property)] = true;
224
- DFS(property, callback, i, visited);
225
- }
226
- }
599
+ // plugins may change/add the parent/element
600
+ parent = env.element.parentElement;
601
+ if (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) {
602
+ parent.setAttribute('tabindex', '0');
227
603
  }
228
- }
229
- },
230
- plugins: {},
231
604
 
232
- highlightAll: function(async, callback) {
233
- _.highlightAllUnder(document, async, callback);
234
- },
605
+ if (!env.code) {
606
+ _.hooks.run('complete', env);
607
+ callback && callback.call(env.element);
608
+ return;
609
+ }
235
610
 
236
- highlightAllUnder: function(container, async, callback) {
237
- var env = {
238
- callback: callback,
239
- container: container,
240
- selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
241
- };
611
+ _.hooks.run('before-highlight', env);
242
612
 
243
- _.hooks.run('before-highlightall', env);
613
+ if (!env.grammar) {
614
+ insertHighlightedCode(_.util.encode(env.code));
615
+ return;
616
+ }
244
617
 
245
- env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));
618
+ if (async && _self.Worker) {
619
+ var worker = new Worker(_.filename);
246
620
 
247
- _.hooks.run('before-all-elements-highlight', env);
621
+ worker.onmessage = function (evt) {
622
+ insertHighlightedCode(evt.data);
623
+ };
248
624
 
249
- for (var i = 0, element; element = env.elements[i++];) {
250
- _.highlightElement(element, async === true, env.callback);
251
- }
252
- },
625
+ worker.postMessage(JSON.stringify({
626
+ language: env.language,
627
+ code: env.code,
628
+ immediateClose: true
629
+ }));
630
+ } else {
631
+ insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
632
+ }
633
+ },
253
634
 
254
- highlightElement: function(element, async, callback) {
255
- // Find language
256
- var language = _.util.getLanguage(element);
257
- var grammar = _.languages[language];
635
+ /**
636
+ * Low-level function, only use if you know what you’re doing. It accepts a string of text as input
637
+ * and the language definitions to use, and returns a string with the HTML produced.
638
+ *
639
+ * The following hooks will be run:
640
+ * 1. `before-tokenize`
641
+ * 2. `after-tokenize`
642
+ * 3. `wrap`: On each {@link Token}.
643
+ *
644
+ * @param {string} text A string with the code to be highlighted.
645
+ * @param {Grammar} grammar An object containing the tokens to use.
646
+ *
647
+ * Usually a language definition like `Prism.languages.markup`.
648
+ * @param {string} language The name of the language definition passed to `grammar`.
649
+ * @returns {string} The highlighted HTML.
650
+ * @memberof Prism
651
+ * @public
652
+ * @example
653
+ * Prism.highlight('var foo = true;', Prism.languages.javascript, 'javascript');
654
+ */
655
+ highlight: function (text, grammar, language) {
656
+ var env = {
657
+ code: text,
658
+ grammar: grammar,
659
+ language: language
660
+ };
661
+ _.hooks.run('before-tokenize', env);
662
+ if (!env.grammar) {
663
+ throw new Error('The language "' + env.language + '" has no grammar.');
664
+ }
665
+ env.tokens = _.tokenize(env.code, env.grammar);
666
+ _.hooks.run('after-tokenize', env);
667
+ return Token.stringify(_.util.encode(env.tokens), env.language);
668
+ },
258
669
 
259
- // Set language on the element, if not present
260
- element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
670
+ /**
671
+ * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input
672
+ * and the language definitions to use, and returns an array with the tokenized code.
673
+ *
674
+ * When the language definition includes nested tokens, the function is called recursively on each of these tokens.
675
+ *
676
+ * This method could be useful in other contexts as well, as a very crude parser.
677
+ *
678
+ * @param {string} text A string with the code to be highlighted.
679
+ * @param {Grammar} grammar An object containing the tokens to use.
680
+ *
681
+ * Usually a language definition like `Prism.languages.markup`.
682
+ * @returns {TokenStream} An array of strings and tokens, a token stream.
683
+ * @memberof Prism
684
+ * @public
685
+ * @example
686
+ * let code = `var foo = 0;`;
687
+ * let tokens = Prism.tokenize(code, Prism.languages.javascript);
688
+ * tokens.forEach(token => {
689
+ * if (token instanceof Prism.Token && token.type === 'number') {
690
+ * console.log(`Found numeric literal: ${token.content}`);
691
+ * }
692
+ * });
693
+ */
694
+ tokenize: function (text, grammar) {
695
+ var rest = grammar.rest;
696
+ if (rest) {
697
+ for (var token in rest) {
698
+ grammar[token] = rest[token];
699
+ }
261
700
 
262
- // Set language on the parent, for styling
263
- var parent = element.parentNode;
264
- if (parent && parent.nodeName.toLowerCase() === 'pre') {
265
- parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
266
- }
701
+ delete grammar.rest;
702
+ }
267
703
 
268
- var code = element.textContent;
704
+ var tokenList = new LinkedList();
705
+ addAfter(tokenList, tokenList.head, text);
269
706
 
270
- var env = {
271
- element: element,
272
- language: language,
273
- grammar: grammar,
274
- code: code
275
- };
707
+ matchGrammar(text, tokenList, grammar, tokenList.head, 0);
276
708
 
277
- function insertHighlightedCode(highlightedCode) {
278
- env.highlightedCode = highlightedCode;
709
+ return toArray(tokenList);
710
+ },
279
711
 
280
- _.hooks.run('before-insert', env);
712
+ /**
713
+ * @namespace
714
+ * @memberof Prism
715
+ * @public
716
+ */
717
+ hooks: {
718
+ all: {},
719
+
720
+ /**
721
+ * Adds the given callback to the list of callbacks for the given hook.
722
+ *
723
+ * The callback will be invoked when the hook it is registered for is run.
724
+ * Hooks are usually directly run by a highlight function but you can also run hooks yourself.
725
+ *
726
+ * One callback function can be registered to multiple hooks and the same hook multiple times.
727
+ *
728
+ * @param {string} name The name of the hook.
729
+ * @param {HookCallback} callback The callback function which is given environment variables.
730
+ * @public
731
+ */
732
+ add: function (name, callback) {
733
+ var hooks = _.hooks.all;
734
+
735
+ hooks[name] = hooks[name] || [];
736
+
737
+ hooks[name].push(callback);
738
+ },
739
+
740
+ /**
741
+ * Runs a hook invoking all registered callbacks with the given environment variables.
742
+ *
743
+ * Callbacks will be invoked synchronously and in the order in which they were registered.
744
+ *
745
+ * @param {string} name The name of the hook.
746
+ * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.
747
+ * @public
748
+ */
749
+ run: function (name, env) {
750
+ var callbacks = _.hooks.all[name];
751
+
752
+ if (!callbacks || !callbacks.length) {
753
+ return;
754
+ }
281
755
 
282
- env.element.innerHTML = env.highlightedCode;
756
+ for (var i = 0, callback; (callback = callbacks[i++]);) {
757
+ callback(env);
758
+ }
759
+ }
760
+ },
283
761
 
284
- _.hooks.run('after-highlight', env);
285
- _.hooks.run('complete', env);
286
- callback && callback.call(env.element);
762
+ Token: Token
763
+ };
764
+ _self.Prism = _;
765
+
766
+
767
+ // Typescript note:
768
+ // The following can be used to import the Token type in JSDoc:
769
+ //
770
+ // @typedef {InstanceType<import("./prism-core")["Token"]>} Token
771
+
772
+ /**
773
+ * Creates a new token.
774
+ *
775
+ * @param {string} type See {@link Token#type type}
776
+ * @param {string | TokenStream} content See {@link Token#content content}
777
+ * @param {string|string[]} [alias] The alias(es) of the token.
778
+ * @param {string} [matchedStr=""] A copy of the full string this token was created from.
779
+ * @class
780
+ * @global
781
+ * @public
782
+ */
783
+ function Token(type, content, alias, matchedStr) {
784
+ /**
785
+ * The type of the token.
786
+ *
787
+ * This is usually the key of a pattern in a {@link Grammar}.
788
+ *
789
+ * @type {string}
790
+ * @see GrammarToken
791
+ * @public
792
+ */
793
+ this.type = type;
794
+ /**
795
+ * The strings or tokens contained by this token.
796
+ *
797
+ * This will be a token stream if the pattern matched also defined an `inside` grammar.
798
+ *
799
+ * @type {string | TokenStream}
800
+ * @public
801
+ */
802
+ this.content = content;
803
+ /**
804
+ * The alias(es) of the token.
805
+ *
806
+ * @type {string|string[]}
807
+ * @see GrammarToken
808
+ * @public
809
+ */
810
+ this.alias = alias;
811
+ // Copy of the full string this token was created from
812
+ this.length = (matchedStr || '').length | 0;
813
+ }
814
+
815
+ /**
816
+ * A token stream is an array of strings and {@link Token Token} objects.
817
+ *
818
+ * Token streams have to fulfill a few properties that are assumed by most functions (mostly internal ones) that process
819
+ * them.
820
+ *
821
+ * 1. No adjacent strings.
822
+ * 2. No empty strings.
823
+ *
824
+ * The only exception here is the token stream that only contains the empty string and nothing else.
825
+ *
826
+ * @typedef {Array<string | Token>} TokenStream
827
+ * @global
828
+ * @public
829
+ */
830
+
831
+ /**
832
+ * Converts the given token or token stream to an HTML representation.
833
+ *
834
+ * The following hooks will be run:
835
+ * 1. `wrap`: On each {@link Token}.
836
+ *
837
+ * @param {string | Token | TokenStream} o The token or token stream to be converted.
838
+ * @param {string} language The name of current language.
839
+ * @returns {string} The HTML representation of the token or token stream.
840
+ * @memberof Token
841
+ * @static
842
+ */
843
+ Token.stringify = function stringify(o, language) {
844
+ if (typeof o == 'string') {
845
+ return o;
846
+ }
847
+ if (Array.isArray(o)) {
848
+ var s = '';
849
+ o.forEach(function (e) {
850
+ s += stringify(e, language);
851
+ });
852
+ return s;
287
853
  }
288
854
 
289
- _.hooks.run('before-sanity-check', env);
855
+ var env = {
856
+ type: o.type,
857
+ content: stringify(o.content, language),
858
+ tag: 'span',
859
+ classes: ['token', o.type],
860
+ attributes: {},
861
+ language: language
862
+ };
290
863
 
291
- if (!env.code) {
292
- _.hooks.run('complete', env);
293
- callback && callback.call(env.element);
294
- return;
864
+ var aliases = o.alias;
865
+ if (aliases) {
866
+ if (Array.isArray(aliases)) {
867
+ Array.prototype.push.apply(env.classes, aliases);
868
+ } else {
869
+ env.classes.push(aliases);
870
+ }
295
871
  }
296
872
 
297
- _.hooks.run('before-highlight', env);
873
+ _.hooks.run('wrap', env);
298
874
 
299
- if (!env.grammar) {
300
- insertHighlightedCode(_.util.encode(env.code));
301
- return;
875
+ var attributes = '';
876
+ for (var name in env.attributes) {
877
+ attributes += ' ' + name + '="' + (env.attributes[name] || '').replace(/"/g, '&quot;') + '"';
302
878
  }
303
879
 
304
- if (async && _self.Worker) {
305
- var worker = new Worker(_.filename);
306
-
307
- worker.onmessage = function(evt) {
308
- insertHighlightedCode(evt.data);
309
- };
880
+ return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + attributes + '>' + env.content + '</' + env.tag + '>';
881
+ };
310
882
 
311
- worker.postMessage(JSON.stringify({
312
- language: env.language,
313
- code: env.code,
314
- immediateClose: true
315
- }));
316
- }
317
- else {
318
- insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
883
+ /**
884
+ * @param {RegExp} pattern
885
+ * @param {number} pos
886
+ * @param {string} text
887
+ * @param {boolean} lookbehind
888
+ * @returns {RegExpExecArray | null}
889
+ */
890
+ function matchPattern(pattern, pos, text, lookbehind) {
891
+ pattern.lastIndex = pos;
892
+ var match = pattern.exec(text);
893
+ if (match && lookbehind && match[1]) {
894
+ // change the match to remove the text matched by the Prism lookbehind group
895
+ var lookbehindLength = match[1].length;
896
+ match.index += lookbehindLength;
897
+ match[0] = match[0].slice(lookbehindLength);
319
898
  }
320
- },
321
-
322
- highlight: function (text, grammar, language) {
323
- var env = {
324
- code: text,
325
- grammar: grammar,
326
- language: language
327
- };
328
- _.hooks.run('before-tokenize', env);
329
- env.tokens = _.tokenize(env.code, env.grammar);
330
- _.hooks.run('after-tokenize', env);
331
- return Token.stringify(_.util.encode(env.tokens), env.language);
332
- },
899
+ return match;
900
+ }
333
901
 
334
- matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) {
902
+ /**
903
+ * @param {string} text
904
+ * @param {LinkedList<string | Token>} tokenList
905
+ * @param {any} grammar
906
+ * @param {LinkedListNode<string | Token>} startNode
907
+ * @param {number} startPos
908
+ * @param {RematchOptions} [rematch]
909
+ * @returns {void}
910
+ * @private
911
+ *
912
+ * @typedef RematchOptions
913
+ * @property {string} cause
914
+ * @property {number} reach
915
+ */
916
+ function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {
335
917
  for (var token in grammar) {
336
918
  if (!grammar.hasOwnProperty(token) || !grammar[token]) {
337
919
  continue;
@@ -341,31 +923,38 @@ var _ = {
341
923
  patterns = Array.isArray(patterns) ? patterns : [patterns];
342
924
 
343
925
  for (var j = 0; j < patterns.length; ++j) {
344
- if (target && target == token + ',' + j) {
926
+ if (rematch && rematch.cause == token + ',' + j) {
345
927
  return;
346
928
  }
347
929
 
348
- var pattern = patterns[j],
349
- inside = pattern.inside,
350
- lookbehind = !!pattern.lookbehind,
351
- greedy = !!pattern.greedy,
352
- lookbehindLength = 0,
353
- alias = pattern.alias;
930
+ var patternObj = patterns[j];
931
+ var inside = patternObj.inside;
932
+ var lookbehind = !!patternObj.lookbehind;
933
+ var greedy = !!patternObj.greedy;
934
+ var alias = patternObj.alias;
354
935
 
355
- if (greedy && !pattern.pattern.global) {
936
+ if (greedy && !patternObj.pattern.global) {
356
937
  // Without the global flag, lastIndex won't work
357
- var flags = pattern.pattern.toString().match(/[imsuy]*$/)[0];
358
- pattern.pattern = RegExp(pattern.pattern.source, flags + 'g');
938
+ var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];
939
+ patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g');
359
940
  }
360
941
 
361
- pattern = pattern.pattern || pattern;
942
+ /** @type {RegExp} */
943
+ var pattern = patternObj.pattern || patternObj;
944
+
945
+ for ( // iterate the token list and keep track of the current token/string position
946
+ var currentNode = startNode.next, pos = startPos;
947
+ currentNode !== tokenList.tail;
948
+ pos += currentNode.value.length, currentNode = currentNode.next
949
+ ) {
362
950
 
363
- // Don’t cache length as it changes during the loop
364
- for (var i = index, pos = startPos; i < strarr.length; pos += strarr[i].length, ++i) {
951
+ if (rematch && pos >= rematch.reach) {
952
+ break;
953
+ }
365
954
 
366
- var str = strarr[i];
955
+ var str = currentNode.value;
367
956
 
368
- if (strarr.length > text.length) {
957
+ if (tokenList.length > text.length) {
369
958
  // Something went terribly wrong, ABORT, ABORT!
370
959
  return;
371
960
  }
@@ -374,248 +963,246 @@ var _ = {
374
963
  continue;
375
964
  }
376
965
 
377
- if (greedy && i != strarr.length - 1) {
378
- pattern.lastIndex = pos;
379
- var match = pattern.exec(text);
380
- if (!match) {
966
+ var removeCount = 1; // this is the to parameter of removeBetween
967
+ var match;
968
+
969
+ if (greedy) {
970
+ match = matchPattern(pattern, pos, text, lookbehind);
971
+ if (!match || match.index >= text.length) {
381
972
  break;
382
973
  }
383
974
 
384
- var from = match.index + (lookbehind && match[1] ? match[1].length : 0),
385
- to = match.index + match[0].length,
386
- k = i,
387
- p = pos;
388
-
389
- for (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) {
390
- p += strarr[k].length;
391
- // Move the index i to the element in strarr that is closest to from
392
- if (from >= p) {
393
- ++i;
394
- pos = p;
395
- }
975
+ var from = match.index;
976
+ var to = match.index + match[0].length;
977
+ var p = pos;
978
+
979
+ // find the node that contains the match
980
+ p += currentNode.value.length;
981
+ while (from >= p) {
982
+ currentNode = currentNode.next;
983
+ p += currentNode.value.length;
396
984
  }
985
+ // adjust pos (and p)
986
+ p -= currentNode.value.length;
987
+ pos = p;
397
988
 
398
- // If strarr[i] is a Token, then the match starts inside another Token, which is invalid
399
- if (strarr[i] instanceof Token) {
989
+ // the current node is a Token, then the match starts inside another Token, which is invalid
990
+ if (currentNode.value instanceof Token) {
400
991
  continue;
401
992
  }
402
993
 
403
- // Number of tokens to delete and replace with the new match
404
- delNum = k - i;
994
+ // find the last node which is affected by this match
995
+ for (
996
+ var k = currentNode;
997
+ k !== tokenList.tail && (p < to || typeof k.value === 'string');
998
+ k = k.next
999
+ ) {
1000
+ removeCount++;
1001
+ p += k.value.length;
1002
+ }
1003
+ removeCount--;
1004
+
1005
+ // replace with the new match
405
1006
  str = text.slice(pos, p);
406
1007
  match.index -= pos;
407
1008
  } else {
408
- pattern.lastIndex = 0;
409
-
410
- var match = pattern.exec(str),
411
- delNum = 1;
412
- }
413
-
414
- if (!match) {
415
- if (oneshot) {
416
- break;
1009
+ match = matchPattern(pattern, 0, str, lookbehind);
1010
+ if (!match) {
1011
+ continue;
417
1012
  }
418
-
419
- continue;
420
1013
  }
421
1014
 
422
- if(lookbehind) {
423
- lookbehindLength = match[1] ? match[1].length : 0;
424
- }
1015
+ // eslint-disable-next-line no-redeclare
1016
+ var from = match.index;
1017
+ var matchStr = match[0];
1018
+ var before = str.slice(0, from);
1019
+ var after = str.slice(from + matchStr.length);
425
1020
 
426
- var from = match.index + lookbehindLength,
427
- match = match[0].slice(lookbehindLength),
428
- to = from + match.length,
429
- before = str.slice(0, from),
430
- after = str.slice(to);
1021
+ var reach = pos + str.length;
1022
+ if (rematch && reach > rematch.reach) {
1023
+ rematch.reach = reach;
1024
+ }
431
1025
 
432
- var args = [i, delNum];
1026
+ var removeFrom = currentNode.prev;
433
1027
 
434
1028
  if (before) {
435
- ++i;
1029
+ removeFrom = addAfter(tokenList, removeFrom, before);
436
1030
  pos += before.length;
437
- args.push(before);
438
1031
  }
439
1032
 
440
- var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy);
1033
+ removeRange(tokenList, removeFrom, removeCount);
441
1034
 
442
- args.push(wrapped);
1035
+ var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);
1036
+ currentNode = addAfter(tokenList, removeFrom, wrapped);
443
1037
 
444
1038
  if (after) {
445
- args.push(after);
1039
+ addAfter(tokenList, currentNode, after);
446
1040
  }
447
1041
 
448
- Array.prototype.splice.apply(strarr, args);
1042
+ if (removeCount > 1) {
1043
+ // at least one Token object was removed, so we have to do some rematching
1044
+ // this can only happen if the current pattern is greedy
449
1045
 
450
- if (delNum != 1)
451
- _.matchGrammar(text, strarr, grammar, i, pos, true, token + ',' + j);
1046
+ /** @type {RematchOptions} */
1047
+ var nestedRematch = {
1048
+ cause: token + ',' + j,
1049
+ reach: reach
1050
+ };
1051
+ matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);
452
1052
 
453
- if (oneshot)
454
- break;
1053
+ // the reach might have been extended because of the rematching
1054
+ if (rematch && nestedRematch.reach > rematch.reach) {
1055
+ rematch.reach = nestedRematch.reach;
1056
+ }
1057
+ }
455
1058
  }
456
1059
  }
457
1060
  }
458
- },
459
-
460
- tokenize: function(text, grammar) {
461
- var strarr = [text];
462
-
463
- var rest = grammar.rest;
464
-
465
- if (rest) {
466
- for (var token in rest) {
467
- grammar[token] = rest[token];
468
- }
469
-
470
- delete grammar.rest;
471
- }
472
-
473
- _.matchGrammar(text, strarr, grammar, 0, 0, false);
474
-
475
- return strarr;
476
- },
477
-
478
- hooks: {
479
- all: {},
480
-
481
- add: function (name, callback) {
482
- var hooks = _.hooks.all;
483
-
484
- hooks[name] = hooks[name] || [];
485
-
486
- hooks[name].push(callback);
487
- },
488
-
489
- run: function (name, env) {
490
- var callbacks = _.hooks.all[name];
491
-
492
- if (!callbacks || !callbacks.length) {
493
- return;
494
- }
495
-
496
- for (var i=0, callback; callback = callbacks[i++];) {
497
- callback(env);
498
- }
499
- }
500
- },
501
-
502
- Token: Token
503
- };
504
-
505
- _self.Prism = _;
1061
+ }
506
1062
 
507
- function Token(type, content, alias, matchedStr, greedy) {
508
- this.type = type;
509
- this.content = content;
510
- this.alias = alias;
511
- // Copy of the full string this token was created from
512
- this.length = (matchedStr || '').length|0;
513
- this.greedy = !!greedy;
514
- }
1063
+ /**
1064
+ * @typedef LinkedListNode
1065
+ * @property {T} value
1066
+ * @property {LinkedListNode<T> | null} prev The previous node.
1067
+ * @property {LinkedListNode<T> | null} next The next node.
1068
+ * @template T
1069
+ * @private
1070
+ */
1071
+
1072
+ /**
1073
+ * @template T
1074
+ * @private
1075
+ */
1076
+ function LinkedList() {
1077
+ /** @type {LinkedListNode<T>} */
1078
+ var head = { value: null, prev: null, next: null };
1079
+ /** @type {LinkedListNode<T>} */
1080
+ var tail = { value: null, prev: head, next: null };
1081
+ head.next = tail;
1082
+
1083
+ /** @type {LinkedListNode<T>} */
1084
+ this.head = head;
1085
+ /** @type {LinkedListNode<T>} */
1086
+ this.tail = tail;
1087
+ this.length = 0;
1088
+ }
515
1089
 
516
- Token.stringify = function stringify(o, language) {
517
- if (typeof o == 'string') {
518
- return o;
1090
+ /**
1091
+ * Adds a new node with the given value to the list.
1092
+ *
1093
+ * @param {LinkedList<T>} list
1094
+ * @param {LinkedListNode<T>} node
1095
+ * @param {T} value
1096
+ * @returns {LinkedListNode<T>} The added node.
1097
+ * @template T
1098
+ */
1099
+ function addAfter(list, node, value) {
1100
+ // assumes that node != list.tail && values.length >= 0
1101
+ var next = node.next;
1102
+
1103
+ var newNode = { value: value, prev: node, next: next };
1104
+ node.next = newNode;
1105
+ next.prev = newNode;
1106
+ list.length++;
1107
+
1108
+ return newNode;
519
1109
  }
520
- if (Array.isArray(o)) {
521
- var s = '';
522
- o.forEach(function (e) {
523
- s += stringify(e, language);
524
- });
525
- return s;
1110
+ /**
1111
+ * Removes `count` nodes after the given node. The given node will not be removed.
1112
+ *
1113
+ * @param {LinkedList<T>} list
1114
+ * @param {LinkedListNode<T>} node
1115
+ * @param {number} count
1116
+ * @template T
1117
+ */
1118
+ function removeRange(list, node, count) {
1119
+ var next = node.next;
1120
+ for (var i = 0; i < count && next !== list.tail; i++) {
1121
+ next = next.next;
1122
+ }
1123
+ node.next = next;
1124
+ next.prev = node;
1125
+ list.length -= i;
526
1126
  }
527
-
528
- var env = {
529
- type: o.type,
530
- content: stringify(o.content, language),
531
- tag: 'span',
532
- classes: ['token', o.type],
533
- attributes: {},
534
- language: language
535
- };
536
-
537
- var aliases = o.alias;
538
- if (aliases) {
539
- if (Array.isArray(aliases)) {
540
- Array.prototype.push.apply(env.classes, aliases);
541
- } else {
542
- env.classes.push(aliases);
1127
+ /**
1128
+ * @param {LinkedList<T>} list
1129
+ * @returns {T[]}
1130
+ * @template T
1131
+ */
1132
+ function toArray(list) {
1133
+ var array = [];
1134
+ var node = list.head.next;
1135
+ while (node !== list.tail) {
1136
+ array.push(node.value);
1137
+ node = node.next;
543
1138
  }
1139
+ return array;
544
1140
  }
545
1141
 
546
- _.hooks.run('wrap', env);
547
1142
 
548
- var attributes = '';
549
- for (var name in env.attributes) {
550
- attributes += ' ' + name + '="' + (env.attributes[name] || '').replace(/"/g, '&quot;') + '"';
551
- }
1143
+ if (!_self.document) {
1144
+ if (!_self.addEventListener) {
1145
+ // in Node.js
1146
+ return _;
1147
+ }
552
1148
 
553
- return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + attributes + '>' + env.content + '</' + env.tag + '>';
554
- };
1149
+ if (!_.disableWorkerMessageHandler) {
1150
+ // In worker
1151
+ _self.addEventListener('message', function (evt) {
1152
+ var message = JSON.parse(evt.data);
1153
+ var lang = message.language;
1154
+ var code = message.code;
1155
+ var immediateClose = message.immediateClose;
1156
+
1157
+ _self.postMessage(_.highlight(code, _.languages[lang], lang));
1158
+ if (immediateClose) {
1159
+ _self.close();
1160
+ }
1161
+ }, false);
1162
+ }
555
1163
 
556
- if (!_self.document) {
557
- if (!_self.addEventListener) {
558
- // in Node.js
559
1164
  return _;
560
1165
  }
561
1166
 
562
- if (!_.disableWorkerMessageHandler) {
563
- // In worker
564
- _self.addEventListener('message', function (evt) {
565
- var message = JSON.parse(evt.data),
566
- lang = message.language,
567
- code = message.code,
568
- immediateClose = message.immediateClose;
569
-
570
- _self.postMessage(_.highlight(code, _.languages[lang], lang));
571
- if (immediateClose) {
572
- _self.close();
573
- }
574
- }, false);
575
- }
576
-
577
- return _;
578
- }
1167
+ // Get current script and highlight
1168
+ var script = _.util.currentScript();
579
1169
 
580
- //Get current script and highlight
581
- var script = _.util.currentScript();
1170
+ if (script) {
1171
+ _.filename = script.src;
582
1172
 
583
- if (script) {
584
- _.filename = script.src;
585
-
586
- if (script.hasAttribute('data-manual')) {
587
- _.manual = true;
1173
+ if (script.hasAttribute('data-manual')) {
1174
+ _.manual = true;
1175
+ }
588
1176
  }
589
- }
590
1177
 
591
- function highlightAutomaticallyCallback() {
592
- if (!_.manual) {
593
- _.highlightAll();
1178
+ function highlightAutomaticallyCallback() {
1179
+ if (!_.manual) {
1180
+ _.highlightAll();
1181
+ }
594
1182
  }
595
- }
596
1183
 
597
- if (!_.manual) {
598
- // If the document state is "loading", then we'll use DOMContentLoaded.
599
- // If the document state is "interactive" and the prism.js script is deferred, then we'll also use the
600
- // DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they
601
- // might take longer one animation frame to execute which can create a race condition where only some plugins have
602
- // been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.
603
- // See https://github.com/PrismJS/prism/issues/2102
604
- var readyState = document.readyState;
605
- if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) {
606
- document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback);
607
- } else {
608
- if (window.requestAnimationFrame) {
609
- window.requestAnimationFrame(highlightAutomaticallyCallback);
1184
+ if (!_.manual) {
1185
+ // If the document state is "loading", then we'll use DOMContentLoaded.
1186
+ // If the document state is "interactive" and the prism.js script is deferred, then we'll also use the
1187
+ // DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they
1188
+ // might take longer one animation frame to execute which can create a race condition where only some plugins have
1189
+ // been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.
1190
+ // See https://github.com/PrismJS/prism/issues/2102
1191
+ var readyState = document.readyState;
1192
+ if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) {
1193
+ document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback);
610
1194
  } else {
611
- window.setTimeout(highlightAutomaticallyCallback, 16);
1195
+ if (window.requestAnimationFrame) {
1196
+ window.requestAnimationFrame(highlightAutomaticallyCallback);
1197
+ } else {
1198
+ window.setTimeout(highlightAutomaticallyCallback, 16);
1199
+ }
612
1200
  }
613
1201
  }
614
- }
615
1202
 
616
- return _;
1203
+ return _;
617
1204
 
618
- })(_self);
1205
+ }(_self));
619
1206
 
620
1207
  if (typeof module !== 'undefined' && module.exports) {
621
1208
  module.exports = Prism;
@@ -625,3 +1212,52 @@ if (typeof module !== 'undefined' && module.exports) {
625
1212
  if (typeof global !== 'undefined') {
626
1213
  global.Prism = Prism;
627
1214
  }
1215
+
1216
+ // some additional documentation/types
1217
+
1218
+ /**
1219
+ * The expansion of a simple `RegExp` literal to support additional properties.
1220
+ *
1221
+ * @typedef GrammarToken
1222
+ * @property {RegExp} pattern The regular expression of the token.
1223
+ * @property {boolean} [lookbehind=false] If `true`, then the first capturing group of `pattern` will (effectively)
1224
+ * behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token.
1225
+ * @property {boolean} [greedy=false] Whether the token is greedy.
1226
+ * @property {string|string[]} [alias] An optional alias or list of aliases.
1227
+ * @property {Grammar} [inside] The nested grammar of this token.
1228
+ *
1229
+ * The `inside` grammar will be used to tokenize the text value of each token of this kind.
1230
+ *
1231
+ * This can be used to make nested and even recursive language definitions.
1232
+ *
1233
+ * Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into
1234
+ * each another.
1235
+ * @global
1236
+ * @public
1237
+ */
1238
+
1239
+ /**
1240
+ * @typedef Grammar
1241
+ * @type {Object<string, RegExp | GrammarToken | Array<RegExp | GrammarToken>>}
1242
+ * @property {Grammar} [rest] An optional grammar object that will be appended to this grammar.
1243
+ * @global
1244
+ * @public
1245
+ */
1246
+
1247
+ /**
1248
+ * A function which will invoked after an element was successfully highlighted.
1249
+ *
1250
+ * @callback HighlightCallback
1251
+ * @param {Element} element The element successfully highlighted.
1252
+ * @returns {void}
1253
+ * @global
1254
+ * @public
1255
+ */
1256
+
1257
+ /**
1258
+ * @callback HookCallback
1259
+ * @param {Object<string, any>} env The environment variables of the hook.
1260
+ * @returns {void}
1261
+ * @global
1262
+ * @public
1263
+ */