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
+ module Rouge
4
+ module Formatters
5
+ class TerminalTruecolor < Terminal256
6
+ tag 'terminal_truecolor'
7
+
8
+ class TruecolorEscapeSequence < Terminal256::EscapeSequence
9
+ def style_string
10
+ @style_string ||= begin
11
+ out = String.new('')
12
+ out << escape(['48', '2', *get_rgb(style.bg)]) if style.bg
13
+ out << escape(['38', '2', *get_rgb(style.fg)]) if style.fg
14
+ out << escape(['1']) if style[:bold] || style[:italic]
15
+ out
16
+ end
17
+ end
18
+
19
+ def get_rgb(color)
20
+ color = $1 if color =~ /#(\h+)/
21
+
22
+ case color.size
23
+ when 3 then color.chars.map { |c| c.to_i(16) * 2 }
24
+ when 6 then color.scan(/../).map { |cc| cc.to_i(16) }
25
+ else
26
+ raise "invalid color: #{color.inspect}"
27
+ end
28
+ end
29
+ end
30
+
31
+ # @override
32
+ def make_escape_sequence(style)
33
+ TruecolorEscapeSequence.new(style)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,92 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Formatters
6
+ class Tex < Formatter
7
+ tag 'tex'
8
+
9
+ # A map of TeX escape characters.
10
+ # Newlines are handled specially by using #token_lines
11
+ # spaces are preserved as long as they aren't at the beginning
12
+ # of a line. see #tag_first for our initial-space strategy
13
+ ESCAPE = {
14
+ '&' => '\&',
15
+ '%' => '\%',
16
+ '$' => '\$',
17
+ '#' => '\#',
18
+ '_' => '\_',
19
+ '{' => '\{',
20
+ '}' => '\}',
21
+ '~' => '{\textasciitilde}',
22
+ '^' => '{\textasciicircum}',
23
+ '|' => '{\textbar}',
24
+ '\\' => '{\textbackslash}',
25
+ '`' => '{\textasciigrave}',
26
+ "'" => "'{}",
27
+ '"' => '"{}',
28
+ "\t" => '{\tab}',
29
+ }
30
+
31
+ ESCAPE_REGEX = /[#{ESCAPE.keys.map(&Regexp.method(:escape)).join}]/om
32
+
33
+ def initialize(opts={})
34
+ @prefix = opts.fetch(:prefix) { 'RG' }
35
+ end
36
+
37
+ def escape_tex(str)
38
+ str.gsub(ESCAPE_REGEX, ESCAPE)
39
+ end
40
+
41
+ def stream(tokens, &b)
42
+ # surround the output with \begin{RG*}...\end{RG*}
43
+ yield "\\begin{#{@prefix}*}%\n"
44
+
45
+ # we strip the newline off the last line to avoid
46
+ # an extra line being rendered. we do this by yielding
47
+ # the \newline tag *before* every line group except
48
+ # the first.
49
+ first = true
50
+
51
+ token_lines tokens do |line|
52
+ if first
53
+ first = false
54
+ else
55
+ yield "\\newline%\n"
56
+ end
57
+
58
+ render_line(line, &b)
59
+ end
60
+
61
+ yield "%\n\\end{#{@prefix}*}%\n"
62
+ end
63
+
64
+ def render_line(line, &b)
65
+ line.each do |(tok, val)|
66
+ hphantom_tag(tok, val, &b)
67
+ end
68
+ end
69
+
70
+ # Special handling for leading spaces, since they may be gobbled
71
+ # by a previous command. We replace all initial spaces with
72
+ # \hphantom{xxxx}, which renders an empty space equal to the size
73
+ # of the x's.
74
+ def hphantom_tag(tok, val)
75
+ leading = nil
76
+ val.sub!(/^[ ]+/) { leading = $&.size; '' }
77
+ yield "\\hphantom{#{'x' * leading}}" if leading
78
+ yield tag(tok, val) unless val.empty?
79
+ end
80
+
81
+ def tag(tok, val)
82
+ if escape?(tok)
83
+ val
84
+ elsif tok == Token::Tokens::Text
85
+ escape_tex(val)
86
+ else
87
+ "\\#@prefix{#{tok.shortname}}{#{escape_tex(val)}}"
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rouge
4
+ class Guesser
5
+ class Ambiguous < StandardError
6
+ attr_reader :alternatives
7
+ def initialize(alternatives); @alternatives = alternatives; end
8
+
9
+ def message
10
+ "Ambiguous guess: can't decide between #{alternatives.map(&:tag).inspect}"
11
+ end
12
+ end
13
+
14
+ def self.guess(guessers, lexers)
15
+ original_size = lexers.size
16
+
17
+ guessers.each do |g|
18
+ new_lexers = case g
19
+ when Guesser then g.filter(lexers)
20
+ when proc { |x| x.respond_to? :call } then g.call(lexers)
21
+ else raise "bad guesser: #{g}"
22
+ end
23
+
24
+ lexers = new_lexers && new_lexers.any? ? new_lexers : lexers
25
+ end
26
+
27
+ # if we haven't filtered the input at *all*,
28
+ # then we have no idea what language it is,
29
+ # so we bail and return [].
30
+ lexers.size < original_size ? lexers : []
31
+ end
32
+
33
+ def collect_best(lexers, opts={}, &scorer)
34
+ best = []
35
+ best_score = opts[:threshold]
36
+
37
+ lexers.each do |lexer|
38
+ score = scorer.call(lexer)
39
+
40
+ next if score.nil?
41
+
42
+ if best_score.nil? || score > best_score
43
+ best_score = score
44
+ best = [lexer]
45
+ elsif score == best_score
46
+ best << lexer
47
+ end
48
+ end
49
+
50
+ best
51
+ end
52
+
53
+ def filter(lexers)
54
+ raise 'abstract'
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,136 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rouge
4
+ module Guessers
5
+ class Disambiguation < Guesser
6
+ include Util
7
+ include Lexers
8
+
9
+ def initialize(filename, source)
10
+ @filename = File.basename(filename)
11
+ @source = source
12
+ end
13
+
14
+ def filter(lexers)
15
+ return lexers if lexers.size == 1
16
+ return lexers if lexers.size == Lexer.all.size
17
+
18
+ @analyzer = TextAnalyzer.new(get_source(@source))
19
+
20
+ self.class.disambiguators.each do |disambiguator|
21
+ next unless disambiguator.match?(@filename)
22
+
23
+ filtered = disambiguator.decide!(self)
24
+ return filtered if filtered
25
+ end
26
+
27
+ return lexers
28
+ end
29
+
30
+ def contains?(text)
31
+ return @analyzer.include?(text)
32
+ end
33
+
34
+ def matches?(re)
35
+ return !!(@analyzer =~ re)
36
+ end
37
+
38
+ @disambiguators = []
39
+ def self.disambiguate(*patterns, &decider)
40
+ @disambiguators << Disambiguator.new(patterns, &decider)
41
+ end
42
+
43
+ def self.disambiguators
44
+ @disambiguators
45
+ end
46
+
47
+ class Disambiguator
48
+ include Util
49
+
50
+ def initialize(patterns, &decider)
51
+ @patterns = patterns
52
+ @decider = decider
53
+ end
54
+
55
+ def decide!(guesser)
56
+ out = guesser.instance_eval(&@decider)
57
+ case out
58
+ when Array then out
59
+ when nil then nil
60
+ else [out]
61
+ end
62
+ end
63
+
64
+ def match?(filename)
65
+ @patterns.any? { |p| test_glob(p, filename) }
66
+ end
67
+ end
68
+
69
+ disambiguate '*.pl' do
70
+ next Perl if contains?('my $')
71
+ next Prolog if contains?(':-')
72
+ next Prolog if matches?(/\A\w+(\(\w+\,\s*\w+\))*\./)
73
+ end
74
+
75
+ disambiguate '*.h' do
76
+ next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
77
+ next ObjectiveC if contains?('@"')
78
+ next Cpp if matches?(/^\s*(?:catch|class|constexpr|namespace|private|
79
+ protected|public|template|throw|try|using)\b/x)
80
+
81
+ C
82
+ end
83
+
84
+ disambiguate '*.m' do
85
+ next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
86
+ next ObjectiveC if contains?('@"')
87
+
88
+ next Mathematica if contains?('(*')
89
+ next Mathematica if contains?(':=')
90
+
91
+ next Mason if matches?(/<%(def|method|text|doc|args|flags|attr|init|once|shared|perl|cleanup|filter)([^>]*)(>)/)
92
+
93
+ next Matlab if matches?(/^\s*?%/)
94
+
95
+ next Mason if matches? %r!(</?%|<&)!
96
+ end
97
+
98
+ disambiguate '*.php' do
99
+ # PHP always takes precedence over Hack
100
+ PHP
101
+ end
102
+
103
+ disambiguate '*.hh' do
104
+ next Cpp if matches?(/^\s*#include/)
105
+ next Hack if matches?(/^<\?hh/)
106
+ next Hack if matches?(/(\(|, ?)\$\$/)
107
+
108
+ Cpp
109
+ end
110
+
111
+ disambiguate '*.plist' do
112
+ next XML if matches?(/\A<\?xml\b/)
113
+
114
+ Plist
115
+ end
116
+
117
+ disambiguate '*.sc' do
118
+ next Python if matches?(/^#/)
119
+ next SuperCollider if matches?(/(?:^~|;$)/)
120
+
121
+ next Python
122
+ end
123
+
124
+ disambiguate 'Messages' do
125
+ next MsgTrans if matches?(/^[^\s:]+:[^\s:]+/)
126
+
127
+ next PlainText
128
+ end
129
+
130
+ disambiguate '*.cls' do
131
+ next TeX if matches?(/\A\s*(?:\\|%)/)
132
+ next Apex
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rouge
4
+ module Guessers
5
+ class Filename < Guesser
6
+ attr_reader :fname
7
+ def initialize(filename)
8
+ @filename = filename
9
+ end
10
+
11
+ # returns a list of lexers that match the given filename with
12
+ # equal specificity (i.e. number of wildcards in the pattern).
13
+ # This helps disambiguate between, e.g. the Nginx lexer, which
14
+ # matches `nginx.conf`, and the Conf lexer, which matches `*.conf`.
15
+ # In this case, nginx will win because the pattern has no wildcards,
16
+ # while `*.conf` has one.
17
+ def filter(lexers)
18
+ mapping = {}
19
+ lexers.each do |lexer|
20
+ mapping[lexer.name] = lexer.filenames || []
21
+ end
22
+
23
+ GlobMapping.new(mapping, @filename).filter(lexers)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rouge
4
+ module Guessers
5
+ # This class allows for custom behavior
6
+ # with glob -> lexer name mappings
7
+ class GlobMapping < Guesser
8
+ include Util
9
+
10
+ def self.by_pairs(mapping, filename)
11
+ glob_map = {}
12
+ mapping.each do |(glob, lexer_name)|
13
+ lexer = Lexer.find(lexer_name)
14
+
15
+ # ignore unknown lexers
16
+ next unless lexer
17
+
18
+ glob_map[lexer.name] ||= []
19
+ glob_map[lexer.name] << glob
20
+ end
21
+
22
+ new(glob_map, filename)
23
+ end
24
+
25
+ attr_reader :glob_map, :filename
26
+ def initialize(glob_map, filename)
27
+ @glob_map = glob_map
28
+ @filename = filename
29
+ end
30
+
31
+ def filter(lexers)
32
+ basename = File.basename(filename)
33
+
34
+ collect_best(lexers) do |lexer|
35
+ (@glob_map[lexer.name] || []).map do |pattern|
36
+ if test_glob(pattern, basename)
37
+ # specificity is better the fewer wildcards there are
38
+ -pattern.scan(/[*?\[]/).size
39
+ end
40
+ end.compact.min
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rouge
4
+ module Guessers
5
+ class Mimetype < Guesser
6
+ attr_reader :mimetype
7
+ def initialize(mimetype)
8
+ @mimetype = mimetype
9
+ end
10
+
11
+ def filter(lexers)
12
+ lexers.select { |lexer| lexer.mimetypes.include? @mimetype }
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rouge
4
+ module Guessers
5
+ class Modeline < Guesser
6
+ include Util
7
+
8
+ # [jneen] regexen stolen from linguist
9
+ EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
10
+
11
+ # First form vim modeline
12
+ # [text]{white}{vi:|vim:|ex:}[white]{options}
13
+ # ex: 'vim: syntax=ruby'
14
+ VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i
15
+
16
+ # Second form vim modeline (compatible with some versions of Vi)
17
+ # [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]
18
+ # ex: 'vim set syntax=ruby:'
19
+ VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i
20
+
21
+ MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2]
22
+
23
+ def initialize(source, opts={})
24
+ @source = source
25
+ @lines = opts[:lines] || 5
26
+ end
27
+
28
+ def filter(lexers)
29
+ # don't bother reading the stream if we've already decided
30
+ return lexers if lexers.size == 1
31
+
32
+ source_text = get_source(@source)
33
+
34
+ lines = source_text.split(/\n/)
35
+
36
+ search_space = (lines.first(@lines) + lines.last(@lines)).join("\n")
37
+
38
+ matches = MODELINES.map { |re| re.match(search_space) }.compact
39
+ return lexers unless matches.any?
40
+
41
+ match_set = Set.new(matches.map { |m| m[1] })
42
+ lexers.select { |l| match_set.include?(l.tag) || l.aliases.any? { |a| match_set.include?(a) } }
43
+ end
44
+ end
45
+ end
46
+ end