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:
parent
1cb1251436
commit
816f5b3124
@ -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());
|
||||||
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
"&<>!@ #$%^\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{ };
|
||||||
|
Loading…
Reference in New Issue
Block a user