]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/backend-documentation-lib.scm
* input/test/divisiones.ly: added
[lilypond.git] / scm / backend-documentation-lib.scm
index 33ca2f2a19aa68e040b2b9eb1b868ec3b2e4d00e..20a24dcc158d09c7600af48635d63aa09b56f8b7 100644 (file)
@@ -2,7 +2,7 @@
 ;;;
 ;;; source file of the GNU LilyPond music typesetter
 ;;; 
-;;; (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+;;; (c) 2000--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 ;;; Jan Nieuwenhuizen <janneke@gnu.org>
 
 
 
 ;; alist of property descriptions
 
-
-(define (document-element-property property-def element-description only-doc-if-set)
-  "
+;;
 "
-  (let* (
-       (handle (assoc (car property-def) element-description))
-       (def-val-str (if (eq? handle #f)
-                        "not set"
-                        (scm->texi (cdr handle))))
-                               
-       (name (symbol->string (car property-def)))
-       (type (type-name (cadr property-def)))
-       (desc (caddr property-def))
-       )
+TODO:
 
-    (if (and  (eq? handle #f) only-doc-if-set)
-       '("" . "")
-       (cons (string-append "@code{" name "} "
-                      "(" type ")"
-                      ":" )
-             (string-append desc
-                            "\nDefault value: "
-                            def-val-str))
-    ))
-  )
 
-(define (document-interface where interface element-description)
-  "
+Grob bla
+
+Created by:
+
+  * preset properties + explanation
+
+Interfaces:
+
+  * properties available.
 
 "
-  (let* ((level (if (eq? where 'element) 3 2))
-        (name (car interface))
-        (desc (cadr interface))
-        (props (caddr interface))
-        (docfun  (lambda (x)
-                   (document-element-property
-                    x element-description (eq? where 'element))))
-        (docs (map docfun props))
-        )
 
-    (string-append
-     (texi-section level (string-append (interface-name (symbol->string name))) (eq? where 'element)) ;gur.
-     desc
-     
-     (description-list->texi docs)
-     )))
 
-;; First level Interface description
-(define (document-separate-interface interface)
-  (let ((name (car interface)))
-    (processing name)
-    (string-append
-     (node (interface-name name))
-     (document-interface 'self interface '()))))
-
-;; First level element description
-(define (document-element iname description)
-  (processing iname)
-  (let* ((metah (assoc 'meta description))
-        
-        (meta (if (pair? metah)
-                  (cdr metah)
-                  '((properties . ()) (name . "huh?"))
-                  ))
-        
-        (name (cdr (assoc 'name meta)))
-        (ifaces (cdr (assoc 'interface-descriptions meta)))
-        (ifacedoc (map (lambda (x) (document-interface 'element x description))
-                       (reverse ifaces))))
+(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))
+       )
     
     (string-append
-     (node (element-name name))
-     (texi-section 2 (element-name name) #f)
-     "\n"
-
-     (let* ((element (string->symbol name))
-           (engravers
-            (apply append
-                   (map (lambda (x)
-                          (let ((engraver (car x))
-                                (objs (cadddr x)))
-                            (if (member element objs)
-                                (list engraver)
-                                '())))
-                        engraver-description-alist))))
-       (string-append
-       name " elements are created by: "
-       (human-listify (map reffy (map engraver-name engravers)))))
-
-     (apply string-append ifacedoc))))
-     
-
-(define (document-all-elements name)
-  (let* ((doc (apply string-append
-                    (map (lambda (x) (document-element (car x) (cdr x)))
-                         all-element-descriptions)))
-        (names (map car all-element-descriptions)))
+     desc
+     "\n\n"
+     (description-list->texi propdocs))
 
-    (string-append
-     (texi-node-menu name (map (lambda (x) (cons (element-name x) ""))
-                              names))
-     doc)))
-
-;; testin.. -- how to do this
-(eval-string (ly-gulp-file "interface.scm"))
-(define xinterface-description-alist
-  `(
-    (general-element . ,general-element-interface)
-    (beam . ,beam-interface)
-    (clef . ,clef-interface)
-    (slur . ,slur-interface)
     ))
 
-;; burp, need these for running outside of LilyPond
-(if #f
-    (begin
 
-      (debug-enable 'backtrace)
-
-      (define (number-pair?  x)
-       (and (pair? x) (number? (car x)) (number? (cdr x))))
-      
-      (define (ly-gulp-file x) "")
-      (define (ly-element? x) #f)
-      (define (ly-input-location? x) #f)
-      (define (dir? x) #f)
-      (define (moment? x) #f)
-      (load "lily.scm")))
+(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)))
+       )
 
-(use-modules (ice-9 string-fun))
+     (map (lambda (iface)
+           (hashq-set!
+            iface->grob-table iface
+            (cons (car x)
+                  (hashq-ref iface->grob-table iface '())
+                  )))
+         ifaces)
+     ))
+ all-grob-descriptions)
 
-(define interface-file-str (string-append (ly-gulp-file "interface.scm") "\n(define "))
-(define (list-interface-names)
-  (let* ((text interface-file-str)
-        (r (make-regexp 
-            "\n[(](define *([a-z-]*-interface)*)*[^\n]*"))
-        (t (regexp-substitute/global #f r text 2 " " 'post))
-        (ugh (regexp-substitute/global #f "#f *" t 'pre 'post))
-        (l (separate-fields-discarding-char #\  ugh list)))
-    (reverse (cdr (reverse l)))))
+;; First level Interface description
+(define (interface-doc interface)
+  (let ((name (symbol->string (car interface))))
+    (make <texi-node>
+      #:name name
+      #:text (string-append
+             (interface-doc-string (cdr interface) #f)
+             "\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) '() )))))
+
+      )))
+
+(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
+"@html
+<hr>
+@end html
+
+@subsubheading "
+(ref-ify (symbol->string (car iface)))
+
+"\n\n"
+                       (interface-doc-string iface description)))
+                     (reverse ifaces)))
+       (engravers (filter-list
+                  (lambda (x) (engraver-makes-grob? name x)) all-engravers-list))
+       (namestr (symbol->string name))
+       (engraver-names (map ly:translator-name engravers))
+       )
+
+    (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)
+       ))
+    ))
 
-(eval (ly-gulp-file "interface.scm"))
+(define (all-grobs-doc)
+  (make <texi-node>
+    #:name "All Graphical objects"
+    #:desc "Description and defaults for all Grobs"
+    #:children
+    (map (lambda (x) (grob-doc (cdr x)))  all-grob-descriptions)))
 
 (define interface-description-alist
-  (map (lambda (x) (cons (string->symbol x) (eval-string x)))
-            (list-interface-names)))
+  (hash-fold
+   (lambda (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 mark-interface-properties interface-description-alist)
+
+(define (check-dangling-properties prop)
+  (if (not (object-property prop 'iface-marked))
+      (error  "\ngrob-property-description.scm: Can't find interface for property:" prop)))
+
+(map check-dangling-properties all-backend-properties)
 
-(define (document-all-interfaces name)
-  (string-append
-   (texi-node-menu name (map (lambda (x) (cons (interface-name x) ""))
-                            (map cadr interface-description-alist)))
-   (apply string-append
-         (map document-separate-interface
-              (map cdr interface-description-alist)))))
+;;;;;;;;;;;;;;;;
 
+(define (lookup-interface name)
+  (let*  (
+         (entry  (hashq-ref (ly:all-grob-interfaces) name #f))
+         )
+
+    (if (equal? entry #f)
+       (error "Unknown interface" name))
+    
+    entry
+))
+
+(define (all-interfaces-doc)
+  (make <texi-node>
+    #:name "Graphical Object Interfaces"
+    #: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 "backend properties"
+      #:desc "all the properties in use as grob properties"
+      #:text texi)
+  ))
+
+;(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"
+    #:children
+    (list
+     (all-grobs-doc)
+     (all-interfaces-doc)
+     (all-backend-properties-doc)
+     )
+  ))