1 ;;; backend-documentation-lib.scm -- Functions for backend documentation
3 ;;; source file of the GNU LilyPond music typesetter
5 ;;; (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
6 ;;; Jan Nieuwenhuizen <janneke@gnu.org>
9 ;;; This file generates documentation for the backend of lilypond.
11 ;; alist of property descriptions
14 (define (backend-property->texi sym)
16 (name (symbol->string sym))
17 (type (object-property sym 'backend-type?))
18 (typename (type-name type))
19 (desc (object-property sym 'backend-doc))
22 (cons (string-append "@code{" name "} "
28 (define (document-grob-property sym grob-description only-doc-if-set)
31 (handle (assoc sym grob-description))
32 (defval (if (eq? handle #f)
34 (scm->texi (cdr handle))
36 (propdoc (backend-property->texi sym))
39 (if (and only-doc-if-set (eq? handle #f) )
41 (cons (car propdoc) (string-append (cdr propdoc)
46 (define (document-interface where interface grob-description)
50 (let* ((level (if (eq? where 'grob) 3 2))
51 (name (car interface))
52 (desc (cadr interface))
53 (props (caddr interface))
55 (document-grob-property
56 x grob-description (eq? where 'grob))))
57 (docs (map docfunc props))
61 (texi-section level (string-append (interface-name (symbol->string name))) (eq? where 'grob)) ;gur.
64 (description-list->texi docs)
67 ;; First level Interface description
68 (define (document-separate-interface interface)
69 (let ((name (car interface)))
72 (node (interface-name name))
73 (document-interface 'self interface '()))))
75 ;; First level grob description
76 (define (document-grob iname description)
78 (let* ((metah (assoc 'meta description))
80 (meta (if (pair? metah)
82 '((properties . ()) (name . "huh?"))
85 (name (cdr (assoc 'name meta)))
86 (ifaces (cdr (assoc 'interface-descriptions meta)))
87 (ifacedoc (map (lambda (x) (document-interface 'grob x description))
91 (node (grob-name name))
92 (texi-section 2 (grob-name name) #f)
95 (let* ((grob (string->symbol name))
99 (let ((engraver (car x))
101 (if (member grob objs)
104 engraver-description-alist))))
106 name " grobs are created by: "
107 (human-listify (map reffy (map engraver-name engravers)))))
109 (apply string-append ifacedoc))))
112 (define (document-all-grobs name)
113 (let* ((doc (apply string-append
114 (map (lambda (x) (document-grob (car x) (cdr x)))
115 all-grob-descriptions)))
116 (names (map car all-grob-descriptions)))
119 (texi-node-menu name (map (lambda (x) (cons (grob-name x) ""))
123 ;; testin.. -- how to do this
124 (eval-string (ly-gulp-file "interface-description.scm"))
125 (define xinterface-description-alist
127 (general-grob . ,general-grob-interface)
128 (beam . ,beam-interface)
129 (clef . ,clef-interface)
130 (slur . ,slur-interface)
133 ;; burp, need these for running outside of LilyPond
137 (debug-enable 'backtrace)
139 (define (number-pair? x)
140 (and (pair? x) (number? (car x)) (number? (cdr x))))
142 (define (ly-gulp-file x) "")
143 (define (ly-grob? x) #f)
144 (define (ly-input-location? x) #f)
146 (define (moment? x) #f)
149 (use-modules (ice-9 string-fun))
151 (define interface-file-str (string-append (ly-gulp-file "interface-description.scm") "\n(define "))
153 (define (list-interface-names)
154 (let* ((text interface-file-str)
156 "\n[(](define *([a-z-]*-interface)*)*[^\n]*"))
157 (t (regexp-substitute/global #f r text 2 " " 'post))
158 (ugh (regexp-substitute/global #f "#f *" t 'pre 'post))
159 (l (separate-fields-discarding-char #\ ugh list)))
160 (reverse (cdr (reverse l)))))
165 (eval (ly-gulp-file "interface-description.scm"))
167 (define interface-description-alist
168 (map (lambda (x) (cons (string->symbol x) (eval-string x)))
169 (list-interface-names)))
171 (set! interface-description-alist (sort interface-description-alist alist<?))
173 (define (document-all-interfaces name)
175 (texi-node-menu name (map (lambda (x) (cons (interface-name x) ""))
176 (map cadr interface-description-alist)))
178 (map document-separate-interface
179 (map cdr interface-description-alist)))))
181 (define (document-all-backend-properties name)
184 (ps (sort (map symbol->string all-backend-properties) string<?))
185 (descs (map (lambda (prop)
186 (backend-property->texi (string->symbol prop)))
188 (texi (description-list->texi descs))
193 (texi-section 1 name #f)