2023-07-22 22:07:57 +02:00
|
|
|
% parsing line by line
|
|
|
|
#(define-markup-command (wrap-newline layout props text) (string?)
|
|
|
|
"Text Zeile für Zeile parsen"
|
|
|
|
(interpret-markup layout props
|
|
|
|
#{ \markup { \column {
|
2023-08-08 19:21:51 +02:00
|
|
|
$(let ((verse-markup-string (
|
|
|
|
string-append "\\line { "
|
2023-10-30 23:20:49 +01:00
|
|
|
(ly:regex-replace (ly:make-regex "\r?\n") text " } \\line { ")
|
2023-07-22 22:07:57 +02:00
|
|
|
" \\size-box-to-box ##f ##t \"\" \"Agj\" }" )))
|
2023-08-08 19:21:51 +02:00
|
|
|
(ly:parser-include-string verse-markup-string))
|
2023-07-22 22:07:57 +02:00
|
|
|
}}#}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
#(define-markup-command (size-box-to-box layout props use-x use-y abox bbox)
|
|
|
|
(boolean? boolean? markup? markup?)
|
|
|
|
(let* ((ma (interpret-markup layout props abox))
|
|
|
|
(mb (interpret-markup layout props bbox))
|
|
|
|
(ax (ly:stencil-extent ma X))
|
|
|
|
(ay (ly:stencil-extent ma Y))
|
|
|
|
(bx (ly:stencil-extent mb X))
|
|
|
|
(by (ly:stencil-extent mb Y))
|
|
|
|
(halfdiffabx (* (- (interval-length bx) (interval-length ax)) 0.5)))
|
|
|
|
(ly:stencil-translate (ly:make-stencil (ly:stencil-expr ma)
|
|
|
|
(if use-x
|
|
|
|
(if (< halfdiffabx 0)
|
|
|
|
(cons
|
|
|
|
(- (interval-bound ax DOWN) halfdiffabx)
|
|
|
|
(+ (interval-bound ax UP) halfdiffabx))
|
|
|
|
bx)
|
|
|
|
ax)
|
|
|
|
(if use-y by ay))
|
|
|
|
(cons (if (and use-x (< halfdiffabx 0)) halfdiffabx 0) 0) )))
|
|
|
|
|
|
|
|
#(define-markup-command (size-box-to-box-left-aligned layout props use-x use-y abox bbox)
|
|
|
|
(boolean? boolean? markup? markup?)
|
|
|
|
(let* ((ma (interpret-markup layout props abox))
|
|
|
|
(mb (interpret-markup layout props bbox))
|
|
|
|
(ax (ly:stencil-extent ma X))
|
|
|
|
(ay (ly:stencil-extent ma Y))
|
|
|
|
(bx (ly:stencil-extent mb X))
|
|
|
|
(by (ly:stencil-extent mb Y)))
|
|
|
|
(ly:make-stencil (ly:stencil-expr ma)
|
|
|
|
(if use-x bx ax)
|
|
|
|
(if use-y by ay))
|
|
|
|
))
|
|
|
|
|
|
|
|
#(define-markup-command (size-box-to-box-style-dependent layout props use-x use-y abox bbox)
|
|
|
|
(boolean? boolean? markup? markup?)
|
|
|
|
(interpret-markup layout props
|
|
|
|
(case songTextChordAlignment
|
|
|
|
((center) (make-size-box-to-box-markup use-x use-y abox bbox))
|
|
|
|
((left) (make-size-box-to-box-left-aligned-markup use-x use-y abox bbox)))))
|
|
|
|
|
|
|
|
% Akkorde in Strophen transponieren
|
|
|
|
#(define-markup-list-command (transpose layout props from to markuplist)
|
|
|
|
(markup? markup? markup-list?)
|
|
|
|
(interpret-markup-list layout (prepend-alist-chain 'transposition (cons from to) props) markuplist))
|
|
|
|
|
|
|
|
#(define-markup-command (chord-alignment-style-dependent layout props chord-with-text) (markup?)
|
|
|
|
(interpret-markup layout props
|
|
|
|
(case songTextChordAlignment
|
|
|
|
((center) (make-center-align-markup chord-with-text))
|
|
|
|
((left) (make-left-align-markup chord-with-text)))))
|
|
|
|
|
|
|
|
% Text über Text mittig darstellen
|
|
|
|
#(define-markup-command (textup layout props text uptext) (markup? markup?)
|
|
|
|
"Markup über Text mittig darstellen."
|
2023-10-29 16:25:15 +01:00
|
|
|
(let ((verselayout (chain-assoc-get 'verselayout props generalLayout)))
|
2023-07-22 22:07:57 +02:00
|
|
|
(interpret-markup layout props
|
|
|
|
#{\markup {
|
|
|
|
\size-box-to-box-style-dependent ##t ##f
|
|
|
|
\general-align #X #LEFT \override #`(direction . ,UP) \override #'(baseline-skip . 1.0) \dir-column \chord-alignment-style-dependent {
|
|
|
|
\pad-to-box #'(0 . 0) #'(0 . 2.0) { #text }
|
2023-10-29 16:25:15 +01:00
|
|
|
\size-box-to-box ##f ##t #uptext \score { \chords { g4:m a } \layout { \verselayout } }
|
2023-07-22 22:07:57 +02:00
|
|
|
}
|
|
|
|
#text
|
|
|
|
}
|
|
|
|
#}
|
2023-10-29 16:25:15 +01:00
|
|
|
)))
|
2023-07-22 22:07:57 +02:00
|
|
|
|
|
|
|
#(define-markup-command (anchor-x-between layout props arga argb)
|
|
|
|
(markup? markup?)
|
|
|
|
(let* ((la (interval-length (ly:stencil-extent (interpret-markup layout props arga) X)))
|
|
|
|
(m (interpret-markup layout props (markup #:general-align Y DOWN arga argb (make-size-box-to-box-markup #t #t (markup #:null) arga))))
|
|
|
|
(l (interval-length (ly:stencil-extent m X))))
|
|
|
|
(ly:stencil-aligned-to m X (- (/ (* la 2) l) 1))
|
|
|
|
))
|
|
|
|
|
|
|
|
#(define-markup-command (stanza-raw layout props arg)
|
|
|
|
(markup?)
|
2023-10-29 16:25:15 +01:00
|
|
|
(let ((verselayout (chain-assoc-get 'verselayout props generalLayout)))
|
2023-07-22 22:07:57 +02:00
|
|
|
(interpret-markup layout props
|
|
|
|
(if (and (string? arg) (string-null? arg))
|
|
|
|
" "
|
|
|
|
#{\markup
|
2023-10-29 16:25:15 +01:00
|
|
|
\score { \new Lyrics { \lyricmode { \set stanza = #arg "" } } \layout { \verselayout } }
|
2023-07-22 22:07:57 +02:00
|
|
|
#}
|
2023-10-29 16:25:15 +01:00
|
|
|
))))
|
2023-07-22 22:07:57 +02:00
|
|
|
|
|
|
|
#(define-markup-command (stanza layout props arg)
|
|
|
|
(markup?)
|
|
|
|
(interpret-markup layout props
|
|
|
|
(make-size-box-to-box-markup #f #t (make-stanza-raw-markup arg) (make-stanza-raw-markup "x"))))
|
|
|
|
|
2023-10-29 22:54:10 +01:00
|
|
|
#(define (handle-custom-newlines custom-verse-breaks text)
|
|
|
|
(if (null? custom-verse-breaks)
|
|
|
|
text
|
|
|
|
(let make-custom-linebreaks
|
|
|
|
((break-words custom-verse-breaks)
|
2023-10-30 23:20:49 +01:00
|
|
|
(newtext (ly:regex-replace (ly:make-regex "\r?\n") text " ")))
|
2023-10-29 22:54:10 +01:00
|
|
|
(if (null? break-words)
|
|
|
|
newtext
|
|
|
|
(make-custom-linebreaks
|
|
|
|
(cdr break-words)
|
|
|
|
(ly:regex-replace
|
|
|
|
(ly:make-regex (string-append "(" (ly:regex-replace (ly:make-regex "(.)") (car break-words) "(?:\\(?" 1 "| *,[^,)]+\\)" 1 ")") "(?: *,[^,)]+\\))?)(.*)$"))
|
|
|
|
newtext
|
|
|
|
1 "\n" 2))))))
|
|
|
|
|
2023-07-22 22:07:57 +02:00
|
|
|
% Kompletten Vers mit Akkorden
|
|
|
|
#(define-markup-command (chordverse layout props stanza verse) (markup? string?)
|
2023-10-29 22:54:10 +01:00
|
|
|
#:properties ((intraverse-vspace 0)(custom-verse-breaks '()))
|
2023-07-22 22:07:57 +02:00
|
|
|
"Vers mit Akkorden"
|
|
|
|
(let* ((fromto (chain-assoc-get 'transposition props #f))
|
|
|
|
(transp (if fromto
|
|
|
|
(string-append "\\transpose " (car fromto) " " (cdr fromto))
|
2023-10-29 16:25:15 +01:00
|
|
|
""))
|
|
|
|
(verselayout (chain-assoc-get 'verselayout props generalLayout)))
|
2023-07-22 22:07:57 +02:00
|
|
|
(interpret-markup layout props
|
2023-08-09 13:36:46 +02:00
|
|
|
(markup #:override `(baseline-skip . ,(+ intraverse-vspace songTextLineHeigth)) #:anchor-x-between #:stanza stanza
|
2023-07-22 22:07:57 +02:00
|
|
|
(make-wrap-newline-markup
|
2023-08-08 19:21:51 +02:00
|
|
|
(ly:regex-replace (ly:make-regex "\\(( *)([^,()]*)( *),([^)]*)\\)")
|
2023-10-29 22:54:10 +01:00
|
|
|
(ly:regex-replace (ly:make-regex "(([^ \n]*\\([^()]*,[^()]+\\)[^ \n(]*)+)") (handle-custom-newlines custom-verse-breaks verse) " \\concat { " 1 " } ")
|
2023-10-29 16:25:15 +01:00
|
|
|
"\\textup \\line { \"" 1 "\" " 2 " \"" 3 "\" } \\score { \\transposable " transp " \\chords { s4 " 4 " } \\layout { \\verselayout } }")
|
2023-08-08 19:21:51 +02:00
|
|
|
)
|
2023-07-22 22:07:57 +02:00
|
|
|
))))
|
|
|
|
|
|
|
|
% Kompletter Vers aus dem Akkorde entfernt werden
|
|
|
|
#(define-markup-command (nochordverse layout props stanza verse) (markup? string?)
|
2023-10-29 22:54:10 +01:00
|
|
|
#:properties ((intraverse-vspace 0)(custom-verse-breaks '()))
|
2023-07-22 22:07:57 +02:00
|
|
|
"Vers ohne Akkorde"
|
|
|
|
(interpret-markup layout props
|
2023-08-09 13:36:46 +02:00
|
|
|
(markup #:override `(baseline-skip . ,(+ intraverse-vspace 3.0)) #:anchor-x-between #:stanza stanza
|
2023-10-29 22:54:10 +01:00
|
|
|
#:wrap-newline (ly:regex-replace (ly:make-regex "\\(([^,]*),([^)]*)\\)") (handle-custom-newlines custom-verse-breaks verse) 1)
|
2023-07-22 22:07:57 +02:00
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
#(define-markup-command (verseformat layout props verse) (markup?)
|
|
|
|
"Textformatierung für Strophen"
|
|
|
|
(interpret-markup layout props
|
|
|
|
(make-sans-markup (make-fontsize-markup (ly:output-def-lookup layout 'lyric-size) verse))
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
#(define-markup-command (group-verses layout props versegroup) (markup-list?)
|
|
|
|
#:properties ((verse-cols 1)
|
|
|
|
(verse-vspace 1)
|
|
|
|
(verse-hspace 1)
|
|
|
|
(verse-ordering-horizontal #f))
|
|
|
|
"Gruppiere Strophen in einem Markup auf Wunsch spaltenweise"
|
2023-09-25 01:39:55 +02:00
|
|
|
(define (add-markup-between-elements reverses markup-between elements)
|
|
|
|
((if reverses fold fold-right) (lambda (element filled-list)
|
|
|
|
(cons element (if (null? filled-list) '() (cons markup-between filled-list))))
|
|
|
|
'() elements))
|
|
|
|
(let* ((column-item-count (ceiling (/ (length versegroup) verse-cols)))
|
|
|
|
(column-data (make-list verse-cols)))
|
|
|
|
(let columnize-list ((index 0) (items versegroup))
|
|
|
|
(if (not (null? items))
|
|
|
|
(let* ((column-index (if verse-ordering-horizontal
|
|
|
|
(modulo index verse-cols)
|
|
|
|
(floor (/ index column-item-count))))
|
|
|
|
(column-markups (list-ref column-data column-index)))
|
|
|
|
(list-set! column-data column-index (cons (car items) column-markups))
|
|
|
|
(columnize-list (+ index 1) (cdr items)))))
|
|
|
|
(interpret-markup layout props
|
|
|
|
(make-fill-line-markup (list (make-verseformat-markup (make-line-markup
|
|
|
|
(add-markup-between-elements #f
|
|
|
|
(make-hspace-markup verse-hspace)
|
|
|
|
(map (lambda (column-markups)
|
|
|
|
(make-column-markup
|
|
|
|
(add-markup-between-elements #t (make-vspace-markup verse-vspace) column-markups)))
|
|
|
|
column-data)))))))))
|