diff --git a/SPEC.md b/SPEC.md index 7e1b0c0..371499c 100644 --- a/SPEC.md +++ b/SPEC.md @@ -430,7 +430,9 @@ before the closing `"""`. All in-between lines that contain non-newline characters _MUST_ start with _at least_ the exact same whitespace as the final line (precisely matching codepoints, not merely counting characters or "size"); -they may contain additional whitesapce following this prefix. +they may contain additional whitesapce following this prefix. The lines in +between may contain unescaped `"` (but no unescaped `"""` as this would close +the string). The value of the Multi-Line String omits the first and last Newline, the Whitespace of the last line, and the matching Whitespace prefix on all @@ -611,10 +613,9 @@ The Raw String variants are indicated by preceding the strings's opening quotes with one or more `#` characters. The string is then closed by its normal closing quotes, followed by a _matching_ number of `#` characters. -This means that the string may contain a lone `"` or `"""`, -or `"#`/etc with a _different_ number of `#` characters -than what is used to open the string; -only an exact match actually closes the string. +This means that the string may contain any combination of `"` and `#` characters +other than its closing delimiter (e.g., if a raw string starts with `##"`, it can +contain `"` or `"#`, but not `"##` or `"###`). Like other Strings, Raw Strings _MUST NOT_ include any of the [disallowed literal code-points](#disallowed-literal-code-points) as code points in their @@ -653,7 +654,7 @@ You can show examples of """ without worrying about escapes. ``` -or equivalently, `#"You can show examples of """\n multi-line strings\n """\nwithout worrying about escapes."#` as a Quoted String. +or equivalently, `"You can show examples of \"\"\"\n multi-line strings\n \"\"\"\nwithout worrying about escapes."` as a Quoted String. ### Number @@ -856,7 +857,7 @@ disallowed-keyword-identifiers := 'true' - 'false' - 'null' - 'inf' - '-inf' - ' quoted-string := '"' single-line-string-body '"' | '"""' newline multi-line-string-body newline unicode-space*) '"""' single-line-string-body := (string-character - newline)* -multi-line-string-body := string-character* +multi-line-string-body := (('"' | '""')? string-character)* string-character := '\' escape | [^\\"] - disallowed-literal-code-points escape := ["\\bfnrts] | 'u{' hex-digit{1, 6} '}' | (unicode-space | newline)+ hex-digit := [0-9a-fA-F] diff --git a/tests/test_cases/expected_kdl/multiline_raw_string_containing_quotes.kdl b/tests/test_cases/expected_kdl/multiline_raw_string_containing_quotes.kdl new file mode 100644 index 0000000..6b04c7c --- /dev/null +++ b/tests/test_cases/expected_kdl/multiline_raw_string_containing_quotes.kdl @@ -0,0 +1 @@ +node "\"\"\"triple-quote\"\"\"\n##\"too few quotes\"##\n#\"\"\"too few #\"\"\"#" diff --git a/tests/test_cases/expected_kdl/multiline_string_containing_quotes.kdl b/tests/test_cases/expected_kdl/multiline_string_containing_quotes.kdl new file mode 100644 index 0000000..03dc73b --- /dev/null +++ b/tests/test_cases/expected_kdl/multiline_string_containing_quotes.kdl @@ -0,0 +1 @@ +node "this string contains \"quotes\", twice\"\"" diff --git a/tests/test_cases/input/multiline_raw_string_containing_quotes.kdl b/tests/test_cases/input/multiline_raw_string_containing_quotes.kdl new file mode 100644 index 0000000..44b4ad2 --- /dev/null +++ b/tests/test_cases/input/multiline_raw_string_containing_quotes.kdl @@ -0,0 +1,5 @@ +node ##""" +"""triple-quote""" +##"too few quotes"## +#"""too few #"""# +"""## diff --git a/tests/test_cases/input/multiline_string_containing_quotes.kdl b/tests/test_cases/input/multiline_string_containing_quotes.kdl new file mode 100644 index 0000000..d13c3e7 --- /dev/null +++ b/tests/test_cases/input/multiline_string_containing_quotes.kdl @@ -0,0 +1,3 @@ +node """ +this string contains "quotes", twice"" +"""