diff options
author | Robert Griesemer <gri@golang.org> | 2008-12-09 15:29:15 -0800 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2008-12-09 15:29:15 -0800 |
commit | 4d1ed91f80b9d86053f9828e5b5328da87eca49f (patch) | |
tree | 27cd4038c030c05dd5af84ba5c5a88a2ae2ad52e /usr/gri/pretty/htmlwriter.go | |
parent | 9069efb250a3747f751a6bb1f89615a8846a6cc0 (diff) | |
download | golang-4d1ed91f80b9d86053f9828e5b5328da87eca49f.tar.gz |
- snapshot if current state
- fix pretty printer to work with new tabwriter interface
R=r
OCL=20854
CL=20854
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); } |