mirror of
https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
synced 2025-10-29 09:05:30 +00:00
Guge problem: no IDs for the Beiträge
This commit is contained in:
@@ -69,10 +69,15 @@ func PageIcon(iconType string) template.HTML {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPieceURL generates a piece view URL from year, issue number, and page
|
// GetPieceURL generates a piece view URL from year, issue number, page, and optional piece ID
|
||||||
func GetPieceURL(year, issueNum, page int) string {
|
func GetPieceURL(year, issueNum, page int, pieceID ...string) string {
|
||||||
pieceID := fmt.Sprintf("%d-%03d-%03d", year, issueNum, page)
|
if len(pieceID) > 0 && pieceID[0] != "" && pieceID[0] != "0" {
|
||||||
return "/beitrag/" + pieceID
|
// Use just the piece ID (no year/issue prefix in URL)
|
||||||
|
return "/beitrag/" + pieceID[0]
|
||||||
|
}
|
||||||
|
// Fallback to old format for backward compatibility
|
||||||
|
id := fmt.Sprintf("%d-%03d-%03d", year, issueNum, page)
|
||||||
|
return "/beitrag/" + id
|
||||||
}
|
}
|
||||||
|
|
||||||
// IssueContext formats an issue reference into a readable context string
|
// IssueContext formats an issue reference into a readable context string
|
||||||
@@ -296,6 +301,13 @@ func (e *Engine) funcs() error {
|
|||||||
return result
|
return result
|
||||||
})
|
})
|
||||||
|
|
||||||
|
e.AddFunc("split", func(s, delimiter string) []string {
|
||||||
|
if s == "" {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
return strings.Split(s, delimiter)
|
||||||
|
})
|
||||||
|
|
||||||
e.AddFunc("sortStrings", func(items interface{}) []string {
|
e.AddFunc("sortStrings", func(items interface{}) []string {
|
||||||
v := reflect.ValueOf(items)
|
v := reflect.ValueOf(items)
|
||||||
if v.Kind() != reflect.Slice {
|
if v.Kind() != reflect.Slice {
|
||||||
|
|||||||
@@ -96,7 +96,7 @@
|
|||||||
duration-200">
|
duration-200">
|
||||||
<i class="ri-file-copy-2-line text-xs"></i>
|
<i class="ri-file-copy-2-line text-xs"></i>
|
||||||
<a
|
<a
|
||||||
href="{{ GetPieceURL $individualPiece.PieceByIssue.Reference.When.Year $individualPiece.PieceByIssue.Reference.Nr $individualPiece.PieceByIssue.Reference.Von }}"
|
href="{{ GetPieceURL $individualPiece.PieceByIssue.Reference.When.Year $individualPiece.PieceByIssue.Reference.Nr $individualPiece.PieceByIssue.Reference.Von (index $individualPiece.PieceByIssue.Keys 0) }}"
|
||||||
class="">
|
class="">
|
||||||
Ganzer Beitrag
|
Ganzer Beitrag
|
||||||
</a>
|
</a>
|
||||||
@@ -231,7 +231,7 @@
|
|||||||
duration-200">
|
duration-200">
|
||||||
<i class="ri-file-copy-2-line text-xs"></i>
|
<i class="ri-file-copy-2-line text-xs"></i>
|
||||||
<a
|
<a
|
||||||
href="{{ GetPieceURL $individualPiece.PieceByIssue.Reference.When.Year $individualPiece.PieceByIssue.Reference.Nr $individualPiece.PieceByIssue.Reference.Von }}"
|
href="{{ GetPieceURL $individualPiece.PieceByIssue.Reference.When.Year $individualPiece.PieceByIssue.Reference.Nr $individualPiece.PieceByIssue.Reference.Von (index $individualPiece.PieceByIssue.Keys 0) }}"
|
||||||
class="">
|
class="">
|
||||||
Ganzer Beitrag
|
Ganzer Beitrag
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -66,6 +66,16 @@
|
|||||||
</a>
|
</a>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
{{- /* Add "Ganzer Beitrag" link if piece spans multiple issues */ -}}
|
||||||
|
{{- $firstGroupItem := index $groupedItems 0 -}}
|
||||||
|
{{- if gt (len $firstGroupItem.Item.IssueRefs) 1 -}}
|
||||||
|
{{ " " }}<div class="inline-flex items-center gap-1 px-2 py-1 bg-blue-50 hover:bg-blue-100 text-blue-700 hover:text-blue-800 border border-blue-200 hover:border-blue-300 rounded text-xs font-medium transition-colors duration-200">
|
||||||
|
<i class="ri-file-copy-2-line text-xs"></i>
|
||||||
|
<a href="{{ GetPieceURL (index $firstGroupItem.Item.IssueRefs 0).When.Year (index $firstGroupItem.Item.IssueRefs 0).Nr (index $firstGroupItem.Item.IssueRefs 0).Von (index $firstGroupItem.Item.Keys 0) }}" class="">
|
||||||
|
Ganzer Beitrag
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|||||||
@@ -1,6 +1,17 @@
|
|||||||
{{ $a := . }}
|
{{ $a := . }}
|
||||||
{{ $works := LookupWorks $a }}
|
{{ $works := LookupWorks $a }}
|
||||||
{{- if ne (len $works) 0 -}}
|
{{ $allPieces := LookupPieces $a }}
|
||||||
|
|
||||||
|
{{- /* Filter pieces for work-related categories */ -}}
|
||||||
|
{{- $workPieces := slice -}}
|
||||||
|
{{- range $_, $p := $allPieces -}}
|
||||||
|
{{- $categoryFlags := GetCategoryFlags $p.Item -}}
|
||||||
|
{{- if or $categoryFlags.Rezension $categoryFlags.Auszug $categoryFlags.Theaterkritik $categoryFlags.Uebersetzung $categoryFlags.Kommentar $categoryFlags.Replik $categoryFlags.Anzeige $categoryFlags.Provinienz -}}
|
||||||
|
{{- $workPieces = append $workPieces $p -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if or (ne (len $works) 0) (ne (len $workPieces) 0) -}}
|
||||||
<div class="mt-4 akteur-werke-section">
|
<div class="mt-4 akteur-werke-section">
|
||||||
<div class="py-1 rounded-lg mb-1">
|
<div class="py-1 rounded-lg mb-1">
|
||||||
<h2 class="text-lg font-bold">
|
<h2 class="text-lg font-bold">
|
||||||
@@ -117,39 +128,48 @@
|
|||||||
{{- if eq (len $categories) 0 -}}
|
{{- if eq (len $categories) 0 -}}
|
||||||
{{- $categories = append $categories "Beitrag" -}}
|
{{- $categories = append $categories "Beitrag" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- $categoryName := "" -}}
|
|
||||||
{{- if eq (len $categories) 0 -}}
|
|
||||||
{{- $categoryName = "Beitrag" -}}
|
|
||||||
{{- else -}}
|
|
||||||
{{- $sortedCategories := sortStrings $categories -}}
|
|
||||||
{{- $categoryName = joinWithUnd $sortedCategories -}}
|
|
||||||
{{- end -}}
|
|
||||||
|
|
||||||
{{- $existing := index $groupedByCategory $categoryName -}}
|
{{- /* 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 -}}
|
||||||
|
|
||||||
|
{{- /* Create grouping key with category + additional authors */ -}}
|
||||||
|
{{- $sortedCategories := sortStrings $categories -}}
|
||||||
|
{{- $categoryName := joinWithUnd $sortedCategories -}}
|
||||||
|
{{- $groupKey := printf "%s|%s" $categoryName (joinWithUnd $sortedAdditionalAuthorIDs) -}}
|
||||||
|
|
||||||
|
{{- $existing := index $groupedByCategory $groupKey -}}
|
||||||
{{- if $existing -}}
|
{{- if $existing -}}
|
||||||
{{- $groupedByCategory = merge $groupedByCategory (dict $categoryName (append $existing $p)) -}}
|
{{- $groupedByCategory = merge $groupedByCategory (dict $groupKey (append $existing $p)) -}}
|
||||||
{{- else -}}
|
{{- else -}}
|
||||||
{{- $groupedByCategory = merge $groupedByCategory (dict $categoryName (slice $p)) -}}
|
{{- $groupedByCategory = merge $groupedByCategory (dict $groupKey (slice $p)) -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- /* Display each category group */ -}}
|
{{- /* Display each category group */ -}}
|
||||||
{{- range $categoryName, $categoryPieces := $groupedByCategory -}}
|
{{- range $groupKey, $categoryPieces := $groupedByCategory -}}
|
||||||
<div>
|
<div>
|
||||||
<span class="inline-block">
|
<span class="inline-block">
|
||||||
|
{{- /* Extract category and additional authors from group key */ -}}
|
||||||
|
{{- $keyParts := split $groupKey "|" -}}
|
||||||
|
{{- $categoryName := index $keyParts 0 -}}
|
||||||
|
|
||||||
{{ $categoryName }}
|
{{ $categoryName }}
|
||||||
{{- /* Check for additional authors (non-current actor) */ -}}
|
{{- /* Get additional authors from first piece in group */ -}}
|
||||||
|
{{- $firstPiece := index $categoryPieces 0 -}}
|
||||||
{{- $additionalAuthorIDs := slice -}}
|
{{- $additionalAuthorIDs := slice -}}
|
||||||
{{- range $_, $p := $categoryPieces -}}
|
{{- range $agentref := $firstPiece.Item.AgentRefs -}}
|
||||||
{{- range $agentref := $p.Item.AgentRefs -}}
|
|
||||||
{{- if and (or (eq $agentref.Category "") (eq $agentref.Category "autor")) (ne $agentref.Ref $a.ID) -}}
|
{{- if and (or (eq $agentref.Category "") (eq $agentref.Category "autor")) (ne $agentref.Ref $a.ID) -}}
|
||||||
{{- $additionalAuthorIDs = append $additionalAuthorIDs $agentref.Ref -}}
|
{{- $additionalAuthorIDs = append $additionalAuthorIDs $agentref.Ref -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- if $additionalAuthorIDs -}}
|
||||||
{{- $uniqueAuthorIDs := unique $additionalAuthorIDs -}}
|
{{ " " }}von {{ range $i, $authorID := $additionalAuthorIDs }}{{- if gt $i 0 }} und {{ end }}{{- $agent := GetAgent $authorID -}}{{- if and $agent (gt (len $agent.Names) 0) -}}<a href="/akteure/{{ $authorID }}" class="">{{ index $agent.Names 0 }}</a>{{- end -}}{{ end }}
|
||||||
{{- if $uniqueAuthorIDs -}}
|
|
||||||
{{ " " }}von {{ range $i, $authorID := $uniqueAuthorIDs }}{{- if gt $i 0 }} und {{ end }}{{- $agent := GetAgent $authorID -}}{{- if and $agent (gt (len $agent.Names) 0) -}}<a href="/akteure/{{ $authorID }}" class="">{{ index $agent.Names 0 }}</a>{{- end -}}{{ end }}
|
|
||||||
{{- end -}}{{ ":" }}
|
{{- end -}}{{ ":" }}
|
||||||
</span>
|
</span>
|
||||||
{{- /* Show all citations for this category inline with commas */ -}}
|
{{- /* Show all citations for this category inline with commas */ -}}
|
||||||
@@ -174,12 +194,152 @@
|
|||||||
</a>
|
</a>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
{{- /* Add "Ganzer Beitrag" link if piece spans multiple issues */ -}}
|
||||||
|
{{- $firstPiece := index $categoryPieces 0 -}}
|
||||||
|
{{- if gt (len $firstPiece.Item.IssueRefs) 1 -}}
|
||||||
|
{{ " " }}<div class="inline-flex items-center gap-1 px-2 py-1 bg-blue-50 hover:bg-blue-100 text-blue-700 hover:text-blue-800 border border-blue-200 hover:border-blue-300 rounded text-xs font-medium transition-colors duration-200">
|
||||||
|
<i class="ri-file-copy-2-line text-xs"></i>
|
||||||
|
<a href="{{ GetPieceURL (index $firstPiece.Item.IssueRefs 0).When.Year (index $firstPiece.Item.IssueRefs 0).Nr (index $firstPiece.Item.IssueRefs 0).Von (index $firstPiece.Item.Keys 0) }}" class="">
|
||||||
|
Ganzer Beitrag
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
</div>
|
</div>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
|
{{- /* Process standalone work pieces that aren't linked to specific works */ -}}
|
||||||
|
{{- if ne (len $workPieces) 0 -}}
|
||||||
|
{{- /* Group standalone work pieces by category and additional authors */ -}}
|
||||||
|
{{- $standaloneGrouped := 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 -}}
|
||||||
|
|
||||||
|
{{- /* Create grouping key with category + additional authors */ -}}
|
||||||
|
{{- $sortedCategories := sortStrings $categories -}}
|
||||||
|
{{- $categoryName := joinWithUnd $sortedCategories -}}
|
||||||
|
{{- $groupKey := printf "%s|%s" $categoryName (joinWithUnd $sortedAdditionalAuthorIDs) -}}
|
||||||
|
|
||||||
|
{{- $existing := index $standaloneGrouped $groupKey -}}
|
||||||
|
{{- if $existing -}}
|
||||||
|
{{- $standaloneGrouped = merge $standaloneGrouped (dict $groupKey (append $existing $p)) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $standaloneGrouped = merge $standaloneGrouped (dict $groupKey (slice $p)) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- /* Display standalone work pieces */ -}}
|
||||||
|
{{- range $groupKey, $categoryPieces := $standaloneGrouped -}}
|
||||||
|
<div class="mb-1.5 break-inside-avoid max-w-[95ch]">
|
||||||
|
<div class="text-lg">
|
||||||
|
<span class="inline-block">
|
||||||
|
{{- /* 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) -}}<a href="/akteure/{{ $authorID }}" class="">{{ index $agent.Names 0 }}</a>{{- end -}}{{ end }}
|
||||||
|
{{- end -}}{{ ":" }}
|
||||||
|
</span>
|
||||||
|
{{- /* 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 -}}
|
||||||
|
{{ $issueData := GetIssue (printf "%d-%d" $issue.When.Year $issue.Nr) }}
|
||||||
|
{{- $url := printf "/%s/%d" $issue.When $issue.Nr -}}
|
||||||
|
{{- if $issue.Von -}}
|
||||||
|
{{- if $issue.Beilage -}}
|
||||||
|
{{- $url = printf "%s#beilage-%d-page-%d" $url $issue.Beilage $issue.Von -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $url = printf "%s/%d" $url $issue.Von -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
<a href="{{ $url }}" class="text-blue-700 hover:text-blue-800">
|
||||||
|
{{- if $issueData -}}
|
||||||
|
{{ $issueData.Datum.When.Day }}.{{ $issueData.Datum.When.Month }}.{{ $issueData.Datum.When.Year }}/{{ $issue.Nr }}, S. {{ $issue.Von }}{{- if and $issue.Bis (ne $issue.Von $issue.Bis) }}-{{ $issue.Bis }}{{ end }}
|
||||||
|
{{- else -}}
|
||||||
|
{{ $issue.When.Day }}.{{ $issue.When.Month }}.{{ $issue.When.Year }}/{{ $issue.Nr }}, S. {{ $issue.Von }}{{- if and $issue.Bis (ne $issue.Von $issue.Bis) }}-{{ $issue.Bis }}{{ end }}
|
||||||
|
{{- end -}}
|
||||||
|
</a>
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- /* Add "Ganzer Beitrag" link if piece spans multiple issues */ -}}
|
||||||
|
{{- $firstPiece := index $categoryPieces 0 -}}
|
||||||
|
{{- if gt (len $firstPiece.Item.IssueRefs) 1 -}}
|
||||||
|
{{ " " }}<div class="inline-flex items-center gap-1 px-2 py-1 bg-blue-50 hover:bg-blue-100 text-blue-700 hover:text-blue-800 border border-blue-200 hover:border-blue-300 rounded text-xs font-medium transition-colors duration-200">
|
||||||
|
<i class="ri-file-copy-2-line text-xs"></i>
|
||||||
|
<a href="{{ GetPieceURL (index $firstPiece.Item.IssueRefs 0).When.Year (index $firstPiece.Item.IssueRefs 0).Nr (index $firstPiece.Item.IssueRefs 0).Von (index $firstPiece.Item.Keys 0) }}" class="">
|
||||||
|
Ganzer Beitrag
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|||||||
@@ -140,15 +140,30 @@
|
|||||||
|
|
||||||
{{- /* Generate piece descriptions */ -}}
|
{{- /* Generate piece descriptions */ -}}
|
||||||
{{- if has $categories "Rezension" -}}
|
{{- if has $categories "Rezension" -}}
|
||||||
{{- $authorFound := false -}}
|
{{- /* Collect all additional authors (not current actor) */ -}}
|
||||||
|
{{- $additionalAuthors := slice -}}
|
||||||
|
{{- $currentAuthorFound := false -}}
|
||||||
{{- 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 -}}
|
||||||
{{- if and $agent (gt (len $agent.Names) 0) -}}
|
{{- if and $agent (gt (len $agent.Names) 0) -}}
|
||||||
{{- if ne $agentref.Ref $currentActorID -}}
|
{{- if ne $agentref.Ref $currentActorID -}}
|
||||||
<a href="/akteure/{{ $agentref.Ref }}" class="text-slate-700 hover:text-slate-900 underline decoration-slate-400 hover:decoration-slate-600">{{ index $agent.Names 0 }}</a>,
|
{{- $additionalAuthors = append $additionalAuthors $agent -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $currentAuthorFound = true -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- /* Display review with proper author attribution */ -}}
|
||||||
|
{{- if $additionalAuthors -}}
|
||||||
|
mit {{ range $i, $author := $additionalAuthors }}{{- if gt $i 0 }} und {{ end }}<a href="/akteure/{{ $author.ID }}" class="text-slate-700 hover:text-slate-900 underline decoration-slate-400 hover:decoration-slate-600">{{ index $author.Names 0 }}</a>{{ end }}, {{ $categoryName }} von:
|
||||||
|
{{- else if $currentAuthorFound -}}
|
||||||
{{ $categoryName }} von:
|
{{ $categoryName }} von:
|
||||||
|
{{- else -}}
|
||||||
|
{{ $categoryName }} von:
|
||||||
|
{{- end -}}
|
||||||
{{ if $workAuthorName }}
|
{{ if $workAuthorName }}
|
||||||
<a href="/akteure/{{ $workAuthorID }}" class="text-slate-700 hover:text-slate-900 underline decoration-slate-400 hover:decoration-slate-600">{{ $workAuthorName }}</a>,
|
<a href="/akteure/{{ $workAuthorID }}" class="text-slate-700 hover:text-slate-900 underline decoration-slate-400 hover:decoration-slate-600">{{ $workAuthorName }}</a>,
|
||||||
{{ end }}
|
{{ end }}
|
||||||
@@ -159,42 +174,31 @@
|
|||||||
{{ else }}
|
{{ else }}
|
||||||
[Werk unbekannt]
|
[Werk unbekannt]
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{- $authorFound = true -}}
|
|
||||||
{{- break -}}
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
|
||||||
{{- if not $authorFound -}}
|
|
||||||
{{ $categoryName }} von:
|
|
||||||
{{ if $workAuthorName }}
|
|
||||||
<a href="/akteure/{{ $workAuthorID }}" class="text-slate-700 hover:text-slate-900 underline decoration-slate-400 hover:decoration-slate-600">{{ $workAuthorName }}</a>,
|
|
||||||
{{ end }}
|
|
||||||
{{ if $workTitle }}
|
|
||||||
<em>{{ $workTitle }}</em>
|
|
||||||
{{ else if $title }}
|
|
||||||
<em>{{ $title }}</em>
|
|
||||||
{{ else }}
|
|
||||||
[Werk unbekannt]
|
|
||||||
{{ end }}
|
|
||||||
{{- end -}}
|
|
||||||
|
|
||||||
{{- else -}}
|
{{- else -}}
|
||||||
{{- $authorFound := false -}}
|
{{- /* Collect all additional authors (not current actor) */ -}}
|
||||||
|
{{- $additionalAuthors := slice -}}
|
||||||
|
{{- $currentAuthorFound := false -}}
|
||||||
{{- 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 -}}
|
||||||
{{- if and $agent (gt (len $agent.Names) 0) -}}
|
{{- if and $agent (gt (len $agent.Names) 0) -}}
|
||||||
{{- if ne $agentref.Ref $currentActorID -}}
|
{{- if ne $agentref.Ref $currentActorID -}}
|
||||||
<a href="/akteure/{{ $agentref.Ref }}" class="text-slate-700 hover:text-slate-900 underline decoration-slate-400 hover:decoration-slate-600">{{ index $agent.Names 0 }}</a>,
|
{{- $additionalAuthors = append $additionalAuthors $agent -}}
|
||||||
{{- end -}}
|
{{- else -}}
|
||||||
{{ $categoryName }}{{ if $title }}: <em>„{{ $title }}"</em>{{ end }}
|
{{- $currentAuthorFound = true -}}
|
||||||
{{- $authorFound = true -}}
|
|
||||||
{{- break -}}
|
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- if not $authorFound -}}
|
{{- end -}}
|
||||||
{{ $categoryName }}{{ if $title }}: <em>„{{ $title }}"</em>{{ else if eq $categoryName "Beitrag" }} ohne Titel{{ end }}
|
|
||||||
{{- end -}}
|
{{- /* Display with proper author attribution */ -}}
|
||||||
|
{{- if $additionalAuthors -}}
|
||||||
|
mit {{ range $i, $author := $additionalAuthors }}{{- if gt $i 0 }} und {{ end }}<a href="/akteure/{{ $author.ID }}" class="text-slate-700 hover:text-slate-900 underline decoration-slate-400 hover:decoration-slate-600">{{ index $author.Names 0 }}</a>{{ end }}, {{ $categoryName }}{{ if $title }}: <em>{{ $title }}</em>{{ end }}
|
||||||
|
{{- else if $currentAuthorFound -}}
|
||||||
|
{{ $categoryName }}{{ if $title }}: <em>{{ $title }}</em>{{ end }}
|
||||||
|
{{- else -}}
|
||||||
|
{{ $categoryName }}{{ if $title }}: <em>{{ $title }}</em>{{ else if eq $categoryName "Beitrag" }} ohne Titel{{ end }}
|
||||||
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
|||||||
@@ -19,13 +19,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ else }}
|
{{ else }}
|
||||||
<!-- No images fallback -->
|
<!-- No images fallback with debug info -->
|
||||||
<div class="container mx-auto px-4 py-8">
|
<div class="container mx-auto px-4 py-8">
|
||||||
<div class="bg-yellow-50 border border-yellow-200 rounded-lg p-6">
|
<div class="bg-yellow-50 border border-yellow-200 rounded-lg p-6">
|
||||||
<h2 class="text-xl font-semibold text-yellow-800 mb-2">Keine Bilder verfügbar</h2>
|
<h2 class="text-xl font-semibold text-yellow-800 mb-2">Keine Bilder verfügbar</h2>
|
||||||
<p class="text-yellow-700">
|
<p class="text-yellow-700 mb-4">
|
||||||
Für diesen Beitrag sind derzeit keine Seitenbilder verfügbar.
|
Für diesen Beitrag sind derzeit keine Seitenbilder verfügbar.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
@@ -1,13 +1,16 @@
|
|||||||
package xmlmodels
|
package xmlmodels
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
"fmt"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
|
"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
|
||||||
"github.com/google/uuid"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -34,6 +37,69 @@ func (p Piece) String() string {
|
|||||||
return string(data)
|
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 {
|
func (p Piece) Categories() map[string]bool {
|
||||||
cats := make(map[string]bool)
|
cats := make(map[string]bool)
|
||||||
for _, c := range p.CategoryRefs {
|
for _, c := range p.CategoryRefs {
|
||||||
@@ -70,24 +136,23 @@ func (p Piece) Categories() map[string]bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p Piece) Keys() []string {
|
func (p Piece) Keys() []string {
|
||||||
if len(p.keys) > 0 {
|
// Always regenerate keys to ensure we use the new content-based logic
|
||||||
return p.keys
|
|
||||||
}
|
|
||||||
|
|
||||||
ret := make([]string, 0, 3)
|
ret := make([]string, 0, 3)
|
||||||
|
|
||||||
|
// Primary ID: Use existing ID if available, otherwise content-based ID
|
||||||
|
var primaryID string
|
||||||
if p.ID != "" {
|
if p.ID != "" {
|
||||||
ret = append(ret, p.ID)
|
primaryID = p.ID
|
||||||
|
} else {
|
||||||
|
primaryID = p.generateContentBasedID()
|
||||||
}
|
}
|
||||||
|
ret = append(ret, primaryID)
|
||||||
|
|
||||||
// TODO: sensible IDs
|
// Create issue-specific keys using the primary ID for lookup
|
||||||
uid := uuid.New()
|
|
||||||
ret = append(ret, uid.String())
|
|
||||||
|
|
||||||
for _, i := range p.IssueRefs {
|
for _, i := range p.IssueRefs {
|
||||||
ret = append(ret, strconv.Itoa(i.When.Year)+"-"+strconv.Itoa(i.Nr)+"-"+uid.String())
|
ret = append(ret, strconv.Itoa(i.When.Year)+"-"+strconv.Itoa(i.Nr)+"-"+primaryID)
|
||||||
}
|
}
|
||||||
|
|
||||||
p.keys = ret
|
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user