rouge 3.19.0 → 3.20.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.
- checksums.yaml +4 -4
- data/lib/rouge/demos/augeas +16 -0
- data/lib/rouge/demos/bibtex +12 -0
- data/lib/rouge/demos/hlsl +20 -0
- data/lib/rouge/demos/livescript +15 -0
- data/lib/rouge/demos/velocity +9 -0
- data/lib/rouge/demos/zig +6 -0
- data/lib/rouge/lexers/augeas.rb +93 -0
- data/lib/rouge/lexers/bibtex.rb +115 -0
- data/lib/rouge/lexers/cpp.rb +6 -0
- data/lib/rouge/lexers/diff.rb +1 -1
- data/lib/rouge/lexers/haskell.rb +27 -19
- data/lib/rouge/lexers/hlsl.rb +166 -0
- data/lib/rouge/lexers/html.rb +1 -1
- data/lib/rouge/lexers/javascript.rb +0 -2
- data/lib/rouge/lexers/jsx.rb +47 -59
- data/lib/rouge/lexers/livescript.rb +310 -0
- data/lib/rouge/lexers/opentype_feature_file.rb +27 -42
- data/lib/rouge/lexers/powershell.rb +3 -3
- data/lib/rouge/lexers/tsx.rb +10 -3
- data/lib/rouge/lexers/typescript.rb +1 -12
- data/lib/rouge/lexers/typescript/common.rb +18 -4
- data/lib/rouge/lexers/velocity.rb +71 -0
- data/lib/rouge/lexers/zig.rb +139 -0
- data/lib/rouge/version.rb +1 -1
- metadata +14 -2
data/lib/rouge/lexers/html.rb
CHANGED
data/lib/rouge/lexers/jsx.rb
CHANGED
@@ -6,97 +6,85 @@ module Rouge
|
|
6
6
|
|
7
7
|
class JSX < Javascript
|
8
8
|
title 'JSX'
|
9
|
-
desc '
|
9
|
+
desc 'An XML-like syntax extension to JavaScript (facebook.github.io/jsx/)'
|
10
10
|
tag 'jsx'
|
11
11
|
aliases 'jsx', 'react'
|
12
12
|
filenames '*.jsx'
|
13
13
|
|
14
14
|
mimetypes 'text/x-jsx', 'application/x-jsx'
|
15
15
|
|
16
|
-
|
16
|
+
start { @html = HTML.new(options); push :expr_start }
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
@embed.reset!
|
21
|
-
@embed.push(:expr_start)
|
22
|
-
push :jsx_embed_root
|
23
|
-
end
|
24
|
-
|
25
|
-
def tag_token(name)
|
26
|
-
name[0] =~ /\p{Lower}/ ? Name::Tag : Name::Class
|
18
|
+
prepend :expr_start do
|
19
|
+
mixin :tag
|
27
20
|
end
|
28
21
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
22
|
+
state :tag do
|
23
|
+
rule %r/</ do
|
24
|
+
token Punctuation
|
25
|
+
push :tag_opening
|
26
|
+
push :element
|
27
|
+
push :element_name
|
28
|
+
end
|
33
29
|
end
|
34
30
|
|
35
|
-
state :
|
36
|
-
rule %r
|
31
|
+
state :tag_opening do
|
32
|
+
rule %r/<\// do
|
37
33
|
token Punctuation
|
38
|
-
goto :
|
34
|
+
goto :element
|
35
|
+
push :element_name
|
39
36
|
end
|
40
|
-
|
37
|
+
mixin :tag
|
41
38
|
rule %r/{/ do
|
42
39
|
token Str::Interpol
|
43
|
-
|
40
|
+
push :interpol
|
41
|
+
push :expr_start
|
44
42
|
end
|
45
|
-
|
46
|
-
rule %r/[^<>{]+/ do
|
43
|
+
rule %r/[^<{]+/ do
|
47
44
|
delegate @html
|
48
45
|
end
|
49
|
-
|
50
|
-
mixin :jsx_tags
|
51
|
-
end
|
52
|
-
|
53
|
-
prepend :expr_start do
|
54
|
-
mixin :jsx_tags
|
55
46
|
end
|
56
47
|
|
57
|
-
state :
|
48
|
+
state :element do
|
58
49
|
mixin :comments_and_whitespace
|
59
|
-
rule %r
|
60
|
-
token
|
50
|
+
rule %r/\/>/ do
|
51
|
+
token Punctuation
|
52
|
+
pop! 2
|
61
53
|
end
|
62
|
-
|
63
|
-
rule %r/[.]/, Punctuation
|
64
|
-
end
|
65
|
-
|
66
|
-
state :jsx_end_tag do
|
67
|
-
mixin :jsx_tag
|
68
54
|
rule %r/>/, Punctuation, :pop!
|
69
|
-
end
|
70
|
-
|
71
|
-
state :jsx_element do
|
72
|
-
rule %r/#{id}=/, Name::Attribute, :jsx_attribute
|
73
|
-
mixin :jsx_tag
|
74
|
-
rule %r/>/ do token Punctuation; goto :jsx_internal end
|
75
|
-
rule %r(/>), Punctuation, :pop!
|
76
|
-
end
|
77
|
-
|
78
|
-
state :jsx_attribute do
|
79
|
-
rule %r/"(\\[\\"]|[^"])*"/, Str::Double, :pop!
|
80
|
-
rule %r/'(\\[\\']|[^'])*'/, Str::Single, :pop!
|
81
55
|
rule %r/{/ do
|
82
56
|
token Str::Interpol
|
83
|
-
|
84
|
-
|
57
|
+
push :interpol
|
58
|
+
push :expr_start
|
85
59
|
end
|
60
|
+
rule %r/\w+/, Name::Attribute
|
61
|
+
rule %r/=/, Punctuation
|
62
|
+
rule %r/(["']).*?(\1)/, Str
|
86
63
|
end
|
87
64
|
|
88
|
-
state :
|
89
|
-
rule %r/[
|
65
|
+
state :element_name do
|
66
|
+
rule %r/[A-Z]\w*/, Name::Class
|
67
|
+
rule %r/\w+/, Name::Tag
|
68
|
+
rule %r/\./, Punctuation
|
69
|
+
rule(//) { pop! }
|
70
|
+
end
|
71
|
+
|
72
|
+
state :interpol do
|
90
73
|
rule %r/}/, Str::Interpol, :pop!
|
91
|
-
|
74
|
+
rule %r/{/ do
|
75
|
+
token Punctuation
|
76
|
+
push :interpol_inner
|
77
|
+
push :statement
|
78
|
+
end
|
79
|
+
mixin :root
|
92
80
|
end
|
93
81
|
|
94
|
-
state :
|
95
|
-
rule %r/
|
96
|
-
|
97
|
-
|
98
|
-
delegate @embed
|
82
|
+
state :interpol_inner do
|
83
|
+
rule %r/}/ do
|
84
|
+
token Punctuation
|
85
|
+
goto :statement
|
99
86
|
end
|
87
|
+
mixin :root
|
100
88
|
end
|
101
89
|
end
|
102
90
|
end
|
@@ -0,0 +1,310 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Rouge
|
5
|
+
module Lexers
|
6
|
+
class Livescript < RegexLexer
|
7
|
+
tag 'livescript'
|
8
|
+
aliases 'ls'
|
9
|
+
filenames '*.ls'
|
10
|
+
mimetypes 'text/livescript'
|
11
|
+
|
12
|
+
title 'LiveScript'
|
13
|
+
desc 'LiveScript, a language which compiles to JavaScript (livescript.net)'
|
14
|
+
|
15
|
+
def self.detect?(text)
|
16
|
+
return text.shebang? 'lsc'
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.declarations
|
20
|
+
@declarations ||= Set.new %w(const let var function class extends implements)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.keywords
|
24
|
+
@keywords ||= Set.new %w(
|
25
|
+
loop until for in of while break return continue switch case
|
26
|
+
fallthrough default otherwise when then if unless else throw try
|
27
|
+
catch finally new delete typeof instanceof super by from to til
|
28
|
+
with require do debugger import export yield
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.constants
|
33
|
+
@constants ||= Javascript.constants + %w(yes no on off void)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.builtins
|
37
|
+
@builtins ||= Javascript.builtins + %w(this it that arguments)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.loop_control_keywords
|
41
|
+
@loop_control_keywords ||= Set.new %w(break continue)
|
42
|
+
end
|
43
|
+
|
44
|
+
id = /[$a-z_]((-(?=[a-z]))?[a-z0-9_])*/i
|
45
|
+
int_number = /\d[\d_]*/
|
46
|
+
int = /#{int_number}(e[+-]?#{int_number})?[$\w]*/ # the last class matches units
|
47
|
+
|
48
|
+
state :root do
|
49
|
+
rule(%r(^(?=\s|/))) { push :slash_starts_regex }
|
50
|
+
mixin :comments
|
51
|
+
mixin :whitespace
|
52
|
+
|
53
|
+
# list of words
|
54
|
+
rule %r/(<\[)(.*?)(\]>)/m do
|
55
|
+
groups Punctuation, Str, Punctuation
|
56
|
+
end
|
57
|
+
|
58
|
+
# function declarations
|
59
|
+
rule %r/!\s*function\b/, Keyword::Declaration
|
60
|
+
rule %r/!?[-~]>|<[-~]!?/, Keyword::Declaration
|
61
|
+
|
62
|
+
# switch arrow
|
63
|
+
rule %r/(=>)/, Keyword
|
64
|
+
|
65
|
+
# prototype attributes
|
66
|
+
rule %r/(::)(#{id})/ do
|
67
|
+
groups Punctuation, Name::Attribute
|
68
|
+
push :id
|
69
|
+
end
|
70
|
+
rule %r/(::)(#{int})/ do
|
71
|
+
groups Punctuation, Num::Integer
|
72
|
+
push :id
|
73
|
+
end
|
74
|
+
|
75
|
+
# instance attributes
|
76
|
+
rule %r/(@)(#{id})/ do
|
77
|
+
groups Name::Variable::Instance, Name::Attribute
|
78
|
+
push :id
|
79
|
+
end
|
80
|
+
rule %r/([.])(#{id})/ do
|
81
|
+
groups Punctuation, Name::Attribute
|
82
|
+
push :id
|
83
|
+
end
|
84
|
+
rule %r/([.])(\d+)/ do
|
85
|
+
groups Punctuation, Num::Integer
|
86
|
+
push :id
|
87
|
+
end
|
88
|
+
rule %r/#{id}(?=\s*:[^:=])/, Name::Attribute
|
89
|
+
|
90
|
+
# operators
|
91
|
+
rule %r(
|
92
|
+
[+][+]|--|&&|\b(and|x?or|is(nt)?|not)\b(?!-[a-zA-Z]|_)|[|][|]|
|
93
|
+
[.]([|&^]|<<|>>>?)[.]|\\(?=\n)|[.:]=|<<<<?|<[|]|[|]>|
|
94
|
+
(<<|>>|==?|!=?|[-<>+*%^/~?])=?
|
95
|
+
)x, Operator, :slash_starts_regex
|
96
|
+
|
97
|
+
# arguments shorthand
|
98
|
+
rule %r/(&)(#{id})?/ do
|
99
|
+
groups Name::Builtin, Name::Attribute
|
100
|
+
end
|
101
|
+
|
102
|
+
# switch case
|
103
|
+
rule %r/[|]|\bcase(?=\s)/, Keyword, :switch_underscore
|
104
|
+
|
105
|
+
rule %r/@/, Name::Variable::Instance
|
106
|
+
rule %r/[.]{3}/, Punctuation
|
107
|
+
rule %r/:/, Punctuation
|
108
|
+
|
109
|
+
# keywords
|
110
|
+
rule %r/#{id}/ do |m|
|
111
|
+
if self.class.loop_control_keywords.include? m[0]
|
112
|
+
token Keyword
|
113
|
+
push :loop_control
|
114
|
+
next
|
115
|
+
elsif self.class.keywords.include? m[0]
|
116
|
+
token Keyword
|
117
|
+
elsif self.class.constants.include? m[0]
|
118
|
+
token Name::Constant
|
119
|
+
elsif self.class.builtins.include? m[0]
|
120
|
+
token Name::Builtin
|
121
|
+
elsif self.class.declarations.include? m[0]
|
122
|
+
token Keyword::Declaration
|
123
|
+
elsif /^[A-Z]/.match(m[0]) && /[^-][a-z]/.match(m[0])
|
124
|
+
token Name::Class
|
125
|
+
else
|
126
|
+
token Name::Variable
|
127
|
+
end
|
128
|
+
push :id
|
129
|
+
end
|
130
|
+
|
131
|
+
# punctuation and brackets
|
132
|
+
rule %r/\](?=[!?.]|#{id})/, Punctuation, :id
|
133
|
+
rule %r/[{(\[;,]/, Punctuation, :slash_starts_regex
|
134
|
+
rule %r/[})\].]/, Punctuation
|
135
|
+
|
136
|
+
# literals
|
137
|
+
rule %r/#{int_number}[.]#{int}/, Num::Float
|
138
|
+
rule %r/0x[0-9A-Fa-f]+/, Num::Hex
|
139
|
+
rule %r/#{int}/, Num::Integer
|
140
|
+
|
141
|
+
# strings
|
142
|
+
rule %r/"""/ do
|
143
|
+
token Str
|
144
|
+
push do
|
145
|
+
rule %r/"""/, Str, :pop!
|
146
|
+
rule %r/"/, Str
|
147
|
+
mixin :double_strings
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
rule %r/'''/ do
|
152
|
+
token Str
|
153
|
+
push do
|
154
|
+
rule %r/'''/, Str, :pop!
|
155
|
+
rule %r/'/, Str
|
156
|
+
mixin :single_strings
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
rule %r/"/ do
|
161
|
+
token Str
|
162
|
+
push do
|
163
|
+
rule %r/"/, Str, :pop!
|
164
|
+
mixin :double_strings
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
rule %r/'/ do
|
169
|
+
token Str
|
170
|
+
push do
|
171
|
+
rule %r/'/, Str, :pop!
|
172
|
+
mixin :single_strings
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# words
|
177
|
+
rule %r/\\\S[^\s,;\])}]*/, Str
|
178
|
+
end
|
179
|
+
|
180
|
+
state :code_escape do
|
181
|
+
rule %r(\\(
|
182
|
+
c[A-Z]|
|
183
|
+
x[0-9a-fA-F]{2}|
|
184
|
+
u[0-9a-fA-F]{4}|
|
185
|
+
u\{[0-9a-fA-F]{4}\}
|
186
|
+
))x, Str::Escape
|
187
|
+
end
|
188
|
+
|
189
|
+
state :interpolated_expression do
|
190
|
+
rule %r/}/, Str::Interpol, :pop!
|
191
|
+
mixin :root
|
192
|
+
end
|
193
|
+
|
194
|
+
state :interpolation do
|
195
|
+
# with curly braces
|
196
|
+
rule %r/[#][{]/, Str::Interpol, :interpolated_expression
|
197
|
+
# without curly braces
|
198
|
+
rule %r/(#)(#{id})/ do |m|
|
199
|
+
groups Str::Interpol, (self.class.builtins.include? m[2]) ? Name::Builtin : Name::Variable
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
state :whitespace do
|
204
|
+
# white space and loop labels
|
205
|
+
rule %r/(\s+?)(?:^([^\S\n]*)(:#{id}))?/m do
|
206
|
+
groups Text, Text, Name::Label
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
state :whitespace_single_line do
|
211
|
+
rule %r([^\S\n]+), Text
|
212
|
+
end
|
213
|
+
|
214
|
+
state :slash_starts_regex do
|
215
|
+
mixin :comments
|
216
|
+
mixin :whitespace
|
217
|
+
mixin :multiline_regex_begin
|
218
|
+
|
219
|
+
rule %r(
|
220
|
+
/(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/ # a regex
|
221
|
+
([gimy]+\b|\B)
|
222
|
+
)x, Str::Regex, :pop!
|
223
|
+
|
224
|
+
rule(//) { pop! }
|
225
|
+
end
|
226
|
+
|
227
|
+
state :multiline_regex_begin do
|
228
|
+
rule %r(//) do
|
229
|
+
token Str::Regex
|
230
|
+
goto :multiline_regex
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
state :multiline_regex_end do
|
235
|
+
rule %r(//([gimy]+\b|\B)), Str::Regex, :pop!
|
236
|
+
end
|
237
|
+
|
238
|
+
state :multiline_regex do
|
239
|
+
mixin :multiline_regex_end
|
240
|
+
mixin :regex_comment
|
241
|
+
mixin :interpolation
|
242
|
+
mixin :code_escape
|
243
|
+
rule %r/\\\D/, Str::Escape
|
244
|
+
rule %r/\\\d+/, Name::Variable
|
245
|
+
rule %r/./m, Str::Regex
|
246
|
+
end
|
247
|
+
|
248
|
+
state :regex_comment do
|
249
|
+
rule %r/^#(\s+.*)?$/, Comment::Single
|
250
|
+
rule %r/(\s+)(#)(\s+.*)?$/ do
|
251
|
+
groups Text, Comment::Single, Comment::Single
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
state :comments do
|
256
|
+
rule %r(/\*.*?\*/)m, Comment::Multiline
|
257
|
+
rule %r/#.*$/, Comment::Single
|
258
|
+
end
|
259
|
+
|
260
|
+
state :switch_underscore do
|
261
|
+
mixin :whitespace_single_line
|
262
|
+
rule %r/_(?=\s*=>|\s+then\b)/, Keyword
|
263
|
+
rule(//) { pop! }
|
264
|
+
end
|
265
|
+
|
266
|
+
state :loop_control do
|
267
|
+
mixin :whitespace_single_line
|
268
|
+
rule %r/#{id}(?=[);\n])/, Name::Label
|
269
|
+
rule(//) { pop! }
|
270
|
+
end
|
271
|
+
|
272
|
+
state :id do
|
273
|
+
rule %r/[!?]|[.](?!=)/, Punctuation
|
274
|
+
rule %r/[{]/ do
|
275
|
+
# destructuring
|
276
|
+
token Punctuation
|
277
|
+
push do
|
278
|
+
rule %r/[,;]/, Punctuation
|
279
|
+
rule %r/#{id}/, Name::Attribute
|
280
|
+
rule %r/#{int}/, Num::Integer
|
281
|
+
mixin :whitespace
|
282
|
+
rule %r/[}]/, Punctuation, :pop!
|
283
|
+
end
|
284
|
+
end
|
285
|
+
rule %r/#{id}/, Name::Attribute
|
286
|
+
rule %r/#{int}/, Num::Integer
|
287
|
+
rule(//) { goto :slash_starts_regex }
|
288
|
+
end
|
289
|
+
|
290
|
+
state :strings do
|
291
|
+
# all strings are multi-line
|
292
|
+
rule %r/[^#\\'"]+/m, Str
|
293
|
+
mixin :code_escape
|
294
|
+
rule %r/\\./, Str::Escape
|
295
|
+
rule %r/#/, Str
|
296
|
+
end
|
297
|
+
|
298
|
+
state :double_strings do
|
299
|
+
rule %r/'/, Str
|
300
|
+
mixin :interpolation
|
301
|
+
mixin :strings
|
302
|
+
end
|
303
|
+
|
304
|
+
state :single_strings do
|
305
|
+
rule %r/"/, Str
|
306
|
+
mixin :strings
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|