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 (document-element-property property-def element-description only-doc-if-set)
18 (handle (assoc (car property-def) element-description))
19 (def-val-str (if (eq? handle #f)
21 (scm->texi (cdr handle))))
23 (name (symbol->string (car property-def)))
24 (type (type-name (cadr property-def)))
25 (desc (caddr property-def))
28 (if (and (eq? handle #f) only-doc-if-set)
30 (cons (string-append "@code{" name "} "
39 (define (document-interface where interface element-description)
43 (let* ((level (if (eq? where 'element) 3 2))
44 (name (car interface))
45 (desc (cadr interface))
46 (props (caddr interface))
48 (document-element-property
49 x element-description (eq? where 'element))))
50 (docs (map docfun props))
54 (texi-section level (string-append (interface-name (symbol->string name))) (eq? where 'element)) ;gur.
57 (description-list->texi docs)
60 ;; First level Interface description
61 (define (document-separate-interface interface)
62 (let ((name (car interface)))
65 (node (interface-name name))
66 (document-interface 'self interface '()))))
68 ;; First level element description
69 (define (document-element iname description)
71 (let* ((metah (assoc 'meta description))
73 (meta (if (pair? metah)
75 '((properties . ()) (name . "huh?"))
78 (name (cdr (assoc 'name meta)))
79 (ifaces (cdr (assoc 'interface-descriptions meta)))
80 (ifacedoc (map (lambda (x) (document-interface 'element x description))
84 (node (element-name name))
85 (texi-section 2 (element-name name) #f)
88 (let* ((element (string->symbol name))
92 (let ((engraver (car x))
94 (if (member element objs)
97 engraver-description-alist))))
99 name " elements are created by: "
100 (human-listify (map reffy (map engraver-name engravers)))))
102 (apply string-append ifacedoc))))
105 (define (document-all-elements name)
106 (let* ((doc (apply string-append
107 (map (lambda (x) (document-element (car x) (cdr x)))
108 all-element-descriptions)))
109 (names (map car all-element-descriptions)))
112 (texi-node-menu name (map (lambda (x) (cons (element-name x) ""))
116 ;; testin.. -- how to do this
117 (eval-string (ly-gulp-file "interface.scm"))
118 (define xinterface-description-alist
120 (general-element . ,general-element-interface)
121 (beam . ,beam-interface)
122 (clef . ,clef-interface)
123 (slur . ,slur-interface)
126 ;; burp, need these for running outside of LilyPond
130 (debug-enable 'backtrace)
132 (define (number-pair? x)
133 (and (pair? x) (number? (car x)) (number? (cdr x))))
135 (define (ly-gulp-file x) "")
136 (define (ly-element? x) #f)
137 (define (ly-input-location? x) #f)
139 (define (moment? x) #f)
142 (use-modules (ice-9 string-fun))
144 (define interface-file-str (string-append (ly-gulp-file "interface.scm") "\n(define "))
145 (define (list-interface-names)
146 (let* ((text interface-file-str)
148 "\n[(](define *([a-z-]*-interface)*)*[^\n]*"))
149 (t (regexp-substitute/global #f r text 2 " " 'post))
150 (ugh (regexp-substitute/global #f "#f *" t 'pre 'post))
151 (l (separate-fields-discarding-char #\ ugh list)))
152 (reverse (cdr (reverse l)))))
154 (eval (ly-gulp-file "interface.scm"))
156 (define interface-description-alist
157 (map (lambda (x) (cons (string->symbol x) (eval-string x)))
158 (list-interface-names)))
160 (define (document-all-interfaces name)
162 (texi-node-menu name (map (lambda (x) (cons (interface-name x) ""))
163 (map cadr interface-description-alist)))
165 (map document-separate-interface
166 (map cdr interface-description-alist)))))