From d763ce619d9833ee4d3b5adc88fca29deaad0b52 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?=
Date: Tue, 22 Jun 2021 02:08:56 +0200
Subject: [PATCH] hswg: separate rendering from link expansion
---
hswg/main.go | 37 ++++++++++++++++++++++---------------
1 file changed, 22 insertions(+), 15 deletions(-)
diff --git a/hswg/main.go b/hswg/main.go
index a23e343..9972817 100644
--- a/hswg/main.go
+++ b/hswg/main.go
@@ -138,6 +138,7 @@ type Entry struct {
PathSource string // path to source AsciiDoc
PathDestination string // path to destination HTML
mtime time.Time // modification time
+ raw []byte // raw inner document
Content template.HTML // inner document with expanded LinkWords
backlinks map[string]bool // what documents link back here
Backlinks []template.HTML
@@ -189,9 +190,7 @@ func expand(m *map[string]*Entry, name string, chunk []byte) []byte {
var tagRE = regexp.MustCompile(`<[^<>]+>`)
-func renderEntry(name string, entries *map[string]*Entry) error {
- e := (*entries)[name]
-
+func renderEntry(name string, e *Entry) error {
f, err := os.Open(e.PathSource)
if err != nil {
return err
@@ -216,16 +215,7 @@ func renderEntry(name string, entries *map[string]*Entry) error {
e.Title = name
}
- // Expand LinkWords anywhere between .
- // We want something like the inverse of Regexp.ReplaceAllStringFunc.
- raw, last, expanded := html.Bytes(), 0, bytes.NewBuffer(nil)
- for _, where := range tagRE.FindAllIndex(raw, -1) {
- _, _ = expanded.Write(expand(entries, name, raw[last:where[0]]))
- _, _ = expanded.Write(raw[where[0]:where[1]])
- last = where[1]
- }
- _, _ = expanded.Write(expand(entries, name, raw[last:]))
- e.Content = template.HTML(expanded.String())
+ e.raw = html.Bytes()
return nil
}
@@ -251,8 +241,8 @@ func loadEntries(globs []string) (map[string]*Entry, error) {
}
}
- for name := range entries {
- if err := renderEntry(name, &entries); err != nil {
+ for name, e := range entries {
+ if err := renderEntry(name, e); err != nil {
return nil, err
}
}
@@ -279,6 +269,21 @@ func writeEntry(e *Entry, t *template.Template,
return t.Execute(f, e)
}
+func finalizeEntries(entries *map[string]*Entry) {
+ for name, e := range *entries {
+ // Expand LinkWords anywhere between .
+ // We want something like the inverse of Regexp.ReplaceAllStringFunc.
+ raw, last, expanded := e.raw, 0, bytes.NewBuffer(nil)
+ for _, where := range tagRE.FindAllIndex(raw, -1) {
+ _, _ = expanded.Write(expand(entries, name, raw[last:where[0]]))
+ _, _ = expanded.Write(raw[where[0]:where[1]])
+ last = where[1]
+ }
+ _, _ = expanded.Write(expand(entries, name, raw[last:]))
+ e.Content = template.HTML(expanded.String())
+ }
+}
+
func writeIndex(t *template.Template, entries *map[string]*Entry) error {
// Reorder entries reversely, primarily by date, secondarily by filename.
ordered := []*Entry{}
@@ -344,6 +349,8 @@ func main() {
if err != nil {
log.Fatalln(err)
}
+
+ finalizeEntries(&entries)
for _, e := range entries {
if err := writeEntry(e, t, &entries); err != nil {
log.Fatalln(err)