mirror of
https://github.com/imgproxy/imgproxy.git
synced 2025-12-23 22:11:10 +02:00
74 lines
1.4 KiB
Go
74 lines
1.4 KiB
Go
package svgparser
|
|
|
|
import (
|
|
"bufio"
|
|
"unicode/utf8"
|
|
)
|
|
|
|
var (
|
|
escQuot = []byte(""")
|
|
escApos = []byte("'")
|
|
escAmp = []byte("&")
|
|
escLT = []byte("<")
|
|
escGT = []byte(">")
|
|
escTab = []byte("	")
|
|
escNL = []byte("
")
|
|
escCR = []byte("
")
|
|
escFFFD = []byte("\uFFFD") // Unicode replacement character
|
|
)
|
|
|
|
// escapeString writes an escaped version of a string to the writer.
|
|
// It's a copy of xml.EscapeText with changed escape replacements.
|
|
func escapeString(w *bufio.Writer, s string) error {
|
|
var esc []byte
|
|
last := 0
|
|
for i := 0; i < len(s); {
|
|
r, width := utf8.DecodeRuneInString(s[i:])
|
|
i += width
|
|
switch r {
|
|
case '"':
|
|
esc = escQuot
|
|
case '\'':
|
|
esc = escApos
|
|
case '&':
|
|
esc = escAmp
|
|
case '<':
|
|
esc = escLT
|
|
case '>':
|
|
esc = escGT
|
|
case '\t':
|
|
esc = escTab
|
|
case '\n':
|
|
esc = escNL
|
|
case '\r':
|
|
esc = escCR
|
|
default:
|
|
if !isInCharacterRange(r) || (r == 0xFFFD && width == 1) {
|
|
esc = escFFFD
|
|
break
|
|
}
|
|
continue
|
|
}
|
|
if _, err := w.WriteString(s[last : i-width]); err != nil {
|
|
return err
|
|
}
|
|
if _, err := w.Write(esc); err != nil {
|
|
return err
|
|
}
|
|
last = i
|
|
}
|
|
if _, err := w.WriteString(s[last:]); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func isInCharacterRange(r rune) bool {
|
|
return r == 0x09 ||
|
|
r == 0x0A ||
|
|
r == 0x0D ||
|
|
r >= 0x20 && r <= 0xD7FF ||
|
|
r >= 0xE000 && r <= 0xFFFD ||
|
|
r >= 0x10000 && r <= 0x10FFFF
|
|
}
|