toml: eat first nl if present in multiline strings (#12496)
parent
81455acd29
commit
3b612899bf
|
@ -1127,6 +1127,13 @@ pub fn (mut p Parser) quoted() ast.Quoted {
|
||||||
mut lit := p.tok.lit[1..p.tok.lit.len - 1]
|
mut lit := p.tok.lit[1..p.tok.lit.len - 1]
|
||||||
if is_multiline {
|
if is_multiline {
|
||||||
lit = p.tok.lit[3..p.tok.lit.len - 3]
|
lit = p.tok.lit[3..p.tok.lit.len - 3]
|
||||||
|
// From https://toml.io/en/v1.0.0#string
|
||||||
|
// "Multi-line literal strings [...] A newline immediately following the opening
|
||||||
|
// delimiter will be trimmed. All other content between the delimiters
|
||||||
|
// is interpreted as-is without modification."
|
||||||
|
if lit.len > 0 && lit[0] == `\n` {
|
||||||
|
lit = lit[1..]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ast.Quoted{
|
return ast.Quoted{
|
||||||
text: lit
|
text: lit
|
||||||
|
|
|
@ -18,7 +18,8 @@ const (
|
||||||
|
|
||||||
valid_value_exceptions = [
|
valid_value_exceptions = [
|
||||||
// String
|
// String
|
||||||
'string/raw-multiline.toml', // This test is not correct. Our parser *correctly* includes the newline at the start of the raw multiline.
|
'string/double-quote-escape.toml',
|
||||||
|
'string/unicode-escape.toml',
|
||||||
'string/escapes.toml',
|
'string/escapes.toml',
|
||||||
'string/escape-tricky.toml',
|
'string/escape-tricky.toml',
|
||||||
'string/multiline.toml',
|
'string/multiline.toml',
|
||||||
|
|
|
@ -40,9 +40,9 @@ fn test_multiline_strings() {
|
||||||
value = toml_doc.value('multi2')
|
value = toml_doc.value('multi2')
|
||||||
assert value.string() == 'one\ntwo'
|
assert value.string() == 'one\ntwo'
|
||||||
value = toml_doc.value('multi3')
|
value = toml_doc.value('multi3')
|
||||||
assert value.string() == '\none\ntwo\nthree'
|
assert value.string() == 'one\ntwo\nthree'
|
||||||
value = toml_doc.value('multi4')
|
value = toml_doc.value('multi4')
|
||||||
assert value.string() == '\none\ntwo\nthree\nfour\n'
|
assert value.string() == 'one\ntwo\nthree\nfour\n'
|
||||||
|
|
||||||
toml_doc = toml.parse(toml_multiline_text_2) or { panic(err) }
|
toml_doc = toml.parse(toml_multiline_text_2) or { panic(err) }
|
||||||
value = toml_doc.value('multi1')
|
value = toml_doc.value('multi1')
|
||||||
|
@ -50,9 +50,9 @@ fn test_multiline_strings() {
|
||||||
value = toml_doc.value('multi2')
|
value = toml_doc.value('multi2')
|
||||||
assert value.string() == 'one\ntwo'
|
assert value.string() == 'one\ntwo'
|
||||||
value = toml_doc.value('multi3')
|
value = toml_doc.value('multi3')
|
||||||
assert value.string() == '\none\ntwo\nthree'
|
assert value.string() == 'one\ntwo\nthree'
|
||||||
value = toml_doc.value('multi4')
|
value = toml_doc.value('multi4')
|
||||||
assert value.string() == '\none\ntwo\nthree\nfour\n'
|
assert value.string() == 'one\ntwo\nthree\nfour\n'
|
||||||
|
|
||||||
toml_file :=
|
toml_file :=
|
||||||
os.real_path(os.join_path(os.dir(@FILE), 'testdata', os.file_name(@FILE).all_before_last('.'))) +
|
os.real_path(os.join_path(os.dir(@FILE), 'testdata', os.file_name(@FILE).all_before_last('.'))) +
|
||||||
|
@ -91,7 +91,7 @@ fn test_literal_strings() {
|
||||||
// See `.gitattributes` in the project root for the rule in action.
|
// See `.gitattributes` in the project root for the rule in action.
|
||||||
// These lines would look like this on Windows:
|
// These lines would look like this on Windows:
|
||||||
// assert toml_doc.value('ml_lit1').string() == '\r\n\\'
|
// assert toml_doc.value('ml_lit1').string() == '\r\n\\'
|
||||||
assert toml_doc.value('ml_lit1').string() == '\n\\'
|
assert toml_doc.value('ml_lit1').string() == '\\'
|
||||||
assert toml_doc.value('ml_lit2').string() == '\\\n\\'
|
assert toml_doc.value('ml_lit2').string() == '\\\n\\'
|
||||||
assert toml_doc.value('ml_lit3').string() == '\\\ntricky\\\n'
|
assert toml_doc.value('ml_lit3').string() == '\\\ntricky\\\n'
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue