diff --git a/lib/phaad/generator.rb b/lib/phaad/generator.rb index ff377bc..2cae34b 100644 --- a/lib/phaad/generator.rb +++ b/lib/phaad/generator.rb @@ -54,7 +54,7 @@ def process(sexp) when :@int, :@float emit sexp[1] when :@tstring_content - emit "\"#{sexp[1]}\"" + emit "\"#{sexp[1].gsub('"', '\"')}\"" when :string_content sexp[1..-1].each_with_index do |exp, i| unless exp[0] == :string_embexpr && exp[1][0][0] == :void_stmt diff --git a/spec/generator/string_spec.rb b/spec/generator/string_spec.rb index 13b2bfa..1896390 100644 --- a/spec/generator/string_spec.rb +++ b/spec/generator/string_spec.rb @@ -1,6 +1,21 @@ require 'spec_helper' describe Phaad::Generator, 'string' do + context "escaping" do + it "should parse double quotes" do + compile(%q{'"'}).should == %q{"\"";} + compile(%q{'\"'}).should == %q{"\\\"";} + compile(%q{'\\"'}).should == %q{"\\\"";} + end + + ## + # Ripper parses single quotes the same as double quotes. There's no way to + # know if a single quote was used or a double quote was. + # it "should respect escape sequences in single and double quotes" do + # compile(%q{"\n"}).should == %q{"\\n";} + # compile(%q{'\n'}).should == %q{"\\\\n";} + # end + end context "string interpolation" do it "should parse simple interpolation" do compile('"a #{b}"').should == '"a " . $b;'