diff --git a/lib/graphql/language.rb b/lib/graphql/language.rb index 69f5276f53..d8f967ac16 100644 --- a/lib/graphql/language.rb +++ b/lib/graphql/language.rb @@ -47,13 +47,19 @@ def self.serialize(value) def self.escape_single_quoted_newlines(query_str) scanner = StringScanner.new(query_str) inside_single_quoted_string = false + inside_triple_quoted_string = false new_query_str = nil while !scanner.eos? - if scanner.skip(/(?:\\"|[^"\n\r]|""")+/m) + if scanner.skip('"""') + inside_triple_quoted_string = !inside_triple_quoted_string + new_query_str && (new_query_str << scanner.matched) + elsif scanner.skip(/(?:\\"|[^"\n\r])+/m) new_query_str && (new_query_str << scanner.matched) elsif scanner.skip('"') new_query_str && (new_query_str << '"') - inside_single_quoted_string = !inside_single_quoted_string + if !inside_triple_quoted_string + inside_single_quoted_string = !inside_single_quoted_string + end elsif scanner.skip("\n") if inside_single_quoted_string new_query_str ||= query_str[0, scanner.pos - 1] diff --git a/spec/graphql/language/parser_spec.rb b/spec/graphql/language/parser_spec.rb index f00a17fa4b..4f3d181e01 100644 --- a/spec/graphql/language/parser_spec.rb +++ b/spec/graphql/language/parser_spec.rb @@ -72,6 +72,7 @@ # No modification to block strings: "{ a(\"\"\"\n abc\n\"\"\") }" => "{ a(\"\"\"\n abc\n\"\"\") }", "{ a(\"\"\"\r\n abc\r\n\"\"\") }" => "{ a(\"\"\"\r\n abc\r\n\"\"\") }", + "{ x(s: \"\"\"The user said \"Did\n\"you change my input ?\"\"\") }" => "{ x(s: \"\"\"The user said \"Did\n\"you change my input ?\"\"\") }", } replacements.each_with_index do |(before_str, after_str), idx|