]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/engraver-documentation-lib.scm
* input/test/divisiones.ly: added
[lilypond.git] / scm / engraver-documentation-lib.scm
index e886d6fb648ed22f7f4b9f5dea2a696d1fba3be4..dd2fd71b81e7ddf1b6df293229250299ffbb0c36 100644 (file)
 
-;;; engraver-documentation-lib.scm -- Functions for engraver documentation
+;;; engraver-doumentation-lib.scm -- Functions for engraver documentation
 ;;;
 ;;; 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>
 
 
-(eval-string (ly-gulp-file "translator-description.scm"))
+(define (engraver-makes-grob? name-symbol grav)
+  (memq name-symbol (assoc 'grobs-created (ly:translator-description grav)))
+  )
 
-;; alist of translater descriptions
-(define (document-translator-property sym)
-   (cons
-    (string-append
-     "@code{" (symbol->string sym) "} "
-     "(" (type-name (object-property sym 'translation-type?)) "):")
-    (object-property sym 'translation-doc)))
-
-;; First level Engraver description and
-;; second level Context description
-(define (document-engraver where engraver-descr)
+(define (engraver-accepts-music-type? name-symbol grav)
+  (memq name-symbol (assoc 'events-accepted (ly:translator-description grav)))
+
+  )
+
+(define (engraver-accepts-music-types? types grav)
+  (if (null? types)
+      #f
+      (or
+       (engraver-accepts-music-type? (car types) grav)
+       (engraver-accepts-music-types? (cdr types) grav)))
+  )
+
+(define (engraver-doc-string engraver in-which-contexts)
   (let* (
-        (level (if (eq? where 'context) 3 2))
-        (props (car (cdddr engraver-descr)))
-        (name (car engraver-descr))
-        (desc (cadr engraver-descr))
-        (objs (caddr engraver-descr))
+        (propsr (cdr (assoc 'properties-read (ly:translator-description engraver))))
+        (propsw (cdr (assoc 'properties-written (ly:translator-description engraver))))
+        (accepted  (cdr (assoc 'events-accepted (ly:translator-description engraver)))) 
+        (name (ly:translator-name engraver))
+        (name-sym (string->symbol name))
+        (desc (cdr (assoc 'description (ly:translator-description engraver))))
+        (grobs (engraver-grobs engraver))
         )
 
     (string-append
-     (texi-section level (engraver-name name) (eq? where 'context))
      desc
      "\n\n"
-     (if (null? props)
+     (if (pair? accepted)
+        (string-append
+         "Music types accepted:\n\n"
+         (human-listify
+          (map (lambda (x)
+                 (string-append
+                  "@ref{"
+                 (symbol->string x)
+                 "}")) accepted)
+          ))
+         "")
+     "\n\n"
+     (if (pair? propsr)
+        (string-append
+         "Properties (read)"
+         (description-list->texi
+          (map (lambda (x) (document-property x 'translation #f)) propsr)))
+        "")
+     
+     (if (null? propsw)
         ""
         (string-append
-         (texi-section (+ level 1) "Properties" #f)
+        "Properties (write)" 
          (description-list->texi
-          (map (lambda (x) (document-translator-property x)) props))))
-     (if  (null? objs)
+          (map (lambda (x) (document-property x 'translation #f)) propsw))))
+     (if  (null? grobs)
          ""
          (string-append
-          "This engraver creates \n "
-          (human-listify (map reffy (map grob-name objs)))
-          " grobs.")
+          "This engraver creates the following grobs: \n "
+          (human-listify (map ref-ify (uniq-list (sort  grobs string<? ))))
+          ".")
          )
 
      "\n\n"
 
-     (let* ((paper-alist (My_lily_parser::paper_description))
-           (context-description-alist (map cdr paper-alist))
-           (contexts
-            (apply append
-                   (map (lambda (x)
-                          (let ((context (cdr (assoc 'type-name x)))
-                                (consists (append
-                                           (list (cdr (assoc 'group-type x)))
-                                           (cdr (assoc 'consists x))
-                                           (cdr (assoc 'end-consists x)))))
-
-                            (if (member name consists)
-                                (list context)
-                                '())))
-                        context-description-alist))))
-       (string-append
-       name " is part of contexts: "
-       (human-listify (map reffy (map context-name contexts))))))))
+     (if in-which-contexts
+        (let* ((paper-alist (My_lily_parser::paper_description))
+               (context-description-alist (map cdr paper-alist))
+               (contexts
+                (apply append
+                       (map (lambda (x)
+                              (let ((context (cdr (assoc 'type-name x)))
+                                    (consists (append
+                                               (list (cdr (assoc 'group-type x)))
+                                               (cdr (assoc 'consists x))
+                                               (cdr (assoc 'end-consists x)))))
+
+                                (if (member name consists)
+                                    (list context)
+                                    '())))
+                            context-description-alist))))
+          (string-append
+           name " is part of contexts: "
+           (human-listify (map ref-ify (map context-name contexts)))))
+        ""
+        ))))
+
+
 
 
 ;; First level Engraver description
-(define (document-separate-engraver top description)
-  (let ((name (car description)))
-    (processing name)
-    (string-append
-     (node (engraver-name name))
-     (document-engraver 'self description))))
+(define (engraver-doc grav)
+  (make <texi-node>
+    #:name (ly:translator-name grav)
+    #:text (engraver-doc-string grav #t)
+    ))
 
 ;; Second level, part of Context description
+
+(define name->engraver-table (make-vector 61 '()))
+(map
+ (lambda (x)
+   (hash-set! name->engraver-table (ly:translator-name x) x))
+ (ly:get-all-translators))
+
+(define (find-engraver-by-name name)
+  (hash-ref name->engraver-table name #f))
+
 (define (document-engraver-by-name name)
   (let*
       (
-       (eg (assoc (string->symbol name) engraver-description-alist))
+       (eg (find-engraver-by-name name ))
        )
 
-    (if (eq? eg #f)
-       (string-append "Engraver " name ", not documented.\n")
-       (document-engraver 'context (cdr eg))
-       )
+    (cons name 
+         (engraver-doc-string eg #f)
+       
+     )
     ))
 
-(define (context-doc-string context-desc)
+(define (document-property-operation op)
+  (let
+      ((tag (car op))
+       (body (cdr op))
+       (sym (cadr op))
+       )
+
+  (cond
+   ((equal?  tag 'push)
+    (string-append
+     "@item "
+     (if (null? (cddr body))
+        "Revert "
+        "Set "
+        )
+     "grob-property "
+     (symbol->string (cadr body))
+     " in " (symbol->string sym)
+     (if (not (null? (cddr body)))
+        (string-append " to " (scm->texi (cadr (cdr body))))
+        )
+    "\n"
+     )
+
+    )
+   ((equal? (object-property sym 'is-grob?) #t) "")
+   ((equal? (car op) 'assign)
+    (string-append
+     "@item Set translator property "
+     (symbol->string (car body))
+     " to "
+     (scm->texi (cadr body))
+     "\n"
+     )
+     )
+   )
+  ))
+
+
+(define (context-doc context-desc)
   (let*
       (
        (name (cdr (assoc 'type-name context-desc)))
                  (cdr (assoc 'consists context-desc))
                  (cdr (assoc 'end-consists  context-desc))
                  ))
+       (props (cdr (assoc 'property-ops context-desc)))
+       (grobs  (context-grobs context-desc))
+       (grob-refs (map (lambda (x) (ref-ify x)) grobs))
        )
-    
-    (string-append 
-     desc
-     
-     (if (null? accepts)
-        "This context is a `bottom' context; it can not contain other contexts."
-        (string-append
-         name " can contain \n"
-         (human-listify (map reffy (map context-name accepts)))))
-     
-     "\n\nThis context is built from the following engravers: "
-     (if no-copies
-        (human-listify (map reffy (map engraver-name consists)))
-        (apply string-append 
-               (map document-engraver-by-name consists))))))
-
-
-;; First level Context description
-(define (document-context top context-desc)
-  (let ((name (cdr (assoc 'type-name context-desc)))
-       (doc (context-doc-string context-desc)))
-    (processing name)
-    (string-append
-     (node (context-name name))
-     (texi-section 2 (context-name name) #f)
-      doc)))
+    (make <texi-node>
+      #:name name
+      #:text
+      (string-append 
+       desc
+       "\n\nThis context creates the following grobs: \n\n"
+       (human-listify (uniq-list (sort grob-refs string<? )))
+       "."
+       (if (pair? props)
+          (string-append
+           "\n\nThis context sets the following properties:\n"
+           "@itemize @bullet\n"
+           (apply string-append (map document-property-operation props))
+           "@end itemize\n"
+           )
+          ""
+          )
+       
+       (if (null? accepts)
+          "\n\nThis context is a `bottom' context; it can not contain other contexts."
+          (string-append
+           "\n\nContext "
+           name " can contain \n"
+           (human-listify (map ref-ify (map context-name accepts)))))
+       
+       "\n\nThis context is built from the following engravers: "
+       (description-list->texi
+             (map document-engraver-by-name consists))
+       ))))
 
+(define (engraver-grobs  grav)
+  (let* (
+        (eg (if (string? grav)
+                (find-engraver-by-name grav)
+                grav))
+            
+            )
 
-(define (document-paper name)
-  (let* ((paper-alist
+    (if (eq? eg #f)
+       '()
+       (map symbol->string (cdr (assoc 'grobs-created (ly:translator-description eg))))
+       )
+  ))
+
+(define (context-grobs context-desc)
+  (let* (
+        (consists (append
+                   (list (cdr (assoc 'group-type context-desc)))
+                   (cdr (assoc 'consists context-desc))
+                   (cdr (assoc 'end-consists  context-desc))
+                   ))
+        (grobs  (apply append
+                 (map engraver-grobs consists))
+        )
+        )
+    grobs
+    ))
+
+(define (symbol<? l r)
+  (string<? (symbol->string l) (symbol->string r)))
+
+(define (all-contexts-doc)
+  (let* (
+        (paper-alist
          (sort (My_lily_parser::paper_description)
-               (lambda (x y) (string<? (car x) (car y)))))
-        (names (sort (map car paper-alist) string<?))
+               (lambda (x y) (symbol<? (car x) (car y)))))
+        (names (sort (map symbol->string (map car paper-alist)) string<?))
         (contexts (map cdr paper-alist))
-        (doc (apply string-append
-                    (map (lambda (x) (document-context name x)) contexts))))
-    
-    (string-append
-     (texi-node-menu name (map (lambda (x) (cons (context-name x) ""))
-                              names))
-     doc)))
-
-(define (document-all-engravers name)
-  (let* ((descs (map cdr engraver-description-alist))
-        (names (map car engraver-description-alist))
-        (doc (apply string-append
-                    (map (lambda (x) (document-separate-engraver name x))
-                         descs))))
-    
-    (string-append
-     (texi-node-menu name (map (lambda (x) (cons (engraver-name x) ""))
-                              names))
-     doc)))
+        )
+
+    (make <texi-node>
+      #:name "Contexts"
+      #:desc "Complete descriptions of all contexts"
+      #:children
+      (map context-doc contexts)
+      )
+    ))
+
+
+(define all-engravers-list  (ly:get-all-translators))
+(set! all-engravers-list
+      (sort all-engravers-list
+           (lambda (a b) (string<? (ly:translator-name a)
+                                   (ly:translator-name b)))))
+
+(define (all-engravers-doc)
+  (make <texi-node>
+    #:name "Engravers"
+    #:desc "All separate engravers"
+    #:children
+    (map engraver-doc all-engravers-list)))
 
-(define (document-all-engraver-properties name)
+(define (all-translation-properties-doc)
+  
   (let*
-    (
-     (ps (sort (map symbol->string all-translation-properties) string<?))
-     (sortedsyms (map string->symbol ps))
-     (propdescs (map document-translator-property sortedsyms))
-     (texi (description-list->texi propdescs))
+      (
+       (ps (sort (map symbol->string all-translation-properties) string<?))
+       (sortedsyms (map string->symbol ps))
+       (propdescs
+       (map
+        (lambda (x) (document-property x 'translation #f))
+        sortedsyms))
+       (texi (description-list->texi propdescs))
+       )
+
+    (make <texi-node>
+      #:name "Translation properties"
+      #:desc "All translation properties"
+      #:text texi)
+    ))
+
+
+;(dump-node (all-contexts-doc) (current-output-port) 0 )
+
+(define (translation-doc-node)
+  (make <texi-node>
+    #:name "Translation"
+    #:desc "From music to layout"
+    #:children
+    (list
+     (all-contexts-doc)
+     (all-engravers-doc)
+     (all-translation-properties-doc)
      )
-     
-  (string-append
-         (node name)
-         (texi-section 1 name #f)
-         texi
-   )))
+  ))