Commit 77aaf4f3 authored by Robert Griesemer's avatar Robert Griesemer

- adjusted const decl grammar to reflect spec changes

- first cut at html writer (will do html escaping, html tag production)
- first cut at generating basic html output via pretty
- some cleanups

R=r
OCL=20550
CL=20550
parent 7354b864
...@@ -37,7 +37,7 @@ parser.6: scanner.6 ast.6 ...@@ -37,7 +37,7 @@ parser.6: scanner.6 ast.6
platform.6: utils.6 platform.6: utils.6
printer.6: scanner.6 ast.6 printer.6: scanner.6 ast.6 htmlwriter.6
%.6: %.go %.6: %.go
$(G) $(F) $< $(G) $(F) $<
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package htmlwriter
import (
"os";
"io";
"array";
"utf8";
)
// 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.
export type Writer struct {
// TODO should not export any of the fields
writer io.Write;
}
func (b *Writer) Init(writer io.Write) *Writer {
b.writer = writer;
return b;
}
/* export */ func (b *Writer) Flush() *os.Error {
return nil;
}
/* 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;
}
export func New(writer io.Write) *Writer {
return new(Writer).Init(writer);
}
...@@ -1348,11 +1348,11 @@ func (P *Parser) ParseConstSpec(exported bool, pos int) *AST.Decl { ...@@ -1348,11 +1348,11 @@ func (P *Parser) ParseConstSpec(exported bool, pos int) *AST.Decl {
P.Trace("ConstSpec"); P.Trace("ConstSpec");
d := AST.NewDecl(pos, Scanner.CONST, exported); d := AST.NewDecl(pos, Scanner.CONST, exported);
d.ident = P.ParseIdent(); d.ident = P.ParseIdentList();
d.typ = P.TryType(); d.typ = P.TryType();
if P.tok == Scanner.ASSIGN { if P.tok == Scanner.ASSIGN {
P.Next(); P.Next();
d.val = P.ParseExpression(1); d.val = P.ParseExpressionList();
} }
P.Ecart(); P.Ecart();
......
...@@ -10,6 +10,7 @@ import ( ...@@ -10,6 +10,7 @@ import (
"tabwriter"; "tabwriter";
"flag"; "flag";
"fmt"; "fmt";
"htmlwriter";
Scanner "scanner"; Scanner "scanner";
AST "ast"; AST "ast";
) )
...@@ -24,6 +25,7 @@ var ( ...@@ -24,6 +25,7 @@ var (
maxnewlines = flag.Int("maxnewlines", 3, nil, "max. number of consecutive newlines"); maxnewlines = flag.Int("maxnewlines", 3, nil, "max. number of consecutive newlines");
// formatting control // formatting control
html = flag.Bool("html", false, nil, "generate html");
comments = flag.Bool("comments", true, nil, "print comments"); comments = flag.Bool("comments", true, nil, "print comments");
optsemicolons = flag.Bool("optsemicolons", false, nil, "print optional semicolons"); optsemicolons = flag.Bool("optsemicolons", false, nil, "print optional semicolons");
) )
...@@ -53,7 +55,7 @@ const ( ...@@ -53,7 +55,7 @@ const (
type Printer struct { type Printer struct {
// output // output
writer *tabwriter.Writer; writer *htmlwriter.Writer;
// comments // comments
comments *array.Array; // the list of all comments comments *array.Array; // the list of all comments
...@@ -90,14 +92,10 @@ func (P *Printer) NextComment() { ...@@ -90,14 +92,10 @@ func (P *Printer) NextComment() {
} }
func (P *Printer) Init(writer *tabwriter.Writer, comments *array.Array) { func (P *Printer) Init(writer *htmlwriter.Writer, comments *array.Array) {
// writer // writer
padchar := byte(' '); P.writer = writer;
if usetabs.BVal() {
padchar = '\t';
}
P.writer = tabwriter.New(os.Stdout, int(tabwidth.IVal()), 1, padchar, true);
// comments // comments
P.comments = comments; P.comments = comments;
P.cindex = -1; P.cindex = -1;
...@@ -299,12 +297,6 @@ func (P *Printer) String(pos int, s string) { ...@@ -299,12 +297,6 @@ func (P *Printer) String(pos int, s string) {
} }
func (P *Printer) Separator(separator int) {
P.separator = separator;
P.String(0, "");
}
func (P *Printer) Token(pos int, tok int) { func (P *Printer) Token(pos int, tok int) {
P.String(pos, Scanner.TokenString(tok)); P.String(pos, Scanner.TokenString(tok));
} }
...@@ -317,6 +309,47 @@ func (P *Printer) Error(pos int, tok int, msg string) { ...@@ -317,6 +309,47 @@ func (P *Printer) Error(pos int, tok int, msg string) {
} }
// ----------------------------------------------------------------------------
// HTML support
// TODO Move this to html writer
func (P *Printer) HtmlPrologue(title string) {
if html.BVal() {
P.String(0,
"<html>\n"
"<head>\n"
" <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n"
" <title>" + title + "</title>\n"
" <style type=\"text/css\">\n"
" </style>\n"
"</head>\n"
"<body>\n"
"<pre>\n"
)
}
}
func (P *Printer) HtmlEpilogue() {
if html.BVal() {
P.String(0,
"</pre>\n"
"</body>\n"
"<html>\n"
)
}
}
func (P *Printer) HtmlIdentifier(pos int, ident string) {
if html.BVal() {
P.String(pos, `<a href="#` + ident + `">` + ident + `</a>`);
} else {
P.String(pos, ident);
}
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Types // Types
...@@ -331,9 +364,9 @@ func (P *Printer) Parameters(pos int, list *array.Array) { ...@@ -331,9 +364,9 @@ func (P *Printer) Parameters(pos int, list *array.Array) {
x := list.At(i).(*AST.Expr); x := list.At(i).(*AST.Expr);
if i > 0 { if i > 0 {
if prev == x.tok || prev == Scanner.TYPE { if prev == x.tok || prev == Scanner.TYPE {
P.Separator(comma); P.separator = comma;
} else { } else {
P.Separator(blank); P.separator = blank;
} }
} }
P.Expr(x); P.Expr(x);
...@@ -458,7 +491,10 @@ func (P *Printer) Expr1(x *AST.Expr, prec1 int) { ...@@ -458,7 +491,10 @@ func (P *Printer) Expr1(x *AST.Expr, prec1 int) {
// type expr // type expr
P.Type(x.t); P.Type(x.t);
case Scanner.IDENT, Scanner.INT, Scanner.STRING, Scanner.FLOAT: case Scanner.IDENT:
P.HtmlIdentifier(x.pos, x.s);
case Scanner.INT, Scanner.STRING, Scanner.FLOAT:
// literal // literal
P.String(x.pos, x.s); P.String(x.pos, x.s);
...@@ -799,16 +835,16 @@ export func Print(prog *AST.Program) { ...@@ -799,16 +835,16 @@ export func Print(prog *AST.Program) {
if usetabs.BVal() { if usetabs.BVal() {
padchar = '\t'; padchar = '\t';
} }
writer := tabwriter.New(os.Stdout, int(tabwidth.IVal()), 1, padchar, true); twriter := tabwriter.New(os.Stdout, int(tabwidth.IVal()), 1, padchar, true);
hwriter := htmlwriter.New(twriter);
var P Printer; var P Printer;
P.Init(writer, prog.comments); P.Init(hwriter, prog.comments);
P.HtmlPrologue("<the source>");
P.Program(prog); P.Program(prog);
P.HtmlEpilogue();
// flush
P.String(0, ""); // flush pending separator/newlines P.String(0, ""); // flush pending separator/newlines
err := P.writer.Flush(); hwriter.Flush(); // ignore errors
if err != nil { twriter.Flush(); // ignore errors
panic("print error - exiting");
}
} }
...@@ -61,7 +61,7 @@ func f1(tag int) { ...@@ -61,7 +61,7 @@ func f1(tag int) {
func f2(tag int) { func f2(tag int) {
type T1 struct {} type T struct {}
var x T var x T
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment