rouge-lines 3.2.3

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 (318) 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-lines.rb +84 -0
  6. data/lib/rouge-lines/cli.rb +429 -0
  7. data/lib/rouge-lines/demos/abap +6 -0
  8. data/lib/rouge-lines/demos/actionscript +4 -0
  9. data/lib/rouge-lines/demos/apache +21 -0
  10. data/lib/rouge-lines/demos/apiblueprint +33 -0
  11. data/lib/rouge-lines/demos/applescript +2 -0
  12. data/lib/rouge-lines/demos/awk +4 -0
  13. data/lib/rouge-lines/demos/biml +38 -0
  14. data/lib/rouge-lines/demos/bsl +7 -0
  15. data/lib/rouge-lines/demos/c +8 -0
  16. data/lib/rouge-lines/demos/ceylon +7 -0
  17. data/lib/rouge-lines/demos/cfscript +18 -0
  18. data/lib/rouge-lines/demos/clojure +5 -0
  19. data/lib/rouge-lines/demos/cmake +7 -0
  20. data/lib/rouge-lines/demos/coffeescript +5 -0
  21. data/lib/rouge-lines/demos/common_lisp +1 -0
  22. data/lib/rouge-lines/demos/conf +4 -0
  23. data/lib/rouge-lines/demos/console +6 -0
  24. data/lib/rouge-lines/demos/coq +13 -0
  25. data/lib/rouge-lines/demos/cpp +8 -0
  26. data/lib/rouge-lines/demos/csharp +5 -0
  27. data/lib/rouge-lines/demos/css +4 -0
  28. data/lib/rouge-lines/demos/d +16 -0
  29. data/lib/rouge-lines/demos/dart +6 -0
  30. data/lib/rouge-lines/demos/diff +7 -0
  31. data/lib/rouge-lines/demos/digdag +19 -0
  32. data/lib/rouge-lines/demos/docker +9 -0
  33. data/lib/rouge-lines/demos/dot +5 -0
  34. data/lib/rouge-lines/demos/eiffel +30 -0
  35. data/lib/rouge-lines/demos/elixir +1 -0
  36. data/lib/rouge-lines/demos/elm +4 -0
  37. data/lib/rouge-lines/demos/erb +1 -0
  38. data/lib/rouge-lines/demos/erlang +7 -0
  39. data/lib/rouge-lines/demos/factor +5 -0
  40. data/lib/rouge-lines/demos/fortran +22 -0
  41. data/lib/rouge-lines/demos/fsharp +12 -0
  42. data/lib/rouge-lines/demos/gherkin +17 -0
  43. data/lib/rouge-lines/demos/glsl +14 -0
  44. data/lib/rouge-lines/demos/go +7 -0
  45. data/lib/rouge-lines/demos/gradle +10 -0
  46. data/lib/rouge-lines/demos/graphql +17 -0
  47. data/lib/rouge-lines/demos/groovy +9 -0
  48. data/lib/rouge-lines/demos/hack +5 -0
  49. data/lib/rouge-lines/demos/haml +5 -0
  50. data/lib/rouge-lines/demos/handlebars +7 -0
  51. data/lib/rouge-lines/demos/haskell +6 -0
  52. data/lib/rouge-lines/demos/html +8 -0
  53. data/lib/rouge-lines/demos/http +14 -0
  54. data/lib/rouge-lines/demos/hylang +10 -0
  55. data/lib/rouge-lines/demos/idlang +8 -0
  56. data/lib/rouge-lines/demos/igorpro +9 -0
  57. data/lib/rouge-lines/demos/ini +4 -0
  58. data/lib/rouge-lines/demos/io +11 -0
  59. data/lib/rouge-lines/demos/irb +4 -0
  60. data/lib/rouge-lines/demos/irb_output +2 -0
  61. data/lib/rouge-lines/demos/java +5 -0
  62. data/lib/rouge-lines/demos/javascript +1 -0
  63. data/lib/rouge-lines/demos/jinja +9 -0
  64. data/lib/rouge-lines/demos/json +1 -0
  65. data/lib/rouge-lines/demos/json-doc +1 -0
  66. data/lib/rouge-lines/demos/jsonnet +28 -0
  67. data/lib/rouge-lines/demos/jsx +17 -0
  68. data/lib/rouge-lines/demos/julia +11 -0
  69. data/lib/rouge-lines/demos/kotlin +3 -0
  70. data/lib/rouge-lines/demos/lasso +12 -0
  71. data/lib/rouge-lines/demos/liquid +11 -0
  72. data/lib/rouge-lines/demos/literate_coffeescript +3 -0
  73. data/lib/rouge-lines/demos/literate_haskell +7 -0
  74. data/lib/rouge-lines/demos/llvm +20 -0
  75. data/lib/rouge-lines/demos/lua +12 -0
  76. data/lib/rouge-lines/demos/make +6 -0
  77. data/lib/rouge-lines/demos/markdown +4 -0
  78. data/lib/rouge-lines/demos/matlab +6 -0
  79. data/lib/rouge-lines/demos/moonscript +16 -0
  80. data/lib/rouge-lines/demos/mosel +10 -0
  81. data/lib/rouge-lines/demos/mxml +22 -0
  82. data/lib/rouge-lines/demos/nasm +26 -0
  83. data/lib/rouge-lines/demos/nginx +5 -0
  84. data/lib/rouge-lines/demos/nim +27 -0
  85. data/lib/rouge-lines/demos/nix +19 -0
  86. data/lib/rouge-lines/demos/objective_c +18 -0
  87. data/lib/rouge-lines/demos/ocaml +12 -0
  88. data/lib/rouge-lines/demos/pascal +14 -0
  89. data/lib/rouge-lines/demos/perl +5 -0
  90. data/lib/rouge-lines/demos/php +3 -0
  91. data/lib/rouge-lines/demos/plaintext +1 -0
  92. data/lib/rouge-lines/demos/plist +142 -0
  93. data/lib/rouge-lines/demos/pony +17 -0
  94. data/lib/rouge-lines/demos/powershell +49 -0
  95. data/lib/rouge-lines/demos/praat +26 -0
  96. data/lib/rouge-lines/demos/prolog +9 -0
  97. data/lib/rouge-lines/demos/prometheus +9 -0
  98. data/lib/rouge-lines/demos/properties +7 -0
  99. data/lib/rouge-lines/demos/protobuf +5 -0
  100. data/lib/rouge-lines/demos/puppet +6 -0
  101. data/lib/rouge-lines/demos/python +6 -0
  102. data/lib/rouge-lines/demos/q +2 -0
  103. data/lib/rouge-lines/demos/qml +9 -0
  104. data/lib/rouge-lines/demos/r +8 -0
  105. data/lib/rouge-lines/demos/racket +24 -0
  106. data/lib/rouge-lines/demos/ruby +9 -0
  107. data/lib/rouge-lines/demos/rust +12 -0
  108. data/lib/rouge-lines/demos/sass +3 -0
  109. data/lib/rouge-lines/demos/scala +3 -0
  110. data/lib/rouge-lines/demos/scheme +4 -0
  111. data/lib/rouge-lines/demos/scss +5 -0
  112. data/lib/rouge-lines/demos/sed +4 -0
  113. data/lib/rouge-lines/demos/shell +2 -0
  114. data/lib/rouge-lines/demos/sieve +10 -0
  115. data/lib/rouge-lines/demos/slim +17 -0
  116. data/lib/rouge-lines/demos/smalltalk +6 -0
  117. data/lib/rouge-lines/demos/smarty +12 -0
  118. data/lib/rouge-lines/demos/sml +4 -0
  119. data/lib/rouge-lines/demos/sql +1 -0
  120. data/lib/rouge-lines/demos/swift +5 -0
  121. data/lib/rouge-lines/demos/tap +5 -0
  122. data/lib/rouge-lines/demos/tcl +1 -0
  123. data/lib/rouge-lines/demos/tex +1 -0
  124. data/lib/rouge-lines/demos/toml +9 -0
  125. data/lib/rouge-lines/demos/tsx +17 -0
  126. data/lib/rouge-lines/demos/tulip +13 -0
  127. data/lib/rouge-lines/demos/turtle +26 -0
  128. data/lib/rouge-lines/demos/twig +9 -0
  129. data/lib/rouge-lines/demos/typescript +1 -0
  130. data/lib/rouge-lines/demos/vala +8 -0
  131. data/lib/rouge-lines/demos/vb +4 -0
  132. data/lib/rouge-lines/demos/verilog +27 -0
  133. data/lib/rouge-lines/demos/vhdl +23 -0
  134. data/lib/rouge-lines/demos/viml +14 -0
  135. data/lib/rouge-lines/demos/vue +11 -0
  136. data/lib/rouge-lines/demos/wollok +11 -0
  137. data/lib/rouge-lines/demos/xml +2 -0
  138. data/lib/rouge-lines/demos/yaml +4 -0
  139. data/lib/rouge-lines/formatter.rb +75 -0
  140. data/lib/rouge-lines/formatters/html.rb +37 -0
  141. data/lib/rouge-lines/formatters/html_inline.rb +30 -0
  142. data/lib/rouge-lines/formatters/html_legacy.rb +49 -0
  143. data/lib/rouge-lines/formatters/html_lineanchors.rb +27 -0
  144. data/lib/rouge-lines/formatters/html_linewise.rb +27 -0
  145. data/lib/rouge-lines/formatters/html_pygments.rb +16 -0
  146. data/lib/rouge-lines/formatters/html_table.rb +61 -0
  147. data/lib/rouge-lines/formatters/null.rb +19 -0
  148. data/lib/rouge-lines/formatters/terminal256.rb +180 -0
  149. data/lib/rouge-lines/guesser.rb +55 -0
  150. data/lib/rouge-lines/guessers/disambiguation.rb +101 -0
  151. data/lib/rouge-lines/guessers/filename.rb +25 -0
  152. data/lib/rouge-lines/guessers/glob_mapping.rb +43 -0
  153. data/lib/rouge-lines/guessers/mimetype.rb +14 -0
  154. data/lib/rouge-lines/guessers/modeline.rb +44 -0
  155. data/lib/rouge-lines/guessers/source.rb +29 -0
  156. data/lib/rouge-lines/guessers/util.rb +32 -0
  157. data/lib/rouge-lines/lexer.rb +461 -0
  158. data/lib/rouge-lines/lexers/abap.rb +238 -0
  159. data/lib/rouge-lines/lexers/actionscript.rb +195 -0
  160. data/lib/rouge-lines/lexers/apache.rb +71 -0
  161. data/lib/rouge-lines/lexers/apache/keywords.yml +764 -0
  162. data/lib/rouge-lines/lexers/apiblueprint.rb +47 -0
  163. data/lib/rouge-lines/lexers/apple_script.rb +367 -0
  164. data/lib/rouge-lines/lexers/awk.rb +161 -0
  165. data/lib/rouge-lines/lexers/biml.rb +41 -0
  166. data/lib/rouge-lines/lexers/bsl.rb +81 -0
  167. data/lib/rouge-lines/lexers/c.rb +212 -0
  168. data/lib/rouge-lines/lexers/ceylon.rb +123 -0
  169. data/lib/rouge-lines/lexers/cfscript.rb +153 -0
  170. data/lib/rouge-lines/lexers/clojure.rb +112 -0
  171. data/lib/rouge-lines/lexers/cmake.rb +206 -0
  172. data/lib/rouge-lines/lexers/coffeescript.rb +174 -0
  173. data/lib/rouge-lines/lexers/common_lisp.rb +345 -0
  174. data/lib/rouge-lines/lexers/conf.rb +24 -0
  175. data/lib/rouge-lines/lexers/console.rb +136 -0
  176. data/lib/rouge-lines/lexers/coq.rb +187 -0
  177. data/lib/rouge-lines/lexers/cpp.rb +78 -0
  178. data/lib/rouge-lines/lexers/csharp.rb +114 -0
  179. data/lib/rouge-lines/lexers/css.rb +273 -0
  180. data/lib/rouge-lines/lexers/d.rb +176 -0
  181. data/lib/rouge-lines/lexers/dart.rb +104 -0
  182. data/lib/rouge-lines/lexers/diff.rb +31 -0
  183. data/lib/rouge-lines/lexers/digdag.rb +68 -0
  184. data/lib/rouge-lines/lexers/docker.rb +50 -0
  185. data/lib/rouge-lines/lexers/dot.rb +68 -0
  186. data/lib/rouge-lines/lexers/eiffel.rb +65 -0
  187. data/lib/rouge-lines/lexers/elixir.rb +133 -0
  188. data/lib/rouge-lines/lexers/elm.rb +89 -0
  189. data/lib/rouge-lines/lexers/erb.rb +52 -0
  190. data/lib/rouge-lines/lexers/erlang.rb +114 -0
  191. data/lib/rouge-lines/lexers/factor.rb +302 -0
  192. data/lib/rouge-lines/lexers/fortran.rb +176 -0
  193. data/lib/rouge-lines/lexers/fsharp.rb +118 -0
  194. data/lib/rouge-lines/lexers/gherkin.rb +137 -0
  195. data/lib/rouge-lines/lexers/gherkin/keywords.rb +14 -0
  196. data/lib/rouge-lines/lexers/glsl.rb +135 -0
  197. data/lib/rouge-lines/lexers/go.rb +174 -0
  198. data/lib/rouge-lines/lexers/gradle.rb +37 -0
  199. data/lib/rouge-lines/lexers/graphql.rb +243 -0
  200. data/lib/rouge-lines/lexers/groovy.rb +112 -0
  201. data/lib/rouge-lines/lexers/hack.rb +48 -0
  202. data/lib/rouge-lines/lexers/haml.rb +229 -0
  203. data/lib/rouge-lines/lexers/handlebars.rb +79 -0
  204. data/lib/rouge-lines/lexers/haskell.rb +197 -0
  205. data/lib/rouge-lines/lexers/html.rb +139 -0
  206. data/lib/rouge-lines/lexers/http.rb +80 -0
  207. data/lib/rouge-lines/lexers/hylang.rb +93 -0
  208. data/lib/rouge-lines/lexers/idlang.rb +310 -0
  209. data/lib/rouge-lines/lexers/igorpro.rb +408 -0
  210. data/lib/rouge-lines/lexers/ini.rb +53 -0
  211. data/lib/rouge-lines/lexers/io.rb +68 -0
  212. data/lib/rouge-lines/lexers/irb.rb +66 -0
  213. data/lib/rouge-lines/lexers/java.rb +87 -0
  214. data/lib/rouge-lines/lexers/javascript.rb +281 -0
  215. data/lib/rouge-lines/lexers/jinja.rb +137 -0
  216. data/lib/rouge-lines/lexers/json.rb +29 -0
  217. data/lib/rouge-lines/lexers/json_doc.rb +23 -0
  218. data/lib/rouge-lines/lexers/jsonnet.rb +151 -0
  219. data/lib/rouge-lines/lexers/jsx.rb +102 -0
  220. data/lib/rouge-lines/lexers/julia.rb +172 -0
  221. data/lib/rouge-lines/lexers/kotlin.rb +79 -0
  222. data/lib/rouge-lines/lexers/lasso.rb +214 -0
  223. data/lib/rouge-lines/lexers/lasso/keywords.yml +446 -0
  224. data/lib/rouge-lines/lexers/liquid.rb +287 -0
  225. data/lib/rouge-lines/lexers/literate_coffeescript.rb +33 -0
  226. data/lib/rouge-lines/lexers/literate_haskell.rb +36 -0
  227. data/lib/rouge-lines/lexers/llvm.rb +80 -0
  228. data/lib/rouge-lines/lexers/lua.rb +125 -0
  229. data/lib/rouge-lines/lexers/lua/builtins.rb +22 -0
  230. data/lib/rouge-lines/lexers/make.rb +112 -0
  231. data/lib/rouge-lines/lexers/markdown.rb +154 -0
  232. data/lib/rouge-lines/lexers/matlab.rb +71 -0
  233. data/lib/rouge-lines/lexers/matlab/builtins.rb +11 -0
  234. data/lib/rouge-lines/lexers/moonscript.rb +114 -0
  235. data/lib/rouge-lines/lexers/mosel.rb +231 -0
  236. data/lib/rouge-lines/lexers/mxml.rb +68 -0
  237. data/lib/rouge-lines/lexers/nasm.rb +198 -0
  238. data/lib/rouge-lines/lexers/nginx.rb +71 -0
  239. data/lib/rouge-lines/lexers/nim.rb +152 -0
  240. data/lib/rouge-lines/lexers/nix.rb +205 -0
  241. data/lib/rouge-lines/lexers/objective_c.rb +194 -0
  242. data/lib/rouge-lines/lexers/ocaml.rb +100 -0
  243. data/lib/rouge-lines/lexers/pascal.rb +66 -0
  244. data/lib/rouge-lines/lexers/perl.rb +196 -0
  245. data/lib/rouge-lines/lexers/php.rb +193 -0
  246. data/lib/rouge-lines/lexers/php/builtins.rb +194 -0
  247. data/lib/rouge-lines/lexers/plain_text.rb +26 -0
  248. data/lib/rouge-lines/lexers/plist.rb +45 -0
  249. data/lib/rouge-lines/lexers/pony.rb +93 -0
  250. data/lib/rouge-lines/lexers/powershell.rb +678 -0
  251. data/lib/rouge-lines/lexers/praat.rb +350 -0
  252. data/lib/rouge-lines/lexers/prolog.rb +59 -0
  253. data/lib/rouge-lines/lexers/prometheus.rb +121 -0
  254. data/lib/rouge-lines/lexers/properties.rb +51 -0
  255. data/lib/rouge-lines/lexers/protobuf.rb +70 -0
  256. data/lib/rouge-lines/lexers/puppet.rb +128 -0
  257. data/lib/rouge-lines/lexers/python.rb +232 -0
  258. data/lib/rouge-lines/lexers/q.rb +123 -0
  259. data/lib/rouge-lines/lexers/qml.rb +73 -0
  260. data/lib/rouge-lines/lexers/r.rb +89 -0
  261. data/lib/rouge-lines/lexers/racket.rb +543 -0
  262. data/lib/rouge-lines/lexers/ruby.rb +437 -0
  263. data/lib/rouge-lines/lexers/rust.rb +192 -0
  264. data/lib/rouge-lines/lexers/sass.rb +74 -0
  265. data/lib/rouge-lines/lexers/sass/common.rb +180 -0
  266. data/lib/rouge-lines/lexers/scala.rb +142 -0
  267. data/lib/rouge-lines/lexers/scheme.rb +112 -0
  268. data/lib/rouge-lines/lexers/scss.rb +34 -0
  269. data/lib/rouge-lines/lexers/sed.rb +172 -0
  270. data/lib/rouge-lines/lexers/shell.rb +189 -0
  271. data/lib/rouge-lines/lexers/sieve.rb +96 -0
  272. data/lib/rouge-lines/lexers/slim.rb +228 -0
  273. data/lib/rouge-lines/lexers/smalltalk.rb +116 -0
  274. data/lib/rouge-lines/lexers/smarty.rb +80 -0
  275. data/lib/rouge-lines/lexers/sml.rb +344 -0
  276. data/lib/rouge-lines/lexers/sql.rb +140 -0
  277. data/lib/rouge-lines/lexers/swift.rb +181 -0
  278. data/lib/rouge-lines/lexers/tap.rb +87 -0
  279. data/lib/rouge-lines/lexers/tcl.rb +192 -0
  280. data/lib/rouge-lines/lexers/tex.rb +69 -0
  281. data/lib/rouge-lines/lexers/toml.rb +67 -0
  282. data/lib/rouge-lines/lexers/tsx.rb +19 -0
  283. data/lib/rouge-lines/lexers/tulip.rb +106 -0
  284. data/lib/rouge-lines/lexers/turtle.rb +63 -0
  285. data/lib/rouge-lines/lexers/twig.rb +39 -0
  286. data/lib/rouge-lines/lexers/typescript.rb +22 -0
  287. data/lib/rouge-lines/lexers/typescript/common.rb +33 -0
  288. data/lib/rouge-lines/lexers/vala.rb +77 -0
  289. data/lib/rouge-lines/lexers/vb.rb +164 -0
  290. data/lib/rouge-lines/lexers/verilog.rb +164 -0
  291. data/lib/rouge-lines/lexers/vhdl.rb +97 -0
  292. data/lib/rouge-lines/lexers/viml.rb +101 -0
  293. data/lib/rouge-lines/lexers/viml/keywords.rb +12 -0
  294. data/lib/rouge-lines/lexers/vue.rb +122 -0
  295. data/lib/rouge-lines/lexers/wollok.rb +103 -0
  296. data/lib/rouge-lines/lexers/xml.rb +57 -0
  297. data/lib/rouge-lines/lexers/yaml.rb +373 -0
  298. data/lib/rouge-lines/plugins/redcarpet.rb +30 -0
  299. data/lib/rouge-lines/regex_lexer.rb +441 -0
  300. data/lib/rouge-lines/template_lexer.rb +20 -0
  301. data/lib/rouge-lines/text_analyzer.rb +49 -0
  302. data/lib/rouge-lines/theme.rb +213 -0
  303. data/lib/rouge-lines/themes/base16.rb +130 -0
  304. data/lib/rouge-lines/themes/colorful.rb +67 -0
  305. data/lib/rouge-lines/themes/github.rb +71 -0
  306. data/lib/rouge-lines/themes/gruvbox.rb +167 -0
  307. data/lib/rouge-lines/themes/igor_pro.rb +20 -0
  308. data/lib/rouge-lines/themes/molokai.rb +82 -0
  309. data/lib/rouge-lines/themes/monokai.rb +92 -0
  310. data/lib/rouge-lines/themes/monokai_sublime.rb +90 -0
  311. data/lib/rouge-lines/themes/pastie.rb +69 -0
  312. data/lib/rouge-lines/themes/thankful_eyes.rb +74 -0
  313. data/lib/rouge-lines/themes/tulip.rb +69 -0
  314. data/lib/rouge-lines/token.rb +182 -0
  315. data/lib/rouge-lines/util.rb +101 -0
  316. data/lib/rouge-lines/version.rb +7 -0
  317. data/rouge-lines.gemspec +23 -0
  318. metadata +368 -0
@@ -0,0 +1,30 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module RougeLines
4
+ module Formatters
5
+ class HTMLInline < HTML
6
+ tag 'html_inline'
7
+
8
+ def initialize(theme)
9
+ if theme.is_a?(Class) && theme < RougeLines::Theme
10
+ @theme = theme.new
11
+ elsif theme.is_a?(RougeLines::Theme)
12
+ @theme = theme
13
+ elsif theme.is_a?(String)
14
+ @theme = RougeLines::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,49 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ # stdlib
4
+ require 'cgi'
5
+
6
+ module RougeLines
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_anchors (false)
14
+ # @option opts [true/false] :line_numbers (false)
15
+ # @option opts [true/false] :linewise (false)
16
+ # @option opts [RougeLines::CSSTheme] :inline_theme (nil)
17
+ # @option opts [true/false] :wrap (true)
18
+ #
19
+ # Initialize with options.
20
+ #
21
+ # If `:inline_theme` is given, then instead of rendering the
22
+ # tokens as <span> tags with CSS classes, the styles according to
23
+ # the given theme will be inlined in "style" attributes. This is
24
+ # useful for formats in which stylesheets are not available.
25
+ #
26
+ # Content will be wrapped in a tag (`div` if tableized, `pre` if
27
+ # not) with the given `:css_class` unless `:wrap` is set to `false`.
28
+ def initialize(opts={})
29
+ @formatter = opts[:inline_theme] ? HTMLInline.new(opts[:inline_theme])
30
+ : HTML.new
31
+
32
+ @formatter = HTMLLineanchors.new(@formatter, opts) if opts[:lineanchors]
33
+
34
+ @formatter = HTMLLinewise.new(@formatter, opts) if opts[:linewise]
35
+
36
+ @formatter = HTMLTable.new(@formatter, opts) if opts[:line_numbers]
37
+
38
+ if opts.fetch(:wrap, true)
39
+ @formatter = HTMLPygments.new(@formatter, opts.fetch(:css_class, 'codehilite'))
40
+ end
41
+ end
42
+
43
+ # @yield the html output.
44
+ def stream(tokens, &b)
45
+ @formatter.stream(tokens, &b)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module RougeLines
4
+ module Formatters
5
+ class HTMLLineanchors < 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 "<a name=#{next_line_class}></a>"
14
+ line.each do |tok, val|
15
+ yield @formatter.span(tok, val)
16
+ end
17
+ yield "\n"
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,27 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module RougeLines
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 RougeLines
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 RougeLines
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 RougeLines
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 RougeLines
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,RougeLines::Theme] theme
13
+ # the theme to render with.
14
+ def initialize(theme = Themes::ThankfulEyes.new)
15
+ if theme.is_a?(RougeLines::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 RougeLines
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