]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/documentation-lib.scm
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / scm / documentation-lib.scm
index 5bc447653120e3dca7e7edba5b188592d0e74cfe..5a62f9728c15a52244f06cdffea190cc14260b0a 100644 (file)
-;;;
-;;; 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)
-  ))))
+;;;;
+;;;; documentation-lib.scm -- Assorted Functions for generated documentation
+;;;;
+;;;; source file of the GNU LilyPond music typesetter
+;;;; 
+;;;; (c) 2000--2006 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)
+  (ly:message (_ "Processing ~S...") name))
 
 (define (self-evaluating? x)
   (or (number? x) (string? x) (procedure? x) (boolean? x)))
 
 (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->string val)
-  (string-append
-   (if (self-evaluating? val) "" "'")
-   (texify 
-    (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 section-alist
-  '(
-    ;; Hmm, texinfo doesn't have ``part''
-    (0 . "@top")
-    (1 . "@unnumbered")
-    (2 . "@unnumberedsec")
-    (3 . "@unnumberedsubsec")
-    (4 . "@unnumberedsubsubsec")
-    (5 . "@unnumberedsubsubsec")
-    ))
-    
-(define (section level name)
-  (string-append "\n" (cdr (assoc level section-alist)) " " name "\n"))
-   
-(define (description-list items-alist)
+(define (scm->texi x)
+  (string-append "@code{" (texify (scm->string x)) "}"))
+
+
+
+(define (texi-section-command level)
+  (cdr (assoc level '(
+                     ;; Hmm, texinfo doesn't have ``part''
+                     (0 . "@top")
+                     (1 . "@unnumbered")
+                     (2 . "@unnumberedsec")
+                     (3 . "@unnumberedsubsec")
+                     (4 . "@unnumberedsubsubsec")
+                     (5 . "@unnumberedsubsubsec")))))
+
+(define (one-item->texi label-desc-pair)
+  "Document one (LABEL . DESC); return empty string if LABEL is empty string. 
+"
+  (if (eq? (car label-desc-pair) "")
+      ""
+      (string-append "\n@item " (car label-desc-pair) "\n" (cdr label-desc-pair))))
+
+
+(define (description-list->texi items-alist)
+  "Document ITEMS-ALIST in a table. entries contain (item-label
+. string-to-use)
+"
   (string-append
-   "\n@table @samp\n"
-   (apply string-append
-         (map (lambda (x) (string-append "\n@item " (car x) "\n" (cdr x)))
-              items-alist))
+   "\n@table @asis\n"
+   (apply string-append (map one-item->texi items-alist))
    "\n@end table\n"))
 
 (define (texi-menu items-alist)
-  (string-append
-  "\n@menu"
-  (apply string-append
-        (map (lambda (x) (string-append "\n* " (car x) ":: " (cdr x)))
-             items-alist))
-  "\n@end menu\n"
-  ;; Menus don't appear in html, so we make a list ourselves
-  "\n@ifhtml\n"
-  (description-list (map (lambda (x) (cons (reffy (car x)) (cdr x)))
-                        items-alist))
-  "\n@end ifhtml\n"))
-
-  
-(define (texi-node-menu name items-alist)
-  (string-append
-   (node name)
-   (section 1 name)
-   (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
+                   (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 (ref-ify (car x)) (cdr x)))
+                                 items-alist))
+     "\n@end ifhtml\n"
+     "\n@end ignore\n")))
 
-(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"
-   "@settitle " name
+   "\\input texinfo @c -*-texinfo-*-"
    "\n@setfilename " file-name ".info"
-   (node "Top") top
-   "\n@top"
-   (section 1 name)
-   (texi-menu items-alist)))
+   "\n@settitle " name
+   "\n@dircategory GNU music project"
+   "\n@direntry"
+   ;; prepend GNU for dir, must be unique
+   "\n* GNU " name ": (" file-name ").          " name "."
+   "\n@end direntry\n"
+   "@documentlanguage en\n"
+   "@documentencoding utf-8\n"))
 
 (define (context-name name)
-  (string-append "Context " name))
+  name)
 
 (define (engraver-name name)
   name)
 
-(define (element-name name)
-  (string-append "Element " name))
+(define (grob-name 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)
+(define (human-listify lst)
+  "Produce a textual enumeration from LST, a list of strings"
+  
   (cond
-   ((null? l) "none")
-   ((null? (cdr l)) (car l))
-   ((null? (cddr l)) (string-append (car l) " and " (cadr l)))
-   (else (string-append (car l) ", " (human-listify (cdr l))))
-   ))
+   ((null? lst) "none")
+   ((null? (cdr lst)) (car lst))
+   ((null? (cddr lst)) (string-append (car lst) " and " (cadr lst)))
+   (else (string-append (car lst) ", " (human-listify (cdr lst))))))
 
 (define (writing-wip x)
-  (display (string-append "\nWriting " x " ... ") (current-error-port)))
+  (ly:message (_ "Writing ~S...") x))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; 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)
+       (ly:error (_ "can't find description for property ~S (~S)") sym where))
+    
+    (cons
+     (string-append "@code{" name "} "
+                   "(" typename ")"
+                   (if handle
+                       (string-append
+                        ":\n\n"
+                        (scm->texi (cdr handle))
+                        "\n\n")
+                       ""))
+     desc)))
+