On 2021-06-29 9:43 am, Jean Abou Samra wrote:
However, this problem can be solved by writing
an engraver (those are the powerful tools that
\applyOutput uses under the hood).
\version "2.22.0"
\layout {
\context {
\Score
\consists
#(lambda (context)
(make-engraver
(acknowledgers
((grob-interface engraver grob source-engraver)
(set! (ly:grob-property grob 'output-attributes)
`((class . ,(grob::name grob))))))))
}
}
<<
{ c d e f }
\\
{ g a b c' }
NOTE: You might want this engraver to *append* to the class attribute,
so you can still specify classes on an individual basis:
%%%%
\version "2.22.0"
SvgAddClassName =
#(lambda (ctxt)
(define (add-class-name grob)
(let* ((attribs (ly:grob-property grob 'output-attributes '()))
(class (ly:assoc-get 'class attribs '()))
(name (grob::name grob)))
(set! class (if (null? class) name (format #f "~a ~a" class name)))
(set! attribs (assoc-set! attribs 'class class))
(ly:grob-set-property! grob 'output-attributes attribs)))
(make-engraver
(acknowledgers
((grob-interface engraver grob source)
(add-class-name grob)))))
\layout { \context { \Score \consists \SvgAddClassName } }
{ \tweak output-attributes #'((class . foo)) b'4 }
%%%%
-- Aaron Hill