extract meta data from lilypond compilation
* write that as yaml file next to the other outputs * extract lyrics * makes chordpro export work in songbooks * more metadata for chordpro export
This commit is contained in:
@@ -65,6 +65,26 @@ additionalPageNumbers =
|
||||
display-pages-list
|
||||
)
|
||||
|
||||
% Fuer Zusatzseiten: Label der ersten Seite des zusammenhaengenden
|
||||
% Zusatzseiten-Blocks, zu dem label gehoert (bestimmt den Buchstaben-Suffix a, b, ...).
|
||||
#(define (earliest-additional-label label)
|
||||
(let find-earliest-additional-label
|
||||
((rest-additional-page-switch-label-list (member (cons label #t) additional-page-switch-label-list)))
|
||||
(if (cdadr rest-additional-page-switch-label-list)
|
||||
(find-earliest-additional-label (cdr rest-additional-page-switch-label-list))
|
||||
(caar rest-additional-page-switch-label-list))))
|
||||
|
||||
% Sichtbare Seitenzahl der Seite mit diesem Label: normalerweise eine Zahl,
|
||||
% auf Zusatzseiten ein String mit Buchstaben-Suffix (z.B. "12a"); gleiche
|
||||
% Logik wie custom-page-number unten.
|
||||
#(define (visible-page-value layout label)
|
||||
(let ((display-page (assq-ref (build-display-pages-list layout) label)))
|
||||
(if (assq-ref additional-page-switch-label-list label)
|
||||
(ly:format "~a~a" display-page
|
||||
(string (integer->char (+ 97 (- (real-page-number layout label)
|
||||
(real-page-number layout (earliest-additional-label label)))))))
|
||||
display-page)))
|
||||
|
||||
% TODO:
|
||||
% Eigentlich können wir das direkt in oddFooderMarkup und evenFooterMarkup aufrufen
|
||||
% vermutlich sogar ohne den delay kram. Wir sollten außerdem einfach nur die property
|
||||
@@ -97,12 +117,7 @@ width may require additional tweaking.)"
|
||||
(if (assq-ref additional-page-switch-label-list label)
|
||||
(make-concat-markup (list (number-format number-type display-page)
|
||||
(make-char-markup (+ 97 (- real-current-page (real-page-number layout
|
||||
(let find-earliest-additional-label
|
||||
((rest-additional-page-switch-label-list (member (cons label #t) additional-page-switch-label-list)))
|
||||
(if (cdadr rest-additional-page-switch-label-list)
|
||||
(find-earliest-additional-label (cdr rest-additional-page-switch-label-list))
|
||||
(caar rest-additional-page-switch-label-list)))
|
||||
))))))
|
||||
(earliest-additional-label label)))))))
|
||||
(number-format number-type (+ display-page (- real-current-page (real-page-number layout label))))
|
||||
))
|
||||
(page-stencil (interpret-markup layout props page-markup))
|
||||
@@ -118,6 +133,75 @@ width may require additional tweaking.)"
|
||||
(make-filled-box-stencil x-ext y-ext))))
|
||||
|
||||
|
||||
%% Schreibt die Daten aller Lieder des Buchs (extract-song-data, siehe
|
||||
%% data_extractor.ily) als YAML-Datei: oberster Key contents, darunter eine
|
||||
%% Liste mit den Lied-Daten, jeweils angereichert um den Key page mit der
|
||||
%% sichtbaren Seitenzahl des Liedanfangs. Einbinden wie \write-toc-csv in
|
||||
%% einem Markup des Buchs; wie dort passiert das Schreiben ueber ein
|
||||
%% delayed stencil, weil die Label->Seiten-Tabelle erst beim Ausgeben des
|
||||
%% Buchs feststeht. Der Dateiname ist der Ausgabename des Buchs
|
||||
%% (\bookOutputName, sonst der .ly-Basisname) mit angehaengtem .yml --
|
||||
%% landet also wie das PDF relativ zum Arbeitsverzeichnis.
|
||||
#(define-markup-command (write-book-yaml layout props) ()
|
||||
(let ((filename (string-append (ly:parser-output-name) ".yml")))
|
||||
(ly:make-stencil
|
||||
`(delay-stencil-evaluation
|
||||
,(delay
|
||||
(begin
|
||||
(scm->yml-file filename
|
||||
(list (cons 'contents
|
||||
(map (lambda (song)
|
||||
(let ((songvars (cdr song)))
|
||||
(cons (cons 'page (visible-page-value layout (assq-ref songvars 'label)))
|
||||
(extract-song-data (assq-ref songvars 'header)
|
||||
(assq-ref songvars 'music)
|
||||
;; Textseiten-Strophen aus dem Render-
|
||||
;; Collector-Store (Key = Liedname); beim
|
||||
;; Ausgeben des Buchs sind alle Textseiten
|
||||
;; bereits interpretiert.
|
||||
(hash-ref chordpro-song-store
|
||||
(symbol->string (car song)))
|
||||
(symbol->string (car song))))))
|
||||
(reverse (alist-delete 'markupPage
|
||||
(alist-delete 'imagePage
|
||||
(alist-delete 'emptyPage song-list))))))))
|
||||
empty-stencil))))))
|
||||
|
||||
%% Schreibt den ChordPro-Export aller Lieder des Buchs (in Dokument-
|
||||
%% reihenfolge) als EINE Datei statt als Einzeldateien pro Lied. Lieder
|
||||
%% werden mit der ChordPro-Direktive {new_song} getrennt; vor dem ersten
|
||||
%% Lied ist sie nicht noetig, sie gilt am Dateianfang implizit (siehe
|
||||
%% https://www.chordpro.org/chordpro/directives-new_song/). Einbinden wie
|
||||
%% \write-book-yaml an beliebiger Stelle im Buch -- unabhaengig von
|
||||
%% chordpro-export-enabled (das steuert nur den Pro-Song-Export), beide
|
||||
%% Befehle koennen auch gleichzeitig genutzt werden. Wie bei
|
||||
%% \write-book-yaml passiert das Schreiben ueber ein delayed stencil,
|
||||
%% weil der Render-Collector-Store erst beim Ausgeben des Buchs
|
||||
%% vollstaendig gefuellt ist. Der Dateiname ist wie bei \write-book-yaml
|
||||
%% der Ausgabename des Buchs mit angehaengtem .cho.
|
||||
#(define-markup-command (write-book-chordpro layout props) ()
|
||||
(let ((filename (string-append (ly:parser-output-name) ".cho")))
|
||||
(ly:make-stencil
|
||||
`(delay-stencil-evaluation
|
||||
,(delay
|
||||
(begin
|
||||
(with-output-to-file filename
|
||||
(lambda ()
|
||||
(let loop ((songs (filter
|
||||
(lambda (song) (> (chordpro-song-verse-index song) 0))
|
||||
(filter-map
|
||||
(lambda (song) (hash-ref chordpro-song-store
|
||||
(symbol->string (car song))))
|
||||
(reverse (alist-delete 'markupPage
|
||||
(alist-delete 'imagePage
|
||||
(alist-delete 'emptyPage song-list)))))))
|
||||
(first? #t))
|
||||
(when (pair? songs)
|
||||
(unless first? (display "{new_song}\n"))
|
||||
(display (chordpro-format-song (car songs)))
|
||||
(loop (cdr songs) #f)))))
|
||||
empty-stencil))))))
|
||||
|
||||
includeSong =
|
||||
#(define-void-function (filename) (string?)
|
||||
#{
|
||||
@@ -125,6 +209,15 @@ includeSong =
|
||||
#}
|
||||
(ly:parser-parse-string (ly:parser-clone)
|
||||
(ly:format "\\include \"~a/~a/~a.ly\"" songPath filename filename))
|
||||
;; ChordPro: Titel/Autoren dieses Lieds im Render-Collector-Store
|
||||
;; registrieren -- basicSongInfo haelt direkt nach dem Include genau
|
||||
;; dieses Lied. Der Key ist der Liedname; die Collector-Daten (Verse,
|
||||
;; Akkorde) kommen spaeter beim Rendern ueber \setsongfilename unter
|
||||
;; demselben Key dazu. Unabhaengig von chordpro-export-enabled, damit
|
||||
;; sowohl der Pro-Song-Export (der die Flag braucht) als auch
|
||||
;; \write-book-chordpro (das nur explizit aufgerufen werden muss) auf
|
||||
;; vollstaendige Metadaten zugreifen koennen.
|
||||
(chordpro-register-song-metadata filename)
|
||||
(let ((label (gensym "index")))
|
||||
(set! additional-page-switch-label-list
|
||||
(acons label additional-page-numbers additional-page-switch-label-list))
|
||||
|
||||
Reference in New Issue
Block a user