rouge_ecl 0.0.1

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 (319) 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.rb +82 -0
  6. data/lib/rouge/cli.rb +429 -0
  7. data/lib/rouge/demos/abap +6 -0
  8. data/lib/rouge/demos/actionscript +4 -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/csharp +5 -0
  27. data/lib/rouge/demos/css +4 -0
  28. data/lib/rouge/demos/d +16 -0
  29. data/lib/rouge/demos/dart +6 -0
  30. data/lib/rouge/demos/diff +7 -0
  31. data/lib/rouge/demos/digdag +19 -0
  32. data/lib/rouge/demos/docker +9 -0
  33. data/lib/rouge/demos/dot +5 -0
  34. data/lib/rouge/demos/ecl +1 -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/html +8 -0
  54. data/lib/rouge/demos/http +14 -0
  55. data/lib/rouge/demos/hylang +10 -0
  56. data/lib/rouge/demos/idlang +8 -0
  57. data/lib/rouge/demos/igorpro +9 -0
  58. data/lib/rouge/demos/ini +4 -0
  59. data/lib/rouge/demos/io +11 -0
  60. data/lib/rouge/demos/irb +4 -0
  61. data/lib/rouge/demos/irb_output +2 -0
  62. data/lib/rouge/demos/java +5 -0
  63. data/lib/rouge/demos/javascript +1 -0
  64. data/lib/rouge/demos/jinja +9 -0
  65. data/lib/rouge/demos/json +1 -0
  66. data/lib/rouge/demos/json-doc +1 -0
  67. data/lib/rouge/demos/jsonnet +28 -0
  68. data/lib/rouge/demos/jsx +17 -0
  69. data/lib/rouge/demos/julia +11 -0
  70. data/lib/rouge/demos/kotlin +3 -0
  71. data/lib/rouge/demos/lasso +12 -0
  72. data/lib/rouge/demos/liquid +11 -0
  73. data/lib/rouge/demos/literate_coffeescript +3 -0
  74. data/lib/rouge/demos/literate_haskell +7 -0
  75. data/lib/rouge/demos/llvm +20 -0
  76. data/lib/rouge/demos/lua +12 -0
  77. data/lib/rouge/demos/make +6 -0
  78. data/lib/rouge/demos/markdown +4 -0
  79. data/lib/rouge/demos/matlab +6 -0
  80. data/lib/rouge/demos/moonscript +16 -0
  81. data/lib/rouge/demos/mosel +10 -0
  82. data/lib/rouge/demos/mxml +22 -0
  83. data/lib/rouge/demos/nasm +26 -0
  84. data/lib/rouge/demos/nginx +5 -0
  85. data/lib/rouge/demos/nim +27 -0
  86. data/lib/rouge/demos/nix +19 -0
  87. data/lib/rouge/demos/objective_c +18 -0
  88. data/lib/rouge/demos/ocaml +12 -0
  89. data/lib/rouge/demos/pascal +14 -0
  90. data/lib/rouge/demos/perl +5 -0
  91. data/lib/rouge/demos/php +3 -0
  92. data/lib/rouge/demos/plaintext +1 -0
  93. data/lib/rouge/demos/plist +142 -0
  94. data/lib/rouge/demos/pony +17 -0
  95. data/lib/rouge/demos/powershell +49 -0
  96. data/lib/rouge/demos/praat +26 -0
  97. data/lib/rouge/demos/prolog +9 -0
  98. data/lib/rouge/demos/prometheus +9 -0
  99. data/lib/rouge/demos/properties +7 -0
  100. data/lib/rouge/demos/protobuf +5 -0
  101. data/lib/rouge/demos/puppet +6 -0
  102. data/lib/rouge/demos/python +6 -0
  103. data/lib/rouge/demos/q +2 -0
  104. data/lib/rouge/demos/qml +9 -0
  105. data/lib/rouge/demos/r +8 -0
  106. data/lib/rouge/demos/racket +24 -0
  107. data/lib/rouge/demos/ruby +9 -0
  108. data/lib/rouge/demos/rust +12 -0
  109. data/lib/rouge/demos/sass +3 -0
  110. data/lib/rouge/demos/scala +3 -0
  111. data/lib/rouge/demos/scheme +4 -0
  112. data/lib/rouge/demos/scss +5 -0
  113. data/lib/rouge/demos/sed +4 -0
  114. data/lib/rouge/demos/shell +2 -0
  115. data/lib/rouge/demos/sieve +10 -0
  116. data/lib/rouge/demos/slim +17 -0
  117. data/lib/rouge/demos/smalltalk +6 -0
  118. data/lib/rouge/demos/smarty +12 -0
  119. data/lib/rouge/demos/sml +4 -0
  120. data/lib/rouge/demos/sql +1 -0
  121. data/lib/rouge/demos/swift +5 -0
  122. data/lib/rouge/demos/tap +5 -0
  123. data/lib/rouge/demos/tcl +1 -0
  124. data/lib/rouge/demos/tex +1 -0
  125. data/lib/rouge/demos/toml +9 -0
  126. data/lib/rouge/demos/tsx +17 -0
  127. data/lib/rouge/demos/tulip +13 -0
  128. data/lib/rouge/demos/turtle +26 -0
  129. data/lib/rouge/demos/twig +9 -0
  130. data/lib/rouge/demos/typescript +1 -0
  131. data/lib/rouge/demos/vala +8 -0
  132. data/lib/rouge/demos/vb +4 -0
  133. data/lib/rouge/demos/verilog +27 -0
  134. data/lib/rouge/demos/vhdl +23 -0
  135. data/lib/rouge/demos/viml +14 -0
  136. data/lib/rouge/demos/vue +11 -0
  137. data/lib/rouge/demos/wollok +11 -0
  138. data/lib/rouge/demos/xml +2 -0
  139. data/lib/rouge/demos/yaml +4 -0
  140. data/lib/rouge/formatter.rb +75 -0
  141. data/lib/rouge/formatters/html.rb +37 -0
  142. data/lib/rouge/formatters/html_inline.rb +30 -0
  143. data/lib/rouge/formatters/html_legacy.rb +44 -0
  144. data/lib/rouge/formatters/html_linewise.rb +27 -0
  145. data/lib/rouge/formatters/html_pygments.rb +16 -0
  146. data/lib/rouge/formatters/html_table.rb +61 -0
  147. data/lib/rouge/formatters/null.rb +19 -0
  148. data/lib/rouge/formatters/terminal256.rb +180 -0
  149. data/lib/rouge/guesser.rb +55 -0
  150. data/lib/rouge/guessers/disambiguation.rb +101 -0
  151. data/lib/rouge/guessers/filename.rb +25 -0
  152. data/lib/rouge/guessers/glob_mapping.rb +43 -0
  153. data/lib/rouge/guessers/mimetype.rb +14 -0
  154. data/lib/rouge/guessers/modeline.rb +44 -0
  155. data/lib/rouge/guessers/source.rb +29 -0
  156. data/lib/rouge/guessers/util.rb +32 -0
  157. data/lib/rouge/lexer.rb +461 -0
  158. data/lib/rouge/lexers/abap.rb +238 -0
  159. data/lib/rouge/lexers/actionscript.rb +195 -0
  160. data/lib/rouge/lexers/apache.rb +71 -0
  161. data/lib/rouge/lexers/apache/keywords.yml +764 -0
  162. data/lib/rouge/lexers/apiblueprint.rb +47 -0
  163. data/lib/rouge/lexers/apple_script.rb +367 -0
  164. data/lib/rouge/lexers/awk.rb +161 -0
  165. data/lib/rouge/lexers/biml.rb +41 -0
  166. data/lib/rouge/lexers/bsl.rb +81 -0
  167. data/lib/rouge/lexers/c.rb +212 -0
  168. data/lib/rouge/lexers/ceylon.rb +123 -0
  169. data/lib/rouge/lexers/cfscript.rb +153 -0
  170. data/lib/rouge/lexers/clojure.rb +112 -0
  171. data/lib/rouge/lexers/cmake.rb +206 -0
  172. data/lib/rouge/lexers/coffeescript.rb +174 -0
  173. data/lib/rouge/lexers/common_lisp.rb +345 -0
  174. data/lib/rouge/lexers/conf.rb +24 -0
  175. data/lib/rouge/lexers/console.rb +136 -0
  176. data/lib/rouge/lexers/coq.rb +187 -0
  177. data/lib/rouge/lexers/cpp.rb +78 -0
  178. data/lib/rouge/lexers/csharp.rb +114 -0
  179. data/lib/rouge/lexers/css.rb +273 -0
  180. data/lib/rouge/lexers/d.rb +176 -0
  181. data/lib/rouge/lexers/dart.rb +104 -0
  182. data/lib/rouge/lexers/diff.rb +31 -0
  183. data/lib/rouge/lexers/digdag.rb +68 -0
  184. data/lib/rouge/lexers/docker.rb +50 -0
  185. data/lib/rouge/lexers/dot.rb +68 -0
  186. data/lib/rouge/lexers/ecl.rb +138 -0
  187. data/lib/rouge/lexers/eiffel.rb +65 -0
  188. data/lib/rouge/lexers/elixir.rb +133 -0
  189. data/lib/rouge/lexers/elm.rb +89 -0
  190. data/lib/rouge/lexers/erb.rb +52 -0
  191. data/lib/rouge/lexers/erlang.rb +114 -0
  192. data/lib/rouge/lexers/factor.rb +302 -0
  193. data/lib/rouge/lexers/fortran.rb +176 -0
  194. data/lib/rouge/lexers/fsharp.rb +118 -0
  195. data/lib/rouge/lexers/gherkin.rb +137 -0
  196. data/lib/rouge/lexers/gherkin/keywords.rb +14 -0
  197. data/lib/rouge/lexers/glsl.rb +135 -0
  198. data/lib/rouge/lexers/go.rb +174 -0
  199. data/lib/rouge/lexers/gradle.rb +37 -0
  200. data/lib/rouge/lexers/graphql.rb +243 -0
  201. data/lib/rouge/lexers/groovy.rb +112 -0
  202. data/lib/rouge/lexers/hack.rb +48 -0
  203. data/lib/rouge/lexers/haml.rb +229 -0
  204. data/lib/rouge/lexers/handlebars.rb +79 -0
  205. data/lib/rouge/lexers/haskell.rb +182 -0
  206. data/lib/rouge/lexers/html.rb +139 -0
  207. data/lib/rouge/lexers/http.rb +80 -0
  208. data/lib/rouge/lexers/hylang.rb +93 -0
  209. data/lib/rouge/lexers/idlang.rb +310 -0
  210. data/lib/rouge/lexers/igorpro.rb +408 -0
  211. data/lib/rouge/lexers/ini.rb +53 -0
  212. data/lib/rouge/lexers/io.rb +68 -0
  213. data/lib/rouge/lexers/irb.rb +66 -0
  214. data/lib/rouge/lexers/java.rb +87 -0
  215. data/lib/rouge/lexers/javascript.rb +281 -0
  216. data/lib/rouge/lexers/jinja.rb +137 -0
  217. data/lib/rouge/lexers/json.rb +29 -0
  218. data/lib/rouge/lexers/json_doc.rb +23 -0
  219. data/lib/rouge/lexers/jsonnet.rb +151 -0
  220. data/lib/rouge/lexers/jsx.rb +102 -0
  221. data/lib/rouge/lexers/julia.rb +172 -0
  222. data/lib/rouge/lexers/kotlin.rb +79 -0
  223. data/lib/rouge/lexers/lasso.rb +214 -0
  224. data/lib/rouge/lexers/lasso/keywords.yml +446 -0
  225. data/lib/rouge/lexers/liquid.rb +287 -0
  226. data/lib/rouge/lexers/literate_coffeescript.rb +33 -0
  227. data/lib/rouge/lexers/literate_haskell.rb +36 -0
  228. data/lib/rouge/lexers/llvm.rb +80 -0
  229. data/lib/rouge/lexers/lua.rb +125 -0
  230. data/lib/rouge/lexers/lua/builtins.rb +22 -0
  231. data/lib/rouge/lexers/make.rb +112 -0
  232. data/lib/rouge/lexers/markdown.rb +154 -0
  233. data/lib/rouge/lexers/matlab.rb +71 -0
  234. data/lib/rouge/lexers/matlab/builtins.rb +11 -0
  235. data/lib/rouge/lexers/moonscript.rb +114 -0
  236. data/lib/rouge/lexers/mosel.rb +231 -0
  237. data/lib/rouge/lexers/mxml.rb +68 -0
  238. data/lib/rouge/lexers/nasm.rb +198 -0
  239. data/lib/rouge/lexers/nginx.rb +71 -0
  240. data/lib/rouge/lexers/nim.rb +152 -0
  241. data/lib/rouge/lexers/nix.rb +205 -0
  242. data/lib/rouge/lexers/objective_c.rb +194 -0
  243. data/lib/rouge/lexers/ocaml.rb +100 -0
  244. data/lib/rouge/lexers/pascal.rb +66 -0
  245. data/lib/rouge/lexers/perl.rb +196 -0
  246. data/lib/rouge/lexers/php.rb +193 -0
  247. data/lib/rouge/lexers/php/builtins.rb +194 -0
  248. data/lib/rouge/lexers/plain_text.rb +26 -0
  249. data/lib/rouge/lexers/plist.rb +45 -0
  250. data/lib/rouge/lexers/pony.rb +93 -0
  251. data/lib/rouge/lexers/powershell.rb +678 -0
  252. data/lib/rouge/lexers/praat.rb +350 -0
  253. data/lib/rouge/lexers/prolog.rb +59 -0
  254. data/lib/rouge/lexers/prometheus.rb +121 -0
  255. data/lib/rouge/lexers/properties.rb +51 -0
  256. data/lib/rouge/lexers/protobuf.rb +70 -0
  257. data/lib/rouge/lexers/puppet.rb +128 -0
  258. data/lib/rouge/lexers/python.rb +232 -0
  259. data/lib/rouge/lexers/q.rb +123 -0
  260. data/lib/rouge/lexers/qml.rb +73 -0
  261. data/lib/rouge/lexers/r.rb +89 -0
  262. data/lib/rouge/lexers/racket.rb +543 -0
  263. data/lib/rouge/lexers/ruby.rb +437 -0
  264. data/lib/rouge/lexers/rust.rb +192 -0
  265. data/lib/rouge/lexers/sass.rb +74 -0
  266. data/lib/rouge/lexers/sass/common.rb +180 -0
  267. data/lib/rouge/lexers/scala.rb +142 -0
  268. data/lib/rouge/lexers/scheme.rb +112 -0
  269. data/lib/rouge/lexers/scss.rb +34 -0
  270. data/lib/rouge/lexers/sed.rb +172 -0
  271. data/lib/rouge/lexers/shell.rb +189 -0
  272. data/lib/rouge/lexers/sieve.rb +96 -0
  273. data/lib/rouge/lexers/slim.rb +228 -0
  274. data/lib/rouge/lexers/smalltalk.rb +116 -0
  275. data/lib/rouge/lexers/smarty.rb +80 -0
  276. data/lib/rouge/lexers/sml.rb +344 -0
  277. data/lib/rouge/lexers/sql.rb +140 -0
  278. data/lib/rouge/lexers/swift.rb +181 -0
  279. data/lib/rouge/lexers/tap.rb +87 -0
  280. data/lib/rouge/lexers/tcl.rb +192 -0
  281. data/lib/rouge/lexers/tex.rb +69 -0
  282. data/lib/rouge/lexers/toml.rb +67 -0
  283. data/lib/rouge/lexers/tsx.rb +19 -0
  284. data/lib/rouge/lexers/tulip.rb +106 -0
  285. data/lib/rouge/lexers/turtle.rb +63 -0
  286. data/lib/rouge/lexers/twig.rb +39 -0
  287. data/lib/rouge/lexers/typescript.rb +22 -0
  288. data/lib/rouge/lexers/typescript/common.rb +33 -0
  289. data/lib/rouge/lexers/vala.rb +77 -0
  290. data/lib/rouge/lexers/vb.rb +164 -0
  291. data/lib/rouge/lexers/verilog.rb +164 -0
  292. data/lib/rouge/lexers/vhdl.rb +97 -0
  293. data/lib/rouge/lexers/viml.rb +101 -0
  294. data/lib/rouge/lexers/viml/keywords.rb +12 -0
  295. data/lib/rouge/lexers/vue.rb +122 -0
  296. data/lib/rouge/lexers/wollok.rb +103 -0
  297. data/lib/rouge/lexers/xml.rb +57 -0
  298. data/lib/rouge/lexers/yaml.rb +373 -0
  299. data/lib/rouge/plugins/redcarpet.rb +30 -0
  300. data/lib/rouge/regex_lexer.rb +441 -0
  301. data/lib/rouge/template_lexer.rb +20 -0
  302. data/lib/rouge/text_analyzer.rb +49 -0
  303. data/lib/rouge/theme.rb +213 -0
  304. data/lib/rouge/themes/base16.rb +130 -0
  305. data/lib/rouge/themes/colorful.rb +67 -0
  306. data/lib/rouge/themes/github.rb +71 -0
  307. data/lib/rouge/themes/gruvbox.rb +167 -0
  308. data/lib/rouge/themes/igor_pro.rb +20 -0
  309. data/lib/rouge/themes/molokai.rb +82 -0
  310. data/lib/rouge/themes/monokai.rb +92 -0
  311. data/lib/rouge/themes/monokai_sublime.rb +90 -0
  312. data/lib/rouge/themes/pastie.rb +69 -0
  313. data/lib/rouge/themes/thankful_eyes.rb +74 -0
  314. data/lib/rouge/themes/tulip.rb +69 -0
  315. data/lib/rouge/token.rb +182 -0
  316. data/lib/rouge/util.rb +101 -0
  317. data/lib/rouge/version.rb +7 -0
  318. data/rouge.gemspec +23 -0
  319. metadata +365 -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.qualname} #{val.inspect}\n"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,180 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Formatters
5
+ # A formatter for 256-color terminals
6
+ class Terminal256 < Formatter
7
+ tag 'terminal256'
8
+
9
+ # @private
10
+ attr_reader :theme
11
+
12
+ # @param [Hash,Rouge::Theme] theme
13
+ # the theme to render with.
14
+ def initialize(theme = Themes::ThankfulEyes.new)
15
+ if theme.is_a?(Rouge::Theme)
16
+ @theme = theme
17
+ elsif theme.is_a?(Hash)
18
+ @theme = theme[:theme] || Themes::ThankfulEyes.new
19
+ else
20
+ raise ArgumentError, "invalid theme: #{theme.inspect}"
21
+ end
22
+ end
23
+
24
+ def stream(tokens, &b)
25
+ tokens.each do |tok, val|
26
+ escape = escape_sequence(tok)
27
+ yield escape.style_string
28
+ yield val.gsub("\n", "#{escape.reset_string}\n#{escape.style_string}")
29
+ yield escape.reset_string
30
+ end
31
+ end
32
+
33
+ class EscapeSequence
34
+ attr_reader :style
35
+ def initialize(style)
36
+ @style = style
37
+ end
38
+
39
+ def self.xterm_colors
40
+ @xterm_colors ||= [].tap do |out|
41
+ # colors 0..15: 16 basic colors
42
+ out << [0x00, 0x00, 0x00] # 0
43
+ out << [0xcd, 0x00, 0x00] # 1
44
+ out << [0x00, 0xcd, 0x00] # 2
45
+ out << [0xcd, 0xcd, 0x00] # 3
46
+ out << [0x00, 0x00, 0xee] # 4
47
+ out << [0xcd, 0x00, 0xcd] # 5
48
+ out << [0x00, 0xcd, 0xcd] # 6
49
+ out << [0xe5, 0xe5, 0xe5] # 7
50
+ out << [0x7f, 0x7f, 0x7f] # 8
51
+ out << [0xff, 0x00, 0x00] # 9
52
+ out << [0x00, 0xff, 0x00] # 10
53
+ out << [0xff, 0xff, 0x00] # 11
54
+ out << [0x5c, 0x5c, 0xff] # 12
55
+ out << [0xff, 0x00, 0xff] # 13
56
+ out << [0x00, 0xff, 0xff] # 14
57
+ out << [0xff, 0xff, 0xff] # 15
58
+
59
+ # colors 16..232: the 6x6x6 color cube
60
+ valuerange = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]
61
+
62
+ 217.times do |i|
63
+ r = valuerange[(i / 36) % 6]
64
+ g = valuerange[(i / 6) % 6]
65
+ b = valuerange[i % 6]
66
+ out << [r, g, b]
67
+ end
68
+
69
+ # colors 233..253: grayscale
70
+ 1.upto 22 do |i|
71
+ v = 8 + i * 10
72
+ out << [v, v, v]
73
+ end
74
+ end
75
+ end
76
+
77
+ def fg
78
+ return @fg if instance_variable_defined? :@fg
79
+ @fg = style.fg && self.class.color_index(style.fg)
80
+ end
81
+
82
+ def bg
83
+ return @bg if instance_variable_defined? :@bg
84
+ @bg = style.bg && self.class.color_index(style.bg)
85
+ end
86
+
87
+ def style_string
88
+ @style_string ||= begin
89
+ attrs = []
90
+
91
+ attrs << ['38', '5', fg.to_s] if fg
92
+ attrs << ['48', '5', bg.to_s] if bg
93
+ attrs << '01' if style[:bold]
94
+ attrs << '04' if style[:italic] # underline, but hey, whatevs
95
+ escape(attrs)
96
+ end
97
+ end
98
+
99
+ def reset_string
100
+ @reset_string ||= begin
101
+ attrs = []
102
+ attrs << '39' if fg # fg reset
103
+ attrs << '49' if bg # bg reset
104
+ attrs << '00' if style[:bold] || style[:italic]
105
+
106
+ escape(attrs)
107
+ end
108
+ end
109
+
110
+ private
111
+ def escape(attrs)
112
+ return '' if attrs.empty?
113
+ "\e[#{attrs.join(';')}m"
114
+ end
115
+
116
+ def self.color_index(color)
117
+ @color_index_cache ||= {}
118
+ @color_index_cache[color] ||= closest_color(*get_rgb(color))
119
+ end
120
+
121
+ def self.get_rgb(color)
122
+ color = $1 if color =~ /#([0-9a-f]+)/i
123
+ hexes = case color.size
124
+ when 3
125
+ color.chars.map { |c| "#{c}#{c}" }
126
+ when 6
127
+ color.scan(/../)
128
+ else
129
+ raise "invalid color: #{color}"
130
+ end
131
+
132
+ hexes.map { |h| h.to_i(16) }
133
+ end
134
+
135
+ # max distance between two colors, #000000 to #ffffff
136
+ MAX_DISTANCE = 257 * 257 * 3
137
+
138
+ def self.closest_color(r, g, b)
139
+ @@colors_cache ||= {}
140
+ key = (r << 16) + (g << 8) + b
141
+ @@colors_cache.fetch(key) do
142
+ distance = MAX_DISTANCE
143
+
144
+ match = 0
145
+
146
+ xterm_colors.each_with_index do |(cr, cg, cb), i|
147
+ d = (r - cr)**2 + (g - cg)**2 + (b - cb)**2
148
+ next if d >= distance
149
+
150
+ match = i
151
+ distance = d
152
+ end
153
+
154
+ match
155
+ end
156
+ end
157
+ end
158
+
159
+ # private
160
+ def escape_sequence(token)
161
+ @escape_sequences ||= {}
162
+ @escape_sequences[token.qualname] ||=
163
+ EscapeSequence.new(get_style(token))
164
+ end
165
+
166
+ def get_style(token)
167
+ return text_style if token.ancestors.include? Token::Tokens::Text
168
+
169
+ theme.get_own_style(token) || text_style
170
+ end
171
+
172
+ def text_style
173
+ style = theme.get_style(Token['Text'])
174
+ # don't highlight text backgrounds
175
+ style.delete :bg
176
+ style
177
+ end
178
+ end
179
+ end
180
+ 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,101 @@
1
+ module Rouge
2
+ module Guessers
3
+ class Disambiguation < Guesser
4
+ include Util
5
+ include Lexers
6
+
7
+ def initialize(filename, source)
8
+ @filename = File.basename(filename)
9
+ @source = source
10
+ end
11
+
12
+ def filter(lexers)
13
+ return lexers if lexers.size == 1
14
+ return lexers if lexers.size == Lexer.all.size
15
+
16
+ @analyzer = TextAnalyzer.new(get_source(@source))
17
+
18
+ self.class.disambiguators.each do |disambiguator|
19
+ next unless disambiguator.match?(@filename)
20
+
21
+ filtered = disambiguator.decide!(self)
22
+ return filtered if filtered
23
+ end
24
+
25
+ return lexers
26
+ end
27
+
28
+ def contains?(text)
29
+ return @analyzer.include?(text)
30
+ end
31
+
32
+ def matches?(re)
33
+ return !!(@analyzer =~ re)
34
+ end
35
+
36
+ @disambiguators = []
37
+ def self.disambiguate(*patterns, &decider)
38
+ @disambiguators << Disambiguator.new(patterns, &decider)
39
+ end
40
+
41
+ def self.disambiguators
42
+ @disambiguators
43
+ end
44
+
45
+ class Disambiguator
46
+ include Util
47
+
48
+ def initialize(patterns, &decider)
49
+ @patterns = patterns
50
+ @decider = decider
51
+ end
52
+
53
+ def decide!(guesser)
54
+ out = guesser.instance_eval(&@decider)
55
+ case out
56
+ when Array then out
57
+ when nil then nil
58
+ else [out]
59
+ end
60
+ end
61
+
62
+ def match?(filename)
63
+ @patterns.any? { |p| test_glob(p, filename) }
64
+ end
65
+ end
66
+
67
+ disambiguate '*.pl' do
68
+ next Perl if contains?('my $')
69
+ next Prolog if contains?(':-')
70
+ next Prolog if matches?(/\A\w+(\(\w+\,\s*\w+\))*\./)
71
+ end
72
+
73
+ disambiguate '*.h' do
74
+ next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
75
+ next ObjectiveC if contains?('@"')
76
+
77
+ C
78
+ end
79
+
80
+ disambiguate '*.m' do
81
+ next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
82
+ next ObjectiveC if contains?('@"')
83
+
84
+ next Matlab if matches?(/^\s*?%/)
85
+ end
86
+
87
+ disambiguate '*.php' do
88
+ # PHP always takes precedence over Hack
89
+ PHP
90
+ end
91
+
92
+ disambiguate '*.hh' do
93
+ next Cpp if matches?(/^\s*#include/)
94
+ next Hack if matches?(/^<\?hh/)
95
+ next Hack if matches?(/(\(|, ?)\$\$/)
96
+
97
+ Cpp
98
+ end
99
+ end
100
+ end
101
+ end