From 940fcf9e183ab4f29204ef4f3ea92c01de8cc08a Mon Sep 17 00:00:00 2001 From: pyfisch Date: Thu, 28 May 2020 17:39:55 +0200 Subject: Allow delimiter quotes at the end of multiline strings (#393) TOML allows (unlike many other formats) up to 2 additonal quotes that are part of the string: basic = """2 extra quotes -->""""" literal = '''here too '''' Changed in TOML v1.0.0-rc.1 See also #392 --- src/tokens.rs | 10 +++++++++- test-suite/tests/valid.rs | 6 ++++++ test-suite/tests/valid/string-delim-end.json | 14 ++++++++++++++ test-suite/tests/valid/string-delim-end.toml | 3 +++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 test-suite/tests/valid/string-delim-end.json create mode 100644 test-suite/tests/valid/string-delim-end.toml diff --git a/src/tokens.rs b/src/tokens.rs index 49265fb..fd8b6b9 100644 --- a/src/tokens.rs +++ b/src/tokens.rs @@ -334,7 +334,7 @@ impl<'a> Tokenizer<'a> { return Err(Error::NewlineInString(i)); } } - Some((i, ch)) if ch == delim => { + Some((mut i, ch)) if ch == delim => { if multiline { if !self.eatc(delim) { val.push(delim); @@ -345,6 +345,14 @@ impl<'a> Tokenizer<'a> { val.push(delim); continue 'outer; } + if self.eatc(delim) { + val.push(delim); + i += 1; + } + if self.eatc(delim) { + val.push(delim); + i += 1; + } } return Ok(String { src: &self.input[start..self.current()], diff --git a/test-suite/tests/valid.rs b/test-suite/tests/valid.rs index 0bb7caa..0745cc8 100644 --- a/test-suite/tests/valid.rs +++ b/test-suite/tests/valid.rs @@ -389,3 +389,9 @@ test!( include_str!("valid/float-exponent.toml"), include_str!("valid/float-exponent.json") ); + +test!( + string_delim_end, + include_str!("valid/string-delim-end.toml"), + include_str!("valid/string-delim-end.json") +); diff --git a/test-suite/tests/valid/string-delim-end.json b/test-suite/tests/valid/string-delim-end.json new file mode 100644 index 0000000..69b5a0a --- /dev/null +++ b/test-suite/tests/valid/string-delim-end.json @@ -0,0 +1,14 @@ +{ + "str1": { + "type": "string", + "value": "\"This,\" she said, \"is just a pointless statement.\"" + }, + "str2": { + "type": "string", + "value": "foo''bar''" + }, + "str3": { + "type": "string", + "value": "\"\"" + } +} \ No newline at end of file diff --git a/test-suite/tests/valid/string-delim-end.toml b/test-suite/tests/valid/string-delim-end.toml new file mode 100644 index 0000000..9a41219 --- /dev/null +++ b/test-suite/tests/valid/string-delim-end.toml @@ -0,0 +1,3 @@ +str1 = """"This," she said, "is just a pointless statement."""" +str2 = '''foo''bar''''' +str3 = """""""" -- cgit v1.2.3