1 ;;;; This file is part of LilyPond, the GNU music typesetter.
3 ;;;; Copyright (C) 1998--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
4 ;;;; Jan Nieuwenhuizen <janneke@gnu.org>
6 ;;;; LilyPond is free software: you can redistribute it and/or modify
7 ;;;; it under the terms of the GNU General Public License as published by
8 ;;;; the Free Software Foundation, either version 3 of the License, or
9 ;;;; (at your option) any later version.
11 ;;;; LilyPond is distributed in the hope that it will be useful,
12 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;;;; GNU General Public License for more details.
16 ;;;; You should have received a copy of the GNU General Public License
17 ;;;; along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
20 (define (doc-markup-function-properties func)
21 (let ((properties (hashq-ref markup-functions-properties func))
22 (prop-strings (list)))
23 (for-each (lambda (prop-spec)
26 ;; either (prop value) or (prop)
27 (cons (if (null? (cdr prop-spec))
28 (format #f "@item @code{~a}\n" (car prop-spec))
29 (format #f "@item @code{~a} (~a)\n"
31 (let ((default (cadr prop-spec)))
32 (if (and (list? default)
37 ;; a markup command: get its properties
38 ;; FIXME: avoid cyclical references
39 (append (doc-markup-function-properties prop-spec)
41 (or properties (list)))
44 (define (doc-markup-function func)
45 (let* ((doc-str (procedure-documentation func))
46 (f-name (symbol->string (procedure-name func)))
47 (c-name (regexp-substitute/global #f "-markup(-list)?$" f-name 'pre "" 'post))
48 (sig (object-property func 'markup-signature))
49 (arg-names (let ((arg-list (cadr (procedure-source func))))
51 (map symbol->string (cddr arg-list))
52 (make-list (length sig) "arg"))))
53 (sig-type-names (map type-name sig))
56 (map (lambda (x) (string-append
57 "@var{" (car x) "} (" (cadr x) ")" ))
58 (zip arg-names sig-type-names))
62 "\n\n@item @code{\\" c-name "} " signature-str
63 "\n@funindex \\" c-name "\n"
64 "\n@cindex \\" c-name "\n"
68 (let ((prop-strings (doc-markup-function-properties func)))
69 (if (null? prop-strings)
71 (string-append "\n\n\nUsed properties:\n@itemize\n"
72 (apply string-append prop-strings)
73 "@end itemize\n"))))))
75 (define (markup-function<? a b)
76 (ly:string-ci<? (symbol->string (procedure-name a)) (symbol->string (procedure-name b))))
78 (define (markup-category-doc-node category)
79 (let* ((category-string (symbol->string category))
80 (category-name (string-capitalize (regexp-substitute/global #f
81 "-" category-string 'pre " " 'post)))
82 (markup-functions (hash-fold (lambda (markup-function dummy functions)
83 (cons markup-function functions))
85 (hashq-ref markup-functions-by-category
94 (map doc-markup-function
95 (sort markup-functions markup-function<?)))
98 (define (markup-doc-node)
101 #:name "Text markup commands"
103 #:text "The following commands can all be used inside @code{\\markup @{ @}}."
104 #:children (let* (;; when a new category is defined, update `ordered-categories'
105 (ordered-categories '(font align graphic music instrument-specific-markup other))
106 (raw-categories (hash-fold (lambda (category functions categories)
107 (cons category categories))
109 markup-functions-by-category))
110 (categories (append ordered-categories
111 (filter (lambda (cat)
112 (not (memq cat ordered-categories)))
114 (map markup-category-doc-node categories))))
116 (define (markup-list-doc-string)
120 (map doc-markup-function
121 (sort (hash-fold (lambda (markup-list-function dummy functions)
122 (cons markup-list-function functions))
124 markup-list-functions)