diff options
author | Robert Griesemer <gri@golang.org> | 2011-08-12 10:06:32 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2011-08-12 10:06:32 -0700 |
commit | 5233c50321828323959663faf000d599f0cefa6c (patch) | |
tree | a5223cffbcb607c9598fe831a230fefe3132097c | |
parent | 4abbdc0399e401151ea4d4abdab018dc457b8275 (diff) | |
download | go-git-5233c50321828323959663faf000d599f0cefa6c.tar.gz |
godoc: first round of template cleanups
- simplified pipelines
- simplified templates by using template variables
- converted most old-style formatters into new-style funcs
- fixed some escaping bugs (use of url escaping where it was missing)
R=r, dsymonds
CC=golang-dev
https://golang.org/cl/4868044
-rw-r--r-- | lib/godoc/codewalk.html | 10 | ||||
-rw-r--r-- | lib/godoc/codewalkdir.html | 4 | ||||
-rw-r--r-- | lib/godoc/dirlist.html | 6 | ||||
-rw-r--r-- | lib/godoc/error.html | 2 | ||||
-rw-r--r-- | lib/godoc/godoc.html | 12 | ||||
-rw-r--r-- | lib/godoc/package.html | 66 | ||||
-rw-r--r-- | lib/godoc/package.txt | 20 | ||||
-rw-r--r-- | lib/godoc/search.html | 37 | ||||
-rw-r--r-- | lib/godoc/search.txt | 9 | ||||
-rw-r--r-- | src/cmd/godoc/godoc.go | 179 | ||||
-rw-r--r-- | src/cmd/godoc/main.go | 6 |
11 files changed, 150 insertions, 201 deletions
diff --git a/lib/godoc/codewalk.html b/lib/godoc/codewalk.html index 64d2d32253..59a9efcf2d 100644 --- a/lib/godoc/codewalk.html +++ b/lib/godoc/codewalk.html @@ -19,7 +19,7 @@ </a> <select id="code-selector"> {{range .File}} - <option value="/doc/codewalk/?fileprint=/{{.|urlquery_esc}}">{{.|html_esc}}</option> + <option value="/doc/codewalk/?fileprint=/{{url .}}">{{html .}}</option> {{end}} </select> </div> @@ -37,15 +37,15 @@ <div id="comment-area"> {{range .Step}} <div class="comment first last"> - <a class="comment-link" href="/doc/codewalk/?fileprint=/{{.File|urlquery_esc}}&lo={{.Lo|html_esc}}&hi={{.Hi|html_esc}}#mark" target="code-display"></a> - <div class="comment-title">{{.Title|html_esc}}</div> + <a class="comment-link" href="/doc/codewalk/?fileprint=/{{url .File}}&lo={{url .Lo}}&hi={{url .Hi}}#mark" target="code-display"></a> + <div class="comment-title">{{html .Title}}</div> <div class="comment-text"> {{with .Err}} - ERROR LOADING FILE: {{.|html_esc}}<br/><br/> + ERROR LOADING FILE: {{html .}}<br/><br/> {{end}} {{.XML}} </div> - <div class="comment-text file-name"><span class="path-file">{{.|html_esc}}</span></div> + <div class="comment-text file-name"><span class="path-file">{{html .}}</span></div> </div> {{end}} </div> diff --git a/lib/godoc/codewalkdir.html b/lib/godoc/codewalkdir.html index ebfc19aa6b..b174020e8e 100644 --- a/lib/godoc/codewalkdir.html +++ b/lib/godoc/codewalkdir.html @@ -7,9 +7,9 @@ <table class="layout"> {{range .}} <tr> - <td><a href="{{.Name|html_esc}}">{{.Name|html_esc}}</a></td> + <td><a href="{{url .Name}}">{{html .Name}}</a></td> <td width="25"> </td> - <td>{{.Title|html_esc}}</td> + <td>{{html .Title}}</td> </tr> {{end}} </table> diff --git a/lib/godoc/dirlist.html b/lib/godoc/dirlist.html index 7e7d4e7f29..5a3ddfaf39 100644 --- a/lib/godoc/dirlist.html +++ b/lib/godoc/dirlist.html @@ -18,11 +18,11 @@ </tr> {{range .}} <tr> - <td align="left"><a href="{{.|fileInfoName}}">{{.|fileInfoName}}</a></td> + <td align="left"><a href="{{.|fileInfoName|url}}">{{.|fileInfoName|html}}</a></td> <td></td> - <td align="right">{{.|fileInfoSize}}</td> + <td align="right">{{html .Size}}</td> <td></td> - <td align="left">{{.|fileInfoTime}}</td> + <td align="left">{{.|fileInfoTime|html}}</td> </tr> {{end}} diff --git a/lib/godoc/error.html b/lib/godoc/error.html index d349f754fd..7573aa2367 100644 --- a/lib/godoc/error.html +++ b/lib/godoc/error.html @@ -5,5 +5,5 @@ --> <p> -<span class="alert" style="font-size:120%">{{.|html_esc}}</span> +<span class="alert" style="font-size:120%">{{html .}}</span> </p> diff --git a/lib/godoc/godoc.html b/lib/godoc/godoc.html index 37db860b20..91e521258d 100644 --- a/lib/godoc/godoc.html +++ b/lib/godoc/godoc.html @@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> {{with .Title}} - <title>{{.|html_esc}} - The Go Programming Language</title> + <title>{{html .}} - The Go Programming Language</title> {{else}} <title>The Go Programming Language</title> {{end}} @@ -25,7 +25,7 @@ <form method="GET" action="/search"> {{with .PkgRoots}} {{range .PkgRoots}} - <a href="/pkg/{{.|html_esc}}">{{.|html_esc}}</a> <span class="sep">|</span> + <a href="/pkg/{{html .}}">{{html .}}</a> <span class="sep">|</span> {{end}} {{else}} References: @@ -34,7 +34,7 @@ <a href="/cmd/">Commands</a> <span class="sep">|</span> <a href="/doc/go_spec.html">Specification</a> {{if .SearchBox}} - <input id="search" type="search" name="q" value="{{if .Query}}{{.Query|html_esc}}{{end}}" class="{{if .Query}}{{else}}inactive{{end}}" placeholder="code search" results="0" /> + <input id="search" type="search" name="q" value="{{with .Query}}{{html .}}{{end}}" class="{{if not .Query}}inactive{{end}}" placeholder="code search" results="0" /> {{end}} </form> </div> @@ -50,10 +50,10 @@ {{end}} {{with .Title}} - <h1 id="generatedHeader">{{.|html_esc}}</h1> + <h1 id="generatedHeader">{{html .}}</h1> {{end}} {{with .Subtitle}} - <span class="subtitle">{{.|html_esc}}</span> + <span class="subtitle">{{html .}}</span> {{end}} <!-- The Table of Contents is automatically inserted in this <div>. @@ -64,7 +64,7 @@ {{printf "%s" .Content}} </div> <div id="site-info"> - <p>Build version {{.Version|html_esc}}. Except as noted, this content is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 License</a>.</p> + <p>Build version {{html .Version}}. Except as noted, this content is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 License</a>.</p> </div> </div> </body> diff --git a/lib/godoc/package.html b/lib/godoc/package.html index 5a7438b017..b2b8356b04 100644 --- a/lib/godoc/package.html +++ b/lib/godoc/package.html @@ -3,26 +3,22 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -{{$FSet := .FSet}} -{{$Info := .}} {{with .PAst}} - <pre>{{html_esc . $FSet}}</pre> + <pre>{{html_node . $.FSet}}</pre> {{end}} {{with .PDoc}} <!-- PackageName is printed as title by the top-level template --> - {{if $Info.IsPkg}} - {{/* ImportPath is a string - no need for FSet */}} - <p><code>import "{{.ImportPath|html_esc}}"</code></p> + {{if $.IsPkg}} + <p><code>import "{{html .ImportPath}}"</code></p> {{end}} - {{.Doc|html_comment}} - {{if $Info.IsPkg}} + {{html_comment .Doc}} + {{if $.IsPkg}} {{with .Filenames}} - {{/* Filenames are strings - no need for FSet */}} <p> <h4>Package files</h4> <span style="font-size:90%"> {{range .}} - <a href="/{{.|url_src}}">{{.|localname}}</a> + <a href="/{{url_src .}}">{{.|localname|html}}</a> {{end}} </span> </p> @@ -32,53 +28,57 @@ <h2 id="Constants">Constants</h2> {{range .}} {{html_comment .Doc}} - <pre>{{html_esc .Decl $FSet}}</pre> + <pre>{{html_node .Decl $.FSet}}</pre> {{end}} {{end}} {{with .Vars}} <h2 id="Variables">Variables</h2> {{range .}} {{html_comment .Doc}} - <pre>{{html_esc .Decl $FSet}}</pre> + <pre>{{html_node .Decl $.FSet}}</pre> {{end}} {{end}} {{with .Funcs}} {{range .}} {{/* Name is a string - no need for FSet */}} - <h2 id="{{.Name|html_esc}}">func <a href="/{{url_pos .Decl $FSet}}">{{.Name|html_esc}}</a></h2> - <p><code>{{html_esc .Decl $FSet}}</code></p> - {{.Doc|html_comment}} + {{$name := html .Name}} + <h2 id="{{$name}}">func <a href="/{{url_pos .Decl $.FSet}}">{{$name}}</a></h2> + <p><code>{{html_node .Decl $.FSet}}</code></p> + {{html_comment .Doc}} {{end}} {{end}} {{with .Types}} - {{range $type := .}} - <h2 id="{{html_esc .Type.Name $FSet}}">type <a href="/{{url_pos .Decl $FSet}}">{{html_esc .Type.Name $FSet}}</a></h2> - {{.Doc|html_comment}} - <p><pre>{{html_esc .Decl $FSet}}</pre></p> + {{range .}} + {{$tname := html_node .Type.Name $.FSet}} + <h2 id="{{$tname}}">type <a href="/{{url_pos .Decl $.FSet}}">{{$tname}}</a></h2> + {{html_comment .Doc}} + <p><pre>{{html_node .Decl $.FSet}}</pre></p> {{range .Consts}} - {{.Doc|html_comment}} - <pre>{{html_esc .Decl $FSet}}</pre> + {{html_comment .Doc}} + <pre>{{html_node .Decl $.FSet}}</pre> {{end}} {{range .Vars}} - {{.Doc|html_comment}} - <pre>{{html_esc .Decl $FSet}}</pre> + {{html_comment .Doc}} + <pre>{{html_node .Decl $.FSet}}</pre> {{end}} {{range .Factories}} - <h3 id="{{html_esc $type.Type.Name $FSet}}.{{.Name|html_esc}}">func <a href="/{{url_pos .Decl $FSet}}">{{.Name|html_esc}}</a></h3> - <p><code>{{html_esc .Decl $FSet}}</code></p> - {{.Doc|html_comment}} + {{$name := html .Name}} + <h3 id="{{$tname}}.{{$name}}">func <a href="/{{url_pos .Decl $.FSet}}">{{$name}}</a></h3> + <p><code>{{html_node .Decl $.FSet}}</code></p> + {{html_comment .Doc}} {{end}} {{range .Methods}} - <h3 id="{{html_esc $type.Type.Name $FSet}}.{{.Name|html_esc}}">func ({{html_esc .Recv $FSet}}) <a href="/{{url_pos .Decl $FSet}}">{{.Name|html_esc}}</a></h3> - <p><code>{{html_esc .Decl $FSet}}</code></p> - {{.Doc|html_comment}} + {{$name := html .Name}} + <h3 id="{{$tname}}.{{$name}}">func ({{html_node .Recv $.FSet}}) <a href="/{{url_pos .Decl $.FSet}}">{{$name}}</a></h3> + <p><code>{{html_node .Decl $.FSet}}</code></p> + {{html_comment .Doc}} {{end}} {{end}} {{end}} {{with .Bugs}} <h2 id="Bugs">Bugs</h2> {{range .}} - {{.|html_comment}} + {{html_comment .}} {{end}} {{end}} {{end}} @@ -87,7 +87,7 @@ <p> {{/* PList entries are strings - no need for FSet */}} {{range .}} - <a href="?p={{html .}}">{{html .}}</a><br /> + <a href="?p={{url .}}">{{html .}}</a><br /> {{end}} </p> {{end}} @@ -102,7 +102,7 @@ <p> <table class="layout"> <tr> - <th align="left" colspan="{{.MaxHeight|html_esc}}">Name</th> + <th align="left" colspan="{{html .MaxHeight}}">Name</th> <td width="25"> </td> <th align="left">Synopsis</th> </tr> @@ -111,7 +111,7 @@ </tr> {{range .List}} <tr> - {{.Depth|padding}} + {{repeat `<td width="25"></td>` .Depth}} <td align="left" colspan="{{html .Height}}"><a href="{{html .Path}}">{{html .Name}}</a></td> <td></td> <td align="left">{{html .Synopsis}}</td> diff --git a/lib/godoc/package.txt b/lib/godoc/package.txt index db9e1d85e4..af1a630693 100644 --- a/lib/godoc/package.txt +++ b/lib/godoc/package.txt @@ -2,7 +2,7 @@ --------------------------------------- -*/}}{{with .PAst}}{{text . $FSet}}{{end}}{{/* +*/}}{{with .PAst}}{{text_node . $FSet}}{{end}}{{/* --------------------------------------- @@ -16,7 +16,7 @@ import "{{.ImportPath}}" --------------------------------------- -*/}}{{with .Doc}}{{text . $FSet}} +*/}}{{with .Doc}}{{text_node . $FSet}} {{end}}{{/* --------------------------------------- @@ -24,7 +24,7 @@ import "{{.ImportPath}}" */}}{{with .Consts}} CONSTANTS -{{range .}}{{text .Decl $FSet}} +{{range .}}{{text_node .Decl $FSet}} {{.Doc}}{{end}} {{end}}{{/* @@ -33,7 +33,7 @@ CONSTANTS */}}{{with .Vars}} VARIABLES -{{range .}}{{text .Decl $FSet}} +{{range .}}{{text_node .Decl $FSet}} {{.Doc}}{{end}} {{end}}{{/* @@ -42,7 +42,7 @@ VARIABLES */}}{{with .Funcs}} FUNCTIONS -{{range .}}{{text .Decl $FSet}} +{{range .}}{{text_node .Decl $FSet}} {{.Doc}} {{end}}{{end}}{{/* @@ -51,15 +51,15 @@ FUNCTIONS */}}{{with .Types}} TYPES -{{range .}}{{text .Decl $FSet}} +{{range .}}{{text_node .Decl $FSet}} {{.Doc}} -{{range .Consts}}{{text .Decl $FSet}} +{{range .Consts}}{{text_node .Decl $FSet}} {{.Doc}} -{{end}}{{range .Vars}}{{text .Decl $FSet}} +{{end}}{{range .Vars}}{{text_node .Decl $FSet}} {{.Doc}} -{{end}}{{range .Factories}}{{text .Decl $FSet}} +{{end}}{{range .Factories}}{{text_node .Decl $FSet}} {{.Doc}} -{{end}}{{range .Methods}}{{text .Decl $FSet}} +{{end}}{{range .Methods}}{{text_node .Decl $FSet}} {{.Doc}} {{end}}{{end}}{{end}}{{/* diff --git a/lib/godoc/search.html b/lib/godoc/search.html index 94acb837b2..4c956721f8 100644 --- a/lib/godoc/search.html +++ b/lib/godoc/search.html @@ -13,7 +13,7 @@ <p> <span class="alert" style="font-size:120%">Did you mean: </span> {{range .Alts}} - <a href="search?q={{.|urlquery_esc}}" style="font-size:120%">{{.|html_esc}}</a> + <a href="search?q={{url .}}" style="font-size:120%">{{html .}}</a> {{end}} </p> {{end}} @@ -21,12 +21,13 @@ {{with .Decls}} <h2 id="Global">Package-level declarations</h2> {{range .}} - <h3 id="Global_{{.Pak.Path|url_pkg}}">package <a href="/{{.Pak.Path|url_pkg}}">{{.Pak.Name|html_esc}}</a></h3> - {{range $File := .Files}} + <h3 id="Global_{{url_pkg .Pak.Path}}">package <a href="/{{url_pkg .Pak.Path}}">{{html .Pak.Name}}</a></h3> + {{range .Files}} + {{$path := url_src .File.Path}} {{range .Groups}} {{range .Infos}} - <a href="/{{$File.File.Path|url_src}}?h={{$SearchResult.Query|urlquery_esc}}#L{{.|infoLine}}">{{$File.File.Path|url_src}}:{{.|infoLine}}</a> - {{.|infoSnippet}} + <a href="/{{$path}}?h={{url $SearchResult.Query}}#L{{infoLine .}}">{{$path}}:{{infoLine .}}</a> + {{infoSnippet .}} {{end}} {{end}} {{end}} @@ -35,18 +36,19 @@ {{with .Others}} <h2 id="Local">Local declarations and uses</h2> {{range .}} - <h3 id="Local_{{.Pak.Path|url_pkg}}">package <a href="/{{.Pak.Path|url_pkg}}">{{.Pak.Name|html_esc}}</a></h3> - {{range $File := .Files}} - <a href="/{{.File.Path|url_src}}?h={{$SearchResult.Query|urlquery_esc}}">{{.File.Path|url_src}}</a> + <h3 id="Local_{{url_pkg .Pak.Path}}">package <a href="/{{url_pkg .Pak.Path}}">{{html .Pak.Name}}</a></h3> + {{range .Files}} + {{$path := url_src .File.Path}} + <a href="/{{$path}}?h={{url $SearchResult.Query}}">{{$path}}</a> <table class="layout"> {{range .Groups}} <tr> <td width="25"></td> - <th align="left" valign="top">{{.Kind|infoKind}}</th> + <th align="left" valign="top">{{infoKind .Kind}}</th> <td align="left" width="4"></td> <td> {{range .Infos}} - <a href="/{{$File.File.Path|url_src}}?h={{$SearchResult.Query|urlquery_esc}}#L{{.|infoLine}}">{{.|infoLine}}</a> + <a href="/{{$path}}?h={{url $SearchResult.Query}}#L{{infoLine .}}">{{infoLine .}}</a> {{end}} </td> </tr> @@ -58,26 +60,27 @@ {{end}} {{with .Textual}} {{if $SearchResult.Complete}} - <h2 id="Textual">{{$SearchResult.Found|html_esc}} textual occurrences</h2> + <h2 id="Textual">{{html $SearchResult.Found}} textual occurrences</h2> {{else}} - <h2 id="Textual">More than {{$SearchResult.Found|html_esc}} textual occurrences</h2> + <h2 id="Textual">More than {{html $SearchResult.Found}} textual occurrences</h2> <p> - <span class="alert" style="font-size:120%">Not all files or lines containing "{{$SearchResult.Query|html_esc}}" are shown.</span> + <span class="alert" style="font-size:120%">Not all files or lines containing "{{html $SearchResult.Query}}" are shown.</span> </p> {{end}} <p> <table class="layout"> - {{range $File := .}} + {{range .}} + {{$path := url_src .Filename}} <tr> <td align="left" valign="top"> - <a href="/{{.Filename|url_src}}?h={{$SearchResult.Query|urlquery_esc}}">{{.Filename|url_src}}</a>: + <a href="/{{$path}}?h={{url $SearchResult.Query}}">{{$path}}</a>: </td> <td align="left" width="4"></td> - <th align="left" valign="top">{{.Lines|numlines}}</th> + <th align="left" valign="top">{{len .Lines}}</th> <td align="left" width="4"></td> <td align="left"> {{range .Lines}} - <a href="/{{$File.Filename|url_src}}?h={{$SearchResult.Query|urlquery_esc}}#L{{.|html_esc}}">{{.|html_esc}}</a> + <a href="/{{$path}}?h={{url $SearchResult.Query}}#L{{url .}}">{{html .}}</a> {{end}} {{if not $SearchResult.Complete}} ... diff --git a/lib/godoc/search.txt b/lib/godoc/search.txt index 81318cb641..423712155a 100644 --- a/lib/godoc/search.txt +++ b/lib/godoc/search.txt @@ -17,8 +17,9 @@ DID YOU MEAN PACKAGE-LEVEL DECLARATIONS {{range .}}package {{.Pak.Name}} -{{range $File := .Files}}{{range .Groups}}{{range .Infos}} {{$File.File.Path|url_src}}:{{.|infoLine}}{{end}} -{{end}}{{end}}{{/* .Files */}}{{end}}{{end}}{{/* .Decls */}}{{/* +{{range $File := .Files}}{{range .Groups}}{{range .Infos}} {{url_src $File.File.Path}}:{{infoLine .}}{{end}} +{{end}}{{end}}{{/* .Files */}} +{{end}}{{end}}{{/* .Decls */}}{{/* --------------------------------------- @@ -26,7 +27,7 @@ PACKAGE-LEVEL DECLARATIONS LOCAL DECLARATIONS AND USES {{range .}}package {{.Pak.Name}} -{{range $File := .Files}}{{range .Groups}}{{range .Infos}} {{$File.File.Path|url_src}}:{{.|infoLine}} +{{range $File := .Files}}{{range .Groups}}{{range .Infos}} {{url_src $File.File.Path}}:{{infoLine .}} {{end}}{{end}}{{end}}{{/* .Files */}} {{end}}{{end}}{{/* .Others */}}{{end}}{{/* .Hit */}}{{/* @@ -34,6 +35,6 @@ LOCAL DECLARATIONS AND USES */}}{{if .Textual}}{{if .Complete}}{{.Found}} TEXTUAL OCCURRENCES{{else}}MORE THAN {{.Found}} TEXTUAL OCCURRENCES{{end}} -{{range .Textual}}{{.Lines|numlines}} {{.Filename|url_src}} +{{range .Textual}}{{len .Lines}} {{url_src .Filename}} {{end}}{{if not .Complete}}... ... {{end}}{{end}} diff --git a/src/cmd/godoc/godoc.go b/src/cmd/godoc/godoc.go index 87f8b61fae..c70a03de82 100644 --- a/src/cmd/godoc/godoc.go +++ b/src/cmd/godoc/godoc.go @@ -371,38 +371,6 @@ func writeNode(w io.Writer, fset *token.FileSet, x interface{}) { (&printer.Config{mode, *tabwidth}).Fprint(&tconv{output: w}, fset, x) } -// Write anything to w. -func writeAny(w io.Writer, fset *token.FileSet, x interface{}) { - switch v := x.(type) { - case []byte: - w.Write(v) - case string: - w.Write([]byte(v)) - case ast.Decl, ast.Expr, ast.Stmt, *ast.File: - writeNode(w, fset, x) - default: - fmt.Fprint(w, x) - } -} - -// Write anything html-escaped to w. -func writeAnyHTML(w io.Writer, fset *token.FileSet, x interface{}) { - switch v := x.(type) { - case []byte: - template.HTMLEscape(w, v) - case string: - template.HTMLEscape(w, []byte(v)) - case ast.Decl, ast.Expr, ast.Stmt, *ast.File: - var buf bytes.Buffer - writeNode(&buf, fset, x) - FormatText(w, buf.Bytes(), -1, true, "", nil) - default: - var buf bytes.Buffer - fmt.Fprint(&buf, x) - template.HTMLEscape(w, buf.Bytes()) - } -} - func fileset(x []interface{}) *token.FileSet { if len(x) > 1 { if fset, ok := x[1].(*token.FileSet); ok { @@ -412,32 +380,6 @@ func fileset(x []interface{}) *token.FileSet { return nil } -// Template formatter for "html-esc" format. -func htmlEscFmt(w io.Writer, format string, x ...interface{}) { - writeAnyHTML(w, fileset(x), x[0]) -} - -// Template formatter for "html-comment" format. -func htmlCommentFmt(w io.Writer, format string, x ...interface{}) { - var buf bytes.Buffer - writeAny(&buf, fileset(x), x[0]) - // TODO(gri) Provide list of words (e.g. function parameters) - // to be emphasized by ToHTML. - doc.ToHTML(w, buf.Bytes(), nil) // does html-escaping -} - -// Template formatter for "" (default) format. -func textFmt(w io.Writer, format string, x ...interface{}) { - writeAny(w, fileset(x), x[0]) -} - -// Template formatter for "urlquery-esc" format. -func urlQueryEscFmt(w io.Writer, format string, x ...interface{}) { - var buf bytes.Buffer - writeAny(&buf, fileset(x), x[0]) - template.HTMLEscape(w, []byte(http.URLEscape(string(buf.Bytes())))) -} - // Template formatter for the various "url-xxx" formats excluding url-esc. func urlFmt(w io.Writer, format string, x ...interface{}) { var path string @@ -559,56 +501,17 @@ func infoSnippetFmt(w io.Writer, format string, x ...interface{}) { w.Write(text) } -// Template formatter for "padding" format. -func paddingFmt(w io.Writer, format string, x ...interface{}) { - for i := x[0].(int); i > 0; i-- { - fmt.Fprint(w, `<td width="25"></td>`) - } -} - -// Template formatter for "localname" format. -func localnameFmt(w io.Writer, format string, x ...interface{}) { - _, localname := filepath.Split(x[0].(string)) - template.HTMLEscape(w, []byte(localname)) -} - -// Template formatter for "fileInfoName" format. -func fileInfoNameFmt(w io.Writer, format string, x ...interface{}) { - fi := x[0].(FileInfo) - template.HTMLEscape(w, []byte(fi.Name())) - if fi.IsDirectory() { - w.Write([]byte{'/'}) - } -} - -// Template formatter for "fileInfoSize" format. -func fileInfoSizeFmt(w io.Writer, format string, x ...interface{}) { - fmt.Fprintf(w, "%d", x[0].(FileInfo).Size()) -} - -// Template formatter for "fileInfoTime" format. -func fileInfoTimeFmt(w io.Writer, format string, x ...interface{}) { - if t := x[0].(FileInfo).Mtime_ns(); t != 0 { - template.HTMLEscape(w, []byte(time.SecondsToLocalTime(t/1e9).String())) - } - // don't print epoch if time is obviously not set -} - -// Template formatter for "numlines" format. -func numlinesFmt(w io.Writer, format string, x ...interface{}) { - list := x[0].([]int) - fmt.Fprintf(w, "%d", len(list)) -} - // TODO(gri): Remove this type once fmtMap2funcMap is gone. type FormatterMap map[string]func(io.Writer, string, ...interface{}) // TODO(gri): Remove the need for this conversion function by rewriting // the old template formatters into new template functions. -func fmtMap2funcMap(fmtMap FormatterMap) template.FuncMap { - funcMap := make(template.FuncMap) +func append2funcMap(funcMap template.FuncMap, fmtMap FormatterMap) template.FuncMap { for n, f := range fmtMap { name, fmt := n, f // separate instance of name, fmt for each closure! + if _, ok := funcMap[name]; ok { + panic("function already in map: " + name) + } funcMap[name] = func(args ...interface{}) string { var buf bytes.Buffer fmt(&buf, name, args...) @@ -618,23 +521,63 @@ func fmtMap2funcMap(fmtMap FormatterMap) template.FuncMap { return funcMap } -var fmap = fmtMap2funcMap(FormatterMap{ - "text": textFmt, - "html_esc": htmlEscFmt, - "html_comment": htmlCommentFmt, - "urlquery_esc": urlQueryEscFmt, - "url_pkg": urlFmt, - "url_src": urlFmt, - "url_pos": urlFmt, - "infoKind": infoKindFmt, - "infoLine": infoLineFmt, - "infoSnippet": infoSnippetFmt, - "padding": paddingFmt, - "fileInfoName": fileInfoNameFmt, - "fileInfoSize": fileInfoSizeFmt, - "fileInfoTime": fileInfoTimeFmt, - "localname": localnameFmt, - "numlines": numlinesFmt, +func textNodeFunc(node interface{}, fset *token.FileSet) string { + var buf bytes.Buffer + writeNode(&buf, fset, node) + return buf.String() +} + +func htmlNodeFunc(node interface{}, fset *token.FileSet) string { + var buf1 bytes.Buffer + writeNode(&buf1, fset, node) + var buf2 bytes.Buffer + FormatText(&buf2, buf1.Bytes(), -1, true, "", nil) + return buf2.String() +} + +func htmlCommentFunc(comment string) string { + var buf bytes.Buffer + // TODO(gri) Provide list of words (e.g. function parameters) + // to be emphasized by ToHTML. + doc.ToHTML(&buf, []byte(comment), nil) // does html-escaping + return buf.String() +} + +func fileInfoNameFunc(fi FileInfo) string { + name := fi.Name() + if fi.IsDirectory() { + name += "/" + } + return name +} + +func fileInfoTimeFunc(fi FileInfo) string { + if t := fi.Mtime_ns(); t != 0 { + return time.SecondsToLocalTime(t / 1e9).String() + } + return "" // don't return epoch if time is obviously not set +} + +func localnameFunc(path string) string { + _, localname := filepath.Split(path) + return localname +} + +var fmap = append2funcMap(template.FuncMap{ + "text_node": textNodeFunc, + "html_node": htmlNodeFunc, + "html_comment": htmlCommentFunc, + "fileInfoName": fileInfoNameFunc, + "fileInfoTime": fileInfoTimeFunc, + "localname": localnameFunc, + "repeat": strings.Repeat, +}, FormatterMap{ + "url_pkg": urlFmt, + "url_src": urlFmt, + "url_pos": urlFmt, + "infoKind": infoKindFmt, + "infoLine": infoLineFmt, + "infoSnippet": infoSnippetFmt, }) func readTemplate(name string) *template.Template { diff --git a/src/cmd/godoc/main.go b/src/cmd/godoc/main.go index 943c81cfb5..e4c3023969 100644 --- a/src/cmd/godoc/main.go +++ b/src/cmd/godoc/main.go @@ -401,9 +401,11 @@ func main() { fmt.Println() } if *html { - writeAnyHTML(os.Stdout, info.FSet, d) + var buf bytes.Buffer + writeNode(&buf, info.FSet, d) + FormatText(os.Stdout, buf.Bytes(), -1, true, "", nil) } else { - writeAny(os.Stdout, info.FSet, d) + writeNode(os.Stdout, info.FSet, d) } fmt.Println() } |