lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: SVG export - how might you add classes for all graphical objects?


From: Aaron Hill
Subject: Re: SVG export - how might you add classes for all graphical objects?
Date: Tue, 29 Jun 2021 10:32:38 -0700
User-agent: Roundcube Webmail/1.4.9

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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]