Render markdown and links in backrefs
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Peter Stuifzand 2020-05-18 22:09:48 +02:00
parent 0a187a49c3
commit 4840eca7eb
2 changed files with 37 additions and 23 deletions

View File

@ -2,9 +2,12 @@ package main
import ( import (
"encoding/json" "encoding/json"
"html/template"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
"gitlab.com/golang-commonmark/markdown"
) )
type Reference struct { type Reference struct {
@ -82,6 +85,11 @@ func loadBackrefs(fp *FilePages, p string) (map[string][]Backref, error) {
result := make(map[string][]Backref) result := make(map[string][]Backref)
md := markdown.New(
markdown.HTML(true),
markdown.XHTMLOutput(true),
)
for _, ref := range refs[p] { for _, ref := range refs[p] {
title := strings.Replace(ref.Name, "_", " ", -1) title := strings.Replace(ref.Name, "_", " ", -1)
if _, e := result[ref.Name]; !e { if _, e := result[ref.Name]; !e {
@ -91,7 +99,7 @@ func loadBackrefs(fp *FilePages, p string) (map[string][]Backref, error) {
result[ref.Name] = append(result[ref.Name], Backref{ result[ref.Name] = append(result[ref.Name], Backref{
Name: ref.Name, Name: ref.Name,
Title: title, Title: title,
Line: strings.TrimLeft(ref.Link.Line, " *"), Line: template.HTML(md.RenderToString([]byte(renderLinks(strings.TrimLeft(ref.Link.Line, " *"))))),
}) })
} }

50
main.go
View File

@ -33,7 +33,7 @@ var (
type Backref struct { type Backref struct {
Name string Name string
Title string Title string
Line string Line template.HTML
} }
// Page // Page
@ -480,26 +480,7 @@ func (h *indexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
} }
hrefRE, err := regexp.Compile(`#?\[\[\s*([^\]]+)\s*\]\]`) pageText = renderLinks(pageText)
if err != nil {
log.Fatal(err)
}
pageText = hrefRE.ReplaceAllStringFunc(pageText, func(s string) string {
tag := false
if s[0] == '#' {
s = strings.TrimPrefix(s, "#[[")
tag = true
} else {
s = strings.TrimPrefix(s, "[[")
}
s = strings.TrimSuffix(s, "]]")
s = strings.TrimSpace(s)
if tag {
return fmt.Sprintf(`<a href=%q class="tag">%s</a>`, cleanNameURL(s), s)
}
return fmt.Sprintf("[%s](/%s)", s, cleanNameURL(s))
})
md := markdown.New( md := markdown.New(
markdown.HTML(true), markdown.HTML(true),
@ -524,12 +505,37 @@ func (h *indexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
err = t.Execute(w, data) err = t.Execute(w, data)
if err != nil { if err != nil {
http.Error(w, err.Error(), 500) log.Println(err)
// http.Error(w, err.Error(), 500)
return return
} }
} }
func renderLinks(pageText string) string {
hrefRE, err := regexp.Compile(`#?\[\[\s*([^\]]+)\s*\]\]`)
if err != nil {
log.Fatal(err)
}
pageText = hrefRE.ReplaceAllStringFunc(pageText, func(s string) string {
tag := false
if s[0] == '#' {
s = strings.TrimPrefix(s, "#[[")
tag = true
} else {
s = strings.TrimPrefix(s, "[[")
}
s = strings.TrimSuffix(s, "]]")
s = strings.TrimSpace(s)
if tag {
return fmt.Sprintf(`<a href=%q class="tag">%s</a>`, cleanNameURL(s), s)
}
return fmt.Sprintf("[%s](/%s)", s, cleanNameURL(s))
})
return pageText
}
func (h *recentHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (h *recentHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close() defer r.Body.Close()