rouge 3.17.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 (429) 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 +93 -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/cython +6 -0
  41. data/lib/rouge/demos/d +16 -0
  42. data/lib/rouge/demos/dart +6 -0
  43. data/lib/rouge/demos/diff +7 -0
  44. data/lib/rouge/demos/digdag +19 -0
  45. data/lib/rouge/demos/docker +9 -0
  46. data/lib/rouge/demos/dot +5 -0
  47. data/lib/rouge/demos/ecl +18 -0
  48. data/lib/rouge/demos/eex +1 -0
  49. data/lib/rouge/demos/eiffel +30 -0
  50. data/lib/rouge/demos/elixir +1 -0
  51. data/lib/rouge/demos/elm +4 -0
  52. data/lib/rouge/demos/epp +4 -0
  53. data/lib/rouge/demos/erb +1 -0
  54. data/lib/rouge/demos/erlang +7 -0
  55. data/lib/rouge/demos/escape +3 -0
  56. data/lib/rouge/demos/factor +5 -0
  57. data/lib/rouge/demos/fortran +22 -0
  58. data/lib/rouge/demos/freefem +16 -0
  59. data/lib/rouge/demos/fsharp +12 -0
  60. data/lib/rouge/demos/gdscript +18 -0
  61. data/lib/rouge/demos/ghc-core +26 -0
  62. data/lib/rouge/demos/gherkin +17 -0
  63. data/lib/rouge/demos/glsl +14 -0
  64. data/lib/rouge/demos/go +7 -0
  65. data/lib/rouge/demos/gradle +10 -0
  66. data/lib/rouge/demos/graphql +17 -0
  67. data/lib/rouge/demos/groovy +9 -0
  68. data/lib/rouge/demos/hack +5 -0
  69. data/lib/rouge/demos/haml +5 -0
  70. data/lib/rouge/demos/handlebars +7 -0
  71. data/lib/rouge/demos/haskell +6 -0
  72. data/lib/rouge/demos/haxe +5 -0
  73. data/lib/rouge/demos/hcl +7 -0
  74. data/lib/rouge/demos/hocon +8 -0
  75. data/lib/rouge/demos/hql +5 -0
  76. data/lib/rouge/demos/html +8 -0
  77. data/lib/rouge/demos/http +14 -0
  78. data/lib/rouge/demos/hylang +10 -0
  79. data/lib/rouge/demos/idlang +8 -0
  80. data/lib/rouge/demos/igorpro +9 -0
  81. data/lib/rouge/demos/ini +4 -0
  82. data/lib/rouge/demos/io +11 -0
  83. data/lib/rouge/demos/irb +4 -0
  84. data/lib/rouge/demos/irb_output +2 -0
  85. data/lib/rouge/demos/java +5 -0
  86. data/lib/rouge/demos/javascript +1 -0
  87. data/lib/rouge/demos/jinja +9 -0
  88. data/lib/rouge/demos/jsl +3 -0
  89. data/lib/rouge/demos/json +1 -0
  90. data/lib/rouge/demos/json-doc +1 -0
  91. data/lib/rouge/demos/jsonnet +28 -0
  92. data/lib/rouge/demos/jsp +29 -0
  93. data/lib/rouge/demos/jsx +17 -0
  94. data/lib/rouge/demos/julia +11 -0
  95. data/lib/rouge/demos/kotlin +3 -0
  96. data/lib/rouge/demos/lasso +12 -0
  97. data/lib/rouge/demos/liquid +10 -0
  98. data/lib/rouge/demos/literate_coffeescript +3 -0
  99. data/lib/rouge/demos/literate_haskell +7 -0
  100. data/lib/rouge/demos/llvm +20 -0
  101. data/lib/rouge/demos/lua +12 -0
  102. data/lib/rouge/demos/lustre +6 -0
  103. data/lib/rouge/demos/lutin +18 -0
  104. data/lib/rouge/demos/m68k +16 -0
  105. data/lib/rouge/demos/magik +6 -0
  106. data/lib/rouge/demos/make +6 -0
  107. data/lib/rouge/demos/markdown +4 -0
  108. data/lib/rouge/demos/mason +22 -0
  109. data/lib/rouge/demos/mathematica +8 -0
  110. data/lib/rouge/demos/matlab +6 -0
  111. data/lib/rouge/demos/minizinc +23 -0
  112. data/lib/rouge/demos/moonscript +16 -0
  113. data/lib/rouge/demos/mosel +10 -0
  114. data/lib/rouge/demos/msgtrans +4 -0
  115. data/lib/rouge/demos/mxml +22 -0
  116. data/lib/rouge/demos/nasm +26 -0
  117. data/lib/rouge/demos/nesasm +11 -0
  118. data/lib/rouge/demos/nginx +5 -0
  119. data/lib/rouge/demos/nim +27 -0
  120. data/lib/rouge/demos/nix +19 -0
  121. data/lib/rouge/demos/objective_c +18 -0
  122. data/lib/rouge/demos/objective_cpp +17 -0
  123. data/lib/rouge/demos/ocaml +12 -0
  124. data/lib/rouge/demos/openedge +4 -0
  125. data/lib/rouge/demos/opentype_feature_file +6 -0
  126. data/lib/rouge/demos/pascal +14 -0
  127. data/lib/rouge/demos/perl +5 -0
  128. data/lib/rouge/demos/php +3 -0
  129. data/lib/rouge/demos/plaintext +1 -0
  130. data/lib/rouge/demos/plist +11 -0
  131. data/lib/rouge/demos/pony +17 -0
  132. data/lib/rouge/demos/powershell +13 -0
  133. data/lib/rouge/demos/praat +26 -0
  134. data/lib/rouge/demos/prolog +9 -0
  135. data/lib/rouge/demos/prometheus +9 -0
  136. data/lib/rouge/demos/properties +7 -0
  137. data/lib/rouge/demos/protobuf +5 -0
  138. data/lib/rouge/demos/puppet +6 -0
  139. data/lib/rouge/demos/python +6 -0
  140. data/lib/rouge/demos/q +8 -0
  141. data/lib/rouge/demos/qml +9 -0
  142. data/lib/rouge/demos/r +8 -0
  143. data/lib/rouge/demos/racket +24 -0
  144. data/lib/rouge/demos/reasonml +12 -0
  145. data/lib/rouge/demos/robot_framework +27 -0
  146. data/lib/rouge/demos/ruby +9 -0
  147. data/lib/rouge/demos/rust +12 -0
  148. data/lib/rouge/demos/sas +13 -0
  149. data/lib/rouge/demos/sass +3 -0
  150. data/lib/rouge/demos/scala +3 -0
  151. data/lib/rouge/demos/scheme +4 -0
  152. data/lib/rouge/demos/scss +5 -0
  153. data/lib/rouge/demos/sed +4 -0
  154. data/lib/rouge/demos/shell +2 -0
  155. data/lib/rouge/demos/sieve +10 -0
  156. data/lib/rouge/demos/slice +10 -0
  157. data/lib/rouge/demos/slim +17 -0
  158. data/lib/rouge/demos/smalltalk +6 -0
  159. data/lib/rouge/demos/smarty +12 -0
  160. data/lib/rouge/demos/sml +4 -0
  161. data/lib/rouge/demos/sparql +6 -0
  162. data/lib/rouge/demos/sqf +14 -0
  163. data/lib/rouge/demos/sql +1 -0
  164. data/lib/rouge/demos/supercollider +11 -0
  165. data/lib/rouge/demos/swift +5 -0
  166. data/lib/rouge/demos/tap +5 -0
  167. data/lib/rouge/demos/tcl +1 -0
  168. data/lib/rouge/demos/terraform +16 -0
  169. data/lib/rouge/demos/tex +1 -0
  170. data/lib/rouge/demos/toml +9 -0
  171. data/lib/rouge/demos/tsx +17 -0
  172. data/lib/rouge/demos/ttcn3 +6 -0
  173. data/lib/rouge/demos/tulip +13 -0
  174. data/lib/rouge/demos/turtle +26 -0
  175. data/lib/rouge/demos/twig +9 -0
  176. data/lib/rouge/demos/typescript +1 -0
  177. data/lib/rouge/demos/vala +8 -0
  178. data/lib/rouge/demos/vb +4 -0
  179. data/lib/rouge/demos/vcl +12 -0
  180. data/lib/rouge/demos/verilog +27 -0
  181. data/lib/rouge/demos/vhdl +23 -0
  182. data/lib/rouge/demos/viml +14 -0
  183. data/lib/rouge/demos/vue +11 -0
  184. data/lib/rouge/demos/wollok +11 -0
  185. data/lib/rouge/demos/xml +2 -0
  186. data/lib/rouge/demos/xojo +14 -0
  187. data/lib/rouge/demos/xpath +2 -0
  188. data/lib/rouge/demos/xquery +22 -0
  189. data/lib/rouge/demos/yaml +4 -0
  190. data/lib/rouge/formatter.rb +112 -0
  191. data/lib/rouge/formatters/html.rb +56 -0
  192. data/lib/rouge/formatters/html_inline.rb +31 -0
  193. data/lib/rouge/formatters/html_legacy.rb +45 -0
  194. data/lib/rouge/formatters/html_line_table.rb +53 -0
  195. data/lib/rouge/formatters/html_linewise.rb +23 -0
  196. data/lib/rouge/formatters/html_pygments.rb +18 -0
  197. data/lib/rouge/formatters/html_table.rb +51 -0
  198. data/lib/rouge/formatters/null.rb +20 -0
  199. data/lib/rouge/formatters/terminal256.rb +198 -0
  200. data/lib/rouge/formatters/terminal_truecolor.rb +37 -0
  201. data/lib/rouge/formatters/tex.rb +92 -0
  202. data/lib/rouge/guesser.rb +57 -0
  203. data/lib/rouge/guessers/disambiguation.rb +136 -0
  204. data/lib/rouge/guessers/filename.rb +27 -0
  205. data/lib/rouge/guessers/glob_mapping.rb +45 -0
  206. data/lib/rouge/guessers/mimetype.rb +16 -0
  207. data/lib/rouge/guessers/modeline.rb +46 -0
  208. data/lib/rouge/guessers/source.rb +31 -0
  209. data/lib/rouge/guessers/util.rb +34 -0
  210. data/lib/rouge/lexer.rb +516 -0
  211. data/lib/rouge/lexers/abap.rb +240 -0
  212. data/lib/rouge/lexers/actionscript.rb +196 -0
  213. data/lib/rouge/lexers/ada.rb +162 -0
  214. data/lib/rouge/lexers/apache.rb +73 -0
  215. data/lib/rouge/lexers/apache/keywords.yml +764 -0
  216. data/lib/rouge/lexers/apex.rb +126 -0
  217. data/lib/rouge/lexers/apiblueprint.rb +49 -0
  218. data/lib/rouge/lexers/apple_script.rb +370 -0
  219. data/lib/rouge/lexers/armasm.rb +145 -0
  220. data/lib/rouge/lexers/awk.rb +162 -0
  221. data/lib/rouge/lexers/batchfile.rb +164 -0
  222. data/lib/rouge/lexers/bbcbasic.rb +112 -0
  223. data/lib/rouge/lexers/biml.rb +43 -0
  224. data/lib/rouge/lexers/bpf.rb +118 -0
  225. data/lib/rouge/lexers/brainfuck.rb +53 -0
  226. data/lib/rouge/lexers/bsl.rb +82 -0
  227. data/lib/rouge/lexers/c.rb +190 -0
  228. data/lib/rouge/lexers/ceylon.rb +96 -0
  229. data/lib/rouge/lexers/cfscript.rb +154 -0
  230. data/lib/rouge/lexers/clean.rb +156 -0
  231. data/lib/rouge/lexers/clojure.rb +113 -0
  232. data/lib/rouge/lexers/cmake.rb +207 -0
  233. data/lib/rouge/lexers/cmhg.rb +34 -0
  234. data/lib/rouge/lexers/coffeescript.rb +215 -0
  235. data/lib/rouge/lexers/common_lisp.rb +346 -0
  236. data/lib/rouge/lexers/conf.rb +25 -0
  237. data/lib/rouge/lexers/console.rb +174 -0
  238. data/lib/rouge/lexers/coq.rb +191 -0
  239. data/lib/rouge/lexers/cpp.rb +82 -0
  240. data/lib/rouge/lexers/crystal.rb +430 -0
  241. data/lib/rouge/lexers/csharp.rb +114 -0
  242. data/lib/rouge/lexers/css.rb +274 -0
  243. data/lib/rouge/lexers/csvs.rb +44 -0
  244. data/lib/rouge/lexers/cuda.rb +35 -0
  245. data/lib/rouge/lexers/cython.rb +151 -0
  246. data/lib/rouge/lexers/d.rb +177 -0
  247. data/lib/rouge/lexers/dart.rb +105 -0
  248. data/lib/rouge/lexers/diff.rb +37 -0
  249. data/lib/rouge/lexers/digdag.rb +70 -0
  250. data/lib/rouge/lexers/docker.rb +51 -0
  251. data/lib/rouge/lexers/dot.rb +69 -0
  252. data/lib/rouge/lexers/ecl.rb +175 -0
  253. data/lib/rouge/lexers/eex.rb +52 -0
  254. data/lib/rouge/lexers/eiffel.rb +66 -0
  255. data/lib/rouge/lexers/elixir.rb +149 -0
  256. data/lib/rouge/lexers/elm.rb +90 -0
  257. data/lib/rouge/lexers/epp.rb +51 -0
  258. data/lib/rouge/lexers/erb.rb +53 -0
  259. data/lib/rouge/lexers/erlang.rb +115 -0
  260. data/lib/rouge/lexers/escape.rb +58 -0
  261. data/lib/rouge/lexers/factor.rb +303 -0
  262. data/lib/rouge/lexers/fortran.rb +178 -0
  263. data/lib/rouge/lexers/freefem.rb +240 -0
  264. data/lib/rouge/lexers/fsharp.rb +119 -0
  265. data/lib/rouge/lexers/gdscript.rb +171 -0
  266. data/lib/rouge/lexers/ghc_core.rb +151 -0
  267. data/lib/rouge/lexers/gherkin.rb +140 -0
  268. data/lib/rouge/lexers/gherkin/keywords.rb +16 -0
  269. data/lib/rouge/lexers/glsl.rb +132 -0
  270. data/lib/rouge/lexers/go.rb +175 -0
  271. data/lib/rouge/lexers/gradle.rb +38 -0
  272. data/lib/rouge/lexers/graphql.rb +261 -0
  273. data/lib/rouge/lexers/groovy.rb +111 -0
  274. data/lib/rouge/lexers/hack.rb +49 -0
  275. data/lib/rouge/lexers/haml.rb +226 -0
  276. data/lib/rouge/lexers/handlebars.rb +91 -0
  277. data/lib/rouge/lexers/haskell.rb +199 -0
  278. data/lib/rouge/lexers/haxe.rb +246 -0
  279. data/lib/rouge/lexers/hcl.rb +163 -0
  280. data/lib/rouge/lexers/hocon.rb +86 -0
  281. data/lib/rouge/lexers/hql.rb +139 -0
  282. data/lib/rouge/lexers/html.rb +141 -0
  283. data/lib/rouge/lexers/http.rb +81 -0
  284. data/lib/rouge/lexers/hylang.rb +94 -0
  285. data/lib/rouge/lexers/idlang.rb +312 -0
  286. data/lib/rouge/lexers/igorpro.rb +664 -0
  287. data/lib/rouge/lexers/ini.rb +54 -0
  288. data/lib/rouge/lexers/io.rb +69 -0
  289. data/lib/rouge/lexers/irb.rb +67 -0
  290. data/lib/rouge/lexers/java.rb +91 -0
  291. data/lib/rouge/lexers/javascript.rb +279 -0
  292. data/lib/rouge/lexers/jinja.rb +154 -0
  293. data/lib/rouge/lexers/jsl.rb +55 -0
  294. data/lib/rouge/lexers/json.rb +69 -0
  295. data/lib/rouge/lexers/json_doc.rb +25 -0
  296. data/lib/rouge/lexers/jsonnet.rb +152 -0
  297. data/lib/rouge/lexers/jsp.rb +120 -0
  298. data/lib/rouge/lexers/jsx.rb +104 -0
  299. data/lib/rouge/lexers/julia.rb +290 -0
  300. data/lib/rouge/lexers/kotlin.rb +127 -0
  301. data/lib/rouge/lexers/lasso.rb +215 -0
  302. data/lib/rouge/lexers/lasso/keywords.yml +446 -0
  303. data/lib/rouge/lexers/liquid.rb +285 -0
  304. data/lib/rouge/lexers/literate_coffeescript.rb +34 -0
  305. data/lib/rouge/lexers/literate_haskell.rb +37 -0
  306. data/lib/rouge/lexers/llvm.rb +97 -0
  307. data/lib/rouge/lexers/lua.rb +164 -0
  308. data/lib/rouge/lexers/lua/builtins.rb +24 -0
  309. data/lib/rouge/lexers/lustre.rb +79 -0
  310. data/lib/rouge/lexers/lutin.rb +33 -0
  311. data/lib/rouge/lexers/m68k.rb +143 -0
  312. data/lib/rouge/lexers/magik.rb +127 -0
  313. data/lib/rouge/lexers/make.rb +135 -0
  314. data/lib/rouge/lexers/markdown.rb +182 -0
  315. data/lib/rouge/lexers/mason.rb +110 -0
  316. data/lib/rouge/lexers/mathematica.rb +96 -0
  317. data/lib/rouge/lexers/mathematica/builtins.rb +13 -0
  318. data/lib/rouge/lexers/matlab.rb +81 -0
  319. data/lib/rouge/lexers/matlab/builtins.yml +3515 -0
  320. data/lib/rouge/lexers/minizinc.rb +87 -0
  321. data/lib/rouge/lexers/moonscript.rb +115 -0
  322. data/lib/rouge/lexers/mosel.rb +232 -0
  323. data/lib/rouge/lexers/msgtrans.rb +26 -0
  324. data/lib/rouge/lexers/mxml.rb +69 -0
  325. data/lib/rouge/lexers/nasm.rb +72 -0
  326. data/lib/rouge/lexers/nesasm.rb +78 -0
  327. data/lib/rouge/lexers/nginx.rb +72 -0
  328. data/lib/rouge/lexers/nim.rb +154 -0
  329. data/lib/rouge/lexers/nix.rb +211 -0
  330. data/lib/rouge/lexers/objective_c.rb +21 -0
  331. data/lib/rouge/lexers/objective_c/common.rb +184 -0
  332. data/lib/rouge/lexers/objective_cpp.rb +31 -0
  333. data/lib/rouge/lexers/ocaml.rb +65 -0
  334. data/lib/rouge/lexers/ocaml/common.rb +53 -0
  335. data/lib/rouge/lexers/openedge.rb +429 -0
  336. data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
  337. data/lib/rouge/lexers/pascal.rb +67 -0
  338. data/lib/rouge/lexers/perl.rb +231 -0
  339. data/lib/rouge/lexers/php.rb +216 -0
  340. data/lib/rouge/lexers/php/builtins.rb +203 -0
  341. data/lib/rouge/lexers/plain_text.rb +27 -0
  342. data/lib/rouge/lexers/plist.rb +47 -0
  343. data/lib/rouge/lexers/pony.rb +94 -0
  344. data/lib/rouge/lexers/powershell.rb +230 -0
  345. data/lib/rouge/lexers/praat.rb +351 -0
  346. data/lib/rouge/lexers/prolog.rb +67 -0
  347. data/lib/rouge/lexers/prometheus.rb +123 -0
  348. data/lib/rouge/lexers/properties.rb +52 -0
  349. data/lib/rouge/lexers/protobuf.rb +71 -0
  350. data/lib/rouge/lexers/puppet.rb +129 -0
  351. data/lib/rouge/lexers/python.rb +248 -0
  352. data/lib/rouge/lexers/q.rb +126 -0
  353. data/lib/rouge/lexers/qml.rb +74 -0
  354. data/lib/rouge/lexers/r.rb +89 -0
  355. data/lib/rouge/lexers/racket.rb +545 -0
  356. data/lib/rouge/lexers/reasonml.rb +65 -0
  357. data/lib/rouge/lexers/robot_framework.rb +249 -0
  358. data/lib/rouge/lexers/ruby.rb +444 -0
  359. data/lib/rouge/lexers/rust.rb +193 -0
  360. data/lib/rouge/lexers/sas.rb +563 -0
  361. data/lib/rouge/lexers/sass.rb +75 -0
  362. data/lib/rouge/lexers/sass/common.rb +181 -0
  363. data/lib/rouge/lexers/scala.rb +169 -0
  364. data/lib/rouge/lexers/scheme.rb +113 -0
  365. data/lib/rouge/lexers/scss.rb +35 -0
  366. data/lib/rouge/lexers/sed.rb +173 -0
  367. data/lib/rouge/lexers/shell.rb +201 -0
  368. data/lib/rouge/lexers/sieve.rb +97 -0
  369. data/lib/rouge/lexers/slice.rb +32 -0
  370. data/lib/rouge/lexers/slim.rb +229 -0
  371. data/lib/rouge/lexers/smalltalk.rb +117 -0
  372. data/lib/rouge/lexers/smarty.rb +81 -0
  373. data/lib/rouge/lexers/sml.rb +345 -0
  374. data/lib/rouge/lexers/sparql.rb +129 -0
  375. data/lib/rouge/lexers/sqf.rb +109 -0
  376. data/lib/rouge/lexers/sqf/commands.rb +15 -0
  377. data/lib/rouge/lexers/sql.rb +161 -0
  378. data/lib/rouge/lexers/supercollider.rb +116 -0
  379. data/lib/rouge/lexers/swift.rb +186 -0
  380. data/lib/rouge/lexers/tap.rb +89 -0
  381. data/lib/rouge/lexers/tcl.rb +193 -0
  382. data/lib/rouge/lexers/terraform.rb +113 -0
  383. data/lib/rouge/lexers/tex.rb +70 -0
  384. data/lib/rouge/lexers/toml.rb +106 -0
  385. data/lib/rouge/lexers/tsx.rb +20 -0
  386. data/lib/rouge/lexers/ttcn3.rb +119 -0
  387. data/lib/rouge/lexers/tulip.rb +108 -0
  388. data/lib/rouge/lexers/turtle.rb +61 -0
  389. data/lib/rouge/lexers/twig.rb +40 -0
  390. data/lib/rouge/lexers/typescript.rb +30 -0
  391. data/lib/rouge/lexers/typescript/common.rb +34 -0
  392. data/lib/rouge/lexers/vala.rb +78 -0
  393. data/lib/rouge/lexers/varnish.rb +168 -0
  394. data/lib/rouge/lexers/vb.rb +165 -0
  395. data/lib/rouge/lexers/verilog.rb +163 -0
  396. data/lib/rouge/lexers/vhdl.rb +98 -0
  397. data/lib/rouge/lexers/viml.rb +102 -0
  398. data/lib/rouge/lexers/viml/keywords.rb +14 -0
  399. data/lib/rouge/lexers/vue.rb +124 -0
  400. data/lib/rouge/lexers/wollok.rb +104 -0
  401. data/lib/rouge/lexers/xml.rb +54 -0
  402. data/lib/rouge/lexers/xojo.rb +61 -0
  403. data/lib/rouge/lexers/xpath.rb +332 -0
  404. data/lib/rouge/lexers/xquery.rb +145 -0
  405. data/lib/rouge/lexers/yaml.rb +376 -0
  406. data/lib/rouge/plugins/redcarpet.rb +37 -0
  407. data/lib/rouge/regex_lexer.rb +443 -0
  408. data/lib/rouge/template_lexer.rb +21 -0
  409. data/lib/rouge/tex_theme_renderer.rb +132 -0
  410. data/lib/rouge/text_analyzer.rb +50 -0
  411. data/lib/rouge/theme.rb +218 -0
  412. data/lib/rouge/themes/base16.rb +131 -0
  413. data/lib/rouge/themes/bw.rb +41 -0
  414. data/lib/rouge/themes/colorful.rb +68 -0
  415. data/lib/rouge/themes/github.rb +72 -0
  416. data/lib/rouge/themes/gruvbox.rb +168 -0
  417. data/lib/rouge/themes/igor_pro.rb +21 -0
  418. data/lib/rouge/themes/magritte.rb +78 -0
  419. data/lib/rouge/themes/molokai.rb +83 -0
  420. data/lib/rouge/themes/monokai.rb +93 -0
  421. data/lib/rouge/themes/monokai_sublime.rb +93 -0
  422. data/lib/rouge/themes/pastie.rb +70 -0
  423. data/lib/rouge/themes/thankful_eyes.rb +75 -0
  424. data/lib/rouge/themes/tulip.rb +70 -0
  425. data/lib/rouge/token.rb +191 -0
  426. data/lib/rouge/util.rb +102 -0
  427. data/lib/rouge/version.rb +8 -0
  428. data/rouge.gemspec +26 -0
  429. metadata +476 -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'
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,216 @@
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(__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
+ @keywords ||= Set.new %w(
67
+ and E_PARSE old_function E_ERROR or as E_WARNING parent eval
68
+ PHP_OS break exit case extends PHP_VERSION cfunction FALSE
69
+ print for require continue foreach require_once declare return
70
+ default static do switch die stdClass echo else TRUE elseif
71
+ var empty if xor enddeclare include virtual endfor include_once
72
+ while endforeach global __FILE__ endif list __LINE__ endswitch
73
+ new __sleep endwhile not array __wakeup E_ALL NULL final
74
+ php_user_filter interface implements public private protected
75
+ abstract clone try catch finally throw this use namespace yield
76
+ )
77
+ end
78
+
79
+ def self.detect?(text)
80
+ return true if text.shebang?('php')
81
+ return false if /^<\?hh/ =~ text
82
+ return true if /^<\?php/ =~ text
83
+ end
84
+
85
+ state :root do
86
+ # some extremely rough heuristics to decide whether to start inline or not
87
+ rule(/\s*(?=<)/m) { delegate parent; push :template }
88
+ rule(/[^$]+(?=<\?(php|=))/) { delegate parent; push :template }
89
+
90
+ rule(//) { push :template; push :php }
91
+ end
92
+
93
+ state :template do
94
+ rule %r/<\?(php|=)?/, Comment::Preproc, :php
95
+ rule(/.*?(?=<\?)|.*/m) { delegate parent }
96
+ end
97
+
98
+ state :php do
99
+ rule %r/\?>/, Comment::Preproc, :pop!
100
+ # heredocs
101
+ rule %r/<<<('?)(#{id})\1\n.*?\n\s*\2;?/im, Str::Heredoc
102
+ rule %r/\s+/, Text
103
+ rule %r/#.*?$/, Comment::Single
104
+ rule %r(//.*?$), Comment::Single
105
+ rule %r(/\*\*(?!/).*?\*/)m, Comment::Doc
106
+ rule %r(/\*.*?\*/)m, Comment::Multiline
107
+
108
+ rule %r/(->|::)(\s*)(#{id})/ do
109
+ groups Operator, Text, Name::Attribute
110
+ end
111
+
112
+ rule %r/[~!%^&*+=\|:.<>\/?@-]+/, Operator
113
+ rule %r/[\[\]{}();,]/, Punctuation
114
+ rule %r/(class|interface|trait)(\s+)(#{nsid})/ do
115
+ groups Keyword::Declaration, Text, Name::Class
116
+ end
117
+ rule %r/(use)(\s+)(function|const|)(\s*)(#{nsid})/ do
118
+ groups Keyword::Namespace, Text, Keyword::Namespace, Text, Name::Namespace
119
+ push :use
120
+ end
121
+ rule %r/(namespace)(\s+)(#{nsid})/ do
122
+ groups Keyword::Namespace, Text, Name::Namespace
123
+ end
124
+ # anonymous functions
125
+ rule %r/(function)(\s*)(?=\()/ do
126
+ groups Keyword, Text
127
+ end
128
+
129
+ # named functions
130
+ rule %r/(function)(\s+)(&?)(\s*)/ do
131
+ groups Keyword, Text, Operator, Text
132
+ push :funcname
133
+ end
134
+
135
+ rule %r/(const)(\s+)(#{id})/i do
136
+ groups Keyword, Text, Name::Constant
137
+ end
138
+
139
+ rule %r/(true|false|null)\b/, Keyword::Constant
140
+ rule %r/\$\{\$+#{id}\}/i, Name::Variable
141
+ rule %r/\$+#{id}/i, Name::Variable
142
+
143
+ # may be intercepted for builtin highlighting
144
+ rule %r/\\?#{nsid}/i do |m|
145
+ name = m[0]
146
+
147
+ if self.class.keywords.include? name
148
+ token Keyword
149
+ elsif self.builtins.include? name
150
+ token Name::Builtin
151
+ else
152
+ token Name::Other
153
+ end
154
+ end
155
+
156
+ rule %r/(\d+\.\d*|\d*\.\d+)(e[+-]?\d+)?/i, Num::Float
157
+ rule %r/\d+e[+-]?\d+/i, Num::Float
158
+ rule %r/0[0-7]+/, Num::Oct
159
+ rule %r/0x[a-f0-9]+/i, Num::Hex
160
+ rule %r/\d+/, Num::Integer
161
+ rule %r/'([^'\\]*(?:\\.[^'\\]*)*)'/, Str::Single
162
+ rule %r/`([^`\\]*(?:\\.[^`\\]*)*)`/, Str::Backtick
163
+ rule %r/"/, Str::Double, :string
164
+ end
165
+
166
+ state :use do
167
+ rule %r/(\s+)(as)(\s+)(#{id})/ do
168
+ groups Text, Keyword, Text, Name
169
+ :pop!
170
+ end
171
+ rule %r/\\\{/, Operator, :uselist
172
+ rule %r/;/, Punctuation, :pop!
173
+ end
174
+
175
+ state :uselist do
176
+ rule %r/\s+/, Text
177
+ rule %r/,/, Operator
178
+ rule %r/\}/, Operator, :pop!
179
+ rule %r/(as)(\s+)(#{id})/ do
180
+ groups Keyword, Text, Name
181
+ end
182
+ rule %r/#{id}/, Name::Namespace
183
+ end
184
+
185
+ state :funcname do
186
+ rule %r/#{id}/, Name::Function, :pop!
187
+ end
188
+
189
+ state :string do
190
+ rule %r/"/, Str::Double, :pop!
191
+ rule %r/[^\\{$"]+/, Str::Double
192
+ rule %r/\\([nrt\"$\\]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})/,
193
+ Str::Escape
194
+ rule %r/\$#{id}(\[\S+\]|->#{id})?/, Name::Variable
195
+
196
+ rule %r/\{\$\{/, Str::Interpol, :interp_double
197
+ rule %r/\{(?=\$)/, Str::Interpol, :interp_single
198
+ rule %r/(\{)(\S+)(\})/ do
199
+ groups Str::Interpol, Name::Variable, Str::Interpol
200
+ end
201
+
202
+ rule %r/[${\\]+/, Str::Double
203
+ end
204
+
205
+ state :interp_double do
206
+ rule %r/\}\}/, Str::Interpol, :pop!
207
+ mixin :php
208
+ end
209
+
210
+ state :interp_single do
211
+ rule %r/\}/, Str::Interpol, :pop!
212
+ mixin :php
213
+ end
214
+ end
215
+ end
216
+ end