func escapeText()

in encoding/xml/escape.go [94:137]


func escapeText(e writer, s []byte) {
	var esc []byte
	last := 0
	for i := 0; i < len(s); {
		r, width := utf8.DecodeRune(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':
			// This always escapes newline, which is different than stdlib's optional
			// escape of new line.
			esc = escNL
		case '\r':
			esc = escCR
		case '\u0085':
			// Not escaped by stdlib
			esc = escNextLine
		case '\u2028':
			// Not escaped by stdlib
			esc = escLS
		default:
			if !isInCharacterRange(r) || (r == 0xFFFD && width == 1) {
				esc = escFFFD
				break
			}
			continue
		}
		e.Write(s[last : i-width])
		e.Write(esc)
		last = i
	}
	e.Write(s[last:])
}