X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fmarkup.scm;h=31bbaeeb420bb2d76373fb7d3a0551e40e9739eb;hb=623fac8d645e4078af36758af5d437c5eb39e793;hp=47ebe5d2bcd969f110a4a0adbb70a7516e6bdba3;hpb=3f8a827aad721ed546b823e3f9f2605f61b90e20;p=lilypond.git diff --git a/scm/markup.scm b/scm/markup.scm index 47ebe5d2bc..31bbaeeb42 100644 --- a/scm/markup.scm +++ b/scm/markup.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2003--2011 Han-Wen Nienhuys +;;;; Copyright (C) 2003--2012 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -32,8 +32,7 @@ Example: (markup \"foo\" #:raise 0.2 #:hbracket #:bold \"bar\" #:override '(baseline-skip . 4) - #:bracket #:column (\"baz\" \"bazr\" \"bla\")) -Use `markup*' in a \\notemode context." + #:bracket #:column (\"baz\" \"bazr\" \"bla\"))" (car (compile-all-markup-expressions `(#:line ,body)))) @@ -80,7 +79,8 @@ Use `markup*' in a \\notemode context." ;;; convert a full markup object to an approximate pure string representation -(define-public (markup->string m) +(define-public (markup->string m . argscopes) +(let* ((scopes (if (pair? argscopes) (car argscopes) '()))) ;; markup commands with one markup argument, formatting ignored (define markups-first-argument '(list bold-markup box-markup caps-markup dynamic-markup finger-markup @@ -106,9 +106,9 @@ Use `markup*' in a \\notemode context." translate-scaled-markup with-url-markup scale-markup )) ;; helper functions to handle string cons like string lists - (define (markup-cons->string-cons c) - (if (not (pair? c)) (markup->string c) - (cons (markup->string (car c)) (markup-cons->string-cons (cdr c))))) + (define (markup-cons->string-cons c scopes) + (if (not (pair? c)) (markup->string c scopes) + (cons (markup->string (car c) scopes) (markup-cons->string-cons (cdr c) scopes)))) (define (string-cons-join c) (if (not (pair? c)) c (string-join (list (car c) (string-cons-join (cdr c))) ""))) @@ -116,24 +116,36 @@ Use `markup*' in a \\notemode context." (cond ((string? m) m) ((null? m) "") + ((not (pair? m)) "") ;; handle \concat (string-join without spaces) ((and (pair? m) (equal? (car m) concat-markup)) - (string-cons-join (markup-cons->string-cons (cadr m))) ) + (string-cons-join (markup-cons->string-cons (cadr m) scopes)) ) ;; markup functions with the markup as first arg ((member (car m) (primitive-eval markups-first-argument)) - (markup->string (cadr m))) + (markup->string (cadr m) scopes)) ;; markup functions with markup as second arg ((member (car m) (primitive-eval markups-second-argument)) - (markup->string (cddr m))) + (markup->string (cddr m) scopes)) + + ;; fromproperty-markup reads property values from the header block: + ((equal? (car m) fromproperty-markup) + (let* ((varname (symbol->string (cadr m))) + ;; cut off the header: prefix from the variable name: + (newvarname (if (string-prefix? "header:" varname) (substring varname 7) varname)) + (var (string->symbol newvarname)) + (mod (make-module 1))) + ;; Prevent loops by temporarily clearing the variable we have just looked up + (module-define! mod var "") + (markup->string (ly:modules-lookup scopes var) (cons mod scopes)))) ;; ignore all other markup functions ((markup-function? (car m)) "") ;; handle markup lists ((list? m) - (string-join (map markup->string m) " ")) + (string-join (map (lambda (mm) (markup->string mm scopes)) m) " ")) - (else "ERROR, unable to extract string from markup"))) + (else "ERROR, unable to extract string from markup"))))