rouge-alda 3.3.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 (335) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +28 -0
  3. data/LICENSE +186 -0
  4. data/bin/rougify +18 -0
  5. data/lib/rouge/cli.rb +432 -0
  6. data/lib/rouge/demos/abap +6 -0
  7. data/lib/rouge/demos/actionscript +4 -0
  8. data/lib/rouge/demos/alda +10 -0
  9. data/lib/rouge/demos/apache +21 -0
  10. data/lib/rouge/demos/apiblueprint +33 -0
  11. data/lib/rouge/demos/applescript +2 -0
  12. data/lib/rouge/demos/awk +4 -0
  13. data/lib/rouge/demos/biml +38 -0
  14. data/lib/rouge/demos/bsl +7 -0
  15. data/lib/rouge/demos/c +8 -0
  16. data/lib/rouge/demos/ceylon +7 -0
  17. data/lib/rouge/demos/cfscript +18 -0
  18. data/lib/rouge/demos/clojure +5 -0
  19. data/lib/rouge/demos/cmake +7 -0
  20. data/lib/rouge/demos/coffeescript +5 -0
  21. data/lib/rouge/demos/common_lisp +1 -0
  22. data/lib/rouge/demos/conf +4 -0
  23. data/lib/rouge/demos/console +6 -0
  24. data/lib/rouge/demos/coq +13 -0
  25. data/lib/rouge/demos/cpp +8 -0
  26. data/lib/rouge/demos/crystal +45 -0
  27. data/lib/rouge/demos/csharp +5 -0
  28. data/lib/rouge/demos/css +4 -0
  29. data/lib/rouge/demos/d +16 -0
  30. data/lib/rouge/demos/dart +6 -0
  31. data/lib/rouge/demos/diff +7 -0
  32. data/lib/rouge/demos/digdag +19 -0
  33. data/lib/rouge/demos/docker +9 -0
  34. data/lib/rouge/demos/dot +5 -0
  35. data/lib/rouge/demos/eiffel +30 -0
  36. data/lib/rouge/demos/elixir +1 -0
  37. data/lib/rouge/demos/elm +4 -0
  38. data/lib/rouge/demos/erb +1 -0
  39. data/lib/rouge/demos/erlang +7 -0
  40. data/lib/rouge/demos/factor +5 -0
  41. data/lib/rouge/demos/fortran +22 -0
  42. data/lib/rouge/demos/fsharp +12 -0
  43. data/lib/rouge/demos/gherkin +17 -0
  44. data/lib/rouge/demos/glsl +14 -0
  45. data/lib/rouge/demos/go +7 -0
  46. data/lib/rouge/demos/gradle +10 -0
  47. data/lib/rouge/demos/graphql +17 -0
  48. data/lib/rouge/demos/groovy +9 -0
  49. data/lib/rouge/demos/hack +5 -0
  50. data/lib/rouge/demos/haml +5 -0
  51. data/lib/rouge/demos/handlebars +7 -0
  52. data/lib/rouge/demos/haskell +6 -0
  53. data/lib/rouge/demos/hcl +7 -0
  54. data/lib/rouge/demos/html +8 -0
  55. data/lib/rouge/demos/http +14 -0
  56. data/lib/rouge/demos/hylang +10 -0
  57. data/lib/rouge/demos/idlang +8 -0
  58. data/lib/rouge/demos/igorpro +9 -0
  59. data/lib/rouge/demos/ini +4 -0
  60. data/lib/rouge/demos/io +11 -0
  61. data/lib/rouge/demos/irb +4 -0
  62. data/lib/rouge/demos/irb_output +2 -0
  63. data/lib/rouge/demos/java +5 -0
  64. data/lib/rouge/demos/javascript +1 -0
  65. data/lib/rouge/demos/jinja +9 -0
  66. data/lib/rouge/demos/json +1 -0
  67. data/lib/rouge/demos/json-doc +1 -0
  68. data/lib/rouge/demos/jsonnet +28 -0
  69. data/lib/rouge/demos/jsp +29 -0
  70. data/lib/rouge/demos/jsx +17 -0
  71. data/lib/rouge/demos/julia +11 -0
  72. data/lib/rouge/demos/kotlin +3 -0
  73. data/lib/rouge/demos/lasso +12 -0
  74. data/lib/rouge/demos/liquid +11 -0
  75. data/lib/rouge/demos/literate_coffeescript +3 -0
  76. data/lib/rouge/demos/literate_haskell +7 -0
  77. data/lib/rouge/demos/llvm +20 -0
  78. data/lib/rouge/demos/lua +12 -0
  79. data/lib/rouge/demos/m68k +16 -0
  80. data/lib/rouge/demos/make +6 -0
  81. data/lib/rouge/demos/markdown +4 -0
  82. data/lib/rouge/demos/mathematica +8 -0
  83. data/lib/rouge/demos/matlab +6 -0
  84. data/lib/rouge/demos/moonscript +16 -0
  85. data/lib/rouge/demos/mosel +10 -0
  86. data/lib/rouge/demos/mxml +22 -0
  87. data/lib/rouge/demos/nasm +26 -0
  88. data/lib/rouge/demos/nginx +5 -0
  89. data/lib/rouge/demos/nim +27 -0
  90. data/lib/rouge/demos/nix +19 -0
  91. data/lib/rouge/demos/objective_c +18 -0
  92. data/lib/rouge/demos/ocaml +12 -0
  93. data/lib/rouge/demos/pascal +14 -0
  94. data/lib/rouge/demos/perl +5 -0
  95. data/lib/rouge/demos/php +3 -0
  96. data/lib/rouge/demos/plaintext +1 -0
  97. data/lib/rouge/demos/plist +142 -0
  98. data/lib/rouge/demos/pony +17 -0
  99. data/lib/rouge/demos/powershell +49 -0
  100. data/lib/rouge/demos/praat +26 -0
  101. data/lib/rouge/demos/prolog +9 -0
  102. data/lib/rouge/demos/prometheus +9 -0
  103. data/lib/rouge/demos/properties +7 -0
  104. data/lib/rouge/demos/protobuf +5 -0
  105. data/lib/rouge/demos/puppet +6 -0
  106. data/lib/rouge/demos/python +6 -0
  107. data/lib/rouge/demos/q +2 -0
  108. data/lib/rouge/demos/qml +9 -0
  109. data/lib/rouge/demos/r +8 -0
  110. data/lib/rouge/demos/racket +24 -0
  111. data/lib/rouge/demos/ruby +9 -0
  112. data/lib/rouge/demos/rust +12 -0
  113. data/lib/rouge/demos/sass +3 -0
  114. data/lib/rouge/demos/scala +3 -0
  115. data/lib/rouge/demos/scheme +4 -0
  116. data/lib/rouge/demos/scss +5 -0
  117. data/lib/rouge/demos/sed +4 -0
  118. data/lib/rouge/demos/shell +2 -0
  119. data/lib/rouge/demos/sieve +10 -0
  120. data/lib/rouge/demos/slim +17 -0
  121. data/lib/rouge/demos/smalltalk +6 -0
  122. data/lib/rouge/demos/smarty +12 -0
  123. data/lib/rouge/demos/sml +4 -0
  124. data/lib/rouge/demos/sqf +14 -0
  125. data/lib/rouge/demos/sql +1 -0
  126. data/lib/rouge/demos/swift +5 -0
  127. data/lib/rouge/demos/tap +5 -0
  128. data/lib/rouge/demos/tcl +1 -0
  129. data/lib/rouge/demos/terraform +31 -0
  130. data/lib/rouge/demos/tex +1 -0
  131. data/lib/rouge/demos/toml +9 -0
  132. data/lib/rouge/demos/tsx +17 -0
  133. data/lib/rouge/demos/tulip +13 -0
  134. data/lib/rouge/demos/turtle +26 -0
  135. data/lib/rouge/demos/twig +9 -0
  136. data/lib/rouge/demos/typescript +1 -0
  137. data/lib/rouge/demos/vala +8 -0
  138. data/lib/rouge/demos/vb +4 -0
  139. data/lib/rouge/demos/verilog +27 -0
  140. data/lib/rouge/demos/vhdl +23 -0
  141. data/lib/rouge/demos/viml +14 -0
  142. data/lib/rouge/demos/vue +11 -0
  143. data/lib/rouge/demos/wollok +11 -0
  144. data/lib/rouge/demos/xml +2 -0
  145. data/lib/rouge/demos/yaml +4 -0
  146. data/lib/rouge/formatter.rb +76 -0
  147. data/lib/rouge/formatters/html.rb +38 -0
  148. data/lib/rouge/formatters/html_inline.rb +31 -0
  149. data/lib/rouge/formatters/html_legacy.rb +45 -0
  150. data/lib/rouge/formatters/html_linewise.rb +28 -0
  151. data/lib/rouge/formatters/html_pygments.rb +18 -0
  152. data/lib/rouge/formatters/html_table.rb +62 -0
  153. data/lib/rouge/formatters/null.rb +20 -0
  154. data/lib/rouge/formatters/terminal256.rb +181 -0
  155. data/lib/rouge/guesser.rb +57 -0
  156. data/lib/rouge/guessers/disambiguation.rb +106 -0
  157. data/lib/rouge/guessers/filename.rb +27 -0
  158. data/lib/rouge/guessers/glob_mapping.rb +45 -0
  159. data/lib/rouge/guessers/mimetype.rb +16 -0
  160. data/lib/rouge/guessers/modeline.rb +46 -0
  161. data/lib/rouge/guessers/source.rb +31 -0
  162. data/lib/rouge/guessers/util.rb +34 -0
  163. data/lib/rouge/lexer.rb +462 -0
  164. data/lib/rouge/lexers/abap.rb +240 -0
  165. data/lib/rouge/lexers/actionscript.rb +196 -0
  166. data/lib/rouge/lexers/alda.rb +43 -0
  167. data/lib/rouge/lexers/apache/keywords.yml +764 -0
  168. data/lib/rouge/lexers/apache.rb +73 -0
  169. data/lib/rouge/lexers/apiblueprint.rb +49 -0
  170. data/lib/rouge/lexers/apple_script.rb +369 -0
  171. data/lib/rouge/lexers/awk.rb +162 -0
  172. data/lib/rouge/lexers/biml.rb +43 -0
  173. data/lib/rouge/lexers/bsl.rb +82 -0
  174. data/lib/rouge/lexers/c.rb +213 -0
  175. data/lib/rouge/lexers/ceylon.rb +124 -0
  176. data/lib/rouge/lexers/cfscript.rb +154 -0
  177. data/lib/rouge/lexers/clojure.rb +113 -0
  178. data/lib/rouge/lexers/cmake.rb +207 -0
  179. data/lib/rouge/lexers/coffeescript.rb +175 -0
  180. data/lib/rouge/lexers/common_lisp.rb +346 -0
  181. data/lib/rouge/lexers/conf.rb +25 -0
  182. data/lib/rouge/lexers/console.rb +137 -0
  183. data/lib/rouge/lexers/coq.rb +188 -0
  184. data/lib/rouge/lexers/cpp.rb +79 -0
  185. data/lib/rouge/lexers/crystal.rb +430 -0
  186. data/lib/rouge/lexers/csharp.rb +115 -0
  187. data/lib/rouge/lexers/css.rb +274 -0
  188. data/lib/rouge/lexers/d.rb +177 -0
  189. data/lib/rouge/lexers/dart.rb +105 -0
  190. data/lib/rouge/lexers/diff.rb +33 -0
  191. data/lib/rouge/lexers/digdag.rb +70 -0
  192. data/lib/rouge/lexers/docker.rb +51 -0
  193. data/lib/rouge/lexers/dot.rb +69 -0
  194. data/lib/rouge/lexers/eiffel.rb +66 -0
  195. data/lib/rouge/lexers/elixir.rb +134 -0
  196. data/lib/rouge/lexers/elm.rb +90 -0
  197. data/lib/rouge/lexers/erb.rb +53 -0
  198. data/lib/rouge/lexers/erlang.rb +115 -0
  199. data/lib/rouge/lexers/factor.rb +303 -0
  200. data/lib/rouge/lexers/fortran.rb +178 -0
  201. data/lib/rouge/lexers/fsharp.rb +119 -0
  202. data/lib/rouge/lexers/gherkin/keywords.rb +16 -0
  203. data/lib/rouge/lexers/gherkin.rb +138 -0
  204. data/lib/rouge/lexers/glsl.rb +136 -0
  205. data/lib/rouge/lexers/go.rb +175 -0
  206. data/lib/rouge/lexers/gradle.rb +38 -0
  207. data/lib/rouge/lexers/graphql.rb +254 -0
  208. data/lib/rouge/lexers/groovy.rb +113 -0
  209. data/lib/rouge/lexers/hack.rb +49 -0
  210. data/lib/rouge/lexers/haml.rb +230 -0
  211. data/lib/rouge/lexers/handlebars.rb +80 -0
  212. data/lib/rouge/lexers/haskell.rb +198 -0
  213. data/lib/rouge/lexers/hcl.rb +163 -0
  214. data/lib/rouge/lexers/html.rb +140 -0
  215. data/lib/rouge/lexers/http.rb +81 -0
  216. data/lib/rouge/lexers/hylang.rb +94 -0
  217. data/lib/rouge/lexers/idlang.rb +312 -0
  218. data/lib/rouge/lexers/igorpro.rb +664 -0
  219. data/lib/rouge/lexers/ini.rb +54 -0
  220. data/lib/rouge/lexers/io.rb +69 -0
  221. data/lib/rouge/lexers/irb.rb +67 -0
  222. data/lib/rouge/lexers/java.rb +88 -0
  223. data/lib/rouge/lexers/javascript.rb +283 -0
  224. data/lib/rouge/lexers/jinja.rb +138 -0
  225. data/lib/rouge/lexers/json.rb +30 -0
  226. data/lib/rouge/lexers/json_doc.rb +24 -0
  227. data/lib/rouge/lexers/jsonnet.rb +152 -0
  228. data/lib/rouge/lexers/jsp.rb +120 -0
  229. data/lib/rouge/lexers/jsx.rb +104 -0
  230. data/lib/rouge/lexers/julia.rb +167 -0
  231. data/lib/rouge/lexers/kotlin.rb +127 -0
  232. data/lib/rouge/lexers/lasso/keywords.yml +446 -0
  233. data/lib/rouge/lexers/lasso.rb +215 -0
  234. data/lib/rouge/lexers/liquid.rb +288 -0
  235. data/lib/rouge/lexers/literate_coffeescript.rb +34 -0
  236. data/lib/rouge/lexers/literate_haskell.rb +37 -0
  237. data/lib/rouge/lexers/llvm.rb +81 -0
  238. data/lib/rouge/lexers/lua/builtins.rb +24 -0
  239. data/lib/rouge/lexers/lua.rb +126 -0
  240. data/lib/rouge/lexers/m68k.rb +144 -0
  241. data/lib/rouge/lexers/make.rb +113 -0
  242. data/lib/rouge/lexers/markdown.rb +155 -0
  243. data/lib/rouge/lexers/mathematica/builtins.rb +13 -0
  244. data/lib/rouge/lexers/mathematica.rb +96 -0
  245. data/lib/rouge/lexers/matlab/builtins.rb +13 -0
  246. data/lib/rouge/lexers/matlab.rb +72 -0
  247. data/lib/rouge/lexers/moonscript.rb +115 -0
  248. data/lib/rouge/lexers/mosel.rb +232 -0
  249. data/lib/rouge/lexers/mxml.rb +69 -0
  250. data/lib/rouge/lexers/nasm.rb +199 -0
  251. data/lib/rouge/lexers/nginx.rb +72 -0
  252. data/lib/rouge/lexers/nim.rb +153 -0
  253. data/lib/rouge/lexers/nix.rb +211 -0
  254. data/lib/rouge/lexers/objective_c.rb +195 -0
  255. data/lib/rouge/lexers/ocaml.rb +101 -0
  256. data/lib/rouge/lexers/pascal.rb +67 -0
  257. data/lib/rouge/lexers/perl.rb +201 -0
  258. data/lib/rouge/lexers/php/builtins.rb +196 -0
  259. data/lib/rouge/lexers/php.rb +194 -0
  260. data/lib/rouge/lexers/plain_text.rb +27 -0
  261. data/lib/rouge/lexers/plist.rb +47 -0
  262. data/lib/rouge/lexers/pony.rb +94 -0
  263. data/lib/rouge/lexers/powershell.rb +679 -0
  264. data/lib/rouge/lexers/praat.rb +351 -0
  265. data/lib/rouge/lexers/prolog.rb +61 -0
  266. data/lib/rouge/lexers/prometheus.rb +123 -0
  267. data/lib/rouge/lexers/properties.rb +52 -0
  268. data/lib/rouge/lexers/protobuf.rb +71 -0
  269. data/lib/rouge/lexers/puppet.rb +129 -0
  270. data/lib/rouge/lexers/python.rb +247 -0
  271. data/lib/rouge/lexers/q.rb +125 -0
  272. data/lib/rouge/lexers/qml.rb +74 -0
  273. data/lib/rouge/lexers/r.rb +90 -0
  274. data/lib/rouge/lexers/racket.rb +545 -0
  275. data/lib/rouge/lexers/ruby.rb +439 -0
  276. data/lib/rouge/lexers/rust.rb +198 -0
  277. data/lib/rouge/lexers/sass/common.rb +181 -0
  278. data/lib/rouge/lexers/sass.rb +75 -0
  279. data/lib/rouge/lexers/scala.rb +143 -0
  280. data/lib/rouge/lexers/scheme.rb +113 -0
  281. data/lib/rouge/lexers/scss.rb +35 -0
  282. data/lib/rouge/lexers/sed.rb +173 -0
  283. data/lib/rouge/lexers/shell.rb +190 -0
  284. data/lib/rouge/lexers/sieve.rb +97 -0
  285. data/lib/rouge/lexers/slim.rb +229 -0
  286. data/lib/rouge/lexers/smalltalk.rb +117 -0
  287. data/lib/rouge/lexers/smarty.rb +81 -0
  288. data/lib/rouge/lexers/sml.rb +345 -0
  289. data/lib/rouge/lexers/sqf/commands.rb +15 -0
  290. data/lib/rouge/lexers/sqf.rb +109 -0
  291. data/lib/rouge/lexers/sql.rb +141 -0
  292. data/lib/rouge/lexers/swift.rb +182 -0
  293. data/lib/rouge/lexers/tap.rb +89 -0
  294. data/lib/rouge/lexers/tcl.rb +193 -0
  295. data/lib/rouge/lexers/terraform.rb +105 -0
  296. data/lib/rouge/lexers/tex.rb +70 -0
  297. data/lib/rouge/lexers/toml.rb +68 -0
  298. data/lib/rouge/lexers/tsx.rb +20 -0
  299. data/lib/rouge/lexers/tulip.rb +108 -0
  300. data/lib/rouge/lexers/turtle.rb +64 -0
  301. data/lib/rouge/lexers/twig.rb +40 -0
  302. data/lib/rouge/lexers/typescript/common.rb +34 -0
  303. data/lib/rouge/lexers/typescript.rb +23 -0
  304. data/lib/rouge/lexers/vala.rb +78 -0
  305. data/lib/rouge/lexers/vb.rb +165 -0
  306. data/lib/rouge/lexers/verilog.rb +165 -0
  307. data/lib/rouge/lexers/vhdl.rb +98 -0
  308. data/lib/rouge/lexers/viml/keywords.rb +14 -0
  309. data/lib/rouge/lexers/viml.rb +102 -0
  310. data/lib/rouge/lexers/vue.rb +124 -0
  311. data/lib/rouge/lexers/wollok.rb +104 -0
  312. data/lib/rouge/lexers/xml.rb +58 -0
  313. data/lib/rouge/lexers/yaml.rb +374 -0
  314. data/lib/rouge/plugins/redcarpet.rb +31 -0
  315. data/lib/rouge/regex_lexer.rb +442 -0
  316. data/lib/rouge/template_lexer.rb +21 -0
  317. data/lib/rouge/text_analyzer.rb +50 -0
  318. data/lib/rouge/theme.rb +214 -0
  319. data/lib/rouge/themes/base16.rb +131 -0
  320. data/lib/rouge/themes/colorful.rb +68 -0
  321. data/lib/rouge/themes/github.rb +72 -0
  322. data/lib/rouge/themes/gruvbox.rb +168 -0
  323. data/lib/rouge/themes/igor_pro.rb +21 -0
  324. data/lib/rouge/themes/molokai.rb +83 -0
  325. data/lib/rouge/themes/monokai.rb +93 -0
  326. data/lib/rouge/themes/monokai_sublime.rb +92 -0
  327. data/lib/rouge/themes/pastie.rb +70 -0
  328. data/lib/rouge/themes/thankful_eyes.rb +75 -0
  329. data/lib/rouge/themes/tulip.rb +70 -0
  330. data/lib/rouge/token.rb +183 -0
  331. data/lib/rouge/util.rb +102 -0
  332. data/lib/rouge/version.rb +8 -0
  333. data/lib/rouge.rb +84 -0
  334. data/rouge.gemspec +25 -0
  335. metadata +384 -0
@@ -0,0 +1,45 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ # stdlib
5
+ require 'cgi'
6
+
7
+ module Rouge
8
+ module Formatters
9
+ # Transforms a token stream into HTML output.
10
+ class HTMLLegacy < Formatter
11
+ tag 'html_legacy'
12
+
13
+ # @option opts [String] :css_class ('highlight')
14
+ # @option opts [true/false] :line_numbers (false)
15
+ # @option opts [Rouge::CSSTheme] :inline_theme (nil)
16
+ # @option opts [true/false] :wrap (true)
17
+ #
18
+ # Initialize with options.
19
+ #
20
+ # If `:inline_theme` is given, then instead of rendering the
21
+ # tokens as <span> tags with CSS classes, the styles according to
22
+ # the given theme will be inlined in "style" attributes. This is
23
+ # useful for formats in which stylesheets are not available.
24
+ #
25
+ # Content will be wrapped in a tag (`div` if tableized, `pre` if
26
+ # not) with the given `:css_class` unless `:wrap` is set to `false`.
27
+ def initialize(opts={})
28
+ @formatter = opts[:inline_theme] ? HTMLInline.new(opts[:inline_theme])
29
+ : HTML.new
30
+
31
+
32
+ @formatter = HTMLTable.new(@formatter, opts) if opts[:line_numbers]
33
+
34
+ if opts.fetch(:wrap, true)
35
+ @formatter = HTMLPygments.new(@formatter, opts.fetch(:css_class, 'codehilite'))
36
+ end
37
+ end
38
+
39
+ # @yield the html output.
40
+ def stream(tokens, &b)
41
+ @formatter.stream(tokens, &b)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Formatters
6
+ class HTMLLinewise < Formatter
7
+ def initialize(formatter, opts={})
8
+ @formatter = formatter
9
+ @class_format = opts.fetch(:class, 'line-%i')
10
+ end
11
+
12
+ def stream(tokens, &b)
13
+ token_lines(tokens) do |line|
14
+ yield "<div class=#{next_line_class}>"
15
+ line.each do |tok, val|
16
+ yield @formatter.span(tok, val)
17
+ end
18
+ yield '</div>'
19
+ end
20
+ end
21
+
22
+ def next_line_class
23
+ @lineno ||= 0
24
+ sprintf(@class_format, @lineno += 1).inspect
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rouge
4
+ module Formatters
5
+ class HTMLPygments < Formatter
6
+ def initialize(inner, css_class='codehilite')
7
+ @inner = inner
8
+ @css_class = css_class
9
+ end
10
+
11
+ def stream(tokens, &b)
12
+ yield %(<div class="highlight"><pre class="#{@css_class}"><code>)
13
+ @inner.stream(tokens, &b)
14
+ yield "</code></pre></div>"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,62 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Formatters
6
+ class HTMLTable < Formatter
7
+ tag 'html_table'
8
+
9
+ def initialize(inner, opts={})
10
+ @inner = inner
11
+ @start_line = opts.fetch(:start_line, 1)
12
+ @line_format = opts.fetch(:line_format, '%i')
13
+ @table_class = opts.fetch(:table_class, 'rouge-table')
14
+ @gutter_class = opts.fetch(:gutter_class, 'rouge-gutter')
15
+ @code_class = opts.fetch(:code_class, 'rouge-code')
16
+ end
17
+
18
+ def style(scope)
19
+ yield "#{scope} .rouge-table { border-spacing: 0 }"
20
+ yield "#{scope} .rouge-gutter { text-align: right }"
21
+ end
22
+
23
+ def stream(tokens, &b)
24
+ num_lines = 0
25
+ last_val = ''
26
+ formatted = String.new('')
27
+
28
+ tokens.each do |tok, val|
29
+ last_val = val
30
+ num_lines += val.scan(/\n/).size
31
+ formatted << @inner.span(tok, val)
32
+ end
33
+
34
+ # add an extra line for non-newline-terminated strings
35
+ if last_val[-1] != "\n"
36
+ num_lines += 1
37
+ @inner.span(Token::Tokens::Text::Whitespace, "\n") { |str| formatted << str }
38
+ end
39
+
40
+ # generate a string of newline-separated line numbers for the gutter>
41
+ formatted_line_numbers = (@start_line..num_lines+@start_line-1).map do |i|
42
+ sprintf("#{@line_format}", i) << "\n"
43
+ end.join('')
44
+
45
+ numbers = %(<pre class="lineno">#{formatted_line_numbers}</pre>)
46
+
47
+ yield %(<table class="#@table_class"><tbody><tr>)
48
+
49
+ # the "gl" class applies the style for Generic.Lineno
50
+ yield %(<td class="#@gutter_class gl">)
51
+ yield numbers
52
+ yield '</td>'
53
+
54
+ yield %(<td class="#@code_class"><pre>)
55
+ yield formatted
56
+ yield '</pre></td>'
57
+
58
+ yield "</tr></tbody></table>"
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,20 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Formatters
6
+ # A formatter which renders nothing.
7
+ class Null < Formatter
8
+ tag 'null'
9
+
10
+ def initialize(*)
11
+ end
12
+
13
+ def stream(tokens, &b)
14
+ tokens.each do |tok, val|
15
+ yield "#{tok.qualname} #{val.inspect}\n"
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,181 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Formatters
6
+ # A formatter for 256-color terminals
7
+ class Terminal256 < Formatter
8
+ tag 'terminal256'
9
+
10
+ # @private
11
+ attr_reader :theme
12
+
13
+ # @param [Hash,Rouge::Theme] theme
14
+ # the theme to render with.
15
+ def initialize(theme = Themes::ThankfulEyes.new)
16
+ if theme.is_a?(Rouge::Theme)
17
+ @theme = theme
18
+ elsif theme.is_a?(Hash)
19
+ @theme = theme[:theme] || Themes::ThankfulEyes.new
20
+ else
21
+ raise ArgumentError, "invalid theme: #{theme.inspect}"
22
+ end
23
+ end
24
+
25
+ def stream(tokens, &b)
26
+ tokens.each do |tok, val|
27
+ escape = escape_sequence(tok)
28
+ yield escape.style_string
29
+ yield val.gsub("\n", "#{escape.reset_string}\n#{escape.style_string}")
30
+ yield escape.reset_string
31
+ end
32
+ end
33
+
34
+ class EscapeSequence
35
+ attr_reader :style
36
+ def initialize(style)
37
+ @style = style
38
+ end
39
+
40
+ def self.xterm_colors
41
+ @xterm_colors ||= [].tap do |out|
42
+ # colors 0..15: 16 basic colors
43
+ out << [0x00, 0x00, 0x00] # 0
44
+ out << [0xcd, 0x00, 0x00] # 1
45
+ out << [0x00, 0xcd, 0x00] # 2
46
+ out << [0xcd, 0xcd, 0x00] # 3
47
+ out << [0x00, 0x00, 0xee] # 4
48
+ out << [0xcd, 0x00, 0xcd] # 5
49
+ out << [0x00, 0xcd, 0xcd] # 6
50
+ out << [0xe5, 0xe5, 0xe5] # 7
51
+ out << [0x7f, 0x7f, 0x7f] # 8
52
+ out << [0xff, 0x00, 0x00] # 9
53
+ out << [0x00, 0xff, 0x00] # 10
54
+ out << [0xff, 0xff, 0x00] # 11
55
+ out << [0x5c, 0x5c, 0xff] # 12
56
+ out << [0xff, 0x00, 0xff] # 13
57
+ out << [0x00, 0xff, 0xff] # 14
58
+ out << [0xff, 0xff, 0xff] # 15
59
+
60
+ # colors 16..232: the 6x6x6 color cube
61
+ valuerange = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]
62
+
63
+ 217.times do |i|
64
+ r = valuerange[(i / 36) % 6]
65
+ g = valuerange[(i / 6) % 6]
66
+ b = valuerange[i % 6]
67
+ out << [r, g, b]
68
+ end
69
+
70
+ # colors 233..253: grayscale
71
+ 1.upto 22 do |i|
72
+ v = 8 + i * 10
73
+ out << [v, v, v]
74
+ end
75
+ end
76
+ end
77
+
78
+ def fg
79
+ return @fg if instance_variable_defined? :@fg
80
+ @fg = style.fg && self.class.color_index(style.fg)
81
+ end
82
+
83
+ def bg
84
+ return @bg if instance_variable_defined? :@bg
85
+ @bg = style.bg && self.class.color_index(style.bg)
86
+ end
87
+
88
+ def style_string
89
+ @style_string ||= begin
90
+ attrs = []
91
+
92
+ attrs << ['38', '5', fg.to_s] if fg
93
+ attrs << ['48', '5', bg.to_s] if bg
94
+ attrs << '01' if style[:bold]
95
+ attrs << '04' if style[:italic] # underline, but hey, whatevs
96
+ escape(attrs)
97
+ end
98
+ end
99
+
100
+ def reset_string
101
+ @reset_string ||= begin
102
+ attrs = []
103
+ attrs << '39' if fg # fg reset
104
+ attrs << '49' if bg # bg reset
105
+ attrs << '00' if style[:bold] || style[:italic]
106
+
107
+ escape(attrs)
108
+ end
109
+ end
110
+
111
+ private
112
+ def escape(attrs)
113
+ return '' if attrs.empty?
114
+ "\e[#{attrs.join(';')}m"
115
+ end
116
+
117
+ def self.color_index(color)
118
+ @color_index_cache ||= {}
119
+ @color_index_cache[color] ||= closest_color(*get_rgb(color))
120
+ end
121
+
122
+ def self.get_rgb(color)
123
+ color = $1 if color =~ /#([0-9a-f]+)/i
124
+ hexes = case color.size
125
+ when 3
126
+ color.chars.map { |c| "#{c}#{c}" }
127
+ when 6
128
+ color.scan(/../)
129
+ else
130
+ raise "invalid color: #{color}"
131
+ end
132
+
133
+ hexes.map { |h| h.to_i(16) }
134
+ end
135
+
136
+ # max distance between two colors, #000000 to #ffffff
137
+ MAX_DISTANCE = 257 * 257 * 3
138
+
139
+ def self.closest_color(r, g, b)
140
+ @@colors_cache ||= {}
141
+ key = (r << 16) + (g << 8) + b
142
+ @@colors_cache.fetch(key) do
143
+ distance = MAX_DISTANCE
144
+
145
+ match = 0
146
+
147
+ xterm_colors.each_with_index do |(cr, cg, cb), i|
148
+ d = (r - cr)**2 + (g - cg)**2 + (b - cb)**2
149
+ next if d >= distance
150
+
151
+ match = i
152
+ distance = d
153
+ end
154
+
155
+ match
156
+ end
157
+ end
158
+ end
159
+
160
+ # private
161
+ def escape_sequence(token)
162
+ @escape_sequences ||= {}
163
+ @escape_sequences[token.qualname] ||=
164
+ EscapeSequence.new(get_style(token))
165
+ end
166
+
167
+ def get_style(token)
168
+ return text_style if token.ancestors.include? Token::Tokens::Text
169
+
170
+ theme.get_own_style(token) || text_style
171
+ end
172
+
173
+ def text_style
174
+ style = theme.get_style(Token['Text'])
175
+ # don't highlight text backgrounds
176
+ style.delete :bg
177
+ style
178
+ end
179
+ end
180
+ end
181
+ 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,106 @@
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
+
79
+ C
80
+ end
81
+
82
+ disambiguate '*.m' do
83
+ next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
84
+ next ObjectiveC if contains?('@"')
85
+
86
+ next Mathematica if contains?('(*')
87
+ next Mathematica if contains?(':=')
88
+
89
+ next Matlab if matches?(/^\s*?%/)
90
+ end
91
+
92
+ disambiguate '*.php' do
93
+ # PHP always takes precedence over Hack
94
+ PHP
95
+ end
96
+
97
+ disambiguate '*.hh' do
98
+ next Cpp if matches?(/^\s*#include/)
99
+ next Hack if matches?(/^<\?hh/)
100
+ next Hack if matches?(/(\(|, ?)\$\$/)
101
+
102
+ Cpp
103
+ end
104
+ end
105
+ end
106
+ 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
+ score = (@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
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rouge
4
+ module Guessers
5
+ class Source < Guesser
6
+ include Util
7
+
8
+ attr_reader :source
9
+ def initialize(source)
10
+ @source = source
11
+ end
12
+
13
+ def filter(lexers)
14
+ # don't bother reading the input if
15
+ # we've already filtered to 1
16
+ return lexers if lexers.size == 1
17
+
18
+ source_text = get_source(@source)
19
+
20
+ Lexer.assert_utf8!(source_text)
21
+
22
+ source_text = TextAnalyzer.new(source_text)
23
+
24
+ collect_best(lexers) do |lexer|
25
+ next unless lexer.methods(false).include? :detect?
26
+ lexer.detect?(source_text) ? 1 : nil
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end