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,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 579264110ed9ae2f82195af1d9d83d2ebf6288f8ce3cd6909c2a9d563ae0e1d5
4
+ data.tar.gz: 25a1809f05ec5aab6f04ee7b885a17cf8b1388e1247284e773bc166d13a9e296
5
+ SHA512:
6
+ metadata.gz: 832c13a7236b814d53a5a6b170fc00b4961efb2cdee91053bfc3a6386a9bc6c7b071f9fa51606321e94249b57c6f549f6e4bb420e7647ab68ca6a3c6e49d8c63
7
+ data.tar.gz: 5889f29c2788788120fd698ec004b847c5bafb7df0b22af36c9f1d2a78218c81e7fd136b359b586ed8f586e0a65eceb156721efcb95d95e3af7df34d0b174038
data/Gemfile ADDED
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'http://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'rake'
8
+
9
+ gem 'minitest', '>= 5.0'
10
+ gem 'minitest-power_assert'
11
+
12
+ gem 'parallel', '~> 1.13.0' if RUBY_VERSION < '2.2.0'
13
+ gem 'rubocop', '~> 0.49.1'
14
+
15
+ # don't try to install redcarpet under jruby
16
+ gem 'redcarpet', :platforms => :ruby
17
+
18
+ # Profiling
19
+ if RUBY_VERSION >= '2.3.0'
20
+ gem 'memory_profiler', :require => false
21
+ end
22
+
23
+ # Needed for a Rake task
24
+ gem 'git'
25
+ gem 'yard'
26
+
27
+ group :development do
28
+ gem 'pry'
29
+
30
+ # docs
31
+ gem 'github-markup'
32
+
33
+ # for visual tests
34
+ if RUBY_VERSION < '2.2.0'
35
+ gem 'sinatra', '~> 1.4.8'
36
+ else
37
+ gem 'sinatra'
38
+ end
39
+ gem 'shotgun'
40
+ end
data/LICENSE ADDED
@@ -0,0 +1,186 @@
1
+ # MIT license. See http://www.opensource.org/licenses/mit-license.php
2
+
3
+ Copyright (c) 2012 Jeanine Adkisson.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
22
+
23
+ # SPECIAL NOTE:
24
+ Many of the lexers in this project are adaptations of those in Pygments
25
+ (pygments.org). The license for Pygments is as follows:
26
+
27
+ # BEGIN pygments/LICENSE #
28
+
29
+ Copyright (c) 2006-2012 by the respective authors (see AUTHORS file).
30
+ All rights reserved.
31
+
32
+ Redistribution and use in source and binary forms, with or without
33
+ modification, are permitted provided that the following conditions are
34
+ met:
35
+
36
+ * Redistributions of source code must retain the above copyright
37
+ notice, this list of conditions and the following disclaimer.
38
+
39
+ * Redistributions in binary form must reproduce the above copyright
40
+ notice, this list of conditions and the following disclaimer in the
41
+ documentation and/or other materials provided with the distribution.
42
+
43
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
44
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
45
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
46
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
47
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
48
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
49
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
50
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
51
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
52
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
53
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54
+
55
+ # END pygments/LICENSE #
56
+
57
+ The contents of the AUTHORS file at the time of porting was:
58
+
59
+ # BEGIN pygments/AUTHORS #
60
+
61
+ Pygments is written and maintained by Georg Brandl <georg@python.org>.
62
+
63
+ Major developers are Tim Hatch <tim@timhatch.com> and Armin Ronacher
64
+ <armin.ronacher@active-4.com>.
65
+
66
+ Other contributors, listed alphabetically, are:
67
+
68
+ * Sam Aaron -- Ioke lexer
69
+ * Kumar Appaiah -- Debian control lexer
70
+ * Ali Afshar -- image formatter
71
+ * Andreas Amann -- AppleScript lexer
72
+ * Jeffrey Arnold -- R/S lexer, BUGS lexers
73
+ * Jeremy Ashkenas -- CoffeeScript lexer
74
+ * Stefan Matthias Aust -- Smalltalk lexer
75
+ * Ben Bangert -- Mako lexers
76
+ * Max Battcher -- Darcs patch lexer
77
+ * Paul Baumgart, 280 North, Inc. -- Objective-J lexer
78
+ * Michael Bayer -- Myghty lexers
79
+ * John Benediktsson -- Factor lexer
80
+ * Christopher Bertels -- Fancy lexer
81
+ * Jarrett Billingsley -- MiniD lexer
82
+ * Adam Blinkinsop -- Haskell, Redcode lexers
83
+ * Frits van Bommel -- assembler lexers
84
+ * Pierre Bourdon -- bugfixes
85
+ * Hiram Chirino -- Scaml and Jade lexers
86
+ * Leaf Corcoran -- MoonScript lexer
87
+ * Christopher Creutzig -- MuPAD lexer
88
+ * Pete Curry -- bugfixes
89
+ * Owen Durni -- haXe lexer
90
+ * Nick Efford -- Python 3 lexer
91
+ * Sven Efftinge -- Xtend lexer
92
+ * Artem Egorkine -- terminal256 formatter
93
+ * James H. Fisher -- PostScript lexer
94
+ * Carlos Galdino -- Elixir and Elixir Console lexers
95
+ * Naveen Garg -- Autohotkey lexer
96
+ * Laurent Gautier -- R/S lexer
97
+ * Alex Gaynor -- PyPy log lexer
98
+ * Bertrand Goetzmann -- Groovy lexer
99
+ * Krzysiek Goj -- Scala lexer
100
+ * Matt Good -- Genshi, Cheetah lexers
101
+ * Patrick Gotthardt -- PHP namespaces support
102
+ * Olivier Guibe -- Asymptote lexer
103
+ * Martin Harriman -- SNOBOL lexer
104
+ * Matthew Harrison -- SVG formatter
105
+ * Steven Hazel -- Tcl lexer
106
+ * Aslak Hellesøy -- Gherkin lexer
107
+ * Greg Hendershott -- Racket lexer
108
+ * Jordi Gutiérrez Hermoso -- Octave lexer
109
+ * David Hess, Fish Software, Inc. -- Objective-J lexer
110
+ * Varun Hiremath -- Debian control lexer
111
+ * Doug Hogan -- Mscgen lexer
112
+ * Ben Hollis -- Mason lexer
113
+ * Tim Howard -- BlitzMax lexer
114
+ * Ivan Inozemtsev -- Fantom lexer
115
+ * Brian R. Jackson -- Tea lexer
116
+ * Dennis Kaarsemaker -- sources.list lexer
117
+ * Igor Kalnitsky -- vhdl lexer
118
+ * Eric Knibbe -- Lasso lexer
119
+ * Adam Koprowski -- Opa lexer
120
+ * Benjamin Kowarsch -- Modula-2 lexer
121
+ * Alexander Kriegisch -- Kconfig and AspectJ lexers
122
+ * Marek Kubica -- Scheme lexer
123
+ * Jochen Kupperschmidt -- Markdown processor
124
+ * Gerd Kurzbach -- Modelica lexer
125
+ * Olov Lassus -- Dart lexer
126
+ * Sylvestre Ledru -- Scilab lexer
127
+ * Mark Lee -- Vala lexer
128
+ * Ben Mabey -- Gherkin lexer
129
+ * Simone Margaritelli -- Hybris lexer
130
+ * Kirk McDonald -- D lexer
131
+ * Gordon McGregor -- SystemVerilog lexer
132
+ * Stephen McKamey -- Duel/JBST lexer
133
+ * Brian McKenna -- F# lexer
134
+ * Lukas Meuser -- BBCode formatter, Lua lexer
135
+ * Paul Miller -- LiveScript lexer
136
+ * Hong Minhee -- HTTP lexer
137
+ * Michael Mior -- Awk lexer
138
+ * Jon Morton -- Rust lexer
139
+ * Paulo Moura -- Logtalk lexer
140
+ * Mher Movsisyan -- DTD lexer
141
+ * Ana Nelson -- Ragel, ANTLR, R console lexers
142
+ * Nam T. Nguyen -- Monokai style
143
+ * Jesper Noehr -- HTML formatter "anchorlinenos"
144
+ * Mike Nolta -- Julia lexer
145
+ * Jonas Obrist -- BBCode lexer
146
+ * David Oliva -- Rebol lexer
147
+ * Jon Parise -- Protocol buffers lexer
148
+ * Ronny Pfannschmidt -- BBCode lexer
149
+ * Benjamin Peterson -- Test suite refactoring
150
+ * Dominik Picheta -- Nimrod lexer
151
+ * Clément Prévost -- UrbiScript lexer
152
+ * Kashif Rasul -- CUDA lexer
153
+ * Justin Reidy -- MXML lexer
154
+ * Norman Richards -- JSON lexer
155
+ * Lubomir Rintel -- GoodData MAQL and CL lexers
156
+ * Andre Roberge -- Tango style
157
+ * Konrad Rudolph -- LaTeX formatter enhancements
158
+ * Mario Ruggier -- Evoque lexers
159
+ * Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers
160
+ * Matteo Sasso -- Common Lisp lexer
161
+ * Joe Schafer -- Ada lexer
162
+ * Ken Schutte -- Matlab lexers
163
+ * Tassilo Schweyer -- Io, MOOCode lexers
164
+ * Joerg Sieker -- ABAP lexer
165
+ * Robert Simmons -- Standard ML lexer
166
+ * Kirill Simonov -- YAML lexer
167
+ * Steve Spigarelli -- XQuery lexer
168
+ * Jerome St-Louis -- eC lexer
169
+ * James Strachan -- Kotlin lexer
170
+ * Tiberius Teng -- default style overhaul
171
+ * Jeremy Thurgood -- Erlang, Squid config lexers
172
+ * Erick Tryzelaar -- Felix lexer
173
+ * Daniele Varrazzo -- PostgreSQL lexers
174
+ * Abe Voelker -- OpenEdge ABL lexer
175
+ * Whitney Young -- ObjectiveC lexer
176
+ * Matthias Vallentin -- Bro lexer
177
+ * Nathan Weizenbaum -- Haml and Sass lexers
178
+ * Dietmar Winkler -- Modelica lexer
179
+ * Nils Winter -- Smalltalk lexer
180
+ * Davy Wybiral -- Clojure lexer
181
+ * Diego Zamboni -- CFengine3 lexer
182
+ * Alex Zimin -- Nemerle lexer
183
+
184
+ Many thanks for all contributions!
185
+
186
+ # END pygments/AUTHORS #
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'pathname'
5
+ ROOT_DIR = Pathname.new(__FILE__).dirname.parent
6
+ load ROOT_DIR.join('lib/rouge.rb')
7
+ load ROOT_DIR.join('lib/rouge/cli.rb')
8
+ Signal.trap('PIPE', 'SYSTEM_DEFAULT') if Signal.list.include? 'PIPE'
9
+
10
+ begin
11
+ Rouge::CLI.parse(ARGV).run
12
+ rescue Rouge::CLI::Error => e
13
+ puts e.message
14
+ exit e.status
15
+ rescue Interrupt
16
+ $stderr.puts "\nrouge: interrupted"
17
+ exit 2
18
+ end
@@ -0,0 +1,107 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ # stdlib
5
+ require 'pathname'
6
+
7
+ # The containing module for Rouge
8
+ module Rouge
9
+ # cache value in a constant since `__dir__` allocates a new string
10
+ # on every call.
11
+ LIB_DIR = __dir__.freeze
12
+
13
+ class << self
14
+ def reload!
15
+ Object.send :remove_const, :Rouge
16
+ load __FILE__
17
+ end
18
+
19
+ # Highlight some text with a given lexer and formatter.
20
+ #
21
+ # @example
22
+ # Rouge.highlight('@foo = 1', 'ruby', 'html')
23
+ # Rouge.highlight('var foo = 1;', 'js', 'terminal256')
24
+ #
25
+ # # streaming - chunks become available as they are lexed
26
+ # Rouge.highlight(large_string, 'ruby', 'html') do |chunk|
27
+ # $stdout.print chunk
28
+ # end
29
+ def highlight(text, lexer, formatter, &b)
30
+ lexer = Lexer.find(lexer) unless lexer.respond_to? :lex
31
+ raise "unknown lexer #{lexer}" unless lexer
32
+
33
+ formatter = Formatter.find(formatter) unless formatter.respond_to? :format
34
+ raise "unknown formatter #{formatter}" unless formatter
35
+
36
+ formatter.format(lexer.lex(text), &b)
37
+ end
38
+
39
+ # Load a file relative to the `lib/rouge` path.
40
+ #
41
+ # @api private
42
+ def load_file(path)
43
+ load File.join(LIB_DIR, "rouge/#{path}.rb")
44
+ end
45
+
46
+ # Load the lexers in the `lib/rouge/lexers` directory.
47
+ #
48
+ # @api private
49
+ def load_lexers
50
+ # The trailing slash is necessary to avoid lexers being loaded multiple
51
+ # times by `Lexers.load_lexer`
52
+ lexer_dir = File.join(LIB_DIR, "rouge/lexers/")
53
+ Dir.glob(File.join(lexer_dir, '*.rb')).each do |f|
54
+ Lexers.load_lexer(f.sub(lexer_dir, ''))
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ Rouge.load_file 'version'
61
+ Rouge.load_file 'util'
62
+ Rouge.load_file 'text_analyzer'
63
+ Rouge.load_file 'token'
64
+
65
+ Rouge.load_file 'lexer'
66
+ Rouge.load_file 'regex_lexer'
67
+ Rouge.load_file 'template_lexer'
68
+
69
+ Rouge.load_lexers
70
+
71
+ Rouge.load_file 'guesser'
72
+ Rouge.load_file 'guessers/util'
73
+ Rouge.load_file 'guessers/glob_mapping'
74
+ Rouge.load_file 'guessers/modeline'
75
+ Rouge.load_file 'guessers/filename'
76
+ Rouge.load_file 'guessers/mimetype'
77
+ Rouge.load_file 'guessers/source'
78
+ Rouge.load_file 'guessers/disambiguation'
79
+
80
+ Rouge.load_file 'formatter'
81
+ Rouge.load_file 'formatters/html'
82
+ Rouge.load_file 'formatters/html_table'
83
+ Rouge.load_file 'formatters/html_pygments'
84
+ Rouge.load_file 'formatters/html_legacy'
85
+ Rouge.load_file 'formatters/html_linewise'
86
+ Rouge.load_file 'formatters/html_line_table'
87
+ Rouge.load_file 'formatters/html_inline'
88
+ Rouge.load_file 'formatters/terminal256'
89
+ Rouge.load_file 'formatters/terminal_truecolor'
90
+ Rouge.load_file 'formatters/tex'
91
+ Rouge.load_file 'formatters/null'
92
+
93
+ Rouge.load_file 'theme'
94
+ Rouge.load_file 'tex_theme_renderer'
95
+ Rouge.load_file 'themes/thankful_eyes'
96
+ Rouge.load_file 'themes/colorful'
97
+ Rouge.load_file 'themes/base16'
98
+ Rouge.load_file 'themes/github'
99
+ Rouge.load_file 'themes/igor_pro'
100
+ Rouge.load_file 'themes/monokai'
101
+ Rouge.load_file 'themes/molokai'
102
+ Rouge.load_file 'themes/monokai_sublime'
103
+ Rouge.load_file 'themes/gruvbox'
104
+ Rouge.load_file 'themes/tulip'
105
+ Rouge.load_file 'themes/pastie'
106
+ Rouge.load_file 'themes/bw'
107
+ Rouge.load_file 'themes/magritte'
@@ -0,0 +1,498 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ # not required by the main lib.
5
+ # to use this module, require 'rouge/cli'.
6
+
7
+ require 'rbconfig'
8
+
9
+ module Rouge
10
+ class FileReader
11
+ attr_reader :input
12
+ def initialize(input)
13
+ @input = input
14
+ end
15
+
16
+ def file
17
+ case input
18
+ when '-'
19
+ IO.new($stdin.fileno, 'rt:bom|utf-8')
20
+ when String
21
+ File.new(input, 'rt:bom|utf-8')
22
+ when ->(i){ i.respond_to? :read }
23
+ input
24
+ end
25
+ end
26
+
27
+ def read
28
+ @read ||= begin
29
+ file.read
30
+ rescue => e
31
+ $stderr.puts "unable to open #{input}: #{e.message}"
32
+ exit 1
33
+ ensure
34
+ file.close
35
+ end
36
+ end
37
+ end
38
+
39
+ class CLI
40
+ def self.doc
41
+ return enum_for(:doc) unless block_given?
42
+
43
+ yield %|usage: rougify {global options} [command] [args...]|
44
+ yield %||
45
+ yield %|where <command> is one of:|
46
+ yield %| highlight #{Highlight.desc}|
47
+ yield %| help #{Help.desc}|
48
+ yield %| style #{Style.desc}|
49
+ yield %| list #{List.desc}|
50
+ yield %| guess #{Guess.desc}|
51
+ yield %| version #{Version.desc}|
52
+ yield %||
53
+ yield %|global options:|
54
+ yield %[ --require|-r <fname> require <fname> after loading rouge]
55
+ yield %||
56
+ yield %|See `rougify help <command>` for more info.|
57
+ end
58
+
59
+ class Error < StandardError
60
+ attr_reader :message, :status
61
+ def initialize(message, status=1)
62
+ @message = message
63
+ @status = status
64
+ end
65
+ end
66
+
67
+ def self.parse(argv=ARGV)
68
+ argv = normalize_syntax(argv)
69
+
70
+ while (head = argv.shift)
71
+ case head
72
+ when '-h', '--help', 'help', '-help'
73
+ return Help.parse(argv)
74
+ when '--require', '-r'
75
+ require argv.shift
76
+ else
77
+ break
78
+ end
79
+ end
80
+
81
+ klass = class_from_arg(head)
82
+ return klass.parse(argv) if klass
83
+
84
+ argv.unshift(head) if head
85
+ Highlight.parse(argv)
86
+ end
87
+
88
+ def initialize(options={})
89
+ end
90
+
91
+ def self.error!(msg, status=1)
92
+ raise Error.new(msg, status)
93
+ end
94
+
95
+ def error!(*a)
96
+ self.class.error!(*a)
97
+ end
98
+
99
+ def self.class_from_arg(arg)
100
+ case arg
101
+ when 'version', '--version', '-v'
102
+ Version
103
+ when 'help', nil
104
+ Help
105
+ when 'highlight', 'hi'
106
+ Highlight
107
+ when 'style'
108
+ Style
109
+ when 'list'
110
+ List
111
+ when 'guess'
112
+ Guess
113
+ end
114
+ end
115
+
116
+ class Version < CLI
117
+ def self.desc
118
+ "print the rouge version number"
119
+ end
120
+
121
+ def self.parse(*); new; end
122
+
123
+ def run
124
+ puts Rouge.version
125
+ end
126
+ end
127
+
128
+ class Help < CLI
129
+ def self.desc
130
+ "print help info"
131
+ end
132
+
133
+ def self.doc
134
+ return enum_for(:doc) unless block_given?
135
+
136
+ yield %|usage: rougify help <command>|
137
+ yield %||
138
+ yield %|print help info for <command>.|
139
+ end
140
+
141
+ def self.parse(argv)
142
+ opts = { :mode => CLI }
143
+ until argv.empty?
144
+ arg = argv.shift
145
+ klass = class_from_arg(arg)
146
+ if klass
147
+ opts[:mode] = klass
148
+ next
149
+ end
150
+ end
151
+ new(opts)
152
+ end
153
+
154
+ def initialize(opts={})
155
+ @mode = opts[:mode]
156
+ end
157
+
158
+ def run
159
+ @mode.doc.each(&method(:puts))
160
+ end
161
+ end
162
+
163
+ class Highlight < CLI
164
+ def self.desc
165
+ "highlight code"
166
+ end
167
+
168
+ def self.doc
169
+ return enum_for(:doc) unless block_given?
170
+
171
+ yield %[usage: rougify highlight <filename> [options...]]
172
+ yield %[ rougify highlight [options...]]
173
+ yield %[]
174
+ yield %[--input-file|-i <filename> specify a file to read, or - to use stdin]
175
+ yield %[]
176
+ yield %[--lexer|-l <lexer> specify the lexer to use.]
177
+ yield %[ If not provided, rougify will try to guess]
178
+ yield %[ based on --mimetype, the filename, and the]
179
+ yield %[ file contents.]
180
+ yield %[]
181
+ yield %[--formatter|-f <opts> specify the output formatter to use.]
182
+ yield %[ If not provided, rougify will default to]
183
+ yield %[ terminal256.]
184
+ yield %[]
185
+ yield %[--theme|-t <theme> specify the theme to use for highlighting]
186
+ yield %[ the file. (only applies to some formatters)]
187
+ yield %[]
188
+ yield %[--mimetype|-m <mimetype> specify a mimetype for lexer guessing]
189
+ yield %[]
190
+ yield %[--lexer-opts|-L <opts> specify lexer options in CGI format]
191
+ yield %[ (opt1=val1&opt2=val2)]
192
+ yield %[]
193
+ yield %[--formatter-opts|-F <opts> specify formatter options in CGI format]
194
+ yield %[ (opt1=val1&opt2=val2)]
195
+ yield %[]
196
+ yield %[--require|-r <filename> require a filename or library before]
197
+ yield %[ highlighting]
198
+ yield %[]
199
+ yield %[--escape allow the use of escapes between <! and !>]
200
+ yield %[]
201
+ yield %[--escape-with <l> <r> allow the use of escapes between custom]
202
+ yield %[ delimiters. implies --escape]
203
+ end
204
+
205
+ # There is no consistent way to do this, but this is used elsewhere,
206
+ # and we provide explicit opt-in and opt-out with $COLORTERM
207
+ def self.supports_truecolor?
208
+ return true if %w(24bit truecolor).include?(ENV['COLORTERM'])
209
+ return false if ENV['COLORTERM'] && ENV['COLORTERM'] =~ /256/
210
+
211
+ if RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
212
+ ENV['ConEmuANSI'] == 'ON' && !ENV['ANSICON']
213
+ else
214
+ ENV['TERM'] !~ /(^rxvt)|(-color$)/
215
+ end
216
+ end
217
+
218
+ def self.parse(argv)
219
+ opts = {
220
+ :formatter => supports_truecolor? ? 'terminal-truecolor' : 'terminal256',
221
+ :theme => 'thankful_eyes',
222
+ :css_class => 'codehilite',
223
+ :input_file => '-',
224
+ :lexer_opts => {},
225
+ :formatter_opts => {},
226
+ :requires => [],
227
+ }
228
+
229
+ until argv.empty?
230
+ arg = argv.shift
231
+ case arg
232
+ when '-r', '--require'
233
+ opts[:requires] << argv.shift
234
+ when '--input-file', '-i'
235
+ opts[:input_file] = argv.shift
236
+ when '--mimetype', '-m'
237
+ opts[:mimetype] = argv.shift
238
+ when '--lexer', '-l'
239
+ opts[:lexer] = argv.shift
240
+ when '--formatter-preset', '-f'
241
+ opts[:formatter] = argv.shift
242
+ when '--theme', '-t'
243
+ opts[:theme] = argv.shift
244
+ when '--css-class', '-c'
245
+ opts[:css_class] = argv.shift
246
+ when '--lexer-opts', '-L'
247
+ opts[:lexer_opts] = parse_cgi(argv.shift)
248
+ when '--escape'
249
+ opts[:escape] = ['<!', '!>']
250
+ when '--escape-with'
251
+ opts[:escape] = [argv.shift, argv.shift]
252
+ when /^--/
253
+ error! "unknown option #{arg.inspect}"
254
+ else
255
+ opts[:input_file] = arg
256
+ end
257
+ end
258
+
259
+ new(opts)
260
+ end
261
+
262
+ def input_stream
263
+ @input_stream ||= FileReader.new(@input_file)
264
+ end
265
+
266
+ def input
267
+ @input ||= input_stream.read
268
+ end
269
+
270
+ def lexer_class
271
+ @lexer_class ||= Lexer.guess(
272
+ :filename => @input_file,
273
+ :mimetype => @mimetype,
274
+ :source => input_stream,
275
+ )
276
+ end
277
+
278
+ def raw_lexer
279
+ lexer_class.new(@lexer_opts)
280
+ end
281
+
282
+ def escape_lexer
283
+ Rouge::Lexers::Escape.new(
284
+ start: @escape[0],
285
+ end: @escape[1],
286
+ lang: raw_lexer,
287
+ )
288
+ end
289
+
290
+ def lexer
291
+ @lexer ||= @escape ? escape_lexer : raw_lexer
292
+ end
293
+
294
+ attr_reader :input_file, :lexer_name, :mimetype, :formatter, :escape
295
+
296
+ def initialize(opts={})
297
+ Rouge::Lexer.enable_debug!
298
+
299
+ opts[:requires].each do |r|
300
+ require r
301
+ end
302
+
303
+ @input_file = opts[:input_file]
304
+
305
+ if opts[:lexer]
306
+ @lexer_class = Lexer.find(opts[:lexer]) \
307
+ or error! "unknown lexer #{opts[:lexer].inspect}"
308
+ else
309
+ @lexer_name = opts[:lexer]
310
+ @mimetype = opts[:mimetype]
311
+ end
312
+
313
+ @lexer_opts = opts[:lexer_opts]
314
+
315
+ theme = Theme.find(opts[:theme]).new or error! "unknown theme #{opts[:theme]}"
316
+
317
+ # TODO: document this in --help
318
+ @formatter = case opts[:formatter]
319
+ when 'terminal256' then Formatters::Terminal256.new(theme)
320
+ when 'terminal-truecolor' then Formatters::TerminalTruecolor.new(theme)
321
+ when 'html' then Formatters::HTML.new
322
+ when 'html-pygments' then Formatters::HTMLPygments.new(Formatters::HTML.new, opts[:css_class])
323
+ when 'html-inline' then Formatters::HTMLInline.new(theme)
324
+ when 'html-line-table' then Formatters::HTMLLineTable.new(Formatters::HTML.new)
325
+ when 'html-table' then Formatters::HTMLTable.new(Formatters::HTML.new)
326
+ when 'null', 'raw', 'tokens' then Formatters::Null.new
327
+ when 'tex' then Formatters::Tex.new
328
+ else
329
+ error! "unknown formatter preset #{opts[:formatter]}"
330
+ end
331
+
332
+ @escape = opts[:escape]
333
+ end
334
+
335
+ def run
336
+ Formatter.enable_escape! if @escape
337
+ formatter.format(lexer.lex(input), &method(:print))
338
+ end
339
+
340
+ private_class_method
341
+ def self.parse_cgi(str)
342
+ pairs = CGI.parse(str).map { |k, v| [k.to_sym, v.first] }
343
+ Hash[pairs]
344
+ end
345
+ end
346
+
347
+ class Style < CLI
348
+ def self.desc
349
+ "print CSS styles"
350
+ end
351
+
352
+ def self.doc
353
+ return enum_for(:doc) unless block_given?
354
+
355
+ yield %|usage: rougify style [<theme-name>] [<options>]|
356
+ yield %||
357
+ yield %|Print CSS styles for the given theme. Extra options are|
358
+ yield %|passed to the theme. To select a mode (light/dark) for the|
359
+ yield %|theme, append '.light' or '.dark' to the <theme-name>|
360
+ yield %|respectively. Theme defaults to thankful_eyes.|
361
+ yield %||
362
+ yield %|options:|
363
+ yield %| --scope (default: .highlight) a css selector to scope by|
364
+ yield %| --tex (default: false) render as TeX|
365
+ yield %| --tex-prefix (default: RG) a command prefix for TeX|
366
+ yield %| implies --tex if specified|
367
+ yield %||
368
+ yield %|available themes:|
369
+ yield %| #{Theme.registry.keys.sort.join(', ')}|
370
+ end
371
+
372
+ def self.parse(argv)
373
+ opts = {
374
+ :theme_name => 'thankful_eyes',
375
+ :tex => false,
376
+ :tex_prefix => 'RG'
377
+ }
378
+
379
+ until argv.empty?
380
+ arg = argv.shift
381
+ case arg
382
+ when '--tex'
383
+ opts[:tex] = true
384
+ when '--tex-prefix'
385
+ opts[:tex] = true
386
+ opts[:tex_prefix] = argv.shift
387
+ when /--(\w+)/
388
+ opts[$1.tr('-', '_').to_sym] = argv.shift
389
+ else
390
+ opts[:theme_name] = arg
391
+ end
392
+ end
393
+
394
+ new(opts)
395
+ end
396
+
397
+ def initialize(opts)
398
+ theme_name = opts.delete(:theme_name)
399
+ theme_class = Theme.find(theme_name) \
400
+ or error! "unknown theme: #{theme_name}"
401
+
402
+ @theme = theme_class.new(opts)
403
+ if opts[:tex]
404
+ tex_prefix = opts[:tex_prefix]
405
+ @theme = TexThemeRenderer.new(@theme, prefix: tex_prefix)
406
+ end
407
+ end
408
+
409
+ def run
410
+ @theme.render(&method(:puts))
411
+ end
412
+ end
413
+
414
+ class List < CLI
415
+ def self.desc
416
+ "list available lexers"
417
+ end
418
+
419
+ def self.doc
420
+ return enum_for(:doc) unless block_given?
421
+
422
+ yield %|usage: rouge list|
423
+ yield %||
424
+ yield %|print a list of all available lexers with their descriptions.|
425
+ end
426
+
427
+ def self.parse(argv)
428
+ new
429
+ end
430
+
431
+ def run
432
+ puts "== Available Lexers =="
433
+
434
+ Lexer.all.sort_by(&:tag).each do |lexer|
435
+ desc = String.new("#{lexer.desc}")
436
+ if lexer.aliases.any?
437
+ desc << " [aliases: #{lexer.aliases.join(',')}]"
438
+ end
439
+ puts "%s: %s" % [lexer.tag, desc]
440
+
441
+ lexer.option_docs.keys.sort.each do |option|
442
+ puts " ?#{option}= #{lexer.option_docs[option]}"
443
+ end
444
+
445
+ puts
446
+ end
447
+ end
448
+ end
449
+
450
+ class Guess < CLI
451
+ def self.desc
452
+ "guess the languages of file"
453
+ end
454
+
455
+ def self.parse(args)
456
+ new(input_file: args.shift)
457
+ end
458
+
459
+ attr_reader :input_file, :input_source
460
+
461
+ def initialize(opts)
462
+ @input_file = opts[:input_file] || '-'
463
+ @input_source = FileReader.new(@input_file).read
464
+ end
465
+
466
+ def lexers
467
+ Lexer.guesses(
468
+ filename: input_file,
469
+ source: input_source,
470
+ )
471
+ end
472
+
473
+ def run
474
+ lexers.each do |l|
475
+ puts "{ tag: #{l.tag.inspect}, title: #{l.title.inspect}, desc: #{l.desc.inspect} }"
476
+ end
477
+ end
478
+ end
479
+
480
+
481
+ private_class_method
482
+ def self.normalize_syntax(argv)
483
+ out = []
484
+ argv.each do |arg|
485
+ case arg
486
+ when /^(--\w+)=(.*)$/
487
+ out << $1 << $2
488
+ when /^(-\w)(.+)$/
489
+ out << $1 << $2
490
+ else
491
+ out << arg
492
+ end
493
+ end
494
+
495
+ out
496
+ end
497
+ end
498
+ end