]> Cypherpunks repositories - gostls13.git/commitdiff
godoc: position URLs (containing file names) must be quoted and URL escaped
authorRobert Griesemer <gri@golang.org>
Fri, 12 Aug 2011 23:28:55 +0000 (16:28 -0700)
committerRobert Griesemer <gri@golang.org>
Fri, 12 Aug 2011 23:28:55 +0000 (16:28 -0700)
Since the posLink_url also adds a non-URL attribute, the quoting and  URL-escaping
must happen inside posLink_url (otherwise the non-URL attribute becomes part or the
URL portion of the tag.

R=r
CC=golang-dev
https://golang.org/cl/4888041

lib/godoc/package.html
src/cmd/godoc/godoc.go

index 968f69a7c396ba170f159ea8116008caa2e2519d..265e5d53b5109a4c65e25caa210fc96f1e4db929 100644 (file)
@@ -42,7 +42,7 @@
                {{range .}}
                        {{/* Name is a string - no need for FSet */}}
                        {{$name := html .Name}}
-                       <h2 id="{{$name}}">func <a href="/{{posLink .Decl $.FSet}}">{{$name}}</a></h2>
+                       <h2 id="{{$name}}">func <a href="/{{posLink_url .Decl $.FSet}}">{{$name}}</a></h2>
                        <p><code>{{node_html .Decl $.FSet}}</code></p>
                        {{comment_html .Doc}}
                {{end}}
@@ -50,7 +50,7 @@
        {{with .Types}}
                {{range .}}
                        {{$tname := node_html .Type.Name $.FSet}}
-                       <h2 id="{{$tname}}">type <a href="/{{posLink .Decl $.FSet}}">{{$tname}}</a></h2>
+                       <h2 id="{{$tname}}">type <a href="/{{posLink_url .Decl $.FSet}}">{{$tname}}</a></h2>
                        {{comment_html .Doc}}
                        <p><pre>{{node_html .Decl $.FSet}}</pre></p>
                        {{range .Consts}}
                        {{end}}
                        {{range .Factories}}
                                {{$name := html .Name}}
-                               <h3 id="{{$tname}}.{{$name}}">func <a href="/{{posLink .Decl $.FSet}}">{{$name}}</a></h3>
+                               <h3 id="{{$tname}}.{{$name}}">func <a href="/{{posLink_url .Decl $.FSet}}">{{$name}}</a></h3>
                                <p><code>{{node_html .Decl $.FSet}}</code></p>
                                {{comment_html .Doc}}
                        {{end}}
                        {{range .Methods}}
                                {{$name := html .Name}}
-                               <h3 id="{{$tname}}.{{$name}}">func ({{node_html .Recv $.FSet}}) <a href="/{{posLink .Decl $.FSet}}">{{$name}}</a></h3>
+                               <h3 id="{{$tname}}.{{$name}}">func ({{node_html .Recv $.FSet}}) <a href="/{{posLink_url .Decl $.FSet}}">{{$name}}</a></h3>
                                <p><code>{{node_html .Decl $.FSet}}</code></p>
                                {{comment_html .Doc}}
                        {{end}}
index 15b60c72b08317c04f31c40074dd3b50a9235160..98fdc19d044915968afbf2c456c1ea0c34a11779 100644 (file)
@@ -465,7 +465,7 @@ func pkgLinkFunc(path string) string {
        return pkgHandler.pattern[1:] + relpath // remove trailing '/' for relative URL
 }
 
-func posLinkFunc(node ast.Node, fset *token.FileSet) string {
+func posLink_urlFunc(node ast.Node, fset *token.FileSet) string {
        var relpath string
        var line int
        var low, high int // selection
@@ -481,10 +481,10 @@ func posLinkFunc(node ast.Node, fset *token.FileSet) string {
        }
 
        var buf bytes.Buffer
-       buf.WriteString(relpath)
+       buf.WriteString(http.URLEscape(relpath))
        // selection ranges are of form "s=low:high"
        if low < high {
-               fmt.Fprintf(&buf, "?s=%d:%d", low, high)
+               fmt.Fprintf(&buf, "?s=%d:%d", low, high) // no need for URL escaping
                // if we have a selection, position the page
                // such that the selection is a bit below the top
                line -= 10
@@ -495,16 +495,16 @@ func posLinkFunc(node ast.Node, fset *token.FileSet) string {
        // line id's in html-printed source are of the
        // form "L%d" where %d stands for the line number
        if line > 0 {
-               fmt.Fprintf(&buf, "#L%d", line)
+               fmt.Fprintf(&buf, "#L%d", line) // no need for URL escaping
        }
 
        return buf.String()
 }
 
 // fmap describes the template functions installed with all godoc templates.
-// Convention: template function names ending in "_html" produce an HTML-
-//             escaped string; all other function results may require HTML
-//             or URL escaping in the template.
+// Convention: template function names ending in "_html" or "_url" produce
+//             HTML- or URL-escaped strings; all other function results may
+//             require explicit escaping in the template.
 var fmap = template.FuncMap{
        // various helpers
        "filename": filenameFunc,
@@ -525,9 +525,9 @@ var fmap = template.FuncMap{
        "comment_html": comment_htmlFunc,
 
        // support for URL attributes
-       "pkgLink": pkgLinkFunc,
-       "srcLink": relativeURL,
-       "posLink": posLinkFunc,
+       "pkgLink":     pkgLinkFunc,
+       "srcLink":     relativeURL,
+       "posLink_url": posLink_urlFunc,
 }
 
 func readTemplate(name string) *template.Template {