rouge 3.23.0 → 3.26.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/lib/rouge/cli.rb +32 -2
  4. data/lib/rouge/demos/email +11 -0
  5. data/lib/rouge/demos/j +12 -0
  6. data/lib/rouge/demos/ocl +4 -0
  7. data/lib/rouge/demos/rescript +26 -0
  8. data/lib/rouge/formatter.rb +2 -2
  9. data/lib/rouge/formatters/html_line_highlighter.rb +24 -0
  10. data/lib/rouge/formatters/html_line_table.rb +1 -3
  11. data/lib/rouge/formatters/html_linewise.rb +2 -3
  12. data/lib/rouge/lexer.rb +38 -20
  13. data/lib/rouge/lexers/apex.rb +9 -7
  14. data/lib/rouge/lexers/batchfile.rb +2 -1
  15. data/lib/rouge/lexers/cmake.rb +10 -0
  16. data/lib/rouge/lexers/cpp.rb +2 -2
  17. data/lib/rouge/lexers/crystal.rb +14 -9
  18. data/lib/rouge/lexers/docker.rb +1 -1
  19. data/lib/rouge/lexers/elm.rb +5 -5
  20. data/lib/rouge/lexers/email.rb +39 -0
  21. data/lib/rouge/lexers/factor.rb +2 -2
  22. data/lib/rouge/lexers/ghc_core.rb +3 -2
  23. data/lib/rouge/lexers/graphql.rb +1 -1
  24. data/lib/rouge/lexers/http.rb +8 -2
  25. data/lib/rouge/lexers/isbl.rb +2 -2
  26. data/lib/rouge/lexers/j.rb +244 -0
  27. data/lib/rouge/lexers/janet.rb +9 -8
  28. data/lib/rouge/lexers/javascript.rb +8 -2
  29. data/lib/rouge/lexers/jsl.rb +25 -14
  30. data/lib/rouge/lexers/jsonnet.rb +4 -3
  31. data/lib/rouge/lexers/jsp.rb +2 -3
  32. data/lib/rouge/lexers/kotlin.rb +5 -4
  33. data/lib/rouge/lexers/ocaml/common.rb +1 -1
  34. data/lib/rouge/lexers/ocl.rb +85 -0
  35. data/lib/rouge/lexers/opentype_feature_file.rb +0 -1
  36. data/lib/rouge/lexers/perl.rb +6 -4
  37. data/lib/rouge/lexers/powershell.rb +39 -29
  38. data/lib/rouge/lexers/python.rb +1 -1
  39. data/lib/rouge/lexers/q.rb +1 -1
  40. data/lib/rouge/lexers/reasonml.rb +6 -5
  41. data/lib/rouge/lexers/rescript.rb +119 -0
  42. data/lib/rouge/lexers/rust.rb +4 -2
  43. data/lib/rouge/lexers/smarty.rb +1 -1
  44. data/lib/rouge/lexers/velocity.rb +1 -1
  45. data/lib/rouge/lexers/wollok.rb +0 -1
  46. data/lib/rouge/lexers/yaml.rb +1 -1
  47. data/lib/rouge/regex_lexer.rb +56 -1
  48. data/lib/rouge/themes/base16.rb +1 -0
  49. data/lib/rouge/themes/bw.rb +1 -0
  50. data/lib/rouge/themes/colorful.rb +1 -0
  51. data/lib/rouge/themes/github.rb +1 -0
  52. data/lib/rouge/themes/gruvbox.rb +2 -0
  53. data/lib/rouge/themes/igor_pro.rb +1 -0
  54. data/lib/rouge/themes/magritte.rb +1 -0
  55. data/lib/rouge/themes/monokai.rb +1 -0
  56. data/lib/rouge/themes/pastie.rb +1 -0
  57. data/lib/rouge/themes/thankful_eyes.rb +1 -0
  58. data/lib/rouge/themes/tulip.rb +1 -0
  59. data/lib/rouge/version.rb +1 -1
  60. data/lib/rouge.rb +1 -0
  61. metadata +12 -3
@@ -0,0 +1,244 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class J < RegexLexer
7
+ title 'J'
8
+ desc "The J programming language (jsoftware.com)"
9
+ tag 'j'
10
+ filenames '*.ijs', '*.ijt'
11
+
12
+ # For J-specific terms we use, see:
13
+ # https://code.jsoftware.com/wiki/Vocabulary/AET
14
+ # https://code.jsoftware.com/wiki/Vocabulary/Glossary
15
+
16
+ # https://code.jsoftware.com/wiki/Vocabulary/PartsOfSpeech
17
+ def self.token_map
18
+ @token_map ||= {
19
+ noun: Keyword::Constant,
20
+ verb: Name::Function,
21
+ modifier: Operator,
22
+ name: Name,
23
+ param: Name::Builtin::Pseudo,
24
+ other: Punctuation,
25
+ nil => Error,
26
+ }
27
+ end
28
+
29
+ # https://code.jsoftware.com/wiki/NuVoc
30
+ def self.inflection_list
31
+ @inflection_list ||= ['', '.', ':', '..', '.:', ':.', '::']
32
+ end
33
+
34
+ def self.primitive_table
35
+ @primitive_table ||= Hash.new([:name]).tap do |h|
36
+ {
37
+ '()' => [:other],
38
+ '=' => [:verb, :other, :other],
39
+ '<>+-*%$|,#' => [:verb, :verb, :verb],
40
+ '^' => [:verb, :verb, :modifier],
41
+ '~"' => [:modifier, :verb, :verb],
42
+ '.:@' => [:modifier, :modifier, :modifier],
43
+ ';' => [:verb, :modifier, :verb],
44
+ '!' => [:verb, :modifier, :modifier],
45
+ '/\\' => [:modifier, :modifier, :verb],
46
+ '[' => [:verb, nil, :verb],
47
+ ']' => [:verb],
48
+ '{' => [:verb, :verb, :verb, nil, nil, nil, :verb],
49
+ '}' => [:modifier, :verb, :verb, nil, nil, nil, :modifier],
50
+ '`' => [:modifier, nil, :modifier],
51
+ '&' => [:modifier, :modifier, :modifier, nil, :modifier],
52
+ '?' => [:verb, :verb],
53
+ 'a' => [:name, :noun, :noun],
54
+ 'ACeEIjorv' => [:name, :verb],
55
+ 'bdfHMT' => [:name, :modifier],
56
+ 'Dt' => [:name, :modifier, :modifier],
57
+ 'F' => [:name, :modifier, :modifier, :modifier, :modifier,
58
+ :modifier, :modifier],
59
+ 'iu' => [:name, :verb, :verb],
60
+ 'L' => [:name, :verb, :modifier],
61
+ 'mny' => [:param],
62
+ 'p' => [:name, :verb, :verb, :verb],
63
+ 'qsZ' => [:name, nil, :verb],
64
+ 'S' => [:name, nil, :modifier],
65
+ 'u' => [:param, :verb, :verb],
66
+ 'v' => [:param, :verb],
67
+ 'x' => [:param, nil, :verb],
68
+ }.each {|k, v| k.each_char {|c| h[c] = v } }
69
+ end
70
+ end
71
+
72
+ def self.primitive(char, inflection)
73
+ i = inflection_list.index(inflection) or return Error
74
+ token_map[primitive_table[char][i]]
75
+ end
76
+
77
+ def self.control_words
78
+ @control_words ||= Set.new %w(
79
+ assert break case catch catchd catcht continue do else elseif end
80
+ fcase for if return select throw try while whilst
81
+ )
82
+ end
83
+
84
+ def self.control_words_id
85
+ @control_words_id ||= Set.new %w(for goto label)
86
+ end
87
+
88
+ state :expr do
89
+ rule %r/\s+/, Text
90
+
91
+ rule %r'([!-&(-/:-@\[-^`{-~]|[A-Za-z]\b)([.:]*)' do |m|
92
+ token J.primitive(m[1], m[2])
93
+ end
94
+
95
+ rule %r/(?:\d|_\d?):([.:]*)/ do |m|
96
+ token m[1].empty? ? J.token_map[:verb] : Error
97
+ end
98
+
99
+ rule %r/[\d_][\w.]*([.:]*)/ do |m|
100
+ token m[1].empty? ? Num : Error
101
+ end
102
+
103
+ rule %r/'/, Str::Single, :str
104
+
105
+ rule %r/NB\.(?![.:]).*/, Comment::Single
106
+
107
+ rule %r/([A-Za-z]\w*)([.:]*)/ do |m|
108
+ if m[2] == '.'
109
+ word, sep, id = m[1].partition '_'
110
+ list = if sep.empty?
111
+ J.control_words
112
+ elsif not id.empty?
113
+ J.control_words_id
114
+ end
115
+ if list and list.include? word
116
+ token Keyword, word + sep
117
+ token((word == 'for' ? Name : Name::Label), id)
118
+ token Keyword, m[2]
119
+ else
120
+ token Error
121
+ end
122
+ else
123
+ token m[2].empty? ? Name : Error
124
+ end
125
+ end
126
+ end
127
+
128
+ state :str do
129
+ rule %r/''/, Str::Escape
130
+ rule %r/[^'\n]+/, Str::Single
131
+ rule %r/'|$/, Str::Single, :pop!
132
+ end
133
+
134
+ start do
135
+ @note_next = false
136
+ end
137
+
138
+ state :root do
139
+ rule %r/\n/ do
140
+ token Text
141
+ if @note_next
142
+ push :note
143
+ @note_next = false
144
+ end
145
+ end
146
+
147
+ # https://code.jsoftware.com/wiki/Vocabulary/com
148
+ # https://code.jsoftware.com/wiki/Vocabulary/NounExplicitDefinition
149
+ rule %r/
150
+ ([0-4]|13|adverb|conjunction|dyad|monad|noun|verb)([\ \t]+)
151
+ (def(?:ine)?\b|:)(?![.:])([\ \t]*)
152
+ /x do |m|
153
+ groups Keyword::Pseudo, Text, Keyword::Pseudo, Text
154
+ @def_body = (m[1] == '0' || m[1] == 'noun') ? :noun : :code
155
+ if m[3] == 'define'
156
+ # stack: [:root]
157
+ # or [:root, ..., :def_next]
158
+ pop! if stack.size > 1
159
+ push @def_body
160
+ push :def_next # [:root, ..., @def_body, :def_next]
161
+ else
162
+ push :expl_def
163
+ end
164
+ end
165
+
166
+ rule %r/^([ \t]*)(Note\b(?![.:]))([ \t\r]*)(?!=[.:]|$)/ do
167
+ groups Text, Name, Text
168
+ @note_next = true
169
+ end
170
+
171
+ rule %r/[mnuvxy]\b(?![.:])/, Name
172
+ mixin :expr
173
+ end
174
+
175
+ state :def_next do
176
+ rule %r/\n/, Text, :pop!
177
+ mixin :root
178
+ end
179
+
180
+ state :expl_def do
181
+ rule %r/0\b(?![.:])/ do
182
+ token Keyword::Pseudo
183
+ # stack: [:root, :expl_def]
184
+ # or [:root, ..., :def_next, :expl_def]
185
+ pop! if stack.size > 2
186
+ goto @def_body
187
+ push :def_next # [:root, ..., @def_body, :def_next]
188
+ end
189
+ rule %r/'/ do
190
+ if @def_body == :noun
191
+ token Str::Single
192
+ goto :str
193
+ else
194
+ token Punctuation
195
+ goto :q_expr
196
+ end
197
+ end
198
+ rule(//) { pop! }
199
+ end
200
+
201
+ # `q_expr` lexes the content of a string literal which is a part of an
202
+ # explicit definition.
203
+ # e.g. dyad def 'x + y'
204
+ state :q_expr do
205
+ rule %r/''/, Str::Single, :q_str
206
+ rule %r/'|$/, Punctuation, :pop!
207
+ rule %r/NB\.(?![.:])([^'\n]|'')*/, Comment::Single
208
+ mixin :expr
209
+ end
210
+
211
+ state :q_str do
212
+ rule %r/''''/, Str::Escape
213
+ rule %r/[^'\n]+/, Str::Single
214
+ rule %r/''/, Str::Single, :pop!
215
+ rule(/'|$/) { token Punctuation; pop! 2 }
216
+ end
217
+
218
+ state :note do
219
+ mixin :delimiter
220
+ rule %r/.+\n?/, Comment::Multiline
221
+ end
222
+
223
+ state :noun do
224
+ mixin :delimiter
225
+ rule %r/.+\n?/, Str::Heredoc
226
+ end
227
+
228
+ state :code do
229
+ mixin :delimiter
230
+ rule %r/^([ \t]*)(:)([ \t\r]*)$/ do
231
+ groups Text, Punctuation, Text
232
+ end
233
+ mixin :expr
234
+ end
235
+
236
+ state :delimiter do
237
+ rule %r/^([ \t]*)(\))([ \t\r]*$\n?)/ do
238
+ groups Text, Punctuation, Text
239
+ pop!
240
+ end
241
+ end
242
+ end
243
+ end
244
+ end
@@ -114,7 +114,7 @@ module Rouge
114
114
  end
115
115
  end
116
116
 
117
- punctuation = %r/[_!@$%^&*+=~<>.?\/-]/o
117
+ punctuation = %r/[_!$%^&*+=~<>.?\/-]/o
118
118
  symbol = %r/([[:alpha:]]|#{punctuation})([[:word:]]|#{punctuation}|:)*/o
119
119
 
120
120
  state :root do
@@ -143,20 +143,19 @@ module Rouge
143
143
 
144
144
  rule %r/\(/, Punctuation, :function
145
145
 
146
- rule %r/(')([\(\[])/ do
146
+ rule %r/(')(@?[(\[{])/ do
147
147
  groups Operator, Punctuation
148
148
  push :quote
149
149
  end
150
150
 
151
- rule %r/(~)([\(\[])/ do
151
+ rule %r/(~)(@?[(\[{])/ do
152
152
  groups Operator, Punctuation
153
153
  push :quasiquote
154
154
  end
155
155
 
156
156
  rule %r/[\#~,';\|]/, Operator
157
157
 
158
- rule %r/@?[({\[]/, Punctuation, :push
159
- rule %r/[)}\]]/, Punctuation, :pop!
158
+ rule %r/@?[(){}\[\]]/, Punctuation
160
159
 
161
160
  rule symbol, Name
162
161
  end
@@ -169,6 +168,8 @@ module Rouge
169
168
  end
170
169
 
171
170
  state :function do
171
+ rule %r/[\)]/, Punctuation, :pop!
172
+
172
173
  rule symbol do |m|
173
174
  case m[0]
174
175
  when "quote"
@@ -187,8 +188,9 @@ module Rouge
187
188
  end
188
189
 
189
190
  state :quote do
190
- rule %r/[\(\[]/, Punctuation, :push
191
- rule symbol, Str::Symbol
191
+ rule %r/[(\[{]/, Punctuation, :push
192
+ rule %r/[)\]}]/, Punctuation, :pop!
193
+ rule symbol, Str::Escape
192
194
  mixin :root
193
195
  end
194
196
 
@@ -199,7 +201,6 @@ module Rouge
199
201
  end
200
202
  rule %r/(\()(\s*)(unquote)(\s+)(\()/ do
201
203
  groups Punctuation, Text, Keyword, Text, Punctuation
202
- push :root
203
204
  push :function
204
205
  end
205
206
 
@@ -162,6 +162,10 @@ module Rouge
162
162
  push :template_string
163
163
  end
164
164
 
165
+ # special case for the safe navigation operator ?.
166
+ # so that we don't start detecting a ternary expr
167
+ rule %r/[?][.]/, Punctuation
168
+
165
169
  rule %r/[?]/ do
166
170
  token Punctuation
167
171
  push :ternary
@@ -265,9 +269,11 @@ module Rouge
265
269
 
266
270
  # template strings
267
271
  state :template_string do
268
- rule %r/\${/, Punctuation, :template_string_expr
272
+ rule %r/[$]{/, Punctuation, :template_string_expr
269
273
  rule %r/`/, Str::Double, :pop!
270
- rule %r/(\\\\|\\[\$`]|[^\$`]|\$(?!{))*/, Str::Double
274
+ rule %r/\\[$`]/, Str::Escape
275
+ rule %r/[^$`\\]+/, Str::Double
276
+ rule %r/[\\$]/, Str::Double
271
277
  end
272
278
 
273
279
  state :template_string_expr do
@@ -14,41 +14,52 @@ module Rouge
14
14
  rule %r/\s+/m, Text::Whitespace
15
15
 
16
16
  rule %r(//.*?$), Comment::Single
17
- rule %r(/\*.*?\*/)m, Comment::Multiline
17
+ rule %r'/[*].*?', Comment::Multiline, :comment # multiline block comment
18
18
 
19
19
  # messages
20
- rule %r/(<<)(.*?)(\(|;)/ do |m|
21
- groups Operator, Name::Function, Punctuation
22
- end
20
+ rule %r/<</, Operator, :message
23
21
 
24
22
  # covers built-in and custom functions
25
- rule %r/([a-z_][\w\s'%.\\]*)(\()/i do |m|
26
- groups Keyword, Punctuation
23
+ rule %r/(::|:)?([a-z_][\w\s'%.\\]*)(\()/i do |m|
24
+ groups Punctuation, Keyword, Punctuation
27
25
  end
28
26
 
29
- rule %r/\b[+-]?(?:[0-9]+(?:\.[0-9]+)?|\.[0-9]+|\.)(?:e[+-]?[0-9]+)?i?\b/i, Num
30
-
31
27
  rule %r/\d{2}(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{2}(\d{2})?(:\d{2}:\d{2}(:\d{2}(\.\d*)?)?)?/i, Literal::Date
32
28
 
33
- rule %r/::[a-z_][\w\s'%.\\]*/i, Name::Variable
34
- rule %r/:\w+/, Name
35
- rule %r/[a-z_][\w\s'%.\\]*/i, Name::Variable
36
- rule %r/"(?:\\!"|[^"])*?"n/m, Name::Variable
29
+ rule %r/-?(?:[0-9]+(?:[.][0-9]+)?|[.][0-9]*)(?:e[+-]?[0-9]+)?i?/i, Num
30
+
31
+ rule %r/(::|:)?([a-z_][\w\s'%.\\]*|"(?:\\!"|[^"])*?"n)/i do |m|
32
+ groups Punctuation, Name::Variable
33
+ end
37
34
 
38
35
  rule %r/(")(\\\[)(.*?)(\]\\)(")/m do
39
36
  groups Str::Double, Str::Escape, Str::Double, Str::Escape, Str::Double # escaped string
40
37
  end
41
38
  rule %r/"/, Str::Double, :dq
42
39
 
43
- rule %r/[-+*\/!%&<>\|=:]/, Operator
40
+ rule %r/[-+*\/!%&<>\|=:`^]/, Operator
44
41
  rule %r/[\[\](){},;]/, Punctuation
45
42
  end
46
43
 
44
+ state :message do
45
+ rule %r/\s+/m, Text::Whitespace
46
+ rule %r/[a-z_][\w\s'%.\\]*/i, Name::Function
47
+ rule %r/[(),;]/, Punctuation, :pop!
48
+ rule %r/[&|!=<>]/, Operator, :pop!
49
+ end
50
+
47
51
  state :dq do
48
52
  rule %r/\\![btrnNf0\\"]/, Str::Escape
49
53
  rule %r/\\/, Str::Double
50
54
  rule %r/"/, Str::Double, :pop!
51
- rule %r/[^\\"]*/m, Str::Double
55
+ rule %r/[^\\"]+/m, Str::Double
56
+ end
57
+
58
+ state :comment do
59
+ rule %r'/[*]', Comment::Multiline, :comment
60
+ rule %r'[*]/', Comment::Multiline, :pop!
61
+ rule %r'[^/*]+', Comment::Multiline
62
+ rule %r'[/*]', Comment::Multiline
52
63
  end
53
64
  end
54
65
  end
@@ -126,6 +126,7 @@ module Rouge
126
126
 
127
127
  state :string do
128
128
  rule %r/\\([\\\/bfnrt]|(u[0-9a-fA-F]{4}))/, Str::Escape
129
+ rule %r/\\./, Str::Escape
129
130
  end
130
131
 
131
132
  state :string_double do
@@ -137,15 +138,15 @@ module Rouge
137
138
 
138
139
  state :string_single do
139
140
  mixin :string
140
- rule %r/\\'/, Str::Escape
141
141
  rule %r/'/, Str, :pop!
142
142
  rule %r/[^\\']+/, Str
143
143
  end
144
144
 
145
145
  state :string_block do
146
146
  mixin :string
147
- rule %r/\|\|\|/, Str, :pop!
148
- rule %r/.*/, Str
147
+ rule %r/[|][|][|]/, Str, :pop!
148
+ rule %r/[^|\\]+/, Str
149
+ rule %r/[|]/, Str
149
150
  end
150
151
  end
151
152
  end
@@ -112,9 +112,8 @@ module Rouge
112
112
 
113
113
  state :jsp_interp_literal_start do
114
114
  rule %r/'/, Literal, :pop!
115
- rule %r/[^']*/, Literal
115
+ rule %r/[^']+/, Literal
116
116
  end
117
-
118
117
  end
119
118
  end
120
- end
119
+ end
@@ -53,7 +53,7 @@ module Rouge
53
53
  groups Keyword::Declaration, Text
54
54
  push :property
55
55
  end
56
- rule %r'(return|continue|break|this|super)(@#{name})?' do
56
+ rule %r'(return|continue|break|this|super)(@#{name})?\b' do
57
57
  groups Keyword, Name::Decorator
58
58
  end
59
59
  rule %r'\bfun\b', Keyword
@@ -133,9 +133,10 @@ module Rouge
133
133
  end
134
134
 
135
135
  state :comment do
136
- rule %r'\s*/[*].*', Comment::Multiline, :comment
137
- rule %r'.*[*]/', Comment::Multiline, :pop!
138
- rule %r'.*', Comment::Multiline
136
+ rule %r'/[*]', Comment::Multiline, :comment
137
+ rule %r'[*]/', Comment::Multiline, :pop!
138
+ rule %r'[^/*]+', Comment::Multiline
139
+ rule %r'[/*]', Comment::Multiline
139
140
  end
140
141
  end
141
142
  end
@@ -3,7 +3,7 @@
3
3
 
4
4
  module Rouge
5
5
  module Lexers
6
- # shared states with Reasonml
6
+ # shared states with Reasonml and ReScript
7
7
  class OCamlCommon < RegexLexer
8
8
  def self.keywords
9
9
  @keywords ||= Set.new %w(
@@ -0,0 +1,85 @@
1
+ module Rouge
2
+ module Lexers
3
+ class OCL < RegexLexer
4
+ title "OCL"
5
+ desc "OMG Object Constraint Language (omg.org/spec/OCL)"
6
+ tag 'ocl'
7
+ aliases 'OCL'
8
+ filenames '*.ocl'
9
+ mimetypes 'text/x-ocl'
10
+
11
+ def self.keywords
12
+ @keywords ||= Set.new %w(
13
+ context pre post inv init body def derive if then else endif import
14
+ package endpackage let in
15
+ )
16
+ end
17
+
18
+ def self.keywords_type
19
+ @keywords_type ||= Set.new %w(
20
+ Boolean Integer UnlimitedNatural Real String OrderedSet Tuple Bag Set
21
+ Sequence OclInvalid OclVoid TupleType OclState Collection OclMessage
22
+ )
23
+ end
24
+
25
+ def self.builtins
26
+ @builtins ||= Set.new %w(
27
+ self null result true false invalid @pre
28
+ )
29
+ end
30
+
31
+ def self.operators
32
+ @operators ||= Set.new %w(
33
+ or xor and not implies
34
+ )
35
+ end
36
+
37
+ def self.functions
38
+ @functions ||= Set.new %w(
39
+ oclAsSet oclIsNew oclIsUndefined oclIsInvalid oclAsType oclIsTypeOf
40
+ oclIsKindOf oclInState oclType oclLocale hasReturned result
41
+ isSignalSent isOperationCallabs floor round max min toString div mod
42
+ size substring concat toInteger toReal toUpperCase toLowerCase
43
+ indexOf equalsIgnoreCase at characters toBoolean includes excludes
44
+ count includesAll excludesAll isEmpty notEmpty sum product
45
+ selectByKind selectByType asBag asSequence asOrderedSet asSet flatten
46
+ union intersection including excluding symmetricDifferencecount
47
+ append prepend insertAt subOrderedSet first last reverse subSequence
48
+ any closure collect collectNested exists forAll isUnique iterate one
49
+ reject select sortedBy allInstances average conformsTo
50
+ )
51
+ end
52
+
53
+ state :single_string do
54
+ rule %r/\\./, Str::Escape
55
+ rule %r/'/, Str::Single, :pop!
56
+ rule %r/[^\\']+/, Str::Single
57
+ end
58
+
59
+ state :root do
60
+ rule %r/\s+/m, Text
61
+ rule %r/--.*/, Comment::Single
62
+ rule %r/\d+/, Num::Integer
63
+ rule %r/'/, Str::Single, :single_string
64
+ rule %r([->|+*/<>=~!@#%&|?^-]), Operator
65
+ rule %r/[;:()\[\],.]/, Punctuation
66
+ rule %r/\w[\w\d]*/ do |m|
67
+ if self.class.operators.include? m[0]
68
+ token Operator
69
+ elsif self.class.keywords_type.include? m[0]
70
+ token Keyword::Declaration
71
+ elsif self.class.keywords.include? m[0]
72
+ token Keyword
73
+ elsif self.class.builtins.include? m[0]
74
+ token Name::Builtin
75
+ elsif self.class.functions.include? m[0]
76
+ token Name::Function
77
+ else
78
+ token Name
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+
@@ -91,7 +91,6 @@ module Rouge
91
91
  state :strings do
92
92
  rule %r/"/, Str, :pop!
93
93
  rule %r/[^"%\n]+/, Str
94
- rule %r/(\([a-z0-9_]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?/i, Str
95
94
  end
96
95
  end
97
96
  end
@@ -110,9 +110,10 @@ module Rouge
110
110
 
111
111
  rule %r/(__(END|DATA)__)\b/, Comment::Preproc, :end_part
112
112
  rule %r/\$\^[ADEFHILMOPSTWX]/, Name::Variable::Global
113
- rule %r/\$[\\"'\[\]&`+*.,;=%~?@$!<>(^\|\/-](?!\w)/, Name::Variable::Global
113
+ rule %r/\$[\\"'\[\]&`+*.,;=%~?@$!<>(^\|\/_-](?!\w)/, Name::Variable::Global
114
+ rule %r/[$@%&*][$@%&*#_]*(?=[a-z{\[;])/i, Name::Variable, :varname
115
+
114
116
  rule %r/[-+\/*%=<>&^\|!\\~]=?/, Operator
115
- rule %r/[$@%#]+/, Name::Variable, :varname
116
117
 
117
118
  rule %r/0_?[0-7]+(_[0-7]+)*/, Num::Oct
118
119
  rule %r/0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*/, Num::Hex
@@ -159,8 +160,9 @@ module Rouge
159
160
 
160
161
  state :varname do
161
162
  rule %r/\s+/, Text
162
- rule %r/\{/, Punctuation, :pop! # hash syntax
163
- rule %r/\)|,/, Punctuation, :pop! # arg specifier
163
+ rule %r/[{\[]/, Punctuation, :pop! # hash syntax
164
+ rule %r/[),]/, Punctuation, :pop! # arg specifier
165
+ rule %r/[;]/, Punctuation, :pop! # postfix
164
166
  mixin :name_common
165
167
  end
166
168