mirror of
https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
synced 2025-10-28 16:45:32 +00:00
More CSS & sorting of T array by keys
This commit is contained in:
@@ -9,15 +9,25 @@ import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
var embed_cache sync.Map
|
||||
type Embedder struct {
|
||||
embed_cache sync.Map
|
||||
fs fs.FS
|
||||
}
|
||||
|
||||
func NewEmbedder(fs fs.FS) *Embedder {
|
||||
return &Embedder{
|
||||
fs: fs,
|
||||
embed_cache: sync.Map{},
|
||||
}
|
||||
}
|
||||
|
||||
// INFO: We initialize the cache in both functions, which is only valid if both of these get
|
||||
// called in the same context, eg. when creating a template engine.
|
||||
func EmbedSafe(fs fs.FS) func(string) template.HTML {
|
||||
func (e *Embedder) EmbedSafe() func(string) template.HTML {
|
||||
return func(path string) template.HTML {
|
||||
path = strings.TrimSpace(path)
|
||||
path = filepath.Clean(path)
|
||||
val, err := getFileData(fs, path)
|
||||
val, err := e.getFileData(path)
|
||||
if err != nil {
|
||||
return template.HTML("")
|
||||
}
|
||||
@@ -26,11 +36,11 @@ func EmbedSafe(fs fs.FS) func(string) template.HTML {
|
||||
}
|
||||
}
|
||||
|
||||
func Embed(fs fs.FS) func(string) string {
|
||||
func (e *Embedder) Embed() func(string) string {
|
||||
return func(path string) string {
|
||||
path = strings.TrimSpace(path)
|
||||
path = filepath.Clean(path)
|
||||
val, err := getFileData(fs, path)
|
||||
val, err := e.getFileData(path)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
@@ -39,16 +49,12 @@ func Embed(fs fs.FS) func(string) string {
|
||||
}
|
||||
}
|
||||
|
||||
func ClearEmbedCache() {
|
||||
embed_cache.Clear()
|
||||
}
|
||||
|
||||
func getFileData(fs fs.FS, path string) ([]byte, error) {
|
||||
if val, ok := embed_cache.Load(path); ok {
|
||||
func (e *Embedder) getFileData(path string) ([]byte, error) {
|
||||
if val, ok := e.embed_cache.Load(path); ok {
|
||||
return val.([]byte), nil
|
||||
}
|
||||
|
||||
f, err := fs.Open(path)
|
||||
f, err := e.fs.Open(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -59,12 +65,11 @@ func getFileData(fs fs.FS, path string) ([]byte, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
embed_cache.Store(path, data)
|
||||
e.embed_cache.Store(path, data)
|
||||
return data, nil
|
||||
}
|
||||
|
||||
func EmbedXSLT(fs fs.FS) func(string) template.HTML {
|
||||
embed_cache.Clear()
|
||||
func (e *Embedder) EmbedXSLT() func(string) template.HTML {
|
||||
return func(path string) template.HTML {
|
||||
path = strings.TrimSpace(path)
|
||||
path = filepath.Clean(path)
|
||||
@@ -76,7 +81,7 @@ func EmbedXSLT(fs fs.FS) func(string) template.HTML {
|
||||
return template.HTML("[ERROR: " + "file is not an XSLT file" + "]")
|
||||
}
|
||||
|
||||
val, err := getFileData(fs, path)
|
||||
val, err := e.getFileData(path)
|
||||
if err != nil {
|
||||
return template.HTML("[ERROR: " + err.Error() + "]")
|
||||
}
|
||||
|
||||
76
providers/xmlprovider/xmlitemarray.go
Normal file
76
providers/xmlprovider/xmlitemarray.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package xmlprovider
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Sort[T XMLItem](i, j T) int {
|
||||
|
||||
keys_a := i.Keys()
|
||||
keys_b := j.Keys()
|
||||
|
||||
if len(keys_a) == 0 && len(keys_b) == 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
if len(keys_a) == 0 && len(keys_b) > 0 {
|
||||
return -1
|
||||
}
|
||||
|
||||
if len(keys_a) > 0 && len(keys_b) == 0 {
|
||||
return 1
|
||||
}
|
||||
|
||||
sort_a := strings.Split(keys_a[0], "-")
|
||||
sort_b := strings.Split(keys_b[0], "-")
|
||||
|
||||
for i, item := range sort_a {
|
||||
if i >= len(sort_b) {
|
||||
return 1
|
||||
}
|
||||
|
||||
// INFO: this is a bit lazy since
|
||||
// - we are comparing bit values not unicode code points
|
||||
// - the comparison is case sensitive
|
||||
int_a, err := strconv.Atoi(item)
|
||||
if err != nil {
|
||||
if item < sort_b[i] {
|
||||
return -1
|
||||
}
|
||||
|
||||
if item > sort_b[i] {
|
||||
return 1
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
int_b, err := strconv.Atoi(sort_b[i])
|
||||
if err != nil {
|
||||
if item < sort_b[i] {
|
||||
return -1
|
||||
}
|
||||
|
||||
if item > sort_b[i] {
|
||||
return 1
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
if int_a < int_b {
|
||||
return -1
|
||||
}
|
||||
|
||||
if int_a > int_b {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
if len(sort_b) > len(sort_a) {
|
||||
return -1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
@@ -125,6 +125,8 @@ func (p *XMLProvider[T]) Cleanup(latest ParseMeta) {
|
||||
p.Array = append(p.Array, *item)
|
||||
p.addResolvable(*item)
|
||||
}
|
||||
|
||||
slices.SortFunc(p.Array, Sort)
|
||||
}
|
||||
|
||||
func (p *XMLProvider[T]) addResolvable(item T) {
|
||||
|
||||
@@ -57,12 +57,10 @@ func (e *Engine) funcs() error {
|
||||
e.AddFunc("Safe", functions.Safe)
|
||||
|
||||
// Embedding of file contents
|
||||
functions.ClearEmbedCache()
|
||||
e.AddFunc("EmbedSafe", functions.EmbedSafe(views.StaticFS))
|
||||
e.AddFunc("Embed", functions.Embed(views.StaticFS))
|
||||
|
||||
// Embedding of XSLT files
|
||||
e.AddFunc("EmbedXSLT", functions.EmbedXSLT(views.StaticFS))
|
||||
embedder := functions.NewEmbedder(views.StaticFS)
|
||||
e.AddFunc("EmbedSafe", embedder.EmbedSafe())
|
||||
e.AddFunc("Embed", embedder.Embed())
|
||||
e.AddFunc("EmbedXSLT", embedder.EmbedXSLT())
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -16,18 +16,20 @@
|
||||
|
||||
<div class="grid grid-cols-11 gap-x-2 gap-y-4 pt-8">
|
||||
{{ range $index, $month := .model.Issues }}
|
||||
|
||||
<!-- Month Header -->
|
||||
<div class="col-span-1 text-right py-1 px-2.5">
|
||||
<!-- Month Header -->
|
||||
{{ $first := index $month 0 }}
|
||||
<h2 class="text-lg">{{ (MonthName $first.Datum.When.Month) }}</h2>
|
||||
</div>
|
||||
|
||||
<!-- Issues -->
|
||||
<div class="col-span-10 grid grid-cols-subgrid">
|
||||
{{ range $issue := $month }}
|
||||
<div class="col-span-1 bg-slate-100 px-2 py-1.5">
|
||||
{{ $date := $issue.Datum.When }}
|
||||
<a class="!no-underline" href="/{{ $y }}/{{ $issue.Number.No }}">
|
||||
<div>
|
||||
<div class="">
|
||||
{{ $issue.Number.No }}
|
||||
</div>
|
||||
|
||||
|
||||
@@ -58,6 +58,19 @@
|
||||
<a href="{{ $url.Address }}" target="_blank">{{ $url.Chardata }}</a>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{ $pieces := LookupPieces $w.Item }}
|
||||
{{ if len $pieces }}
|
||||
<div>
|
||||
{{ range $_, $p := $pieces }}
|
||||
{{- range $_, $i := $p.Item.IssueRefs -}}
|
||||
<div>
|
||||
<a href="/{{ $i.When }}/{{ $i.Nr }}">{{ $i.Nr }}/{{ $i.When }}</a>
|
||||
</div>
|
||||
{{- end -}}
|
||||
{{ end }}
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
{{ $model := .model }}
|
||||
|
||||
|
||||
<div>Inhalt</div>
|
||||
<div>
|
||||
{{ range $page := $model.Pieces.Pages }}
|
||||
<div>
|
||||
<div>Seite {{ $page }}</div>
|
||||
|
||||
<div class="pt-4">
|
||||
<div class="">Seite {{ $page }}</div>
|
||||
<ol class="list-disc" >
|
||||
{{ range $piece := (index $model.Pieces.Items $page) }}
|
||||
<li class="ml-0" >
|
||||
{{ template "_inhaltsverzeichnis_eintrag" $piece }}
|
||||
|
||||
|
||||
<!-- Links zu anderen Teilen: -->
|
||||
{{ if gt (len $piece.IssueRefs) 1 }}
|
||||
<div>
|
||||
@@ -33,9 +32,11 @@
|
||||
</ol>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
</li>
|
||||
{{ end }}
|
||||
|
||||
|
||||
<!-- Pages end -->
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
@@ -1,20 +1,50 @@
|
||||
{{ $piece := . }}
|
||||
Eintrag!
|
||||
|
||||
|
||||
<!-- Autor(en) -->
|
||||
{{ $authorset := false }}
|
||||
<div class="authors">
|
||||
{{ range $agentref := $piece.AgentRefs }}
|
||||
{{ if (or (eq $agentref.Category "") (eq $agentref.Category "autor")) }}
|
||||
{{ $agent := GetAgent $agentref.Ref }}
|
||||
<!-- NOT IMPLEMENTED: Multiple agent names -->
|
||||
{{- if gt (len $agent.Names) 0 -}}
|
||||
<div class="author inline-block">{{- index $agent.Names 0 -}}</div>
|
||||
{{ if $piece.AgentRefs }}
|
||||
<div class="authors">
|
||||
{{ range $agentref := $piece.AgentRefs }}
|
||||
{{ if (or (eq $agentref.Category "") (eq $agentref.Category "autor")) }}
|
||||
{{ $agent := GetAgent $agentref.Ref }}
|
||||
{{- if gt (len $agent.Names) 0 -}}
|
||||
<a href="/akteure/{{ $agentref.Ref }}" class="inline-block">
|
||||
{{- index $agent.Names 0 -}}
|
||||
</a>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
|
||||
<!-- Kategorien -->
|
||||
<div class="">
|
||||
<!-- Einzelkategorien -->
|
||||
{{ if $piece.CategoryRefs }}
|
||||
{{ range $catref := $piece.CategoryRefs }}
|
||||
{{ $category := GetCategory $catref.Ref }}
|
||||
{{- if gt (len $category.Names) 0 -}}
|
||||
<div class="category inline-block">{{- index $category.Names 0 -}}</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
|
||||
<!-- Kategorie Werk -->
|
||||
{{ if $piece.WorkRefs }}
|
||||
{{ range $workref := $piece.WorkRefs }}
|
||||
{{ $work := GetWork $workref.Ref }}
|
||||
{{- if $work.PreferredTitle -}}
|
||||
<div class="category inline-block">{{- index $work.PreferredTitle -}}</div>
|
||||
{{- else if $work.Citation.Title -}}
|
||||
<div class="category inline-block">{{- index $work.Citation.Title -}}</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
<!-- Notizen -->
|
||||
{{ range $annotation := $piece.AnnotationNote.Annotations }}
|
||||
<div>
|
||||
{{ $annotation.Inner.InnerXML }}
|
||||
|
||||
@@ -67,16 +67,30 @@ func (p Piece) ReferencesIssue(y, no int) (*IssueRef, bool) {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// INFO: we can't use a pointer reciever here, the interface won't allow it
|
||||
func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
|
||||
refs := make(xmlprovider.ResolvingMap[Piece])
|
||||
x := CategoryRef{}
|
||||
|
||||
for _, ref := range p.CategoryRefs {
|
||||
if ref.Category != "" {
|
||||
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
Conjecture: false,
|
||||
Comment: ref.Inner.InnerXML,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
for _, ref := range p.IssueRefs {
|
||||
if ref.When.Year == 0 || ref.Nr == 0 {
|
||||
continue
|
||||
}
|
||||
if ref.Category != "" {
|
||||
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
Conjecture: false,
|
||||
@@ -84,6 +98,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
|
||||
})
|
||||
}
|
||||
refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: strconv.Itoa(ref.When.Year) + "-" + strconv.Itoa(ref.Nr),
|
||||
Category: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
@@ -96,6 +111,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
|
||||
for _, ref := range p.PlaceRefs {
|
||||
if ref.Category != "" {
|
||||
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
Conjecture: false,
|
||||
@@ -103,6 +119,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
|
||||
})
|
||||
}
|
||||
refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: ref.Ref,
|
||||
Category: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
@@ -115,6 +132,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
|
||||
for _, ref := range p.AgentRefs {
|
||||
if ref.Category != "" {
|
||||
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
Conjecture: false,
|
||||
@@ -122,6 +140,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
|
||||
})
|
||||
}
|
||||
refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: ref.Ref,
|
||||
Category: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
@@ -134,6 +153,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
|
||||
for _, ref := range p.WorkRefs {
|
||||
if ref.Category != "" {
|
||||
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
Conjecture: false,
|
||||
@@ -141,6 +161,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
|
||||
})
|
||||
}
|
||||
refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: ref.Ref,
|
||||
Category: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
@@ -152,6 +173,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
|
||||
for _, ref := range p.PieceRefs {
|
||||
if ref.Category != "" {
|
||||
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
Conjecture: false,
|
||||
@@ -160,6 +182,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
|
||||
})
|
||||
}
|
||||
refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{
|
||||
Item: &p,
|
||||
Reference: ref.Ref,
|
||||
Category: ref.Category,
|
||||
Cert: !ref.Unsicher,
|
||||
|
||||
Reference in New Issue
Block a user