2 ;;; backend-documentation-lib.scm -- Functions for backend documentation
4 ;;; source file of the GNU LilyPond music typesetter
6 ;;; (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 ;;; Jan Nieuwenhuizen <janneke@gnu.org>
10 ;;; This file generates documentation for the backend of lilypond.
12 ;; alist of property descriptions
13 ;; when called by First level Interface description, desc == '()
14 ;; CDR "not set" is only used for Second level Element description
15 (define (document-element-property prop desc)
16 (let ((handle (assoc (car prop) desc)))
18 (string-append "@code{" (symbol->string (car prop)) "} "
19 "(" (type-name (cadr prop)) ")"
20 (if (equal? desc '()) "" ":"))
21 (string-append (if (equal? desc '())
24 (string-append (caddr prop)
25 "\ndefault value: @code{"
26 (scm->string (cdr handle))
30 ;; First level Interface description
31 ;; Second level, part of element description
32 (define (document-interface level interface element-description)
33 (let* ((name (car interface))
34 (desc (cadr interface))
35 (props (caddr interface))
36 (docs (map (lambda (x)
37 (document-element-property x element-description))
41 (section level (string-append (interface-name (symbol->string name))))
45 ;; filter-out entries with CDR "not set"
48 (if (string-match "not set" (cdr x)) '() (list x)))
51 ;; First level Interface description
52 (define (document-separate-interface interface)
53 (let ((name (car interface)))
56 (node (interface-name name))
57 (document-interface 2 interface '()))))
59 ;; First level element description
60 (define (document-element iname description)
62 (let* ((metah (assoc 'meta description))
64 (meta (if (pair? metah)
66 '((properties . ()) (name . "huh?"))
69 (name (cdr (assoc 'name meta)))
70 (ifaces (cdr (assoc 'interface-descriptions meta)))
71 (ifacedoc (map (lambda (x) (document-interface 3 x description))
75 (node (element-name name))
76 (section 2 (element-name name))
79 (let* ((element (string->symbol name))
83 (let ((engraver (car x))
85 (if (member element objs)
88 engraver-description-alist))))
90 name " elements are created by: "
91 (human-listify (map reffy (map engraver-name engravers)))))
93 (apply string-append ifacedoc))))
96 (define (document-all-elements name)
97 (let* ((doc (apply string-append
98 (map (lambda (x) (document-element (car x) (cdr x)))
99 all-element-descriptions)))
100 (names (map car all-element-descriptions)))
103 (texi-node-menu name (map (lambda (x) (cons (element-name x) ""))
107 ;; testin.. -- how to do this
108 (eval-string (ly-gulp-file "interface.scm"))
109 (define xinterface-description-alist
111 (general-element . ,general-element-interface)
112 (beam . ,beam-interface)
113 (clef . ,clef-interface)
114 (slur . ,slur-interface)
117 ;; burp, need these for running outside of LilyPond
121 (debug-enable 'backtrace)
123 (define (number-pair? x)
124 (and (pair? x) (number? (car x)) (number? (cdr x))))
126 (define (ly-gulp-file x) "")
127 (define (ly-element? x) #f)
128 (define (ly-input-location? x) #f)
130 (define (moment? x) #f)
133 (use-modules (ice-9 string-fun))
134 (define (list-interface-names)
135 (let* ((text (string-append (ly-gulp-file "interface.scm") "\n(define "))
137 "\n[(](define *([a-z-]*-interface)*)*[^\n]*"))
138 (t (regexp-substitute/global #f r text 2 " " 'post))
139 (ugh (regexp-substitute/global #f "#f *" t 'pre 'post))
140 (l (separate-fields-discarding-char #\ ugh list)))
141 (reverse (cdr (reverse l)))))
143 (eval (ly-gulp-file "interface.scm"))
145 (define interface-description-alist
146 (map (lambda (x) (cons (string->symbol x) (eval-string x)))
147 (list-interface-names)))
149 (define (document-all-interfaces name)
151 (texi-node-menu name (map (lambda (x) (cons (interface-name x) ""))
152 (map cadr interface-description-alist)))
154 (map document-separate-interface
155 (map cdr interface-description-alist)))))