internal/godoc/dochtml/internal/render: move docTmpl and exampleTmpl fields to Renderer

Renderer.docTmpl and Renderer.exampleTmpl are added, so that the HTML
snippets for those sections can be control using experiments in a later
CL.

Change-Id: I78e58657af66149f57cead403ef9d4bf8c6fbe25
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/260799
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
TryBot-Result: kokoro <noreply+kokoro@google.com>
diff --git a/internal/godoc/dochtml/internal/render/linkify.go b/internal/godoc/dochtml/internal/render/linkify.go
index d5fe7df..e8d92ea 100644
--- a/internal/godoc/dochtml/internal/render/linkify.go
+++ b/internal/godoc/dochtml/internal/render/linkify.go
@@ -75,20 +75,6 @@
 	ID    safehtml.Identifier
 }
 
-// docTmpl renders documentation. It expects a docData.
-var docTmpl = template.Must(template.New("").Parse(`
-{{- range .Elements -}}
-  {{- if .IsHeading -}}
-    <h3 id="{{.ID}}">{{.Title}}
-    {{- if not $.DisablePermalinks}}<a href="#{{.ID}}">¶</a>{{end -}}
-    </h3>
-  {{else if .IsPreformat -}}
-    <pre>{{.Body}}</pre>
-  {{- else -}}
-    <p>{{.Body}}</p>
-  {{- end -}}
-{{end}}`))
-
 func (r *Renderer) declHTML(doc string, decl ast.Decl) (out struct{ Doc, Decl safehtml.HTML }) {
 	dids := newDeclIDs(decl)
 	idr := &identifierResolver{r.pids, dids, r.packageURL}
@@ -110,7 +96,7 @@
 			}
 			els = append(els, el)
 		}
-		out.Doc = ExecuteToHTML(docTmpl, docData{Elements: els, DisablePermalinks: r.disablePermalinks})
+		out.Doc = ExecuteToHTML(r.docTmpl, docData{Elements: els, DisablePermalinks: r.disablePermalinks})
 	}
 	if decl != nil {
 		out.Decl = safehtml.HTMLConcat(
@@ -157,7 +143,7 @@
 	if err != nil {
 		log.Errorf(r.ctx, "Error converting *doc.Example into string: %v", err)
 	}
-	return codeHTML(codeStr)
+	return codeHTML(codeStr, r.exampleTmpl)
 }
 
 type codeElement struct {
@@ -165,19 +151,7 @@
 	Comment bool
 }
 
-var codeTmpl = template.Must(template.New("").Parse(`
-<pre class="Documentation-exampleCode">
-{{range .}}
-  {{- if .Comment -}}
-    <span class="comment">{{.Text}}</span>
-  {{- else -}}
-    {{.Text}}
-  {{- end -}}
-{{end}}
-</pre>
-`))
-
-func codeHTML(src string) safehtml.HTML {
+func codeHTML(src string, codeTmpl *template.Template) safehtml.HTML {
 	var els []codeElement
 	// If code is an *ast.BlockStmt, then trim the braces.
 	var indent string
diff --git a/internal/godoc/dochtml/internal/render/linkify_test.go b/internal/godoc/dochtml/internal/render/linkify_test.go
index 6f3f8a4..dbb4fb9 100644
--- a/internal/godoc/dochtml/internal/render/linkify_test.go
+++ b/internal/godoc/dochtml/internal/render/linkify_test.go
@@ -280,7 +280,7 @@
 `,
 		},
 	} {
-		out := codeHTML(test.in)
+		out := codeHTML(test.in, exampleTmpl)
 		got := strings.TrimSpace(string(out.String()))
 		want := strings.TrimSpace(test.want)
 		if got != want {
diff --git a/internal/godoc/dochtml/internal/render/render.go b/internal/godoc/dochtml/internal/render/render.go
index 299c64d..fd2b689 100644
--- a/internal/godoc/dochtml/internal/render/render.go
+++ b/internal/godoc/dochtml/internal/render/render.go
@@ -14,6 +14,7 @@
 	"strings"
 
 	"github.com/google/safehtml"
+	"github.com/google/safehtml/template"
 	"golang.org/x/pkgsite/internal/godoc/internal/doc"
 )
 
@@ -36,6 +37,8 @@
 	disableHotlinking bool
 	disablePermalinks bool
 	ctx               context.Context
+	docTmpl           *template.Template
+	exampleTmpl       *template.Template
 }
 
 type Options struct {
@@ -63,6 +66,33 @@
 	DisablePermalinks bool
 }
 
+// docDataTmpl renders documentation. It expects a docData.
+var docDataTmpl = template.Must(template.New("").Parse(`
+{{- range .Elements -}}
+  {{- if .IsHeading -}}
+    <h3 id="{{.ID}}">{{.Title}}
+    {{- if not $.DisablePermalinks}}<a href="#{{.ID}}">¶</a>{{end -}}
+    </h3>
+  {{else if .IsPreformat -}}
+    <pre>{{.Body}}</pre>
+  {{- else -}}
+    <p>{{.Body}}</p>
+  {{- end -}}
+{{end}}`))
+
+// exampleTmpl renders code for an example. It expect an Example.
+var exampleTmpl = template.Must(template.New("").Parse(`
+<pre class="Documentation-exampleCode">
+{{range .}}
+  {{- if .Comment -}}
+    <span class="comment">{{.Text}}</span>
+  {{- else -}}
+    {{.Text}}
+  {{- end -}}
+{{end}}
+</pre>
+`))
+
 func New(ctx context.Context, fset *token.FileSet, pkg *doc.Package, opts *Options) *Renderer {
 	var others []*doc.Package
 	var packageURL func(string) string
@@ -85,6 +115,8 @@
 		packageURL:        packageURL,
 		disableHotlinking: disableHotlinking,
 		disablePermalinks: disablePermalinks,
+		docTmpl:           docDataTmpl,
+		exampleTmpl:       exampleTmpl,
 	}
 }