rouge 3.19.0 → 3.26.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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rouge.rb +1 -0
  3. data/lib/rouge/cli.rb +32 -2
  4. data/lib/rouge/demos/augeas +16 -0
  5. data/lib/rouge/demos/bibtex +12 -0
  6. data/lib/rouge/demos/brightscript +6 -0
  7. data/lib/rouge/demos/email +11 -0
  8. data/lib/rouge/demos/hlsl +20 -0
  9. data/lib/rouge/demos/j +12 -0
  10. data/lib/rouge/demos/janet +3 -0
  11. data/lib/rouge/demos/livescript +15 -0
  12. data/lib/rouge/demos/ocl +4 -0
  13. data/lib/rouge/demos/postscript +9 -0
  14. data/lib/rouge/demos/rescript +26 -0
  15. data/lib/rouge/demos/ssh +4 -0
  16. data/lib/rouge/demos/systemd +4 -0
  17. data/lib/rouge/demos/velocity +9 -0
  18. data/lib/rouge/demos/zig +6 -0
  19. data/lib/rouge/formatters/html_line_highlighter.rb +24 -0
  20. data/lib/rouge/formatters/html_line_table.rb +1 -3
  21. data/lib/rouge/formatters/html_linewise.rb +2 -3
  22. data/lib/rouge/lexer.rb +38 -20
  23. data/lib/rouge/lexers/apex.rb +9 -7
  24. data/lib/rouge/lexers/augeas.rb +93 -0
  25. data/lib/rouge/lexers/batchfile.rb +3 -2
  26. data/lib/rouge/lexers/bibtex.rb +115 -0
  27. data/lib/rouge/lexers/brightscript.rb +147 -0
  28. data/lib/rouge/lexers/cmake.rb +10 -0
  29. data/lib/rouge/lexers/cpp.rb +12 -5
  30. data/lib/rouge/lexers/crystal.rb +14 -9
  31. data/lib/rouge/lexers/css.rb +3 -1
  32. data/lib/rouge/lexers/diff.rb +1 -1
  33. data/lib/rouge/lexers/docker.rb +2 -2
  34. data/lib/rouge/lexers/elm.rb +5 -5
  35. data/lib/rouge/lexers/email.rb +39 -0
  36. data/lib/rouge/lexers/ghc_core.rb +2 -1
  37. data/lib/rouge/lexers/graphql.rb +1 -1
  38. data/lib/rouge/lexers/hack.rb +1 -1
  39. data/lib/rouge/lexers/haskell.rb +27 -19
  40. data/lib/rouge/lexers/hlsl.rb +166 -0
  41. data/lib/rouge/lexers/html.rb +7 -7
  42. data/lib/rouge/lexers/http.rb +8 -2
  43. data/lib/rouge/lexers/isbl.rb +2 -2
  44. data/lib/rouge/lexers/j.rb +244 -0
  45. data/lib/rouge/lexers/janet.rb +218 -0
  46. data/lib/rouge/lexers/javascript.rb +11 -5
  47. data/lib/rouge/lexers/jinja.rb +22 -7
  48. data/lib/rouge/lexers/jsl.rb +20 -8
  49. data/lib/rouge/lexers/jsonnet.rb +4 -3
  50. data/lib/rouge/lexers/jsp.rb +2 -3
  51. data/lib/rouge/lexers/jsx.rb +47 -59
  52. data/lib/rouge/lexers/julia.rb +4 -2
  53. data/lib/rouge/lexers/kotlin.rb +8 -4
  54. data/lib/rouge/lexers/livescript.rb +310 -0
  55. data/lib/rouge/lexers/ocaml/common.rb +1 -1
  56. data/lib/rouge/lexers/ocl.rb +85 -0
  57. data/lib/rouge/lexers/opentype_feature_file.rb +26 -42
  58. data/lib/rouge/lexers/perl.rb +27 -7
  59. data/lib/rouge/lexers/php.rb +274 -128
  60. data/lib/rouge/lexers/postscript.rb +93 -0
  61. data/lib/rouge/lexers/powershell.rb +44 -32
  62. data/lib/rouge/lexers/python.rb +1 -1
  63. data/lib/rouge/lexers/q.rb +1 -1
  64. data/lib/rouge/lexers/reasonml.rb +6 -5
  65. data/lib/rouge/lexers/rego.rb +27 -12
  66. data/lib/rouge/lexers/rescript.rb +119 -0
  67. data/lib/rouge/lexers/ruby.rb +1 -1
  68. data/lib/rouge/lexers/rust.rb +6 -3
  69. data/lib/rouge/lexers/sass/common.rb +1 -0
  70. data/lib/rouge/lexers/smarty.rb +1 -1
  71. data/lib/rouge/lexers/ssh.rb +33 -0
  72. data/lib/rouge/lexers/systemd.rb +34 -0
  73. data/lib/rouge/lexers/tsx.rb +10 -3
  74. data/lib/rouge/lexers/twig.rb +4 -4
  75. data/lib/rouge/lexers/typescript.rb +1 -12
  76. data/lib/rouge/lexers/typescript/common.rb +18 -4
  77. data/lib/rouge/lexers/velocity.rb +71 -0
  78. data/lib/rouge/lexers/wollok.rb +0 -1
  79. data/lib/rouge/lexers/xml.rb +5 -3
  80. data/lib/rouge/lexers/yaml.rb +5 -3
  81. data/lib/rouge/lexers/zig.rb +139 -0
  82. data/lib/rouge/regex_lexer.rb +56 -1
  83. data/lib/rouge/themes/base16.rb +1 -0
  84. data/lib/rouge/themes/bw.rb +1 -0
  85. data/lib/rouge/themes/colorful.rb +1 -0
  86. data/lib/rouge/themes/github.rb +1 -0
  87. data/lib/rouge/themes/gruvbox.rb +2 -0
  88. data/lib/rouge/themes/igor_pro.rb +1 -0
  89. data/lib/rouge/themes/magritte.rb +1 -0
  90. data/lib/rouge/themes/monokai.rb +1 -0
  91. data/lib/rouge/themes/pastie.rb +1 -0
  92. data/lib/rouge/themes/thankful_eyes.rb +1 -0
  93. data/lib/rouge/themes/tulip.rb +1 -0
  94. data/lib/rouge/version.rb +1 -1
  95. metadata +33 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 31311a77cd2c1bbe0bd0eb402b7b5d0e08c46a91fb9ae7614310b5c022f7707c
4
- data.tar.gz: daa405b54f1c0a249a57d6f5044e52a08a861aece022df92ee311492cfd6d553
3
+ metadata.gz: 3b4023b528780340984bedccbe7068091fe13e092ec69c43972849924928eaf0
4
+ data.tar.gz: 20d90c29a74768ad39ffd84202396ba17be6c67c4d91daef83c7aa11b8bf55a2
5
5
  SHA512:
6
- metadata.gz: 27a79b06908ec8791d6e743817c35dae531e0b171cd35efa43190b384fbb87c74a72fbf5226b233ce8f96e57e2dc31596d91f5bb43307628c41da901544f649f
7
- data.tar.gz: 2bdf4c0aa72e72944e28428ac4c5eea314b01fd3314f037f107f80e43f125471cab7dc1d82ff055337015e231495fa781c6fd0a80db2c6a702346bea915b38af
6
+ metadata.gz: 5ce0c09ee43cf473c4e86dcc74fa84c735cc045080a47fc46e31a40553e8e0e106069b1f8cc2c23bcf76f80a5ba9749717e47a8385e970456b035bdb9ea626aa
7
+ data.tar.gz: 1a54b8b602cc6bca9b1f04c9eebc5353962f6476866f04b48092ffde45511408c6fbfb096fe0b450aa55bf8922ccbb62dd61363e4d71ef198651f49a6a0dac95
data/lib/rouge.rb CHANGED
@@ -83,6 +83,7 @@ Rouge.load_file 'formatters/html_table'
83
83
  Rouge.load_file 'formatters/html_pygments'
84
84
  Rouge.load_file 'formatters/html_legacy'
85
85
  Rouge.load_file 'formatters/html_linewise'
86
+ Rouge.load_file 'formatters/html_line_highlighter'
86
87
  Rouge.load_file 'formatters/html_line_table'
87
88
  Rouge.load_file 'formatters/html_inline'
88
89
  Rouge.load_file 'formatters/terminal256'
data/lib/rouge/cli.rb CHANGED
@@ -44,6 +44,7 @@ module Rouge
44
44
  yield %||
45
45
  yield %|where <command> is one of:|
46
46
  yield %| highlight #{Highlight.desc}|
47
+ yield %| debug #{Debug.desc}|
47
48
  yield %| help #{Help.desc}|
48
49
  yield %| style #{Style.desc}|
49
50
  yield %| list #{List.desc}|
@@ -104,6 +105,8 @@ module Rouge
104
105
  Help
105
106
  when 'highlight', 'hi'
106
107
  Highlight
108
+ when 'debug'
109
+ Debug
107
110
  when 'style'
108
111
  Style
109
112
  when 'list'
@@ -215,7 +218,7 @@ module Rouge
215
218
  end
216
219
  end
217
220
 
218
- def self.parse(argv)
221
+ def self.parse_opts(argv)
219
222
  opts = {
220
223
  :formatter => supports_truecolor? ? 'terminal-truecolor' : 'terminal256',
221
224
  :theme => 'thankful_eyes',
@@ -256,7 +259,11 @@ module Rouge
256
259
  end
257
260
  end
258
261
 
259
- new(opts)
262
+ opts
263
+ end
264
+
265
+ def self.parse(argv)
266
+ new(parse_opts(argv))
260
267
  end
261
268
 
262
269
  def input_stream
@@ -344,6 +351,29 @@ module Rouge
344
351
  end
345
352
  end
346
353
 
354
+ class Debug < Highlight
355
+ def self.desc
356
+ end
357
+
358
+ def self.doc
359
+ return enum_for(:doc) unless block_given?
360
+
361
+ yield %|usage: rougify debug [<options>]|
362
+ yield %||
363
+ yield %|Debug a lexer. Similar options to `rougify highlight`, but|
364
+ yield %|defaults to the `null` formatter, and ensures the `debug`|
365
+ yield %|option is enabled, to print debugging information to stdout.|
366
+ end
367
+
368
+ def self.parse_opts(argv)
369
+ out = super(argv)
370
+ out[:lexer_opts]['debug'] = '1'
371
+ out[:formatter] = 'null'
372
+
373
+ out
374
+ end
375
+ end
376
+
347
377
  class Style < CLI
348
378
  def self.desc
349
379
  "print CSS styles"
@@ -0,0 +1,16 @@
1
+ (*
2
+ This is a comment
3
+ *)
4
+ module Foo =
5
+ autoload xfm
6
+
7
+ let a = b | c . d
8
+
9
+ let lns = a*
10
+
11
+ let filter = incl "/path/to/file"
12
+ . incl "/path/to/other_file"
13
+ . Util.stdexcl
14
+
15
+ (* xmf is the transform *)
16
+ let xmf = transform lns filter
@@ -0,0 +1,12 @@
1
+ @article{Witten:1988hf,
2
+ author = "Witten, Edward",
3
+ title = "{Quantum Field Theory and the Jones Polynomial}",
4
+ journal = "Commun. Math. Phys.",
5
+ volume = "121",
6
+ year = "1989",
7
+ pages = "351-399",
8
+ doi = "10.1007/BF01217730",
9
+ note = "[,233(1988)]",
10
+ reportNumber = "IASSNS-HEP-88-33",
11
+ SLACcitation = "%%CITATION = CMPHA,121,351;%%"
12
+ }
@@ -0,0 +1,6 @@
1
+ function main(args as dynamic) as void
2
+ screen = CreateObject("roSGScreen")
3
+ 'Create a scene and load /components/helloworld.xml'
4
+ scene = screen.CreateScene("HelloWorld")
5
+ screen.show()
6
+ end function
@@ -0,0 +1,11 @@
1
+ From: Me <me@example.com>
2
+ To: You <you@example.com>
3
+ Date: Tue, 21 Jul 2020 15:14:03 +0000
4
+ Subject: A very important message
5
+
6
+ > Please investigate. Thank you.
7
+
8
+ I have investigated.
9
+
10
+ --
11
+ This message is highly confidential and will self-destruct.
@@ -0,0 +1,20 @@
1
+ struct PSInput
2
+ {
3
+ float4 position : SV_POSITION;
4
+ float4 color : COLOR;
5
+ };
6
+
7
+ // Vertex shader
8
+ PSInput VSMain(float4 position : POSITION, float4 color : COLOR)
9
+ {
10
+ PSInput result;
11
+ result.position = position;
12
+ result.color = color;
13
+ return result;
14
+ }
15
+
16
+ // Pixel shader
17
+ float4 PSMain(PSInput input) : SV_TARGET
18
+ {
19
+ return input.color;
20
+ }
data/lib/rouge/demos/j ADDED
@@ -0,0 +1,12 @@
1
+ NB. Procedural programming
2
+ fizzbuzz=: monad define
3
+ for_i. >:i.y do.
4
+ if. 0 = 15 | i do. echo'FizzBuzz'
5
+ elseif. 0 = 3 | i do. echo'Fizz'
6
+ elseif. 0 = 5 | i do. echo'Buzz'
7
+ else. echo i
8
+ end.
9
+ end.
10
+ )
11
+ NB. Loopless programming
12
+ fizzbuzz=: echo@(, ::] ('Fizz' ; 'Buzz') ;@#~ 0 = 3 5&|)@>:@i.
@@ -0,0 +1,3 @@
1
+ (defn a-fun
2
+ "A function"
3
+ (do-something))
@@ -0,0 +1,15 @@
1
+ mitch =
2
+ age: 21
3
+ height: 180cm
4
+ pets: [\dog, \goldfish]
5
+
6
+ phile = {}
7
+ phile{height, pets} = mitch
8
+ phile.height #=> 180
9
+ phile.pets #=> ['dog', 'goldfish']
10
+
11
+ a = [2 7 1 8]
12
+ ..push 3
13
+ ..shift!
14
+ ..sort!
15
+ a #=> [1,3,7,8]
@@ -0,0 +1,4 @@
1
+ context Compagnie::toEuros() : Collection(Real)
2
+ body: self.employees->collect(each: Employee| each.salary/ 6.55957)
3
+ -- OR
4
+ body: self.employees->collect(salary) -> collect(x | x/6.55957)
@@ -0,0 +1,9 @@
1
+ %!PS
2
+ /Courier % name the desired font
3
+ 20 selectfont % choose the size in points and establish
4
+ % the font as the current one
5
+ 72 500 moveto % position the current point at
6
+ % coordinates 72, 500 (the origin is at the
7
+ % lower-left corner of the page)
8
+ (Hello world!) show % stroke the text in parentheses
9
+ showpage % print all on the page
@@ -0,0 +1,26 @@
1
+ module Person = {
2
+ type t = Teacher | Director | Student(string)
3
+
4
+ let greeting = person =>
5
+ switch person {
6
+ | Teacher => "Hey Professor!"
7
+ | Director => "Hello Director."
8
+ | Student("Richard") => "Still here Ricky?"
9
+ | Student(other) => "Hey, " ++ other ++ "."
10
+ }
11
+ }
12
+
13
+ module Button = {
14
+ @react.component
15
+ let make = (~count: int, ~onClick) => {
16
+ let times = switch count {
17
+ | 1 => "once"
18
+ | 2 => "twice"
19
+ | n => Belt.Int.toString(n) ++ " times"
20
+ }
21
+
22
+ let msg = "Click me " ++ times
23
+
24
+ <button onClick> {msg->React.string} </button>
25
+ }
26
+ }
@@ -0,0 +1,4 @@
1
+ Host example
2
+ Hostname example.com
3
+ User user
4
+ Port 1234
@@ -0,0 +1,4 @@
1
+ [Unit]
2
+ Description=Snap Daemon
3
+ Requires=snapd.socket
4
+ OnFailure=snapd.failure.service
@@ -0,0 +1,9 @@
1
+ #*
2
+ There is multi-line comment.
3
+ see this text because the Velocity Templating Engine will ignore it.
4
+ *#
5
+ <h3>List</h3>
6
+ ## This is a single line comment.
7
+ #if( $allProducts )
8
+ <p>not found.</p>
9
+ #end
@@ -0,0 +1,6 @@
1
+ const std = @import("std");
2
+ const warn = std.debug.warn;
3
+
4
+ fn add_floats(x: f16, y: f16) f16 {
5
+ return x + y;
6
+ }
@@ -0,0 +1,24 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Formatters
6
+ class HTMLLineHighlighter < Formatter
7
+ tag 'html_line_highlighter'
8
+
9
+ def initialize(delegate, opts = {})
10
+ @delegate = delegate
11
+ @highlight_line_class = opts.fetch(:highlight_line_class, 'hll')
12
+ @highlight_lines = opts[:highlight_lines] || []
13
+ end
14
+
15
+ def stream(tokens)
16
+ token_lines(tokens).with_index(1) do |line_tokens, lineno|
17
+ line = %(#{@delegate.format(line_tokens)}\n)
18
+ line = %(<span class="#{@highlight_line_class}">#{line}</span>) if @highlight_lines.include? lineno
19
+ yield line
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -32,10 +32,8 @@ module Rouge
32
32
  end
33
33
 
34
34
  def stream(tokens, &b)
35
- lineno = @start_line - 1
36
35
  buffer = [%(<table class="#@table_class"><tbody>)]
37
- token_lines(tokens) do |line_tokens|
38
- lineno += 1
36
+ token_lines(tokens).with_index(@start_line) do |line_tokens, lineno|
39
37
  buffer << %(<tr id="#{sprintf @line_id, lineno}" class="#@line_class">)
40
38
  buffer << %(<td class="#@gutter_class gl" )
41
39
  buffer << %(style="-moz-user-select: none;-ms-user-select: none;)
@@ -11,9 +11,8 @@ module Rouge
11
11
  end
12
12
 
13
13
  def stream(tokens, &b)
14
- lineno = 0
15
- token_lines(tokens) do |line_tokens|
16
- yield %(<#{@tag_name} class="#{sprintf @class_format, lineno += 1}">)
14
+ token_lines(tokens).with_index(1) do |line_tokens, lineno|
15
+ yield %(<#{@tag_name} class="#{sprintf @class_format, lineno}">)
17
16
  @formatter.stream(line_tokens) {|formatted| yield formatted }
18
17
  yield %(\n</#{@tag_name}>)
19
18
  end
data/lib/rouge/lexer.rb CHANGED
@@ -38,28 +38,15 @@ module Rouge
38
38
  registry[name.to_s]
39
39
  end
40
40
 
41
- # Find a lexer, with fancy shiny features.
42
- #
43
- # * The string you pass can include CGI-style options
44
- #
45
- # Lexer.find_fancy('erb?parent=tex')
46
- #
47
- # * You can pass the special name 'guess' so we guess for you,
48
- # and you can pass a second argument of the code to guess by
49
- #
50
- # Lexer.find_fancy('guess', "#!/bin/bash\necho Hello, world")
41
+ # Same as ::find_fancy, except instead of returning an instantiated
42
+ # lexer, returns a pair of [lexer_class, options], so that you can
43
+ # modify or provide additional options to the lexer.
51
44
  #
52
- # If the code matches more than one lexer then Guesser::Ambiguous
53
- # is raised.
54
- #
55
- # This is used in the Redcarpet plugin as well as Rouge's own
56
- # markdown lexer for highlighting internal code blocks.
57
- #
58
- def find_fancy(str, code=nil, additional_options={})
59
-
45
+ # Please note: the lexer class might be nil!
46
+ def lookup_fancy(str, code=nil, default_options={})
60
47
  if str && !str.include?('?') && str != 'guess'
61
48
  lexer_class = find(str)
62
- return lexer_class && lexer_class.new(additional_options)
49
+ return [lexer_class, default_options]
63
50
  end
64
51
 
65
52
  name, opts = str ? str.split('?', 2) : [nil, '']
@@ -75,7 +62,7 @@ module Rouge
75
62
  [ k.to_s, val ]
76
63
  end
77
64
 
78
- opts = additional_options.merge(Hash[opts])
65
+ opts = default_options.merge(Hash[opts])
79
66
 
80
67
  lexer_class = case name
81
68
  when 'guess', nil
@@ -84,6 +71,29 @@ module Rouge
84
71
  self.find(name)
85
72
  end
86
73
 
74
+ [lexer_class, opts]
75
+ end
76
+
77
+ # Find a lexer, with fancy shiny features.
78
+ #
79
+ # * The string you pass can include CGI-style options
80
+ #
81
+ # Lexer.find_fancy('erb?parent=tex')
82
+ #
83
+ # * You can pass the special name 'guess' so we guess for you,
84
+ # and you can pass a second argument of the code to guess by
85
+ #
86
+ # Lexer.find_fancy('guess', "#!/bin/bash\necho Hello, world")
87
+ #
88
+ # If the code matches more than one lexer then Guesser::Ambiguous
89
+ # is raised.
90
+ #
91
+ # This is used in the Redcarpet plugin as well as Rouge's own
92
+ # markdown lexer for highlighting internal code blocks.
93
+ #
94
+ def find_fancy(str, code=nil, default_options={})
95
+ lexer_class, opts = lookup_fancy(str, code, default_options)
96
+
87
97
  lexer_class && lexer_class.new(opts)
88
98
  end
89
99
 
@@ -317,6 +327,14 @@ module Rouge
317
327
  @debug = Lexer.debug_enabled? && bool_option('debug')
318
328
  end
319
329
 
330
+ # Returns a new lexer with the given options set. Useful for e.g. setting
331
+ # debug flags post hoc, or providing global overrides for certain options
332
+ def with(opts={})
333
+ new_options = @options.dup
334
+ opts.each { |k, v| new_options[k.to_s] = v }
335
+ self.class.new(new_options)
336
+ end
337
+
320
338
  def as_bool(val)
321
339
  case val
322
340
  when nil, false, 0, '0', 'false', 'off'
@@ -49,7 +49,7 @@ module Rouge
49
49
 
50
50
  state :root do
51
51
  rule %r/\s+/m, Text
52
-
52
+
53
53
  rule %r(//.*?$), Comment::Single
54
54
  rule %r(/\*.*?\*/)m, Comment::Multiline
55
55
 
@@ -57,17 +57,19 @@ module Rouge
57
57
  rule %r/import\b/, Keyword::Namespace, :import
58
58
 
59
59
  rule %r/([@$.]?)(#{id})([:(]?)/io do |m|
60
- if self.class.keywords.include? m[0].downcase
60
+ lowercased = m[0].downcase
61
+ uppercased = m[0].upcase
62
+ if self.class.keywords.include? lowercased
61
63
  token Keyword
62
- elsif self.class.soql.include? m[0].upcase
64
+ elsif self.class.soql.include? uppercased
63
65
  token Keyword
64
- elsif self.class.declarations.include? m[0].downcase
66
+ elsif self.class.declarations.include? lowercased
65
67
  token Keyword::Declaration
66
- elsif self.class.types.include? m[0].downcase
68
+ elsif self.class.types.include? lowercased
67
69
  token Keyword::Type
68
- elsif self.class.constants.include? m[0].downcase
70
+ elsif self.class.constants.include? lowercased
69
71
  token Keyword::Constant
70
- elsif 'package'.casecmp m[0]
72
+ elsif lowercased == 'package'
71
73
  token Keyword::Namespace
72
74
  elsif m[1] == "@"
73
75
  token Name::Decorator