More CSS & sorting of T array by keys

This commit is contained in:
Simon Martens
2025-01-16 16:19:19 +01:00
parent e88bb5974a
commit ff310265e4
10 changed files with 190 additions and 40 deletions

View File

@@ -9,15 +9,25 @@ import (
"sync" "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 // 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. // 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 { return func(path string) template.HTML {
path = strings.TrimSpace(path) path = strings.TrimSpace(path)
path = filepath.Clean(path) path = filepath.Clean(path)
val, err := getFileData(fs, path) val, err := e.getFileData(path)
if err != nil { if err != nil {
return template.HTML("") 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 { return func(path string) string {
path = strings.TrimSpace(path) path = strings.TrimSpace(path)
path = filepath.Clean(path) path = filepath.Clean(path)
val, err := getFileData(fs, path) val, err := e.getFileData(path)
if err != nil { if err != nil {
return "" return ""
} }
@@ -39,16 +49,12 @@ func Embed(fs fs.FS) func(string) string {
} }
} }
func ClearEmbedCache() { func (e *Embedder) getFileData(path string) ([]byte, error) {
embed_cache.Clear() if val, ok := e.embed_cache.Load(path); ok {
}
func getFileData(fs fs.FS, path string) ([]byte, error) {
if val, ok := embed_cache.Load(path); ok {
return val.([]byte), nil return val.([]byte), nil
} }
f, err := fs.Open(path) f, err := e.fs.Open(path)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -59,12 +65,11 @@ func getFileData(fs fs.FS, path string) ([]byte, error) {
return nil, err return nil, err
} }
embed_cache.Store(path, data) e.embed_cache.Store(path, data)
return data, nil return data, nil
} }
func EmbedXSLT(fs fs.FS) func(string) template.HTML { func (e *Embedder) EmbedXSLT() func(string) template.HTML {
embed_cache.Clear()
return func(path string) template.HTML { return func(path string) template.HTML {
path = strings.TrimSpace(path) path = strings.TrimSpace(path)
path = filepath.Clean(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" + "]") return template.HTML("[ERROR: " + "file is not an XSLT file" + "]")
} }
val, err := getFileData(fs, path) val, err := e.getFileData(path)
if err != nil { if err != nil {
return template.HTML("[ERROR: " + err.Error() + "]") return template.HTML("[ERROR: " + err.Error() + "]")
} }

View 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
}

View File

@@ -125,6 +125,8 @@ func (p *XMLProvider[T]) Cleanup(latest ParseMeta) {
p.Array = append(p.Array, *item) p.Array = append(p.Array, *item)
p.addResolvable(*item) p.addResolvable(*item)
} }
slices.SortFunc(p.Array, Sort)
} }
func (p *XMLProvider[T]) addResolvable(item T) { func (p *XMLProvider[T]) addResolvable(item T) {

View File

@@ -57,12 +57,10 @@ func (e *Engine) funcs() error {
e.AddFunc("Safe", functions.Safe) e.AddFunc("Safe", functions.Safe)
// Embedding of file contents // Embedding of file contents
functions.ClearEmbedCache() embedder := functions.NewEmbedder(views.StaticFS)
e.AddFunc("EmbedSafe", functions.EmbedSafe(views.StaticFS)) e.AddFunc("EmbedSafe", embedder.EmbedSafe())
e.AddFunc("Embed", functions.Embed(views.StaticFS)) e.AddFunc("Embed", embedder.Embed())
e.AddFunc("EmbedXSLT", embedder.EmbedXSLT())
// Embedding of XSLT files
e.AddFunc("EmbedXSLT", functions.EmbedXSLT(views.StaticFS))
return nil return nil
} }

File diff suppressed because one or more lines are too long

View File

@@ -16,18 +16,20 @@
<div class="grid grid-cols-11 gap-x-2 gap-y-4 pt-8"> <div class="grid grid-cols-11 gap-x-2 gap-y-4 pt-8">
{{ range $index, $month := .model.Issues }} {{ range $index, $month := .model.Issues }}
<!-- Month Header -->
<div class="col-span-1 text-right py-1 px-2.5"> <div class="col-span-1 text-right py-1 px-2.5">
<!-- Month Header -->
{{ $first := index $month 0 }} {{ $first := index $month 0 }}
<h2 class="text-lg">{{ (MonthName $first.Datum.When.Month) }}</h2> <h2 class="text-lg">{{ (MonthName $first.Datum.When.Month) }}</h2>
</div> </div>
<!-- Issues --> <!-- Issues -->
<div class="col-span-10 grid grid-cols-subgrid"> <div class="col-span-10 grid grid-cols-subgrid">
{{ range $issue := $month }} {{ range $issue := $month }}
<div class="col-span-1 bg-slate-100 px-2 py-1.5"> <div class="col-span-1 bg-slate-100 px-2 py-1.5">
{{ $date := $issue.Datum.When }} {{ $date := $issue.Datum.When }}
<a class="!no-underline" href="/{{ $y }}/{{ $issue.Number.No }}"> <a class="!no-underline" href="/{{ $y }}/{{ $issue.Number.No }}">
<div> <div class="">
{{ $issue.Number.No }} {{ $issue.Number.No }}
</div> </div>

View File

@@ -58,6 +58,19 @@
<a href="{{ $url.Address }}" target="_blank">{{ $url.Chardata }}</a> <a href="{{ $url.Address }}" target="_blank">{{ $url.Chardata }}</a>
</div> </div>
{{ end }} {{ 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 }} {{ end }}
</div> </div>
{{ end }} {{ end }}

View File

@@ -1,16 +1,15 @@
{{ $model := .model }} {{ $model := .model }}
<div>Inhalt</div>
<div> <div>
{{ range $page := $model.Pieces.Pages }} {{ range $page := $model.Pieces.Pages }}
<div> <div class="pt-4">
<div>Seite {{ $page }}</div> <div class="">Seite {{ $page }}</div>
<ol class="list-disc" >
{{ range $piece := (index $model.Pieces.Items $page) }} {{ range $piece := (index $model.Pieces.Items $page) }}
<li class="ml-0" >
{{ template "_inhaltsverzeichnis_eintrag" $piece }} {{ template "_inhaltsverzeichnis_eintrag" $piece }}
<!-- Links zu anderen Teilen: --> <!-- Links zu anderen Teilen: -->
{{ if gt (len $piece.IssueRefs) 1 }} {{ if gt (len $piece.IssueRefs) 1 }}
<div> <div>
@@ -33,9 +32,11 @@
</ol> </ol>
</div> </div>
{{ end }} {{ end }}
</li>
{{ end }} {{ end }}
<!-- Pages end -->
</div> </div>
{{ end }} {{ end }}
</div> </div>

View File

@@ -1,20 +1,50 @@
{{ $piece := . }} {{ $piece := . }}
Eintrag!
<!-- Autor(en) --> <!-- Autor(en) -->
{{ $authorset := false }} {{ if $piece.AgentRefs }}
<div class="authors"> <div class="authors">
{{ range $agentref := $piece.AgentRefs }} {{ range $agentref := $piece.AgentRefs }}
{{ if (or (eq $agentref.Category "") (eq $agentref.Category "autor")) }} {{ if (or (eq $agentref.Category "") (eq $agentref.Category "autor")) }}
{{ $agent := GetAgent $agentref.Ref }} {{ $agent := GetAgent $agentref.Ref }}
<!-- NOT IMPLEMENTED: Multiple agent names --> {{- if gt (len $agent.Names) 0 -}}
{{- if gt (len $agent.Names) 0 -}} <a href="/akteure/{{ $agentref.Ref }}" class="inline-block">
<div class="author inline-block">{{- index $agent.Names 0 -}}</div> {{- 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 }} {{ end }}
{{ end }} {{ end }}
</div> </div>
<!-- Notizen -->
{{ range $annotation := $piece.AnnotationNote.Annotations }} {{ range $annotation := $piece.AnnotationNote.Annotations }}
<div> <div>
{{ $annotation.Inner.InnerXML }} {{ $annotation.Inner.InnerXML }}

View File

@@ -67,16 +67,30 @@ func (p Piece) ReferencesIssue(y, no int) (*IssueRef, bool) {
return nil, false 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] { func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
refs := make(xmlprovider.ResolvingMap[Piece]) refs := make(xmlprovider.ResolvingMap[Piece])
x := CategoryRef{} 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 { for _, ref := range p.IssueRefs {
if ref.When.Year == 0 || ref.Nr == 0 { if ref.When.Year == 0 || ref.Nr == 0 {
continue continue
} }
if ref.Category != "" { if ref.Category != "" {
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{ refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
Item: &p,
Reference: ref.Category, Reference: ref.Category,
Cert: !ref.Unsicher, Cert: !ref.Unsicher,
Conjecture: false, Conjecture: false,
@@ -84,6 +98,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
}) })
} }
refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{ refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{
Item: &p,
Reference: strconv.Itoa(ref.When.Year) + "-" + strconv.Itoa(ref.Nr), Reference: strconv.Itoa(ref.When.Year) + "-" + strconv.Itoa(ref.Nr),
Category: ref.Category, Category: ref.Category,
Cert: !ref.Unsicher, Cert: !ref.Unsicher,
@@ -96,6 +111,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
for _, ref := range p.PlaceRefs { for _, ref := range p.PlaceRefs {
if ref.Category != "" { if ref.Category != "" {
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{ refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
Item: &p,
Reference: ref.Category, Reference: ref.Category,
Cert: !ref.Unsicher, Cert: !ref.Unsicher,
Conjecture: false, Conjecture: false,
@@ -103,6 +119,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
}) })
} }
refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{ refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{
Item: &p,
Reference: ref.Ref, Reference: ref.Ref,
Category: ref.Category, Category: ref.Category,
Cert: !ref.Unsicher, Cert: !ref.Unsicher,
@@ -115,6 +132,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
for _, ref := range p.AgentRefs { for _, ref := range p.AgentRefs {
if ref.Category != "" { if ref.Category != "" {
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{ refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
Item: &p,
Reference: ref.Category, Reference: ref.Category,
Cert: !ref.Unsicher, Cert: !ref.Unsicher,
Conjecture: false, Conjecture: false,
@@ -122,6 +140,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
}) })
} }
refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{ refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{
Item: &p,
Reference: ref.Ref, Reference: ref.Ref,
Category: ref.Category, Category: ref.Category,
Cert: !ref.Unsicher, Cert: !ref.Unsicher,
@@ -134,6 +153,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
for _, ref := range p.WorkRefs { for _, ref := range p.WorkRefs {
if ref.Category != "" { if ref.Category != "" {
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{ refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
Item: &p,
Reference: ref.Category, Reference: ref.Category,
Cert: !ref.Unsicher, Cert: !ref.Unsicher,
Conjecture: false, Conjecture: false,
@@ -141,6 +161,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
}) })
} }
refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{ refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{
Item: &p,
Reference: ref.Ref, Reference: ref.Ref,
Category: ref.Category, Category: ref.Category,
Cert: !ref.Unsicher, Cert: !ref.Unsicher,
@@ -152,6 +173,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
for _, ref := range p.PieceRefs { for _, ref := range p.PieceRefs {
if ref.Category != "" { if ref.Category != "" {
refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{ refs[x.Name()] = append(refs[x.Name()], xmlprovider.Resolved[Piece]{
Item: &p,
Reference: ref.Category, Reference: ref.Category,
Cert: !ref.Unsicher, Cert: !ref.Unsicher,
Conjecture: false, Conjecture: false,
@@ -160,6 +182,7 @@ func (p Piece) References() xmlprovider.ResolvingMap[Piece] {
}) })
} }
refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{ refs[ref.Name()] = append(refs[ref.Name()], xmlprovider.Resolved[Piece]{
Item: &p,
Reference: ref.Ref, Reference: ref.Ref,
Category: ref.Category, Category: ref.Category,
Cert: !ref.Unsicher, Cert: !ref.Unsicher,