d2/d2format/escape.go
Alexander Wang 524c089a74 oss
Co-authored-by: Anmol Sethi <hi@nhooyr.io>
2022-11-03 06:54:49 -07:00

88 lines
1.4 KiB
Go

package d2format
import (
"strings"
"oss.terrastruct.com/d2/d2ast"
)
func escapeSingleQuotedValue(s string) string {
var b strings.Builder
for _, r := range s {
switch r {
case '\'':
b.WriteByte('\'')
case '\n':
// TODO: Unified string syntax.
b.WriteByte('\\')
b.WriteByte('n')
continue
}
b.WriteRune(r)
}
return b.String()
}
func escapeDoubledQuotedValue(s string, inKey bool) string {
var b strings.Builder
for _, r := range s {
switch r {
case '"', '\\':
b.WriteByte('\\')
case '\n':
b.WriteByte('\\')
b.WriteByte('n')
continue
}
if !inKey && r == '$' {
b.WriteByte('\\')
}
b.WriteRune(r)
}
return b.String()
}
func escapeUnquotedValue(s string, inKey bool) string {
if len(s) == 0 {
return `""`
}
if strings.EqualFold(s, "null") {
return "\\null"
}
var b strings.Builder
for i, r := range s {
switch r {
case '\'', '"', '|':
if i == 0 {
b.WriteByte('\\')
}
case '\n':
b.WriteByte('\\')
b.WriteByte('n')
continue
default:
if inKey {
switch r {
case '-':
if i+1 < len(s) && s[i+1] == '-' {
b.WriteByte('\\')
}
case '&':
if i == 0 {
b.WriteByte('\\')
}
default:
if strings.ContainsRune(d2ast.UnquotedKeySpecials, r) {
b.WriteByte('\\')
}
}
} else if strings.ContainsRune(d2ast.UnquotedValueSpecials, r) {
b.WriteByte('\\')
}
}
b.WriteRune(r)
}
return b.String()
}