rouge 3.21.0 → 3.30.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +6 -1
  3. data/lib/rouge/cli.rb +55 -22
  4. data/lib/rouge/demos/brainfuck +1 -1
  5. data/lib/rouge/demos/brightscript +1 -1
  6. data/lib/rouge/demos/bsl +1 -1
  7. data/lib/rouge/demos/cfscript +1 -1
  8. data/lib/rouge/demos/coq +1 -1
  9. data/lib/rouge/demos/csvs +1 -1
  10. data/lib/rouge/demos/dafny +16 -0
  11. data/lib/rouge/demos/datastudio +0 -1
  12. data/lib/rouge/demos/ecl +0 -1
  13. data/lib/rouge/demos/email +11 -0
  14. data/lib/rouge/demos/erlang +1 -1
  15. data/lib/rouge/demos/fluent +13 -0
  16. data/lib/rouge/demos/fsharp +1 -1
  17. data/lib/rouge/demos/glsl +1 -1
  18. data/lib/rouge/demos/haxe +0 -1
  19. data/lib/rouge/demos/idris +13 -0
  20. data/lib/rouge/demos/isabelle +16 -0
  21. data/lib/rouge/demos/j +12 -0
  22. data/lib/rouge/demos/lean +8 -0
  23. data/lib/rouge/demos/meson +10 -0
  24. data/lib/rouge/demos/nesasm +1 -1
  25. data/lib/rouge/demos/nial +35 -0
  26. data/lib/rouge/demos/ocl +4 -0
  27. data/lib/rouge/demos/opentype_feature_file +0 -1
  28. data/lib/rouge/demos/plsql +2 -0
  29. data/lib/rouge/demos/postscript +9 -0
  30. data/lib/rouge/demos/rescript +26 -0
  31. data/lib/rouge/demos/smarty +0 -1
  32. data/lib/rouge/demos/stan +13 -0
  33. data/lib/rouge/demos/stata +14 -0
  34. data/lib/rouge/demos/systemd +4 -0
  35. data/lib/rouge/demos/syzlang +15 -0
  36. data/lib/rouge/demos/syzprog +8 -0
  37. data/lib/rouge/formatter.rb +2 -2
  38. data/lib/rouge/formatters/html_inline.rb +0 -1
  39. data/lib/rouge/formatters/html_line_highlighter.rb +24 -0
  40. data/lib/rouge/formatters/html_line_table.rb +1 -3
  41. data/lib/rouge/formatters/html_linewise.rb +2 -3
  42. data/lib/rouge/guessers/disambiguation.rb +7 -0
  43. data/lib/rouge/lexer.rb +40 -22
  44. data/lib/rouge/lexers/apache/keywords.rb +1 -1
  45. data/lib/rouge/lexers/apex.rb +9 -7
  46. data/lib/rouge/lexers/apple_script.rb +1 -1
  47. data/lib/rouge/lexers/batchfile.rb +2 -1
  48. data/lib/rouge/lexers/c.rb +12 -2
  49. data/lib/rouge/lexers/ceylon.rb +2 -2
  50. data/lib/rouge/lexers/cmake.rb +10 -0
  51. data/lib/rouge/lexers/console.rb +1 -1
  52. data/lib/rouge/lexers/cpp.rb +9 -6
  53. data/lib/rouge/lexers/crystal.rb +14 -9
  54. data/lib/rouge/lexers/cypher.rb +8 -0
  55. data/lib/rouge/lexers/dafny.rb +128 -0
  56. data/lib/rouge/lexers/dart.rb +10 -9
  57. data/lib/rouge/lexers/docker.rb +5 -1
  58. data/lib/rouge/lexers/eex.rb +2 -2
  59. data/lib/rouge/lexers/eiffel.rb +0 -1
  60. data/lib/rouge/lexers/elm.rb +5 -5
  61. data/lib/rouge/lexers/email.rb +39 -0
  62. data/lib/rouge/lexers/factor.rb +2 -2
  63. data/lib/rouge/lexers/fluent.rb +74 -0
  64. data/lib/rouge/lexers/ghc_core.rb +3 -2
  65. data/lib/rouge/lexers/gherkin/keywords.rb +1 -1
  66. data/lib/rouge/lexers/graphql.rb +1 -1
  67. data/lib/rouge/lexers/groovy.rb +1 -1
  68. data/lib/rouge/lexers/hack.rb +1 -1
  69. data/lib/rouge/lexers/handlebars.rb +1 -1
  70. data/lib/rouge/lexers/hcl.rb +1 -0
  71. data/lib/rouge/lexers/http.rb +8 -2
  72. data/lib/rouge/lexers/hylang.rb +0 -1
  73. data/lib/rouge/lexers/idris.rb +210 -0
  74. data/lib/rouge/lexers/isabelle.rb +251 -0
  75. data/lib/rouge/lexers/isbl.rb +2 -2
  76. data/lib/rouge/lexers/j.rb +244 -0
  77. data/lib/rouge/lexers/janet.rb +9 -8
  78. data/lib/rouge/lexers/javascript.rb +9 -3
  79. data/lib/rouge/lexers/jsl.rb +25 -14
  80. data/lib/rouge/lexers/jsonnet.rb +4 -3
  81. data/lib/rouge/lexers/jsp.rb +2 -3
  82. data/lib/rouge/lexers/jsx.rb +1 -2
  83. data/lib/rouge/lexers/kotlin.rb +11 -5
  84. data/lib/rouge/lexers/lasso/keywords.rb +1 -1
  85. data/lib/rouge/lexers/lean.rb +164 -0
  86. data/lib/rouge/lexers/llvm/keywords.rb +1 -1
  87. data/lib/rouge/lexers/lua/keywords.rb +1 -1
  88. data/lib/rouge/lexers/mathematica/keywords.rb +1 -1
  89. data/lib/rouge/lexers/matlab/keywords.rb +1 -1
  90. data/lib/rouge/lexers/matlab.rb +3 -2
  91. data/lib/rouge/lexers/meson.rb +159 -0
  92. data/lib/rouge/lexers/nial.rb +166 -0
  93. data/lib/rouge/lexers/ocaml/common.rb +1 -1
  94. data/lib/rouge/lexers/ocl.rb +84 -0
  95. data/lib/rouge/lexers/opentype_feature_file.rb +0 -1
  96. data/lib/rouge/lexers/pascal.rb +2 -1
  97. data/lib/rouge/lexers/perl.rb +6 -4
  98. data/lib/rouge/lexers/php/keywords.rb +1 -1
  99. data/lib/rouge/lexers/php.rb +276 -128
  100. data/lib/rouge/lexers/plsql.rb +578 -0
  101. data/lib/rouge/lexers/postscript.rb +93 -0
  102. data/lib/rouge/lexers/powershell.rb +39 -29
  103. data/lib/rouge/lexers/prometheus.rb +0 -1
  104. data/lib/rouge/lexers/python.rb +4 -2
  105. data/lib/rouge/lexers/q.rb +1 -2
  106. data/lib/rouge/lexers/reasonml.rb +6 -5
  107. data/lib/rouge/lexers/rescript.rb +119 -0
  108. data/lib/rouge/lexers/ruby.rb +1 -1
  109. data/lib/rouge/lexers/rust.rb +84 -18
  110. data/lib/rouge/lexers/smarty.rb +1 -1
  111. data/lib/rouge/lexers/sparql.rb +5 -4
  112. data/lib/rouge/lexers/sqf/keywords.rb +1 -1
  113. data/lib/rouge/lexers/sql.rb +7 -7
  114. data/lib/rouge/lexers/stan.rb +451 -0
  115. data/lib/rouge/lexers/stata.rb +165 -0
  116. data/lib/rouge/lexers/supercollider.rb +0 -1
  117. data/lib/rouge/lexers/swift.rb +3 -3
  118. data/lib/rouge/lexers/systemd.rb +34 -0
  119. data/lib/rouge/lexers/syzlang.rb +317 -0
  120. data/lib/rouge/lexers/syzprog.rb +122 -0
  121. data/lib/rouge/lexers/tap.rb +0 -1
  122. data/lib/rouge/lexers/toml.rb +16 -9
  123. data/lib/rouge/lexers/tsx.rb +0 -1
  124. data/lib/rouge/lexers/tulip.rb +0 -1
  125. data/lib/rouge/lexers/velocity.rb +1 -1
  126. data/lib/rouge/lexers/viml/keywords.rb +1 -1
  127. data/lib/rouge/lexers/wollok.rb +0 -1
  128. data/lib/rouge/lexers/yaml.rb +1 -1
  129. data/lib/rouge/regex_lexer.rb +56 -1
  130. data/lib/rouge/themes/base16.rb +1 -0
  131. data/lib/rouge/themes/bw.rb +1 -0
  132. data/lib/rouge/themes/colorful.rb +1 -0
  133. data/lib/rouge/themes/github.rb +1 -0
  134. data/lib/rouge/themes/gruvbox.rb +2 -0
  135. data/lib/rouge/themes/igor_pro.rb +1 -0
  136. data/lib/rouge/themes/magritte.rb +1 -0
  137. data/lib/rouge/themes/monokai.rb +1 -0
  138. data/lib/rouge/themes/pastie.rb +1 -0
  139. data/lib/rouge/themes/thankful_eyes.rb +1 -0
  140. data/lib/rouge/themes/tulip.rb +1 -0
  141. data/lib/rouge/version.rb +1 -1
  142. data/lib/rouge.rb +1 -0
  143. metadata +43 -6
@@ -0,0 +1,317 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Syzlang < RegexLexer
7
+ title "Syzlang"
8
+ desc "Syscall description language used by syzkaller"
9
+ tag 'syzlang'
10
+
11
+ def self.keywords
12
+ @keywords ||= Set.new %w(
13
+ align breaks_returns dec define disabled hex ignore_return in incdir
14
+ include inet inout oct opt out packed parent prog_timeout pseudo
15
+ resource size syscall timeout type varlen
16
+ )
17
+ end
18
+
19
+ def self.keywords_type
20
+ @keywords_type ||= Set.new %w(
21
+ array bitsize bool16 bool32 bool64 bool8 boolptr buffer bytesize
22
+ bytesize2 bytesize4 bytesize8 const csum filename fileoff flags fmt
23
+ int16 int16be int32 int32be int64 int64be int8 int8be intptr len
24
+ offsetof optional proc ptr ptr64 string stringnoz text vma vma64 void
25
+ )
26
+ end
27
+
28
+ comment = /#.*$/
29
+ inline_spaces = /[ \t]+/
30
+ eol_spaces = /[\n\r]+/
31
+ spaces = /\s+/
32
+
33
+ state :inline_break do
34
+ rule inline_spaces, Text
35
+ rule %r//, Text, :pop!
36
+ end
37
+
38
+ state :space_break do
39
+ rule spaces, Text
40
+ rule comment, Comment
41
+ rule %r//, Text, :pop!
42
+ end
43
+
44
+ id = /[a-zA-Z_][a-zA-Z0-9_]*/
45
+ num_id = /[a-zA-Z0-9_]+/
46
+
47
+ state :mixin_name do
48
+ rule id, Name
49
+ end
50
+
51
+ state :mixin_number do
52
+ rule %r/-?0x[\da-f]+/i, Num::Hex
53
+ rule %r/-?\d+/, Num::Integer
54
+ rule %r/'[^']?'/, Str::Char
55
+ end
56
+
57
+ state :mixin_string do
58
+ rule %r/"[^"]*"/, Str::Double
59
+ rule %r/`[^`]*`/, Str::Backtick
60
+ end
61
+
62
+ state :mixin_term do
63
+ mixin :mixin_number
64
+ mixin :mixin_string
65
+
66
+ # Keywords.
67
+ rule id do |m|
68
+ if self.class.keywords.include?(m[0])
69
+ token Keyword
70
+ elsif self.class.keywords_type.include?(m[0])
71
+ token Keyword::Type
72
+ else
73
+ token Name
74
+ end
75
+ end
76
+
77
+ # Ranges.
78
+ rule %r/:/, Punctuation
79
+
80
+ # "struct$type" struct name format.
81
+ rule %r/\$/, Name
82
+ end
83
+
84
+ state :term_list do
85
+ rule spaces, Text
86
+ rule comment, Comment
87
+ mixin :mixin_term
88
+ rule %r/\[/, Punctuation, :term_list
89
+ rule %r/,/, Punctuation
90
+ rule %r/[\]\)]/, Punctuation, :pop!
91
+ end
92
+
93
+ state :arg_type do
94
+ mixin :mixin_term
95
+ rule %r/\[/, Punctuation, :term_list
96
+ rule %r//, Text, :pop!
97
+ end
98
+
99
+ state :include do
100
+ rule %r/(<)([^>]+)(>)/ do |m|
101
+ groups Punctuation, Str, Punctuation
102
+ end
103
+ rule %r//, Text, :pop!
104
+ end
105
+
106
+ state :define_name do
107
+ mixin :mixin_name
108
+ rule %r//, Text, :pop!
109
+ end
110
+
111
+ state :define_exp do
112
+ mixin :mixin_name
113
+ mixin :mixin_number
114
+ mixin :mixin_string
115
+ rule %r/[~!%\^&\*\-\+\/\|<>\?:]/, Operator
116
+ rule %r/[\(\){}\[\];,]/, Punctuation
117
+ rule inline_spaces, Text
118
+ rule %r//, Text, :pop!
119
+ end
120
+
121
+ state :resource_name do
122
+ mixin :mixin_name
123
+ rule %r//, Text, :pop!
124
+ end
125
+
126
+ state :resource_type do
127
+ rule %r/\[/, Punctuation, :arg_type
128
+ rule %r/\]/, Punctuation, :pop!
129
+ end
130
+
131
+ state :resource_values do
132
+ rule %r/:/ do
133
+ token Punctuation
134
+ push :resource_values_list
135
+ push :space_break
136
+ end
137
+ rule %r//, Text, :pop!
138
+ end
139
+
140
+ state :resource_values_list do
141
+ rule inline_spaces, Text
142
+ mixin :mixin_name
143
+ mixin :mixin_number
144
+ mixin :mixin_string
145
+ rule %r/,/, Punctuation, :space_break
146
+ rule %r//, Text, :pop!
147
+ end
148
+
149
+ state :flags_list do
150
+ rule inline_spaces, Text
151
+ rule %r/\./, Punctuation
152
+ mixin :mixin_name
153
+ mixin :mixin_number
154
+ mixin :mixin_string
155
+ rule %r/,/, Punctuation, :space_break
156
+ rule %r//, Punctuation, :pop!
157
+ end
158
+
159
+ state :syscall_args do
160
+ rule spaces, Text
161
+ rule comment, Comment
162
+ rule %r/\./, Punctuation
163
+ rule id do
164
+ token Name
165
+ push :arg_type
166
+ push :space_break
167
+ end
168
+ rule %r/,/, Punctuation
169
+ rule %r/\)/, Punctuation, :pop!
170
+ end
171
+
172
+ state :syscall_retval do
173
+ mixin :mixin_name
174
+ rule %r//, Text, :pop!
175
+ end
176
+
177
+ state :syscall_mods do
178
+ rule %r/\(/, Punctuation, :term_list
179
+ rule %r//, Text, :pop!
180
+ end
181
+
182
+ state :struct_fields do
183
+ rule id do
184
+ token Name
185
+ push :space_break
186
+ push :struct_field_mods
187
+ push :inline_break
188
+ push :arg_type
189
+ push :space_break
190
+ end
191
+ rule %r/[}\]]/, Punctuation, :pop!
192
+ end
193
+
194
+ state :struct_field_mods do
195
+ rule %r/\(/, Punctuation, :term_list
196
+ rule %r//, Text, :pop!
197
+ end
198
+
199
+ state :struct_mods do
200
+ rule %r/\[/, Punctuation, :term_list
201
+ rule %r//, Text, :pop!
202
+ end
203
+
204
+ state :type_name do
205
+ mixin :mixin_name
206
+ rule %r//, Text, :pop!
207
+ end
208
+
209
+ state :type_args do
210
+ rule %r/\[/, Punctuation, :type_args_list
211
+ rule %r//, Text, :pop!
212
+ end
213
+
214
+ state :type_args_list do
215
+ rule spaces, Text
216
+ rule comment, Comment
217
+ mixin :mixin_name
218
+ rule %r/,/, Punctuation
219
+ rule %r/\]/, Punctuation, :pop!
220
+ end
221
+
222
+ state :type_body do
223
+ rule %r/[{\[]/ do
224
+ token Punctuation
225
+ pop!
226
+ push :space_break
227
+ push :struct_mods
228
+ push :inline_break
229
+ push :struct_fields
230
+ push :space_break
231
+ end
232
+ rule %r// do
233
+ pop!
234
+ push :arg_type
235
+ end
236
+ end
237
+
238
+ state :root do
239
+ # Whitespace.
240
+ rule spaces, Text
241
+
242
+ # Comments.
243
+ rule comment, Comment
244
+
245
+ # Includes.
246
+ rule %r/(include|incdir)/ do
247
+ token Keyword
248
+ push :include
249
+ push :space_break
250
+ end
251
+
252
+ # Defines.
253
+ rule %r/define/ do
254
+ token Keyword
255
+ push :define_exp
256
+ push :space_break
257
+ push :define_name
258
+ push :space_break
259
+ end
260
+
261
+ # Resources.
262
+ rule %r/resource/ do
263
+ token Keyword
264
+ push :resource_values
265
+ push :inline_break
266
+ push :resource_type
267
+ push :inline_break
268
+ push :resource_name
269
+ push :space_break
270
+ end
271
+
272
+ # Flags and strings.
273
+ rule %r/(#{id}|_)(#{spaces})(=)/ do |m|
274
+ if m[1] == "_"
275
+ groups Keyword, Text, Punctuation
276
+ else
277
+ groups Name, Text, Punctuation
278
+ end
279
+ push :flags_list
280
+ push :space_break
281
+ end
282
+
283
+ # Syscalls.
284
+ rule %r/(#{id})(\$)?(#{num_id})?(#{spaces})?(\()/ do |m|
285
+ groups Name::Function, Punctuation, Name::Function::Magic, Text, Punctuation
286
+ push :syscall_mods
287
+ push :inline_break
288
+ push :syscall_retval
289
+ push :inline_break
290
+ push :syscall_args
291
+ push :space_break
292
+ end
293
+
294
+ # Structs and unions.
295
+ rule %r/(#{id}|#{id}\$#{num_id})(#{spaces})?([{\[])/ do |m|
296
+ groups Name, Text, Punctuation
297
+ push :inline_break
298
+ push :struct_mods
299
+ push :inline_break
300
+ push :struct_fields
301
+ push :space_break
302
+ end
303
+
304
+ # Types.
305
+ rule %r/type/ do
306
+ token Keyword
307
+ push :type_body
308
+ push :space_break
309
+ push :type_args
310
+ push :type_name
311
+ push :space_break
312
+ end
313
+ end
314
+
315
+ end
316
+ end
317
+ end
@@ -0,0 +1,122 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Syzprog < RegexLexer
7
+ title "Syzprog"
8
+ desc "Program description language used by syzkaller"
9
+ tag 'syzprog'
10
+
11
+ def self.keywords
12
+ @keywords ||= Set.new %w(
13
+ ANY ANYBLOB ANYPTR ANYPTR64 ANYPTRS ANYRES16 ANYRES32 ANYRES64
14
+ ANYRESDEC ANYRESHEX ANYRESOCT ANYUNION AUTO false nil true void
15
+ async fail_nth rerun
16
+ )
17
+ end
18
+
19
+ comment = /#.*$/
20
+ inline_spaces = /[ \t]+/
21
+ eol_spaces = /[\n\r]+/
22
+ spaces = /\s+/
23
+
24
+ id = /[a-zA-Z_][a-zA-Z0-9_]*/
25
+ num_id = /[a-zA-Z0-9_]+/
26
+ res_id = /r[0-9]+/
27
+
28
+ state :inline_break do
29
+ rule inline_spaces, Text
30
+ rule %r//, Text, :pop!
31
+ end
32
+
33
+ state :eol_break do
34
+ rule eol_spaces, Text
35
+ rule comment, Comment
36
+ rule %r//, Text, :pop!
37
+ end
38
+
39
+ state :space_break do
40
+ rule spaces, Text
41
+ rule comment, Comment
42
+ rule %r//, Text, :pop!
43
+ end
44
+
45
+ state :mixin_number do
46
+ rule %r/-?0x[\da-f]+/i, Num::Hex
47
+ rule %r/-?\d+/, Num::Integer
48
+ end
49
+
50
+ state :mixin_string do
51
+ rule %r/"[^"]*"/, Str::Double
52
+ rule %r/`[^`]*`/, Str::Backtick
53
+ rule %r/'[^']*'/, Str::Single
54
+ end
55
+
56
+ state :mixin_term do
57
+ mixin :mixin_number
58
+ mixin :mixin_string
59
+
60
+ rule %r/#{res_id}/, Keyword::Pseudo
61
+ rule id do |m|
62
+ if self.class.keywords.include?(m[0])
63
+ token Keyword
64
+ else
65
+ token Name
66
+ end
67
+ end
68
+ end
69
+
70
+ state :mods_list do
71
+ rule spaces, Text
72
+ rule comment, Comment
73
+ mixin :mixin_term
74
+ rule %r/[,:]/, Punctuation
75
+ rule %r/\)/, Punctuation, :pop!
76
+ end
77
+
78
+ state :syscall_mods do
79
+ rule %r/\(/, Punctuation, :mods_list
80
+ rule %r//, Text, :pop!
81
+ end
82
+
83
+ state :syscall_args do
84
+ rule spaces, Text
85
+ rule comment, Comment
86
+ mixin :mixin_term
87
+ mixin :mixin_number
88
+ mixin :mixin_string
89
+ # This punctuation is a part of the syntax:
90
+ rule %r/[@&=,<>{}\[\]]/, Punctuation
91
+ # This punctuation is not, highlight just in case:
92
+ rule %r/[!#\$%\^\*\-\+\/\|~:;.\?]/, Punctuation
93
+ rule %r/\(/, Punctuation, :syscall_args
94
+ rule %r/\)/, Punctuation, :pop!
95
+ end
96
+
97
+ state :root do
98
+ # Whitespace.
99
+ rule spaces, Text
100
+
101
+ # Comments.
102
+ rule comment, Comment
103
+
104
+ # Return values.
105
+ rule %r/(#{res_id})(#{spaces})(=)/ do
106
+ groups Keyword::Pseudo, Text, Punctuation
107
+ end
108
+
109
+ # Syscalls.
110
+ rule %r/(#{id})(\$)?(#{num_id})?(#{spaces})?(\()/ do |m|
111
+ groups Name::Function, Punctuation, Name::Function::Magic, Text, Punctuation
112
+ push :syscall_mods
113
+ push :inline_break
114
+ push :syscall_args
115
+ push :space_break
116
+ end
117
+
118
+ end
119
+
120
+ end
121
+ end
122
+ end
@@ -86,4 +86,3 @@ module Rouge
86
86
  end
87
87
  end
88
88
  end
89
-
@@ -11,14 +11,15 @@ module Rouge
11
11
  filenames '*.toml', 'Pipfile'
12
12
  mimetypes 'text/x-toml'
13
13
 
14
- identifier = /\S+/
14
+ # bare keys and quoted keys
15
+ identifier = %r/(?:\S+|"[^"]+"|'[^']+')/
15
16
 
16
17
  state :basic do
17
18
  rule %r/\s+/, Text
18
19
  rule %r/#.*?$/, Comment
19
20
  rule %r/(true|false)/, Keyword::Constant
20
21
 
21
- rule %r/(\S+)(\s*)(=)(\s*)(\{)/ do |m|
22
+ rule %r/(#{identifier})(\s*)(=)(\s*)(\{)/ do
22
23
  groups Name::Namespace, Text, Operator, Text, Punctuation
23
24
  push :inline
24
25
  end
@@ -27,9 +28,14 @@ module Rouge
27
28
 
28
29
  rule %r/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z/, Literal::Date
29
30
 
30
- rule %r/(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?/, Num::Float
31
- rule %r/\d+[eE][+-]?[0-9]+j?/, Num::Float
32
- rule %r/\-?\d+/, Num::Integer
31
+ rule %r/[+-]?\d+(?:_\d+)*\.\d+(?:_\d+)*(?:[eE][+-]?\d+(?:_\d+)*)?/, Num::Float
32
+ rule %r/[+-]?\d+(?:_\d+)*[eE][+-]?\d+(?:_\d+)*/, Num::Float
33
+ rule %r/[+-]?(?:nan|inf)/, Num::Float
34
+
35
+ rule %r/0x\h+(?:_\h+)*/, Num::Hex
36
+ rule %r/0o[0-7]+(?:_[0-7]+)*/, Num::Oct
37
+ rule %r/0b[01]+(?:_[01]+)*/, Num::Bin
38
+ rule %r/[+-]?\d+(?:_\d+)*/, Num::Integer
33
39
  end
34
40
 
35
41
  state :root do
@@ -48,6 +54,11 @@ module Rouge
48
54
 
49
55
  state :content do
50
56
  mixin :basic
57
+
58
+ rule %r/(#{identifier})(\s*)(=)/ do
59
+ groups Name::Property, Text, Punctuation
60
+ end
61
+
51
62
  rule %r/"""/, Str, :mdq
52
63
  rule %r/"/, Str, :dq
53
64
  rule %r/'''/, Str, :msq
@@ -95,10 +106,6 @@ module Rouge
95
106
  state :inline do
96
107
  mixin :content
97
108
 
98
- rule %r/(#{identifier})(\s*)(=)/ do
99
- groups Name::Property, Text, Punctuation
100
- end
101
-
102
109
  rule %r/\}/, Punctuation, :pop!
103
110
  end
104
111
  end
@@ -24,4 +24,3 @@ module Rouge
24
24
  end
25
25
  end
26
26
  end
27
-
@@ -105,4 +105,3 @@ module Rouge
105
105
  end
106
106
  end
107
107
  end
108
-
@@ -63,7 +63,7 @@ module Rouge
63
63
  rule %r/0[xX][0-9a-fA-F]+[Ll]?/, Num::Hex
64
64
  rule %r/\b[0-9]+\b/, Num::Integer
65
65
  rule %r/(true|false|null)\b/, Keyword::Constant
66
- rule %r/[(\[]/, Punctuation, :push!
66
+ rule %r/[(\[]/, Punctuation, :push
67
67
  rule %r/[)\]}]/, Punctuation, :pop!
68
68
  end
69
69
  end
@@ -18,4 +18,4 @@ module Rouge
18
18
  end
19
19
  end
20
20
  end
21
- end
21
+ end
@@ -18,7 +18,6 @@ module Rouge
18
18
 
19
19
  state :whitespaces_and_comments do
20
20
  rule %r/\s+/m, Text::Whitespace
21
- rule %r/$+/m, Text::Whitespace
22
21
  rule %r(//.*$), Comment::Single
23
22
  rule %r(/\*(.|\s)*?\*/)m, Comment::Multiline
24
23
  end
@@ -175,7 +175,7 @@ module Rouge
175
175
 
176
176
  state :block_nodes do
177
177
  # implicit key
178
- rule %r/((?:[\p{L}\p{Nl}\p{Nd}_][\p{L}\p{Nl}\p{Nd}\p{Blank}_-]*)?)(:)(?=\s|$)/ do |m|
178
+ rule %r/([^#,:?\[\]{}"'\n]+)(:)(?=\s|$)/ do |m|
179
179
  groups Name::Attribute, Punctuation::Indicator
180
180
  set_indent m[0], :implicit => true
181
181
  end
@@ -6,6 +6,37 @@ module Rouge
6
6
  # A stateful lexer that uses sets of regular expressions to
7
7
  # tokenize a string. Most lexers are instances of RegexLexer.
8
8
  class RegexLexer < Lexer
9
+ class InvalidRegex < StandardError
10
+ def initialize(re)
11
+ @re = re
12
+ end
13
+
14
+ def to_s
15
+ "regex #{@re.inspect} matches empty string, but has no predicate!"
16
+ end
17
+ end
18
+
19
+ class ClosedState < StandardError
20
+ attr_reader :state
21
+ def initialize(state)
22
+ @state = state
23
+ end
24
+
25
+ def rule
26
+ @state.rules.last
27
+ end
28
+
29
+ def to_s
30
+ rule = @state.rules.last
31
+ msg = "State :#{state.name} cannot continue after #{rule.inspect}, which will always match."
32
+ if rule.re.source.include?('*')
33
+ msg += " Consider replacing * with +."
34
+ end
35
+
36
+ msg
37
+ end
38
+ end
39
+
9
40
  # A rule is a tuple of a regular expression to test, and a callback
10
41
  # to perform if the test succeeds.
11
42
  #
@@ -42,12 +73,13 @@ module Rouge
42
73
  end
43
74
 
44
75
  class StateDSL
45
- attr_reader :rules
76
+ attr_reader :rules, :name
46
77
  def initialize(name, &defn)
47
78
  @name = name
48
79
  @defn = defn
49
80
  @rules = []
50
81
  @loaded = false
82
+ @closed = false
51
83
  end
52
84
 
53
85
  def to_state(lexer_class)
@@ -95,10 +127,14 @@ module Rouge
95
127
  # {RegexLexer#token}, and {RegexLexer#delegate}. The first
96
128
  # argument can be used to access the match groups.
97
129
  def rule(re, tok=nil, next_state=nil, &callback)
130
+ raise ClosedState.new(self) if @closed
131
+
98
132
  if tok.nil? && callback.nil?
99
133
  raise "please pass `rule` a token to yield or a callback"
100
134
  end
101
135
 
136
+ matches_empty = re =~ ''
137
+
102
138
  callback ||= case next_state
103
139
  when :pop!
104
140
  proc do |stream|
@@ -123,6 +159,9 @@ module Rouge
123
159
  @stack.push(state)
124
160
  end
125
161
  when nil
162
+ # cannot use an empty-matching regexp with no predicate
163
+ raise InvalidRegex.new(re) if matches_empty
164
+
126
165
  proc do |stream|
127
166
  puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug
128
167
  @output_stream.call(tok, stream[0])
@@ -132,6 +171,22 @@ module Rouge
132
171
  end
133
172
 
134
173
  rules << Rule.new(re, callback)
174
+
175
+ close! if matches_empty && !context_sensitive?(re)
176
+ end
177
+
178
+ def context_sensitive?(re)
179
+ source = re.source
180
+ return true if source =~ /[(][?]<?[!=]/
181
+
182
+ # anchors count as lookahead/behind
183
+ return true if source =~ /[$^]/
184
+
185
+ false
186
+ end
187
+
188
+ def close!
189
+ @closed = true
135
190
  end
136
191
 
137
192
  # Mix in the rules from another state into this state. The rules
@@ -67,6 +67,7 @@ module Rouge
67
67
  style Keyword::Declaration, :fg => :base09
68
68
 
69
69
  style Literal::String, :fg => :base0B
70
+ style Literal::String::Affix, :fg => :base0E
70
71
  style Literal::String::Regex, :fg => :base0C
71
72
 
72
73
  style Literal::String::Interpol,
@@ -26,6 +26,7 @@ module Rouge
26
26
  style Name::Tag, :bold => true
27
27
 
28
28
  style Literal::String, :italic => true
29
+ style Literal::String::Affix, :bold => true
29
30
  style Literal::String::Interpol, :bold => true
30
31
  style Literal::String::Escape, :bold => true
31
32
 
@@ -37,6 +37,7 @@ module Rouge
37
37
  style Name::Decorator, :fg => "#555", :bold => true
38
38
 
39
39
  style Literal::String, :bg => "#fff0f0"
40
+ style Literal::String::Affix, :fg => "#080", :bold => true
40
41
  style Literal::String::Char, :fg => "#04D"
41
42
  style Literal::String::Doc, :fg => "#D42"
42
43
  style Literal::String::Interpol, :bg => "#eee"
@@ -35,6 +35,7 @@ module Rouge
35
35
  style Literal::Number::Integer, :fg => '#009999'
36
36
  style Literal::Number::Oct, :fg => '#009999'
37
37
  style Literal::Number, :fg => '#009999'
38
+ style Literal::String::Affix, :fg => '#000000', :bold => true
38
39
  style Literal::String::Backtick, :fg => '#d14'
39
40
  style Literal::String::Char, :fg => '#d14'
40
41
  style Literal::String::Doc, :fg => '#d14'
@@ -150,6 +150,8 @@ module Rouge
150
150
  Literal::String::Interpol,
151
151
  Literal::String::Regex, :fg => :green, :italic => true
152
152
 
153
+ style Literal::String::Affix, :fg => :red
154
+
153
155
  style Literal::String::Escape, :fg => :orange
154
156
 
155
157
  style Name::Namespace,