rouge 3.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +40 -0
  3. data/LICENSE +186 -0
  4. data/bin/rougify +18 -0
  5. data/lib/rouge.rb +107 -0
  6. data/lib/rouge/cli.rb +498 -0
  7. data/lib/rouge/demos/abap +6 -0
  8. data/lib/rouge/demos/actionscript +4 -0
  9. data/lib/rouge/demos/ada +26 -0
  10. data/lib/rouge/demos/apache +21 -0
  11. data/lib/rouge/demos/apex +9 -0
  12. data/lib/rouge/demos/apiblueprint +33 -0
  13. data/lib/rouge/demos/applescript +2 -0
  14. data/lib/rouge/demos/armasm +12 -0
  15. data/lib/rouge/demos/awk +4 -0
  16. data/lib/rouge/demos/batchfile +3 -0
  17. data/lib/rouge/demos/bbcbasic +6 -0
  18. data/lib/rouge/demos/biml +38 -0
  19. data/lib/rouge/demos/bpf +7 -0
  20. data/lib/rouge/demos/brainfuck +5 -0
  21. data/lib/rouge/demos/bsl +7 -0
  22. data/lib/rouge/demos/c +8 -0
  23. data/lib/rouge/demos/ceylon +7 -0
  24. data/lib/rouge/demos/cfscript +18 -0
  25. data/lib/rouge/demos/clean +6 -0
  26. data/lib/rouge/demos/clojure +5 -0
  27. data/lib/rouge/demos/cmake +7 -0
  28. data/lib/rouge/demos/cmhg +8 -0
  29. data/lib/rouge/demos/coffeescript +5 -0
  30. data/lib/rouge/demos/common_lisp +1 -0
  31. data/lib/rouge/demos/conf +4 -0
  32. data/lib/rouge/demos/console +6 -0
  33. data/lib/rouge/demos/coq +13 -0
  34. data/lib/rouge/demos/cpp +8 -0
  35. data/lib/rouge/demos/crystal +45 -0
  36. data/lib/rouge/demos/csharp +5 -0
  37. data/lib/rouge/demos/css +4 -0
  38. data/lib/rouge/demos/csvs +8 -0
  39. data/lib/rouge/demos/cuda +11 -0
  40. data/lib/rouge/demos/cypher +5 -0
  41. data/lib/rouge/demos/cython +6 -0
  42. data/lib/rouge/demos/d +16 -0
  43. data/lib/rouge/demos/dart +6 -0
  44. data/lib/rouge/demos/datastudio +21 -0
  45. data/lib/rouge/demos/diff +7 -0
  46. data/lib/rouge/demos/digdag +19 -0
  47. data/lib/rouge/demos/docker +9 -0
  48. data/lib/rouge/demos/dot +5 -0
  49. data/lib/rouge/demos/ecl +18 -0
  50. data/lib/rouge/demos/eex +1 -0
  51. data/lib/rouge/demos/eiffel +30 -0
  52. data/lib/rouge/demos/elixir +1 -0
  53. data/lib/rouge/demos/elm +4 -0
  54. data/lib/rouge/demos/epp +4 -0
  55. data/lib/rouge/demos/erb +1 -0
  56. data/lib/rouge/demos/erlang +7 -0
  57. data/lib/rouge/demos/escape +3 -0
  58. data/lib/rouge/demos/factor +5 -0
  59. data/lib/rouge/demos/fortran +22 -0
  60. data/lib/rouge/demos/freefem +16 -0
  61. data/lib/rouge/demos/fsharp +12 -0
  62. data/lib/rouge/demos/gdscript +18 -0
  63. data/lib/rouge/demos/ghc-cmm +23 -0
  64. data/lib/rouge/demos/ghc-core +26 -0
  65. data/lib/rouge/demos/gherkin +17 -0
  66. data/lib/rouge/demos/glsl +14 -0
  67. data/lib/rouge/demos/go +7 -0
  68. data/lib/rouge/demos/gradle +10 -0
  69. data/lib/rouge/demos/graphql +17 -0
  70. data/lib/rouge/demos/groovy +9 -0
  71. data/lib/rouge/demos/hack +5 -0
  72. data/lib/rouge/demos/haml +5 -0
  73. data/lib/rouge/demos/handlebars +7 -0
  74. data/lib/rouge/demos/haskell +6 -0
  75. data/lib/rouge/demos/haxe +5 -0
  76. data/lib/rouge/demos/hcl +7 -0
  77. data/lib/rouge/demos/hocon +8 -0
  78. data/lib/rouge/demos/hql +5 -0
  79. data/lib/rouge/demos/html +8 -0
  80. data/lib/rouge/demos/http +14 -0
  81. data/lib/rouge/demos/hylang +10 -0
  82. data/lib/rouge/demos/idlang +8 -0
  83. data/lib/rouge/demos/igorpro +9 -0
  84. data/lib/rouge/demos/ini +4 -0
  85. data/lib/rouge/demos/io +11 -0
  86. data/lib/rouge/demos/irb +4 -0
  87. data/lib/rouge/demos/irb_output +2 -0
  88. data/lib/rouge/demos/isbl +4 -0
  89. data/lib/rouge/demos/java +5 -0
  90. data/lib/rouge/demos/javascript +1 -0
  91. data/lib/rouge/demos/jinja +9 -0
  92. data/lib/rouge/demos/jsl +3 -0
  93. data/lib/rouge/demos/json +1 -0
  94. data/lib/rouge/demos/json-doc +1 -0
  95. data/lib/rouge/demos/jsonnet +28 -0
  96. data/lib/rouge/demos/jsp +29 -0
  97. data/lib/rouge/demos/jsx +17 -0
  98. data/lib/rouge/demos/julia +11 -0
  99. data/lib/rouge/demos/kotlin +3 -0
  100. data/lib/rouge/demos/lasso +12 -0
  101. data/lib/rouge/demos/liquid +10 -0
  102. data/lib/rouge/demos/literate_coffeescript +3 -0
  103. data/lib/rouge/demos/literate_haskell +7 -0
  104. data/lib/rouge/demos/llvm +20 -0
  105. data/lib/rouge/demos/lua +12 -0
  106. data/lib/rouge/demos/lustre +6 -0
  107. data/lib/rouge/demos/lutin +18 -0
  108. data/lib/rouge/demos/m68k +16 -0
  109. data/lib/rouge/demos/magik +6 -0
  110. data/lib/rouge/demos/make +6 -0
  111. data/lib/rouge/demos/markdown +4 -0
  112. data/lib/rouge/demos/mason +22 -0
  113. data/lib/rouge/demos/mathematica +8 -0
  114. data/lib/rouge/demos/matlab +6 -0
  115. data/lib/rouge/demos/minizinc +23 -0
  116. data/lib/rouge/demos/moonscript +16 -0
  117. data/lib/rouge/demos/mosel +10 -0
  118. data/lib/rouge/demos/msgtrans +4 -0
  119. data/lib/rouge/demos/mxml +22 -0
  120. data/lib/rouge/demos/nasm +26 -0
  121. data/lib/rouge/demos/nesasm +11 -0
  122. data/lib/rouge/demos/nginx +5 -0
  123. data/lib/rouge/demos/nim +27 -0
  124. data/lib/rouge/demos/nix +19 -0
  125. data/lib/rouge/demos/objective_c +18 -0
  126. data/lib/rouge/demos/objective_cpp +17 -0
  127. data/lib/rouge/demos/ocaml +12 -0
  128. data/lib/rouge/demos/openedge +4 -0
  129. data/lib/rouge/demos/opentype_feature_file +6 -0
  130. data/lib/rouge/demos/pascal +14 -0
  131. data/lib/rouge/demos/perl +5 -0
  132. data/lib/rouge/demos/php +3 -0
  133. data/lib/rouge/demos/plaintext +1 -0
  134. data/lib/rouge/demos/plist +11 -0
  135. data/lib/rouge/demos/pony +17 -0
  136. data/lib/rouge/demos/powershell +13 -0
  137. data/lib/rouge/demos/praat +26 -0
  138. data/lib/rouge/demos/prolog +9 -0
  139. data/lib/rouge/demos/prometheus +9 -0
  140. data/lib/rouge/demos/properties +7 -0
  141. data/lib/rouge/demos/protobuf +5 -0
  142. data/lib/rouge/demos/puppet +6 -0
  143. data/lib/rouge/demos/python +6 -0
  144. data/lib/rouge/demos/q +8 -0
  145. data/lib/rouge/demos/qml +9 -0
  146. data/lib/rouge/demos/r +8 -0
  147. data/lib/rouge/demos/racket +24 -0
  148. data/lib/rouge/demos/reasonml +12 -0
  149. data/lib/rouge/demos/rego +8 -0
  150. data/lib/rouge/demos/robot_framework +27 -0
  151. data/lib/rouge/demos/ruby +9 -0
  152. data/lib/rouge/demos/rust +12 -0
  153. data/lib/rouge/demos/sas +13 -0
  154. data/lib/rouge/demos/sass +3 -0
  155. data/lib/rouge/demos/scala +3 -0
  156. data/lib/rouge/demos/scheme +4 -0
  157. data/lib/rouge/demos/scss +5 -0
  158. data/lib/rouge/demos/sed +4 -0
  159. data/lib/rouge/demos/shell +2 -0
  160. data/lib/rouge/demos/sieve +10 -0
  161. data/lib/rouge/demos/slice +10 -0
  162. data/lib/rouge/demos/slim +17 -0
  163. data/lib/rouge/demos/smalltalk +6 -0
  164. data/lib/rouge/demos/smarty +12 -0
  165. data/lib/rouge/demos/sml +4 -0
  166. data/lib/rouge/demos/solidity +13 -0
  167. data/lib/rouge/demos/sparql +6 -0
  168. data/lib/rouge/demos/sqf +14 -0
  169. data/lib/rouge/demos/sql +1 -0
  170. data/lib/rouge/demos/supercollider +11 -0
  171. data/lib/rouge/demos/swift +5 -0
  172. data/lib/rouge/demos/tap +5 -0
  173. data/lib/rouge/demos/tcl +1 -0
  174. data/lib/rouge/demos/terraform +16 -0
  175. data/lib/rouge/demos/tex +1 -0
  176. data/lib/rouge/demos/toml +9 -0
  177. data/lib/rouge/demos/tsx +17 -0
  178. data/lib/rouge/demos/ttcn3 +6 -0
  179. data/lib/rouge/demos/tulip +13 -0
  180. data/lib/rouge/demos/turtle +26 -0
  181. data/lib/rouge/demos/twig +9 -0
  182. data/lib/rouge/demos/typescript +1 -0
  183. data/lib/rouge/demos/vala +8 -0
  184. data/lib/rouge/demos/vb +4 -0
  185. data/lib/rouge/demos/vcl +12 -0
  186. data/lib/rouge/demos/verilog +27 -0
  187. data/lib/rouge/demos/vhdl +23 -0
  188. data/lib/rouge/demos/viml +14 -0
  189. data/lib/rouge/demos/vue +11 -0
  190. data/lib/rouge/demos/wollok +11 -0
  191. data/lib/rouge/demos/xml +2 -0
  192. data/lib/rouge/demos/xojo +14 -0
  193. data/lib/rouge/demos/xpath +2 -0
  194. data/lib/rouge/demos/xquery +22 -0
  195. data/lib/rouge/demos/yaml +4 -0
  196. data/lib/rouge/demos/yang +17 -0
  197. data/lib/rouge/formatter.rb +112 -0
  198. data/lib/rouge/formatters/html.rb +56 -0
  199. data/lib/rouge/formatters/html_inline.rb +31 -0
  200. data/lib/rouge/formatters/html_legacy.rb +45 -0
  201. data/lib/rouge/formatters/html_line_table.rb +53 -0
  202. data/lib/rouge/formatters/html_linewise.rb +23 -0
  203. data/lib/rouge/formatters/html_pygments.rb +18 -0
  204. data/lib/rouge/formatters/html_table.rb +51 -0
  205. data/lib/rouge/formatters/null.rb +20 -0
  206. data/lib/rouge/formatters/terminal256.rb +198 -0
  207. data/lib/rouge/formatters/terminal_truecolor.rb +37 -0
  208. data/lib/rouge/formatters/tex.rb +92 -0
  209. data/lib/rouge/guesser.rb +57 -0
  210. data/lib/rouge/guessers/disambiguation.rb +136 -0
  211. data/lib/rouge/guessers/filename.rb +27 -0
  212. data/lib/rouge/guessers/glob_mapping.rb +45 -0
  213. data/lib/rouge/guessers/mimetype.rb +16 -0
  214. data/lib/rouge/guessers/modeline.rb +46 -0
  215. data/lib/rouge/guessers/source.rb +31 -0
  216. data/lib/rouge/guessers/util.rb +34 -0
  217. data/lib/rouge/lexer.rb +517 -0
  218. data/lib/rouge/lexers/abap.rb +240 -0
  219. data/lib/rouge/lexers/actionscript.rb +196 -0
  220. data/lib/rouge/lexers/ada.rb +162 -0
  221. data/lib/rouge/lexers/apache.rb +69 -0
  222. data/lib/rouge/lexers/apache/keywords.rb +15 -0
  223. data/lib/rouge/lexers/apex.rb +126 -0
  224. data/lib/rouge/lexers/apiblueprint.rb +49 -0
  225. data/lib/rouge/lexers/apple_script.rb +370 -0
  226. data/lib/rouge/lexers/armasm.rb +145 -0
  227. data/lib/rouge/lexers/awk.rb +162 -0
  228. data/lib/rouge/lexers/batchfile.rb +164 -0
  229. data/lib/rouge/lexers/bbcbasic.rb +112 -0
  230. data/lib/rouge/lexers/biml.rb +43 -0
  231. data/lib/rouge/lexers/bpf.rb +118 -0
  232. data/lib/rouge/lexers/brainfuck.rb +53 -0
  233. data/lib/rouge/lexers/bsl.rb +82 -0
  234. data/lib/rouge/lexers/c.rb +190 -0
  235. data/lib/rouge/lexers/ceylon.rb +96 -0
  236. data/lib/rouge/lexers/cfscript.rb +154 -0
  237. data/lib/rouge/lexers/clean.rb +156 -0
  238. data/lib/rouge/lexers/clojure.rb +113 -0
  239. data/lib/rouge/lexers/cmake.rb +208 -0
  240. data/lib/rouge/lexers/cmhg.rb +34 -0
  241. data/lib/rouge/lexers/coffeescript.rb +215 -0
  242. data/lib/rouge/lexers/common_lisp.rb +346 -0
  243. data/lib/rouge/lexers/conf.rb +25 -0
  244. data/lib/rouge/lexers/console.rb +190 -0
  245. data/lib/rouge/lexers/coq.rb +191 -0
  246. data/lib/rouge/lexers/cpp.rb +89 -0
  247. data/lib/rouge/lexers/crystal.rb +430 -0
  248. data/lib/rouge/lexers/csharp.rb +114 -0
  249. data/lib/rouge/lexers/css.rb +274 -0
  250. data/lib/rouge/lexers/csvs.rb +44 -0
  251. data/lib/rouge/lexers/cuda.rb +35 -0
  252. data/lib/rouge/lexers/cypher.rb +108 -0
  253. data/lib/rouge/lexers/cython.rb +151 -0
  254. data/lib/rouge/lexers/d.rb +177 -0
  255. data/lib/rouge/lexers/dart.rb +105 -0
  256. data/lib/rouge/lexers/datastudio.rb +138 -0
  257. data/lib/rouge/lexers/diff.rb +37 -0
  258. data/lib/rouge/lexers/digdag.rb +70 -0
  259. data/lib/rouge/lexers/docker.rb +51 -0
  260. data/lib/rouge/lexers/dot.rb +69 -0
  261. data/lib/rouge/lexers/ecl.rb +175 -0
  262. data/lib/rouge/lexers/eex.rb +52 -0
  263. data/lib/rouge/lexers/eiffel.rb +66 -0
  264. data/lib/rouge/lexers/elixir.rb +149 -0
  265. data/lib/rouge/lexers/elm.rb +90 -0
  266. data/lib/rouge/lexers/epp.rb +51 -0
  267. data/lib/rouge/lexers/erb.rb +53 -0
  268. data/lib/rouge/lexers/erlang.rb +115 -0
  269. data/lib/rouge/lexers/escape.rb +58 -0
  270. data/lib/rouge/lexers/factor.rb +303 -0
  271. data/lib/rouge/lexers/fortran.rb +178 -0
  272. data/lib/rouge/lexers/freefem.rb +240 -0
  273. data/lib/rouge/lexers/fsharp.rb +120 -0
  274. data/lib/rouge/lexers/gdscript.rb +171 -0
  275. data/lib/rouge/lexers/ghc_cmm.rb +340 -0
  276. data/lib/rouge/lexers/ghc_core.rb +151 -0
  277. data/lib/rouge/lexers/gherkin.rb +140 -0
  278. data/lib/rouge/lexers/gherkin/keywords.rb +16 -0
  279. data/lib/rouge/lexers/glsl.rb +132 -0
  280. data/lib/rouge/lexers/go.rb +175 -0
  281. data/lib/rouge/lexers/gradle.rb +38 -0
  282. data/lib/rouge/lexers/graphql.rb +261 -0
  283. data/lib/rouge/lexers/groovy.rb +111 -0
  284. data/lib/rouge/lexers/hack.rb +49 -0
  285. data/lib/rouge/lexers/haml.rb +226 -0
  286. data/lib/rouge/lexers/handlebars.rb +91 -0
  287. data/lib/rouge/lexers/haskell.rb +199 -0
  288. data/lib/rouge/lexers/haxe.rb +246 -0
  289. data/lib/rouge/lexers/hcl.rb +163 -0
  290. data/lib/rouge/lexers/hocon.rb +86 -0
  291. data/lib/rouge/lexers/hql.rb +139 -0
  292. data/lib/rouge/lexers/html.rb +141 -0
  293. data/lib/rouge/lexers/http.rb +81 -0
  294. data/lib/rouge/lexers/hylang.rb +94 -0
  295. data/lib/rouge/lexers/idlang.rb +312 -0
  296. data/lib/rouge/lexers/igorpro.rb +664 -0
  297. data/lib/rouge/lexers/ini.rb +54 -0
  298. data/lib/rouge/lexers/io.rb +69 -0
  299. data/lib/rouge/lexers/irb.rb +67 -0
  300. data/lib/rouge/lexers/isbl.rb +97 -0
  301. data/lib/rouge/lexers/isbl/builtins.rb +17 -0
  302. data/lib/rouge/lexers/java.rb +91 -0
  303. data/lib/rouge/lexers/javascript.rb +279 -0
  304. data/lib/rouge/lexers/jinja.rb +154 -0
  305. data/lib/rouge/lexers/jsl.rb +55 -0
  306. data/lib/rouge/lexers/json.rb +72 -0
  307. data/lib/rouge/lexers/json_doc.rb +26 -0
  308. data/lib/rouge/lexers/jsonnet.rb +152 -0
  309. data/lib/rouge/lexers/jsp.rb +120 -0
  310. data/lib/rouge/lexers/jsx.rb +104 -0
  311. data/lib/rouge/lexers/julia.rb +290 -0
  312. data/lib/rouge/lexers/kotlin.rb +131 -0
  313. data/lib/rouge/lexers/lasso.rb +210 -0
  314. data/lib/rouge/lexers/lasso/keywords.rb +14 -0
  315. data/lib/rouge/lexers/liquid.rb +285 -0
  316. data/lib/rouge/lexers/literate_coffeescript.rb +34 -0
  317. data/lib/rouge/lexers/literate_haskell.rb +37 -0
  318. data/lib/rouge/lexers/llvm.rb +97 -0
  319. data/lib/rouge/lexers/lua.rb +164 -0
  320. data/lib/rouge/lexers/lua/builtins.rb +24 -0
  321. data/lib/rouge/lexers/lustre.rb +79 -0
  322. data/lib/rouge/lexers/lutin.rb +33 -0
  323. data/lib/rouge/lexers/m68k.rb +143 -0
  324. data/lib/rouge/lexers/magik.rb +127 -0
  325. data/lib/rouge/lexers/make.rb +135 -0
  326. data/lib/rouge/lexers/markdown.rb +182 -0
  327. data/lib/rouge/lexers/mason.rb +110 -0
  328. data/lib/rouge/lexers/mathematica.rb +96 -0
  329. data/lib/rouge/lexers/mathematica/builtins.rb +13 -0
  330. data/lib/rouge/lexers/matlab.rb +80 -0
  331. data/lib/rouge/lexers/matlab/builtins.rb +11 -0
  332. data/lib/rouge/lexers/minizinc.rb +87 -0
  333. data/lib/rouge/lexers/moonscript.rb +115 -0
  334. data/lib/rouge/lexers/mosel.rb +232 -0
  335. data/lib/rouge/lexers/msgtrans.rb +26 -0
  336. data/lib/rouge/lexers/mxml.rb +69 -0
  337. data/lib/rouge/lexers/nasm.rb +72 -0
  338. data/lib/rouge/lexers/nesasm.rb +78 -0
  339. data/lib/rouge/lexers/nginx.rb +72 -0
  340. data/lib/rouge/lexers/nim.rb +154 -0
  341. data/lib/rouge/lexers/nix.rb +211 -0
  342. data/lib/rouge/lexers/objective_c.rb +21 -0
  343. data/lib/rouge/lexers/objective_c/common.rb +184 -0
  344. data/lib/rouge/lexers/objective_cpp.rb +31 -0
  345. data/lib/rouge/lexers/ocaml.rb +65 -0
  346. data/lib/rouge/lexers/ocaml/common.rb +53 -0
  347. data/lib/rouge/lexers/openedge.rb +429 -0
  348. data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
  349. data/lib/rouge/lexers/pascal.rb +67 -0
  350. data/lib/rouge/lexers/perl.rb +231 -0
  351. data/lib/rouge/lexers/php.rb +231 -0
  352. data/lib/rouge/lexers/php/builtins.rb +203 -0
  353. data/lib/rouge/lexers/plain_text.rb +27 -0
  354. data/lib/rouge/lexers/plist.rb +47 -0
  355. data/lib/rouge/lexers/pony.rb +94 -0
  356. data/lib/rouge/lexers/powershell.rb +230 -0
  357. data/lib/rouge/lexers/praat.rb +351 -0
  358. data/lib/rouge/lexers/prolog.rb +67 -0
  359. data/lib/rouge/lexers/prometheus.rb +123 -0
  360. data/lib/rouge/lexers/properties.rb +52 -0
  361. data/lib/rouge/lexers/protobuf.rb +71 -0
  362. data/lib/rouge/lexers/puppet.rb +129 -0
  363. data/lib/rouge/lexers/python.rb +257 -0
  364. data/lib/rouge/lexers/q.rb +126 -0
  365. data/lib/rouge/lexers/qml.rb +74 -0
  366. data/lib/rouge/lexers/r.rb +89 -0
  367. data/lib/rouge/lexers/racket.rb +568 -0
  368. data/lib/rouge/lexers/reasonml.rb +65 -0
  369. data/lib/rouge/lexers/rego.rb +45 -0
  370. data/lib/rouge/lexers/robot_framework.rb +249 -0
  371. data/lib/rouge/lexers/ruby.rb +454 -0
  372. data/lib/rouge/lexers/rust.rb +193 -0
  373. data/lib/rouge/lexers/sas.rb +563 -0
  374. data/lib/rouge/lexers/sass.rb +75 -0
  375. data/lib/rouge/lexers/sass/common.rb +181 -0
  376. data/lib/rouge/lexers/scala.rb +169 -0
  377. data/lib/rouge/lexers/scheme.rb +113 -0
  378. data/lib/rouge/lexers/scss.rb +35 -0
  379. data/lib/rouge/lexers/sed.rb +173 -0
  380. data/lib/rouge/lexers/shell.rb +201 -0
  381. data/lib/rouge/lexers/sieve.rb +97 -0
  382. data/lib/rouge/lexers/slice.rb +32 -0
  383. data/lib/rouge/lexers/slim.rb +229 -0
  384. data/lib/rouge/lexers/smalltalk.rb +117 -0
  385. data/lib/rouge/lexers/smarty.rb +81 -0
  386. data/lib/rouge/lexers/sml.rb +345 -0
  387. data/lib/rouge/lexers/solidity.rb +185 -0
  388. data/lib/rouge/lexers/sparql.rb +129 -0
  389. data/lib/rouge/lexers/sqf.rb +109 -0
  390. data/lib/rouge/lexers/sqf/commands.rb +15 -0
  391. data/lib/rouge/lexers/sql.rb +161 -0
  392. data/lib/rouge/lexers/supercollider.rb +116 -0
  393. data/lib/rouge/lexers/swift.rb +186 -0
  394. data/lib/rouge/lexers/tap.rb +89 -0
  395. data/lib/rouge/lexers/tcl.rb +193 -0
  396. data/lib/rouge/lexers/terraform.rb +128 -0
  397. data/lib/rouge/lexers/tex.rb +70 -0
  398. data/lib/rouge/lexers/toml.rb +106 -0
  399. data/lib/rouge/lexers/tsx.rb +20 -0
  400. data/lib/rouge/lexers/ttcn3.rb +119 -0
  401. data/lib/rouge/lexers/tulip.rb +108 -0
  402. data/lib/rouge/lexers/turtle.rb +61 -0
  403. data/lib/rouge/lexers/twig.rb +40 -0
  404. data/lib/rouge/lexers/typescript.rb +34 -0
  405. data/lib/rouge/lexers/typescript/common.rb +34 -0
  406. data/lib/rouge/lexers/vala.rb +78 -0
  407. data/lib/rouge/lexers/varnish.rb +168 -0
  408. data/lib/rouge/lexers/vb.rb +165 -0
  409. data/lib/rouge/lexers/verilog.rb +163 -0
  410. data/lib/rouge/lexers/vhdl.rb +98 -0
  411. data/lib/rouge/lexers/viml.rb +102 -0
  412. data/lib/rouge/lexers/viml/keywords.rb +14 -0
  413. data/lib/rouge/lexers/vue.rb +127 -0
  414. data/lib/rouge/lexers/wollok.rb +104 -0
  415. data/lib/rouge/lexers/xml.rb +54 -0
  416. data/lib/rouge/lexers/xojo.rb +61 -0
  417. data/lib/rouge/lexers/xpath.rb +332 -0
  418. data/lib/rouge/lexers/xquery.rb +145 -0
  419. data/lib/rouge/lexers/yaml.rb +376 -0
  420. data/lib/rouge/lexers/yang.rb +147 -0
  421. data/lib/rouge/plugins/redcarpet.rb +37 -0
  422. data/lib/rouge/regex_lexer.rb +443 -0
  423. data/lib/rouge/template_lexer.rb +21 -0
  424. data/lib/rouge/tex_theme_renderer.rb +132 -0
  425. data/lib/rouge/text_analyzer.rb +50 -0
  426. data/lib/rouge/theme.rb +218 -0
  427. data/lib/rouge/themes/base16.rb +131 -0
  428. data/lib/rouge/themes/bw.rb +41 -0
  429. data/lib/rouge/themes/colorful.rb +68 -0
  430. data/lib/rouge/themes/github.rb +72 -0
  431. data/lib/rouge/themes/gruvbox.rb +168 -0
  432. data/lib/rouge/themes/igor_pro.rb +21 -0
  433. data/lib/rouge/themes/magritte.rb +78 -0
  434. data/lib/rouge/themes/molokai.rb +83 -0
  435. data/lib/rouge/themes/monokai.rb +93 -0
  436. data/lib/rouge/themes/monokai_sublime.rb +93 -0
  437. data/lib/rouge/themes/pastie.rb +70 -0
  438. data/lib/rouge/themes/thankful_eyes.rb +75 -0
  439. data/lib/rouge/themes/tulip.rb +70 -0
  440. data/lib/rouge/token.rb +191 -0
  441. data/lib/rouge/util.rb +102 -0
  442. data/lib/rouge/version.rb +8 -0
  443. data/rouge.gemspec +26 -0
  444. metadata +491 -0
@@ -0,0 +1,113 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class OpenTypeFeatureFile < RegexLexer
7
+ title "OpenType Feature File"
8
+ desc "Feature specifications for an OpenType font (adobe-type-tools.github.io/afdko)"
9
+ tag 'opentype_feature_file'
10
+ aliases 'fea', 'opentype', 'opentypefeature'
11
+ filenames '*.fea'
12
+
13
+ def self.keywords
14
+ @keywords ||= %w(
15
+ Ascender Attach CapHeight CaretOffset CodePageRange Descender FontRevision FSType
16
+ GlyphClassDef HorizAxis.BaseScriptList HorizAxis.BaseTagList HorizAxis.MinMax
17
+ IgnoreBaseGlyphs IgnoreLigatures IgnoreMarks LigatureCaretByDev LigatureCaretByIndex
18
+ LigatureCaretByPos LineGap MarkAttachClass MarkAttachmentType NULL Panose RightToLeft
19
+ TypoAscender TypoDescender TypoLineGap UnicodeRange UseMarkFilteringSet Vendor
20
+ VertAdvanceY VertAxis.BaseScriptList VertAxis.BaseTagList VertAxis.MinMax VertOriginY
21
+ VertTypoAscender VertTypoDescender VertTypoLineGap WeightClass WidthClass XHeight
22
+
23
+ anchorDef anchor anonymous anon by contour cursive device enumerate enum
24
+ exclude_dflt featureNames feature from ignore include_dflt include languagesystem
25
+ language lookupflag lookup markClass mark nameid name parameters position pos required
26
+ reversesub rsub script sizemenuname substitute subtable sub table useExtension
27
+ valueRecordDef winAscent winDescent
28
+ )
29
+ end
30
+
31
+
32
+ identifier = %r/[a-z_][a-z0-9\/_]*/i
33
+
34
+ state :root do
35
+ rule %r/\s+/m, Text::Whitespace
36
+ rule %r/#.*$/, Comment
37
+
38
+ # feature <tag>
39
+ rule %r/(anonymous|anon|feature|lookup|table)((?:\s)+)/ do
40
+ groups Keyword, Text
41
+ push :featurename
42
+ end
43
+ # } <tag> ;
44
+ rule %r/(\})((?:\s)*)/ do
45
+ groups Punctuation, Text
46
+ push :featurename
47
+ end
48
+ # solve include( ../path)
49
+ rule %r/(include)/i, Keyword, :includepath
50
+
51
+ rule %r/[\-\[\]\/(){},.:;=%*<>']/, Punctuation
52
+
53
+ rule %r/`.*?/, Str::Backtick
54
+ rule %r/\"/, Str, :dqs
55
+
56
+ # classes, start with @<nameOfClass>
57
+ rule %r/@#{identifier}/, Name::Class
58
+
59
+ # using negative lookbehind so we don't match property names
60
+ rule %r/(?<!\.)#{identifier}/ do |m|
61
+ if self.class.keywords.include? m[0]
62
+ token Keyword
63
+ else
64
+ token Name
65
+ end
66
+ end
67
+
68
+ rule identifier, Name
69
+ rule %r/-?\d+/, Num::Integer
70
+ end
71
+
72
+ state :featurename do
73
+ rule identifier, Name::Function, :pop!
74
+ end
75
+
76
+ state :includepath do
77
+ rule %r/\s+/, Text::Whitespace
78
+ rule %r/\)/, Punctuation, :pop!
79
+ rule %r/\(/, Punctuation
80
+ rule %r/[a-z0-9\/_.]*/i, Str
81
+ end
82
+
83
+ state :strings do
84
+ rule %r/(\([a-z0-9_]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?/i, Str
85
+ end
86
+
87
+ state :strings_double do
88
+ rule %r/[^\\"%\n]+/, Str
89
+ mixin :strings
90
+ end
91
+
92
+ state :escape do
93
+ rule %r(\\
94
+ ( [\\abfnrtv"']
95
+ | \n
96
+ | N{[a-zA-z][a-zA-Z ]+[a-zA-Z]}
97
+ | u[a-fA-F0-9]{4}
98
+ | U[a-fA-F0-9]{8}
99
+ | x[a-fA-F0-9]{2}
100
+ | [0-7]{1,3}
101
+ )
102
+ )x, Str::Escape
103
+ end
104
+
105
+ state :dqs do
106
+ rule %r/"/, Str, :pop!
107
+ mixin :escape
108
+ mixin :strings_double
109
+ end
110
+
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,67 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Pascal < RegexLexer
7
+ tag 'pascal'
8
+ title "Pascal"
9
+ desc 'a procedural programming language commonly used as a teaching language.'
10
+ filenames '*.pas', '*.lpr'
11
+
12
+ mimetypes 'text/x-pascal'
13
+
14
+ id = /@?[_a-z]\w*/i
15
+
16
+ keywords = %w(
17
+ absolute abstract all and and_then array as asm assembler attribute
18
+ begin bindable case class const constructor delay destructor div do
19
+ downto else end except exit export exports external far file finalization
20
+ finally for forward function goto if implementation import in inc index
21
+ inherited initialization inline interface interrupt is label library
22
+ message mod module near nil not object of on only operator or or_else
23
+ otherwise out overload override packed pascal pow private procedure program
24
+ property protected public published qualified raise read record register
25
+ repeat resident resourcestring restricted safecall segment set shl shr
26
+ stdcall stored string then threadvar to try type unit until uses value var
27
+ view virtual while with write writeln xor
28
+ )
29
+
30
+ keywords_type = %w(
31
+ ansichar ansistring bool boolean byte bytebool cardinal char comp currency
32
+ double dword extended int64 integer iunknown longbool longint longword pansichar
33
+ pansistring pbool pboolean pbyte pbytearray pcardinal pchar pcomp pcurrency
34
+ pdate pdatetime pdouble pdword pextended phandle pint64 pinteger plongint plongword
35
+ pointer ppointer pshortint pshortstring psingle psmallint pstring pvariant pwidechar
36
+ pwidestring pword pwordarray pwordbool real real48 shortint shortstring single
37
+ smallint string tclass tdate tdatetime textfile thandle tobject ttime variant
38
+ widechar widestring word wordbool
39
+ )
40
+
41
+ state :whitespace do
42
+ # Spaces
43
+ rule %r/\s+/m, Text
44
+ # // Comments
45
+ rule %r((//).*$\n?), Comment::Single
46
+ # -- Comments
47
+ rule %r((--).*$\n?), Comment::Single
48
+ # (* Comments *)
49
+ rule %r(\(\*.*?\*\))m, Comment::Multiline
50
+ # { Comments }
51
+ rule %r(\{.*?\})m, Comment::Multiline
52
+ end
53
+
54
+ state :root do
55
+ mixin :whitespace
56
+
57
+ rule %r{((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?}, Num
58
+ rule %r{[~!@#\$%\^&\*\(\)\+`\-={}\[\]:;<>\?,\.\/\|\\]}, Punctuation
59
+ rule %r{'([^']|'')*'}, Str
60
+ rule %r/(true|false|nil)\b/i, Name::Builtin
61
+ rule %r/\b(#{keywords.join('|')})\b/i, Keyword
62
+ rule %r/\b(#{keywords_type.join('|')})\b/i, Keyword::Type
63
+ rule id, Name
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,231 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Perl < RegexLexer
7
+ title "Perl"
8
+ desc "The Perl scripting language (perl.org)"
9
+
10
+ tag 'perl'
11
+ aliases 'pl'
12
+
13
+ filenames '*.pl', '*.pm', '*.t'
14
+ mimetypes 'text/x-perl', 'application/x-perl'
15
+
16
+ def self.detect?(text)
17
+ return true if text.shebang? 'perl'
18
+ end
19
+
20
+ keywords = %w(
21
+ case continue do else elsif for foreach if last my next our
22
+ redo reset then unless until while use print new BEGIN CHECK
23
+ INIT END return
24
+ )
25
+
26
+ builtins = %w(
27
+ abs accept alarm atan2 bind binmode bless caller chdir chmod
28
+ chomp chop chown chr chroot close closedir connect continue cos
29
+ crypt dbmclose dbmopen defined delete die dump each endgrent
30
+ endhostent endnetent endprotoent endpwent endservent eof eval
31
+ exec exists exit exp fcntl fileno flock fork format formline getc
32
+ getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent
33
+ getlogin getnetbyaddr getnetbyname getnetent getpeername
34
+ getpgrp getppid getpriority getprotobyname getprotobynumber
35
+ getprotoent getpwent getpwnam getpwuid getservbyname getservbyport
36
+ getservent getsockname getsockopt glob gmtime goto grep hex
37
+ import index int ioctl join keys kill last lc lcfirst length
38
+ link listen local localtime log lstat map mkdir msgctl msgget
39
+ msgrcv msgsnd my next no oct open opendir ord our pack package
40
+ pipe pop pos printf prototype push quotemeta rand read readdir
41
+ readline readlink readpipe recv redo ref rename require reverse
42
+ rewinddir rindex rmdir scalar seek seekdir select semctl semget
43
+ semop send setgrent sethostent setnetent setpgrp setpriority
44
+ setprotoent setpwent setservent setsockopt shift shmctl shmget
45
+ shmread shmwrite shutdown sin sleep socket socketpair sort splice
46
+ split sprintf sqrt srand stat study substr symlink syscall sysopen
47
+ sysread sysseek system syswrite tell telldir tie tied time times
48
+ tr truncate uc ucfirst umask undef unlink unpack unshift untie
49
+ utime values vec wait waitpid wantarray warn write
50
+ )
51
+
52
+ re_tok = Str::Regex
53
+
54
+ state :balanced_regex do
55
+ rule %r(/(\\[\\/]|[^/])*/[egimosx]*)m, re_tok, :pop!
56
+ rule %r(!(\\[\\!]|[^!])*![egimosx]*)m, re_tok, :pop!
57
+ rule %r(\\(\\\\|[^\\])*\\[egimosx]*)m, re_tok, :pop!
58
+ rule %r({(\\[\\}]|[^}])*}[egimosx]*), re_tok, :pop!
59
+ rule %r(<(\\[\\>]|[^>])*>[egimosx]*), re_tok, :pop!
60
+ rule %r(\[(\\[\\\]]|[^\]])*\][egimosx]*), re_tok, :pop!
61
+ rule %r[\((\\[\\\)]|[^\)])*\)[egimosx]*], re_tok, :pop!
62
+ rule %r(@(\\[\\@]|[^@])*@[egimosx]*), re_tok, :pop!
63
+ rule %r(%(\\[\\%]|[^%])*%[egimosx]*), re_tok, :pop!
64
+ rule %r(\$(\\[\\\$]|[^\$])*\$[egimosx]*), re_tok, :pop!
65
+ end
66
+
67
+ state :root do
68
+ rule %r/#.*?$/, Comment::Single
69
+ rule %r/^=[a-zA-Z0-9]+\s+.*?\n=cut/m, Comment::Multiline
70
+ rule %r/(?:#{keywords.join('|')})\b/, Keyword
71
+
72
+ rule %r/(format)(\s+)([a-zA-Z0-9_]+)(\s*)(=)(\s*\n)/ do
73
+ groups Keyword, Text, Name, Text, Punctuation, Text
74
+
75
+ push :format
76
+ end
77
+
78
+ rule %r/(?:eq|lt|gt|le|ge|ne|not|and|or|cmp)\b/, Operator::Word
79
+
80
+ # substitution/transliteration: balanced delimiters
81
+ rule %r((?:s|tr|y){(\\\\|\\}|[^}])*}\s*), re_tok, :balanced_regex
82
+ rule %r((?:s|tr|y)<(\\\\|\\>|[^>])*>\s*), re_tok, :balanced_regex
83
+ rule %r((?:s|tr|y)\[(\\\\|\\\]|[^\]])*\]\s*), re_tok, :balanced_regex
84
+ rule %r[(?:s|tr|y)\((\\\\|\\\)|[^\)])*\)\s*], re_tok, :balanced_regex
85
+
86
+ # substitution/transliteration: arbitrary non-whitespace delimiters
87
+ rule %r((?:s|tr|y)\s*([^\w\s])((\\\\|\\\1)|[^\1])*?\1((\\\\|\\\1)|[^\1])*?\1[msixpodualngcr]*)m, re_tok
88
+ rule %r((?:s|tr|y)\s+(\w)((\\\\|\\\1)|[^\1])*?\1((\\\\|\\\1)|[^\1])*?\1[msixpodualngcr]*)m, re_tok
89
+
90
+ # matches: common case, m-optional
91
+ rule %r(m?/(\\\\|\\/|[^/\n])*/[msixpodualngc]*), re_tok
92
+ rule %r(m(?=[/!\\{<\[\(@%\$])), re_tok, :balanced_regex
93
+
94
+ # arbitrary non-whitespace delimiters
95
+ rule %r(m\s*([^\w\s])((\\\\|\\\1)|[^\1])*?\1[msixpodualngc]*)m, re_tok
96
+ rule %r(m\s+(\w)((\\\\|\\\1)|[^\1])*?\1[msixpodualngc]*)m, re_tok
97
+
98
+ rule %r(((?<==~)|(?<=\())\s*/(\\\\|\\/|[^/])*/[msixpodualngc]*),
99
+ re_tok, :balanced_regex
100
+
101
+ rule %r/\s+/, Text
102
+ rule %r/(?:#{builtins.join('|')})\b/, Name::Builtin
103
+ rule %r/((__(DIE|WARN)__)|(DATA|STD(IN|OUT|ERR)))\b/,
104
+ Name::Builtin::Pseudo
105
+
106
+ rule %r/<<([\'"]?)([a-zA-Z_][a-zA-Z0-9_]*)\1;?\n.*?\n\2\n/m, Str
107
+
108
+ rule %r/(__(END|DATA)__)\b/, Comment::Preproc, :end_part
109
+ rule %r/\$\^[ADEFHILMOPSTWX]/, Name::Variable::Global
110
+ rule %r/\$[\\"'\[\]&`+*.,;=%~?@$!<>(^\|\/-](?!\w)/, Name::Variable::Global
111
+ rule %r/[-+\/*%=<>&^\|!\\~]=?/, Operator
112
+ rule %r/[$@%#]+/, Name::Variable, :varname
113
+
114
+ rule %r/0_?[0-7]+(_[0-7]+)*/, Num::Oct
115
+ rule %r/0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*/, Num::Hex
116
+ rule %r/0b[01]+(_[01]+)*/, Num::Bin
117
+ rule %r/(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?/i,
118
+ Num::Float
119
+ rule %r/\d+(_\d*)*e[+-]?\d+(_\d*)*/i, Num::Float
120
+ rule %r/\d+(_\d+)*/, Num::Integer
121
+
122
+ rule %r/'/, Punctuation, :sq
123
+ rule %r/"/, Punctuation, :dq
124
+ rule %r/`/, Punctuation, :bq
125
+ rule %r/<([^\s>]+)>/, re_tok
126
+ rule %r/(q|qq|qw|qr|qx)\{/, Str::Other, :cb_string
127
+ rule %r/(q|qq|qw|qr|qx)\(/, Str::Other, :rb_string
128
+ rule %r/(q|qq|qw|qr|qx)\[/, Str::Other, :sb_string
129
+ rule %r/(q|qq|qw|qr|qx)</, Str::Other, :lt_string
130
+ rule %r/(q|qq|qw|qr|qx)(\W)(.|\n)*?\2/, Str::Other
131
+
132
+ rule %r/package\s+/, Keyword, :modulename
133
+ rule %r/sub\s+/, Keyword, :funcname
134
+ rule %r/\[\]|\*\*|::|<<|>>|>=|<=|<=>|={3}|!=|=~|!~|&&?|\|\||\.{1,3}/,
135
+ Operator
136
+ rule %r/[()\[\]:;,<>\/?{}]/, Punctuation
137
+ rule(/(?=\w)/) { push :name }
138
+ end
139
+
140
+ state :format do
141
+ rule %r/\.\n/, Str::Interpol, :pop!
142
+ rule %r/.*?\n/, Str::Interpol
143
+ end
144
+
145
+ state :name_common do
146
+ rule %r/\w+::/, Name::Namespace
147
+ rule %r/[\w:]+/, Name::Variable, :pop!
148
+ end
149
+
150
+ state :varname do
151
+ rule %r/\s+/, Text
152
+ rule %r/\{/, Punctuation, :pop! # hash syntax
153
+ rule %r/\)|,/, Punctuation, :pop! # arg specifier
154
+ mixin :name_common
155
+ end
156
+
157
+ state :name do
158
+ mixin :name_common
159
+ rule %r/[A-Z_]+(?=[^a-zA-Z0-9_])/, Name::Constant, :pop!
160
+ rule(/(?=\W)/) { pop! }
161
+ end
162
+
163
+ state :modulename do
164
+ rule %r/[a-z_]\w*/i, Name::Namespace, :pop!
165
+ end
166
+
167
+ state :funcname do
168
+ rule %r/[a-zA-Z_]\w*[!?]?/, Name::Function
169
+ rule %r/\s+/, Text
170
+
171
+ # argument declaration
172
+ rule %r/(\([$@%]*\))(\s*)/ do
173
+ groups Punctuation, Text
174
+ end
175
+
176
+ rule %r/.*?{/, Punctuation, :pop!
177
+ rule %r/;/, Punctuation, :pop!
178
+ end
179
+
180
+ state :sq do
181
+ rule %r/\\[']/, Str::Escape
182
+ rule %r/[^\\']+/, Str::Single
183
+ rule %r/'/, Punctuation, :pop!
184
+ end
185
+
186
+ state :dq do
187
+ mixin :string_intp
188
+ rule %r/\\[\\tnr"]/, Str::Escape
189
+ rule %r/[^\\"]+?/, Str::Double
190
+ rule %r/"/, Punctuation, :pop!
191
+ end
192
+
193
+ state :bq do
194
+ mixin :string_intp
195
+ rule %r/\\[\\tnr`]/, Str::Escape
196
+ rule %r/[^\\`]+?/, Str::Backtick
197
+ rule %r/`/, Punctuation, :pop!
198
+ end
199
+
200
+ [[:cb, '\{', '\}'],
201
+ [:rb, '\(', '\)'],
202
+ [:sb, '\[', '\]'],
203
+ [:lt, '<', '>']].each do |name, open, close|
204
+ tok = Str::Other
205
+ state :"#{name}_string" do
206
+ rule %r/\\[#{open}#{close}\\]/, tok
207
+ rule %r/\\/, tok
208
+ rule(/#{open}/) { token tok; push }
209
+ rule %r/#{close}/, tok, :pop!
210
+ rule %r/[^#{open}#{close}\\]+/, tok
211
+ end
212
+ end
213
+
214
+ state :in_interp do
215
+ rule %r/}/, Str::Interpol, :pop!
216
+ rule %r/\s+/, Text
217
+ rule %r/[a-z_]\w*/i, Str::Interpol
218
+ end
219
+
220
+ state :string_intp do
221
+ rule %r/[$@][{]/, Str::Interpol, :in_interp
222
+ rule %r/[$@][a-z_]\w*/i, Str::Interpol
223
+ end
224
+
225
+ state :end_part do
226
+ # eat the rest of the stream
227
+ rule %r/.+/m, Comment::Preproc, :pop!
228
+ end
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,231 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class PHP < TemplateLexer
7
+ title "PHP"
8
+ desc "The PHP scripting language (php.net)"
9
+ tag 'php'
10
+ aliases 'php', 'php3', 'php4', 'php5'
11
+ filenames '*.php', '*.php[345t]','*.phtml',
12
+ # Support Drupal file extensions, see:
13
+ # https://github.com/gitlabhq/gitlabhq/issues/8900
14
+ '*.module', '*.inc', '*.profile', '*.install', '*.test'
15
+ mimetypes 'text/x-php'
16
+
17
+ option :start_inline, 'Whether to start with inline php or require <?php ... ?>. (default: best guess)'
18
+ option :funcnamehighlighting, 'Whether to highlight builtin functions (default: true)'
19
+ option :disabledmodules, 'Disable certain modules from being highlighted as builtins (default: empty)'
20
+
21
+ def initialize(*)
22
+ super
23
+
24
+ # if truthy, the lexer starts highlighting with php code
25
+ # (no <?php required)
26
+ @start_inline = bool_option(:start_inline) { :guess }
27
+ @funcnamehighlighting = bool_option(:funcnamehighlighting) { true }
28
+ @disabledmodules = list_option(:disabledmodules)
29
+ end
30
+
31
+ def self.builtins
32
+ load File.join(Lexers::BASE_DIR, 'php/builtins.rb')
33
+ self.builtins
34
+ end
35
+
36
+ def builtins
37
+ return [] unless @funcnamehighlighting
38
+
39
+ @builtins ||= Set.new.tap do |builtins|
40
+ self.class.builtins.each do |mod, fns|
41
+ next if @disabledmodules.include? mod
42
+ builtins.merge(fns)
43
+ end
44
+ end
45
+ end
46
+
47
+ # source: http://php.net/manual/en/language.variables.basics.php
48
+ # the given regex is invalid utf8, so... we're using the unicode
49
+ # "Letter" property instead.
50
+ id = /[\p{L}_][\p{L}\p{N}_]*/
51
+ nsid = /#{id}(?:\\#{id})*/
52
+
53
+ start do
54
+ case @start_inline
55
+ when true
56
+ push :template
57
+ push :php
58
+ when false
59
+ push :template
60
+ when :guess
61
+ # pass
62
+ end
63
+ end
64
+
65
+ def self.keywords
66
+ # (echo parent ; echo self ; sed -nE 's/<ST_IN_SCRIPTING>"((__)?[[:alpha:]_]+(__)?)".*/\1/p' zend_language_scanner.l | tr '[A-Z]' '[a-z]') | sort -u | grep -Fwv -e isset -e unset -e empty -e const -e use -e function -e namespace
67
+ # - isset, unset and empty are actually keywords (directly handled by PHP's lexer but let's pretend these are functions, you use them like so)
68
+ # - self and parent are kind of keywords, they are not handled by PHP's lexer
69
+ # - use, const, namespace and function are handled by specific rules to highlight what's next to the keyword
70
+ # - class is also listed here, in addition to the rule below, to handle anonymous classes
71
+ @keywords ||= Set.new %w(
72
+ old_function cfunction
73
+ __class__ __dir__ __file__ __function__ __halt_compiler
74
+ __line__ __method__ __namespace__ __trait__ abstract and
75
+ array as break callable case catch class clone continue
76
+ declare default die do echo else elseif enddeclare
77
+ endfor endforeach endif endswitch endwhile eval exit
78
+ extends final finally fn for foreach global goto if
79
+ implements include include_once instanceof insteadof
80
+ interface list new or parent print private protected
81
+ public require require_once return self static switch
82
+ throw trait try var while xor yield
83
+ )
84
+ end
85
+
86
+ def self.detect?(text)
87
+ return true if text.shebang?('php')
88
+ return false if /^<\?hh/ =~ text
89
+ return true if /^<\?php/ =~ text
90
+ end
91
+
92
+ state :root do
93
+ # some extremely rough heuristics to decide whether to start inline or not
94
+ rule(/\s*(?=<)/m) { delegate parent; push :template }
95
+ rule(/[^$]+(?=<\?(php|=))/i) { delegate parent; push :template }
96
+
97
+ rule(//) { push :template; push :php }
98
+ end
99
+
100
+ state :template do
101
+ rule %r/<\?(php|=)?/i, Comment::Preproc, :php
102
+ rule(/.*?(?=<\?)|.*/m) { delegate parent }
103
+ end
104
+
105
+ state :php do
106
+ rule %r/\?>/, Comment::Preproc, :pop!
107
+ # heredocs
108
+ rule %r/<<<(["']?)(#{id})\1\n.*?\n\s*\2;?/im, Str::Heredoc
109
+ rule %r/\s+/, Text
110
+ rule %r/#.*?$/, Comment::Single
111
+ rule %r(//.*?$), Comment::Single
112
+ rule %r(/\*\*(?!/).*?\*/)m, Comment::Doc
113
+ rule %r(/\*.*?\*/)m, Comment::Multiline
114
+
115
+ rule %r/(->|::)(\s*)(#{id})/ do
116
+ groups Operator, Text, Name::Attribute
117
+ end
118
+
119
+ rule %r/(void|\??(int|float|bool|string|iterable|self|callable))\b/i, Keyword::Type
120
+ rule %r/[~!%^&*+=\|:.<>\/@-]+/, Operator
121
+ rule %r/\?/, Operator
122
+ rule %r/[\[\]{}();,]/, Punctuation
123
+ rule %r/(class|interface|trait)(\s+)(#{nsid})/i do
124
+ groups Keyword::Declaration, Text, Name::Class
125
+ end
126
+ rule %r/(use)(\s+)(function|const|)(\s*)(#{nsid})/i do
127
+ groups Keyword::Namespace, Text, Keyword::Namespace, Text, Name::Namespace
128
+ push :use
129
+ end
130
+ rule %r/(namespace)(\s+)(#{nsid})/i do
131
+ groups Keyword::Namespace, Text, Name::Namespace
132
+ end
133
+ # anonymous functions
134
+ rule %r/(function)(\s*)(?=\()/i do
135
+ groups Keyword, Text
136
+ end
137
+
138
+ # named functions
139
+ rule %r/(function)(\s+)(&?)(\s*)/i do
140
+ groups Keyword, Text, Operator, Text
141
+ push :funcname
142
+ end
143
+
144
+ rule %r/(const)(\s+)(#{id})/i do
145
+ groups Keyword, Text, Name::Constant
146
+ end
147
+
148
+ rule %r/stdClass\b/i, Name::Class
149
+ rule %r/(true|false|null)\b/i, Keyword::Constant
150
+ rule %r/(E|PHP)(_[[:upper:]]+)+\b/, Keyword::Constant
151
+ rule %r/\$\{\$+#{id}\}/i, Name::Variable
152
+ rule %r/\$+#{id}/i, Name::Variable
153
+ rule %r/(yield)([ \n\r\t]+)(from)/i do
154
+ groups Keyword, Text, Keyword
155
+ end
156
+
157
+ # may be intercepted for builtin highlighting
158
+ rule %r/\\?#{nsid}/i do |m|
159
+ name = m[0].downcase
160
+
161
+ if self.class.keywords.include? name
162
+ token Keyword
163
+ elsif self.builtins.include? name
164
+ token Name::Builtin
165
+ else
166
+ token Name::Other
167
+ end
168
+ end
169
+
170
+ rule %r/(\d[_\d]*)?\.(\d[_\d]*)?(e[+-]?\d[_\d]*)?/i, Num::Float
171
+ rule %r/0[0-7][0-7_]*/, Num::Oct
172
+ rule %r/0b[01][01_]*/i, Num::Bin
173
+ rule %r/0x[a-f0-9][a-f0-9_]*/i, Num::Hex
174
+ rule %r/\d[_\d]*/, Num::Integer
175
+ rule %r/'([^'\\]*(?:\\.[^'\\]*)*)'/, Str::Single
176
+ rule %r/`([^`\\]*(?:\\.[^`\\]*)*)`/, Str::Backtick
177
+ rule %r/"/, Str::Double, :string
178
+ end
179
+
180
+ state :use do
181
+ rule %r/(\s+)(as)(\s+)(#{id})/i do
182
+ groups Text, Keyword, Text, Name
183
+ :pop!
184
+ end
185
+ rule %r/\\\{/, Operator, :uselist
186
+ rule %r/;/, Punctuation, :pop!
187
+ end
188
+
189
+ state :uselist do
190
+ rule %r/\s+/, Text
191
+ rule %r/,/, Operator
192
+ rule %r/\}/, Operator, :pop!
193
+ rule %r/(as)(\s+)(#{id})/i do
194
+ groups Keyword, Text, Name
195
+ end
196
+ rule %r/#{id}/, Name::Namespace
197
+ end
198
+
199
+ state :funcname do
200
+ rule %r/#{id}/, Name::Function, :pop!
201
+ end
202
+
203
+ state :string do
204
+ rule %r/"/, Str::Double, :pop!
205
+ rule %r/[^\\{$"]+/, Str::Double
206
+ rule %r/\\u\{[0-9a-fA-F]+\}/, Str::Escape
207
+ rule %r/\\([efrntv\"$\\]|[0-7]{1,3}|[xX][0-9a-fA-F]{1,2})/,
208
+ Str::Escape
209
+ rule %r/\$#{id}(\[\S+\]|->#{id})?/, Name::Variable
210
+
211
+ rule %r/\{\$\{/, Str::Interpol, :interp_double
212
+ rule %r/\{(?=\$)/, Str::Interpol, :interp_single
213
+ rule %r/(\{)(\S+)(\})/ do
214
+ groups Str::Interpol, Name::Variable, Str::Interpol
215
+ end
216
+
217
+ rule %r/[${\\]+/, Str::Double
218
+ end
219
+
220
+ state :interp_double do
221
+ rule %r/\}\}/, Str::Interpol, :pop!
222
+ mixin :php
223
+ end
224
+
225
+ state :interp_single do
226
+ rule %r/\}/, Str::Interpol, :pop!
227
+ mixin :php
228
+ end
229
+ end
230
+ end
231
+ end