diff --git a/responsive.go b/responsive.go index 6d85b6f..896d0ae 100644 --- a/responsive.go +++ b/responsive.go @@ -79,18 +79,13 @@ func escapeCSSString(s string) string { case '\\', '"': b.WriteByte('\\') b.WriteRune(r) - case '\n': - b.WriteString(`\A `) - case '\r': - b.WriteString(`\D `) - case '\f': - b.WriteString(`\C `) - case '\t': - b.WriteString(`\9 `) default: if r < 0x20 || r == 0x7f { b.WriteByte('\\') - b.WriteString(strings.ToUpper(strconv.FormatInt(int64(r), 16))) + esc := strings.ToUpper(strconv.FormatInt(int64(r), 16)) + for i := 0; i < len(esc); i++ { + b.WriteByte(esc[i]) + } b.WriteByte(' ') continue } diff --git a/responsive_test.go b/responsive_test.go index 9438c55..08941ec 100644 --- a/responsive_test.go +++ b/responsive_test.go @@ -126,3 +126,11 @@ func TestVariantSelector_Escapes_Good(t *testing.T) { t.Fatalf("VariantSelector escaping = %q, want %q", got, want) } } + +func TestVariantSelector_ControlChars_Escape_Good(t *testing.T) { + got := VariantSelector("a\tb\nc\u0007") + want := `[data-variant="a\\9 b\\A \\7 "]` + if got != want { + t.Fatalf("VariantSelector control escapes = %q, want %q", got, want) + } +}