Mercurial > hg > soundsoftware-site
comparison vendor/gems/coderay-1.0.0/lib/coderay/scanners/ruby/string_state.rb @ 909:cbb26bc654de redmine-1.3
Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author | Chris Cannam |
---|---|
date | Fri, 24 Feb 2012 19:09:32 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
908:c6c2cbd0afee | 909:cbb26bc654de |
---|---|
1 # encoding: utf-8 | |
2 module CodeRay | |
3 module Scanners | |
4 | |
5 class Ruby | |
6 | |
7 class StringState < Struct.new :type, :interpreted, :delim, :heredoc, | |
8 :opening_paren, :paren_depth, :pattern, :next_state # :nodoc: all | |
9 | |
10 CLOSING_PAREN = Hash[ *%w[ | |
11 ( ) | |
12 [ ] | |
13 < > | |
14 { } | |
15 ] ].each { |k,v| k.freeze; v.freeze } # debug, if I try to change it with << | |
16 | |
17 STRING_PATTERN = Hash.new do |h, k| | |
18 delim, interpreted = *k | |
19 # delim = delim.dup # workaround for old Ruby | |
20 delim_pattern = Regexp.escape(delim) | |
21 if closing_paren = CLOSING_PAREN[delim] | |
22 delim_pattern << Regexp.escape(closing_paren) | |
23 end | |
24 delim_pattern << '\\\\' unless delim == '\\' | |
25 | |
26 # special_escapes = | |
27 # case interpreted | |
28 # when :regexp_symbols | |
29 # '| [|?*+(){}\[\].^$]' | |
30 # end | |
31 | |
32 h[k] = | |
33 if interpreted && delim != '#' | |
34 / (?= [#{delim_pattern}] | \# [{$@] ) /mx | |
35 else | |
36 / (?= [#{delim_pattern}] ) /mx | |
37 end | |
38 end | |
39 | |
40 def initialize kind, interpreted, delim, heredoc = false | |
41 if heredoc | |
42 pattern = heredoc_pattern delim, interpreted, heredoc == :indented | |
43 delim = nil | |
44 else | |
45 pattern = STRING_PATTERN[ [delim, interpreted] ] | |
46 if closing_paren = CLOSING_PAREN[delim] | |
47 opening_paren = delim | |
48 delim = closing_paren | |
49 paren_depth = 1 | |
50 end | |
51 end | |
52 super kind, interpreted, delim, heredoc, opening_paren, paren_depth, pattern, :initial | |
53 end | |
54 | |
55 def heredoc_pattern delim, interpreted, indented | |
56 # delim = delim.dup # workaround for old Ruby | |
57 delim_pattern = Regexp.escape(delim) | |
58 delim_pattern = / (?:\A|\n) #{ '(?>[ \t]*)' if indented } #{ Regexp.new delim_pattern } $ /x | |
59 if interpreted | |
60 / (?= #{delim_pattern}() | \\ | \# [{$@] ) /mx # $1 set == end of heredoc | |
61 else | |
62 / (?= #{delim_pattern}() | \\ ) /mx | |
63 end | |
64 end | |
65 | |
66 end | |
67 | |
68 end | |
69 | |
70 end | |
71 end |