summaryrefslogtreecommitdiff
path: root/usr/gri/pretty/htmlwriter.go
diff options
context:
space:
mode:
Diffstat (limited to 'usr/gri/pretty/htmlwriter.go')
-rw-r--r--usr/gri/pretty/htmlwriter.go42
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 = "&lt;";
+ case '&': s = "&amp;";
+ 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);
}