lib/nydp/tokeniser.rb in nydp-0.0.7 vs lib/nydp/tokeniser.rb in nydp-0.0.8
- old
+ new
@@ -23,11 +23,11 @@
def close_delimiter? scanner, delim
return (no_more? ? '' : nil) if (delim == :eof)
scanner.scan(delim)
end
- def next_string_fragment open_delimiter, close_delimiter, interpolation_sign
+ def next_string_fragment open_delimiter, close_delimiter, interpolation_sign, interpolation_escapes={ }
s = @scanner
rep = "#{open_delimiter}"
string = ""
while (!no_more?)
if esc = s.scan(/\\/)
@@ -40,12 +40,26 @@
end
rep << ch
elsif closer = close_delimiter?(s, close_delimiter)
rep << closer
return StringFragmentCloseToken.new(string, rep)
- elsif interpolation_sign && (start_interpolation = s.scan(interpolation_sign))
- rep << start_interpolation
- return StringFragmentToken.new(string, rep)
+ elsif interpolation_sign
+ escaped = false
+ interpolation_escapes.each do |esc, repl|
+ if !escaped && (escape = s.scan esc)
+ string << ((repl == true) ? escape : repl)
+ rep << escape
+ escaped = true
+ end
+ end
+ if !escaped && (start_interpolation = s.scan(interpolation_sign))
+ rep << start_interpolation
+ return StringFragmentToken.new(string, rep)
+ else
+ ch = s.getch
+ string << ch
+ rep << ch
+ end
else
ch = s.getch
string << ch
rep << ch
end