]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 5167/5: Allow defining markup commands in LilyPond syntax
authorDavid Kastrup <dak@gnu.org>
Thu, 10 Dec 2015 12:05:59 +0000 (13:05 +0100)
committerDavid Kastrup <dak@gnu.org>
Mon, 7 Aug 2017 21:25:26 +0000 (23:25 +0200)
This works with assignments of the form

    \markup with-red = \markup \with-color #red \etc

or similar.  The resulting definition (in addition to being available
as \with-red command inside of markups) can be used with the `markup'
macro and also gets a `make-with-red-markup' convenience function.

lily/include/lily-imports.hh
lily/lily-imports.cc
lily/parser.yy

index a22da30f66350bb7766d37a06ebbf4386db2cbd7..cc61ea7d9ac0534ff760806906f960352d97b926 100644 (file)
@@ -61,6 +61,7 @@ namespace Lily {
   extern Variable chordmodifiers;
   extern Variable construct_chord_elements;
   extern Variable default_time_signature_settings;
+  extern Variable define_markup_command;
   extern Variable drum_pitch_names;
   extern Variable grob_compose_function;
   extern Variable grob_offset_function;
@@ -87,6 +88,7 @@ namespace Lily {
   extern Variable make_span_event;
   extern Variable markup_p;
   extern Variable markup_command_signature;
+  extern Variable markup_function_p;
   extern Variable markup_list_function_p;
   extern Variable markup_list_p;
   extern Variable midi_program;
index 699b0850e7fc0eeb84bdb753b61cf6574963895f..5bb48631681bbaf3f88bd7c937dc2cc3282fadb7 100644 (file)
@@ -55,6 +55,7 @@ namespace Lily {
   Variable chordmodifiers ("chordmodifiers");
   Variable construct_chord_elements ("construct-chord-elements");
   Variable default_time_signature_settings ("default-time-signature-settings");
+  Variable define_markup_command ("define-markup-command");
   Variable drum_pitch_names ("drumPitchNames");
   Variable grob_compose_function ("grob::compose-function");
   Variable grob_offset_function ("grob::offset-function");
@@ -81,6 +82,7 @@ namespace Lily {
   Variable make_span_event ("make-span-event");
   Variable markup_p ("markup?");
   Variable markup_command_signature ("markup-command-signature");
+  Variable markup_function_p ("markup-function?");
   Variable markup_list_function_p ("markup-list-function?");
   Variable markup_list_p ("markup-list?");
   Variable midi_program ("midi-program");
index d9812b1b9f1c983853e56c655201b2b40d2e16d3..ddccd416581b9ff75667d7815a334e6804d12b90 100644 (file)
@@ -696,6 +696,20 @@ assignment:
                parser->lexer_->set_identifier (path, $5);
                 $$ = SCM_UNSPECIFIED;
        }
+       | markup_mode_word '=' identifier_init
+       {
+               if (scm_is_false (Lily::markup_function_p ($3)))
+               {
+                       parser->parser_error (@3, _ ("Not a markup function"));
+               } else {
+                       scm_primitive_eval
+                               (scm_list_3
+                                (Lily::define_markup_command,
+                                 scm_string_to_symbol ($1),
+                                 ly_quote_scm ($3)));
+               }
+               $$ = SCM_UNSPECIFIED;
+       }
        ;
 
 
@@ -3899,11 +3913,33 @@ markup_mode:
        }
        ;
 
+// Sort-of ugly: We need this as markup of its own as well as in
+// markup function assignments, without triggering lookahead or the
+// '=' for assignments will be parsed in markup mode and not
+// recognized.  Worse: the next token following something like
+// \markup "string" would be parsed in markup mode as well.
+//
+// So we make a single production here that's used either in markup or
+// in assignment.
+
+markup_mode_word:
+       markup_mode markup_word
+       {
+               $$ = $2;
+               parser->lexer_->pop_state ();
+       }
+       ;
+
+
 full_markup:
        markup_mode markup_top {
                $$ = $2;
                parser->lexer_->pop_state ();
        }
+       | markup_mode_word
+       {
+               $$ = make_simple_markup ($1);
+       }
        ;
 
 partial_markup:
@@ -3923,7 +3959,7 @@ markup_top:
                $$ = scm_car (MAKE_SYNTAX (composed_markup_list,
                                           @2, $1, scm_list_1 ($2)));
        }
-       | simple_markup {
+       | simple_markup_noword {
                $$ = $1;
        }
        ;
@@ -4070,14 +4106,21 @@ markup_head_1_list:
        }
        ;
 
+markup_word:
+       STRING
+       | SYMBOL
+       ;
+
 simple_markup:
-       STRING {
-               $$ = make_simple_markup ($1);
-       }
-       | SYMBOL {
+       markup_word
+       {
                $$ = make_simple_markup ($1);
        }
-       | SCORE {
+       | simple_markup_noword
+       ;
+
+simple_markup_noword:
+       SCORE {
                parser->lexer_->push_note_state (Lily::pitchnames);
        } '{' score_body '}' {
                Score *sc = unsmob<Score> ($4);