;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; ;;;; Copyright (C) 2000--2022 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by ;;;; the Free Software Foundation, either version 3 of the License, or ;;;; (at your option) any later version. ;;;; ;;;; LilyPond is distributed in the hope that it will be useful, ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;;; GNU General Public License for more details. ;;;; ;;;; You should have received a copy of the GNU General Public License ;;;; along with LilyPond. If not, see . (use-modules (ice-9 match)) (define (engraver-makes-grob? name-symbol grav) (memq name-symbol (assoc-get 'grobs-created (ly:translator-description grav) '()))) (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* ((propsr (assoc-get 'properties-read (ly:translator-description engraver))) (propsw (assoc-get 'properties-written (ly:translator-description engraver))) (accepted (assoc-get 'events-accepted (ly:translator-description engraver))) (name-sym (ly:translator-name engraver)) (name-str (symbol->string name-sym)) (desc (string-trim-both (assoc-get 'description (ly:translator-description engraver)))) (grobs (engraver-grobs engraver))) (string-append desc "\n\n" "@raggedRight\n" (if (pair? accepted) (string-append "Music types accepted:\n" (list-xref-symbols accepted)) "") "\n\n" (if (pair? propsr) (string-append "Properties (read)" (description-list->texi (map (lambda (x) (property->texi 'translation x '())) (sort propsr ly:symbol-citexi (map (lambda (x) (property->texi 'translation x '())) (sort propsw ly:symbol-ci #:code-tag #t #:name (symbol->string (ly:translator-name grav)) #:text (engraver-doc-string grav #t))) ;; Second level, part of Context description (define name->engraver-table (make-hash-table 61)) (for-each (lambda (x) (hash-set! name->engraver-table (ly:translator-name x) x)) (ly:get-all-translators)) (define (find-engraver-by-name name) "NAME is a symbol." (hash-ref name->engraver-table name #f)) (define (document-engraver-by-name name) "NAME is a symbol." (let* ((eg (find-engraver-by-name name))) (cons (ref-ify (symbol->string name)) (engraver-doc-string eg #f)))) (define (document-property-operation op) (match op (('assign property (? ly:grob-properties?)) ;; Ignore definitions of grobs in Global. "") (('assign property value) (format #f "@item Set context property @code{~a} to~a" property (if (pretty-printable? value) (format #f ":~a\n" (scm->texi value)) (format #f " ~a.\n" (scm->texi value))))) (('push grob value . path) (format #f "@item Set grob property @code{~{~a~^.~}} in @iref{~a} to ~a" path grob (if (pretty-printable? value) (format #f ":~a\n" (scm->texi value)) (format #f " ~a.\n" (scm->texi value))))) (('unset property) (format #f "@item Unset context property @code{~a}\n" property)) (('pop grob . path) (format #f "@item Revert grob property @code{~{~a~^.~}} in @iref{~a}\n" path grob)) (('apply proc) (format #f "@item Apply procedure @code{~a}\n" (scm->texi proc))))) (define (context-doc context-desc) (let* ((name-sym (assoc-get 'context-name context-desc)) (name (symbol->string name-sym)) (aliases (assoc-get 'aliases context-desc)) (desc (assoc-get 'description context-desc "(not documented")) (accepts (assoc-get 'accepts context-desc)) (consists (assoc-get 'consists context-desc)) (props (assoc-get 'property-ops context-desc)) (defaultchild (assoc-get 'default-child context-desc)) (grobs-created (context-grobs context-desc))) (make #:code-tag #t #:name name #:text (string-append desc (if (pair? aliases) (string-append "\n\nThis context also accepts commands for the following context(s):\n" (list-xref-symbols aliases) ".") "") "\n\n@raggedRight" "\nThis context creates the following layout object(s):\n" (list-xref-symbols grobs-created #:uniq #t) "." (if (and (pair? props) (not (null? props))) (let ((str (string-concatenate (sort (map document-property-operation props) ly:string-citexi (map document-engraver-by-name (sort consists ly:symbol-cistring (map car layout-alist)) ly:string-ci #: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) (ly:string-cistring (ly:translator-name a)) (symbol->string (ly:translator-name b)))))) (define (all-engravers-doc) (make #:name "Engravers and Performers" #:desc "All separate engravers and performers." #:text "See @ruser{Modifying context plug-ins}." #:children (map engraver-doc all-engravers-list))) (define (translation-properties-doc-string lst) (let* ((ps (sort (map symbol->string lst) ly:string-cisymbol ps)) (propdescs (map (lambda (x) (property->texi 'translation x '())) sortedsyms)) (texi (description-list->texi propdescs #f))) texi)) (define (translation-doc-node) (make #:name "Translation" #:desc "From music to layout." #:children (list (all-contexts-doc) (all-engravers-doc) (make #:name "Tunable context properties" #:desc "All tunable context properties." #:text (translation-properties-doc-string all-user-translation-properties)) (make #:name "Internal context properties" #:desc "All internal context properties." #:text (translation-properties-doc-string all-internal-translation-properties)))))