1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- package raymond
- import (
- "bytes"
- "strings"
- )
- //
- // That whole file is borrowed from https://github.com/golang/go/tree/master/src/html/escape.go
- //
- // With changes:
- // ' => '
- // " => "
- //
- // To stay in sync with JS implementation, and make mustache tests pass.
- //
- type writer interface {
- WriteString(string) (int, error)
- }
- const escapedChars = `&'<>"`
- func escape(w writer, s string) error {
- i := strings.IndexAny(s, escapedChars)
- for i != -1 {
- if _, err := w.WriteString(s[:i]); err != nil {
- return err
- }
- var esc string
- switch s[i] {
- case '&':
- esc = "&"
- case '\'':
- esc = "'"
- case '<':
- esc = "<"
- case '>':
- esc = ">"
- case '"':
- esc = """
- default:
- panic("unrecognized escape character")
- }
- s = s[i+1:]
- if _, err := w.WriteString(esc); err != nil {
- return err
- }
- i = strings.IndexAny(s, escapedChars)
- }
- _, err := w.WriteString(s)
- return err
- }
- // Escape escapes special HTML characters.
- //
- // It can be used by helpers that return a SafeString and that need to escape some content by themselves.
- func Escape(s string) string {
- if strings.IndexAny(s, escapedChars) == -1 {
- return s
- }
- var buf bytes.Buffer
- escape(&buf, s)
- return buf.String()
- }
|