Fix doc.go against Go tip. Go 1.9 is slated to have some backwards-incompatible changes to html/template. See https://github.com/golang/go/issues/19952. If I'm reading this correctly, the issue is that the context-aware auto escaper had some magic around the 'html' filter, but it would get confused if this was used in the wrong context. This does not apply to us because we never used it in an attribute, etc. Nonetheless, we can be compatible with it and tidy up markupPipeWords' type signature. It should have had type template.HTML -> template.HTML, not string -> template.HTML, because it expects the input to be pre-escaped. (The old 'html' escaper, in turn, probably should have had type string -> template.HTML, but I guess it didn't because all this existed for a text/template migration convenience of some sort?) I considered adding our own escapeHTML with type string -> template.HTML and fixing markupPipeWords to be template.HTML -> template.HTML, but markupPipeWords does not correctly handle all possible template.HTML input. If a | were in an attribute somewhere, it would mangle the text. Instead, I kept it of type string -> template.HTML and defined it to perform the HTML escaping itself. This seems to produce the same output as before in Go 1.8 and tip. Change-Id: I90618a3c5525ae54f9fe731352fcff5856b9ba60 Reviewed-on: https://boringssl-review.googlesource.com/18944 Commit-Queue: Adam Langley <agl@google.com> Reviewed-by: Adam Langley <agl@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/util/doc.go b/util/doc.go index 987794c..f96a154 100644 --- a/util/doc.go +++ b/util/doc.go
@@ -459,7 +459,13 @@ return s } +// markupPipeWords converts |s| into an HTML string, safe to be included outside +// a tag, while also marking up words surrounded by |. func markupPipeWords(allDecls map[string]string, s string) template.HTML { + // It is safe to look for '|' in the HTML-escaped version of |s| + // below. The escaped version cannot include '|' instead tags because + // there are no tags by construction. + s = template.HTMLEscapeString(s) ret := "" for { @@ -549,12 +555,12 @@ <a href="headers.html">All headers</a> </div> - {{range .Preamble}}<p>{{. | html | markupPipeWords}}</p>{{end}} + {{range .Preamble}}<p>{{. | markupPipeWords}}</p>{{end}} <ol> {{range .Sections}} {{if not .IsPrivate}} - {{if .Anchor}}<li class="header"><a href="#{{.Anchor}}">{{.Preamble | firstSentence | html | markupPipeWords}}</a></li>{{end}} + {{if .Anchor}}<li class="header"><a href="#{{.Anchor}}">{{.Preamble | firstSentence | markupPipeWords}}</a></li>{{end}} {{range .Decls}} {{if .Anchor}}<li><a href="#{{.Anchor}}"><tt>{{.Name}}</tt></a></li>{{end}} {{end}} @@ -567,14 +573,14 @@ <div class="section" {{if .Anchor}}id="{{.Anchor}}"{{end}}> {{if .Preamble}} <div class="sectionpreamble"> - {{range .Preamble}}<p>{{. | html | markupPipeWords}}</p>{{end}} + {{range .Preamble}}<p>{{. | markupPipeWords}}</p>{{end}} </div> {{end}} {{range .Decls}} <div class="decl" {{if .Anchor}}id="{{.Anchor}}"{{end}}> {{range .Comment}} - <p>{{. | html | markupPipeWords | newlinesToBR | markupFirstWord}}</p> + <p>{{. | markupPipeWords | newlinesToBR | markupFirstWord}}</p> {{end}} <pre>{{.Decl}}</pre> </div>