1 package r
2
3 import (
4 . "github.com/alecthomas/chroma"
5 "github.com/alecthomas/chroma/lexers/internal"
6 )
7
8
9 var Ruby = internal.Register(MustNewLazyLexer(
10 &Config{
11 Name: "Ruby",
12 Aliases: []string{"rb", "ruby", "duby"},
13 Filenames: []string{"*.rb", "*.rbw", "Rakefile", "*.rake", "*.gemspec", "*.rbx", "*.duby", "Gemfile"},
14 MimeTypes: []string{"text/x-ruby", "application/x-ruby"},
15 DotAll: true,
16 },
17 rubyRules,
18 ))
19
20 func rubyRules() Rules {
21 return Rules{
22 "root": {
23 {`\A#!.+?$`, CommentHashbang, nil},
24 {`#.*?$`, CommentSingle, nil},
25 {`=begin\s.*?\n=end.*?$`, CommentMultiline, nil},
26 {Words(``, `\b`, `BEGIN`, `END`, `alias`, `begin`, `break`, `case`, `defined?`, `do`, `else`, `elsif`, `end`, `ensure`, `for`, `if`, `in`, `next`, `redo`, `rescue`, `raise`, `retry`, `return`, `super`, `then`, `undef`, `unless`, `until`, `when`, `while`, `yield`), Keyword, nil},
27 {`(module)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)`, ByGroups(Keyword, Text, NameNamespace), nil},
28 {`(def)(\s+)`, ByGroups(Keyword, Text), Push("funcname")},
29 {"def(?=[*%&^`~+-/\\[<>=])", Keyword, Push("funcname")},
30 {`(class)(\s+)`, ByGroups(Keyword, Text), Push("classname")},
31 {Words(``, `\b`, `initialize`, `new`, `loop`, `include`, `extend`, `raise`, `attr_reader`, `attr_writer`, `attr_accessor`, `attr`, `catch`, `throw`, `private`, `module_function`, `public`, `protected`, `true`, `false`, `nil`), KeywordPseudo, nil},
32 {`(not|and|or)\b`, OperatorWord, nil},
33 {Words(``, `\?`, `autoload`, `block_given`, `const_defined`, `eql`, `equal`, `frozen`, `include`, `instance_of`, `is_a`, `iterator`, `kind_of`, `method_defined`, `nil`, `private_method_defined`, `protected_method_defined`, `public_method_defined`, `respond_to`, `tainted`), NameBuiltin, nil},
34 {`(chomp|chop|exit|gsub|sub)!`, NameBuiltin, nil},
35 {Words(`(?<!\.)`, `\b`, `Array`, `Float`, `Integer`, `String`, `__id__`, `__send__`, `abort`, `ancestors`, `at_exit`, `autoload`, `binding`, `callcc`, `caller`, `catch`, `chomp`, `chop`, `class_eval`, `class_variables`, `clone`, `const_defined?`, `const_get`, `const_missing`, `const_set`, `constants`, `display`, `dup`, `eval`, `exec`, `exit`, `extend`, `fail`, `fork`, `format`, `freeze`, `getc`, `gets`, `global_variables`, `gsub`, `hash`, `id`, `included_modules`, `inspect`, `instance_eval`, `instance_method`, `instance_methods`, `instance_variable_get`, `instance_variable_set`, `instance_variables`, `lambda`, `load`, `local_variables`, `loop`, `method`, `method_missing`, `methods`, `module_eval`, `name`, `object_id`, `open`, `p`, `print`, `printf`, `private_class_method`, `private_instance_methods`, `private_methods`, `proc`, `protected_instance_methods`, `protected_methods`, `public_class_method`, `public_instance_methods`, `public_methods`, `putc`, `puts`, `raise`, `rand`, `readline`, `readlines`, `require`, `scan`, `select`, `self`, `send`, `set_trace_func`, `singleton_methods`, `sleep`, `split`, `sprintf`, `srand`, `sub`, `syscall`, `system`, `taint`, `test`, `throw`, `to_a`, `to_s`, `trace_var`, `trap`, `untaint`, `untrace_var`, `warn`), NameBuiltin, nil},
36 {`__(FILE|LINE)__\b`, NameBuiltinPseudo, nil},
37 {"(?<!\\w)(<<-?)([\"`\\']?)([a-zA-Z_]\\w*)(\\2)(.*?\\n)", String, nil},
38 {`(<<-?)("|\')()(\2)(.*?\n)`, String, nil},
39 {`__END__`, CommentPreproc, Push("end-part")},
40 {`(?:^|(?<=[=<>~!:])|(?<=(?:\s|;)when\s)|(?<=(?:\s|;)or\s)|(?<=(?:\s|;)and\s)|(?<=\.index\s)|(?<=\.scan\s)|(?<=\.sub\s)|(?<=\.sub!\s)|(?<=\.gsub\s)|(?<=\.gsub!\s)|(?<=\.match\s)|(?<=(?:\s|;)if\s)|(?<=(?:\s|;)elsif\s)|(?<=^when\s)|(?<=^index\s)|(?<=^scan\s)|(?<=^sub\s)|(?<=^gsub\s)|(?<=^sub!\s)|(?<=^gsub!\s)|(?<=^match\s)|(?<=^if\s)|(?<=^elsif\s))(\s*)(/)`, ByGroups(Text, LiteralStringRegex), Push("multiline-regex")},
41 {`(?<=\(|,|\[)/`, LiteralStringRegex, Push("multiline-regex")},
42 {`(\s+)(/)(?![\s=])`, ByGroups(Text, LiteralStringRegex), Push("multiline-regex")},
43 {`(0_?[0-7]+(?:_[0-7]+)*)(\s*)([/?])?`, ByGroups(LiteralNumberOct, Text, Operator), nil},
44 {`(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*)(\s*)([/?])?`, ByGroups(LiteralNumberHex, Text, Operator), nil},
45 {`(0b[01]+(?:_[01]+)*)(\s*)([/?])?`, ByGroups(LiteralNumberBin, Text, Operator), nil},
46 {`([\d]+(?:[_e]\d+)*)(\s*)([/?])?`, ByGroups(LiteralNumberInteger, Text, Operator), nil},
47 {`@@[a-zA-Z_]\w*`, NameVariableClass, nil},
48 {`@[a-zA-Z_]\w*`, NameVariableInstance, nil},
49 {`\$\w+`, NameVariableGlobal, nil},
50 {"\\$[!@&`\\'+~=/\\\\,;.<>_*$?:\"^-]", NameVariableGlobal, nil},
51 {`\$-[0adFiIlpvw]`, NameVariableGlobal, nil},
52 {`::`, Operator, nil},
53 Include("strings"),
54 {`\?(\\[MC]-)*(\\([\\abefnrstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)(?!\w)`, LiteralStringChar, nil},
55 {`[A-Z]\w+`, NameConstant, nil},
56 {Words(`(\.|::)`, ``, `*`, `**`, `-`, `+`, `-@`, `+@`, `/`, `%`, `&`, `|`, `^`, "`", `~`, `[]`, `[]=`, `<<`, `>>`, `<`, `<>`, `<=>`, `>`, `>=`, `==`, `===`), ByGroups(Operator, NameOperator), nil},
57 {"(\\.|::)([a-zA-Z_]\\w*[!?]?|[*%&^`~+\\-/\\[<>=])", ByGroups(Operator, Name), nil},
58 {`[a-zA-Z_]\w*[!?]?`, Name, nil},
59 {`(\[|\]|\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|!~|&&?|\|\||\.{1,3})`, Operator, nil},
60 {`[-+/*%=<>&!^|~]=?`, Operator, nil},
61 {`[(){};,/?:\\]`, Punctuation, nil},
62 {`\s+`, Text, nil},
63 },
64 "funcname": {
65 {`\(`, Punctuation, Push("defexpr")},
66 {"(?:([a-zA-Z_]\\w*)(\\.))?([a-zA-Z_]\\w*[!?]?|\\*\\*?|[-+]@?|[/%&|^`~]|\\[\\]=?|<<|>>|<=?>|>=?|===?)", ByGroups(NameClass, Operator, NameFunction), Pop(1)},
67 Default(Pop(1)),
68 },
69 "classname": {
70 {`\(`, Punctuation, Push("defexpr")},
71 {`<<`, Operator, Pop(1)},
72 {`[A-Z_]\w*`, NameClass, Pop(1)},
73 Default(Pop(1)),
74 },
75 "defexpr": {
76 {`(\))(\.|::)?`, ByGroups(Punctuation, Operator), Pop(1)},
77 {`\(`, Operator, Push()},
78 Include("root"),
79 },
80 "in-intp": {
81 {`\{`, LiteralStringInterpol, Push()},
82 {`\}`, LiteralStringInterpol, Pop(1)},
83 Include("root"),
84 },
85 "string-intp": {
86 {`#\{`, LiteralStringInterpol, Push("in-intp")},
87 {`#@@?[a-zA-Z_]\w*`, LiteralStringInterpol, nil},
88 {`#\$[a-zA-Z_]\w*`, LiteralStringInterpol, nil},
89 },
90 "string-intp-escaped": {
91 Include("string-intp"),
92 {`\\([\\abefnrstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})`, LiteralStringEscape, nil},
93 },
94 "interpolated-regex": {
95 Include("string-intp"),
96 {`[\\#]`, LiteralStringRegex, nil},
97 {`[^\\#]+`, LiteralStringRegex, nil},
98 },
99 "interpolated-string": {
100 Include("string-intp"),
101 {`[\\#]`, LiteralStringOther, nil},
102 {`[^\\#]+`, LiteralStringOther, nil},
103 },
104 "multiline-regex": {
105 Include("string-intp"),
106 {`\\\\`, LiteralStringRegex, nil},
107 {`\\/`, LiteralStringRegex, nil},
108 {`[\\#]`, LiteralStringRegex, nil},
109 {`[^\\/#]+`, LiteralStringRegex, nil},
110 {`/[mixounse]*`, LiteralStringRegex, Pop(1)},
111 },
112 "end-part": {
113 {`.+`, CommentPreproc, Pop(1)},
114 },
115 "strings": {
116 {`\:@{0,2}[a-zA-Z_]\w*[!?]?`, LiteralStringSymbol, nil},
117 {Words(`\:@{0,2}`, ``, `*`, `**`, `-`, `+`, `-@`, `+@`, `/`, `%`, `&`, `|`, `^`, "`", `~`, `[]`, `[]=`, `<<`, `>>`, `<`, `<>`, `<=>`, `>`, `>=`, `==`, `===`), LiteralStringSymbol, nil},
118 {`:'(\\\\|\\'|[^'])*'`, LiteralStringSymbol, nil},
119 {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil},
120 {`:"`, LiteralStringSymbol, Push("simple-sym")},
121 {`([a-zA-Z_]\w*)(:)(?!:)`, ByGroups(LiteralStringSymbol, Punctuation), nil},
122 {`"`, LiteralStringDouble, Push("simple-string")},
123 {"(?<!\\.)`", LiteralStringBacktick, Push("simple-backtick")},
124 {`%[QWx]?\{`, LiteralStringOther, Push("cb-intp-string")},
125 {`%[qsw]\{`, LiteralStringOther, Push("cb-string")},
126 {`%r\{`, LiteralStringRegex, Push("cb-regex")},
127 {`%[QWx]?\[`, LiteralStringOther, Push("sb-intp-string")},
128 {`%[qsw]\[`, LiteralStringOther, Push("sb-string")},
129 {`%r\[`, LiteralStringRegex, Push("sb-regex")},
130 {`%[QWx]?\(`, LiteralStringOther, Push("pa-intp-string")},
131 {`%[qsw]\(`, LiteralStringOther, Push("pa-string")},
132 {`%r\(`, LiteralStringRegex, Push("pa-regex")},
133 {`%[QWx]?<`, LiteralStringOther, Push("ab-intp-string")},
134 {`%[qsw]<`, LiteralStringOther, Push("ab-string")},
135 {`%r<`, LiteralStringRegex, Push("ab-regex")},
136 {`(%r([\W_]))((?:\\\2|(?!\2).)*)(\2[mixounse]*)`, String, nil},
137 {`%[qsw]([\W_])((?:\\\1|(?!\1).)*)\1`, LiteralStringOther, nil},
138 {`(%[QWx]([\W_]))((?:\\\2|(?!\2).)*)(\2)`, String, nil},
139 {`(?<=[-+/*%=<>&!^|~,(])(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)`, ByGroups(Text, LiteralStringOther, None), nil},
140 {`^(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)`, ByGroups(Text, LiteralStringOther, None), nil},
141 {`(%([^a-zA-Z0-9\s]))((?:\\\2|(?!\2).)*)(\2)`, String, nil},
142 },
143 "simple-string": {
144 Include("string-intp-escaped"),
145 {`[^\\"#]+`, LiteralStringDouble, nil},
146 {`[\\#]`, LiteralStringDouble, nil},
147 {`"`, LiteralStringDouble, Pop(1)},
148 },
149 "simple-sym": {
150 Include("string-intp-escaped"),
151 {`[^\\"#]+`, LiteralStringSymbol, nil},
152 {`[\\#]`, LiteralStringSymbol, nil},
153 {`"`, LiteralStringSymbol, Pop(1)},
154 },
155 "simple-backtick": {
156 Include("string-intp-escaped"),
157 {"[^\\\\`#]+", LiteralStringBacktick, nil},
158 {`[\\#]`, LiteralStringBacktick, nil},
159 {"`", LiteralStringBacktick, Pop(1)},
160 },
161 "cb-intp-string": {
162 {`\\[\\{}]`, LiteralStringOther, nil},
163 {`\{`, LiteralStringOther, Push()},
164 {`\}`, LiteralStringOther, Pop(1)},
165 Include("string-intp-escaped"),
166 {`[\\#{}]`, LiteralStringOther, nil},
167 {`[^\\#{}]+`, LiteralStringOther, nil},
168 },
169 "cb-string": {
170 {`\\[\\{}]`, LiteralStringOther, nil},
171 {`\{`, LiteralStringOther, Push()},
172 {`\}`, LiteralStringOther, Pop(1)},
173 {`[\\#{}]`, LiteralStringOther, nil},
174 {`[^\\#{}]+`, LiteralStringOther, nil},
175 },
176 "cb-regex": {
177 {`\\[\\{}]`, LiteralStringRegex, nil},
178 {`\{`, LiteralStringRegex, Push()},
179 {`\}[mixounse]*`, LiteralStringRegex, Pop(1)},
180 Include("string-intp"),
181 {`[\\#{}]`, LiteralStringRegex, nil},
182 {`[^\\#{}]+`, LiteralStringRegex, nil},
183 },
184 "sb-intp-string": {
185 {`\\[\\\[\]]`, LiteralStringOther, nil},
186 {`\[`, LiteralStringOther, Push()},
187 {`\]`, LiteralStringOther, Pop(1)},
188 Include("string-intp-escaped"),
189 {`[\\#\[\]]`, LiteralStringOther, nil},
190 {`[^\\#\[\]]+`, LiteralStringOther, nil},
191 },
192 "sb-string": {
193 {`\\[\\\[\]]`, LiteralStringOther, nil},
194 {`\[`, LiteralStringOther, Push()},
195 {`\]`, LiteralStringOther, Pop(1)},
196 {`[\\#\[\]]`, LiteralStringOther, nil},
197 {`[^\\#\[\]]+`, LiteralStringOther, nil},
198 },
199 "sb-regex": {
200 {`\\[\\\[\]]`, LiteralStringRegex, nil},
201 {`\[`, LiteralStringRegex, Push()},
202 {`\][mixounse]*`, LiteralStringRegex, Pop(1)},
203 Include("string-intp"),
204 {`[\\#\[\]]`, LiteralStringRegex, nil},
205 {`[^\\#\[\]]+`, LiteralStringRegex, nil},
206 },
207 "pa-intp-string": {
208 {`\\[\\()]`, LiteralStringOther, nil},
209 {`\(`, LiteralStringOther, Push()},
210 {`\)`, LiteralStringOther, Pop(1)},
211 Include("string-intp-escaped"),
212 {`[\\#()]`, LiteralStringOther, nil},
213 {`[^\\#()]+`, LiteralStringOther, nil},
214 },
215 "pa-string": {
216 {`\\[\\()]`, LiteralStringOther, nil},
217 {`\(`, LiteralStringOther, Push()},
218 {`\)`, LiteralStringOther, Pop(1)},
219 {`[\\#()]`, LiteralStringOther, nil},
220 {`[^\\#()]+`, LiteralStringOther, nil},
221 },
222 "pa-regex": {
223 {`\\[\\()]`, LiteralStringRegex, nil},
224 {`\(`, LiteralStringRegex, Push()},
225 {`\)[mixounse]*`, LiteralStringRegex, Pop(1)},
226 Include("string-intp"),
227 {`[\\#()]`, LiteralStringRegex, nil},
228 {`[^\\#()]+`, LiteralStringRegex, nil},
229 },
230 "ab-intp-string": {
231 {`\\[\\<>]`, LiteralStringOther, nil},
232 {`<`, LiteralStringOther, Push()},
233 {`>`, LiteralStringOther, Pop(1)},
234 Include("string-intp-escaped"),
235 {`[\\#<>]`, LiteralStringOther, nil},
236 {`[^\\#<>]+`, LiteralStringOther, nil},
237 },
238 "ab-string": {
239 {`\\[\\<>]`, LiteralStringOther, nil},
240 {`<`, LiteralStringOther, Push()},
241 {`>`, LiteralStringOther, Pop(1)},
242 {`[\\#<>]`, LiteralStringOther, nil},
243 {`[^\\#<>]+`, LiteralStringOther, nil},
244 },
245 "ab-regex": {
246 {`\\[\\<>]`, LiteralStringRegex, nil},
247 {`<`, LiteralStringRegex, Push()},
248 {`>[mixounse]*`, LiteralStringRegex, Pop(1)},
249 Include("string-intp"),
250 {`[\\#<>]`, LiteralStringRegex, nil},
251 {`[^\\#<>]+`, LiteralStringRegex, nil},
252 },
253 }
254 }
255
View as plain text