X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fproperty-iterator.cc;h=7b2dddb1da8d22da6d2946910fee11a6c37b84b2;hb=4478a4f00c0958af4964af412fa9e0e050569fe0;hp=3799ba0e2f514d675238a1fe28f24921817efbaa;hpb=f2f5eb23db6c2daf882957dcfe472657c8bdb1b6;p=lilypond.git diff --git a/lily/property-iterator.cc b/lily/property-iterator.cc index 3799ba0e2f..7b2dddb1da 100644 --- a/lily/property-iterator.cc +++ b/lily/property-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ #include "property-iterator.hh" @@ -11,37 +11,93 @@ #include "translator-def.hh" #include "translator-group.hh" + +bool check_grob(Music *mus, SCM sym); + /** - There is no real processing to a property: just lookup the - translation unit, and set the property. - */ + There is no real processing to a property: just lookup the + translation unit, and set the property. +*/ void Property_iterator::process (Moment m) { - SCM sym = music_l_->get_mus_property ("symbol"); - if (gh_symbol_p(sym)) - report_to_l ()->set_property (sym, music_l_->get_mus_property ("value")); + SCM sym = music_l ()->get_mus_property ("symbol"); + if (gh_symbol_p (sym)) + { + SCM val = music_l ()->get_mus_property ("value"); + bool ok= true; + if (val != SCM_EOL) + ok = type_check_assignment (sym, val, ly_symbol2scm ("translation-type?")); + if (ok) + report_to_l ()->internal_set_property (sym, val); + } Simple_music_iterator::process (m); } void -Push_property_iterator::process (Moment m) +Property_unset_iterator::process (Moment m) { - SCM syms = music_l_->get_mus_property ("symbols"); - SCM eprop = music_l_->get_mus_property ("element-property"); - SCM val = music_l_->get_mus_property ("element-value"); + SCM sym = music_l ()->get_mus_property ("symbol"); + type_check_assignment (sym, SCM_EOL, ly_symbol2scm ("translation-type?")); + report_to_l ()->unset_property (sym); - Translator_def::apply_pushpop_property (report_to_l (), syms, eprop, val); + Simple_music_iterator::process (m); +} + + +SCM list_p = 0; + +bool +check_grob(Music *mus, SCM sym) +{ + if (!list_p) + { + list_p = gh_eval_str ("list?"); + } + + SCM type_p = scm_object_property (sym, ly_symbol2scm ("translation-type?")); + bool ok = type_p == list_p; + + if (!ok) + { + mus->origin()->warning (_f("Not a grob name, `%s'." , ly_symbol2string (sym))); + } + return ok; +} + +void +Push_property_iterator::process (Moment m) +{ + SCM sym = music_l ()->get_mus_property ("symbol"); + if (check_grob (music_l (), sym)) + { + SCM eprop = music_l ()->get_mus_property ("grob-property"); + SCM val = music_l ()->get_mus_property ("grob-value"); + + if (to_boolean (music_l ()->get_mus_property ("pop-first"))) + Translator_def::apply_pushpop_property (report_to_l (), + sym, eprop, SCM_UNDEFINED); + + Translator_def::apply_pushpop_property (report_to_l (), sym, eprop, val); + } Simple_music_iterator::process (m); } void Pop_property_iterator::process (Moment m) { - SCM syms = music_l_->get_mus_property ("symbols"); - SCM eprop = music_l_->get_mus_property ("element-property"); - Translator_def::apply_pushpop_property (report_to_l (), syms, eprop, SCM_UNDEFINED); - + SCM sym = music_l ()->get_mus_property ("symbol"); + if (check_grob (music_l (), sym)) + { + SCM eprop = music_l ()->get_mus_property ("grob-property"); + Translator_def::apply_pushpop_property (report_to_l (), sym, eprop, SCM_UNDEFINED); + } Simple_music_iterator::process (m); } + + +IMPLEMENT_CTOR_CALLBACK (Pop_property_iterator); +IMPLEMENT_CTOR_CALLBACK (Push_property_iterator); +IMPLEMENT_CTOR_CALLBACK (Property_iterator); +IMPLEMENT_CTOR_CALLBACK (Property_unset_iterator);