mirror of
https://github.com/golang/go
synced 2024-11-25 10:07:56 -07:00
use new tab indentation format in godoc, but convert
leading tabs into spaces to ensure a good outcome in most browsers R=rsc https://golang.org/cl/165051
This commit is contained in:
parent
d2a835fbf3
commit
7fcf422181
@ -453,16 +453,84 @@ func (s *Styler) Token(tok token.Token) (text []byte, tag printer.HTMLTag) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Tab conversion
|
||||||
|
|
||||||
|
var spaces = strings.Bytes(" ") // 16 spaces seems like a good number
|
||||||
|
|
||||||
|
const (
|
||||||
|
indenting = iota
|
||||||
|
collecting
|
||||||
|
)
|
||||||
|
|
||||||
|
// A tconv is an io.Writer filter for converting leading tabs into spaces.
|
||||||
|
type tconv struct {
|
||||||
|
output io.Writer
|
||||||
|
state int // indenting or collecting
|
||||||
|
indent int // valid if state == indenting
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (p *tconv) writeIndent(n int) (err os.Error) {
|
||||||
|
i := n * *tabwidth
|
||||||
|
for i > len(spaces) {
|
||||||
|
i -= len(spaces)
|
||||||
|
if _, err = p.output.Write(spaces); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err = p.output.Write(spaces[0:i])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (p *tconv) Write(data []byte) (n int, err os.Error) {
|
||||||
|
pos := 0 // valid if p.state == collecting
|
||||||
|
var b byte
|
||||||
|
for n, b = range data {
|
||||||
|
switch p.state {
|
||||||
|
case indenting:
|
||||||
|
if b == '\t' {
|
||||||
|
p.indent++
|
||||||
|
} else {
|
||||||
|
p.state = collecting
|
||||||
|
pos = n
|
||||||
|
if err = p.writeIndent(p.indent); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case collecting:
|
||||||
|
if b == '\n' {
|
||||||
|
p.state = indenting
|
||||||
|
p.indent = 0
|
||||||
|
if _, err = p.output.Write(data[pos : n+1]); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
n = len(data)
|
||||||
|
if p.state == collecting {
|
||||||
|
_, err = p.output.Write(data[pos:])
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Templates
|
// Templates
|
||||||
|
|
||||||
// Write an AST-node to w; optionally html-escaped.
|
// Write an AST-node to w; optionally html-escaped.
|
||||||
func writeNode(w io.Writer, node interface{}, html bool, styler printer.Styler) {
|
func writeNode(w io.Writer, node interface{}, html bool, styler printer.Styler) {
|
||||||
mode := printer.UseSpaces | printer.NoSemis
|
mode := printer.TabIndent | printer.UseSpaces | printer.NoSemis
|
||||||
if html {
|
if html {
|
||||||
mode |= printer.GenHTML
|
mode |= printer.GenHTML
|
||||||
}
|
}
|
||||||
(&printer.Config{mode, *tabwidth, styler}).Fprint(w, node)
|
// convert trailing tabs into spaces using a tconv filter
|
||||||
|
// to ensure a good outcome in most browsers (there may still
|
||||||
|
// be tabs in comments and strings, but converting those into
|
||||||
|
// the right number of spaces is much harder)
|
||||||
|
(&printer.Config{mode, *tabwidth, styler}).Fprint(&tconv{output: w}, node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user