Skip to content

Commit 15c314d

Browse files
committed
fix #106: re-introduce highlightinging of { key: value } in Ruby 1.9 hashes
1 parent b71ff6a commit 15c314d

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

Changes.textile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ p=. _This files lists all changes in the CodeRay library since the 0.9.8 release
44

55
{{toc}}
66

7+
h2. Changes in 1.0.9
8+
9+
* Fix Ruby scanner: Ruby 1.9 hash syntax @{ key: value }@ is highlighted correctly. [GH #106, thanks to Seth Vargo]
10+
711
h2. Changes in 1.0.8
812

913
* add @:string/:char@, remove @:regexp/:function@ color from Terminal encoder [GH #29, thanks to Kyrylo Silin]

lib/coderay/scanners/ruby.rb

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,18 +94,27 @@ def scan_tokens encoder, options
9494
if !method_call_expected &&
9595
match = scan(unicode ? /#{patterns::METHOD_NAME}/uo :
9696
/#{patterns::METHOD_NAME}/o)
97-
value_expected = false
98-
kind = patterns::IDENT_KIND[match]
99-
if kind == :ident
100-
if match[/\A[A-Z]/] && !(match[/[!?]$/] || match?(/\(/))
101-
kind = :constant
97+
98+
if value_expected != :colon_expected && scan(/:(?= )/)
99+
value_expected = true
100+
encoder.text_token match, :key
101+
encoder.text_token ':', :operator
102+
else
103+
value_expected = false
104+
kind = patterns::IDENT_KIND[match]
105+
if kind == :ident
106+
if match[/\A[A-Z]/] && !(match[/[!?]$/] || match?(/\(/))
107+
kind = :constant
108+
end
109+
elsif kind == :keyword
110+
state = patterns::KEYWORD_NEW_STATE[match]
111+
if patterns::KEYWORDS_EXPECTING_VALUE[match]
112+
value_expected = match == 'when' ? :colon_expected : true
113+
end
102114
end
103-
elsif kind == :keyword
104-
state = patterns::KEYWORD_NEW_STATE[match]
105-
value_expected = true if patterns::KEYWORDS_EXPECTING_VALUE[match]
115+
value_expected = true if !value_expected && check(/#{patterns::VALUE_FOLLOWS}/o)
116+
encoder.text_token match, kind
106117
end
107-
value_expected = true if !value_expected && check(/#{patterns::VALUE_FOLLOWS}/o)
108-
encoder.text_token match, kind
109118

110119
elsif method_call_expected &&
111120
match = scan(unicode ? /#{patterns::METHOD_AFTER_DOT}/uo :
@@ -213,7 +222,7 @@ def scan_tokens encoder, options
213222
encoder.text_token match, :integer
214223

215224
elsif match = scan(/ %=? | <(?:<|=>?)? | \? /x)
216-
value_expected = true
225+
value_expected = match == '?' ? :colon_expected : true
217226
encoder.text_token match, :operator
218227

219228
elsif match = scan(/`/)

0 commit comments

Comments
 (0)