1
0
mirror of https://github.com/golang/go synced 2024-11-22 15:54:52 -07:00

better html support.

turn on error reporting; not enough info otherwise.

R=r
DELTA=49  (43 added, 6 deleted, 0 changed)
OCL=27476
CL=27478
This commit is contained in:
Russ Cox 2009-04-15 00:05:47 -07:00
parent 1cb1251436
commit 816f5b3124
3 changed files with 44 additions and 7 deletions

View File

@ -12,12 +12,6 @@ import (
"reflect"; "reflect";
) )
// HtmlFormatter formats arbitrary values for HTML
// TODO: do something for real.
func HtmlFormatter(w io.Write, value interface{}, format string) {
fmt.Fprint(w, value);
}
// StringFormatter formats into the default string representation. // StringFormatter formats into the default string representation.
// It is stored under the name "str" and is the default formatter. // It is stored under the name "str" and is the default formatter.
// You can override the default formatter by storing your default // You can override the default formatter by storing your default
@ -25,3 +19,36 @@ func HtmlFormatter(w io.Write, value interface{}, format string) {
func StringFormatter(w io.Write, value interface{}, format string) { func StringFormatter(w io.Write, value interface{}, format string) {
fmt.Fprint(w, value); fmt.Fprint(w, value);
} }
var esc_amp = io.StringBytes("&")
var esc_lt = io.StringBytes("<")
var esc_gt = io.StringBytes(">")
// HtmlEscape writes to w the properly escaped HTML equivalent
// of the plain text data s.
func HtmlEscape(w io.Write, s []byte) {
last := 0;
for i, c := range s {
if c == '&' || c == '<' || c == '>' {
w.Write(s[last:i]);
switch c {
case '&':
w.Write(esc_amp);
case '<':
w.Write(esc_lt);
case '>':
w.Write(esc_gt);
}
last = i+1;
}
}
w.Write(s[last:len(s)]);
}
// HtmlFormatter formats arbitrary values for HTML
func HtmlFormatter(w io.Write, value interface{}, format string) {
var b io.ByteBuffer;
fmt.Fprint(&b, value);
HtmlEscape(w, b.Data());
}

View File

@ -67,6 +67,7 @@ type state struct {
// Report error and stop generation. // Report error and stop generation.
func (st *state) error(err *os.Error, args ...) { func (st *state) error(err *os.Error, args ...) {
fmt.Fprintf(os.Stderr, "template: %v%s\n", err, fmt.Sprint(args));
st.errorchan <- err; st.errorchan <- err;
sys.Goexit(); sys.Goexit();
} }

View File

@ -25,6 +25,7 @@ type T struct {
type S struct { type S struct {
header string; header string;
integer int; integer int;
raw string;
data []T; data []T;
pdata []*T; pdata []*T;
empty []*T; empty []*T;
@ -161,7 +162,14 @@ var tests = []*Test {
"HEADER=78\n" "HEADER=78\n"
"Header=77\n" "Header=77\n"
}, },
&Test{
"{raw}\n"
"{raw|html}\n",
"&<>!@ #$%^\n"
"&amp;&lt;&gt;!@ #$%^\n"
},
} }
func TestAll(t *testing.T) { func TestAll(t *testing.T) {
@ -169,6 +177,7 @@ func TestAll(t *testing.T) {
// initialized by hand for clarity. // initialized by hand for clarity.
s.header = "Header"; s.header = "Header";
s.integer = 77; s.integer = 77;
s.raw = "&<>!@ #$%^";
s.data = []T{ t1, t2 }; s.data = []T{ t1, t2 };
s.pdata = []*T{ &t1, &t2 }; s.pdata = []*T{ &t1, &t2 };
s.empty = []*T{ }; s.empty = []*T{ };