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.
Files changed (185) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +23 -0
  3. data/LICENSE +186 -0
  4. data/bin/rougify +16 -0
  5. data/gitlab-rouge.gemspec +17 -0
  6. data/lib/rouge.rb +57 -0
  7. data/lib/rouge/cli.rb +363 -0
  8. data/lib/rouge/demos/apache +21 -0
  9. data/lib/rouge/demos/applescript +2 -0
  10. data/lib/rouge/demos/c +8 -0
  11. data/lib/rouge/demos/clojure +5 -0
  12. data/lib/rouge/demos/coffeescript +5 -0
  13. data/lib/rouge/demos/common_lisp +1 -0
  14. data/lib/rouge/demos/conf +4 -0
  15. data/lib/rouge/demos/cpp +8 -0
  16. data/lib/rouge/demos/csharp +5 -0
  17. data/lib/rouge/demos/css +4 -0
  18. data/lib/rouge/demos/dart +6 -0
  19. data/lib/rouge/demos/diff +7 -0
  20. data/lib/rouge/demos/elixir +1 -0
  21. data/lib/rouge/demos/erb +1 -0
  22. data/lib/rouge/demos/erlang +7 -0
  23. data/lib/rouge/demos/factor +5 -0
  24. data/lib/rouge/demos/gherkin +17 -0
  25. data/lib/rouge/demos/glsl +14 -0
  26. data/lib/rouge/demos/go +7 -0
  27. data/lib/rouge/demos/groovy +9 -0
  28. data/lib/rouge/demos/haml +5 -0
  29. data/lib/rouge/demos/handlebars +7 -0
  30. data/lib/rouge/demos/haskell +6 -0
  31. data/lib/rouge/demos/html +8 -0
  32. data/lib/rouge/demos/http +14 -0
  33. data/lib/rouge/demos/ini +4 -0
  34. data/lib/rouge/demos/io +11 -0
  35. data/lib/rouge/demos/java +5 -0
  36. data/lib/rouge/demos/javascript +1 -0
  37. data/lib/rouge/demos/json +1 -0
  38. data/lib/rouge/demos/json-doc +1 -0
  39. data/lib/rouge/demos/liquid +11 -0
  40. data/lib/rouge/demos/literate_coffeescript +3 -0
  41. data/lib/rouge/demos/literate_haskell +7 -0
  42. data/lib/rouge/demos/llvm +20 -0
  43. data/lib/rouge/demos/lua +12 -0
  44. data/lib/rouge/demos/make +6 -0
  45. data/lib/rouge/demos/markdown +4 -0
  46. data/lib/rouge/demos/matlab +6 -0
  47. data/lib/rouge/demos/moonscript +16 -0
  48. data/lib/rouge/demos/nginx +5 -0
  49. data/lib/rouge/demos/nim +27 -0
  50. data/lib/rouge/demos/objective_c +14 -0
  51. data/lib/rouge/demos/ocaml +12 -0
  52. data/lib/rouge/demos/perl +5 -0
  53. data/lib/rouge/demos/php +3 -0
  54. data/lib/rouge/demos/plaintext +1 -0
  55. data/lib/rouge/demos/powershell +49 -0
  56. data/lib/rouge/demos/prolog +9 -0
  57. data/lib/rouge/demos/properties +7 -0
  58. data/lib/rouge/demos/puppet +6 -0
  59. data/lib/rouge/demos/python +6 -0
  60. data/lib/rouge/demos/qml +9 -0
  61. data/lib/rouge/demos/r +8 -0
  62. data/lib/rouge/demos/racket +24 -0
  63. data/lib/rouge/demos/ruby +9 -0
  64. data/lib/rouge/demos/rust +12 -0
  65. data/lib/rouge/demos/sass +3 -0
  66. data/lib/rouge/demos/scala +3 -0
  67. data/lib/rouge/demos/scheme +4 -0
  68. data/lib/rouge/demos/scss +5 -0
  69. data/lib/rouge/demos/sed +4 -0
  70. data/lib/rouge/demos/shell +2 -0
  71. data/lib/rouge/demos/slim +17 -0
  72. data/lib/rouge/demos/smalltalk +6 -0
  73. data/lib/rouge/demos/sml +4 -0
  74. data/lib/rouge/demos/sql +1 -0
  75. data/lib/rouge/demos/swift +5 -0
  76. data/lib/rouge/demos/tcl +1 -0
  77. data/lib/rouge/demos/tex +1 -0
  78. data/lib/rouge/demos/toml +9 -0
  79. data/lib/rouge/demos/tulip +14 -0
  80. data/lib/rouge/demos/vb +4 -0
  81. data/lib/rouge/demos/viml +5 -0
  82. data/lib/rouge/demos/xml +2 -0
  83. data/lib/rouge/demos/yaml +4 -0
  84. data/lib/rouge/formatter.rb +50 -0
  85. data/lib/rouge/formatters/html.rb +117 -0
  86. data/lib/rouge/formatters/null.rb +19 -0
  87. data/lib/rouge/formatters/terminal256.rb +176 -0
  88. data/lib/rouge/lexer.rb +443 -0
  89. data/lib/rouge/lexers/apache.rb +68 -0
  90. data/lib/rouge/lexers/apache/keywords.yml +453 -0
  91. data/lib/rouge/lexers/apple_script.rb +367 -0
  92. data/lib/rouge/lexers/c.rb +212 -0
  93. data/lib/rouge/lexers/clojure.rb +112 -0
  94. data/lib/rouge/lexers/coffeescript.rb +174 -0
  95. data/lib/rouge/lexers/common_lisp.rb +345 -0
  96. data/lib/rouge/lexers/conf.rb +24 -0
  97. data/lib/rouge/lexers/cpp.rb +66 -0
  98. data/lib/rouge/lexers/csharp.rb +88 -0
  99. data/lib/rouge/lexers/css.rb +271 -0
  100. data/lib/rouge/lexers/dart.rb +104 -0
  101. data/lib/rouge/lexers/diff.rb +31 -0
  102. data/lib/rouge/lexers/elixir.rb +108 -0
  103. data/lib/rouge/lexers/erb.rb +56 -0
  104. data/lib/rouge/lexers/erlang.rb +118 -0
  105. data/lib/rouge/lexers/factor.rb +302 -0
  106. data/lib/rouge/lexers/gherkin.rb +137 -0
  107. data/lib/rouge/lexers/gherkin/keywords.rb +14 -0
  108. data/lib/rouge/lexers/glsl.rb +135 -0
  109. data/lib/rouge/lexers/go.rb +178 -0
  110. data/lib/rouge/lexers/groovy.rb +104 -0
  111. data/lib/rouge/lexers/haml.rb +228 -0
  112. data/lib/rouge/lexers/handlebars.rb +79 -0
  113. data/lib/rouge/lexers/haskell.rb +183 -0
  114. data/lib/rouge/lexers/html.rb +94 -0
  115. data/lib/rouge/lexers/http.rb +80 -0
  116. data/lib/rouge/lexers/ini.rb +57 -0
  117. data/lib/rouge/lexers/io.rb +68 -0
  118. data/lib/rouge/lexers/java.rb +76 -0
  119. data/lib/rouge/lexers/javascript.rb +297 -0
  120. data/lib/rouge/lexers/liquid.rb +287 -0
  121. data/lib/rouge/lexers/literate_coffeescript.rb +33 -0
  122. data/lib/rouge/lexers/literate_haskell.rb +36 -0
  123. data/lib/rouge/lexers/llvm.rb +84 -0
  124. data/lib/rouge/lexers/lua.rb +122 -0
  125. data/lib/rouge/lexers/lua/builtins.rb +22 -0
  126. data/lib/rouge/lexers/make.rb +116 -0
  127. data/lib/rouge/lexers/markdown.rb +154 -0
  128. data/lib/rouge/lexers/matlab.rb +74 -0
  129. data/lib/rouge/lexers/matlab/builtins.rb +11 -0
  130. data/lib/rouge/lexers/moonscript.rb +110 -0
  131. data/lib/rouge/lexers/nginx.rb +71 -0
  132. data/lib/rouge/lexers/nim.rb +152 -0
  133. data/lib/rouge/lexers/objective_c.rb +197 -0
  134. data/lib/rouge/lexers/ocaml.rb +111 -0
  135. data/lib/rouge/lexers/perl.rb +197 -0
  136. data/lib/rouge/lexers/php.rb +173 -0
  137. data/lib/rouge/lexers/php/builtins.rb +204 -0
  138. data/lib/rouge/lexers/plain_text.rb +25 -0
  139. data/lib/rouge/lexers/powershell.rb +96 -0
  140. data/lib/rouge/lexers/prolog.rb +64 -0
  141. data/lib/rouge/lexers/properties.rb +55 -0
  142. data/lib/rouge/lexers/puppet.rb +128 -0
  143. data/lib/rouge/lexers/python.rb +228 -0
  144. data/lib/rouge/lexers/qml.rb +72 -0
  145. data/lib/rouge/lexers/r.rb +56 -0
  146. data/lib/rouge/lexers/racket.rb +542 -0
  147. data/lib/rouge/lexers/ruby.rb +415 -0
  148. data/lib/rouge/lexers/rust.rb +191 -0
  149. data/lib/rouge/lexers/sass.rb +74 -0
  150. data/lib/rouge/lexers/sass/common.rb +180 -0
  151. data/lib/rouge/lexers/scala.rb +142 -0
  152. data/lib/rouge/lexers/scheme.rb +112 -0
  153. data/lib/rouge/lexers/scss.rb +34 -0
  154. data/lib/rouge/lexers/sed.rb +170 -0
  155. data/lib/rouge/lexers/shell.rb +152 -0
  156. data/lib/rouge/lexers/slim.rb +228 -0
  157. data/lib/rouge/lexers/smalltalk.rb +116 -0
  158. data/lib/rouge/lexers/sml.rb +347 -0
  159. data/lib/rouge/lexers/sql.rb +140 -0
  160. data/lib/rouge/lexers/swift.rb +144 -0
  161. data/lib/rouge/lexers/tcl.rb +192 -0
  162. data/lib/rouge/lexers/tex.rb +72 -0
  163. data/lib/rouge/lexers/toml.rb +71 -0
  164. data/lib/rouge/lexers/tulip.rb +75 -0
  165. data/lib/rouge/lexers/vb.rb +164 -0
  166. data/lib/rouge/lexers/viml.rb +101 -0
  167. data/lib/rouge/lexers/viml/keywords.rb +12 -0
  168. data/lib/rouge/lexers/xml.rb +59 -0
  169. data/lib/rouge/lexers/yaml.rb +364 -0
  170. data/lib/rouge/plugins/redcarpet.rb +30 -0
  171. data/lib/rouge/regex_lexer.rb +439 -0
  172. data/lib/rouge/template_lexer.rb +22 -0
  173. data/lib/rouge/text_analyzer.rb +48 -0
  174. data/lib/rouge/theme.rb +195 -0
  175. data/lib/rouge/themes/base16.rb +130 -0
  176. data/lib/rouge/themes/colorful.rb +67 -0
  177. data/lib/rouge/themes/github.rb +71 -0
  178. data/lib/rouge/themes/molokai.rb +82 -0
  179. data/lib/rouge/themes/monokai.rb +92 -0
  180. data/lib/rouge/themes/monokai_sublime.rb +90 -0
  181. data/lib/rouge/themes/thankful_eyes.rb +71 -0
  182. data/lib/rouge/token.rb +182 -0
  183. data/lib/rouge/util.rb +101 -0
  184. data/lib/rouge/version.rb +7 -0
  185. 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