+
{{- if ne (len $w.Item.Citation.InnerXML ) 0 -}}
{{- Safe $w.Item.Citation.HTML -}}
@@ -33,95 +31,38 @@
{{- end -}}
{{- end -}}
+
+ {{- /* Find all pieces that reference this work */ -}}
{{ $workPieces := LookupPieces $w.Item }}
{{ if len $workPieces }}
-
- {{- /* Group pieces by piece ID first to combine all categories per piece, then by additional authors */ -}}
- {{- $pieceData := dict -}}
+
+ {{- /* Group pieces by category + author combination */ -}}
+ {{- $pieceGroups := dict -}}
{{- range $_, $p := $workPieces -}}
+ {{- /* Get categories for this piece */ -}}
{{- $categoryFlags := GetCategoryFlags $p.Item -}}
{{- $categories := slice -}}
{{- if $categoryFlags.Rezension -}}
{{- $categories = append $categories "Rezension" -}}
{{- end -}}
- {{- if $categoryFlags.Gedicht -}}
- {{- $categories = append $categories "Gedicht" -}}
- {{- end -}}
- {{- if $categoryFlags.Aufsatz -}}
- {{- $categories = append $categories "Aufsatz" -}}
+ {{- if $categoryFlags.Auszug -}}
+ {{- $categories = append $categories "Auszug" -}}
{{- end -}}
{{- if $categoryFlags.Theaterkritik -}}
{{- $categories = append $categories "Theaterkritik" -}}
{{- end -}}
- {{- if $categoryFlags.Brief -}}
- {{- $categories = append $categories "Brief" -}}
- {{- end -}}
- {{- if $categoryFlags.Erzaehlung -}}
- {{- $categories = append $categories "Erzählung" -}}
+ {{- if $categoryFlags.Uebersetzung -}}
+ {{- $categories = append $categories "Übersetzung" -}}
{{- end -}}
{{- if $categoryFlags.Kommentar -}}
{{- $categories = append $categories "Kommentar" -}}
{{- end -}}
- {{- if $categoryFlags.Uebersetzung -}}
- {{- $categories = append $categories "Übersetzung" -}}
- {{- end -}}
- {{- if $categoryFlags.Auszug -}}
- {{- $categories = append $categories "Auszug" -}}
- {{- end -}}
{{- if $categoryFlags.Replik -}}
{{- $categories = append $categories "Replik" -}}
{{- end -}}
- {{- if $categoryFlags.Lokalnachrichten -}}
- {{- $categories = append $categories "Lokalnachrichten" -}}
- {{- end -}}
- {{- if $categoryFlags.Lotterie -}}
- {{- $categories = append $categories "Lotterie" -}}
- {{- end -}}
- {{- if $categoryFlags.Nachruf -}}
- {{- $categories = append $categories "Nachruf" -}}
- {{- end -}}
- {{- if $categoryFlags.Weltnachrichten -}}
- {{- $categories = append $categories "Weltnachrichten" -}}
- {{- end -}}
- {{- if $categoryFlags.EinkommendeFremde -}}
- {{- $categories = append $categories "Einkommende Fremde" -}}
- {{- end -}}
- {{- if $categoryFlags.Wechselkurse -}}
- {{- $categories = append $categories "Wechselkurse" -}}
- {{- end -}}
- {{- if $categoryFlags.Buecher -}}
- {{- $categories = append $categories "Bücher" -}}
- {{- end -}}
- {{- if $categoryFlags.Lokalanzeigen -}}
- {{- $categories = append $categories "Lokalanzeigen" -}}
- {{- end -}}
- {{- if $categoryFlags.Vorladung -}}
- {{- $categories = append $categories "Vorladung" -}}
- {{- end -}}
- {{- if $categoryFlags.GelehrteNachrichten -}}
- {{- $categories = append $categories "Gelehrte Nachrichten" -}}
- {{- end -}}
{{- if $categoryFlags.Anzeige -}}
{{- $categories = append $categories "Anzeige" -}}
{{- end -}}
- {{- if $categoryFlags.Proklamation -}}
- {{- $categories = append $categories "Proklamation" -}}
- {{- end -}}
- {{- if $categoryFlags.Desertionsliste -}}
- {{- $categories = append $categories "Desertionsliste" -}}
- {{- end -}}
- {{- if $categoryFlags.Notenblatt -}}
- {{- $categories = append $categories "Notenblatt" -}}
- {{- end -}}
- {{- if $categoryFlags.Vorlesungsverzeichnis -}}
- {{- $categories = append $categories "Vorlesungsverzeichnis" -}}
- {{- end -}}
- {{- if $categoryFlags.Abbildung -}}
- {{- $categories = append $categories "Abbildung" -}}
- {{- end -}}
- {{- if $categoryFlags.Ineigenersache -}}
- {{- $categories = append $categories "In eigener Sache" -}}
- {{- end -}}
{{- if $categoryFlags.Provinienz -}}
{{- $categories = append $categories "Provinienz" -}}
{{- end -}}
@@ -129,71 +70,83 @@
{{- $categories = append $categories "Beitrag" -}}
{{- end -}}
- {{- /* Get additional authors for this specific piece */ -}}
- {{- $pieceAdditionalAuthorIDs := slice -}}
+ {{- /* Get authors for this piece (excluding current person) */ -}}
+ {{- $pieceAuthors := slice -}}
{{- range $agentref := $p.Item.AgentRefs -}}
{{- if and (or (eq $agentref.Category "") (eq $agentref.Category "autor")) (ne $agentref.Ref $a.ID) -}}
- {{- $pieceAdditionalAuthorIDs = append $pieceAdditionalAuthorIDs $agentref.Ref -}}
+ {{- $pieceAuthors = append $pieceAuthors $agentref.Ref -}}
{{- end -}}
{{- end -}}
- {{- $sortedAdditionalAuthorIDs := sortStrings $pieceAdditionalAuthorIDs -}}
+ {{- $sortedAuthors := sortStrings $pieceAuthors -}}
- {{- /* Store piece data by ID to combine categories and avoid duplicates */ -}}
- {{- $pieceData = merge $pieceData (dict $p.Item.ID (dict "piece" $p "categories" $categories "additionalAuthorIDs" $sortedAdditionalAuthorIDs)) -}}
- {{- end -}}
+ {{- /* Create group key: categories + authors */ -}}
+ {{- $sortedCategories := sortStrings $categories -}}
+ {{- $groupKey := printf "%s|%s" (joinWithUnd $sortedCategories) (joinWithUnd $sortedAuthors) -}}
- {{- /* Now group by combined categories and additional authors */ -}}
- {{- $groupedByCategory := dict -}}
- {{- range $pieceID, $data := $pieceData -}}
- {{- $sortedCategories := sortStrings $data.categories -}}
- {{- $categoryName := joinWithUnd $sortedCategories -}}
- {{- $groupKey := printf "%s|%s" $categoryName (joinWithUnd $data.additionalAuthorIDs) -}}
-
- {{- $existing := index $groupedByCategory $groupKey -}}
+ {{- /* Add piece to group (check for duplicates by ID) */ -}}
+ {{- $existing := index $pieceGroups $groupKey -}}
{{- if $existing -}}
- {{- $groupedByCategory = merge $groupedByCategory (dict $groupKey (append $existing $data.piece)) -}}
- {{- else -}}
- {{- $groupedByCategory = merge $groupedByCategory (dict $groupKey (slice $data.piece)) -}}
- {{- end -}}
- {{- end -}}
-
- {{- /* Display each category group */ -}}
- {{- range $groupKey, $categoryPieces := $groupedByCategory -}}
-
-
- {{- /* Extract category and additional authors from group key */ -}}
- {{- $keyParts := split $groupKey "|" -}}
- {{- $categoryName := index $keyParts 0 -}}
-
- {{ $categoryName }}
- {{- /* Get additional authors from first piece in group */ -}}
- {{- $firstPiece := index $categoryPieces 0 -}}
- {{- $additionalAuthorIDs := slice -}}
- {{- range $agentref := $firstPiece.Item.AgentRefs -}}
- {{- if and (or (eq $agentref.Category "") (eq $agentref.Category "autor")) (ne $agentref.Ref $a.ID) -}}
- {{- $additionalAuthorIDs = append $additionalAuthorIDs $agentref.Ref -}}
+ {{- /* Check if piece is already in group */ -}}
+ {{- $found := false -}}
+ {{- range $existingPiece := $existing -}}
+ {{- if eq $existingPiece.Item.ID $p.Item.ID -}}
+ {{- $found = true -}}
{{- end -}}
{{- end -}}
- {{- if $additionalAuthorIDs -}}
- {{ " " }}von {{ range $i, $authorID := $additionalAuthorIDs }}{{- if gt $i 0 }} und {{ end }}{{- $agent := GetAgent $authorID -}}{{- if and $agent (gt (len $agent.Names) 0) -}}{{ index $agent.Names 0 }}{{- end -}}{{ end }}
- {{- end -}}{{ ":" }}
-
- {{- /* Show all citations for this category inline with commas */ -}}
- {{ " " }}{{- range $pieceIndex, $p := $categoryPieces -}}
- {{- range $issueIndex, $issue := $p.Item.IssueRefs -}}
- {{- if or (gt $pieceIndex 0) (gt $issueIndex 0) }}, {{ end -}}
-
{{- template "_citation" $issue -}}{{- end -}}
- {{- end -}}
- {{- /* Add "Ganzer Beitrag" link if piece spans multiple issues */ -}}
- {{- $firstPiece := index $categoryPieces 0 -}}
- {{- if gt (len $firstPiece.Item.IssueRefs) 1 -}}
- {{ " " }}
+ {{- if not $found -}}
+ {{- $pieceGroups = merge $pieceGroups (dict $groupKey (append $existing $p)) -}}
+ {{- end -}}
+ {{- else -}}
+ {{- $pieceGroups = merge $pieceGroups (dict $groupKey (slice $p)) -}}
{{- end -}}
+ {{- end -}}
+
+ {{- /* Display each group */ -}}
+ {{- range $groupKey, $groupPieces := $pieceGroups -}}
+
+ {{- /* Extract categories and authors from group key */ -}}
+ {{- $keyParts := split $groupKey "|" -}}
+ {{- $categoryName := index $keyParts 0 -}}
+ {{- $authorPart := index $keyParts 1 -}}
+
+ {{- /* Use plural if multiple pieces grouped together */ -}}
+ {{- $displayCategory := $categoryName -}}
+ {{- if gt (len $groupPieces) 1 -}}
+ {{- if eq $categoryName "Rezension" -}}
+ {{- $displayCategory = "Rezensionen" -}}
+ {{- else if eq $categoryName "Auszug" -}}
+ {{- $displayCategory = "Auszüge" -}}
+ {{- else if eq $categoryName "Theaterkritik" -}}
+ {{- $displayCategory = "Theaterkritiken" -}}
+ {{- else if eq $categoryName "Übersetzung" -}}
+ {{- $displayCategory = "Übersetzungen" -}}
+ {{- else if eq $categoryName "Kommentar" -}}
+ {{- $displayCategory = "Kommentare" -}}
+ {{- else if eq $categoryName "Replik" -}}
+ {{- $displayCategory = "Repliken" -}}
+ {{- else if eq $categoryName "Anzeige" -}}
+ {{- $displayCategory = "Anzeigen" -}}
+ {{- else if eq $categoryName "Beitrag" -}}
+ {{- $displayCategory = "Beiträge" -}}
+ {{- end -}}
+ {{- end -}}
+ {{ $displayCategory }}{{- if ne $authorPart "" }} von {{ range $i, $authorID := (split $authorPart " und ") }}{{- if gt $i 0 }} und {{ end }}{{- $agent := GetAgent $authorID -}}{{- if and $agent (gt (len $agent.Names) 0) -}}
{{ index $agent.Names 0 }}{{- end -}}{{ end }}{{- end }}:
+ {{- /* Show citations separated by commas */ -}}
+ {{ " " }}{{- range $pieceIndex, $p := $groupPieces -}}
+ {{- range $issueIndex, $issue := $p.Item.IssueRefs -}}
+ {{- if or (gt $pieceIndex 0) (gt $issueIndex 0) }}, {{ end -}}
+
{{- template "_citation" $issue -}}
+ {{- end -}}
+ {{- /* Add "Ganzer Beitrag" link if piece spans multiple issues */ -}}
+ {{- if gt (len $p.Item.IssueRefs) 1 -}}
+ {{ " " }}
+ {{- end -}}
+ {{- end -}}
{{- end -}}
@@ -201,125 +154,6 @@
{{ end }}
- {{- /* Process standalone work pieces that aren't linked to specific works */ -}}
- {{- if ne (len $workPieces) 0 -}}
- {{- /* Group standalone work pieces by piece ID first to combine categories, then by additional authors */ -}}
- {{- $standalonePieceData := dict -}}
- {{- range $_, $p := $workPieces -}}
- {{- /* Skip pieces that are already covered by works above */ -}}
- {{- $isPieceInWorks := false -}}
- {{- range $_, $w := $works -}}
- {{- $workPiecesCheck := LookupPieces $w.Item -}}
- {{- range $_, $wp := $workPiecesCheck -}}
- {{- if eq $wp.Item.ID $p.Item.ID -}}
- {{- $isPieceInWorks = true -}}
- {{- end -}}
- {{- end -}}
- {{- end -}}
-
- {{- if not $isPieceInWorks -}}
- {{- /* Get categories for this piece */ -}}
- {{- $categoryFlags := GetCategoryFlags $p.Item -}}
- {{- $categories := slice -}}
- {{- if $categoryFlags.Rezension -}}
- {{- $categories = append $categories "Rezension" -}}
- {{- end -}}
- {{- if $categoryFlags.Auszug -}}
- {{- $categories = append $categories "Auszug" -}}
- {{- end -}}
- {{- if $categoryFlags.Theaterkritik -}}
- {{- $categories = append $categories "Theaterkritik" -}}
- {{- end -}}
- {{- if $categoryFlags.Uebersetzung -}}
- {{- $categories = append $categories "Übersetzung" -}}
- {{- end -}}
- {{- if $categoryFlags.Kommentar -}}
- {{- $categories = append $categories "Kommentar" -}}
- {{- end -}}
- {{- if $categoryFlags.Replik -}}
- {{- $categories = append $categories "Replik" -}}
- {{- end -}}
- {{- if $categoryFlags.Anzeige -}}
- {{- $categories = append $categories "Anzeige" -}}
- {{- end -}}
- {{- if $categoryFlags.Provinienz -}}
- {{- $categories = append $categories "Provinienz" -}}
- {{- end -}}
-
- {{- if ne (len $categories) 0 -}}
- {{- /* Get additional authors for this specific piece */ -}}
- {{- $pieceAdditionalAuthorIDs := slice -}}
- {{- range $agentref := $p.Item.AgentRefs -}}
- {{- if and (or (eq $agentref.Category "") (eq $agentref.Category "autor")) (ne $agentref.Ref $a.ID) -}}
- {{- $pieceAdditionalAuthorIDs = append $pieceAdditionalAuthorIDs $agentref.Ref -}}
- {{- end -}}
- {{- end -}}
- {{- $sortedAdditionalAuthorIDs := sortStrings $pieceAdditionalAuthorIDs -}}
-
- {{- /* Store piece data by ID to combine categories and avoid duplicates */ -}}
- {{- $standalonePieceData = merge $standalonePieceData (dict $p.Item.ID (dict "piece" $p "categories" $categories "additionalAuthorIDs" $sortedAdditionalAuthorIDs)) -}}
- {{- end -}}
- {{- end -}}
- {{- end -}}
-
- {{- /* Now group by combined categories and additional authors */ -}}
- {{- $standaloneGrouped := dict -}}
- {{- range $pieceID, $data := $standalonePieceData -}}
- {{- $sortedCategories := sortStrings $data.categories -}}
- {{- $categoryName := joinWithUnd $sortedCategories -}}
- {{- $groupKey := printf "%s|%s" $categoryName (joinWithUnd $data.additionalAuthorIDs) -}}
-
- {{- $existing := index $standaloneGrouped $groupKey -}}
- {{- if $existing -}}
- {{- $standaloneGrouped = merge $standaloneGrouped (dict $groupKey (append $existing $data.piece)) -}}
- {{- else -}}
- {{- $standaloneGrouped = merge $standaloneGrouped (dict $groupKey (slice $data.piece)) -}}
- {{- end -}}
- {{- end -}}
-
- {{- /* Display standalone work pieces */ -}}
- {{- range $groupKey, $categoryPieces := $standaloneGrouped -}}
-
-
-
- {{- /* Extract category and additional authors from group key */ -}}
- {{- $keyParts := split $groupKey "|" -}}
- {{- $categoryName := index $keyParts 0 -}}
-
- {{ $categoryName }}
- {{- /* Get additional authors from first piece in group */ -}}
- {{- $firstPiece := index $categoryPieces 0 -}}
- {{- $additionalAuthorIDs := slice -}}
- {{- range $agentref := $firstPiece.Item.AgentRefs -}}
- {{- if and (or (eq $agentref.Category "") (eq $agentref.Category "autor")) (ne $agentref.Ref $a.ID) -}}
- {{- $additionalAuthorIDs = append $additionalAuthorIDs $agentref.Ref -}}
- {{- end -}}
- {{- end -}}
- {{- if $additionalAuthorIDs -}}
- {{ " " }}von {{ range $i, $authorID := $additionalAuthorIDs }}{{- if gt $i 0 }} und {{ end }}{{- $agent := GetAgent $authorID -}}{{- if and $agent (gt (len $agent.Names) 0) -}}{{ index $agent.Names 0 }}{{- end -}}{{ end }}
- {{- end -}}{{ ":" }}
-
- {{- /* Show all citations for this category inline with commas */ -}}
- {{ " " }}{{- range $pieceIndex, $p := $categoryPieces -}}
- {{- range $issueIndex, $issue := $p.Item.IssueRefs -}}
- {{- if or (gt $pieceIndex 0) (gt $issueIndex 0) }}, {{ end -}}
-
{{- template "_citation" $issue -}}{{- end -}}
- {{- end -}}
- {{- /* Add "Ganzer Beitrag" link if piece spans multiple issues */ -}}
- {{- $firstPiece := index $categoryPieces 0 -}}
- {{- if gt (len $firstPiece.Item.IssueRefs) 1 -}}
- {{ " " }}
- {{- end -}}
-
-
- {{- end -}}
- {{- end -}}
-
-{{ end }}
+{{ end }}
\ No newline at end of file
diff --git a/views/routes/components/_scrollspy_layout.gohtml b/views/routes/components/_scrollspy_layout.gohtml
index 33c3e8a..cc65085 100644
--- a/views/routes/components/_scrollspy_layout.gohtml
+++ b/views/routes/components/_scrollspy_layout.gohtml
@@ -23,7 +23,9 @@
{{ if eq .Search "autoren" }}checked{{ end }}
autocomplete="off"
hx-get="{{ if eq .Search "autoren" }}/akteure/a{{ else }}/akteure/autoren{{ end }}"
- hx-target="body"
+ hx-select="main"
+ hx-target="main"
+ hx-swap="innerHTML show:window:top focus-scroll:false"
hx-push-url="true">
Nur Autor:innen anzeigen
diff --git a/views/transform/akteure.js b/views/transform/akteure.js
index a85a544..3ee858b 100644
--- a/views/transform/akteure.js
+++ b/views/transform/akteure.js
@@ -31,7 +31,7 @@ export class AkteureScrollspy extends HTMLElement {
if (this.sections.length > 0 && this.navLinks.length > 0) {
this.initializeScrollspy();
}
- }, 200);
+ }, 500);
return;
}
@@ -402,4 +402,3 @@ export class AkteureScrollspy extends HTMLElement {
// Register the web component
customElements.define("akteure-scrollspy", AkteureScrollspy);
-
diff --git a/xmlmodels/pieces.go b/xmlmodels/pieces.go
index 256b9e3..642bc6e 100644
--- a/xmlmodels/pieces.go
+++ b/xmlmodels/pieces.go
@@ -1,12 +1,8 @@
package xmlmodels
import (
- "crypto/sha256"
- "encoding/hex"
"encoding/json"
"encoding/xml"
- "fmt"
- "sort"
"strconv"
"strings"
@@ -37,68 +33,6 @@ func (p Piece) String() string {
return string(data)
}
-// generateContentBasedID creates a deterministic ID based on piece content
-func (p Piece) generateContentBasedID() string {
- var parts []string
-
- // Add title if available
- if len(p.Title) > 0 && p.Title[0] != "" {
- parts = append(parts, "title:"+strings.ToLower(strings.TrimSpace(p.Title[0])))
- }
-
- // Add incipit if available
- if len(p.Incipit) > 0 && p.Incipit[0] != "" {
- incipit := strings.ToLower(strings.TrimSpace(p.Incipit[0]))
- // Limit incipit to first 50 characters to avoid overly long IDs
- if len(incipit) > 50 {
- incipit = incipit[:50]
- }
- parts = append(parts, "incipit:"+incipit)
- }
-
- // Add author references
- var authors []string
- for _, agent := range p.AgentRefs {
- if agent.Category == "" || agent.Category == "autor" {
- authors = append(authors, agent.Ref)
- }
- }
- sort.Strings(authors) // Ensure consistent ordering
- if len(authors) > 0 {
- parts = append(parts, "authors:"+strings.Join(authors, ","))
- }
-
- // Add categories
- var categories []string
- for _, cat := range p.CategoryRefs {
- if cat.Category != "" {
- categories = append(categories, cat.Category)
- }
- }
- sort.Strings(categories) // Ensure consistent ordering
- if len(categories) > 0 {
- parts = append(parts, "categories:"+strings.Join(categories, ","))
- }
-
- // If we have no meaningful content, create a minimal hash from issue refs
- if len(parts) == 0 {
- // Use issue references as fallback content
- for _, issue := range p.IssueRefs {
- parts = append(parts, fmt.Sprintf("issue:%d-%d-%d-%d", issue.When.Year, issue.Nr, issue.Von, issue.Bis))
- }
- // If still no content, use a generic identifier
- if len(parts) == 0 {
- parts = append(parts, "unknown-piece")
- }
- }
-
- // Create hash of combined content
- content := strings.Join(parts, "|")
- hash := sha256.Sum256([]byte(content))
-
- // Return first 12 characters of hex hash for reasonable ID length
- return hex.EncodeToString(hash[:])[:12]
-}
func (p Piece) Categories() map[string]bool {
cats := make(map[string]bool)
@@ -136,24 +70,8 @@ func (p Piece) Categories() map[string]bool {
}
func (p Piece) Keys() []string {
- // Always regenerate keys to ensure we use the new content-based logic
- ret := make([]string, 0, 3)
-
- // Primary ID: Use existing ID if available, otherwise content-based ID
- var primaryID string
- if p.ID != "" {
- primaryID = p.ID
- } else {
- primaryID = p.generateContentBasedID()
- }
- ret = append(ret, primaryID)
-
- // Create issue-specific keys using the primary ID for lookup
- for _, i := range p.IssueRefs {
- ret = append(ret, strconv.Itoa(i.When.Year)+"-"+strconv.Itoa(i.Nr)+"-"+primaryID)
- }
-
- return ret
+ // All pieces now have XML IDs, so we just return the ID
+ return []string{p.ID}
}
func (p Piece) ReferencesIssue(y, no int) (*IssueRef, bool) {