From 5884ab9d2cfc67d5396fd7800ae6da99960fa3fc Mon Sep 17 00:00:00 2001 From: tux Date: Sun, 12 May 2024 11:01:06 +0200 Subject: [PATCH] rework authorsystem * add translation, interlude, bridge and meloverse * fix rendering bugs --- default_songinfo_style.ly | 5 ++ footer_with_songinfo.ly | 119 ++++++++++++++++++++++++++++++-------- 2 files changed, 99 insertions(+), 25 deletions(-) diff --git a/default_songinfo_style.ly b/default_songinfo_style.ly index 4e5fa8a..fbe8ef8 100644 --- a/default_songinfo_style.ly +++ b/default_songinfo_style.ly @@ -3,6 +3,11 @@ composerPrefix = "Weise:" compositionPrefix = "Satz:" poetAndComposerEqualPrefix = "Worte und Weise:" + voicePrefix = "Stimme:" + versePrefix = "Strophe:" + translationPrefix = "Übersetzung:" + interludePrefix = "Zwischenspiel:" + bridgePrefix = "Bridge:" authorFormat = #(lambda (noDetails name trail_name birth_year death_year organization) diff --git a/footer_with_songinfo.ly b/footer_with_songinfo.ly index a99bf95..5cae020 100644 --- a/footer_with_songinfo.ly +++ b/footer_with_songinfo.ly @@ -1,3 +1,4 @@ +#(use-modules (ice-9 receive)) #(define-markup-command (print-songinfo layout props) () (define (songinfo-from songId key) (let ((song (if (defined? 'SONG_DATA) (assoc-ref SONG_DATA songId) #f))) @@ -39,40 +40,108 @@ )) authors) ) - (define (render-contribution-numbers contributionNumbers) - (string-join (map (lambda (contributionNumber) (ly:format "~a." contributionNumber)) contributionNumbers) ", ") - ) - (define (render-verse-contribution contributionNumbers) - (string-append (render-contribution-numbers contributionNumbers) " Strophe: ") + (define (numbered-contribution-prefix contributionNumbers prefixLookup) + (string-append + (string-join (map (lambda (contributionNumber) (ly:format "~a." contributionNumber)) contributionNumbers) ", ") + " " + (ly:output-def-lookup layout prefixLookup) + ) ) - (define (render-voice-contribution contributionNumbers) - (string-append (render-contribution-numbers contributionNumbers) " Stimme: ") + (define referencedAuthors '()) + + (define (format-authors authorIds) + (map (lambda (authorId) + (format-author + authorId + (if (member authorId referencedAuthors) + #t + (begin + (set! referencedAuthors (cons authorId referencedAuthors)) + #f))) + ) authorIds) + ) + + (define (render-contribution-group contributionPrefix authorIds) + (if (null? authorIds) + "" + (string-append contributionPrefix " " (string-join (format-authors authorIds) ", "))) + ) + + (define (render-partial-contribution-group prefixLookup authorData) + (if (null? authorData) + "" + (let ((firstAuthorContributions (cdar authorData))) + (receive (authorDataSame authorDataOther) + (partition (lambda (authorEntry) (equal? (cdr authorEntry) firstAuthorContributions)) authorData) + (string-append + (render-contribution-group (numbered-contribution-prefix firstAuthorContributions prefixLookup) (map car authorDataSame)) + " " + (render-partial-contribution-group prefixLookup authorDataOther) + )))) + ) + + (define (join-present items joiner) + (string-join (filter (lambda (item) (and (string? item) (not (string-null? (string-trim-both item))))) items) joiner) ) (define (poet-and-composer-from-authors authors) (if authors - (let* ( + (let ( (poetIds (find-author-ids-by 'text authors)) + (translatorIds (find-author-ids-by 'translation authors)) (versePoetData (find-author-id-with-part-numbers 'verse authors)) - (allPoetIds (append poetIds (map car versePoetData))) (composerIds (find-author-ids-by 'melody authors)) - (compositionIds (find-author-ids-by 'composition authors)) + (verseComposerData (find-author-id-with-part-numbers 'meloverse authors)) (voiceComposerData (find-author-id-with-part-numbers 'voice authors)) - (poets (append - (map (lambda (poetId) (format-author poetId #f)) poetIds) - (map (lambda (versePoetEntry) (string-append (render-verse-contribution (cdr versePoetEntry)) (format-author (car versePoetEntry) (member (car versePoetEntry) poetIds)))) versePoetData) - )) - (composers (append - (map (lambda (composerId) (format-author composerId (member composerId allPoetIds))) composerIds) - (map (lambda (composerId) (string-append (ly:output-def-lookup layout 'compositionPrefix) " " (format-author composerId (member composerId allPoetIds)))) compositionIds) - (map (lambda (voiceComposerEntry) (string-append (render-voice-contribution (cdr voiceComposerEntry)) (format-author (car voiceComposerEntry) (member (car voiceComposerEntry) allPoetIds)))) voiceComposerData) - ))) - (if (and (equal? poetIds composerIds) (null? versePoetData) (null? voiceComposerData) (null? compositionIds)) - (list (string-append (ly:output-def-lookup layout 'poetAndComposerEqualPrefix) " " (string-join poets ", ")) #f) + (compositionIds (find-author-ids-by 'composition authors)) + (bridgeIds (find-author-ids-by 'bridge authors)) + (interludeIds (find-author-ids-by 'interlude authors)) + (year_text (chain-assoc-get 'header:year_text props #f)) + (year_translation (chain-assoc-get 'header:year_translation props #f)) + (year_melody (chain-assoc-get 'header:year_melody props #f)) + (year_composition (chain-assoc-get 'header:year_composition props #f)) + ) + (if (and (equal? poetIds composerIds) (null? translatorIds) (null? versePoetData) (null? verseComposerData) (null? voiceComposerData) (null? compositionIds) (null? bridgeIds) (null? interludeIds)) (list - (string-append (ly:output-def-lookup layout 'poetPrefix) " " (string-join poets ", ")) - (string-append (ly:output-def-lookup layout 'composerPrefix) " " (string-join composers ", "))))) + (render-contribution-group (ly:output-def-lookup layout 'poetAndComposerEqualPrefix) poetIds) + #f) + (list + (if (and (null? poetIds) (null? versePoetData) (null? translatorIds)) #f + (string-append + (ly:output-def-lookup layout 'poetPrefix) + " " + (join-present (list + (join-present (list + (render-contribution-group "" poetIds) + year_text + ) ", ") + (render-partial-contribution-group 'versePrefix versePoetData) + (join-present (list + (render-contribution-group (ly:output-def-lookup layout 'translationPrefix) translatorIds) + year_translation + ) ", ") + ) "; ") + )) + (if (and (null? composerIds) (null? compositionIds) (null? verseComposerData) (null? voiceComposerData) (null? bridgeIds) (null? interludeIds)) #f + (string-append + (ly:output-def-lookup layout 'composerPrefix) + " " + (join-present (list + (join-present (list + (render-contribution-group "" composerIds) + year_melody + ) ", ") + (render-partial-contribution-group 'versePrefix verseComposerData) + (render-partial-contribution-group 'voicePrefix voiceComposerData) + (join-present (list + (render-contribution-group (ly:output-def-lookup layout 'compositionPrefix) compositionIds) + year_composition + ) ", ") + (render-contribution-group (ly:output-def-lookup layout 'bridgePrefix) bridgeIds) + (render-contribution-group (ly:output-def-lookup layout 'interludePrefix) interludeIds) + ) "; ") + ))))) (list #f #f) ) ) @@ -91,8 +160,8 @@ (copyright (chain-assoc-get 'header:copyright props #f)) (translation (chain-assoc-get 'header:translation props #f)) (pronunciation (chain-assoc-get 'header:pronunciation props #f)) - (year_text (chain-assoc-get 'header:year_text props #f)) - (year_melody (chain-assoc-get 'header:year_melody props #f))) + (year_text (if (string? (car poet-and-composers)) #f (chain-assoc-get 'header:year_text props #f))) + (year_melody (if (string? (car poet-and-composers)) #f (chain-assoc-get 'header:year_melody props #f)))) (markup #:override (cons 'songinfo:poet-maybe-with-composer (if (and poet-maybe-with-composer (not (and (string? poet-maybe-with-composer) (string-null? poet-maybe-with-composer)))) poet-maybe-with-composer #f))