Show more information in back references
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Peter Stuifzand 2020-05-16 21:02:19 +02:00
parent 191db91095
commit 86f4d68d9c
7 changed files with 70 additions and 31 deletions

View File

@ -2,12 +2,18 @@ package main
import ( import (
"encoding/json" "encoding/json"
"fmt"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
) )
type Refs map[string][]string type Reference struct {
Link ParsedLink
Name string
}
type Refs map[string][]Reference
func processBackrefs(fp *FilePages) error { func processBackrefs(fp *FilePages) error {
pages, err := fp.AllPages() pages, err := fp.AllPages()
@ -19,14 +25,33 @@ func processBackrefs(fp *FilePages) error {
} }
for _, page := range pages { for _, page := range pages {
links, err := ParseLinks(page.Content) content := page.Content
var listItems []struct {
Id int
Indented int
Text string
}
err = json.NewDecoder(strings.NewReader(content)).Decode(&listItems)
if err == nil {
pageText := ""
for _, item := range listItems {
pageText += strings.Repeat(" ", item.Indented) + "* " + item.Text + "\n"
}
content = pageText
}
links, err := ParseLinks(content)
if err != nil { if err != nil {
return err return err
} }
for _, link := range links { for _, link := range links {
refs[link.PageName] = append(refs[link.PageName], page.Name) fmt.Println(link.Line)
refs[link.PageName] = append(refs[link.PageName], Reference{link, page.Name})
} }
} }
@ -60,10 +85,11 @@ func loadBackrefs(fp *FilePages, p string) ([]Backref, error) {
var result []Backref var result []Backref
for _, ref := range refs[p] { for _, ref := range refs[p] {
title := strings.Replace(ref, "_", " ", -1) title := strings.Replace(ref.Name, "_", " ", -1)
result = append(result, Backref{ result = append(result, Backref{
Name: ref, Name: ref.Name,
Title: title, Title: title,
Line: strings.TrimLeft(ref.Link.Line, " *"),
}) })
} }

22
file.go
View File

@ -31,12 +31,7 @@ func (fp *FilePages) Get(title string) Page {
name := strings.Replace(title, " ", "_", -1) name := strings.Replace(title, " ", "_", -1)
refs, err := loadBackrefs(fp, name) refs, err := loadBackrefs(fp, name)
if err != nil { if err != nil {
return Page{ refs = nil
Title: title,
Name: name,
Content: "",
Refs: nil,
}
} }
f, err := os.Open(filepath.Join(fp.dirname, name)) f, err := os.Open(filepath.Join(fp.dirname, name))
@ -89,7 +84,7 @@ func (fp *FilePages) Save(p string, page Page, summary, author string) error {
err = processBackrefs(fp) err = processBackrefs(fp)
if err != nil { if err != nil {
return fmt.Errorf("while processing backrefs: %v", err) return fmt.Errorf("while processing backrefs: %s", err)
} }
return saveWithGit(fp, p, summary, author) return saveWithGit(fp, p, summary, author)
@ -100,14 +95,14 @@ func saveWithGit(fp *FilePages, p string, summary, author string) error {
cmd.Dir = fp.dirname cmd.Dir = fp.dirname
err := cmd.Run() err := cmd.Run()
if err != nil { if err != nil {
return fmt.Errorf("while adding page %s: %w", p, err) return fmt.Errorf("while adding page %s: %s", p, err)
} }
cmd = exec.Command("git", "commit", "-m", "Changes to "+p+" by "+author+"\n\n"+summary) cmd = exec.Command("git", "commit", "-m", "Changes to "+p+" by "+author+"\n\n"+summary)
cmd.Dir = fp.dirname cmd.Dir = fp.dirname
err = cmd.Run() err = cmd.Run()
if err != nil { if err != nil {
return fmt.Errorf("while commiting page %s: %w", p, err) return fmt.Errorf("while commiting page %s: %s", p, err)
} }
return nil return nil
} }
@ -156,8 +151,7 @@ func (fp *FilePages) PageHistory(p string) ([]Revision, error) {
err = cmd.Start() err = cmd.Start()
if err != nil { if err != nil {
log.Println("Start") return nil, fmt.Errorf("while starting", err)
return nil, err
} }
buf := bufio.NewScanner(output) buf := bufio.NewScanner(output)
@ -187,8 +181,7 @@ func (fp *FilePages) PageHistory(p string) ([]Revision, error) {
} }
if err := cmd.Wait(); err != nil { if err := cmd.Wait(); err != nil {
log.Println("wait") return nil, fmt.Errorf("while waiting", err)
return nil, err
} }
return revisions, nil return revisions, nil
@ -287,6 +280,9 @@ func (fp *FilePages) AllPages() ([]Page, error) {
var pages []Page var pages []Page
for _, file := range files { for _, file := range files {
if file.Name() == "backrefs.json" {
continue
}
pages = append(pages, fp.Get(file.Name())) pages = append(pages, fp.Get(file.Name()))
} }

View File

@ -34,6 +34,7 @@ const (
type Backref struct { type Backref struct {
Name string Name string
Title string Title string
Line string
} }
// Page // Page

View File

@ -10,14 +10,18 @@
</form> </form>
{{ if .Backrefs }} {{ if .Backrefs }}
<div class="backrefs"> <div class="backrefs content">
<h3>Backrefs</h3> <h3>Linked references</h3>
<ul> <ul>
{{ range $ref := .Backrefs }} {{ range $ref := .Backrefs }}
<li><a href="/{{ $ref.Name }}">{{ $ref.Title }}</a></li> <li><a href="/{{ $ref.Name }}">{{ $ref.Title }}</a>
<ul>
<li>{{ $ref.Line }}</li>
</ul>
</li>
{{ end }} {{ end }}
</ul> </ul>
</div> </div>
{{ end }} {{ end }}
{{ end }} {{ end }}

View File

@ -115,6 +115,12 @@
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)"; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
filter: alpha(opacity=20); filter: alpha(opacity=20);
} }
.backrefs {
padding: 24px;
background: #deeeee;
border-top: 3px solid #acc;
}
</style> </style>
</head> </head>
<body> <body>

View File

@ -4,11 +4,15 @@
{{ .Content }} {{ .Content }}
</div> </div>
<div class="backrefs"> <div class="backrefs content">
<h3>Backrefs</h3> <h3>Backrefs</h3>
<ul> <ul>
{{ range $ref := .Backrefs }} {{ range $ref := .Backrefs }}
<li><a href="/{{ $ref.Name }}">{{ $ref.Title }}</a></li> <li><a href="/{{ $ref.Name }}">{{ $ref.Title }}</a>
<ul>
<li>{{ $ref.Line }}</li>
</ul>
</li>
{{ end }} {{ end }}
</ul> </ul>
</div> </div>

View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"log"
"math/rand" "math/rand"
"regexp" "regexp"
"strings" "strings"
@ -10,6 +11,7 @@ import (
type ParsedLink struct { type ParsedLink struct {
Name string Name string
PageName string PageName string
Line string
} }
var random *rand.Rand var random *rand.Rand
@ -29,14 +31,14 @@ func RandStringBytes(n int) string {
} }
func ParseLinks(content string) ([]ParsedLink, error) { func ParseLinks(content string) ([]ParsedLink, error) {
hrefRE := regexp.MustCompile(`#?\[\[\s*([^\]]+)\s*\]\]`) hrefRE := regexp.MustCompile(`(?m)^(.*(#?\[\[\s*([^\]]+)\s*\]\]).*)$`)
links := hrefRE.FindAllStringSubmatch(content, -1) links := hrefRE.FindAllStringSubmatch(content, -1)
var result []ParsedLink var result []ParsedLink
for _, matches := range links { for _, matches := range links {
link := matches[0] link := matches[2]
if link[0] == '#' { if link[0] == '#' {
link = strings.TrimPrefix(link, "#[[") link = strings.TrimPrefix(link, "#[[")
@ -47,7 +49,7 @@ func ParseLinks(content string) ([]ParsedLink, error) {
link = strings.TrimSuffix(link, "]]") link = strings.TrimSuffix(link, "]]")
link = strings.TrimSpace(link) link = strings.TrimSpace(link)
l := cleanNameURL(link) l := cleanNameURL(link)
result = append(result, ParsedLink{link, l}) result = append(result, ParsedLink{link, l, matches[0]})
} }
return result, nil return result, nil