Make UseSingleQuote compliant with the YAML spec (#647)

* Make UseSingleQuote compliant with the YAML spec

* Make it self-explanatory
This commit is contained in:
Yusuke Kuoka 2025-02-12 14:22:42 +09:00 committed by GitHub
parent 3992548fbe
commit 13e918a61d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 3 deletions

View file

@ -704,7 +704,7 @@ func TestEncoder(t *testing.T) {
},
// Quote style
{
`v: '\'a\'b'` + "\n",
`v: '''a''b'` + "\n",
map[string]string{"v": `'a'b`},
[]yaml.EncodeOption{
yaml.UseSingleQuote(true),
@ -717,6 +717,13 @@ func TestEncoder(t *testing.T) {
yaml.UseSingleQuote(false),
},
},
{
`a: '\.yaml'` + "\n",
map[string]string{"a": `\.yaml`},
[]yaml.EncodeOption{
yaml.UseSingleQuote(true),
},
},
}
for _, test := range tests {
t.Run(test.source, func(t *testing.T) {

View file

@ -53,8 +53,18 @@ func appendQuotedWith(buf []byte, s string, quote byte) []byte {
func appendEscapedRune(buf []byte, r rune, quote byte) []byte {
var runeTmp [utf8.UTFMax]byte
if r == rune(quote) || r == '\\' { // always backslashed
buf = append(buf, '\\')
// goccy/go-yaml patch on top of the standard library's appendEscapedRune function.
//
// We use this to implement the YAML single-quoted string, where the only escape sequence is '', which represents a single quote.
// The below snippet from the standard library is for escaping e.g. \ with \\, which is not what we want for the single-quoted string.
//
// if r == rune(quote) || r == '\\' { // always backslashed
// buf = append(buf, '\\')
// buf = append(buf, byte(r))
// return buf
// }
if r == rune(quote) {
buf = append(buf, byte(r))
buf = append(buf, byte(r))
return buf
}