]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/documentation-lib.scm
* tex/GNUmakefile (TEX_FILES): add texinfo.cnf
[lilypond.git] / scm / documentation-lib.scm
index dd863c9b1760c5ee3ab4db359234d84e022cda3a..4f7a0f05948dacb9c3c067230f0809eb46c7cda2 100644 (file)
@@ -1,22 +1,49 @@
-;;;
-;;; documentation-lib.scm -- Assorted Functions for generated documentation
-;;;
-;;; source file of the GNU LilyPond music typesetter
-;;; 
-;;; (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-;;; Jan Nieuwenhuizen <janneke@gnu.org>
-
-(define (uniqued-alist  alist acc)
-  (if (null? alist) acc
-      (if (assoc (caar alist) acc)
-         (uniqued-alist (cdr alist) acc)
-         (uniqued-alist (cdr alist) (cons (car alist) acc)
-  ))))
-
-
-(define (alist<? x y)
-  (string<? (symbol->string (car x))
-           (symbol->string (car y))))
+;;;;
+;;;; documentation-lib.scm -- Assorted Functions for generated documentation
+;;;;
+;;;; source file of the GNU LilyPond music typesetter
+;;;; 
+;;;; (c)  2000--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
+
+(use-modules (oop goops)
+            (srfi srfi-13)
+            (srfi srfi-1)
+            )
+
+(define-class <texi-node> ()
+  (children #:init-value '() #:accessor node-children #:init-keyword #:children)
+  (text #:init-value "" #:accessor node-text #:init-keyword #:text)
+  (name #:init-value "" #:accessor node-name #:init-keyword #:name)
+  (description #:init-value "" #:accessor node-desc #:init-keyword #:desc)
+  )
+
+(define (menu-entry x)
+  (cons
+   (node-name x)
+   (node-desc x))
+  )
+
+(define (dump-node node port level)
+  (display
+   (string-append
+    "\n@node "
+    (node-name node)
+    "\n\n"
+    (texi-section-command level) " "
+    (node-name node)
+    "\n\n"
+    (node-text node)
+    "\n\n"
+    (if (pair? (node-children node))
+       (texi-menu
+        (map (lambda (x) (menu-entry x) )
+             (node-children node)))
+        ""))
+   port)
+  (map (lambda (x) (dump-node x port (+ 1 level)))
+        (node-children node))
+  )
 
 (define (processing name)
   (display (string-append "\nProcessing " name " ... ") (current-error-port)))
 
 (define (texify x)
   x)
-;;  (let*
-;;     ((x1 (regexp-substitute/global #f "\([^@]\){" x 'pre "\1@{" 'post))
-;;      ((x2 (regexp-substitute/global #f "\([^@]\){" x 'pre "\1@{" 'post))
-;;      ((x3 (regexp-substitute/global #f "\([^@]\)@" x 'pre "\1@@" 'post))
-;;       )
-;;    x2))
-
-
 
 (define (scm->texi x)
   (string-append "@code{" (texify (scm->string x)) "}")
   )
 
+
+;;
+;; don't confuse users with #<procedure .. > syntax. 
+;; 
 (define (scm->string val)
-  (string-append
-   (if (self-evaluating? val) "" "'")
-   (call-with-output-string (lambda (port) (display val port)))
-  ))
+  (if (and (procedure? val) (symbol? (procedure-name val)))
+      (symbol->string (procedure-name val))
+      (string-append
+       (if (self-evaluating? val) "" "'")
+       (call-with-output-string (lambda (port) (display val port)))
+       )))
 
-(define (node name)
-  (string-append
-   "\n@html"
-   "\n<hr>"
-   "\n@end html"
-   "\n@node " name))
 
-(define texi-section-alist
-  '(
+(define (texi-section-command level)
+  (cdr (assoc level '(
     ;; Hmm, texinfo doesn't have ``part''
     (0 . "@top")
     (1 . "@unnumbered")
     (3 . "@unnumberedsubsec")
     (4 . "@unnumberedsubsubsec")
     (5 . "@unnumberedsubsubsec")
-    ))
-    
-(define (texi-section level name ref)
-  "texi sectioning command (lower LEVEL means more significant).
-Add a ref if REF is set
-"
-     
-  (string-append
-   "\n" (cdr (assoc level texi-section-alist)) " "
-   (if ref
-       (string-append "@ref{" name "}") 
-       name)
-   "\n"))
-
+    ))))
 
 (define (one-item->texi label-desc-pair)
   "Document one (LABEL . DESC); return empty string if LABEL is empty string. 
@@ -86,36 +92,49 @@ Add a ref if REF is set
 
 
 (define (description-list->texi items-alist)
-  "Document ITEMS-ALIST in a table. entries contain (item-label . string-to-use)
+  "Document ITEMS-ALIST in a table. entries contain (item-label
+. string-to-use)
 "
   (string-append
-   "\n@table @samp\n"
+   "\n@table @asis\n"
    (apply string-append (map one-item->texi items-alist))
    "\n@end table\n"))
 
 (define (texi-menu items-alist)
+  "Generate what is between @menu and @end menu."
+  (let
+      (
+       (maxwid (apply max (map (lambda (x) (string-length (car x)))
+                              items-alist)))
+       )
+    
+
+    
   (string-append
   "\n@menu"
   (apply string-append
-        (map (lambda (x) (string-append "\n* " (car x) ":: " (cdr x)))
+        (map (lambda (x)
+               (string-append
+               (string-pad-right 
+                (string-append "\n* " (car x) ":: ")
+                (+ maxwid 8)
+                )
+               (cdr x))
+               )
              items-alist))
   "\n@end menu\n"
   ;; Menus don't appear in html, so we make a list ourselves
   "\n@ignore\n"
   "\n@ifhtml\n"
-  (description-list->texi (map (lambda (x) (cons (reffy (car x)) (cdr x)))
+  (description-list->texi (map (lambda (x) (cons (ref-ify (car x)) (cdr x)))
                         items-alist))
   "\n@end ifhtml\n"
-  "\n@end ignore\n"))
+  "\n@end ignore\n")))
 
   
-(define (texi-node-menu name items-alist)
-  (string-append
-   (node name)
-   (texi-section 1 name #f)
-   (texi-menu items-alist)))
 
-(define (texi-file-head name file-name top items-alist)
+
+(define (texi-file-head name file-name top)
   (string-append
    "\\input texinfo @c -*-texinfo-*-"
    "\n@setfilename " file-name ".info"
@@ -123,31 +142,35 @@ Add a ref if REF is set
    "\n@dircategory GNU music project"
    "\n@direntry"
    ;; prepend GNU for dir, must be unique
-   "\n* GNU " name " (" file-name ").           " name "."
+   "\n* GNU " name ": (" file-name ").          " name "."
    "\n@end direntry"
-   (node "Top") ",(lilypond)Features,," top
-   "\n@top"
-   (texi-section 1 name #f)
-   (texi-menu items-alist)
-   "\n@contents"
+   "@documentlanguage en\n"
+   "@documentencoding ISO-8859-1\n"
+
    ))
 
+
 (define (context-name name)
-  (string-append "Context " name))
+  name)
 
 (define (engraver-name name)
   name)
 
 (define (grob-name name)
-  (string-append "Grob " name))
+  (if (symbol? name)
+      (symbol->string name)
+      name))
 
 (define (interface-name name)
   name)
 
-(define (reffy x)
+(define (ref-ify x)
+  "Add ref to X"
   (string-append "@ref{" x "}"))
 
 (define (human-listify l)
+  "Produce a textual enumeration from L, a list of strings"
+  
   (cond
    ((null? l) "none")
    ((null? (cdr l)) (car l))
@@ -157,3 +180,43 @@ Add a ref if REF is set
 
 (define (writing-wip x)
   (display (string-append "\nWriting " x " ... ") (current-error-port)))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; property  stuff.
+
+(define (property->texi where sym . rest)
+  "Document SYM for WHERE (which can be translation, backend, music),
+with init values from ALIST (1st optional argument)
+"
+  (let* ((name (symbol->string sym))
+        (alist (if (pair? rest) (car rest) '()))
+        (type?-name (string->symbol
+                     (string-append (symbol->string where) "-type?")))
+        (doc-name (string->symbol                  
+                   (string-append (symbol->string where) "-doc")))
+        (type (object-property sym type?-name))
+        (typename (type-name type))
+        (desc (object-property sym doc-name))
+        (handle (assoc sym alist))
+        )
+
+    (if (eq? desc #f)
+       (error "No description for property ~S" sym))
+       
+    (cons
+     (string-append "@code{" name "} "
+                   "(" typename ")"
+                   (if handle
+                       (string-append
+                        ":\n\n"
+                        (scm->texi (cdr handle))
+                        "\n\n")
+                       "")
+                                   
+
+                   )
+     desc)
+     
+    ))
+