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,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