]> git.donarmstrong.com Git - lilypond.git/blob - scm/backend-documentation-lib.scm
patch::: 1.3.103.jcn3
[lilypond.git] / scm / backend-documentation-lib.scm
1
2 ;;; backend-documentation-lib.scm -- Functions for backend documentation
3 ;;;
4 ;;; source file of the GNU LilyPond music typesetter
5 ;;; 
6 ;;; (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 ;;; Jan Nieuwenhuizen <janneke@gnu.org>
8
9
10 ;;; This file generates documentation for the backend of lilypond.
11
12
13 ;; alist of property descriptions
14 (define (document-element-property prop desc)
15   (let ((handle (assoc (car prop) desc)))
16     (cons
17      (string-append
18       "@code{" (symbol->string (car prop)) "} "
19       "(" (type-name (cadr prop)) "):")
20      (string-append
21       (caddr prop)
22       "\ndefault value: @code{"
23       (if (pair? handle)
24           (scm->string (cdr handle))
25           "not set" )
26       "}"))))
27
28 ;; Second level, part of element description
29 (define (document-interface interface element-description)
30   (let* ((name (car interface))
31          (desc (cadr interface))
32          (props (caddr interface))
33          (docs (map (lambda (x)
34                       (document-element-property x element-description))
35                     props)))
36
37     (string-append
38      (section 2 (string-append "Interface: " (symbol->string name)))
39      desc
40      (description-list docs))))
41
42 ;; First level element description
43 (define (document-element iname description)
44   (display (string-append "\nProcessing " iname " ... ") (current-error-port))
45   (let* ((metah (assoc 'meta description))
46          
47          (meta (if (pair? metah)
48                    (cdr metah)
49                    '((properties . ()) (name . "huh?"))
50                    ))
51          
52          (name (cdr (assoc 'name meta)))
53          (ifaces (cdr (assoc 'interface-descriptions meta)))
54          (ifacedoc (map (lambda (x) (document-interface x description))
55                                 (reverse ifaces))))
56     
57     (string-append
58      (node (element-name name))
59      (section 2 (element-name name))
60      "\n"
61
62      (let* ((element (string->symbol name))
63             (engravers
64              (apply append
65                     (map (lambda (x)
66                            (let ((engraver (car x))
67                                  (objs (cadddr x)))
68                              (if (member element objs)
69                                  (list engraver)
70                                  '())))
71                          engraver-description-alist))))
72        (string-append
73         name " elements are created by: "
74         (human-listify (map reffy (map engraver-name engravers)))))
75
76      (apply string-append ifacedoc))))
77      
78
79 (define (document-all-elements name)
80   (let* ((doc (apply string-append
81                      (map (lambda (x) (document-element (car x) (cdr x)))
82                           all-element-descriptions)))
83          (names (map car all-element-descriptions)))
84
85     (string-append
86      (texi-node-menu name (map (lambda (x) (cons (element-name x) ""))
87                                names))
88      doc)))