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,65 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ load_lexer 'ocaml/common.rb'
7
+
8
+ class ReasonML < OCamlCommon
9
+ title "ReasonML"
10
+ desc 'New syntax on top of OCaml ecosystem (reasonml.github.io)'
11
+ tag 'reasonml'
12
+ filenames '*.re', '*.rei'
13
+ mimetypes 'text/x-reasonml'
14
+
15
+ def self.keywords
16
+ @keywords ||= super + Set.new(%w(
17
+ switch
18
+ ))
19
+ end
20
+
21
+ state :root do
22
+ rule %r/\s+/m, Text
23
+ rule %r/false|true|[(][)]|\[\]/, Name::Builtin::Pseudo
24
+ rule %r/#{@@upper_id}(?=\s*[.])/, Name::Namespace, :dotted
25
+ rule %r/`#{@@id}/, Name::Tag
26
+ rule @@upper_id, Name::Class
27
+ rule %r/[\/][*](?![\/])/, Comment, :comment
28
+ rule @@id do |m|
29
+ match = m[0]
30
+ if self.class.keywords.include? match
31
+ token Keyword
32
+ elsif self.class.word_operators.include? match
33
+ token Operator::Word
34
+ elsif self.class.primitives.include? match
35
+ token Keyword::Type
36
+ else
37
+ token Name
38
+ end
39
+ end
40
+
41
+ rule %r/[(){}\[\];]+/, Punctuation
42
+ rule @@operator, Operator
43
+
44
+ rule %r/-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float
45
+ rule %r/0x\h[\h_]*/i, Num::Hex
46
+ rule %r/0o[0-7][0-7_]*/i, Num::Oct
47
+ rule %r/0b[01][01_]*/i, Num::Bin
48
+ rule %r/\d[\d_]*/, Num::Integer
49
+
50
+ rule %r/'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char
51
+ rule %r/'[^'\/]'/, Str::Char
52
+ rule %r/'/, Keyword
53
+ rule %r/"/, Str::Double, :string
54
+ rule %r/[~?]#{@@id}/, Name::Variable
55
+ end
56
+
57
+ state :comment do
58
+ rule %r|[^/*)]+|, Comment
59
+ rule %r|[/][*]|, Comment, :push
60
+ rule %r|[*][/]|, Comment, :pop!
61
+ rule %r|[*/]|, Comment
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,45 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Rego < RegexLexer
7
+ title "Rego"
8
+ desc "The Rego open-policy-agent (OPA) policy language (openpolicyagent.org)"
9
+ tag 'rego'
10
+ filenames '*.rego'
11
+
12
+ state :basic do
13
+ rule %r/\s+/, Text
14
+ rule %r/#.*/, Comment::Single
15
+
16
+ rule %r/[\[\](){}|.,;!]/, Punctuation
17
+
18
+ rule %r/"[^"]*"/, Str::Double
19
+
20
+ rule %r/-?\d+\.\d+([eE][+-]?\d+)?/, Num::Float
21
+ rule %r/-?\d+([eE][+-]?\d+)?/, Num
22
+
23
+ rule %r/\\u[0-9a-fA-F]{4}/, Num::Hex
24
+ rule %r/\\["\/bfnrt]/, Str::Escape
25
+ end
26
+
27
+ state :atoms do
28
+ rule %r/(true|false|null)/, Keyword::Constant
29
+ rule %r/[[:word:]]*/, Str::Symbol
30
+ end
31
+
32
+ state :operators do
33
+ rule %r/(=|!=|>=|<=|>|<|\+|-|\*|%|\/|\||&|:=)/, Operator
34
+ rule %r/(default|not|package|import|as|with|else|some)/, Operator
35
+ rule %r/[\/:?@^~]+/, Operator
36
+ end
37
+
38
+ state :root do
39
+ mixin :basic
40
+ mixin :operators
41
+ mixin :atoms
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,249 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class RobotFramework < RegexLexer
7
+ tag 'robot_framework'
8
+ aliases 'robot', 'robot-framework'
9
+
10
+ title "Robot Framework"
11
+ desc 'Robot Framework is a generic open source automation testing framework (robotframework.org)'
12
+
13
+ filenames '*.robot'
14
+ mimetypes 'text/x-robot'
15
+
16
+ def initialize(opts = {})
17
+ super(opts)
18
+ @col = 0
19
+ @next = nil
20
+ @is_template = false
21
+ end
22
+
23
+ def self.settings_with_keywords
24
+ @settings_with_keywords ||= Set.new [
25
+ "library", "resource", "setup", "teardown", "template", "suite setup",
26
+ "suite teardown", "task setup", "task teardown", "task template",
27
+ "test setup", "test teardown", "test template", "variables"
28
+ ]
29
+ end
30
+
31
+ def self.settings_with_args
32
+ @settings_with_args ||= Set.new [
33
+ "arguments", "default tags", "documentation", "force tags",
34
+ "metadata", "return", "tags", "timeout", "task timeout",
35
+ "test timeout"
36
+ ]
37
+ end
38
+
39
+ id = %r/(?:\\|[^|$@&% \t\n])+(?: (?:\\.|[^|$@&% \t\n])+)*/
40
+ bdd = %r/(?:Given|When|Then|And|But) /i
41
+ sep = %r/ +\| +|[ ]{2,}|\t+/
42
+
43
+ start do
44
+ push :prior_text
45
+ end
46
+
47
+ state :prior_text do
48
+ rule %r/^[^*].*/, Text
49
+ rule(//) { pop! }
50
+ end
51
+
52
+ # Mixins
53
+
54
+ state :whitespace do
55
+ rule %r/\s+/, Text::Whitespace
56
+ end
57
+
58
+ state :section_include do
59
+ mixin :end_section
60
+ mixin :sep
61
+ mixin :newline
62
+ end
63
+
64
+ state :end_section do
65
+ rule(/(?=^(?:\| )?\*)/) { pop! }
66
+ end
67
+
68
+ state :return do
69
+ rule(//) { pop! }
70
+ end
71
+
72
+ state :sep do
73
+ rule %r/\| /, Text::Whitespace
74
+
75
+ rule sep do
76
+ token Text::Whitespace
77
+ @col = @col + 1
78
+ if @next
79
+ push @next
80
+ elsif @is_template
81
+ push :args
82
+ elsif @col == 1
83
+ @next = :keyword
84
+ push :keyword
85
+ else
86
+ push :args
87
+ end
88
+ push :cell_start
89
+ end
90
+
91
+ rule %r/\.\.\. */ do
92
+ token Text::Whitespace
93
+ @col = @col + 1
94
+ push :args
95
+ end
96
+
97
+ rule %r/ ?\|/, Text::Whitespace
98
+ end
99
+
100
+ state :newline do
101
+ rule %r/\n/ do
102
+ token Text::Whitespace
103
+ @col = 0
104
+ @next = nil
105
+ push :cell_start
106
+ end
107
+ end
108
+
109
+ # States
110
+
111
+ state :root do
112
+ mixin :whitespace
113
+
114
+ rule %r/^(?:\| )?\*[* ]*([A-Z]+(?: [A-Z]+)?).*/i do |m|
115
+ token Generic::Heading, m[0]
116
+ case m[1].chomp("s").downcase
117
+ when "setting" then push :section_settings
118
+ when "test case" then push :section_tests
119
+ when "task" then push :section_tasks
120
+ when "keyword" then push :section_keywords
121
+ when "variable" then push :section_variables
122
+ end
123
+ end
124
+ end
125
+
126
+ state :section_settings do
127
+ mixin :section_include
128
+
129
+ rule %r/([A-Z]+(?: [A-Z]+)?)(:?)/i do |m|
130
+ match = m[1].downcase
131
+ @next = if self.class.settings_with_keywords.include? match
132
+ :keyword
133
+ elsif self.class.settings_with_args.include? match
134
+ :args
135
+ end
136
+ groups Name::Builtin::Pseudo, Punctuation
137
+ end
138
+ end
139
+
140
+ state :section_tests do
141
+ mixin :section_include
142
+
143
+ rule %r/[$@&%{}]+/, Name::Label
144
+ rule %r/( )(?![ |])/, Name::Label
145
+
146
+ rule id do
147
+ @is_template = false
148
+ token Name::Label
149
+ end
150
+ end
151
+
152
+ state :section_tasks do
153
+ mixin :section_tests
154
+ end
155
+
156
+ state :section_keywords do
157
+ mixin :section_include
158
+
159
+ rule %r/[$@&%]\{/ do
160
+ token Name::Variable
161
+ push :var
162
+ end
163
+
164
+ rule %r/[$@&%{}]+/, Name::Label
165
+ rule %r/( )(?![ |])/, Name::Label
166
+
167
+ rule id, Name::Label
168
+ end
169
+
170
+ state :section_variables do
171
+ mixin :section_include
172
+
173
+ rule %r/[$@&%]\{/ do
174
+ token Name::Variable
175
+ @next = :args
176
+ push :var
177
+ end
178
+ end
179
+
180
+ state :cell_start do
181
+ rule %r/#.*/, Comment
182
+ mixin :return
183
+ end
184
+
185
+ state :keyword do
186
+ rule %r/(\[)([A-Z]+(?: [A-Z]+)?)(\])/i do |m|
187
+ groups Punctuation, Name::Builtin::Pseudo, Punctuation
188
+
189
+ match = m[2].downcase
190
+ @is_template = true if match == "template"
191
+ if self.class.settings_with_keywords.include? match
192
+ @next = :keyword
193
+ elsif self.class.settings_with_args.include? match
194
+ @next = :args
195
+ end
196
+
197
+ pop!
198
+ end
199
+
200
+ rule %r/[$@&%]\{/ do
201
+ token Name::Variable
202
+ @next = :keyword unless @next.nil?
203
+ push :var
204
+ end
205
+
206
+ rule %r/FOR/i do
207
+ token Name::Function
208
+ @next = :keyword unless @next.nil?
209
+ end
210
+
211
+ rule %r/( )(?![ |])/, Name::Function
212
+
213
+ rule bdd, Name::Builtin
214
+ rule id do
215
+ token Name::Function
216
+ @next = nil
217
+ end
218
+
219
+ mixin :return
220
+ end
221
+
222
+ state :args do
223
+ rule %r/[$@&%]\{/ do
224
+ token Name::Variable
225
+ @next = :keyword unless @next.nil?
226
+ push :var
227
+ end
228
+
229
+ rule %r/[$@&%]+/, Str
230
+ rule %r/( )(?![ |])/, Str
231
+ rule id, Str
232
+
233
+ mixin :return
234
+ end
235
+
236
+ state :var do
237
+ rule %r/(\})( )(=)/ do
238
+ groups Name::Variable, Text::Whitespace, Punctuation
239
+ pop!
240
+ end
241
+ rule %r/[$@&%]\{/, Name::Variable, :var
242
+ rule %r/[{\[]/, Name::Variable, :var
243
+ rule %r/[}\]]/, Name::Variable, :pop!
244
+ rule %r/[^$@&%{}\[\]]+/, Name::Variable
245
+ rule %r/\}\[/, Name::Variable
246
+ end
247
+ end
248
+ end
249
+ end
@@ -0,0 +1,454 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Ruby < RegexLexer
7
+ title "Ruby"
8
+ desc "The Ruby programming language (ruby-lang.org)"
9
+ tag 'ruby'
10
+ aliases 'rb'
11
+ filenames '*.rb', '*.ruby', '*.rbw', '*.rake', '*.gemspec', '*.podspec',
12
+ 'Rakefile', 'Guardfile', 'Gemfile', 'Capfile', 'Podfile',
13
+ 'Vagrantfile', '*.ru', '*.prawn', 'Berksfile', '*.arb',
14
+ 'Dangerfile', 'Fastfile', 'Deliverfile', 'Appfile'
15
+
16
+ mimetypes 'text/x-ruby', 'application/x-ruby'
17
+
18
+ def self.detect?(text)
19
+ return true if text.shebang? 'ruby'
20
+ end
21
+
22
+ state :symbols do
23
+ # symbols
24
+ rule %r(
25
+ : # initial :
26
+ @{0,2} # optional ivar, for :@foo and :@@foo
27
+ [a-z_]\w*[!?]? # the symbol
28
+ )xi, Str::Symbol
29
+
30
+ # special symbols
31
+ rule %r(:(?:\*\*|[-+]@|[/\%&\|^`~]|\[\]=?|<<|>>|<=?>|<=?|===?)),
32
+ Str::Symbol
33
+
34
+ rule %r/:'(\\\\|\\'|[^'])*'/, Str::Symbol
35
+ rule %r/:"/, Str::Symbol, :simple_sym
36
+ end
37
+
38
+ state :sigil_strings do
39
+ # %-sigiled strings
40
+ # %(abc), %[abc], %<abc>, %.abc., %r.abc., etc
41
+ delimiter_map = { '{' => '}', '[' => ']', '(' => ')', '<' => '>' }
42
+ rule %r/%([rqswQWxiI])?([^\w\s])/ do |m|
43
+ open = Regexp.escape(m[2])
44
+ close = Regexp.escape(delimiter_map[m[2]] || m[2])
45
+ interp = /[rQWxI]/ === m[1]
46
+ toktype = Str::Other
47
+
48
+ puts " open: #{open.inspect}" if @debug
49
+ puts " close: #{close.inspect}" if @debug
50
+
51
+ # regexes
52
+ if m[1] == 'r'
53
+ toktype = Str::Regex
54
+ push :regex_flags
55
+ end
56
+
57
+ token toktype
58
+
59
+ push do
60
+ uniq_chars = "#{open}#{close}".squeeze
61
+ uniq_chars = '' if open == close && open == "\\#"
62
+ rule %r/\\[##{uniq_chars}\\]/, Str::Escape
63
+ # nesting rules only with asymmetric delimiters
64
+ if open != close
65
+ rule %r/#{open}/ do
66
+ token toktype
67
+ push
68
+ end
69
+ end
70
+ rule %r/#{close}/, toktype, :pop!
71
+
72
+ if interp
73
+ mixin :string_intp_escaped
74
+ rule %r/#/, toktype
75
+ else
76
+ rule %r/[\\#]/, toktype
77
+ end
78
+
79
+ rule %r/[^##{uniq_chars}\\]+/m, toktype
80
+ end
81
+ end
82
+ end
83
+
84
+ state :strings do
85
+ mixin :symbols
86
+ rule %r/\b[a-z_]\w*?[?!]?:\s+/, Str::Symbol, :expr_start
87
+ rule %r/'(\\\\|\\'|[^'])*'/, Str::Single
88
+ rule %r/"/, Str::Double, :simple_string
89
+ rule %r/(?<!\.)`/, Str::Backtick, :simple_backtick
90
+ end
91
+
92
+ state :regex_flags do
93
+ rule %r/[mixounse]*/, Str::Regex, :pop!
94
+ end
95
+
96
+ # double-quoted string and symbol
97
+ [[:string, Str::Double, '"'],
98
+ [:sym, Str::Symbol, '"'],
99
+ [:backtick, Str::Backtick, '`']].each do |name, tok, fin|
100
+ state :"simple_#{name}" do
101
+ mixin :string_intp_escaped
102
+ rule %r/[^\\#{fin}#]+/m, tok
103
+ rule %r/[\\#]/, tok
104
+ rule %r/#{fin}/, tok, :pop!
105
+ end
106
+ end
107
+
108
+ keywords = %w(
109
+ BEGIN END alias begin break case defined\? do else elsif end
110
+ ensure for if in next redo rescue raise retry return super then
111
+ undef unless until when while yield
112
+ )
113
+
114
+ keywords_pseudo = %w(
115
+ loop include extend raise
116
+ alias_method attr catch throw private module_function
117
+ public protected true false nil __FILE__ __LINE__
118
+ )
119
+
120
+ builtins_g = %w(
121
+ attr_reader attr_writer attr_accessor
122
+
123
+ __id__ __send__ abort ancestors at_exit autoload binding callcc
124
+ caller catch chomp chop class_eval class_variables clone
125
+ const_defined\? const_get const_missing const_set constants
126
+ display dup eval exec exit extend fail fork format freeze
127
+ getc gets global_variables gsub hash id included_modules
128
+ inspect instance_eval instance_method instance_methods
129
+ instance_variable_get instance_variable_set instance_variables
130
+ lambda load local_variables loop method method_missing
131
+ methods module_eval name object_id open p print printf
132
+ private_class_method private_instance_methods private_methods proc
133
+ protected_instance_methods protected_methods public_class_method
134
+ public_instance_methods public_methods putc puts raise rand
135
+ readline readlines require require_relative scan select self send set_trace_func
136
+ singleton_methods sleep split sprintf srand sub syscall system
137
+ taint test throw to_a to_s trace_var trap untaint untrace_var warn
138
+ )
139
+
140
+ builtins_q = %w(
141
+ autoload block_given const_defined eql equal frozen
142
+ include instance_of is_a iterator kind_of method_defined
143
+ nil private_method_defined protected_method_defined
144
+ public_method_defined respond_to tainted
145
+ )
146
+
147
+ builtins_b = %w(chomp chop exit gsub sub)
148
+
149
+ start do
150
+ push :expr_start
151
+ @heredoc_queue = []
152
+ end
153
+
154
+ state :whitespace do
155
+ mixin :inline_whitespace
156
+ rule %r/\n\s*/m, Text, :expr_start
157
+ rule %r/#.*$/, Comment::Single
158
+
159
+ rule %r(=begin\b.*?\n=end\b)m, Comment::Multiline
160
+ end
161
+
162
+ state :inline_whitespace do
163
+ rule %r/[ \t\r]+/, Text
164
+ end
165
+
166
+ state :root do
167
+ mixin :whitespace
168
+ rule %r/__END__/, Comment::Preproc, :end_part
169
+
170
+ rule %r/0_?[0-7]+(?:_[0-7]+)*/, Num::Oct
171
+ rule %r/0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex
172
+ rule %r/0b[01]+(?:_[01]+)*/, Num::Bin
173
+
174
+ decimal = %r/[\d]+(?:_\d+)*/
175
+ exp = %r/e[+-]?\d+/i
176
+ rule %r/#{decimal}(?:\.#{decimal}#{exp}?|#{exp})/, Num::Float
177
+ rule decimal, Num::Integer
178
+
179
+ # names
180
+ rule %r/@@[a-z_]\w*/i, Name::Variable::Class
181
+ rule %r/@[a-z_]\w*/i, Name::Variable::Instance
182
+ rule %r/\$\w+/, Name::Variable::Global
183
+ rule %r(\$[!@&`'+~=/\\,;.<>_*\$?:"]), Name::Variable::Global
184
+ rule %r/\$-[0adFiIlpvw]/, Name::Variable::Global
185
+ rule %r/::/, Operator
186
+
187
+ mixin :strings
188
+
189
+ rule %r/(?:#{keywords.join('|')})(?=\W|$)/, Keyword, :expr_start
190
+ rule %r/(?:#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo, :expr_start
191
+
192
+ rule %r(
193
+ (module)
194
+ (\s+)
195
+ ([a-zA-Z_][a-zA-Z0-9_]*(::[a-zA-Z_][a-zA-Z0-9_]*)*)
196
+ )x do
197
+ groups Keyword, Text, Name::Namespace
198
+ end
199
+
200
+ rule %r/(def\b)(\s*)/ do
201
+ groups Keyword, Text
202
+ push :funcname
203
+ end
204
+
205
+ rule %r/(class\b)(\s*)/ do
206
+ groups Keyword, Text
207
+ push :classname
208
+ end
209
+
210
+ rule %r/(?:#{builtins_q.join('|')})[?]/, Name::Builtin, :expr_start
211
+ rule %r/(?:#{builtins_b.join('|')})!/, Name::Builtin, :expr_start
212
+ rule %r/(?<!\.)(?:#{builtins_g.join('|')})\b/,
213
+ Name::Builtin, :method_call
214
+
215
+ mixin :has_heredocs
216
+
217
+ # `..` and `...` for ranges must have higher priority than `.`
218
+ # Otherwise, they will be parsed as :method_call
219
+ rule %r/\.{2,3}/, Operator, :expr_start
220
+
221
+ rule %r/[A-Z][a-zA-Z0-9_]*/, Name::Constant, :method_call
222
+ rule %r/(\.|::)(\s*)([a-z_]\w*[!?]?|[*%&^`~+-\/\[<>=])/ do
223
+ groups Punctuation, Text, Name::Function
224
+ push :method_call
225
+ end
226
+
227
+ rule %r/[a-zA-Z_]\w*[?!]/, Name, :expr_start
228
+ rule %r/[a-zA-Z_]\w*/, Name, :method_call
229
+ rule %r/\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|!~|&&?|\|\||\./,
230
+ Operator, :expr_start
231
+ rule %r/[-+\/*%=<>&!^|~]=?/, Operator, :expr_start
232
+ rule(/[?]/) { token Punctuation; push :ternary; push :expr_start }
233
+ rule %r<[\[({,:\\;/]>, Punctuation, :expr_start
234
+ rule %r<[\])}]>, Punctuation
235
+ end
236
+
237
+ state :has_heredocs do
238
+ rule %r/(?<!\w)(<<[-~]?)(["`']?)([a-zA-Z_]\w*)(\2)/ do |m|
239
+ token Operator, m[1]
240
+ token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
241
+ @heredoc_queue << [['<<-', '<<~'].include?(m[1]), m[3]]
242
+ push :heredoc_queue unless state? :heredoc_queue
243
+ end
244
+
245
+ rule %r/(<<[-~]?)(["'])(\2)/ do |m|
246
+ token Operator, m[1]
247
+ token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
248
+ @heredoc_queue << [['<<-', '<<~'].include?(m[1]), '']
249
+ push :heredoc_queue unless state? :heredoc_queue
250
+ end
251
+ end
252
+
253
+ state :heredoc_queue do
254
+ rule %r/(?=\n)/ do
255
+ goto :resolve_heredocs
256
+ end
257
+
258
+ mixin :root
259
+ end
260
+
261
+ state :resolve_heredocs do
262
+ mixin :string_intp_escaped
263
+
264
+ rule %r/\n/, Str::Heredoc, :test_heredoc
265
+ rule %r/[#\\\n]/, Str::Heredoc
266
+ rule %r/[^#\\\n]+/, Str::Heredoc
267
+ end
268
+
269
+ state :test_heredoc do
270
+ rule %r/[^#\\\n]*$/ do |m|
271
+ tolerant, heredoc_name = @heredoc_queue.first
272
+ check = tolerant ? m[0].strip : m[0].rstrip
273
+
274
+ # check if we found the end of the heredoc
275
+ puts " end heredoc check #{check.inspect} = #{heredoc_name.inspect}" if @debug
276
+ if check == heredoc_name
277
+ @heredoc_queue.shift
278
+ # if there's no more, we're done looking.
279
+ pop! if @heredoc_queue.empty?
280
+ token Name::Constant
281
+ else
282
+ token Str::Heredoc
283
+ end
284
+
285
+ pop!
286
+ end
287
+
288
+ rule(//) { pop! }
289
+ end
290
+
291
+ state :funcname do
292
+ rule %r/\s+/, Text
293
+ rule %r/\(/, Punctuation, :defexpr
294
+ rule %r(
295
+ (?:([a-zA-Z_]\w*)(\.))?
296
+ (
297
+ [a-zA-Z_]\w*[!?]? |
298
+ \*\*? | [-+]@? | [/%&\|^`~] | \[\]=? |
299
+ <<? | >>? | <=>? | >= | ===?
300
+ )
301
+ )x do |m|
302
+ puts "matches: #{[m[0], m[1], m[2], m[3]].inspect}" if @debug
303
+ groups Name::Class, Operator, Name::Function
304
+ pop!
305
+ end
306
+
307
+ rule(//) { pop! }
308
+ end
309
+
310
+ state :classname do
311
+ rule %r/\s+/, Text
312
+ rule %r/\w+(::\w+)+/, Name::Class
313
+
314
+ rule %r/\(/ do
315
+ token Punctuation
316
+ push :defexpr
317
+ push :expr_start
318
+ end
319
+
320
+ # class << expr
321
+ rule %r/<</ do
322
+ token Operator
323
+ goto :expr_start
324
+ end
325
+
326
+ rule %r/[A-Z_]\w*/, Name::Class, :pop!
327
+
328
+ rule(//) { pop! }
329
+ end
330
+
331
+ state :ternary do
332
+ rule %r/(:)(\s+)/ do
333
+ groups Punctuation, Text
334
+ goto :expr_start
335
+ end
336
+
337
+ rule %r/:(?![^#\n]*?[:\\])/ do
338
+ token Punctuation
339
+ goto :expr_start
340
+ end
341
+
342
+ mixin :root
343
+ end
344
+
345
+ state :defexpr do
346
+ rule %r/(\))(\.|::)?/ do
347
+ groups Punctuation, Operator
348
+ pop!
349
+ end
350
+ rule %r/\(/ do
351
+ token Punctuation
352
+ push :defexpr
353
+ push :expr_start
354
+ end
355
+
356
+ mixin :root
357
+ end
358
+
359
+ state :in_interp do
360
+ rule %r/}/, Str::Interpol, :pop!
361
+ mixin :root
362
+ end
363
+
364
+ state :string_intp do
365
+ rule %r/[#][{]/, Str::Interpol, :in_interp
366
+ rule %r/#(@@?|\$)[a-z_]\w*/i, Str::Interpol
367
+ end
368
+
369
+ state :string_intp_escaped do
370
+ mixin :string_intp
371
+ rule %r/\\([\\abefnrstv#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})/,
372
+ Str::Escape
373
+ rule %r/\\./, Str::Escape
374
+ end
375
+
376
+ state :method_call do
377
+ rule %r(/) do
378
+ token Operator
379
+ goto :expr_start
380
+ end
381
+
382
+ rule(/(?=\n)/) { pop! }
383
+
384
+ rule(//) { goto :method_call_spaced }
385
+ end
386
+
387
+ state :method_call_spaced do
388
+ mixin :whitespace
389
+
390
+ rule %r([%/]=) do
391
+ token Operator
392
+ goto :expr_start
393
+ end
394
+
395
+ rule %r((/)(?=\S|\s*/)) do
396
+ token Str::Regex
397
+ goto :slash_regex
398
+ end
399
+
400
+ mixin :sigil_strings
401
+
402
+ rule(%r((?=\s*/))) { pop! }
403
+
404
+ rule(/\s+/) { token Text; goto :expr_start }
405
+ rule(//) { pop! }
406
+ end
407
+
408
+ state :expr_start do
409
+ mixin :inline_whitespace
410
+
411
+ rule %r(/) do
412
+ token Str::Regex
413
+ goto :slash_regex
414
+ end
415
+
416
+ # char operator. ?x evaulates to "x", unless there's a digit
417
+ # beforehand like x>=0?n[x]:""
418
+ rule %r(
419
+ [?](\\[MC]-)* # modifiers
420
+ (\\([\\abefnrstv\#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)
421
+ (?!\w)
422
+ )x, Str::Char, :pop!
423
+
424
+ # special case for using a single space. Ruby demands that
425
+ # these be in a single line, otherwise it would make no sense.
426
+ rule %r/(\s*)(%[rqswQWxiI]? \S* )/ do
427
+ groups Text, Str::Other
428
+ pop!
429
+ end
430
+
431
+ mixin :sigil_strings
432
+
433
+ rule(//) { pop! }
434
+ end
435
+
436
+ state :slash_regex do
437
+ mixin :string_intp
438
+ rule %r(\\\\), Str::Regex
439
+ rule %r(\\/), Str::Regex
440
+ rule %r([\\#]), Str::Regex
441
+ rule %r([^\\/#]+)m, Str::Regex
442
+ rule %r(/) do
443
+ token Str::Regex
444
+ goto :regex_flags
445
+ end
446
+ end
447
+
448
+ state :end_part do
449
+ # eat up the rest of the stream as Comment::Preproc
450
+ rule %r/.+/m, Comment::Preproc, :pop!
451
+ end
452
+ end
453
+ end
454
+ end