diff --git a/lib/encoder/encoder.go b/lib/encoder/encoder.go index 7d5197dfa..f46cd8d63 100644 --- a/lib/encoder/encoder.go +++ b/lib/encoder/encoder.go @@ -92,8 +92,22 @@ func (mask MultiEncoder) Encode(in string) string { encodeRightSpace = uint(mask)&EncodeRightSpace != 0 encodeRightPeriod = uint(mask)&EncodeRightPeriod != 0 encodeInvalidUnicode = uint(mask)&EncodeInvalidUtf8 != 0 + encodeDot = uint(mask)&EncodeDot != 0 ) + if encodeDot { + switch in { + case ".": + return "." + case "..": + return ".." + case ".": + return string(QuoteRune) + "." + case "..": + return string(QuoteRune) + "." + string(QuoteRune) + "." + } + } + // handle prefix only replacements prefix := "" if encodeLeftSpace && len(in) > 0 { // Leading SPACE @@ -299,8 +313,22 @@ func (mask MultiEncoder) Decode(in string) string { encodeRightSpace = uint(mask)&EncodeRightSpace != 0 encodeRightPeriod = uint(mask)&EncodeRightPeriod != 0 encodeInvalidUnicode = uint(mask)&EncodeInvalidUtf8 != 0 + encodeDot = uint(mask)&EncodeDot != 0 ) + if encodeDot { + switch in { + case ".": + return "." + case "..": + return ".." + case string(QuoteRune) + ".": + return "." + case string(QuoteRune) + "." + string(QuoteRune) + ".": + return ".." + } + } + // handle prefix only replacements prefix := "" if r, l1 := utf8.DecodeRuneInString(in); encodeLeftSpace && r == '␠' { // SYMBOL FOR SPACE diff --git a/lib/encoder/encoder_test.go b/lib/encoder/encoder_test.go index 889540663..7e9c34551 100644 --- a/lib/encoder/encoder_test.go +++ b/lib/encoder/encoder_test.go @@ -102,6 +102,49 @@ func TestEncodeInvalidUnicode(t *testing.T) { }) } } + +func TestEncodeDot(t *testing.T) { + for i, tc := range []testCase{ + { + mask: 0, + in: ".", + out: ".", + }, { + mask: EncodeDot, + in: ".", + out: ".", + }, { + mask: 0, + in: "..", + out: "..", + }, { + mask: EncodeDot, + in: "..", + out: "..", + }, { + mask: EncodeDot, + in: "...", + out: "...", + }, { + mask: EncodeDot, + in: ". .", + out: ". .", + }, + } { + e := MultiEncoder(tc.mask) + t.Run(strconv.FormatInt(int64(i), 10), func(t *testing.T) { + got := e.Encode(tc.in) + if got != tc.out { + t.Errorf("Encode(%q) want %q got %q", tc.in, tc.out, got) + } + got2 := e.Decode(got) + if got2 != tc.in { + t.Errorf("Decode(%q) want %q got %q", got, tc.in, got2) + } + }) + } +} + func TestDecodeHalf(t *testing.T) { for i, tc := range []testCase{ {