| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Template library: default formatters | |
| package template | |
| import ( | |
| "bytes" | |
| "fmt" | |
| "io" | |
| ) | |
| // StringFormatter formats into the default string representation. | |
| // It is stored under the name "str" and is the default formatter. | |
| // You can override the default formatter by storing your default | |
| // under the name "" in your custom formatter map. | |
| func StringFormatter(w io.Writer, value interface{}, format string) { | |
| if b, ok := value.([]byte); ok { | |
| w.Write(b) | |
| return | |
| } | |
| fmt.Fprint(w, value) | |
| } | |
| var ( | |
| esc_quot = []byte(""") // shorter than """ | |
| esc_apos = []byte("'") // shorter than "'" | |
| esc_amp = []byte("&") | |
| esc_lt = []byte("<") | |
| esc_gt = []byte(">") | |
| ) | |
| // HTMLEscape writes to w the properly escaped HTML equivalent | |
| // of the plain text data s. | |
| func HTMLEscape(w io.Writer, s []byte) { | |
| var esc []byte | |
| last := 0 | |
| for i, c := range s { | |
| switch c { | |
| case '"': | |
| esc = esc_quot | |
| case '\'': | |
| esc = esc_apos | |
| case '&': | |
| esc = esc_amp | |
| case '<': | |
| esc = esc_lt | |
| case '>': | |
| esc = esc_gt | |
| default: | |
| continue | |
| } | |
| w.Write(s[last:i]) | |
| w.Write(esc) | |
| last = i + 1 | |
| } | |
| w.Write(s[last:]) | |
| } | |
| // HTMLFormatter formats arbitrary values for HTML | |
| func HTMLFormatter(w io.Writer, value interface{}, format string) { | |
| b, ok := value.([]byte) | |
| if !ok { | |
| var buf bytes.Buffer | |
| fmt.Fprint(&buf, value) | |
| b = buf.Bytes() | |
| } | |
| HTMLEscape(w, b) | |
| } |