| // 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, format string, value ...interface{}) { |
| if len(value) == 1 { |
| if b, ok := value[0].([]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, format string, value ...interface{}) { |
| ok := false |
| var b []byte |
| if len(value) == 1 { |
| b, ok = value[0].([]byte) |
| } |
| if !ok { |
| var buf bytes.Buffer |
| fmt.Fprint(&buf, value...) |
| b = buf.Bytes() |
| } |
| HTMLEscape(w, b) |
| } |