]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/lily-library.scm
Web-es: update Introduction. Add untranslated Pondings block.
[lilypond.git] / scm / lily-library.scm
index 514f5b40fb576f37ee1ad5321b0e4d83388dc74a..91ece1e476a360785b81614f636d59e79d9123d7 100644 (file)
@@ -285,30 +285,24 @@ bookoutput function"
             (ly:add-context-mod mods
                                 (list 'apply
                                       (ly:music-property m 'procedure))))
-           ((SequentialMusic SimultaneousMusic)
-            (fold loop context (ly:music-property m 'elements)))
            ((ContextSpeccedMusic)
             (loop (ly:music-property m 'element)
                   (ly:music-property m 'context-type)))
-           (else (if (and warn (ly:duration? (ly:music-property m 'duration)))
-                     (begin
-                       (ly:music-warning
-                        music
-                        (_ "Music unsuitable for context-mod"))
-                       (set! warn #f))))))
+           (else
+            (let ((callback (ly:music-property m 'elements-callback)))
+              (if (procedure? callback)
+                  (fold loop context (callback m))
+                  (if (and warn (ly:duration? (ly:music-property m 'duration)))
+                      (begin
+                        (ly:music-warning
+                         music
+                         (_ "Music unsuitable for context-mod"))
+                        (set! warn #f))))))))
       context)
     mods))
 
 (define-public (context-defs-from-music parser output-def music)
-  (let ((bottom 'Voice) (warn #t))
-    (define (get-bottom sym)
-      (or
-       (let ((def (ly:output-def-lookup output-def sym #f)))
-       (and def
-            (let ((def-child (ly:context-def-lookup def 'default-child #f)))
-              (and def-child
-                   (get-bottom def-child)))))
-       sym))
+  (let ((warn #t))
     (let loop ((m music) (mods #f))
       ;; The parser turns all sets, overrides etc into something
       ;; wrapped in ContextSpeccedMusic.  If we ever get a set,
@@ -338,34 +332,38 @@ bookoutput function"
                     (ly:music-property m 'symbol)
                     (ly:music-property m 'grob-property-path)))))
          (case (ly:music-property m 'name)
-           ((SequentialMusic SimultaneousMusic)
-            (fold loop mods (ly:music-property m 'elements)))
            ((ApplyContext)
             (ly:add-context-mod mods
                                 (list 'apply
                                       (ly:music-property m 'procedure))))
            ((ContextSpeccedMusic)
-            (let ((sym (ly:music-property m 'context-type)))
-              (if (eq? sym 'Bottom)
-                  (set! sym bottom)
-                  (set! bottom (get-bottom sym)))
-              (let ((def (ly:output-def-lookup output-def sym)))
-                (if (ly:context-def? def)
-                    (ly:output-def-set-variable!
-                     output-def sym
-                     (ly:context-def-modify
-                      def
-                      (loop (ly:music-property m 'element)
-                            (ly:make-context-mod))))
-                    (ly:music-warning
-                     music
-                     (ly:format (_ "Cannot find context-def \\~a") sym))))))
-           (else (if (and warn (ly:duration? (ly:music-property m 'duration)))
-                     (begin
-                       (ly:music-warning
-                        music
-                        (_ "Music unsuitable for output-def"))
-                       (set! warn #f))))))
+            ;; Use let* here to let defs catch up with modifications
+            ;; to the context defs made in the recursion
+            (let* ((mods (loop (ly:music-property m 'element)
+                               (ly:make-context-mod)))
+                   (defs (ly:output-find-context-def
+                          output-def (ly:music-property m 'context-type))))
+              (if (null? defs)
+                  (ly:music-warning
+                   music
+                   (ly:format (_ "Cannot find context-def \\~a")
+                              (ly:music-property m 'context-type)))
+                  (for-each
+                   (lambda (entry)
+                     (ly:output-def-set-variable!
+                      output-def (car entry)
+                      (ly:context-def-modify (cdr entry) mods)))
+                   defs))))
+           (else
+            (let ((callback (ly:music-property m 'elements-callback)))
+              (if (procedure? callback)
+                  (fold loop mods (callback m))
+                  (if (and warn (ly:duration? (ly:music-property m 'duration)))
+                      (begin
+                        (ly:music-warning
+                         music
+                         (_ "Music unsuitable for output-def"))
+                        (set! warn #f))))))))
       mods)))