gitlab-rouge 1.9.2
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 +7 -0
- data/Gemfile +23 -0
- data/LICENSE +186 -0
- data/bin/rougify +16 -0
- data/gitlab-rouge.gemspec +17 -0
- data/lib/rouge.rb +57 -0
- data/lib/rouge/cli.rb +363 -0
- data/lib/rouge/demos/apache +21 -0
- data/lib/rouge/demos/applescript +2 -0
- data/lib/rouge/demos/c +8 -0
- data/lib/rouge/demos/clojure +5 -0
- data/lib/rouge/demos/coffeescript +5 -0
- data/lib/rouge/demos/common_lisp +1 -0
- data/lib/rouge/demos/conf +4 -0
- data/lib/rouge/demos/cpp +8 -0
- data/lib/rouge/demos/csharp +5 -0
- data/lib/rouge/demos/css +4 -0
- data/lib/rouge/demos/dart +6 -0
- data/lib/rouge/demos/diff +7 -0
- data/lib/rouge/demos/elixir +1 -0
- data/lib/rouge/demos/erb +1 -0
- data/lib/rouge/demos/erlang +7 -0
- data/lib/rouge/demos/factor +5 -0
- data/lib/rouge/demos/gherkin +17 -0
- data/lib/rouge/demos/glsl +14 -0
- data/lib/rouge/demos/go +7 -0
- data/lib/rouge/demos/groovy +9 -0
- data/lib/rouge/demos/haml +5 -0
- data/lib/rouge/demos/handlebars +7 -0
- data/lib/rouge/demos/haskell +6 -0
- data/lib/rouge/demos/html +8 -0
- data/lib/rouge/demos/http +14 -0
- data/lib/rouge/demos/ini +4 -0
- data/lib/rouge/demos/io +11 -0
- data/lib/rouge/demos/java +5 -0
- data/lib/rouge/demos/javascript +1 -0
- data/lib/rouge/demos/json +1 -0
- data/lib/rouge/demos/json-doc +1 -0
- data/lib/rouge/demos/liquid +11 -0
- data/lib/rouge/demos/literate_coffeescript +3 -0
- data/lib/rouge/demos/literate_haskell +7 -0
- data/lib/rouge/demos/llvm +20 -0
- data/lib/rouge/demos/lua +12 -0
- data/lib/rouge/demos/make +6 -0
- data/lib/rouge/demos/markdown +4 -0
- data/lib/rouge/demos/matlab +6 -0
- data/lib/rouge/demos/moonscript +16 -0
- data/lib/rouge/demos/nginx +5 -0
- data/lib/rouge/demos/nim +27 -0
- data/lib/rouge/demos/objective_c +14 -0
- data/lib/rouge/demos/ocaml +12 -0
- data/lib/rouge/demos/perl +5 -0
- data/lib/rouge/demos/php +3 -0
- data/lib/rouge/demos/plaintext +1 -0
- data/lib/rouge/demos/powershell +49 -0
- data/lib/rouge/demos/prolog +9 -0
- data/lib/rouge/demos/properties +7 -0
- data/lib/rouge/demos/puppet +6 -0
- data/lib/rouge/demos/python +6 -0
- data/lib/rouge/demos/qml +9 -0
- data/lib/rouge/demos/r +8 -0
- data/lib/rouge/demos/racket +24 -0
- data/lib/rouge/demos/ruby +9 -0
- data/lib/rouge/demos/rust +12 -0
- data/lib/rouge/demos/sass +3 -0
- data/lib/rouge/demos/scala +3 -0
- data/lib/rouge/demos/scheme +4 -0
- data/lib/rouge/demos/scss +5 -0
- data/lib/rouge/demos/sed +4 -0
- data/lib/rouge/demos/shell +2 -0
- data/lib/rouge/demos/slim +17 -0
- data/lib/rouge/demos/smalltalk +6 -0
- data/lib/rouge/demos/sml +4 -0
- data/lib/rouge/demos/sql +1 -0
- data/lib/rouge/demos/swift +5 -0
- data/lib/rouge/demos/tcl +1 -0
- data/lib/rouge/demos/tex +1 -0
- data/lib/rouge/demos/toml +9 -0
- data/lib/rouge/demos/tulip +14 -0
- data/lib/rouge/demos/vb +4 -0
- data/lib/rouge/demos/viml +5 -0
- data/lib/rouge/demos/xml +2 -0
- data/lib/rouge/demos/yaml +4 -0
- data/lib/rouge/formatter.rb +50 -0
- data/lib/rouge/formatters/html.rb +117 -0
- data/lib/rouge/formatters/null.rb +19 -0
- data/lib/rouge/formatters/terminal256.rb +176 -0
- data/lib/rouge/lexer.rb +443 -0
- data/lib/rouge/lexers/apache.rb +68 -0
- data/lib/rouge/lexers/apache/keywords.yml +453 -0
- data/lib/rouge/lexers/apple_script.rb +367 -0
- data/lib/rouge/lexers/c.rb +212 -0
- data/lib/rouge/lexers/clojure.rb +112 -0
- data/lib/rouge/lexers/coffeescript.rb +174 -0
- data/lib/rouge/lexers/common_lisp.rb +345 -0
- data/lib/rouge/lexers/conf.rb +24 -0
- data/lib/rouge/lexers/cpp.rb +66 -0
- data/lib/rouge/lexers/csharp.rb +88 -0
- data/lib/rouge/lexers/css.rb +271 -0
- data/lib/rouge/lexers/dart.rb +104 -0
- data/lib/rouge/lexers/diff.rb +31 -0
- data/lib/rouge/lexers/elixir.rb +108 -0
- data/lib/rouge/lexers/erb.rb +56 -0
- data/lib/rouge/lexers/erlang.rb +118 -0
- data/lib/rouge/lexers/factor.rb +302 -0
- data/lib/rouge/lexers/gherkin.rb +137 -0
- data/lib/rouge/lexers/gherkin/keywords.rb +14 -0
- data/lib/rouge/lexers/glsl.rb +135 -0
- data/lib/rouge/lexers/go.rb +178 -0
- data/lib/rouge/lexers/groovy.rb +104 -0
- data/lib/rouge/lexers/haml.rb +228 -0
- data/lib/rouge/lexers/handlebars.rb +79 -0
- data/lib/rouge/lexers/haskell.rb +183 -0
- data/lib/rouge/lexers/html.rb +94 -0
- data/lib/rouge/lexers/http.rb +80 -0
- data/lib/rouge/lexers/ini.rb +57 -0
- data/lib/rouge/lexers/io.rb +68 -0
- data/lib/rouge/lexers/java.rb +76 -0
- data/lib/rouge/lexers/javascript.rb +297 -0
- data/lib/rouge/lexers/liquid.rb +287 -0
- data/lib/rouge/lexers/literate_coffeescript.rb +33 -0
- data/lib/rouge/lexers/literate_haskell.rb +36 -0
- data/lib/rouge/lexers/llvm.rb +84 -0
- data/lib/rouge/lexers/lua.rb +122 -0
- data/lib/rouge/lexers/lua/builtins.rb +22 -0
- data/lib/rouge/lexers/make.rb +116 -0
- data/lib/rouge/lexers/markdown.rb +154 -0
- data/lib/rouge/lexers/matlab.rb +74 -0
- data/lib/rouge/lexers/matlab/builtins.rb +11 -0
- data/lib/rouge/lexers/moonscript.rb +110 -0
- data/lib/rouge/lexers/nginx.rb +71 -0
- data/lib/rouge/lexers/nim.rb +152 -0
- data/lib/rouge/lexers/objective_c.rb +197 -0
- data/lib/rouge/lexers/ocaml.rb +111 -0
- data/lib/rouge/lexers/perl.rb +197 -0
- data/lib/rouge/lexers/php.rb +173 -0
- data/lib/rouge/lexers/php/builtins.rb +204 -0
- data/lib/rouge/lexers/plain_text.rb +25 -0
- data/lib/rouge/lexers/powershell.rb +96 -0
- data/lib/rouge/lexers/prolog.rb +64 -0
- data/lib/rouge/lexers/properties.rb +55 -0
- data/lib/rouge/lexers/puppet.rb +128 -0
- data/lib/rouge/lexers/python.rb +228 -0
- data/lib/rouge/lexers/qml.rb +72 -0
- data/lib/rouge/lexers/r.rb +56 -0
- data/lib/rouge/lexers/racket.rb +542 -0
- data/lib/rouge/lexers/ruby.rb +415 -0
- data/lib/rouge/lexers/rust.rb +191 -0
- data/lib/rouge/lexers/sass.rb +74 -0
- data/lib/rouge/lexers/sass/common.rb +180 -0
- data/lib/rouge/lexers/scala.rb +142 -0
- data/lib/rouge/lexers/scheme.rb +112 -0
- data/lib/rouge/lexers/scss.rb +34 -0
- data/lib/rouge/lexers/sed.rb +170 -0
- data/lib/rouge/lexers/shell.rb +152 -0
- data/lib/rouge/lexers/slim.rb +228 -0
- data/lib/rouge/lexers/smalltalk.rb +116 -0
- data/lib/rouge/lexers/sml.rb +347 -0
- data/lib/rouge/lexers/sql.rb +140 -0
- data/lib/rouge/lexers/swift.rb +144 -0
- data/lib/rouge/lexers/tcl.rb +192 -0
- data/lib/rouge/lexers/tex.rb +72 -0
- data/lib/rouge/lexers/toml.rb +71 -0
- data/lib/rouge/lexers/tulip.rb +75 -0
- data/lib/rouge/lexers/vb.rb +164 -0
- data/lib/rouge/lexers/viml.rb +101 -0
- data/lib/rouge/lexers/viml/keywords.rb +12 -0
- data/lib/rouge/lexers/xml.rb +59 -0
- data/lib/rouge/lexers/yaml.rb +364 -0
- data/lib/rouge/plugins/redcarpet.rb +30 -0
- data/lib/rouge/regex_lexer.rb +439 -0
- data/lib/rouge/template_lexer.rb +22 -0
- data/lib/rouge/text_analyzer.rb +48 -0
- data/lib/rouge/theme.rb +195 -0
- data/lib/rouge/themes/base16.rb +130 -0
- data/lib/rouge/themes/colorful.rb +67 -0
- data/lib/rouge/themes/github.rb +71 -0
- data/lib/rouge/themes/molokai.rb +82 -0
- data/lib/rouge/themes/monokai.rb +92 -0
- data/lib/rouge/themes/monokai_sublime.rb +90 -0
- data/lib/rouge/themes/thankful_eyes.rb +71 -0
- data/lib/rouge/token.rb +182 -0
- data/lib/rouge/util.rb +101 -0
- data/lib/rouge/version.rb +7 -0
- metadata +231 -0
@@ -0,0 +1,415 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
class Ruby < RegexLexer
|
6
|
+
title "Ruby"
|
7
|
+
desc "The Ruby programming language (ruby-lang.org)"
|
8
|
+
tag 'ruby'
|
9
|
+
aliases 'rb'
|
10
|
+
filenames '*.rb', '*.ruby', '*.rbw', '*.rake', '*.gemspec', '*.podspec',
|
11
|
+
'Rakefile', 'Guardfile', 'Gemfile', 'Capfile', 'Podfile',
|
12
|
+
'Vagrantfile', '*.ru', '*.prawn', 'Berksfile'
|
13
|
+
|
14
|
+
mimetypes 'text/x-ruby', 'application/x-ruby'
|
15
|
+
|
16
|
+
def self.analyze_text(text)
|
17
|
+
return 1 if text.shebang? 'ruby'
|
18
|
+
end
|
19
|
+
|
20
|
+
state :symbols do
|
21
|
+
# symbols
|
22
|
+
rule %r(
|
23
|
+
: # initial :
|
24
|
+
@{0,2} # optional ivar, for :@foo and :@@foo
|
25
|
+
[a-z_]\w*[!?]? # the symbol
|
26
|
+
)xi, Str::Symbol
|
27
|
+
|
28
|
+
# special symbols
|
29
|
+
rule %r(:(?:\*\*|[-+]@|[/\%&\|^`~]|\[\]=?|<<|>>|<=?>|<=?|===?)),
|
30
|
+
Str::Symbol
|
31
|
+
|
32
|
+
rule /:'(\\\\|\\'|[^'])*'/, Str::Symbol
|
33
|
+
rule /:"/, Str::Symbol, :simple_sym
|
34
|
+
end
|
35
|
+
|
36
|
+
state :sigil_strings do
|
37
|
+
# %-sigiled strings
|
38
|
+
# %(abc), %[abc], %<abc>, %.abc., %r.abc., etc
|
39
|
+
delimiter_map = { '{' => '}', '[' => ']', '(' => ')', '<' => '>' }
|
40
|
+
rule /%([rqswQWxiI])?([^\w\s])/ do |m|
|
41
|
+
open = Regexp.escape(m[2])
|
42
|
+
close = Regexp.escape(delimiter_map[m[2]] || m[2])
|
43
|
+
interp = /[rQWxI]/ === m[1]
|
44
|
+
toktype = Str::Other
|
45
|
+
|
46
|
+
puts " open: #{open.inspect}" if @debug
|
47
|
+
puts " close: #{close.inspect}" if @debug
|
48
|
+
|
49
|
+
# regexes
|
50
|
+
if m[1] == 'r'
|
51
|
+
toktype = Str::Regex
|
52
|
+
push :regex_flags
|
53
|
+
end
|
54
|
+
|
55
|
+
token toktype
|
56
|
+
|
57
|
+
push do
|
58
|
+
rule /\\[##{open}#{close}\\]/, Str::Escape
|
59
|
+
# nesting rules only with asymmetric delimiters
|
60
|
+
if open != close
|
61
|
+
rule /#{open}/ do
|
62
|
+
token toktype
|
63
|
+
push
|
64
|
+
end
|
65
|
+
end
|
66
|
+
rule /#{close}/, toktype, :pop!
|
67
|
+
|
68
|
+
if interp
|
69
|
+
mixin :string_intp_escaped
|
70
|
+
rule /#/, toktype
|
71
|
+
else
|
72
|
+
rule /[\\#]/, toktype
|
73
|
+
end
|
74
|
+
|
75
|
+
rule /[^##{open}#{close}\\]+/m, toktype
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
state :strings do
|
81
|
+
mixin :symbols
|
82
|
+
rule /\b[a-z_]\w*?:\s+/, Str::Symbol, :expr_start
|
83
|
+
rule /'(\\\\|\\'|[^'])*'/, Str::Single
|
84
|
+
rule /"/, Str::Double, :simple_string
|
85
|
+
rule /(?<!\.)`/, Str::Backtick, :simple_backtick
|
86
|
+
end
|
87
|
+
|
88
|
+
state :regex_flags do
|
89
|
+
rule /[mixounse]*/, Str::Regex, :pop!
|
90
|
+
end
|
91
|
+
|
92
|
+
# double-quoted string and symbol
|
93
|
+
[[:string, Str::Double, '"'],
|
94
|
+
[:sym, Str::Symbol, '"'],
|
95
|
+
[:backtick, Str::Backtick, '`']].each do |name, tok, fin|
|
96
|
+
state :"simple_#{name}" do
|
97
|
+
mixin :string_intp_escaped
|
98
|
+
rule /[^\\#{fin}#]+/m, tok
|
99
|
+
rule /[\\#]/, tok
|
100
|
+
rule /#{fin}/, tok, :pop!
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
keywords = %w(
|
105
|
+
BEGIN END alias begin break case defined\? do else elsif end
|
106
|
+
ensure for if in next redo rescue raise retry return super then
|
107
|
+
undef unless until when while yield
|
108
|
+
)
|
109
|
+
|
110
|
+
keywords_pseudo = %w(
|
111
|
+
initialize new loop include extend raise attr_reader attr_writer
|
112
|
+
attr_accessor alias_method attr catch throw private module_function
|
113
|
+
public protected true false nil __FILE__ __LINE__
|
114
|
+
)
|
115
|
+
|
116
|
+
builtins_g = %w(
|
117
|
+
__id__ __send__ abort ancestors at_exit autoload binding callcc
|
118
|
+
caller catch chomp chop class_eval class_variables clone
|
119
|
+
const_defined\? const_get const_missing const_set constants
|
120
|
+
display dup eval exec exit extend fail fork format freeze
|
121
|
+
getc gets global_variables gsub hash id included_modules
|
122
|
+
inspect instance_eval instance_method instance_methods
|
123
|
+
instance_variable_get instance_variable_set instance_variables
|
124
|
+
lambda load local_variables loop method method_missing
|
125
|
+
methods module_eval name object_id open p print printf
|
126
|
+
private_class_method private_instance_methods private_methods proc
|
127
|
+
protected_instance_methods protected_methods public_class_method
|
128
|
+
public_instance_methods public_methods putc puts raise rand
|
129
|
+
readline readlines require require_relative scan select self send set_trace_func
|
130
|
+
singleton_methods sleep split sprintf srand sub syscall system
|
131
|
+
taint test throw to_a to_s trace_var trap untaint untrace_var warn
|
132
|
+
)
|
133
|
+
|
134
|
+
builtins_q = %w(
|
135
|
+
autoload block_given const_defined eql equal frozen
|
136
|
+
include instance_of is_a iterator kind_of method_defined
|
137
|
+
nil private_method_defined protected_method_defined
|
138
|
+
public_method_defined respond_to tainted
|
139
|
+
)
|
140
|
+
|
141
|
+
builtins_b = %w(chomp chop exit gsub sub)
|
142
|
+
|
143
|
+
start do
|
144
|
+
push :expr_start
|
145
|
+
@heredoc_queue = []
|
146
|
+
end
|
147
|
+
|
148
|
+
state :whitespace do
|
149
|
+
mixin :inline_whitespace
|
150
|
+
rule /\n\s*/m, Text, :expr_start
|
151
|
+
rule /#.*$/, Comment::Single
|
152
|
+
|
153
|
+
rule %r(=begin\b.*?end\b)m, Comment::Multiline
|
154
|
+
end
|
155
|
+
|
156
|
+
state :inline_whitespace do
|
157
|
+
rule /[ \t\r]+/, Text
|
158
|
+
end
|
159
|
+
|
160
|
+
state :root do
|
161
|
+
mixin :whitespace
|
162
|
+
rule /__END__/, Comment::Preproc, :end_part
|
163
|
+
|
164
|
+
rule /0_?[0-7]+(?:_[0-7]+)*/, Num::Oct
|
165
|
+
rule /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex
|
166
|
+
rule /0b[01]+(?:_[01]+)*/, Num::Bin
|
167
|
+
rule /[\d]+(?:_\d+)*/, Num::Integer
|
168
|
+
|
169
|
+
# names
|
170
|
+
rule /@@[a-z_]\w*/i, Name::Variable::Class
|
171
|
+
rule /@[a-z_]\w*/i, Name::Variable::Instance
|
172
|
+
rule /\$\w+/, Name::Variable::Global
|
173
|
+
rule %r(\$[!@&`'+~=/\\,;.<>_*\$?:"]), Name::Variable::Global
|
174
|
+
rule /\$-[0adFiIlpvw]/, Name::Variable::Global
|
175
|
+
rule /::/, Operator
|
176
|
+
|
177
|
+
mixin :strings
|
178
|
+
|
179
|
+
rule /(?:#{keywords.join('|')})\b/, Keyword, :expr_start
|
180
|
+
rule /(?:#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo, :expr_start
|
181
|
+
|
182
|
+
rule %r(
|
183
|
+
(module)
|
184
|
+
(\s+)
|
185
|
+
([a-zA-Z_][a-zA-Z0-9_]*(::[a-zA-Z_][a-zA-Z0-9_]*)*)
|
186
|
+
)x do
|
187
|
+
groups Keyword, Text, Name::Namespace
|
188
|
+
end
|
189
|
+
|
190
|
+
rule /(def\b)(\s*)/ do
|
191
|
+
groups Keyword, Text
|
192
|
+
push :funcname
|
193
|
+
end
|
194
|
+
|
195
|
+
rule /(class\b)(\s*)/ do
|
196
|
+
groups Keyword, Text
|
197
|
+
push :classname
|
198
|
+
end
|
199
|
+
|
200
|
+
rule /(?:#{builtins_q.join('|')})[?]/, Name::Builtin, :expr_start
|
201
|
+
rule /(?:#{builtins_b.join('|')})!/, Name::Builtin, :expr_start
|
202
|
+
rule /(?<!\.)(?:#{builtins_g.join('|')})\b/,
|
203
|
+
Name::Builtin, :method_call
|
204
|
+
|
205
|
+
# char operator. ?x evaulates to "x", unless there's a digit
|
206
|
+
# beforehand like x>=0?n[x]:""
|
207
|
+
rule %r(
|
208
|
+
[?](\\[MC]-)* # modifiers
|
209
|
+
(\\([\\abefnrstv\#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)
|
210
|
+
(?!\w)
|
211
|
+
)x, Str::Char
|
212
|
+
|
213
|
+
mixin :has_heredocs
|
214
|
+
|
215
|
+
rule /[A-Z][a-zA-Z0-9_]*/, Name::Constant, :method_call
|
216
|
+
rule /(\.|::)(\s*)([a-z_]\w*[!?]?|[*%&^`~+-\/\[<>=])/ do
|
217
|
+
groups Punctuation, Text, Name::Function
|
218
|
+
push :method_call
|
219
|
+
end
|
220
|
+
|
221
|
+
rule /[a-zA-Z_]\w*[?!]/, Name, :expr_start
|
222
|
+
rule /[a-zA-Z_]\w*/, Name, :method_call
|
223
|
+
rule /\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|!~|&&?|\|\||\.{1,3}/,
|
224
|
+
Operator, :expr_start
|
225
|
+
rule /[-+\/*%=<>&!^|~]=?/, Operator, :expr_start
|
226
|
+
rule %r<[\[({,?:\\;/]>, Punctuation, :expr_start
|
227
|
+
rule %r<[\])}]>, Punctuation
|
228
|
+
end
|
229
|
+
|
230
|
+
state :has_heredocs do
|
231
|
+
rule /(?<!\w)(<<-?)(["`']?)([a-zA-Z_]\w*)(\2)/ do |m|
|
232
|
+
token Operator, m[1]
|
233
|
+
token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
|
234
|
+
@heredoc_queue << [m[1] == '<<-', m[3]]
|
235
|
+
push :heredoc_queue unless state? :heredoc_queue
|
236
|
+
end
|
237
|
+
|
238
|
+
rule /(<<-?)(["'])(\2)/ do |m|
|
239
|
+
token Operator, m[1]
|
240
|
+
token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
|
241
|
+
@heredoc_queue << [m[1] == '<<-', '']
|
242
|
+
push :heredoc_queue unless state? :heredoc_queue
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
state :heredoc_queue do
|
247
|
+
rule /(?=\n)/ do
|
248
|
+
goto :resolve_heredocs
|
249
|
+
end
|
250
|
+
|
251
|
+
mixin :root
|
252
|
+
end
|
253
|
+
|
254
|
+
state :resolve_heredocs do
|
255
|
+
mixin :string_intp_escaped
|
256
|
+
|
257
|
+
rule /(\n)([^#\\\n]*)$/ do |m|
|
258
|
+
tolerant, heredoc_name = @heredoc_queue.first
|
259
|
+
check = tolerant ? m[2].strip : m[2].rstrip
|
260
|
+
|
261
|
+
# check if we found the end of the heredoc
|
262
|
+
line_tok = if check == heredoc_name
|
263
|
+
@heredoc_queue.shift
|
264
|
+
# if there's no more, we're done looking.
|
265
|
+
pop! if @heredoc_queue.empty?
|
266
|
+
Name::Constant
|
267
|
+
else
|
268
|
+
Str::Heredoc
|
269
|
+
end
|
270
|
+
|
271
|
+
groups(Str::Heredoc, line_tok)
|
272
|
+
end
|
273
|
+
|
274
|
+
rule /[#\\\n]/, Str::Heredoc
|
275
|
+
rule /[^#\\\n]+/, Str::Heredoc
|
276
|
+
end
|
277
|
+
|
278
|
+
state :funcname do
|
279
|
+
rule /\s+/, Text
|
280
|
+
rule /\(/, Punctuation, :defexpr
|
281
|
+
rule %r(
|
282
|
+
(?:([a-zA-Z_][\w_]*)(\.))?
|
283
|
+
(
|
284
|
+
[a-zA-Z_][\w_]*[!?]? |
|
285
|
+
\*\*? | [-+]@? | [/%&\|^`~] | \[\]=? |
|
286
|
+
<<? | >>? | <=>? | >= | ===?
|
287
|
+
)
|
288
|
+
)x do |m|
|
289
|
+
puts "matches: #{[m[0], m[1], m[2], m[3]].inspect}" if @debug
|
290
|
+
groups Name::Class, Operator, Name::Function
|
291
|
+
pop!
|
292
|
+
end
|
293
|
+
|
294
|
+
rule(//) { pop! }
|
295
|
+
end
|
296
|
+
|
297
|
+
state :classname do
|
298
|
+
rule /\s+/, Text
|
299
|
+
rule /\(/ do
|
300
|
+
token Punctuation
|
301
|
+
push :defexpr
|
302
|
+
push :expr_start
|
303
|
+
end
|
304
|
+
|
305
|
+
# class << expr
|
306
|
+
rule /<</ do
|
307
|
+
token Operator
|
308
|
+
goto :expr_start
|
309
|
+
end
|
310
|
+
|
311
|
+
rule /[A-Z_]\w*/, Name::Class
|
312
|
+
|
313
|
+
rule(//) { pop! }
|
314
|
+
end
|
315
|
+
|
316
|
+
state :defexpr do
|
317
|
+
rule /(\))(\.|::)?/ do
|
318
|
+
groups Punctuation, Operator
|
319
|
+
pop!
|
320
|
+
end
|
321
|
+
rule /\(/ do
|
322
|
+
token Punctuation
|
323
|
+
push :defexpr
|
324
|
+
push :expr_start
|
325
|
+
end
|
326
|
+
|
327
|
+
mixin :root
|
328
|
+
end
|
329
|
+
|
330
|
+
state :in_interp do
|
331
|
+
rule /}/, Str::Interpol, :pop!
|
332
|
+
mixin :root
|
333
|
+
end
|
334
|
+
|
335
|
+
state :string_intp do
|
336
|
+
rule /[#][{]/, Str::Interpol, :in_interp
|
337
|
+
rule /#(@@?|\$)[a-z_]\w*/i, Str::Interpol
|
338
|
+
end
|
339
|
+
|
340
|
+
state :string_intp_escaped do
|
341
|
+
mixin :string_intp
|
342
|
+
rule /\\([\\abefnrstv#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})/,
|
343
|
+
Str::Escape
|
344
|
+
rule /\\./, Str::Escape
|
345
|
+
end
|
346
|
+
|
347
|
+
state :method_call do
|
348
|
+
rule %r(/) do
|
349
|
+
token Operator
|
350
|
+
goto :expr_start
|
351
|
+
end
|
352
|
+
|
353
|
+
rule(//) { goto :method_call_spaced }
|
354
|
+
end
|
355
|
+
|
356
|
+
state :method_call_spaced do
|
357
|
+
mixin :whitespace
|
358
|
+
|
359
|
+
rule %r([%/]=) do
|
360
|
+
token Operator
|
361
|
+
goto :expr_start
|
362
|
+
end
|
363
|
+
|
364
|
+
rule %r((/)(?=\S|\s*/)) do
|
365
|
+
token Str::Regex
|
366
|
+
goto :slash_regex
|
367
|
+
end
|
368
|
+
|
369
|
+
mixin :sigil_strings
|
370
|
+
|
371
|
+
rule(%r((?=\s*/))) { pop! }
|
372
|
+
|
373
|
+
rule(/\s+/) { token Text; goto :expr_start }
|
374
|
+
rule(//) { pop! }
|
375
|
+
end
|
376
|
+
|
377
|
+
state :expr_start do
|
378
|
+
mixin :inline_whitespace
|
379
|
+
|
380
|
+
rule %r(/) do
|
381
|
+
token Str::Regex
|
382
|
+
goto :slash_regex
|
383
|
+
end
|
384
|
+
|
385
|
+
# special case for using a single space. Ruby demands that
|
386
|
+
# these be in a single line, otherwise it would make no sense.
|
387
|
+
rule /(\s*)(%[rqswQWxiI]? \S* )/ do
|
388
|
+
groups Text, Str::Other
|
389
|
+
pop!
|
390
|
+
end
|
391
|
+
|
392
|
+
mixin :sigil_strings
|
393
|
+
|
394
|
+
rule(//) { pop! }
|
395
|
+
end
|
396
|
+
|
397
|
+
state :slash_regex do
|
398
|
+
mixin :string_intp
|
399
|
+
rule %r(\\\\), Str::Regex
|
400
|
+
rule %r(\\/), Str::Regex
|
401
|
+
rule %r([\\#]), Str::Regex
|
402
|
+
rule %r([^\\/#]+)m, Str::Regex
|
403
|
+
rule %r(/) do
|
404
|
+
token Str::Regex
|
405
|
+
goto :regex_flags
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
state :end_part do
|
410
|
+
# eat up the rest of the stream as Comment::Preproc
|
411
|
+
rule /.+/m, Comment::Preproc, :pop!
|
412
|
+
end
|
413
|
+
end
|
414
|
+
end
|
415
|
+
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
class Rust < RegexLexer
|
6
|
+
title "Rust"
|
7
|
+
desc 'The Rust programming language (rust-lang.org)'
|
8
|
+
tag 'rust'
|
9
|
+
aliases 'rs'
|
10
|
+
# TODO: *.rc conflicts with the rc shell...
|
11
|
+
filenames '*.rs', '*.rc'
|
12
|
+
mimetypes 'text/x-rust'
|
13
|
+
|
14
|
+
def self.analyze_text(text)
|
15
|
+
return 1 if text.shebang? 'rustc'
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.keywords
|
19
|
+
@keywords ||= %w(
|
20
|
+
as assert break const copy do drop else enum extern fail false
|
21
|
+
fn for if impl let log loop match mod move mut priv pub pure
|
22
|
+
ref return self static struct true trait type unsafe use while
|
23
|
+
box
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.builtins
|
28
|
+
@builtins ||= Set.new %w(
|
29
|
+
Add BitAnd BitOr BitXor bool c_char c_double c_float char
|
30
|
+
c_int clock_t c_long c_longlong Cons Const Copy c_schar c_short
|
31
|
+
c_uchar c_uint c_ulong c_ulonglong c_ushort c_void dev_t DIR
|
32
|
+
dirent Div Either Eq Err f32 f64 Failure FILE float fpos_t
|
33
|
+
i16 i32 i64 i8 Index ino_t int intptr_t Left mode_t Modulo Mul
|
34
|
+
Neg Nil None Num off_t Ok Option Ord Owned pid_t Ptr ptrdiff_t
|
35
|
+
Right Send Shl Shr size_t Some ssize_t str Sub Success time_t
|
36
|
+
u16 u32 u64 u8 uint uintptr_t
|
37
|
+
Box Vec String Gc Rc Arc
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
def macro_closed?
|
42
|
+
@macro_delims.values.all?(&:zero?)
|
43
|
+
end
|
44
|
+
|
45
|
+
start {
|
46
|
+
@macro_delims = { ']' => 0, ')' => 0, '}' => 0 }
|
47
|
+
}
|
48
|
+
|
49
|
+
delim_map = { '[' => ']', '(' => ')', '{' => '}' }
|
50
|
+
|
51
|
+
id = /[a-z_]\w*/i
|
52
|
+
hex = /[0-9a-f]/i
|
53
|
+
escapes = %r(
|
54
|
+
\\ ([nrt'\\] | x#{hex}{2} | u#{hex}{4} | U#{hex}{8})
|
55
|
+
)x
|
56
|
+
size = /8|16|32|64/
|
57
|
+
|
58
|
+
state :start_line do
|
59
|
+
mixin :whitespace
|
60
|
+
rule /\s+/, Text
|
61
|
+
rule /#\[/ do
|
62
|
+
token Comment::Preproc; push :attribute
|
63
|
+
end
|
64
|
+
rule(//) { pop! }
|
65
|
+
end
|
66
|
+
|
67
|
+
state :attribute do
|
68
|
+
mixin :whitespace
|
69
|
+
mixin :has_literals
|
70
|
+
rule /[(,)=]/, Comment::Preproc
|
71
|
+
rule /\]/, Comment::Preproc, :pop!
|
72
|
+
rule id, Comment::Preproc
|
73
|
+
end
|
74
|
+
|
75
|
+
state :whitespace do
|
76
|
+
rule /\s+/, Text
|
77
|
+
rule %r(//[^\n]*), Comment
|
78
|
+
rule %r(/[*].*?[*]/)m, Comment::Multiline
|
79
|
+
end
|
80
|
+
|
81
|
+
state :root do
|
82
|
+
rule /\n/, Text, :start_line
|
83
|
+
mixin :whitespace
|
84
|
+
rule /\b(?:#{Rust.keywords.join('|')})\b/, Keyword
|
85
|
+
mixin :has_literals
|
86
|
+
|
87
|
+
rule %r([=-]>), Keyword
|
88
|
+
rule %r(<->), Keyword
|
89
|
+
rule /[()\[\]{}|,:;]/, Punctuation
|
90
|
+
rule /[*!@~&+%^<>=-]/, Operator
|
91
|
+
|
92
|
+
rule /([.]\s*)?#{id}(?=\s*[(])/m, Name::Function
|
93
|
+
rule /[.]\s*#{id}/, Name::Property
|
94
|
+
rule /(#{id})(::)/m do
|
95
|
+
groups Name::Namespace, Punctuation
|
96
|
+
end
|
97
|
+
|
98
|
+
# macros
|
99
|
+
rule /\bmacro_rules!/, Name::Decorator, :macro_rules
|
100
|
+
rule /#{id}!/, Name::Decorator, :macro
|
101
|
+
|
102
|
+
rule /#{id}/ do |m|
|
103
|
+
name = m[0]
|
104
|
+
if self.class.builtins.include? name
|
105
|
+
token Name::Builtin
|
106
|
+
else
|
107
|
+
token Name
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
state :macro do
|
113
|
+
mixin :has_literals
|
114
|
+
|
115
|
+
rule /[\[{(]/ do |m|
|
116
|
+
@macro_delims[delim_map[m[0]]] += 1
|
117
|
+
puts " macro_delims: #{@macro_delims.inspect}" if @debug
|
118
|
+
token Punctuation
|
119
|
+
end
|
120
|
+
|
121
|
+
rule /[\]})]/ do |m|
|
122
|
+
@macro_delims[m[0]] -= 1
|
123
|
+
puts " macro_delims: #{@macro_delims.inspect}" if @debug
|
124
|
+
pop! if macro_closed?
|
125
|
+
token Punctuation
|
126
|
+
end
|
127
|
+
|
128
|
+
# same as the rule in root, but don't push another macro state
|
129
|
+
rule /#{id}!/, Name::Decorator
|
130
|
+
mixin :root
|
131
|
+
|
132
|
+
# No syntax errors in macros
|
133
|
+
rule /./, Text
|
134
|
+
end
|
135
|
+
|
136
|
+
state :macro_rules do
|
137
|
+
rule /[$]#{id}(:#{id})?/, Name::Variable
|
138
|
+
rule /[$]/, Name::Variable
|
139
|
+
|
140
|
+
mixin :macro
|
141
|
+
end
|
142
|
+
|
143
|
+
state :has_literals do
|
144
|
+
# constants
|
145
|
+
rule /\b(?:true|false|nil)\b/, Keyword::Constant
|
146
|
+
# characters
|
147
|
+
rule %r(
|
148
|
+
' (?: #{escapes} | [^\\] ) '
|
149
|
+
)x, Str::Char
|
150
|
+
|
151
|
+
rule /"/, Str, :string
|
152
|
+
|
153
|
+
# numbers
|
154
|
+
dot = /[.][0-9_]+/
|
155
|
+
exp = /e[-+]?[0-9_]+/
|
156
|
+
flt = /f32|f64/
|
157
|
+
|
158
|
+
rule %r(
|
159
|
+
[0-9]+
|
160
|
+
(#{dot} #{exp}? #{flt}?
|
161
|
+
|#{dot}? #{exp} #{flt}?
|
162
|
+
|#{dot}? #{exp}? #{flt}
|
163
|
+
)
|
164
|
+
)x, Num::Float
|
165
|
+
|
166
|
+
rule %r(
|
167
|
+
( 0b[10_]+
|
168
|
+
| 0x[0-9a-fA-F-]+
|
169
|
+
| [0-9]+
|
170
|
+
) (u#{size}?|i#{size})?
|
171
|
+
)x, Num::Integer
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
state :string do
|
176
|
+
rule /"/, Str, :pop!
|
177
|
+
rule escapes, Str::Escape
|
178
|
+
rule /%%/, Str::Interpol
|
179
|
+
rule %r(
|
180
|
+
%
|
181
|
+
( [0-9]+ [$] )? # Parameter
|
182
|
+
[0#+-]* # Flag
|
183
|
+
( [0-9]+ [$]? )? # Width
|
184
|
+
( [.] [0-9]+ )? # Precision
|
185
|
+
[bcdfiostuxX?] # Type
|
186
|
+
)x, Str::Interpol
|
187
|
+
rule /[^%"\\]+/m, Str
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|