Am 14.05.2018 um 00:02 schrieb David Kastrup:
Urs Liska <li...@openlilylib.org> writes:
Hi all,
I'm thinking about having a new grob property \class, but before
digging deeper I'd like to put the idea up for discussion.
This would have two different goals:
1) for SVG output the objects would get the class assigned (along with
an id). I don't have any idea yet how that is implemented,
though. This will make it possible to work with CSS in a display
environment.
2) (Formatting) functions can check for a grob's class to perform
e.g. highlighting operations (=> color all NoteHeads with class
"temporary" red)
In addition I would like to use that to export class information to
MusicXML.
Any comments or objections?
The various semantics seem to be tied more to the word "class" than a
common concept underlying the proposed uses of this property. Maybe
explain some more what the generic concept of class should be and why
the proposed backend semantics are in every case the proper match to the
concept?
The idea is to give various grobs a secondary name, making same-named
grobs belong to a group of objects where the grouping is independent
from groupings like grob type or voice/staff/measure/etc. context. To
express what I mean other words would be appropriate as well, such as
e.g. "type", but I would suggest to use the same word (and concept) as
is used in CSS.
In scholarly editions you may have score items you want to mark up as
"addition", "emendation", "deletion". It's already possible to define
music functions that produce the highlighting you want to apply to these
types of grobs, for example dash slurs added by the editor. With that
you also have a way to centrally control the appearance, for example to
also use colors while working on the edition and suppress that for the
final publication.
However, the resulting grob will not "know" it is an addition but only
that it is dashed and green, for example.
My suggestion is to have the possibility (which of course doesn't
discourage the use of music functions as would be done currently) to
instead set a grob's 'class' property to semantically mark up that grob
instead of (directly) changing its appearance, deferring the styling to
a later stage.
In LilyPond this can for example be an engraver that tests grobs for
their class property and acts upon that.
If the class property is exported to SVG then the appearance of objects
can be controlled interactively with CSS. The same should be possible
when exporting to MusicXML.
Probably an engraver should be made available as well (but not consisted
to any context by default), along with a means of defining "styles"
(maybe an alist of property/value pairs) that will be applied to grobs
with the given class. A style should be somewhat hierarchical, at least
to allow generic property/value pairs and additional ones for specific
grob types (for example note heads should probably not be dashed ...). I
haven't thought about the idea of actually make styles cascading like in
CSS, and I'm not sure there's an appropriate concept of nestedness that
would make that a natural thing to pursue.
I think it would be nice to provide a command [\once] \class <grob-type>
<class-name> which should also be usable as a \tweak on individual
grobs. Very practical would also be to have a context property as well, so
\set Voice.class = "unclear"
would attach the class to every grob within its scope.
Like with CSS multiple classes should be possible with
\class Beam "unclear addition"
My examples so far all come from scholarly editing but I think this
could open up a wide array of use cases. Think about classes like the
following:
\class LyricText "excited"
\set Voice.class = "muted"
\class Hairpin "grey1 dashed with-text"
\class RehearsalMark "rehearsal-mark"
\class RehearsalMark "section-mark"
Urs
_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-devel