rouge 3.3.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +14 -2
  3. data/lib/rouge.rb +45 -41
  4. data/lib/rouge/cli.rb +26 -2
  5. data/lib/rouge/demos/escape +3 -0
  6. data/lib/rouge/demos/supercollider +11 -0
  7. data/lib/rouge/demos/xojo +13 -0
  8. data/lib/rouge/formatter.rb +36 -0
  9. data/lib/rouge/formatters/html.rb +2 -0
  10. data/lib/rouge/formatters/html_linewise.rb +6 -11
  11. data/lib/rouge/formatters/html_table.rb +20 -31
  12. data/lib/rouge/formatters/terminal256.rb +1 -0
  13. data/lib/rouge/guessers/disambiguation.rb +13 -0
  14. data/lib/rouge/guessers/source.rb +1 -1
  15. data/lib/rouge/lexer.rb +44 -13
  16. data/lib/rouge/lexers/c.rb +6 -29
  17. data/lib/rouge/lexers/coffeescript.rb +14 -6
  18. data/lib/rouge/lexers/common_lisp.rb +1 -1
  19. data/lib/rouge/lexers/console.rb +2 -2
  20. data/lib/rouge/lexers/coq.rb +1 -1
  21. data/lib/rouge/lexers/csharp.rb +0 -1
  22. data/lib/rouge/lexers/diff.rb +8 -4
  23. data/lib/rouge/lexers/docker.rb +1 -1
  24. data/lib/rouge/lexers/escape.rb +55 -0
  25. data/lib/rouge/lexers/go.rb +1 -1
  26. data/lib/rouge/lexers/graphql.rb +10 -0
  27. data/lib/rouge/lexers/html.rb +1 -0
  28. data/lib/rouge/lexers/java.rb +4 -0
  29. data/lib/rouge/lexers/javascript.rb +12 -16
  30. data/lib/rouge/lexers/jinja.rb +15 -1
  31. data/lib/rouge/lexers/julia.rb +140 -17
  32. data/lib/rouge/lexers/kotlin.rb +11 -4
  33. data/lib/rouge/lexers/markdown.rb +21 -4
  34. data/lib/rouge/lexers/matlab.rb +9 -2
  35. data/lib/rouge/lexers/objective_c.rb +7 -12
  36. data/lib/rouge/lexers/perl.rb +38 -6
  37. data/lib/rouge/lexers/powershell.rb +1 -1
  38. data/lib/rouge/lexers/rust.rb +1 -1
  39. data/lib/rouge/lexers/scala.rb +28 -2
  40. data/lib/rouge/lexers/shell.rb +1 -1
  41. data/lib/rouge/lexers/slim.rb +2 -2
  42. data/lib/rouge/lexers/supercollider.rb +116 -0
  43. data/lib/rouge/lexers/xml.rb +1 -1
  44. data/lib/rouge/lexers/xojo.rb +61 -0
  45. data/lib/rouge/regex_lexer.rb +12 -12
  46. data/lib/rouge/themes/bw.rb +41 -0
  47. data/lib/rouge/token.rb +30 -22
  48. data/lib/rouge/version.rb +1 -1
  49. metadata +10 -4
@@ -19,9 +19,9 @@ module Rouge
19
19
  external false final finally for fun get if import in infix
20
20
  inline inner interface internal is lateinit noinline null
21
21
  object open operator out override package private protected
22
- public reified return sealed set super tailrec this throw
23
- true try typealias typeof val var vararg when where while
24
- yield
22
+ public reified return sealed set super suspend tailrec this
23
+ throw true try typealias typeof val var vararg when where
24
+ while yield
25
25
  )
26
26
 
27
27
  name = %r'@?[_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}][\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}\p{Nd}\p{Pc}\p{Cf}\p{Mn}\p{Mc}]*'
@@ -73,7 +73,8 @@ module Rouge
73
73
  rule %r'[^\S\n]+', Text
74
74
  rule %r'\\\n', Text # line continuation
75
75
  rule %r'//.*?$', Comment::Single
76
- rule %r'/[*].*?[*]/'m, Comment::Multiline
76
+ rule %r'/[*].*[*]/', Comment::Multiline # single line block comment
77
+ rule %r'/[*].*', Comment::Multiline, :comment # multiline block comment
77
78
  rule %r'\n', Text
78
79
  rule %r'::|!!|\?[:.]', Operator
79
80
  rule %r"(\.\.)", Operator
@@ -122,6 +123,12 @@ module Rouge
122
123
  rule %r'(\s+)', Text
123
124
  rule id, Name::Property
124
125
  end
126
+
127
+ state :comment do
128
+ rule %r'\s*/[*].*', Comment::Multiline, :comment
129
+ rule %r'.*[*]/', Comment::Multiline, :pop!
130
+ rule %r'.*', Comment::Multiline
131
+ end
125
132
  end
126
133
  end
127
134
  end
@@ -32,16 +32,33 @@ module Rouge
32
32
  rule /^#(?=[^#]).*?$/, Generic::Heading
33
33
  rule /^##*.*?$/, Generic::Subheading
34
34
 
35
- rule /(\n[ \t]*)(```|~~~)(.*?)(\n.*?\n)(\2)/m do |m|
36
- sublexer = Lexer.find_fancy(m[3].strip, m[4], @options)
35
+ rule /^([ \t]*)(```|~~~)([^\n]*\n)((.*?)(\2))?/m do |m|
36
+ name = m[3].strip
37
+ sublexer = Lexer.find_fancy(name.empty? ? "guess" : name, m[5], @options)
37
38
  sublexer ||= PlainText.new(@options.merge(:token => Str::Backtick))
38
39
  sublexer.reset!
39
40
 
40
41
  token Text, m[1]
41
42
  token Punctuation, m[2]
42
43
  token Name::Label, m[3]
43
- delegate sublexer, m[4]
44
- token Punctuation, m[5]
44
+ if m[5]
45
+ delegate sublexer, m[5]
46
+ end
47
+
48
+ if m[6]
49
+ token Punctuation, m[6]
50
+ else
51
+ push do
52
+ rule /^([ \t]*)(#{m[2]})/ do |mb|
53
+ pop!
54
+ token Text, mb[1]
55
+ token Punctuation, mb[2]
56
+ end
57
+ rule /^.*\n/ do |mb|
58
+ delegate sublexer, mb[1]
59
+ end
60
+ end
61
+ end
45
62
  end
46
63
 
47
64
  rule /\n\n(( |\t).*?\n|\n)+/, Str::Backtick
@@ -58,15 +58,22 @@ module Rouge
58
58
  rule /\d+L/, Num::Integer::Long
59
59
  rule /\d+/, Num::Integer
60
60
 
61
- rule /'(?=(.*'))/, Str::Single, :string
61
+ rule /'(?=(.*'))/, Str::Single, :chararray
62
+ rule /"(?=(.*"))/, Str::Double, :string
62
63
  rule /'/, Operator
63
64
  end
64
65
 
65
- state :string do
66
+ state :chararray do
66
67
  rule /[^']+/, Str::Single
67
68
  rule /''/, Str::Escape
68
69
  rule /'/, Str::Single, :pop!
69
70
  end
71
+
72
+ state :string do
73
+ rule /[^"]+/, Str::Double
74
+ rule /""/, Str::Escape
75
+ rule /"/, Str::Double, :pop!
76
+ end
70
77
  end
71
78
  end
72
79
  end
@@ -44,15 +44,8 @@ module Rouge
44
44
  rule /@\d+l?/, Num::Integer
45
45
  rule /\bin\b/, Keyword
46
46
 
47
- rule /@(?:interface|implementation)\b/ do
48
- token Keyword
49
- goto :classname
50
- end
51
-
52
- rule /@(?:class|protocol)\b/ do
53
- token Keyword
54
- goto :forward_classname
55
- end
47
+ rule /@(?:interface|implementation)\b/, Keyword, :classname
48
+ rule /@(?:class|protocol)\b/, Keyword, :forward_classname
56
49
 
57
50
  rule /@([[:alnum:]]+)/ do |m|
58
51
  if self.class.at_keywords.include? m[1]
@@ -80,7 +73,7 @@ module Rouge
80
73
  rule /\{/, Punctuation, :pop!
81
74
  rule /;/, Error
82
75
 
83
- mixin :statement
76
+ mixin :statements
84
77
  end
85
78
 
86
79
  state :message do
@@ -160,8 +153,10 @@ module Rouge
160
153
  ([(].*?[)])?(\s*)
161
154
  (?=#{id}:?)
162
155
  )ix do |m|
163
- token Keyword, m[1]; token Text, m[2]
164
- recurse m[3]; token Text, m[4]
156
+ token Keyword, m[1]
157
+ token Text, m[2]
158
+ recurse(m[3]) if m[3]
159
+ token Text, m[4]
165
160
  push :method_definition
166
161
  end
167
162
  end
@@ -93,9 +93,10 @@ module Rouge
93
93
  rule %r(m?/(\\\\|\\/|[^/\n])*/[msixpodualngc]*), re_tok
94
94
  rule %r(m(?=[/!\\{<\[\(@%\$])), re_tok, :balanced_regex
95
95
 
96
- # Perl allows any non-whitespace character to delimit
97
- # a regex when `m` is used.
98
- rule %r(m(\S).*\1[msixpodualngc]*), re_tok
96
+ # arbitrary non-whitespace delimiters
97
+ rule %r(m\s*([^\w\s])((\\\\|\\\1)|[^\1])*?\1[msixpodualngc]*)m, re_tok
98
+ rule %r(m\s+(\w)((\\\\|\\\1)|[^\1])*?\1[msixpodualngc]*)m, re_tok
99
+
99
100
  rule %r(((?<==~)|(?<=\())\s*/(\\\\|\\/|[^/])*/[msixpodualngc]*),
100
101
  re_tok, :balanced_regex
101
102
 
@@ -120,9 +121,9 @@ module Rouge
120
121
  rule /\d+(_\d*)*e[+-]?\d+(_\d*)*/i, Num::Float
121
122
  rule /\d+(_\d+)*/, Num::Integer
122
123
 
123
- rule /'(\\\\|\\'|[^'])*'/, Str
124
- rule /"(\\\\|\\"|[^"])*"/, Str
125
- rule /`(\\\\|\\`|[^`])*`/, Str::Backtick
124
+ rule /'/, Punctuation, :sq
125
+ rule /"/, Punctuation, :dq
126
+ rule /`/, Punctuation, :bq
126
127
  rule /<([^\s>]+)>/, re_tok
127
128
  rule /(q|qq|qw|qr|qx)\{/, Str::Other, :cb_string
128
129
  rule /(q|qq|qw|qr|qx)\(/, Str::Other, :rb_string
@@ -178,6 +179,26 @@ module Rouge
178
179
  rule /;/, Punctuation, :pop!
179
180
  end
180
181
 
182
+ state :sq do
183
+ rule /\\[']/, Str::Escape
184
+ rule /[^\\']+/, Str::Single
185
+ rule /'/, Punctuation, :pop!
186
+ end
187
+
188
+ state :dq do
189
+ mixin :string_intp
190
+ rule /\\[\\tnr"]/, Str::Escape
191
+ rule /[^\\"]+?/, Str::Double
192
+ rule /"/, Punctuation, :pop!
193
+ end
194
+
195
+ state :bq do
196
+ mixin :string_intp
197
+ rule /\\[\\tnr`]/, Str::Escape
198
+ rule /[^\\`]+?/, Str::Backtick
199
+ rule /`/, Punctuation, :pop!
200
+ end
201
+
181
202
  [[:cb, '\{', '\}'],
182
203
  [:rb, '\(', '\)'],
183
204
  [:sb, '\[', '\]'],
@@ -192,6 +213,17 @@ module Rouge
192
213
  end
193
214
  end
194
215
 
216
+ state :in_interp do
217
+ rule /}/, Str::Interpol, :pop!
218
+ rule /\s+/, Text
219
+ rule /[a-z_]\w*/i, Str::Interpol
220
+ end
221
+
222
+ state :string_intp do
223
+ rule /[$@][{]/, Str::Interpol, :in_interp
224
+ rule /[$@][a-z_]\w*/i, Str::Interpol
225
+ end
226
+
195
227
  state :end_part do
196
228
  # eat the rest of the stream
197
229
  rule /.+/m, Comment::Preproc, :pop!
@@ -9,7 +9,7 @@ module Rouge
9
9
  title 'powershell'
10
10
  desc 'powershell'
11
11
  tag 'powershell'
12
- aliases 'posh'
12
+ aliases 'posh', 'microsoftshell', 'msshell'
13
13
  filenames '*.ps1', '*.psm1', '*.psd1', '*.psrc', '*.pssc'
14
14
  mimetypes 'text/x-powershell'
15
15
 
@@ -56,7 +56,7 @@ module Rouge
56
56
  id = /[a-z_]\w*/i
57
57
  hex = /[0-9a-f]/i
58
58
  escapes = %r(
59
- \\ ([nrt'\\] | x#{hex}{2} | u#{hex}{4} | U#{hex}{8})
59
+ \\ ([nrt'"\\0] | x#{hex}{2} | u#{hex}{4} | U#{hex}{8})
60
60
  )x
61
61
  size = /8|16|32|64/
62
62
 
@@ -47,12 +47,38 @@ module Rouge
47
47
  rule %r(/\*), Comment::Multiline, :comment
48
48
 
49
49
  rule /@#{idrest}/, Name::Decorator
50
+
51
+ rule /(def)(\s+)(#{idrest}|#{op}+|`[^`]+`)(\s*)/ do
52
+ groups Keyword, Text, Name::Function, Text
53
+ end
54
+
55
+ rule /(val)(\s+)(#{idrest}|#{op}+|`[^`]+`)(\s*)/ do
56
+ groups Keyword, Text, Name::Variable, Text
57
+ end
58
+
59
+ rule /(this)(\n*)(\.)(#{idrest})/ do
60
+ groups Keyword, Text, Operator, Name::Property
61
+ end
62
+
63
+ rule /(#{idrest}|_)(\n*)(\.)(#{idrest})/ do
64
+ groups Name::Variable, Text, Operator, Name::Property
65
+ end
66
+
67
+ rule /#{upper}#{idrest}\b/, Name::Class
68
+
69
+ rule /(#{idrest})(#{whitespace}*)(\()/ do
70
+ groups Name::Function, Text, Operator
71
+ end
72
+
73
+ rule /(\.)(#{idrest})/ do
74
+ groups Operator, Name::Property
75
+ end
76
+
50
77
  rule %r(
51
78
  (#{keywords.join("|")})\b|
52
79
  (<[%:-]|=>|>:|[#=@_\u21D2\u2190])(\b|(?=\s)|$)
53
80
  )x, Keyword
54
- rule /:(?!#{op})/, Keyword, :type
55
- rule /#{upper}#{idrest}\b/, Name::Class
81
+ rule /:(?!#{op})/, Keyword, :type
56
82
  rule /(true|false|null)\b/, Keyword::Constant
57
83
  rule /(import|package)(\s+)/ do
58
84
  groups Keyword, Text
@@ -10,7 +10,7 @@ module Rouge
10
10
  tag 'shell'
11
11
  aliases 'bash', 'zsh', 'ksh', 'sh'
12
12
  filenames '*.sh', '*.bash', '*.zsh', '*.ksh',
13
- '.bashrc', '.zshrc', '.kshrc', '.profile', 'PKGBUILD'
13
+ '.bashrc', '.zshrc', '.kshrc', '.profile', 'APKBUILD', 'PKGBUILD'
14
14
 
15
15
  mimetypes 'application/x-sh', 'application/x-shellscript'
16
16
 
@@ -172,9 +172,9 @@ module Rouge
172
172
  # Need at top
173
173
  mixin :indented_block
174
174
 
175
- rule(/,\s*\n/) { delegate ruby }
175
+ rule(/[,\\]\s*\n/) { delegate ruby }
176
176
  rule /[ ]\|[ \t]*\n/, Str::Escape
177
- rule(/.*?(?=(,$| \|)?[ \t]*$)/) { delegate ruby }
177
+ rule(/.*?(?=([,\\]$| \|)?[ \t]*$)/) { delegate ruby }
178
178
  end
179
179
 
180
180
  state :filter_block do
@@ -0,0 +1,116 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class SuperCollider < RegexLexer
7
+ tag 'supercollider'
8
+ filenames '*.sc', '*.scd'
9
+
10
+ title "SuperCollider"
11
+ desc 'A cross-platform interpreted programming language for sound synthesis, algorithmic composition, and realtime performance'
12
+
13
+ def self.keywords
14
+ @keywords ||= Set.new %w(
15
+ var arg classvar const super this
16
+ )
17
+ end
18
+
19
+ # these aren't technically keywords, but we treat
20
+ # them as such because it makes things clearer 99%
21
+ # of the time
22
+ def self.reserved
23
+ @reserved ||= Set.new %w(
24
+ case do for forBy loop if while new newCopyArgs
25
+ )
26
+ end
27
+
28
+ def self.constants
29
+ @constants ||= Set.new %w(
30
+ true false nil inf thisThread
31
+ thisMethod thisFunction thisProcess
32
+ thisFunctionDef currentEnvironment
33
+ topEnvironment
34
+ )
35
+ end
36
+
37
+ state :whitespace do
38
+ rule /\s+/m, Text
39
+ end
40
+
41
+ state :comments do
42
+ rule %r(//.*?$), Comment::Single
43
+ rule %r(/[*]) do
44
+ token Comment::Multiline
45
+ push :nested_comment
46
+ end
47
+ end
48
+
49
+ state :nested_comment do
50
+ rule %r(/[*]), Comment::Multiline, :nested_comment
51
+ rule %r([*]/), Comment::Multiline, :pop!
52
+ rule %r([^*/]+)m, Comment::Multiline
53
+ rule /./, Comment::Multiline
54
+ end
55
+
56
+ state :root do
57
+ mixin :whitespace
58
+ mixin :comments
59
+
60
+ rule /[\-+]?0[xX]\h+/, Num::Hex
61
+
62
+ # radix float
63
+ rule /[\-+]?\d+r[0-9a-zA-Z]*(\.[0-9A-Z]*)?/, Num::Float
64
+
65
+ # normal float
66
+ rule /[\-+]?((\d+(\.\d+)?([eE][\-+]?\d+)?(pi)?)|pi)/, Num::Float
67
+
68
+ rule /[\-+]?\d+/, Num::Integer
69
+
70
+ rule /\$(\\.|.)/, Str::Char
71
+
72
+ rule /"([^\\"]|\\.)*"/, Str
73
+
74
+ # symbols (single-quote notation)
75
+ rule /'([^\\']|\\.)*'/, Str::Other
76
+
77
+ # symbols (backslash notation)
78
+ rule /\\\w+/, Str::Other
79
+
80
+ # symbol arg
81
+ rule /[A-Za-z_]\w*:/, Name::Label
82
+
83
+ rule /[A-Z]\w*/, Name::Class
84
+
85
+ # primitive
86
+ rule /_\w+/, Name::Function
87
+
88
+ # main identifiers section
89
+ rule /[a-z]\w*/ do |m|
90
+ if self.class.keywords.include? m[0]
91
+ token Keyword
92
+ elsif self.class.constants.include? m[0]
93
+ token Keyword::Constant
94
+ elsif self.class.reserved.include? m[0]
95
+ token Keyword::Reserved
96
+ else
97
+ token Name
98
+ end
99
+ end
100
+
101
+ # environment variables
102
+ rule /~\w+/, Name::Variable::Global
103
+
104
+ rule /[\{\}()\[\];,\.]/, Punctuation
105
+
106
+ # operators. treat # (array unpack) as an operator
107
+ rule /[\+\-\*\/&\|%<>=]+/, Operator
108
+ rule /[\^:#]/, Operator
109
+
110
+ # treat curry argument as a special operator
111
+ rule /\b_\b/, Name::Builtin
112
+ end
113
+ end
114
+ end
115
+ end
116
+
@@ -7,7 +7,7 @@ module Rouge
7
7
  title "XML"
8
8
  desc %q(<desc for="this-lexer">XML</desc>)
9
9
  tag 'xml'
10
- filenames *%w(*.xml *.xsl *.rss *.xslt *.xsd *.wsdl *.svg)
10
+ filenames *%w(*.xml *.xsl *.rss *.xslt *.xsd *.wsdl *.svg *.plist)
11
11
  mimetypes *%w(
12
12
  text/xml
13
13
  application/xml
@@ -0,0 +1,61 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Xojo < RegexLexer
7
+ title "Xojo"
8
+ desc "Xojo"
9
+ tag 'xojo'
10
+ aliases 'realbasic'
11
+ filenames '*.xojo_code', '*.xojo_window', '*.xojo_toolbar', '*.xojo_menu'
12
+
13
+ keywords = %w(
14
+ addhandler aggregates array asc assigns attributes begin break
15
+ byref byval call case catch class const continue char ctype declare
16
+ delegate dim do downto each else elseif end enum event exception
17
+ exit extends false finally for function global goto if
18
+ implements inherits interface lib loop mod module
19
+ new next nil object of optional paramarray
20
+ private property protected public raise raiseevent rect redim
21
+ removehandler return select shared soft static step sub super
22
+ then to true try until using uend uhile
23
+ )
24
+
25
+ keywords_type = %w(
26
+ boolean cfstringref cgfloat cstring curency date double int8 int16
27
+ int32 int64 integer ostype pstring ptr short single
28
+ single string structure variant uinteger uint8 uint16 uint32 uint64
29
+ ushort windowptr wstring
30
+ )
31
+
32
+ operator_words = %w(
33
+ addressof and as in is isa mod not or xor
34
+ )
35
+
36
+ state :root do
37
+ rule /\s+/, Text::Whitespace
38
+
39
+ rule /rem\b.*?$/i, Comment::Single
40
+ rule /\/\/.*$/, Comment::Single
41
+ rule /\#tag Note.*\#tag EndNote/m, Comment::Preproc
42
+ rule /\s*[#].*$/x, Comment::Preproc
43
+
44
+ rule /".*?"/, Literal::String::Double
45
+ rule /[(){}!#,:]/, Punctuation
46
+
47
+ rule /\b(?:#{keywords.join('|')})\b/i, Keyword
48
+ rule /\b(?:#{keywords_type.join('|')})\b/i, Keyword::Declaration
49
+
50
+ rule /\b(?:#{operator_words.join('|')})\b/i, Operator
51
+ rule /[+-]?(\d+\.\d*|\d*\.\d+)/i, Literal::Number::Float
52
+ rule /[+-]?\d+/, Literal::Number::Integer
53
+ rule /&[CH][0-9a-f]+/i, Literal::Number::Hex
54
+ rule /&O[0-7]+/i, Literal::Number::Oct
55
+
56
+ rule /\b[\w\.]+\b/i, Text
57
+ rule(%r(<=|>=|<>|[=><\+\-\*\/\\]), Operator)
58
+ end
59
+ end
60
+ end
61
+ end