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"
)
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() + "]")
}

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.addResolvable(*item)
}
slices.SortFunc(p.Array, Sort)
}
func (p *XMLProvider[T]) addResolvable(item T) {

View File

@@ -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

View File

@@ -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>

View File

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

View File

@@ -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>

View File

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

View File

@@ -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,