Skip to content

Commit 3fe8e71

Browse files
committed
support for arrays
1 parent 40f7e82 commit 3fe8e71

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

lib/coderay/scanners/bash.rb

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,14 @@ def scan_tokens encoder, options
121121
kind = :global_variable
122122
elsif match = scan(/ \$\{ [^\}]+ \} /ox)
123123
match =~ /\$\{(.*)\}/
124-
kind = IDENT_KIND[$1]
124+
var=$1
125+
if var =~ /\[.*\]/
126+
encoder.text_token("${", :instance_variable)
127+
match_array(var, encoder)
128+
encoder.text_token("}", :instance_variable)
129+
next
130+
end
131+
kind = IDENT_KIND[var]
125132
kind = :instance_variable if kind == :ident
126133
elsif match = scan(/ \$\( [^\)]+ \) /ox)
127134
kind = :shell
@@ -140,10 +147,10 @@ def scan_tokens encoder, options
140147
encoder.text_token(op, :operator)
141148
next
142149
end
143-
elsif match = scan(/[A-Za-z_]+\[[A-Za-z_\d]+\]/)
150+
elsif match = scan(/[A-Za-z_]+\[[A-Za-z_\@\*\d]+\]/)
144151
# array
145-
kind = IDENT_KIND(match)
146-
kind = :instance_variable if kind == :ident
152+
match_array(match, encoder)
153+
next
147154
elsif match = scan(/ \$[A-Za-z_][A-Za-z_0-9]* /ox)
148155
match =~ /\$(.*)/
149156
kind = IDENT_KIND[$1]
@@ -188,7 +195,17 @@ def scan_tokens encoder, options
188195
kind = :predefined_constant
189196
elsif match = scan(/ (?: \$\(\(.*?\)\) ) /x)
190197
kind = :global_variable
191-
elsif match = scan(/ \$\{?[A-Za-z_][A-Za-z_\d]*\}? /x)
198+
elsif match = scan(/ \$ (?: (?: \{ [^\}]* \}) | (?: [A-Za-z_0-9]+ ) ) /x)
199+
match =~ /(\$\{?)([^\}]*)(\}?)/
200+
pre=$1
201+
var=$2
202+
post=$3
203+
if var =~ /\[.*?\]/
204+
encoder.text_token(pre,:instance_variable)
205+
match_array(var, encoder)
206+
encoder.text_token(post,:instance_variable)
207+
next
208+
end
192209
kind = IDENT_KIND[match]
193210
kind = :instance_variable if kind == :ident
194211
elsif match = scan(/[^#{@quote}\\]+/)
@@ -208,6 +225,18 @@ def scan_tokens encoder, options
208225
encoder
209226
end
210227

228+
229+
def match_array(match, encoder)
230+
match =~ /([A-Za-z_]+)\[(.*?)\]/
231+
var = $1
232+
key = $2
233+
kind = IDENT_KIND[var]
234+
kind = :instance_variable if kind == :ident
235+
encoder.text_token(var, kind)
236+
encoder.text_token("[", :operator)
237+
encoder.text_token(key, :key)
238+
encoder.text_token("]", :operator)
239+
end
211240

212241
def handle_error(match, options)
213242
o = {:ignore_errors => true}.merge(options)

0 commit comments

Comments
 (0)