[x/go.dev] all: simplify, rename template functions for clarity

markdownify -> markdown
safeHTML -> rawhtml

In particular, safeHTML sounds like something that converts to safe HTML.
The "raw" in rawhtml should make clearer that this is an unsafe operation.
While we are here, make the markdown conversion function just "markdown".

RelPermalink -> Path
Permalink -> URL

These are more in keeping with standard Go terminology.

Remove various other no longer needed things that were
mimicking Hugo.

Change-Id: Ia07cd265a349ddacf5e6fb13221a91cabe01cafe
X-GoDev-Commit: 2c0f37cbca11b795218fbce39a7fd1b1e6832652
diff --git a/go.dev/_content/index.md b/go.dev/_content/index.md
index 7731e85..28488e1 100644
--- a/go.dev/_content/index.md
+++ b/go.dev/_content/index.md
@@ -84,7 +84,6 @@
       {{if .Params.link }}
         {{if .Params.inLandingPageGrid }}
           <li class="WhoUsesCaseStudyList-caseStudy">
-            {{$logo := .Resources.GetMatch "logo"}}
             <a href="{{.Params.link}}" target="_blank" rel="noopener"
               class="WhoUsesCaseStudyList-caseStudyLink">
               <img
@@ -99,7 +98,7 @@
         {{end}}
       {{else}}
         <li class="WhoUsesCaseStudyList-caseStudy">
-          <a href="{{.RelPermalink}}" class="WhoUsesCaseStudyList-caseStudyLink">
+          <a href="{{.Path}}" class="WhoUsesCaseStudyList-caseStudyLink">
             <img
               loading="lazy"
               height="48"
@@ -124,7 +123,7 @@
             <li class="TestimonialsGo-quoteGroup GoCarousel-slide" id="quote_slide{{$index}}">
               <div class="TestimonialsGo-quoteSingleItem">
                 <div class="TestimonialsGo-quoteSection">
-                  <p class="TestimonialsGo-quote">{{.quote | safeHTML}}</p>
+                  <p class="TestimonialsGo-quote">{{rawhtml .quote}}</p>
                   <div class="TestimonialsGo-author">— {{.name}},
                     <span class="NoWrapSpan">{{.title}}</span>
                     <span class="NoWrapSpan"> at {{.company}}</span>
diff --git a/go.dev/_content/learn/_index.md b/go.dev/_content/learn/_index.md
index d31397e..e98e9eb 100644
--- a/go.dev/_content/learn/_index.md
+++ b/go.dev/_content/learn/_index.md
@@ -176,7 +176,7 @@
             <h4 class="Learn-eventName">
               <a href="{{.url}}">{{.name}}</a>
             </h4>
-            <p class="Learn-eventDescription">{{.description | safeHTML}}</p>
+            <p class="Learn-eventDescription">{{rawhtml .description}}</p>
           </div>
           <div class="Learn-eventAttendees">
             {{ with .attendees }}
@@ -205,7 +205,7 @@
     {{end}}
     <div class="Card-content">
       <div class="Card-contentTitle">{{.title}}</div>
-      <p class="Card-contentBody">{{.content | safeHTML}}</p>
+      <p class="Card-contentBody">{{rawhtml .content}}</p>
       <div class="Card-contentCta">
         <a href="{{.url}}" target="_blank">
           <span>{{.cta}}</span>
diff --git a/go.dev/_content/solutions/_index.md b/go.dev/_content/solutions/_index.md
index 7e89116..4767899 100644
--- a/go.dev/_content/solutions/_index.md
+++ b/go.dev/_content/solutions/_index.md
@@ -22,7 +22,7 @@
               </h2>
               <p class="Solutions-headlineBody">
                 {{with .Params.quote}}{{.}}{{end}}
-                <a href="{{.RelPermalink}}"
+                <a href="{{.Path}}"
                   >Learn more
                   <i class="material-icons Solutions-forwardArrowIcon"
                     >arrow_forward</i
@@ -82,7 +82,7 @@
       {{$solutions := where .Pages "Params.series" "Case Studies"}}
       {{range sort $solutions "Params.company" "asc"}}
       <li class="Solutions-card">
-        {{if isset .Params "link" }}
+        {{if .Params.link}}
         <a
           href="{{.Params.link}}"
           target="_blank"
@@ -110,7 +110,7 @@
           </p>
         </a>
         {{else}}
-        <a href="{{.RelPermalink}}" class="Solutions-useCaseLink">
+        <a href="{{.Path}}" class="Solutions-useCaseLink">
           <div class="Solutions-useCaseLogo">
             <img
               loading="lazy"
@@ -141,13 +141,13 @@
     >
       {{range where .Pages "Params.series" "Use Cases"}}
       <li class="Solutions-card">
-        <a href="{{.RelPermalink}}" class="Solutions-useCaseLink">
+        <a href="{{.Path}}" class="Solutions-useCaseLink">
           <div class="Solutions-useCaseLogo">
-            {{$icon := .Resources.GetMatch "icon"}} {{if $icon}}
+            {{$icon := .Params.icon}}{{if $icon}}
             <img
               loading="lazy"
-              alt="{{$icon.Params.alt}}"
-              src="{{$icon.RelPermalink}}"
+              alt="{{$icon.alt}}"
+              src="{{.Dir}}/{{$icon.file}}"
             />
             {{end}}
           </div>
diff --git a/go.dev/_content/solutions/clis/index.md b/go.dev/_content/solutions/clis/index.md
index d1dba8a..9cb2b4c 100644
--- a/go.dev/_content/solutions/clis/index.md
+++ b/go.dev/_content/solutions/clis/index.md
@@ -5,15 +5,12 @@
 date: 2019-10-04T15:26:31-04:00
 layout: solution
 series: Use Cases
-resources:
-- name: icon
-  src: CLI-green.svg
-  params:
-    alt: CLI icon
-- name: icon-white
-  src: cli-white.svg
-  params:
-    alt: CLI icon
+icon:
+  file: CLI-green.svg
+  alt: CLI icon
+icon-white:
+  file: cli-white.svg
+  alt: CLI icon
 ---
 
 ## Overview {#overview .sectionHeading}
diff --git a/go.dev/_content/solutions/cloud/index.md b/go.dev/_content/solutions/cloud/index.md
index 67c821a..34e32de 100644
--- a/go.dev/_content/solutions/cloud/index.md
+++ b/go.dev/_content/solutions/cloud/index.md
@@ -5,15 +5,12 @@
 date: 2019-10-04T15:26:31-04:00
 layout: solution
 series: Use Cases
-resources:
-  - name: icon
-    src: cloud-green.svg
-    params:
-      alt: cloud icon
-  - name: icon-white
-    src: cloud-white.svg
-    params:
-      alt: cloud icon
+icon:
+  file: cloud-green.svg
+  alt: cloud icon
+icon-white:
+  file: cloud-white.svg
+  alt: cloud icon
 ---
 
 ## Overview {#overview .sectionHeading}
diff --git a/go.dev/_content/solutions/devops/index.md b/go.dev/_content/solutions/devops/index.md
index 42cc2d9..83dfbfe 100644
--- a/go.dev/_content/solutions/devops/index.md
+++ b/go.dev/_content/solutions/devops/index.md
@@ -6,15 +6,12 @@
 layout: solution
 series: Use Cases
 books:
-resources:
-- name: icon
-  src: ops-green.svg
-  params:
-    alt: ops icon
-- name: icon-white
-  src: ops-white.svg
-  params:
-    alt: ops icon
+icon:
+  file: ops-green.svg
+  alt: ops icon
+icon-white:
+  file: ops-white.svg
+  alt: ops icon
 ---
 
 ## Overview {#overview .sectionHeading}
diff --git a/go.dev/_content/solutions/webdev/index.md b/go.dev/_content/solutions/webdev/index.md
index b9ca83d..c2bf0d2 100644
--- a/go.dev/_content/solutions/webdev/index.md
+++ b/go.dev/_content/solutions/webdev/index.md
@@ -6,15 +6,12 @@
 layout: solution
 series: Use Cases
 books:
-resources:
-- name: icon
-  src: webdev-green.svg
-  params:
-    alt: web dev icon
-- name: icon-white
-  src: webdev-white.svg
-  params:
-    alt: web dev icon
+icon:
+  file: webdev-green.svg
+  alt: web dev icon
+icon-white:
+  file: webdev-white.svg
+  alt: web dev icon
 ---
 
 ## Overview {#overview .sectionHeading}
diff --git a/go.dev/_templates/backgroundquote.tmpl b/go.dev/_templates/backgroundquote.tmpl
index 5d347eb..5784f97 100644
--- a/go.dev/_templates/backgroundquote.tmpl
+++ b/go.dev/_templates/backgroundquote.tmpl
@@ -5,13 +5,13 @@
 <a href="{{.}}" target="_blank" rel="noopener">
 {{- end}}
     <p class="BackgroundQuote-body">
-      “{{.quote | markdownify}}”
+      “{{markdown .quote}}”
     </p>
     {{- if .author}}
     <div class="BackgroundQuote-author">
       <span>&mdash; {{.author}}</span>
       {{if .title}},&nbsp;
-      <span class="BackgroundQuote-title">{{.title | safeHTML}}</span>
+      <span class="BackgroundQuote-title">{{rawhtml .title}}</span>
       {{- end}}
       {{- if .company}}
       <span class="BackgroundQuote-title">&nbsp;at {{.company}}</span>
diff --git a/go.dev/_templates/breadcrumbs.tmpl b/go.dev/_templates/breadcrumbs.tmpl
index 6b2a7ff..2e7b4e5 100644
--- a/go.dev/_templates/breadcrumbs.tmpl
+++ b/go.dev/_templates/breadcrumbs.tmpl
@@ -4,8 +4,8 @@
 {{- end}}
 {{- if not (eq .p1.Title "go.dev")}}
       <li class="BreadcrumbNav-li {{if eq .p1 .p2}}active{{end}}">
-        <a class="BreadcrumbNav-link" href="{{.p1.RelPermalink}}">
-          {{- if isset .p1.Params "company"}}
+        <a class="BreadcrumbNav-link" href="{{.p1.Path}}">
+          {{- if .p1.Params.company}}
             {{.p1.Params.company}}
           {{- else}}
             {{.p1.Title}}
diff --git a/go.dev/_templates/layouts/site.tmpl b/go.dev/_templates/layouts/site.tmpl
index 6a28e0f..0055447 100644
--- a/go.dev/_templates/layouts/site.tmpl
+++ b/go.dev/_templates/layouts/site.tmpl
@@ -24,7 +24,7 @@
   <!-- End Google Tag Manager -->
 <script src="/js/site.js"></script>
 <title>{{.Title}}{{if not .IsHome}} - go.dev{{end}}</title>
-{{if (isset .Params "link") -}}
+{{if .Params.link -}}
 <meta http-equiv="refresh" content="0; url={{.Params.link}}">
 {{end -}}
 </head>
diff --git a/go.dev/_templates/layouts/solution.tmpl b/go.dev/_templates/layouts/solution.tmpl
index 8f21900..28b7006 100644
--- a/go.dev/_templates/layouts/solution.tmpl
+++ b/go.dev/_templates/layouts/solution.tmpl
@@ -9,11 +9,11 @@
           {{range .Params.authors}}
             <div class="Article-author">{{.}}</div>
           {{end}}
-          {{if isset .Params "date"}}
+          {{if .Params.date}}
             <div class="Article-date">{{.Date.Format "2 January 2006"}}</div>
           {{end}}
         </div>
-          {{if isset .Params "company"}}
+          {{if .Params.company}}
             <div class="WhoUsesSubPage-heroImg">
               <img src="/images/{{ .Params.heroImgSrc }}" alt="{{.Params.company }}">
             </div>
@@ -30,15 +30,14 @@
         </div>
         <div class="CaseStudy-contentAside">
           <div class="CaseStudy-aboutBlock">
-            {{$logo := .Resources.GetMatch "logo"}}
             <img src="/images/logos/{{.Params.logoSrc}}" class="CaseStudy-aboutBlockImg" alt="{{.Params.company}}">
             <h3 class="CaseStudy-aboutBlockTitle">
               About {{.Params.company}}
             </h3>
-            {{if isset .Params "description"}}
-              <p class="CaseStudy-aboutBlockBody">{{- .Params.description | markdownify -}}</p>
+            {{if .Params.description}}
+              <p class="CaseStudy-aboutBlockBody">{{markdown .Params.description}}</p>
             {{ else }}
-              <p class="CaseStudy-aboutBlockBody">{{- .Params.quote | markdownify -}}</p>
+              <p class="CaseStudy-aboutBlockBody">{{markdown .Params.quote}}</p>
             {{end}}
           </div>
         </div>
@@ -74,7 +73,7 @@
               </span>
             </div>
           {{ end }}
-          {{.Content | replaceRE " .sectionHeading" "\" class=\"sectionHeading" | safeHTML}}
+          {{rawhtml (replace .Content ` .sectionHeading">` `" class="sectionHeading">`)}}
         </div>
       </div>
     {{end}}
diff --git a/go.dev/_templates/pullquote.tmpl b/go.dev/_templates/pullquote.tmpl
index 3cf8443..aa64dd6 100644
--- a/go.dev/_templates/pullquote.tmpl
+++ b/go.dev/_templates/pullquote.tmpl
@@ -5,7 +5,7 @@
     <img class="PullQuote-image" src="/images/quote.svg" alt="Quotation mark.">
   </div>
   <p class="PullQuote-body">
-    {{.quote | markdownify}}
+    {{markdown .quote}}
   </p>
   {{- if .author}}
   <div class="PullQuote-author">
@@ -20,7 +20,7 @@
       &mdash; {{.author -}}
     </span>
     {{if .title}},&nbsp;
-      <span class="PullQuote-title">{{.title | safeHTML}}</span>
+      <span class="PullQuote-title">{{rawhtml .title}}</span>
     {{- end}}
     {{- if .company}}
       <span class="PullQuote-title">&nbsp;at {{.company -}}</span>
diff --git a/go.dev/_templates/quote.tmpl b/go.dev/_templates/quote.tmpl
index 523e34e..1355467 100644
--- a/go.dev/_templates/quote.tmpl
+++ b/go.dev/_templates/quote.tmpl
@@ -2,7 +2,7 @@
 {{- with (yaml .info)}}
 <div class="QuoteBlock">
   <p class="QuoteBlock-body">
-    {{.quote | markdownify}}
+    {{markdown .quote}}
   </p>
   {{- if .author}}
     <div class="QuoteBlock-author">
diff --git a/go.dev/cmd/internal/site/page.go b/go.dev/cmd/internal/site/page.go
index f7226e6..6ce5b5b 100644
--- a/go.dev/cmd/internal/site/page.go
+++ b/go.dev/cmd/internal/site/page.go
@@ -29,20 +29,20 @@
 	parent  string // parent page ID
 	data    []byte // page data (markdown)
 	html    []byte // rendered page (HTML)
+	site    *Site
 
-	// yaml metadata and data available to templates
-	Aliases      []string
-	Content      template.HTML
-	Date         anyTime
-	Description  string `yaml:"description"`
-	Layout       string `yaml:"layout"`
-	LinkTitle    string `yaml:"linkTitle"`
-	Pages        []*Page
-	Params       map[string]interface{}
-	site         *Site
-	TheResources []*Resource `yaml:"resources"`
-	Title        string
-	Weight       int
+	// loaded from page metadata, available to templates
+	Aliases     []string
+	Date        anyTime
+	Description string `yaml:"description"`
+	Layout      string `yaml:"layout"`
+	LinkTitle   string `yaml:"linkTitle"`
+	Title       string
+
+	// provided to templates
+	Content template.HTML          `yaml:"-"`
+	Pages   []*Page                `yaml:"-"`
+	Params  map[string]interface{} `yaml:"-"`
 }
 
 // loadPage loads the site's page from the given file.
@@ -133,7 +133,7 @@
 
 	// Register aliases.
 	for _, alias := range p.Aliases {
-		site.redirects[strings.Trim(alias, "/")] = p.Permalink()
+		site.redirects[strings.Trim(alias, "/")] = p.URL()
 	}
 
 	return p, nil
diff --git a/go.dev/cmd/internal/site/site.go b/go.dev/cmd/internal/site/site.go
index 23fa3b3..d5a3486 100644
--- a/go.dev/cmd/internal/site/site.go
+++ b/go.dev/cmd/internal/site/site.go
@@ -92,9 +92,6 @@
 			if !pi.Date.Equal(pj.Date.Time) {
 				return pi.Date.After(pj.Date.Time)
 			}
-			if pi.Weight != pj.Weight {
-				return pi.Weight > pj.Weight
-			}
 			ti := pi.LinkTitle
 			tj := pj.LinkTitle
 			if ti != tj {
diff --git a/go.dev/cmd/internal/site/tmpl.go b/go.dev/cmd/internal/site/tmpl.go
index 152ed73..3510448 100644
--- a/go.dev/cmd/internal/site/tmpl.go
+++ b/go.dev/cmd/internal/site/tmpl.go
@@ -6,11 +6,8 @@
 
 import (
 	"fmt"
-	"os"
-	"path"
 	"path/filepath"
 	"reflect"
-	"regexp"
 	"sort"
 	"strings"
 
@@ -21,19 +18,16 @@
 
 func (site *Site) initTemplate() error {
 	funcs := template.FuncMap{
-		"data":        site.data,
-		"dict":        dict,
-		"first":       first,
-		"isset":       isset,
-		"list":        list,
-		"markdownify": markdownify,
-		"path":        pathFn,
-		"replace":     replace,
-		"replaceRE":   replaceRE,
-		"safeHTML":    safeHTML,
-		"sort":        sortFn,
-		"where":       where,
-		"yaml":        yamlFn,
+		"data":     site.data,
+		"dict":     dict,
+		"first":    first,
+		"list":     list,
+		"markdown": markdown,
+		"replace":  replace,
+		"rawhtml":  rawhtml,
+		"sort":     sortFn,
+		"where":    where,
+		"yaml":     yamlFn,
 	}
 
 	site.base = template.New("site").Funcs(funcs)
@@ -82,11 +76,6 @@
 	return out
 }
 
-func isset(m map[string]interface{}, name string) bool {
-	_, ok := m[name]
-	return ok
-}
-
 func dict(args ...interface{}) map[string]interface{} {
 	m := make(map[string]interface{})
 	for i := 0; i < len(args); i += 2 {
@@ -100,8 +89,8 @@
 	return args
 }
 
-// markdownify is the function provided to templates.
-func markdownify(data interface{}) template.HTML {
+// markdown is the function provided to templates.
+func markdown(data interface{}) template.HTML {
 	h := markdownToHTML(toString(data))
 	s := strings.TrimSpace(string(h))
 	if strings.HasPrefix(s, "<p>") && strings.HasSuffix(s, "</p>") && strings.Count(s, "<p>") == 1 {
@@ -110,31 +99,14 @@
 	return h
 }
 
-func pathFn() pathPkg { return pathPkg{} }
-
-type pathPkg struct{}
-
-func (pathPkg) Base(s interface{}) string { return path.Base(toString(s)) }
-func (pathPkg) Dir(s interface{}) string  { return path.Dir(toString(s)) }
-func (pathPkg) Join(args ...interface{}) string {
-	var elem []string
-	for _, a := range args {
-		elem = append(elem, toString(a))
-	}
-	return path.Join(elem...)
-}
-
 func replace(input, x, y interface{}) string {
 	return strings.ReplaceAll(toString(input), toString(x), toString(y))
 }
 
-func replaceRE(pattern, repl, input interface{}) string {
-	re := regexp.MustCompile(toString(pattern))
-	return re.ReplaceAllString(toString(input), toString(repl))
+func rawhtml(s interface{}) template.HTML {
+	return template.HTML(toString(s))
 }
 
-func safeHTML(s interface{}) template.HTML { return template.HTML(toString(s)) }
-
 func sortFn(list reflect.Value, key, asc string) (reflect.Value, error) {
 	out := reflect.Zero(list.Type())
 	var keys []string
@@ -216,8 +188,6 @@
 
 func (p *Page) IsHome() bool { return p.id == "" }
 
-func (p *Page) Param(key string) interface{} { return p.Params[key] }
-
 func (p *Page) Parent() *Page {
 	if p.IsHome() {
 		return nil
@@ -225,21 +195,17 @@
 	return p.site.pagesByID[p.parent]
 }
 
-func (p *Page) Permalink() string {
-	return strings.TrimRight(p.site.URL, "/") + p.RelPermalink()
+func (p *Page) URL() string {
+	return strings.TrimRight(p.site.URL, "/") + p.Path()
 }
 
-func (p *Page) RelPermalink() string {
+func (p *Page) Path() string {
 	if p.id == "" {
 		return "/"
 	}
 	return "/" + p.id + "/"
 }
 
-func (p *Page) Resources() *PageResources {
-	return &PageResources{p}
-}
-
 func (p *Page) Section() string {
 	i := strings.Index(p.section, "/")
 	if i < 0 {
@@ -248,33 +214,6 @@
 	return p.section[:i]
 }
 
-type PageResources struct{ p *Page }
-
-func (r *PageResources) GetMatch(name string) (*Resource, error) {
-	for _, rs := range r.p.TheResources {
-		if name == rs.Name {
-			if rs.data == nil {
-				rs.RelPermalink = strings.TrimPrefix(filepath.ToSlash(filepath.Join(r.p.file, "../"+rs.Src)), "_content")
-				data, err := os.ReadFile(r.p.site.file(r.p.file + "/../" + rs.Src))
-				if err != nil {
-					return nil, err
-				}
-				rs.data = data
-			}
-			return rs, nil
-		}
-	}
-	return nil, nil
-}
-
-type Resource struct {
-	data         []byte
-	RelPermalink string
-	Name         string
-	Src          string
-	Params       map[string]string
-}
-
 func yamlFn(s string) (interface{}, error) {
 	var d interface{}
 	if err := yaml.Unmarshal([]byte(s), &d); err != nil {
@@ -282,3 +221,7 @@
 	}
 	return d, nil
 }
+
+func (p *Page) Dir() string {
+	return strings.TrimPrefix(filepath.ToSlash(filepath.Dir(p.file)), "_content")
+}