more stuff

This commit is contained in:
Simon Martens
2026-03-04 16:39:47 +01:00
parent 5a00333266
commit d7f7571470
22 changed files with 620 additions and 482 deletions

114
server/letterhead.go Normal file
View File

@@ -0,0 +1,114 @@
package server
import (
"strconv"
"strings"
"github.com/Theodor-Springmann-Stiftung/lenz-web/xmlmodels"
)
type letterHeadModel struct {
Number int
DateText string
IsDraft bool
HasOriginal bool
Pairs []letterHeadPairModel
}
type letterHeadPairModel struct {
Sent string
Received string
}
func buildLetterHead(lib *xmlmodels.Library, meta *xmlmodels.Meta) letterHeadModel {
head := letterHeadModel{
Pairs: make([]letterHeadPairModel, 0),
}
if meta == nil {
return head
}
head.Number = meta.Letter
head.IsDraft = meta.IsDraft.IsTrue()
head.HasOriginal = meta.HasOriginal.IsTrue()
if earliest := meta.Earliest(); earliest != nil {
head.DateText = strings.TrimSpace(earliest.Text)
}
for _, pair := range meta.SendReceivedPairs() {
sentNames := resolveNames(lib, pair.Sent.Persons, true)
receivedText := "Unbekannt"
if pair.Received != nil {
receivedNames := resolveNames(lib, pair.Received.Persons, true)
receivedPlaces := resolveNames(lib, pair.Received.Places, false)
if len(receivedNames) > 0 {
receivedText = joinGerman(receivedNames)
} else if len(receivedPlaces) > 0 {
receivedText = joinGerman(receivedPlaces)
} else {
receivedText = ""
}
if len(receivedPlaces) > 0 && len(receivedNames) > 0 {
receivedText += " (" + joinGerman(receivedPlaces) + ")"
}
}
head.Pairs = append(head.Pairs, letterHeadPairModel{
Sent: joinGerman(sentNames),
Received: receivedText,
})
}
return head
}
func resolveNames(lib *xmlmodels.Library, refs []xmlmodels.RefElement, person bool) []string {
ret := make([]string, 0, len(refs))
for _, ref := range refs {
name := ""
if person {
if def := lib.Person(ref.Reference); def != nil {
name = strings.TrimSpace(def.Name)
if name == "" {
name = strings.TrimSpace(def.FirstName + " " + def.LastName)
}
}
} else {
if def := lib.Place(ref.Reference); def != nil {
name = strings.TrimSpace(def.Name)
}
}
if name == "" {
name = strings.TrimSpace(ref.Text)
}
if name == "" && ref.Reference > 0 {
if person {
name = "Person " + strconv.Itoa(ref.Reference)
} else {
name = "Ort " + strconv.Itoa(ref.Reference)
}
}
if name != "" {
ret = append(ret, name)
}
}
return ret
}
func joinGerman(items []string) string {
switch len(items) {
case 0:
return ""
case 1:
return items[0]
case 2:
return items[0] + " und " + items[1]
default:
return strings.Join(items[:len(items)-1], ", ") + " und " + items[len(items)-1]
}
}