X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fdocumentation-lib.scm;h=943265e695a50d183c93b15fa4a7fe691e932dc5;hb=96505f9df73dbec6d19ceb78dbd8d3bb141137fe;hp=0593eac0a9e030743c438374db0e0069a2669b9d;hpb=3379da1fe0fe84cd2c8939abf97bc9f48102f8f8;p=lilypond.git diff --git a/scm/documentation-lib.scm b/scm/documentation-lib.scm index 0593eac0a9..943265e695 100644 --- a/scm/documentation-lib.scm +++ b/scm/documentation-lib.scm @@ -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 -;;; Jan Nieuwenhuizen - -(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--2004 Han-Wen Nienhuys +;;;; Jan Nieuwenhuizen + +(use-modules (oop goops) + (srfi srfi-13) + (srfi srfi-1) + ) + +(define-class () + (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 (aliststring (car x)) - (symbol->string (car y)))) +(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))) @@ -26,34 +53,26 @@ (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 # 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
" - "\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") @@ -61,20 +80,7 @@ (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,63 +92,82 @@ 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" "\n@settitle " name - (node "Top") top - "\n@top" - (texi-section 1 name #f) - (texi-menu items-alist) - "\n@contents" + "\n@dircategory GNU music project" + "\n@direntry" + ;; prepend GNU for dir, must be unique + "\n* GNU " name ": (" file-name "). " name "." + "\n@end direntry" )) + (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)) @@ -152,3 +177,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) + + )) +