Displaying grob ancestry: Difference between revisions
m New category |
m Fprmatting; send output to stdout |
||
| Line 10: | Line 10: | ||
For example, the <code>System</code> grob can be both parent (on the Y-side) and grandparent (twice on the X-side) to a <code>VerticalAlignment</code> grob. | For example, the <code>System</code> grob can be both parent (on the Y-side) and grandparent (twice on the X-side) to a <code>VerticalAlignment</code> grob. | ||
The macro defined in this snippet prints (to the console) a textual representation of a grob's ancestry. For example, the call | |||
{ | |||
\once \override NoteHead.before-line-breaking = #display-ancestry | |||
c | |||
} | |||
generates the following output. | |||
------------------------------------ | |||
X,Y: NoteColumn | |||
NoteHead | |||
X,Y: NoteColumn | |||
X: PaperColumn | |||
X,Y: System | |||
Y: VerticalAxisGroup | |||
X: NonMusicalPaperColumn | |||
X,Y: System | |||
Y: VerticalAlignment | |||
X: NonMusicalPaperColumn | |||
X,Y: System | |||
Y: System | |||
<lilypond version="2.24"> | <lilypond version="2.24"> | ||
#(define (get-ancestry grob) | #(define (get-ancestry grob) | ||
(if (not (null? (ly:grob-parent grob X))) | |||
(list (grob::name grob) | |||
(get-ancestry (ly:grob-parent grob X)) | |||
(get-ancestry (ly:grob-parent grob Y))) | |||
(grob::name grob))) | |||
#(define (format-ancestry lst padding) | #(define (format-ancestry lst padding) | ||
(string-append | (string-append | ||
(symbol->string (car lst)) | (symbol->string (car lst)) "\n" | ||
(let ((X-ancestry (if (list? (cadr lst)) | |||
(let ((X-ancestry | (format-ancestry (cadr lst) (+ padding 3)) | ||
(symbol->string (cadr lst)))) | |||
(Y-ancestry (if (list? (caddr lst)) | |||
(format-ancestry (caddr lst) (+ padding 3)) | |||
(Y-ancestry | (symbol->string (caddr lst))))) | ||
(if (equal? X-ancestry Y-ancestry) | (if (equal? X-ancestry Y-ancestry) | ||
(string-append | (string-append (format #f "~&") | ||
(make-string padding #\space) | |||
"X,Y: " | |||
(if (list? (cadr lst)) | |||
(format-ancestry (cadr lst) (+ padding 5)) | |||
(symbol->string (cadr lst)))) | |||
(string-append (format #f "~&") | |||
(string-append | (make-string padding #\space) | ||
"X: " X-ancestry "\n" | |||
(make-string padding #\space) | |||
"Y: " Y-ancestry (format #f "~&")))) | |||
(format #f "~&"))) | (format #f "~&"))) | ||
#(define (display-ancestry grob) | #(define (display-ancestry grob) | ||
(format (current- | (format (current-output-port) | ||
"~2&~a~2%~a~&" | |||
(make-string 36 #\-) | |||
(if (ly:grob? grob) | |||
(format-ancestry (get-ancestry grob) 0) | |||
(format #f "~a is not a grob" grob)))) | |||
\relative c' { | \relative c' { | ||
| Line 86: | Line 81: | ||
</lilypond> | </lilypond> | ||
[[Category:Scheme]] | [[Category:Scheme]] | ||
[[Category:Tweaks and overrides]] | [[Category:Tweaks and overrides]] | ||
[[Category:Included in the official documentation]] | [[Category:Included in the official documentation]] | ||
[[Category:Snippet]] | [[Category:Snippet]] | ||