blob: ca8c964ea238cf11b811a40986790f52d57711c5 [file] [log] [blame]
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package dochtml
import (
"context"
"reflect"
"sync"
"github.com/google/safehtml"
"github.com/google/safehtml/template"
"golang.org/x/pkgsite/internal"
"golang.org/x/pkgsite/internal/experiment"
"golang.org/x/pkgsite/internal/godoc/dochtml/internal/render"
"golang.org/x/pkgsite/internal/godoc/internal/doc"
)
var (
loadOnce sync.Once
// TODO(golang.org/issue/5060): finalize URL scheme and design for notes,
// then it becomes more viable to factor out inline CSS style.
bodyTemplate, outlineTemplate, sidenavTemplate *template.Template
)
// LoadTemplates reads and parses the templates used to generate documentation.
func LoadTemplates(dir template.TrustedSource) {
loadOnce.Do(func() {
join := template.TrustedSourceJoin
tc := template.TrustedSourceFromConstant
bodyTemplate = template.Must(template.New("body.tmpl").
Funcs(tmpl).
ParseFilesFromTrustedSources(
join(dir, tc("body.tmpl")),
join(dir, tc("declaration.tmpl")),
join(dir, tc("example.tmpl"))))
if experiment.IsActive(context.Background(), internal.ExperimentNewUnitLayout) {
outlineTemplate = template.Must(template.New("outline.tmpl").
Funcs(tmpl).
ParseFilesFromTrustedSources(join(dir, tc("outline.tmpl"))))
} else {
outlineTemplate = template.Must(template.New("legacy-outline.tmpl").
Funcs(tmpl).
ParseFilesFromTrustedSources(join(dir, tc("legacy-outline.tmpl"))))
}
sidenavTemplate = template.Must(template.New("sidenav-mobile.tmpl").
Funcs(tmpl).
ParseFilesFromTrustedSources(join(dir, tc("sidenav-mobile.tmpl"))))
})
}
var tmpl = map[string]interface{}{
"ternary": func(q, a, b interface{}) interface{} {
v := reflect.ValueOf(q)
vz := reflect.New(v.Type()).Elem()
if reflect.DeepEqual(v.Interface(), vz.Interface()) {
return b
}
return a
},
"render_short_synopsis": (*render.Renderer)(nil).ShortSynopsis,
"render_synopsis": (*render.Renderer)(nil).Synopsis,
"render_doc": (*render.Renderer)(nil).DocHTML,
"render_doc_extract_links": (*render.Renderer)(nil).DocHTML,
"render_decl": (*render.Renderer)(nil).DeclHTML,
"render_code": (*render.Renderer)(nil).CodeHTML,
"file_link": func() string { return "" },
"source_link": func(string, interface{}) string { return "" },
"since_version": func(string) safehtml.HTML { return safehtml.HTML{} },
"play_url": func(*doc.Example) string { return "" },
"safe_id": render.SafeGoID,
}