From 2fa66f90e5f5934e79f8a51926c2d2de885104d9 Mon Sep 17 00:00:00 2001 From: Simon Martens Date: Wed, 8 Jan 2025 03:04:12 +0100 Subject: [PATCH] Added Lookup functions to template to do reverse lookups on works, issues and pieces --- package-lock.json | 6 ++++ providers/gnd/gnd.go | 3 +- providers/xmlprovider/xmlprovider.go | 19 +++++-------- templating/engine.go | 4 +++ viewmodels/agent_view.go | 38 +++----------------------- views/routes/components/_akteur.gohtml | 15 +++++++--- xmlmodels/common.go | 1 + 7 files changed, 35 insertions(+), 51 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a3b16e1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "kgpz_web", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/providers/gnd/gnd.go b/providers/gnd/gnd.go index 03b2864..b9bd6ec 100644 --- a/providers/gnd/gnd.go +++ b/providers/gnd/gnd.go @@ -109,7 +109,8 @@ func (p *GNDProvider) WriteCache(folder string) error { return nil } -// TODO: Dont write persons already written +// INFO: this writes all persons to the cache folder +// We do that on every fetch, it's easier that way func (p *GNDProvider) writePersons(folder string) error { info, err := os.Stat(folder) if err == os.ErrNotExist { diff --git a/providers/xmlprovider/xmlprovider.go b/providers/xmlprovider/xmlprovider.go index c48bd80..9a2f33a 100644 --- a/providers/xmlprovider/xmlprovider.go +++ b/providers/xmlprovider/xmlprovider.go @@ -1,7 +1,6 @@ package xmlprovider import ( - "fmt" "slices" "sync" "time" @@ -135,24 +134,20 @@ func (p *XMLProvider[T]) Cleanup(latest ParseMeta) { } } -func (p *XMLProvider[T]) ReverseLookup(item XMLItem) ([]Resolved[T], error) { - keys := item.Keys() - - if len(keys) == 0 { - return nil, fmt.Errorf("Item has no keys") - } - +func (p *XMLProvider[T]) ReverseLookup(item XMLItem) []Resolved[T] { // INFO: this runs just once for the first key ret := make([]Resolved[T], 0) + keys := item.Keys() + for _, key := range keys { r, err := p.Resolver.Get(item.Name(), key) - if err != nil { - return ret, err + if err == nil { + ret = append(ret, r...) + return ret } - ret = append(ret, r...) } - return ret, nil + return ret } func (a *XMLProvider[T]) String() string { diff --git a/templating/engine.go b/templating/engine.go index aae11fb..1fb3a55 100644 --- a/templating/engine.go +++ b/templating/engine.go @@ -67,6 +67,10 @@ func (e *Engine) Funcs(app *app.KGPZ) error { e.AddFunc("GetPiece", app.Library.Pieces.Item) e.AddFunc("GetGND", app.GND.Person) + e.AddFunc("LookupPieces", app.Library.Pieces.ReverseLookup) + e.AddFunc("LookupWorks", app.Library.Works.ReverseLookup) + e.AddFunc("LookupIssues", app.Library.Issues.ReverseLookup) + return nil } diff --git a/viewmodels/agent_view.go b/viewmodels/agent_view.go index aedb8e5..0fa3e16 100644 --- a/viewmodels/agent_view.go +++ b/viewmodels/agent_view.go @@ -5,30 +5,18 @@ import ( "slices" "strings" - "github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider" "github.com/Theodor-Springmann-Stiftung/kgpz_web/xmlmodels" ) type AgentsListView struct { Search string AvailableLetters []string - Agents map[string]AgentView + Agents map[string]xmlmodels.Agent Sorted []string } -type AgentView struct { - xmlmodels.Agent - Works []WorkByAgent - Pieces []xmlprovider.Resolved[xmlmodels.Piece] -} - -type WorkByAgent struct { - xmlprovider.Resolved[xmlmodels.Work] - Pieces []xmlprovider.Resolved[xmlmodels.Piece] -} - func AgentsView(letterorid string, lib *xmlmodels.Library) *AgentsListView { - res := AgentsListView{Search: letterorid, Agents: make(map[string]AgentView)} + res := AgentsListView{Search: letterorid, Agents: make(map[string]xmlmodels.Agent)} av := make(map[string]bool) if len(letterorid) == 1 { @@ -37,7 +25,7 @@ func AgentsView(letterorid string, lib *xmlmodels.Library) *AgentsListView { av[strings.ToUpper(a.ID[:1])] = true if strings.HasPrefix(a.ID, letterorid) { res.Sorted = append(res.Sorted, a.ID) - res.Agents[a.ID] = AgentView{Agent: a} + res.Agents[a.ID] = a } } } else { @@ -46,30 +34,12 @@ func AgentsView(letterorid string, lib *xmlmodels.Library) *AgentsListView { av[strings.ToUpper(a.ID[:1])] = true if a.ID == letterorid { res.Sorted = append(res.Sorted, a.ID) - res.Agents[a.ID] = AgentView{Agent: a} + res.Agents[a.ID] = a break } } } - for _, a := range res.Agents { - if works, err := lib.Works.ReverseLookup(a); err == nil { - for _, w := range works { - if pieces, err := lib.Pieces.ReverseLookup(w.Item); err == nil { - // INFO: it makes no sense to append works that have no pieces attached - a.Works = append(a.Works, WorkByAgent{Resolved: w, Pieces: pieces}) - } - } - } - - if pieces, err := lib.Pieces.ReverseLookup(a.Agent); err == nil { - a.Pieces = pieces - } - - // TODO: sort the things, also for works and pieces above - res.Agents[a.ID] = a - } - res.AvailableLetters = slices.Collect(maps.Keys(av)) slices.Sort(res.AvailableLetters) slices.Sort(res.Sorted) diff --git a/views/routes/components/_akteur.gohtml b/views/routes/components/_akteur.gohtml index 1312499..abcefa0 100644 --- a/views/routes/components/_akteur.gohtml +++ b/views/routes/components/_akteur.gohtml @@ -42,9 +42,10 @@ - {{- if ne (len $a.Works) 0 -}} + {{ $works := LookupWorks $a }} + {{- if ne (len $works) 0 -}}
- {{ range $_, $w := $a.Works }} + {{ range $_, $w := $works }} {{- if ne (len $w.Item.Citation.InnerXML ) 0 -}} {{- end -}} + {{ range $_, $url := $w.Item.URLs }} +
+ {{ $url.Chardata }} +
+ {{ end }} {{ end }}
{{ end }} - {{- if ne (len $a.Pieces) 0 -}} + {{ $pieces := LookupPieces $a }} + {{- if ne (len $pieces) 0 -}}
- {{ range $_, $p := $a.Pieces }} + {{ range $_, $p := $pieces }} {{- range $_, $i := $p.Item.IssueRefs -}}
{{ $i.Nr }}/{{ $i.When }} diff --git a/xmlmodels/common.go b/xmlmodels/common.go index 719342a..daa15a9 100644 --- a/xmlmodels/common.go +++ b/xmlmodels/common.go @@ -30,6 +30,7 @@ type URL struct { XMLName xml.Name `xml:"url"` Address string `xml:"address,attr"` Value + Inner } type AnnotationNote struct {