]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/document-backend.scm
Run `make grand-replace'.
[lilypond.git] / scm / document-backend.scm
index 58dd67cb42fc09b7a3fd66bdf9b728c5c11652b0..b70b1d6969b249b4a887a0b5fb5cc8f3ea94fba8 100644 (file)
-;;; backend-documentation-lib.scm -- Functions for backend documentation
-;;;
-;;; source file of the GNU LilyPond music typesetter
-;;; 
-;;; (c)  2000--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-;;; Jan Nieuwenhuizen <janneke@gnu.org>
-
-
-;;; This file generates documentation for the backend of lilypond.
-
-;; alist of property descriptions
-
-;;
-"
-TODO:
-
-
-Grob bla
-
-Created by:
-
-  * preset properties + explanation
-
-Interfaces:
-
-  * properties available.
-
-"
-
+;;;; backend-documentation-lib.scm -- Functions for backend documentation
+;;;;
+;;;; source file of the GNU LilyPond music typesetter
+;;;;
+;;;; (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define (interface-doc-string interface grob-description)
-  (let*
-      ((name (car interface))
-       (desc (cadr interface))
-       (props (sort (caddr interface) symbol<?))
-       (docfunc (lambda (pr)
-                 (document-property
-                  pr 'backend grob-description)))
-       (propdocs (map docfunc props)))
+  (let* ((name (car interface))
+        (desc (cadr interface))
+        (props (sort (caddr interface) symbol<?))
+        (docfunc (lambda (pr)
+                   (property->texi
+                    'backend pr grob-description)))
+        (iprops (filter (lambda (x) (object-property x 'backend-internal))
+                        props))
+        (uprops (filter
+                 (lambda (x) (not (object-property x 'backend-internal)))
+                 props))
+        (user-propdocs (map docfunc uprops))
+        (internal-propdocs (map docfunc iprops)))
+
     (string-append
      desc
-     "\n\n"
-     (description-list->texi propdocs))
-    ))
 
+     (if (pair? uprops)
+        (string-append
+         "\n\n@subsubheading User settable properties:\n"
+         (description-list->texi user-propdocs #t))
+        "")
+
+     (if (pair? iprops)
+        (string-append
+         "\n\n@subsubheading Internal properties:\n"
+         (description-list->texi internal-propdocs #t))
+        ""))))
 
 (define iface->grob-table (make-vector 61 '()))
 ;; extract ifaces, and put grob into the hash table.
 (map
  (lambda (x)
-   (let*
-       (
-       (metah (assoc 'meta (cdr x)))
-       (meta (cdr metah))
-       (ifaces (cdr (assoc 'interfaces meta)))
-       )
+   (let* ((metah (assoc 'meta (cdr x)))
+         (meta (cdr metah))
+         (ifaces (cdr (assoc 'interfaces meta))))
 
      (map (lambda (iface)
            (hashq-set!
             iface->grob-table iface
             (cons (car x)
-                  (hashq-ref iface->grob-table iface '())
-                  )))
-         ifaces)
-     ))
+                  (hashq-ref iface->grob-table iface '()))))
+         ifaces)))
  all-grob-descriptions)
 
 ;; First level Interface description
 (define (interface-doc interface)
-  (let ((name (symbol->string (car interface))))
+  (let* ((name (symbol->string (car interface)))
+        (interface-list (human-listify
+                         (map ref-ify
+                              (sort
+                               (map symbol->string
+                                    (hashq-ref iface->grob-table
+                                               (car interface)
+                                               '()))
+                               string<?)))))
     (make <texi-node>
       #:name name
       #:text (string-append
-             (interface-doc-string (cdr interface) #f)
+             (interface-doc-string (cdr interface) '())
              "\n\n"
-             "This grob interface is used in the following graphical objects: "
-
-             (human-listify
-              (map ref-ify
-                   (map symbol->string
-                        (hashq-ref iface->grob-table (car interface) '() )))))
-
-      )))
+             "This grob interface "
+             (if (equal? interface-list "none")
+                 "is not used in any graphical object"
+                 (string-append
+                  "is used in the following graphical object(s): "
+                  interface-list))
+             "."))))
+
+(define (grob-alist->texi alist)
+  (let* ((uprops (filter (lambda (x) (not (object-property x 'backend-internal)))
+                        (map car alist))))
+
+    (description-list->texi
+     (map (lambda (y) (property->texi 'backend y alist))
+         uprops)
+     #t)))
 
 (define (grob-doc description)
   "Given a property alist DESCRIPTION, make a documentation
 node."
-  
-  (let*
-      (
-       (metah (assoc 'meta description))
-       
-       (meta (cdr metah))
-       (name (cdr (assoc 'name meta)))
-       (ifaces (map lookup-interface (cdr (assoc 'interfaces meta))))
-       (ifacedoc (map (lambda (iface)
-                       (string-append
-"
-@subsubheading "
-(ref-ify (symbol->string (car iface)))
-
-"\n\n"
-                       (interface-doc-string iface description)))
-                     (reverse ifaces)))
-       (engravers (filter
-                  (lambda (x) (engraver-makes-grob? name x)) all-engravers-list))
-       (namestr (symbol->string name))
-       (engraver-names (map symbol->string (map ly:translator-name engravers)))
-       )
+
+  (let* ((metah (assoc 'meta description))
+        (meta (cdr metah))
+        (name (cdr (assoc 'name meta)))
+        ;;       (bla (display name))
+        (ifaces (map lookup-interface (cdr (assoc 'interfaces meta))))
+        (ifacedoc (map (lambda (iface)
+                         (if (pair? iface)
+                             (ref-ify (symbol->string (car iface)))
+                             (ly:error (_ "pair expected in doc ~s") name)))
+                       (reverse ifaces)))
+        (engravers (filter
+                    (lambda (x) (engraver-makes-grob? name x))
+                    all-engravers-list))
+        (namestr (symbol->string name))
+        (engraver-names (map symbol->string
+                             (map ly:translator-name engravers)))
+        (engraver-list (human-listify
+                        (map ref-ify
+                             (map engraver-name engraver-names)))))
 
     (make <texi-node>
       #:name namestr
       #:text
       (string-append
-       namestr " grobs are created by: "
-       (human-listify (map ref-ify
-                          (map engraver-name engraver-names)))
-       (apply string-append ifacedoc)
-       ))
-    ))
+       namestr " objects "
+       (if (equal? engraver-list "none")
+          "are not created by any engraver"
+          (string-append
+           "are created by: "
+           engraver-list))
+       "."
+
+       "\n\nStandard settings:\n\n"
+       (grob-alist->texi description)
+       "\n\nThis object supports the following interface(s):\n"
+       (human-listify ifacedoc)
+       "."))))
 
 (define (all-grobs-doc)
   (make <texi-node>
     #:name "All layout objects"
-    #:desc "Description and defaults for all Grobs"
+    #:desc "Description and defaults for all graphical objects (grobs)."
     #:children
     (map (lambda (x) (grob-doc (cdr x)))  all-grob-descriptions)))
 
 (define interface-description-alist
   (hash-fold
    (lambda (key val prior)
-     (cons (cons key val)  prior)
-     )
+     (cons (cons key val)  prior))
    '() (ly:all-grob-interfaces)))
 
 (set! interface-description-alist (sort interface-description-alist alist<?))
 
-
 ;;;;;;;;;; check for dangling backend properties.
 (define (mark-interface-properties entry)
-  (map (lambda (x) (set-object-property! x  'iface-marked #t)) (caddr (cdr entry)))
-  )
+  (map (lambda (x) (set-object-property! x 'iface-marked #t))
+       (caddr (cdr entry))))
 
 (map mark-interface-properties interface-description-alist)
 
 (define (check-dangling-properties prop)
   (if (not (object-property prop 'iface-marked))
-      (error  "\ndefine-grob-properties.scm: Can't find interface for property:" prop)))
+      (ly:error (string-append "define-grob-properties.scm: "
+               (_ "cannot find interface for property: ~S")) prop)))
 
 (map check-dangling-properties all-backend-properties)
 
 ;;;;;;;;;;;;;;;;
 
 (define (lookup-interface name)
-  (let*  (
-         (entry  (hashq-ref (ly:all-grob-interfaces) name #f))
-         )
-
-    (if (equal? entry #f)
-       (error "Unknown interface" name))
-    
-    entry
-))
+  (let* ((entry (hashq-ref (ly:all-grob-interfaces) name #f)))
+    (if entry
+       entry
+       (ly:error (_ "unknown Grob interface: ~S") name))))
 
 (define (all-interfaces-doc)
   (make <texi-node>
     #:name "Graphical Object Interfaces"
-    #:desc "Building blocks of graphical objects"
+    #:desc "Building blocks of graphical objects."
     #:children
-    (map interface-doc interface-description-alist)
-    ))
-
-(define (all-backend-properties-doc)
-  (let*
-      (
-       (ps (sort (map symbol->string all-backend-properties) string<?))
-       (descs (map (lambda (prop)
-                    (document-property (string->symbol prop) 'backend #f))
-                  ps))
-       (texi (description-list->texi descs))
-       )
-    (make <texi-node>
-      #:name "All backend properties"
-      #:desc "All grob properties in a big list"
-      #:text texi)
-  ))
+    (map interface-doc interface-description-alist)))
+
+(define (backend-properties-doc-string lst)
+  (let* ((ps (sort (map symbol->string lst) string<?))
+        (descs (map (lambda (prop)
+                      (property->texi 'backend (string->symbol prop) '())) ps))
+        (texi (description-list->texi descs #f)))
+    texi))
 
-;(dump-node (grob-doc (cdadr all-grob-descriptions))  (current-output-port) 0 )
+;;(dump-node (grob-doc (cdadr all-grob-descriptions)) (current-output-port) 0 )
 (define (backend-doc-node)
   (make <texi-node>
     #:name "Backend"
-    #:desc "Reference for the layout engine"
+    #:desc "Reference for the layout engine."
     #:children
     (list
      (all-grobs-doc)
      (all-interfaces-doc)
-     (all-backend-properties-doc)
-     )
-  ))
+     (make <texi-node>
+       #:name "User backend properties"
+       #:desc "All tunable properties in a big list."
+       #:text (backend-properties-doc-string all-user-grob-properties))
+     (make <texi-node>
+       #:name "Internal backend properties"
+       #:desc "All internal layout properties in a big list."
+       #:text (backend-properties-doc-string all-internal-grob-properties)))))