rougegal 2.1.2

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