]> git.donarmstrong.com Git - lilypond.git/blob - scm/backend-documentation-lib.scm
* VERSION (MY_PATCH_LEVEL): make 1.7.0
[lilypond.git] / scm / backend-documentation-lib.scm
1 ;;; backend-documentation-lib.scm -- Functions for backend documentation
2 ;;;
3 ;;; source file of the GNU LilyPond music typesetter
4 ;;; 
5 ;;; (c) 2000--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
6 ;;; Jan Nieuwenhuizen <janneke@gnu.org>
7
8
9 ;;; This file generates documentation for the backend of lilypond.
10
11 ;; alist of property descriptions
12
13
14 ;;;;;; TODO: sort out symbol vs. string stuff.
15 ;;;;;; TODO: use flatten write iso. string-append; might be possible to fold
16 ;;;;;; in symbol->string integrally.
17
18 (define (backend-property->texi sym)
19   (let* ((name (symbol->string sym))
20         (type (object-property sym 'backend-type?))
21         (typename (type-name type))
22         (desc (object-property sym 'backend-doc)))
23
24
25     (if (equal? desc #f)
26         (error "Unknown property " sym)
27         
28         (cons (string-append "@code{" name "} "
29                        "(" typename ")"
30                        ": "
31
32 ; index gets too messy
33 ;                      "@vindex " name "\n"
34                        )
35           desc))))
36
37 (define (document-grob-property sym grob-description )
38   "Document SYM, filling in default values."
39   (let* ((handle (assoc sym grob-description))
40          (defval (if (eq? handle #f)
41                      "(unset)"
42                    (scm->texi (cdr handle))))
43          (propdoc (backend-property->texi sym)))
44
45     (cons (car propdoc) (string-append (cdr propdoc)
46                                            "\nDefault value: "
47                                            defval)))
48   )
49
50 (define (document-interface where interface grob-description)
51
52   (let* ((level (if (eq? where 'grob) 3 2))
53          (name (car interface))
54          (desc (cadr interface))
55          (props (sort (caddr interface) symbol<?))
56          (docfunc (lambda (pr)
57                     (document-grob-property
58                      pr grob-description )))
59          (docs (map docfunc props)))
60
61     (string-append
62      (texi-section level
63                    (string-append (interface-name (symbol->string name)))
64                    (eq? where 'grob)) ;gur.
65      desc
66      (description-list->texi docs))))
67
68 ;; First level Interface description
69 (define (document-separate-interface interface)
70   (let ((name (symbol->string (car interface))))
71     (processing name)
72     (string-append
73      (node (interface-name name))
74      (document-interface 'self interface '()))))
75
76
77 ;; First level grob description
78 (define (document-grob iname description)
79   (processing iname)
80   (let* ((metah (assoc 'meta description))
81          
82          (meta (cdr metah))
83          (name (cdr (assoc 'name meta)))
84          (ifaces (map lookup-interface (cdr (assoc 'interfaces meta))))
85          (ifacedoc (map (lambda (iface)
86                           (document-interface 'grob iface description))
87                         (reverse ifaces)))
88          )
89
90     
91     (string-append
92      (node (grob-name name))
93      (texi-section 2 (grob-name name) #f)
94      "\n"
95      (let* ((grob name)
96             (engravers (filter-list
97                         (lambda (x) (engraver-makes-grob? name x)) all-engravers-list))
98             (engraver-names (map ly-translator-name engravers))
99             )
100
101        (string-append
102         (symbol->string name) " grobs are created by: "
103         (human-listify (map ref-ify
104                             (map engraver-name engraver-names)))))
105
106             (apply string-append ifacedoc))))
107
108
109
110 (define (engraver-makes-grob? name-symbol grav)
111   (memq name-symbol (assoc 'grobs-created (ly-translator-description grav)))
112   )
113
114 (define (document-all-grobs name)
115   (let* ((doc (apply string-append
116                      (map (lambda (x)
117                             (document-grob (symbol->string (car x)) (cdr x)))
118                           all-grob-descriptions)))
119          (names (map symbol->string (map car all-grob-descriptions))))
120
121     (string-append
122      (texi-node-menu name (map (lambda (x) (cons (grob-name x) ""))
123                                names))
124      doc)))
125
126 ;; ugh, this works standalone, but not anymore with lily
127 (if (not (defined? 'standalone))
128     (begin
129
130       (load "standalone.scm")
131
132       (define (number-pair?  x)
133         (and (pair? x) (number? (car x)) (number? (cdr x))))
134       (define (ly-grob? x) #f)
135       (define (ly-input-location? x) #f)
136       (define (dir? x) #f)
137       (define (moment? x) #f)
138       ))
139
140 (use-modules (ice-9 string-fun))
141
142 (if standalone
143   (begin
144     (display "(define (list-interface-names) '") 
145     (write (ugh-standalone-list-interface-names))
146     (display ")")
147     (exit 0)))
148
149
150 (define interface-description-alist
151   (hash-fold
152    (lambda (key val prior)
153      (cons (cons key val)  prior)
154      )
155    '() (ly-all-grob-interfaces)))
156
157 (set! interface-description-alist (sort interface-description-alist alist<?))
158
159
160 ;;;;;;;;;; check for dangling backend properties.
161 (define (mark-interface-properties entry)
162   (map (lambda (x) (set-object-property! x  'iface-marked #t)) (caddr (cdr entry)))
163   )
164
165 (map mark-interface-properties interface-description-alist)
166
167 (define (check-dangling-properties prop)
168   (if (not (object-property prop 'iface-marked))
169       (error  "\nDangling property: "  prop))
170   )
171
172 (map check-dangling-properties all-backend-properties)
173
174 ;;;;;;;;;;;;;;;;
175
176 (define (lookup-interface name)
177   (let*  (
178           (entry  (hashq-ref (ly-all-grob-interfaces) name #f))
179           )
180
181     (if (equal? entry #f)
182         (error "Unknown interface" name))
183     
184     entry
185 ))
186
187 ;(write  (map car  interface-description-alist) (current-error-port))
188 ;(display  (lookup-interface 'accidental-placement-interface))
189 ;(display  (document-all-grobs "OO" ))
190
191 (define (document-all-interfaces name)
192   (string-append
193    (texi-node-menu name (map (lambda (x)
194                                (cons (interface-name (symbol->string x)) ""))
195                              (map cadr interface-description-alist)))
196    (apply string-append
197           (map document-separate-interface
198                (map cdr interface-description-alist)))))
199
200 (define (document-all-backend-properties name)
201   (let*
202       (
203        (ps (sort (map symbol->string all-backend-properties) string<?))
204        (descs (map (lambda (prop)
205                      (backend-property->texi (string->symbol prop)))
206                    ps))
207        (texi (description-list->texi descs))
208        )
209     
210      texi
211   )
212   )
213
214 ;;;;;;;;;;;;;;;;
215