diff options
Diffstat (limited to 'usr/gri/pretty/htmlwriter.go')
-rw-r--r-- | usr/gri/pretty/htmlwriter.go | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/usr/gri/pretty/htmlwriter.go b/usr/gri/pretty/htmlwriter.go index 0e4cf6a4e..0a65d108c 100644 --- a/usr/gri/pretty/htmlwriter.go +++ b/usr/gri/pretty/htmlwriter.go @@ -7,13 +7,13 @@ package htmlwriter import ( "os"; "io"; - "array"; - "utf8"; + "fmt"; ) // Writer is a filter implementing the io.Write interface. // It provides facilities to generate HTML tags and does -// proper HTML-escaping for text written through it. +// HTML-escaping for text written through Write. Incoming +// text is assumed to be UTF-8 encoded. export type Writer struct { // TODO should not export any of the fields @@ -27,17 +27,43 @@ func (b *Writer) Init(writer io.Write) *Writer { } -/* export */ func (b *Writer) Flush() *os.Error { - return nil; +/* export */ func (p *Writer) Write(buf *[]byte) (written int, err *os.Error) { + i0 := 0; + for i := i0; i < len(buf); i++ { + var s string; + switch buf[i] { + case '<': s = "<"; + case '&': s = "&"; + default: continue; + } + // write HTML escape instead of buf[i] + w1, e1 := p.writer.Write(buf[i0 : i]); + if e1 != nil { + return i0 + w1, e1; + } + w2, e2 := io.WriteString(p.writer, s); + if e2 != nil { + return i0 + w1 /* not w2! */, e2; + } + i0 = i + 1; + } + written, err = p.writer.Write(buf[i0 : len(buf)]); + return len(buf), err; } -/* export */ func (b *Writer) Write(buf *[]byte) (written int, err *os.Error) { - written, err = b.writer.Write(buf); // BUG 6g - should just have return - return written, err; +// ---------------------------------------------------------------------------- +// HTML-specific interface + +/* export */ func (p *Writer) Tag(s string) { + // TODO proper error handling + io.WriteString(p.writer, s); } +// ---------------------------------------------------------------------------- +// + export func New(writer io.Write) *Writer { return new(Writer).Init(writer); } |