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,147 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class YANG < RegexLexer
7
+ title 'YANG'
8
+ desc "Lexer for the YANG 1.1 modeling language (RFC7950)"
9
+ tag 'yang'
10
+ filenames '*.yang'
11
+ mimetypes 'application/yang'
12
+
13
+ id = /[\w_-]+(?=[^\w\-\:])\b/
14
+
15
+ #Keywords from RFC7950 ; oriented at BNF style
16
+ def self.top_stmts_keywords
17
+ @top_stms_keywords ||= Set.new %w(
18
+ module submodule
19
+ )
20
+ end
21
+
22
+ def self.module_header_stmts_keywords
23
+ @module_header_stmts_keywords ||= Set.new %w(
24
+ belongs-to namespace prefix yang-version
25
+ )
26
+ end
27
+
28
+ def self.meta_stmts_keywords
29
+ @meta_stmts_keywords ||= Set.new %w(
30
+ contact description organization reference revision
31
+ )
32
+ end
33
+
34
+ def self.linkage_stmts_keywords
35
+ @linkage_stmts_keywords ||= Set.new %w(
36
+ import include revision-date
37
+ )
38
+ end
39
+
40
+ def self.body_stmts_keywords
41
+ @body_stms_keywords ||= Set.new %w(
42
+ action argument augment deviation extension feature grouping identity
43
+ if-feature input notification output rpc typedef
44
+ )
45
+ end
46
+
47
+ def self.data_def_stmts_keywords
48
+ @data_def_stms_keywords ||= Set.new %w(
49
+ anydata anyxml case choice config container deviate leaf leaf-list
50
+ list must presence refine uses when
51
+ )
52
+ end
53
+
54
+ def self.type_stmts_keywords
55
+ @type_stmts_keywords ||= Set.new %w(
56
+ base bit default enum error-app-tag error-message fraction-digits
57
+ length max-elements min-elements modifier ordered-by path pattern
58
+ position range require-instance status type units value yin-element
59
+ )
60
+ end
61
+
62
+ def self.list_stmts_keywords
63
+ @list_stmts_keywords ||= Set.new %w(
64
+ key mandatory unique
65
+ )
66
+ end
67
+
68
+ #RFC7950 other keywords
69
+ def self.constants_keywords
70
+ @constants_keywords ||= Set.new %w(
71
+ add current delete deprecated false invert-match max min
72
+ not-supported obsolete replace true unbounded user
73
+ )
74
+ end
75
+
76
+ #RFC7950 Built-In Types
77
+ def self.types
78
+ @types ||= Set.new %w(
79
+ binary bits boolean decimal64 empty enumeration identityref
80
+ instance-identifier int16 int32 int64 int8 leafref string uint16
81
+ uint32 uint64 uint8 union
82
+ )
83
+ end
84
+
85
+ state :comment do
86
+ rule %r/[^*\/]/, Comment
87
+ rule %r/\/\*/, Comment, :comment
88
+ rule %r/\*\//, Comment, :pop!
89
+ rule %r/[*\/]/, Comment
90
+ end
91
+
92
+ #Keyword::Reserved
93
+ #groups Name::Tag, Text::Whitespace
94
+ state :root do
95
+ rule %r/\s+/, Text::Whitespace
96
+ rule %r/[\{\}\;]+/, Punctuation
97
+ rule %r/(?<![\-\w])(and|or|not|\+|\.)(?![\-\w])/, Operator
98
+
99
+ rule %r/"(?:\\"|[^"])*?"/, Str::Double #for double quotes
100
+ rule %r/'(?:\\'|[^'])*?'/, Str::Single #for single quotes
101
+
102
+ rule %r/\/\*/, Comment, :comment
103
+ rule %r/\/\/.*?$/, Comment
104
+
105
+ #match BNF stmt for `node-identifier` with [ prefix ":"]
106
+ rule %r/(?:^|(?<=[\s{};]))([\w.-]+)(:)([\w.-]+)(?=[\s{};])/ do
107
+ groups Name::Namespace, Punctuation, Name
108
+ end
109
+
110
+ #match BNF stmt `date-arg-str`
111
+ rule %r/([0-9]{4}\-[0-9]{2}\-[0-9]{2})(?=[\s\{\}\;])/, Name::Label
112
+ rule %r/([0-9]+\.[0-9]+)(?=[\s\{\}\;])/, Num::Float
113
+ rule %r/([0-9]+)(?=[\s\{\}\;])/, Num::Integer
114
+
115
+ rule id do |m|
116
+ name = m[0].downcase
117
+
118
+ if self.class.top_stmts_keywords.include? name
119
+ token Keyword::Declaration
120
+ elsif self.class.module_header_stmts_keywords.include? name
121
+ token Keyword::Declaration
122
+ elsif self.class.meta_stmts_keywords.include? name
123
+ token Keyword::Declaration
124
+ elsif self.class.linkage_stmts_keywords.include? name
125
+ token Keyword::Declaration
126
+ elsif self.class.body_stmts_keywords.include? name
127
+ token Keyword::Declaration
128
+ elsif self.class.data_def_stmts_keywords.include? name
129
+ token Keyword::Declaration
130
+ elsif self.class.type_stmts_keywords.include? name
131
+ token Keyword::Declaration
132
+ elsif self.class.list_stmts_keywords.include? name
133
+ token Keyword::Declaration
134
+ elsif self.class.types.include? name
135
+ token Keyword::Type
136
+ elsif self.class.constants_keywords.include? name
137
+ token Name::Constant
138
+ else
139
+ token Name
140
+ end
141
+ end
142
+
143
+ rule %r/[^;{}\s'"]+/, Name
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,37 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ # this file is not require'd from the root. To use this plugin, run:
5
+ #
6
+ # require 'rouge/plugins/redcarpet'
7
+
8
+ module Rouge
9
+ module Plugins
10
+ module Redcarpet
11
+ def block_code(code, language)
12
+ lexer =
13
+ begin
14
+ Lexer.find_fancy(language, code)
15
+ rescue Guesser::Ambiguous => e
16
+ e.alternatives.first
17
+ end
18
+ lexer ||= Lexers::PlainText
19
+
20
+ # XXX HACK: Redcarpet strips hard tabs out of code blocks,
21
+ # so we assume you're not using leading spaces that aren't tabs,
22
+ # and just replace them here.
23
+ if lexer.tag == 'make'
24
+ code.gsub! %r/^ /, "\t"
25
+ end
26
+
27
+ formatter = rouge_formatter(lexer)
28
+ formatter.format(lexer.lex(code))
29
+ end
30
+
31
+ # override this method for custom formatting behavior
32
+ def rouge_formatter(lexer)
33
+ Formatters::HTMLLegacy.new(:css_class => "highlight #{lexer.tag}")
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,443 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ # @abstract
6
+ # A stateful lexer that uses sets of regular expressions to
7
+ # tokenize a string. Most lexers are instances of RegexLexer.
8
+ class RegexLexer < Lexer
9
+ # A rule is a tuple of a regular expression to test, and a callback
10
+ # to perform if the test succeeds.
11
+ #
12
+ # @see StateDSL#rule
13
+ class Rule
14
+ attr_reader :callback
15
+ attr_reader :re
16
+ attr_reader :beginning_of_line
17
+ def initialize(re, callback)
18
+ @re = re
19
+ @callback = callback
20
+ @beginning_of_line = re.source[0] == ?^
21
+ end
22
+
23
+ def inspect
24
+ "#<Rule #{@re.inspect}>"
25
+ end
26
+ end
27
+
28
+ # a State is a named set of rules that can be tested for or
29
+ # mixed in.
30
+ #
31
+ # @see RegexLexer.state
32
+ class State
33
+ attr_reader :name, :rules
34
+ def initialize(name, rules)
35
+ @name = name
36
+ @rules = rules
37
+ end
38
+
39
+ def inspect
40
+ "#<#{self.class.name} #{@name.inspect}>"
41
+ end
42
+ end
43
+
44
+ class StateDSL
45
+ attr_reader :rules
46
+ def initialize(name, &defn)
47
+ @name = name
48
+ @defn = defn
49
+ @rules = []
50
+ @loaded = false
51
+ end
52
+
53
+ def to_state(lexer_class)
54
+ load!
55
+ rules = @rules.map do |rule|
56
+ rule.is_a?(String) ? lexer_class.get_state(rule) : rule
57
+ end
58
+ State.new(@name, rules)
59
+ end
60
+
61
+ def prepended(&defn)
62
+ parent_defn = @defn
63
+ StateDSL.new(@name) do
64
+ instance_eval(&defn)
65
+ instance_eval(&parent_defn)
66
+ end
67
+ end
68
+
69
+ def appended(&defn)
70
+ parent_defn = @defn
71
+ StateDSL.new(@name) do
72
+ instance_eval(&parent_defn)
73
+ instance_eval(&defn)
74
+ end
75
+ end
76
+
77
+ protected
78
+ # Define a new rule for this state.
79
+ #
80
+ # @overload rule(re, token, next_state=nil)
81
+ # @overload rule(re, &callback)
82
+ #
83
+ # @param [Regexp] re
84
+ # a regular expression for this rule to test.
85
+ # @param [String] tok
86
+ # the token type to yield if `re` matches.
87
+ # @param [#to_s] next_state
88
+ # (optional) a state to push onto the stack if `re` matches.
89
+ # If `next_state` is `:pop!`, the state stack will be popped
90
+ # instead.
91
+ # @param [Proc] callback
92
+ # a block that will be evaluated in the context of the lexer
93
+ # if `re` matches. This block has access to a number of lexer
94
+ # methods, including {RegexLexer#push}, {RegexLexer#pop!},
95
+ # {RegexLexer#token}, and {RegexLexer#delegate}. The first
96
+ # argument can be used to access the match groups.
97
+ def rule(re, tok=nil, next_state=nil, &callback)
98
+ if tok.nil? && callback.nil?
99
+ raise "please pass `rule` a token to yield or a callback"
100
+ end
101
+
102
+ callback ||= case next_state
103
+ when :pop!
104
+ proc do |stream|
105
+ puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug
106
+ @output_stream.call(tok, stream[0])
107
+ puts " popping stack: 1" if @debug
108
+ @stack.pop or raise 'empty stack!'
109
+ end
110
+ when :push
111
+ proc do |stream|
112
+ puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug
113
+ @output_stream.call(tok, stream[0])
114
+ puts " pushing :#{@stack.last.name}" if @debug
115
+ @stack.push(@stack.last)
116
+ end
117
+ when Symbol
118
+ proc do |stream|
119
+ puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug
120
+ @output_stream.call(tok, stream[0])
121
+ state = @states[next_state] || self.class.get_state(next_state)
122
+ puts " pushing :#{state.name}" if @debug
123
+ @stack.push(state)
124
+ end
125
+ when nil
126
+ proc do |stream|
127
+ puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug
128
+ @output_stream.call(tok, stream[0])
129
+ end
130
+ else
131
+ raise "invalid next state: #{next_state.inspect}"
132
+ end
133
+
134
+ rules << Rule.new(re, callback)
135
+ end
136
+
137
+ # Mix in the rules from another state into this state. The rules
138
+ # from the mixed-in state will be tried in order before moving on
139
+ # to the rest of the rules in this state.
140
+ def mixin(state)
141
+ rules << state.to_s
142
+ end
143
+
144
+ private
145
+ def load!
146
+ return if @loaded
147
+ @loaded = true
148
+ instance_eval(&@defn)
149
+ end
150
+ end
151
+
152
+ # The states hash for this lexer.
153
+ # @see state
154
+ def self.states
155
+ @states ||= {}
156
+ end
157
+
158
+ def self.state_definitions
159
+ @state_definitions ||= InheritableHash.new(superclass.state_definitions)
160
+ end
161
+ @state_definitions = {}
162
+
163
+ def self.replace_state(name, new_defn)
164
+ states[name] = nil
165
+ state_definitions[name] = new_defn
166
+ end
167
+
168
+ # The routines to run at the beginning of a fresh lex.
169
+ # @see start
170
+ def self.start_procs
171
+ @start_procs ||= InheritableList.new(superclass.start_procs)
172
+ end
173
+ @start_procs = []
174
+
175
+ # Specify an action to be run every fresh lex.
176
+ #
177
+ # @example
178
+ # start { puts "I'm lexing a new string!" }
179
+ def self.start(&b)
180
+ start_procs << b
181
+ end
182
+
183
+ # Define a new state for this lexer with the given name.
184
+ # The block will be evaluated in the context of a {StateDSL}.
185
+ def self.state(name, &b)
186
+ name = name.to_sym
187
+ state_definitions[name] = StateDSL.new(name, &b)
188
+ end
189
+
190
+ def self.prepend(name, &b)
191
+ name = name.to_sym
192
+ dsl = state_definitions[name] or raise "no such state #{name.inspect}"
193
+ replace_state(name, dsl.prepended(&b))
194
+ end
195
+
196
+ def self.append(name, &b)
197
+ name = name.to_sym
198
+ dsl = state_definitions[name] or raise "no such state #{name.inspect}"
199
+ replace_state(name, dsl.appended(&b))
200
+ end
201
+
202
+ # @private
203
+ def self.get_state(name)
204
+ return name if name.is_a? State
205
+
206
+ states[name.to_sym] ||= begin
207
+ defn = state_definitions[name.to_sym] or raise "unknown state: #{name.inspect}"
208
+ defn.to_state(self)
209
+ end
210
+ end
211
+
212
+ # @private
213
+ def get_state(state_name)
214
+ self.class.get_state(state_name)
215
+ end
216
+
217
+ # The state stack. This is initially the single state `[:root]`.
218
+ # It is an error for this stack to be empty.
219
+ # @see #state
220
+ def stack
221
+ @stack ||= [get_state(:root)]
222
+ end
223
+
224
+ # The current state - i.e. one on top of the state stack.
225
+ #
226
+ # NB: if the state stack is empty, this will throw an error rather
227
+ # than returning nil.
228
+ def state
229
+ stack.last or raise 'empty stack!'
230
+ end
231
+
232
+ # reset this lexer to its initial state. This runs all of the
233
+ # start_procs.
234
+ def reset!
235
+ @stack = nil
236
+ @current_stream = nil
237
+
238
+ puts "start blocks" if @debug && self.class.start_procs.any?
239
+ self.class.start_procs.each do |pr|
240
+ instance_eval(&pr)
241
+ end
242
+ end
243
+
244
+ # This implements the lexer protocol, by yielding [token, value] pairs.
245
+ #
246
+ # The process for lexing works as follows, until the stream is empty:
247
+ #
248
+ # 1. We look at the state on top of the stack (which by default is
249
+ # `[:root]`).
250
+ # 2. Each rule in that state is tried until one is successful. If one
251
+ # is found, that rule's callback is evaluated - which may yield
252
+ # tokens and manipulate the state stack. Otherwise, one character
253
+ # is consumed with an `'Error'` token, and we continue at (1.)
254
+ #
255
+ # @see #step #step (where (2.) is implemented)
256
+ def stream_tokens(str, &b)
257
+ stream = StringScanner.new(str)
258
+
259
+ @current_stream = stream
260
+ @output_stream = b
261
+ @states = self.class.states
262
+ @null_steps = 0
263
+
264
+ until stream.eos?
265
+ if @debug
266
+ puts
267
+ puts "lexer: #{self.class.tag}"
268
+ puts "stack: #{stack.map(&:name).map(&:to_sym).inspect}"
269
+ puts "stream: #{stream.peek(20).inspect}"
270
+ end
271
+
272
+ success = step(state, stream)
273
+
274
+ if !success
275
+ puts " no match, yielding Error" if @debug
276
+ b.call(Token::Tokens::Error, stream.getch)
277
+ end
278
+ end
279
+ end
280
+
281
+ # The number of successive scans permitted without consuming
282
+ # the input stream. If this is exceeded, the match fails.
283
+ MAX_NULL_SCANS = 5
284
+
285
+ # Runs one step of the lex. Rules in the current state are tried
286
+ # until one matches, at which point its callback is called.
287
+ #
288
+ # @return true if a rule was tried successfully
289
+ # @return false otherwise.
290
+ def step(state, stream)
291
+ state.rules.each do |rule|
292
+ if rule.is_a?(State)
293
+ puts " entering: mixin :#{rule.name}" if @debug
294
+ return true if step(rule, stream)
295
+ puts " exiting: mixin :#{rule.name}" if @debug
296
+ else
297
+ puts " trying: #{rule.inspect}" if @debug
298
+
299
+ # XXX HACK XXX
300
+ # StringScanner's implementation of ^ is b0rken.
301
+ # see http://bugs.ruby-lang.org/issues/7092
302
+ # TODO: this doesn't cover cases like /(a|^b)/, but it's
303
+ # the most common, for now...
304
+ next if rule.beginning_of_line && !stream.beginning_of_line?
305
+
306
+ if (size = stream.skip(rule.re))
307
+ puts " got: #{stream[0].inspect}" if @debug
308
+
309
+ instance_exec(stream, &rule.callback)
310
+
311
+ if size.zero?
312
+ @null_steps += 1
313
+ if @null_steps > MAX_NULL_SCANS
314
+ puts " warning: too many scans without consuming the string!" if @debug
315
+ return false
316
+ end
317
+ else
318
+ @null_steps = 0
319
+ end
320
+
321
+ return true
322
+ end
323
+ end
324
+ end
325
+
326
+ false
327
+ end
328
+
329
+ # Yield a token.
330
+ #
331
+ # @param tok
332
+ # the token type
333
+ # @param val
334
+ # (optional) the string value to yield. If absent, this defaults
335
+ # to the entire last match.
336
+ def token(tok, val=@current_stream[0])
337
+ yield_token(tok, val)
338
+ end
339
+
340
+ # @deprecated
341
+ #
342
+ # Yield a token with the next matched group. Subsequent calls
343
+ # to this method will yield subsequent groups.
344
+ def group(tok)
345
+ raise "RegexLexer#group is deprecated: use #groups instead"
346
+ end
347
+
348
+ # Yield tokens corresponding to the matched groups of the current
349
+ # match.
350
+ def groups(*tokens)
351
+ tokens.each_with_index do |tok, i|
352
+ yield_token(tok, @current_stream[i+1])
353
+ end
354
+ end
355
+
356
+ # Delegate the lex to another lexer. We use the `continue_lex` method
357
+ # so that #reset! will not be called. In this way, a single lexer
358
+ # can be repeatedly delegated to while maintaining its own internal
359
+ # state stack.
360
+ #
361
+ # @param [#lex] lexer
362
+ # The lexer or lexer class to delegate to
363
+ # @param [String] text
364
+ # The text to delegate. This defaults to the last matched string.
365
+ def delegate(lexer, text=nil)
366
+ puts " delegating to: #{lexer.inspect}" if @debug
367
+ text ||= @current_stream[0]
368
+
369
+ lexer.continue_lex(text) do |tok, val|
370
+ puts " delegated token: #{tok.inspect}, #{val.inspect}" if @debug
371
+ yield_token(tok, val)
372
+ end
373
+ end
374
+
375
+ def recurse(text=nil)
376
+ delegate(self.class, text)
377
+ end
378
+
379
+ # Push a state onto the stack. If no state name is given and you've
380
+ # passed a block, a state will be dynamically created using the
381
+ # {StateDSL}.
382
+ def push(state_name=nil, &b)
383
+ push_state = if state_name
384
+ get_state(state_name)
385
+ elsif block_given?
386
+ StateDSL.new(b.inspect, &b).to_state(self.class)
387
+ else
388
+ # use the top of the stack by default
389
+ self.state
390
+ end
391
+
392
+ puts " pushing: :#{push_state.name}" if @debug
393
+ stack.push(push_state)
394
+ end
395
+
396
+ # Pop the state stack. If a number is passed in, it will be popped
397
+ # that number of times.
398
+ def pop!(times=1)
399
+ raise 'empty stack!' if stack.empty?
400
+
401
+ puts " popping stack: #{times}" if @debug
402
+
403
+ stack.pop(times)
404
+
405
+ nil
406
+ end
407
+
408
+ # replace the head of the stack with the given state
409
+ def goto(state_name)
410
+ raise 'empty stack!' if stack.empty?
411
+
412
+ puts " going to: state :#{state_name} " if @debug
413
+ stack[-1] = get_state(state_name)
414
+ end
415
+
416
+ # reset the stack back to `[:root]`.
417
+ def reset_stack
418
+ puts ' resetting stack' if @debug
419
+ stack.clear
420
+ stack.push get_state(:root)
421
+ end
422
+
423
+ # Check if `state_name` is in the state stack.
424
+ def in_state?(state_name)
425
+ state_name = state_name.to_sym
426
+ stack.any? do |state|
427
+ state.name == state_name.to_sym
428
+ end
429
+ end
430
+
431
+ # Check if `state_name` is the state on top of the state stack.
432
+ def state?(state_name)
433
+ state_name.to_sym == state.name
434
+ end
435
+
436
+ private
437
+ def yield_token(tok, val)
438
+ return if val.nil? || val.empty?
439
+ puts " yielding: #{tok.qualname}, #{val.inspect}" if @debug
440
+ @output_stream.yield(tok, val)
441
+ end
442
+ end
443
+ end