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
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  # @abstract
@@ -101,21 +102,21 @@ module Rouge
101
102
  callback ||= case next_state
102
103
  when :pop!
103
104
  proc do |stream|
104
- puts " yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
105
+ puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug
105
106
  @output_stream.call(tok, stream[0])
106
107
  puts " popping stack: 1" if @debug
107
108
  @stack.pop or raise 'empty stack!'
108
109
  end
109
110
  when :push
110
111
  proc do |stream|
111
- puts " yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
112
+ puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug
112
113
  @output_stream.call(tok, stream[0])
113
114
  puts " pushing :#{@stack.last.name}" if @debug
114
115
  @stack.push(@stack.last)
115
116
  end
116
117
  when Symbol
117
118
  proc do |stream|
118
- puts " yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
119
+ puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug
119
120
  @output_stream.call(tok, stream[0])
120
121
  state = @states[next_state] || self.class.get_state(next_state)
121
122
  puts " pushing :#{state.name}" if @debug
@@ -123,7 +124,7 @@ module Rouge
123
124
  end
124
125
  when nil
125
126
  proc do |stream|
126
- puts " yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
127
+ puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug
127
128
  @output_stream.call(tok, stream[0])
128
129
  end
129
130
  else
@@ -182,18 +183,18 @@ module Rouge
182
183
  # Define a new state for this lexer with the given name.
183
184
  # The block will be evaluated in the context of a {StateDSL}.
184
185
  def self.state(name, &b)
185
- name = name.to_s
186
+ name = name.to_sym
186
187
  state_definitions[name] = StateDSL.new(name, &b)
187
188
  end
188
189
 
189
190
  def self.prepend(name, &b)
190
- name = name.to_s
191
+ name = name.to_sym
191
192
  dsl = state_definitions[name] or raise "no such state #{name.inspect}"
192
193
  replace_state(name, dsl.prepended(&b))
193
194
  end
194
195
 
195
196
  def self.append(name, &b)
196
- name = name.to_s
197
+ name = name.to_sym
197
198
  dsl = state_definitions[name] or raise "no such state #{name.inspect}"
198
199
  replace_state(name, dsl.appended(&b))
199
200
  end
@@ -203,7 +204,7 @@ module Rouge
203
204
  return name if name.is_a? State
204
205
 
205
206
  states[name.to_sym] ||= begin
206
- defn = state_definitions[name.to_s] or raise "unknown state: #{name.inspect}"
207
+ defn = state_definitions[name.to_sym] or raise "unknown state: #{name.inspect}"
207
208
  defn.to_state(self)
208
209
  end
209
210
  end
@@ -262,6 +263,7 @@ module Rouge
262
263
 
263
264
  until stream.eos?
264
265
  if @debug
266
+ puts
265
267
  puts "lexer: #{self.class.tag}"
266
268
  puts "stack: #{stack.map(&:name).map(&:to_sym).inspect}"
267
269
  puts "stream: #{stream.peek(20).inspect}"
@@ -288,11 +290,11 @@ module Rouge
288
290
  def step(state, stream)
289
291
  state.rules.each do |rule|
290
292
  if rule.is_a?(State)
291
- puts " entering mixin #{rule.name}" if @debug
293
+ puts " entering: mixin :#{rule.name}" if @debug
292
294
  return true if step(rule, stream)
293
- puts " exiting mixin #{rule.name}" if @debug
295
+ puts " exiting: mixin :#{rule.name}" if @debug
294
296
  else
295
- puts " trying #{rule.inspect}" if @debug
297
+ puts " trying: #{rule.inspect}" if @debug
296
298
 
297
299
  # XXX HACK XXX
298
300
  # StringScanner's implementation of ^ is b0rken.
@@ -302,14 +304,14 @@ module Rouge
302
304
  next if rule.beginning_of_line && !stream.beginning_of_line?
303
305
 
304
306
  if (size = stream.skip(rule.re))
305
- puts " got #{stream[0].inspect}" if @debug
307
+ puts " got: #{stream[0].inspect}" if @debug
306
308
 
307
309
  instance_exec(stream, &rule.callback)
308
310
 
309
311
  if size.zero?
310
312
  @null_steps += 1
311
313
  if @null_steps > MAX_NULL_SCANS
312
- puts " too many scans without consuming the string!" if @debug
314
+ puts " warning: too many scans without consuming the string!" if @debug
313
315
  return false
314
316
  end
315
317
  else
@@ -351,20 +353,20 @@ module Rouge
351
353
  end
352
354
  end
353
355
 
354
- # Delegate the lex to another lexer. The #lex method will be called
355
- # with `:continue` set to true, so that #reset! will not be called.
356
- # In this way, a single lexer can be repeatedly delegated to while
357
- # maintaining its own internal state stack.
356
+ # Delegate the lex to another lexer. We use the `continue_lex` method
357
+ # so that #reset! will not be called. In this way, a single lexer
358
+ # can be repeatedly delegated to while maintaining its own internal
359
+ # state stack.
358
360
  #
359
361
  # @param [#lex] lexer
360
362
  # The lexer or lexer class to delegate to
361
363
  # @param [String] text
362
364
  # The text to delegate. This defaults to the last matched string.
363
365
  def delegate(lexer, text=nil)
364
- puts " delegating to #{lexer.inspect}" if @debug
366
+ puts " delegating to: #{lexer.inspect}" if @debug
365
367
  text ||= @current_stream[0]
366
368
 
367
- lexer.lex(text, :continue => true) do |tok, val|
369
+ lexer.continue_lex(text) do |tok, val|
368
370
  puts " delegated token: #{tok.inspect}, #{val.inspect}" if @debug
369
371
  yield_token(tok, val)
370
372
  end
@@ -387,7 +389,7 @@ module Rouge
387
389
  self.state
388
390
  end
389
391
 
390
- puts " pushing :#{push_state.name}" if @debug
392
+ puts " pushing: :#{push_state.name}" if @debug
391
393
  stack.push(push_state)
392
394
  end
393
395
 
@@ -407,7 +409,7 @@ module Rouge
407
409
  def goto(state_name)
408
410
  raise 'empty stack!' if stack.empty?
409
411
 
410
- puts " going to state :#{state_name} " if @debug
412
+ puts " going to: state :#{state_name} " if @debug
411
413
  stack[-1] = get_state(state_name)
412
414
  end
413
415
 
@@ -420,21 +422,21 @@ module Rouge
420
422
 
421
423
  # Check if `state_name` is in the state stack.
422
424
  def in_state?(state_name)
423
- state_name = state_name.to_s
425
+ state_name = state_name.to_sym
424
426
  stack.any? do |state|
425
- state.name == state_name.to_s
427
+ state.name == state_name.to_sym
426
428
  end
427
429
  end
428
430
 
429
431
  # Check if `state_name` is the state on top of the state stack.
430
432
  def state?(state_name)
431
- state_name.to_s == state.name
433
+ state_name.to_sym == state.name
432
434
  end
433
435
 
434
436
  private
435
437
  def yield_token(tok, val)
436
438
  return if val.nil? || val.empty?
437
- puts " yielding #{tok.qualname}, #{val.inspect}" if @debug
439
+ puts " yielding: #{tok.qualname}, #{val.inspect}" if @debug
438
440
  @output_stream.yield(tok, val)
439
441
  end
440
442
  end
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  # @abstract
@@ -0,0 +1,132 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ class TexThemeRenderer
6
+ def initialize(theme, opts={})
7
+ @theme = theme
8
+ @prefix = opts.fetch(:prefix) { 'RG' }
9
+ end
10
+
11
+ # Our general strategy is this:
12
+ #
13
+ # * First, define the \RG{tokname}{content} command, which will
14
+ # expand into \RG@tok@tokname{content}. We use \csname...\endcsname
15
+ # to interpolate into a command.
16
+ #
17
+ # * Define the default RG* environment, which will enclose the whole
18
+ # thing. By default this will simply set \ttfamily (select monospace font)
19
+ # but it can be overridden with \renewcommand by the user to be
20
+ # any other formatting.
21
+ #
22
+ # * Define all the colors using xcolors \definecolor command. First we define
23
+ # every palette color with a name such as RG@palette@themneame@colorname.
24
+ # Then we find all foreground and background colors that have literal html
25
+ # colors embedded in them and define them with names such as
26
+ # RG@palette@themename@000000. While html allows three-letter colors such
27
+ # as #FFF, xcolor requires all six characters to be present, so we make sure
28
+ # to normalize that as well as the case convention in #inline_name.
29
+ #
30
+ # * Define the token commands RG@tok@xx. These will take the content as the
31
+ # argument and format it according to the theme, referring to the color
32
+ # in the palette.
33
+ def render(&b)
34
+ yield <<'END'.gsub('RG', @prefix)
35
+ \makeatletter
36
+ \def\RG#1#2{\csname RG@tok@#1\endcsname{#2}}%
37
+ \newenvironment{RG*}{\ttfamily}{\relax}%
38
+ END
39
+
40
+ base = @theme.class.base_style
41
+ yield "\\definecolor{#{@prefix}@fgcolor}{HTML}{#{inline_name(base.fg || '#000000')}}"
42
+ yield "\\definecolor{#{@prefix}@bgcolor}{HTML}{#{inline_name(base.bg || '#FFFFFF')}}"
43
+
44
+ render_palette(@theme.palette, &b)
45
+
46
+ @theme.styles.each do |tok, style|
47
+ render_inline_pallete(style, &b)
48
+ end
49
+
50
+ Token.each_token do |tok|
51
+ style = @theme.class.get_own_style(tok)
52
+ style ? render_style(tok, style, &b) : render_blank(tok, &b)
53
+ end
54
+ yield '\makeatother'
55
+ end
56
+
57
+ def render_palette(palette, &b)
58
+ palette.each do |name, color|
59
+ hex = inline_name(color)
60
+
61
+ yield "\\definecolor{#{palette_name(name)}}{HTML}{#{hex}}%"
62
+ end
63
+ end
64
+
65
+ def render_inline_pallete(style, &b)
66
+ gen_inline(style[:fg], &b)
67
+ gen_inline(style[:bg], &b)
68
+ end
69
+
70
+ def inline_name(color)
71
+ color =~ /^#(\h+)/ or return nil
72
+
73
+ # xcolor does not support 3-character HTML colors,
74
+ # so we convert them here
75
+ case $1.size
76
+ when 6
77
+ $1
78
+ when 3
79
+ # duplicate every character: abc -> aabbcc
80
+ $1.gsub(/\h/, '\0\0')
81
+ else
82
+ raise "invalid HTML color: #{$1}"
83
+ end.upcase
84
+ end
85
+
86
+ def gen_inline(name, &b)
87
+ # detect inline colors
88
+ hex = inline_name(name)
89
+ return unless hex
90
+
91
+ @gen_inline ||= {}
92
+ @gen_inline[hex] ||= begin
93
+ yield "\\definecolor{#{palette_name(hex)}}{HTML}{#{hex}}%"
94
+ end
95
+ end
96
+
97
+ def camelize(name)
98
+ name.gsub(/_(.)/) { $1.upcase }
99
+ end
100
+
101
+ def palette_name(name)
102
+ name = inline_name(name) || name.to_s
103
+
104
+ "#{@prefix}@palette@#{camelize(@theme.name)}@#{camelize(name.to_s)}"
105
+ end
106
+
107
+ def token_name(tok)
108
+ "\\csname #@prefix@tok@#{tok.shortname}\\endcsname"
109
+ end
110
+
111
+ def render_blank(tok, &b)
112
+ out = "\\expandafter\\def#{token_name(tok)}#1{#1}"
113
+ end
114
+
115
+ def render_style(tok, style, &b)
116
+ out = String.new('')
117
+ out << "\\expandafter\\def#{token_name(tok)}#1{"
118
+ out << "\\fboxsep=0pt\\colorbox{#{palette_name(style[:bg])}}{" if style[:bg]
119
+ out << '\\textbf{' if style[:bold]
120
+ out << '\\textit{' if style[:italic]
121
+ out << "\\textcolor{#{palette_name(style[:fg])}}{" if style[:fg]
122
+ out << "#1"
123
+ # close the right number of curlies
124
+ out << "}" if style[:bold]
125
+ out << "}" if style[:italic]
126
+ out << "}" if style[:fg]
127
+ out << "}" if style[:bg]
128
+ out << "}%"
129
+ yield out
130
+ end
131
+ end
132
+ end
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  class TextAnalyzer < String
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  class Theme
@@ -82,6 +83,10 @@ module Rouge
82
83
  self.class.get_style(token)
83
84
  end
84
85
 
86
+ def name
87
+ self.class.name
88
+ end
89
+
85
90
  class << self
86
91
  def style(*tokens)
87
92
  style = tokens.last.is_a?(Hash) ? tokens.pop : {}
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Themes
@@ -0,0 +1,41 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Themes
6
+ # A port of the bw style from Pygments.
7
+ # See https://bitbucket.org/birkenfeld/pygments-main/src/default/pygments/styles/bw.py
8
+ class BlackWhiteTheme < CSSTheme
9
+ name 'bw'
10
+
11
+ style Text, :fg => '#000000', :bg => '#ffffff'
12
+
13
+ style Comment, :italic => true
14
+ style Comment::Preproc, :italic => false
15
+
16
+ style Keyword, :bold => true
17
+ style Keyword::Pseudo, :bold => false
18
+ style Keyword::Type, :bold => false
19
+
20
+ style Operator, :bold => true
21
+
22
+ style Name::Class, :bold => true
23
+ style Name::Namespace, :bold => true
24
+ style Name::Exception, :bold => true
25
+ style Name::Entity, :bold => true
26
+ style Name::Tag, :bold => true
27
+
28
+ style Literal::String, :italic => true
29
+ style Literal::String::Interpol, :bold => true
30
+ style Literal::String::Escape, :bold => true
31
+
32
+ style Generic::Heading, :bold => true
33
+ style Generic::Subheading, :bold => true
34
+ style Generic::Emph, :italic => true
35
+ style Generic::Strong, :bold => true
36
+ style Generic::Prompt, :bold => true
37
+
38
+ style Error, :fg => '#FF0000'
39
+ end
40
+ end
41
+ end
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Themes
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Themes
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  # TODO how are we going to handle soft/hard contrast?
4
5
 
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Themes
@@ -0,0 +1,78 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Themes
6
+ class Magritte < CSSTheme
7
+ name 'magritte'
8
+
9
+ palette :dragon => '#006c6c'
10
+ palette :black => '#000000'
11
+ palette :forest => '#007500'
12
+ palette :candy => '#ff0089'
13
+ palette :wine => '#7c0000'
14
+ palette :grape => '#4c48fe'
15
+ palette :dark => '#000707'
16
+ palette :cherry => '#f22700'
17
+ palette :white => '#ffffff'
18
+ palette :royal => '#19003a'
19
+
20
+ palette :purple => '#840084'
21
+ palette :chocolate => '#920241'
22
+ palette :lavender => '#d8d9ff'
23
+ palette :eggshell => '#f3ffff'
24
+ palette :yellow => '#ffff3f'
25
+
26
+ palette :lightgray => '#BBBBBB'
27
+ palette :darkgray => '#999999'
28
+
29
+ style Text, :fg => :dark, :bg => :eggshell
30
+ style Generic::Lineno, :fg => :eggshell, :bg => :dark
31
+
32
+ # style Generic::Prompt, :fg => :chilly, :bold => true
33
+
34
+ style Comment, :fg => :dragon, :italic => true
35
+ style Comment::Preproc, :fg => :chocolate, :bold => true
36
+ style Error, :fg => :eggshell, :bg => :cherry
37
+ style Generic::Error, :fg => :cherry, :italic => true, :bold => true
38
+ style Keyword, :fg => :royal, :bold => true
39
+ style Operator, :fg => :grape, :bold => true
40
+ style Punctuation, :fg => :grape
41
+ style Generic::Deleted, :fg => :cherry
42
+ style Generic::Inserted, :fg => :forest
43
+ style Generic::Emph, :italic => true
44
+ style Generic::Strong, :bold => true
45
+ style Generic::Traceback, :fg => :black, :bg => :lavender
46
+ style Keyword::Constant, :fg => :forest, :bold => true
47
+ style Keyword::Namespace,
48
+ Keyword::Pseudo,
49
+ Keyword::Reserved,
50
+ Generic::Heading,
51
+ Generic::Subheading, :fg => :forest, :bold => true
52
+ style Keyword::Type,
53
+ Name::Constant,
54
+ Name::Class,
55
+ Name::Decorator,
56
+ Name::Namespace,
57
+ Name::Builtin::Pseudo,
58
+ Name::Exception, :fg => :chocolate, :bold => true
59
+ style Name::Label,
60
+ Name::Tag, :fg => :purple, :bold => true
61
+ style Literal::Number,
62
+ Literal::Date, :fg => :forest, :bold => true
63
+ style Literal::String::Symbol, :fg => :forest
64
+ style Literal::String, :fg => :wine, :bold => true
65
+ style Literal::String::Escape,
66
+ Literal::String::Char,
67
+ Literal::String::Interpol, :fg => :purple, :bold => true
68
+ style Name::Builtin, :bold => true
69
+ style Name::Entity, :fg => :darkgray, :bold => true
70
+ style Text::Whitespace, :fg => :lightgray
71
+ style Generic::Output, :fg => :royal
72
+ style Name::Function,
73
+ Name::Property,
74
+ Name::Attribute, :fg => :candy
75
+ style Name::Variable, :fg => :candy, :bold => true
76
+ end
77
+ end
78
+ end