@@ -278,6 +278,15 @@ func (ky *Encoder) renderScalar(node *yaml.Node, indent int, flags flagMask, out
278278
279279const kyamlFoldStr = "\\ \n "
280280
281+ var regularEscapeMap = map [rune ]string {
282+ '\n' : "\\ n" + kyamlFoldStr , // use YAML's line folding to make the output more readable
283+ '\t' : "\t " , // literal tab
284+ }
285+ var compactEscapeMap = map [rune ]string {
286+ '\n' : "\\ n" ,
287+ '\t' : "\\ t" ,
288+ }
289+
281290// renderString processes a string (either single-line or multi-line),
282291// rendering it to the output. This DOES NOT render a trailing newline.
283292func (ky * Encoder ) renderString (val string , indent int , flags flagMask , out io.Writer ) error {
@@ -290,11 +299,10 @@ func (ky *Encoder) renderString(val string, indent int, flags flagMask, out io.W
290299 return nil
291300 }
292301
293- // What to print when we find a newline in the input.
294- newline := "\\ n"
295- if ! compact {
296- // We use YAML's line folding to make the output more readable.
297- newline += kyamlFoldStr
302+ // Special cases for certain input.
303+ escapeOverrides := regularEscapeMap
304+ if compact {
305+ escapeOverrides = compactEscapeMap
298306 }
299307
300308 //
@@ -325,7 +333,7 @@ func (ky *Encoder) renderString(val string, indent int, flags flagMask, out io.W
325333 fmt .Fprintf (buf , "%02x" , s [0 ])
326334 continue
327335 }
328- ky .appendEscapedRune (r , indent , newline , buf )
336+ ky .appendEscapedRune (r , indent , escapeOverrides , buf )
329337 }
330338
331339 // closing quote
@@ -485,7 +493,7 @@ func parseTimestamp(s string) (time.Time, bool) {
485493}
486494
487495// We use a buffer here so we can peek backwards.
488- func (ky * Encoder ) appendEscapedRune (r rune , indent int , newline string , buf * bytes.Buffer ) {
496+ func (ky * Encoder ) appendEscapedRune (r rune , indent int , escapeOverrides map [ rune ] string , buf * bytes.Buffer ) {
489497 afterNewline := buf .Bytes ()[len (buf .Bytes ())- 1 ] == '\n'
490498
491499 if afterNewline {
@@ -504,6 +512,10 @@ func (ky *Encoder) appendEscapedRune(r rune, indent int, newline string, buf *by
504512 buf .WriteRune (' ' )
505513 }
506514 }
515+ if s , found := escapeOverrides [r ]; found {
516+ buf .WriteString (s )
517+ return
518+ }
507519 if r == '"' || r == '\\' { // always escaped
508520 buf .WriteRune ('\\' )
509521 buf .WriteRune (r )
@@ -521,7 +533,7 @@ func (ky *Encoder) appendEscapedRune(r rune, indent int, newline string, buf *by
521533 case '\f' :
522534 buf .WriteString (`\f` )
523535 case '\n' :
524- buf .WriteString (newline )
536+ buf .WriteString (`\n` )
525537 case '\r' :
526538 buf .WriteString (`\r` )
527539 case '\t' :
0 commit comments