rouge 3.2.0 → 3.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +17 -3
  3. data/bin/rougify +1 -0
  4. data/lib/rouge.rb +67 -43
  5. data/lib/rouge/cli.rb +84 -17
  6. data/lib/rouge/demos/ada +26 -0
  7. data/lib/rouge/demos/apex +9 -0
  8. data/lib/rouge/demos/armasm +12 -0
  9. data/lib/rouge/demos/batchfile +3 -0
  10. data/lib/rouge/demos/bbcbasic +6 -0
  11. data/lib/rouge/demos/bpf +7 -0
  12. data/lib/rouge/demos/brainfuck +5 -0
  13. data/lib/rouge/demos/clean +6 -0
  14. data/lib/rouge/demos/cmhg +8 -0
  15. data/lib/rouge/demos/csvs +8 -0
  16. data/lib/rouge/demos/cuda +11 -0
  17. data/lib/rouge/demos/cypher +5 -0
  18. data/lib/rouge/demos/cython +6 -0
  19. data/lib/rouge/demos/datastudio +21 -0
  20. data/lib/rouge/demos/ecl +18 -0
  21. data/lib/rouge/demos/eex +1 -0
  22. data/lib/rouge/demos/epp +4 -0
  23. data/lib/rouge/demos/escape +3 -0
  24. data/lib/rouge/demos/freefem +16 -0
  25. data/lib/rouge/demos/gdscript +18 -0
  26. data/lib/rouge/demos/ghc-cmm +23 -0
  27. data/lib/rouge/demos/ghc-core +26 -0
  28. data/lib/rouge/demos/haxe +5 -0
  29. data/lib/rouge/demos/hocon +8 -0
  30. data/lib/rouge/demos/hql +5 -0
  31. data/lib/rouge/demos/isbl +4 -0
  32. data/lib/rouge/demos/jsl +3 -0
  33. data/lib/rouge/demos/jsp +29 -0
  34. data/lib/rouge/demos/liquid +0 -1
  35. data/lib/rouge/demos/lustre +6 -0
  36. data/lib/rouge/demos/lutin +18 -0
  37. data/lib/rouge/demos/m68k +16 -0
  38. data/lib/rouge/demos/magik +6 -0
  39. data/lib/rouge/demos/mason +22 -0
  40. data/lib/rouge/demos/mathematica +8 -0
  41. data/lib/rouge/demos/minizinc +23 -0
  42. data/lib/rouge/demos/msgtrans +4 -0
  43. data/lib/rouge/demos/nasm +6 -6
  44. data/lib/rouge/demos/nesasm +11 -0
  45. data/lib/rouge/demos/objective_cpp +17 -0
  46. data/lib/rouge/demos/openedge +4 -0
  47. data/lib/rouge/demos/opentype_feature_file +6 -0
  48. data/lib/rouge/demos/plist +1 -132
  49. data/lib/rouge/demos/powershell +12 -48
  50. data/lib/rouge/demos/q +6 -0
  51. data/lib/rouge/demos/reasonml +12 -0
  52. data/lib/rouge/demos/rego +8 -0
  53. data/lib/rouge/demos/robot_framework +27 -0
  54. data/lib/rouge/demos/sas +13 -0
  55. data/lib/rouge/demos/slice +10 -0
  56. data/lib/rouge/demos/solidity +13 -0
  57. data/lib/rouge/demos/sparql +6 -0
  58. data/lib/rouge/demos/sqf +14 -0
  59. data/lib/rouge/demos/supercollider +11 -0
  60. data/lib/rouge/demos/terraform +0 -15
  61. data/lib/rouge/demos/ttcn3 +6 -0
  62. data/lib/rouge/demos/vcl +12 -0
  63. data/lib/rouge/demos/xojo +14 -0
  64. data/lib/rouge/demos/xpath +2 -0
  65. data/lib/rouge/demos/xquery +22 -0
  66. data/lib/rouge/demos/yang +17 -0
  67. data/lib/rouge/formatter.rb +39 -2
  68. data/lib/rouge/formatters/html.rb +21 -2
  69. data/lib/rouge/formatters/html_inline.rb +1 -0
  70. data/lib/rouge/formatters/html_legacy.rb +1 -0
  71. data/lib/rouge/formatters/html_line_table.rb +53 -0
  72. data/lib/rouge/formatters/html_linewise.rb +7 -11
  73. data/lib/rouge/formatters/html_pygments.rb +2 -0
  74. data/lib/rouge/formatters/html_table.rb +21 -31
  75. data/lib/rouge/formatters/null.rb +1 -0
  76. data/lib/rouge/formatters/terminal256.rb +23 -5
  77. data/lib/rouge/formatters/terminal_truecolor.rb +37 -0
  78. data/lib/rouge/formatters/tex.rb +92 -0
  79. data/lib/rouge/guesser.rb +2 -0
  80. data/lib/rouge/guessers/disambiguation.rb +35 -0
  81. data/lib/rouge/guessers/filename.rb +2 -0
  82. data/lib/rouge/guessers/glob_mapping.rb +3 -1
  83. data/lib/rouge/guessers/mimetype.rb +2 -0
  84. data/lib/rouge/guessers/modeline.rb +3 -1
  85. data/lib/rouge/guessers/source.rb +3 -1
  86. data/lib/rouge/guessers/util.rb +2 -0
  87. data/lib/rouge/lexer.rb +71 -15
  88. data/lib/rouge/lexers/abap.rb +13 -11
  89. data/lib/rouge/lexers/actionscript.rb +35 -34
  90. data/lib/rouge/lexers/ada.rb +162 -0
  91. data/lib/rouge/lexers/apache.rb +13 -15
  92. data/lib/rouge/lexers/apache/keywords.rb +15 -0
  93. data/lib/rouge/lexers/apex.rb +126 -0
  94. data/lib/rouge/lexers/apiblueprint.rb +2 -0
  95. data/lib/rouge/lexers/apple_script.rb +17 -14
  96. data/lib/rouge/lexers/armasm.rb +145 -0
  97. data/lib/rouge/lexers/awk.rb +26 -25
  98. data/lib/rouge/lexers/batchfile.rb +164 -0
  99. data/lib/rouge/lexers/bbcbasic.rb +112 -0
  100. data/lib/rouge/lexers/biml.rb +6 -4
  101. data/lib/rouge/lexers/bpf.rb +118 -0
  102. data/lib/rouge/lexers/brainfuck.rb +53 -0
  103. data/lib/rouge/lexers/bsl.rb +13 -12
  104. data/lib/rouge/lexers/c.rb +35 -57
  105. data/lib/rouge/lexers/ceylon.rb +7 -34
  106. data/lib/rouge/lexers/cfscript.rb +27 -26
  107. data/lib/rouge/lexers/clean.rb +156 -0
  108. data/lib/rouge/lexers/clojure.rb +15 -14
  109. data/lib/rouge/lexers/cmake.rb +16 -14
  110. data/lib/rouge/lexers/cmhg.rb +34 -0
  111. data/lib/rouge/lexers/coffeescript.rb +90 -49
  112. data/lib/rouge/lexers/common_lisp.rb +39 -38
  113. data/lib/rouge/lexers/conf.rb +7 -6
  114. data/lib/rouge/lexers/console.rb +92 -38
  115. data/lib/rouge/lexers/coq.rb +27 -23
  116. data/lib/rouge/lexers/cpp.rb +24 -13
  117. data/lib/rouge/lexers/crystal.rb +71 -70
  118. data/lib/rouge/lexers/csharp.rb +29 -29
  119. data/lib/rouge/lexers/css.rb +24 -23
  120. data/lib/rouge/lexers/csvs.rb +44 -0
  121. data/lib/rouge/lexers/cuda.rb +35 -0
  122. data/lib/rouge/lexers/cypher.rb +108 -0
  123. data/lib/rouge/lexers/cython.rb +151 -0
  124. data/lib/rouge/lexers/d.rb +64 -63
  125. data/lib/rouge/lexers/dart.rb +34 -33
  126. data/lib/rouge/lexers/datastudio.rb +138 -0
  127. data/lib/rouge/lexers/diff.rb +10 -4
  128. data/lib/rouge/lexers/digdag.rb +3 -1
  129. data/lib/rouge/lexers/docker.rb +12 -11
  130. data/lib/rouge/lexers/dot.rb +19 -18
  131. data/lib/rouge/lexers/ecl.rb +175 -0
  132. data/lib/rouge/lexers/eex.rb +52 -0
  133. data/lib/rouge/lexers/eiffel.rb +21 -20
  134. data/lib/rouge/lexers/elixir.rb +52 -36
  135. data/lib/rouge/lexers/elm.rb +30 -29
  136. data/lib/rouge/lexers/epp.rb +51 -0
  137. data/lib/rouge/lexers/erb.rb +5 -4
  138. data/lib/rouge/lexers/erlang.rb +1 -0
  139. data/lib/rouge/lexers/escape.rb +58 -0
  140. data/lib/rouge/lexers/factor.rb +41 -40
  141. data/lib/rouge/lexers/fortran.rb +34 -32
  142. data/lib/rouge/lexers/freefem.rb +240 -0
  143. data/lib/rouge/lexers/fsharp.rb +33 -31
  144. data/lib/rouge/lexers/gdscript.rb +171 -0
  145. data/lib/rouge/lexers/ghc_cmm.rb +340 -0
  146. data/lib/rouge/lexers/ghc_core.rb +151 -0
  147. data/lib/rouge/lexers/gherkin.rb +17 -14
  148. data/lib/rouge/lexers/gherkin/keywords.rb +2 -0
  149. data/lib/rouge/lexers/glsl.rb +2 -5
  150. data/lib/rouge/lexers/go.rb +3 -2
  151. data/lib/rouge/lexers/gradle.rb +1 -0
  152. data/lib/rouge/lexers/graphql.rb +78 -60
  153. data/lib/rouge/lexers/groovy.rb +24 -25
  154. data/lib/rouge/lexers/hack.rb +2 -1
  155. data/lib/rouge/lexers/haml.rb +26 -29
  156. data/lib/rouge/lexers/handlebars.rb +32 -20
  157. data/lib/rouge/lexers/haskell.rb +67 -65
  158. data/lib/rouge/lexers/haxe.rb +246 -0
  159. data/lib/rouge/lexers/hcl.rb +26 -25
  160. data/lib/rouge/lexers/hocon.rb +86 -0
  161. data/lib/rouge/lexers/hql.rb +139 -0
  162. data/lib/rouge/lexers/html.rb +33 -31
  163. data/lib/rouge/lexers/http.rb +10 -9
  164. data/lib/rouge/lexers/hylang.rb +15 -14
  165. data/lib/rouge/lexers/idlang.rb +34 -32
  166. data/lib/rouge/lexers/igorpro.rb +32 -31
  167. data/lib/rouge/lexers/ini.rb +13 -12
  168. data/lib/rouge/lexers/io.rb +10 -9
  169. data/lib/rouge/lexers/irb.rb +6 -5
  170. data/lib/rouge/lexers/isbl.rb +97 -0
  171. data/lib/rouge/lexers/isbl/builtins.rb +17 -0
  172. data/lib/rouge/lexers/java.rb +29 -25
  173. data/lib/rouge/lexers/javascript.rb +58 -61
  174. data/lib/rouge/lexers/jinja.rb +39 -22
  175. data/lib/rouge/lexers/jsl.rb +55 -0
  176. data/lib/rouge/lexers/json.rb +54 -11
  177. data/lib/rouge/lexers/json_doc.rb +8 -5
  178. data/lib/rouge/lexers/jsonnet.rb +19 -18
  179. data/lib/rouge/lexers/jsp.rb +120 -0
  180. data/lib/rouge/lexers/jsx.rb +18 -16
  181. data/lib/rouge/lexers/julia.rb +182 -58
  182. data/lib/rouge/lexers/kotlin.rb +78 -26
  183. data/lib/rouge/lexers/lasso.rb +54 -58
  184. data/lib/rouge/lexers/lasso/keywords.rb +14 -0
  185. data/lib/rouge/lexers/liquid.rb +116 -118
  186. data/lib/rouge/lexers/literate_coffeescript.rb +3 -2
  187. data/lib/rouge/lexers/literate_haskell.rb +6 -5
  188. data/lib/rouge/lexers/llvm.rb +66 -49
  189. data/lib/rouge/lexers/lua.rb +43 -4
  190. data/lib/rouge/lexers/lua/builtins.rb +2 -0
  191. data/lib/rouge/lexers/lustre.rb +79 -0
  192. data/lib/rouge/lexers/lutin.rb +33 -0
  193. data/lib/rouge/lexers/m68k.rb +143 -0
  194. data/lib/rouge/lexers/magik.rb +127 -0
  195. data/lib/rouge/lexers/make.rb +57 -34
  196. data/lib/rouge/lexers/markdown.rb +67 -39
  197. data/lib/rouge/lexers/mason.rb +110 -0
  198. data/lib/rouge/lexers/mathematica.rb +96 -0
  199. data/lib/rouge/lexers/mathematica/builtins.rb +13 -0
  200. data/lib/rouge/lexers/matlab.rb +26 -17
  201. data/lib/rouge/lexers/matlab/builtins.rb +4 -4
  202. data/lib/rouge/lexers/minizinc.rb +87 -0
  203. data/lib/rouge/lexers/moonscript.rb +4 -3
  204. data/lib/rouge/lexers/mosel.rb +64 -63
  205. data/lib/rouge/lexers/msgtrans.rb +26 -0
  206. data/lib/rouge/lexers/mxml.rb +19 -18
  207. data/lib/rouge/lexers/nasm.rb +43 -169
  208. data/lib/rouge/lexers/nesasm.rb +78 -0
  209. data/lib/rouge/lexers/nginx.rb +15 -14
  210. data/lib/rouge/lexers/nim.rb +4 -2
  211. data/lib/rouge/lexers/nix.rb +44 -43
  212. data/lib/rouge/lexers/objective_c.rb +5 -178
  213. data/lib/rouge/lexers/objective_c/common.rb +184 -0
  214. data/lib/rouge/lexers/objective_cpp.rb +31 -0
  215. data/lib/rouge/lexers/ocaml.rb +29 -64
  216. data/lib/rouge/lexers/ocaml/common.rb +53 -0
  217. data/lib/rouge/lexers/openedge.rb +429 -0
  218. data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
  219. data/lib/rouge/lexers/pascal.rb +6 -5
  220. data/lib/rouge/lexers/perl.rb +102 -67
  221. data/lib/rouge/lexers/php.rb +91 -53
  222. data/lib/rouge/lexers/php/builtins.rb +183 -174
  223. data/lib/rouge/lexers/plain_text.rb +2 -1
  224. data/lib/rouge/lexers/plist.rb +16 -14
  225. data/lib/rouge/lexers/pony.rb +21 -20
  226. data/lib/rouge/lexers/powershell.rb +190 -638
  227. data/lib/rouge/lexers/praat.rb +76 -75
  228. data/lib/rouge/lexers/prolog.rb +27 -19
  229. data/lib/rouge/lexers/prometheus.rb +32 -30
  230. data/lib/rouge/lexers/properties.rb +13 -12
  231. data/lib/rouge/lexers/protobuf.rb +23 -22
  232. data/lib/rouge/lexers/puppet.rb +33 -32
  233. data/lib/rouge/lexers/python.rb +124 -99
  234. data/lib/rouge/lexers/q.rb +17 -14
  235. data/lib/rouge/lexers/qml.rb +13 -12
  236. data/lib/rouge/lexers/r.rb +13 -13
  237. data/lib/rouge/lexers/racket.rb +47 -22
  238. data/lib/rouge/lexers/reasonml.rb +65 -0
  239. data/lib/rouge/lexers/rego.rb +45 -0
  240. data/lib/rouge/lexers/robot_framework.rb +249 -0
  241. data/lib/rouge/lexers/ruby.rb +88 -71
  242. data/lib/rouge/lexers/rust.rb +45 -44
  243. data/lib/rouge/lexers/sas.rb +563 -0
  244. data/lib/rouge/lexers/sass.rb +9 -8
  245. data/lib/rouge/lexers/sass/common.rb +41 -40
  246. data/lib/rouge/lexers/scala.rb +67 -40
  247. data/lib/rouge/lexers/scheme.rb +19 -18
  248. data/lib/rouge/lexers/scss.rb +4 -3
  249. data/lib/rouge/lexers/sed.rb +31 -30
  250. data/lib/rouge/lexers/shell.rb +67 -55
  251. data/lib/rouge/lexers/sieve.rb +10 -9
  252. data/lib/rouge/lexers/slice.rb +32 -0
  253. data/lib/rouge/lexers/slim.rb +27 -26
  254. data/lib/rouge/lexers/smalltalk.rb +34 -33
  255. data/lib/rouge/lexers/smarty.rb +20 -19
  256. data/lib/rouge/lexers/sml.rb +68 -67
  257. data/lib/rouge/lexers/solidity.rb +185 -0
  258. data/lib/rouge/lexers/sparql.rb +129 -0
  259. data/lib/rouge/lexers/sqf.rb +109 -0
  260. data/lib/rouge/lexers/sqf/commands.rb +15 -0
  261. data/lib/rouge/lexers/sql.rb +47 -26
  262. data/lib/rouge/lexers/supercollider.rb +116 -0
  263. data/lib/rouge/lexers/swift.rb +49 -44
  264. data/lib/rouge/lexers/tap.rb +22 -20
  265. data/lib/rouge/lexers/tcl.rb +28 -27
  266. data/lib/rouge/lexers/terraform.rb +37 -13
  267. data/lib/rouge/lexers/tex.rb +20 -19
  268. data/lib/rouge/lexers/toml.rb +59 -20
  269. data/lib/rouge/lexers/tsx.rb +1 -0
  270. data/lib/rouge/lexers/ttcn3.rb +119 -0
  271. data/lib/rouge/lexers/tulip.rb +38 -36
  272. data/lib/rouge/lexers/turtle.rb +36 -38
  273. data/lib/rouge/lexers/twig.rb +1 -0
  274. data/lib/rouge/lexers/typescript.rb +12 -0
  275. data/lib/rouge/lexers/typescript/common.rb +1 -0
  276. data/lib/rouge/lexers/vala.rb +19 -18
  277. data/lib/rouge/lexers/varnish.rb +168 -0
  278. data/lib/rouge/lexers/vb.rb +28 -27
  279. data/lib/rouge/lexers/verilog.rb +27 -28
  280. data/lib/rouge/lexers/vhdl.rb +12 -11
  281. data/lib/rouge/lexers/viml.rb +15 -14
  282. data/lib/rouge/lexers/viml/keywords.rb +2 -0
  283. data/lib/rouge/lexers/vue.rb +15 -10
  284. data/lib/rouge/lexers/wollok.rb +27 -26
  285. data/lib/rouge/lexers/xml.rb +18 -21
  286. data/lib/rouge/lexers/xojo.rb +61 -0
  287. data/lib/rouge/lexers/xpath.rb +332 -0
  288. data/lib/rouge/lexers/xquery.rb +145 -0
  289. data/lib/rouge/lexers/yaml.rb +64 -61
  290. data/lib/rouge/lexers/yang.rb +147 -0
  291. data/lib/rouge/plugins/redcarpet.rb +9 -2
  292. data/lib/rouge/regex_lexer.rb +27 -25
  293. data/lib/rouge/template_lexer.rb +1 -0
  294. data/lib/rouge/tex_theme_renderer.rb +132 -0
  295. data/lib/rouge/text_analyzer.rb +1 -0
  296. data/lib/rouge/theme.rb +5 -0
  297. data/lib/rouge/themes/base16.rb +1 -0
  298. data/lib/rouge/themes/bw.rb +41 -0
  299. data/lib/rouge/themes/colorful.rb +1 -0
  300. data/lib/rouge/themes/github.rb +1 -0
  301. data/lib/rouge/themes/gruvbox.rb +1 -0
  302. data/lib/rouge/themes/igor_pro.rb +1 -0
  303. data/lib/rouge/themes/magritte.rb +78 -0
  304. data/lib/rouge/themes/molokai.rb +1 -0
  305. data/lib/rouge/themes/monokai.rb +1 -0
  306. data/lib/rouge/themes/monokai_sublime.rb +4 -1
  307. data/lib/rouge/themes/pastie.rb +2 -1
  308. data/lib/rouge/themes/thankful_eyes.rb +2 -1
  309. data/lib/rouge/themes/tulip.rb +2 -1
  310. data/lib/rouge/token.rb +31 -22
  311. data/lib/rouge/util.rb +3 -2
  312. data/lib/rouge/version.rb +2 -1
  313. data/rouge.gemspec +6 -3
  314. metadata +130 -8
  315. data/lib/rouge/lexers/apache/keywords.yml +0 -764
  316. data/lib/rouge/lexers/lasso/keywords.yml +0 -446
@@ -0,0 +1,2 @@
1
+ (: Authors named Bob Joe who didn't graduate from Harvard :)
2
+ //author[first-name = "Joe" and last-name = "Bob"][degree/@from != "Harvard"]
@@ -0,0 +1,22 @@
1
+ declare namespace html = "http://www.w3.org/1999/xhtml";
2
+
3
+ declare function local:test-function($catalog as document-node()) {
4
+ <html>
5
+ <head>
6
+ <title>XQuery example for the Rouge highlighter</title>
7
+ <link href="style.css"/>
8
+ </head>
9
+ <body>
10
+ <h1>List</h1>
11
+ <ul>
12
+ {for $product in $catalog/items/product[@sell-by > current-date()] return
13
+ <li>
14
+ <ul>
15
+ <li>{data($product/name)}</li>
16
+ <li>{$product/price * (1 + $product/tax)}$</li>
17
+ </ul>
18
+ </li>}
19
+ </ul>
20
+ </body>
21
+ </html>
22
+ };
@@ -0,0 +1,17 @@
1
+ module petstore {
2
+ namespace "http://autlan.dt/gribok/yang/example";
3
+ prefix ex;
4
+
5
+ revision 2020-04-01 {
6
+ description "Example yang";
7
+ }
8
+
9
+ container pets {
10
+ list dogs {
11
+ key name;
12
+ leaf name {
13
+ type string;
14
+ }
15
+ }
16
+ }
17
+ }
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  # A Formatter takes a token stream and formats it for human viewing.
@@ -20,6 +21,26 @@ module Rouge
20
21
  REGISTRY[tag]
21
22
  end
22
23
 
24
+ def self.with_escape
25
+ Thread.current[:'rouge/with-escape'] = true
26
+ yield
27
+ ensure
28
+ Thread.current[:'rouge/with-escape'] = false
29
+ end
30
+
31
+ def self.escape_enabled?
32
+ !!(((defined? @escape_enabled) && @escape_enabled) || Thread.current[:'rouge/with-escape'])
33
+ end
34
+
35
+ def self.enable_escape!
36
+ @escape_enabled = true
37
+ end
38
+
39
+ def self.disable_escape!
40
+ @escape_enabled = false
41
+ Thread.current[:'rouge/with-escape'] = false
42
+ end
43
+
23
44
  # Format a token stream. Delegates to {#format}.
24
45
  def self.format(tokens, *a, &b)
25
46
  new(*a).format(tokens, &b)
@@ -29,11 +50,27 @@ module Rouge
29
50
  # pass
30
51
  end
31
52
 
53
+ def escape?(tok)
54
+ tok == Token::Tokens::Escape
55
+ end
56
+
57
+ def filter_escapes(tokens)
58
+ tokens.each do |t, v|
59
+ if t == Token::Tokens::Escape
60
+ yield Token::Tokens::Error, v
61
+ else
62
+ yield t, v
63
+ end
64
+ end
65
+ end
66
+
32
67
  # Format a token stream.
33
68
  def format(tokens, &b)
69
+ tokens = enum_for(:filter_escapes, tokens) unless Formatter.escape_enabled?
70
+
34
71
  return stream(tokens, &b) if block_given?
35
72
 
36
- out = ''
73
+ out = String.new('')
37
74
  stream(tokens) { |piece| out << piece }
38
75
 
39
76
  out
@@ -57,7 +94,7 @@ module Rouge
57
94
 
58
95
  out = []
59
96
  tokens.each do |tok, val|
60
- val.scan /\n|[^\n]+/ do |s|
97
+ val.scan %r/\n|[^\n]+/ do |s|
61
98
  if s == "\n"
62
99
  yield out
63
100
  out = []
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Formatters
@@ -12,7 +13,9 @@ module Rouge
12
13
  end
13
14
 
14
15
  def span(tok, val)
15
- safe_span(tok, val.gsub(/[&<>]/, TABLE_FOR_ESCAPE_HTML))
16
+ return val if escape?(tok)
17
+
18
+ safe_span(tok, escape_special_html_chars(val))
16
19
  end
17
20
 
18
21
  def safe_span(tok, safe_val)
@@ -26,12 +29,28 @@ module Rouge
26
29
  end
27
30
  end
28
31
 
29
-
30
32
  TABLE_FOR_ESCAPE_HTML = {
31
33
  '&' => '&amp;',
32
34
  '<' => '&lt;',
33
35
  '>' => '&gt;',
34
36
  }
37
+
38
+ private
39
+ # A performance-oriented helper method to escape `&`, `<` and `>` for the rendered
40
+ # HTML from this formatter.
41
+ #
42
+ # `String#gsub` will always return a new string instance irrespective of whether
43
+ # a substitution occurs. This method however invokes `String#gsub` only if
44
+ # a substitution is imminent.
45
+ #
46
+ # Returns either the given `value` argument string as is or a new string with the
47
+ # special characters replaced with their escaped counterparts.
48
+ def escape_special_html_chars(value)
49
+ escape_regex = /[&<>]/
50
+ return value unless value =~ escape_regex
51
+
52
+ value.gsub(escape_regex, TABLE_FOR_ESCAPE_HTML)
53
+ end
35
54
  end
36
55
  end
37
56
  end
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Formatters
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  # stdlib
4
5
  require 'cgi'
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Formatters
6
+ class HTMLLineTable < Formatter
7
+ tag 'html_line_table'
8
+
9
+ # @param [Rouge::Formatters::Formatter] formatter An instance of a
10
+ # `Rouge::Formatters::HTML` or `Rouge::Formatters::HTMLInline`
11
+ # @param [Hash] opts options for HTMLLineTable instance.
12
+ # @option opts [Integer] :start_line line number to start from. Defaults to `1`.
13
+ # @option opts [String] :table_class Class name for the table.
14
+ # Defaults to `"rouge-line-table"`.
15
+ # @option opts [String] :line_id a `sprintf` template for generating an `id`
16
+ # attribute for each table row corresponding to current line number.
17
+ # Defaults to `"line-%i"`.
18
+ # @option opts [String] :line_class Class name for each table row.
19
+ # Defaults to `"lineno"`.
20
+ # @option opts [String] :gutter_class Class name for rendered line-number cell.
21
+ # Defaults to `"rouge-gutter"`.
22
+ # @option opts [String] :code_class Class name for rendered code cell.
23
+ # Defaults to `"rouge-code"`.
24
+ def initialize(formatter, opts={})
25
+ @formatter = formatter
26
+ @start_line = opts.fetch :start_line, 1
27
+ @table_class = opts.fetch :table_class, 'rouge-line-table'
28
+ @gutter_class = opts.fetch :gutter_class, 'rouge-gutter'
29
+ @code_class = opts.fetch :code_class, 'rouge-code'
30
+ @line_class = opts.fetch :line_class, 'lineno'
31
+ @line_id = opts.fetch :line_id, 'line-%i'
32
+ end
33
+
34
+ def stream(tokens, &b)
35
+ lineno = @start_line - 1
36
+ buffer = [%(<table class="#@table_class"><tbody>)]
37
+ token_lines(tokens) do |line_tokens|
38
+ lineno += 1
39
+ buffer << %(<tr id="#{sprintf @line_id, lineno}" class="#@line_class">)
40
+ buffer << %(<td class="#@gutter_class gl" )
41
+ buffer << %(style="-moz-user-select: none;-ms-user-select: none;)
42
+ buffer << %(-webkit-user-select: none;user-select: none;">)
43
+ buffer << %(<pre>#{lineno}</pre></td>)
44
+ buffer << %(<td class="#@code_class"><pre>)
45
+ @formatter.stream(line_tokens) { |formatted| buffer << formatted }
46
+ buffer << "\n</pre></td></tr>"
47
+ end
48
+ buffer << %(</tbody></table>)
49
+ yield buffer.join
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,27 +1,23 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Formatters
5
6
  class HTMLLinewise < Formatter
6
7
  def initialize(formatter, opts={})
7
8
  @formatter = formatter
9
+ @tag_name = opts.fetch(:tag_name, 'div')
8
10
  @class_format = opts.fetch(:class, 'line-%i')
9
11
  end
10
12
 
11
13
  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>'
14
+ lineno = 0
15
+ token_lines(tokens) do |line_tokens|
16
+ yield %(<#{@tag_name} class="#{sprintf @class_format, lineno += 1}">)
17
+ @formatter.stream(line_tokens) {|formatted| yield formatted }
18
+ yield %(\n</#{@tag_name}>)
18
19
  end
19
20
  end
20
-
21
- def next_line_class
22
- @lineno ||= 0
23
- sprintf(@class_format, @lineno += 1).inspect
24
- end
25
21
  end
26
22
  end
27
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Rouge
2
4
  module Formatters
3
5
  class HTMLPygments < Formatter
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Formatters
@@ -15,46 +16,35 @@ module Rouge
15
16
  end
16
17
 
17
18
  def style(scope)
18
- yield "#{scope} .rouge-table { border-spacing: 0 }"
19
- yield "#{scope} .rouge-gutter { text-align: right }"
19
+ yield %(#{scope} .rouge-table { border-spacing: 0 })
20
+ yield %(#{scope} .rouge-gutter { text-align: right })
20
21
  end
21
22
 
22
23
  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"
24
+ last_val = nil
25
+ num_lines = tokens.reduce(0) {|count, (_, val)| count + (last_val = val).count(?\n) }
26
+ formatted = @inner.format(tokens)
27
+ unless last_val && last_val.end_with?(?\n)
35
28
  num_lines += 1
36
- @inner.span(Token::Tokens::Text::Whitespace, "\n") { |str| formatted << str }
29
+ formatted << ?\n
37
30
  end
38
31
 
39
32
  # 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>)
33
+ formatted_line_numbers = (@start_line..(@start_line + num_lines - 1)).map do |i|
34
+ sprintf(@line_format, i)
35
+ end.join(?\n) << ?\n
47
36
 
37
+ buffer = [%(<table class="#@table_class"><tbody><tr>)]
48
38
  # 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>"
39
+ buffer << %(<td class="#@gutter_class gl">)
40
+ buffer << %(<pre class="lineno">#{formatted_line_numbers}</pre>)
41
+ buffer << '</td>'
42
+ buffer << %(<td class="#@code_class"><pre>)
43
+ buffer << formatted
44
+ buffer << '</pre></td>'
45
+ buffer << '</tr></tbody></table>'
46
+
47
+ yield buffer.join
58
48
  end
59
49
  end
60
50
  end
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Formatters
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Formatters
@@ -23,10 +24,7 @@ module Rouge
23
24
 
24
25
  def stream(tokens, &b)
25
26
  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
27
+ escape_sequence(tok).stream_value(val, &b)
30
28
  end
31
29
  end
32
30
 
@@ -84,6 +82,14 @@ module Rouge
84
82
  @bg = style.bg && self.class.color_index(style.bg)
85
83
  end
86
84
 
85
+
86
+ def stream_value(val, &b)
87
+ yield style_string
88
+ yield val.gsub("\e", "\\e")
89
+ .gsub("\n", "#{reset_string}\n#{style_string}")
90
+ yield reset_string
91
+ end
92
+
87
93
  def style_string
88
94
  @style_string ||= begin
89
95
  attrs = []
@@ -156,11 +162,23 @@ module Rouge
156
162
  end
157
163
  end
158
164
 
165
+ class Unescape < EscapeSequence
166
+ def initialize(*) end
167
+ def style_string(*) '' end
168
+ def reset_string(*) '' end
169
+ def stream_value(val) yield val end
170
+ end
171
+
159
172
  # private
160
173
  def escape_sequence(token)
174
+ return Unescape.new if escape?(token)
161
175
  @escape_sequences ||= {}
162
176
  @escape_sequences[token.qualname] ||=
163
- EscapeSequence.new(get_style(token))
177
+ make_escape_sequence(get_style(token))
178
+ end
179
+
180
+ def make_escape_sequence(style)
181
+ EscapeSequence.new(style)
164
182
  end
165
183
 
166
184
  def get_style(token)
@@ -0,0 +1,37 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+ module Rouge
4
+ module Formatters
5
+ class TerminalTruecolor < Terminal256
6
+ tag 'terminal_truecolor'
7
+
8
+ class TruecolorEscapeSequence < Terminal256::EscapeSequence
9
+ def style_string
10
+ @style_string ||= begin
11
+ out = String.new('')
12
+ out << escape(['48', '2', *get_rgb(style.bg)]) if style.bg
13
+ out << escape(['38', '2', *get_rgb(style.fg)]) if style.fg
14
+ out << escape(['1']) if style[:bold] || style[:italic]
15
+ out
16
+ end
17
+ end
18
+
19
+ def get_rgb(color)
20
+ color = $1 if color =~ /#(\h+)/
21
+
22
+ case color.size
23
+ when 3 then color.chars.map { |c| c.to_i(16) * 2 }
24
+ when 6 then color.scan(/../).map { |cc| cc.to_i(16) }
25
+ else
26
+ raise "invalid color: #{color.inspect}"
27
+ end
28
+ end
29
+ end
30
+
31
+ # @override
32
+ def make_escape_sequence(style)
33
+ TruecolorEscapeSequence.new(style)
34
+ end
35
+ end
36
+ end
37
+ end