;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; ;;;; Copyright (C) 1998--2020 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 . (define (doc-markup-function-properties func) (let ((properties (markup-function-properties func)) (prop-strings (list))) (for-each (lambda (prop-spec) (set! prop-strings (if (list? prop-spec) ;; either (prop value) or (prop) (cons (if (null? (cdr prop-spec)) (format #f "@item @code{~a}\n" (car prop-spec)) (format #f "@item @code{~a} (~a)\n" (car prop-spec) (let ((default (cadr prop-spec))) (if (and (list? default) (null? default)) "'()" default)))) prop-strings) ;; a markup command: get its properties ;; FIXME: avoid cyclical references (append (doc-markup-function-properties prop-spec) prop-strings)))) (or properties (list))) prop-strings)) (define (doc-markup-function func-pair) (let* ((f-name (symbol->string (car func-pair))) (func (cdr func-pair)) (full-doc (procedure-documentation func)) (match-args (and full-doc (string-match "^\\([^)]*\\)\n" full-doc))) (arg-names (if match-args (with-input-from-string (match:string match-args) read) (circular-list "arg"))) (doc-str (if match-args (match:suffix match-args) full-doc)) (c-name (regexp-substitute/global #f "-markup(-list)?$" f-name 'pre "" 'post)) (sig (markup-command-signature func)) (sig-type-names (map type-name sig)) (signature-str (string-join (map (lambda (x y) (format #f "@var{~a} (~a)" x y)) arg-names sig-type-names) " " ))) (string-append "\n\n@item @code{\\" c-name "} " signature-str "\n@funindex \\" c-name "\n" (if (string? doc-str) doc-str "") (let ((prop-strings (doc-markup-function-properties func))) (if (null? prop-strings) "\n" (string-append "\n\n\nUsed properties:\n@itemize\n" (string-concatenate prop-strings) "@end itemize\n")))))) (define (markup-namestring (car a)) (symbol->string (car b)))) (define all-markup-commands '()) (define all-markup-list-commands '()) (for-each (lambda (m) (module-for-each (lambda (sym var) (let ((val (variable-ref var))) (cond ((markup-function? val) (set! all-markup-commands (acons sym val all-markup-commands))) ((markup-list-function? val) (set! all-markup-list-commands (acons sym val all-markup-list-commands)))))) (module-public-interface m))) (cons (current-module) (map resolve-module '((lily) (scm accreg))))) (set! all-markup-commands (sort! all-markup-commands markup-namestring category)) (category-name (string-capitalize (regexp-substitute/global #f "-" category-string 'pre " " 'post))) (markup-functions (filter (lambda (fun) (let ((cats (markup-function-category (cdr fun)))) (if (pair? cats) (memq category cats) (eq? category cats)))) all-markup-commands))) (make #:appendix #t #:name category-name #:desc "" #:text (string-append "@table @asis" (string-concatenate (map doc-markup-function markup-functions)) "\n@end table")))) (define (markup-doc-node) (make #:appendix #t #:name "Text markup commands" #:desc "" #:text "The following commands can all be used inside @code{\\markup @{ @}}." #:children (let* (;; when a new category is defined, update `ordered-categories' (ordered-categories '(font align graphic music instrument-specific-markup accordion-registers other)) (raw-categories (fold (lambda (next union) (let ((cat (markup-function-category next))) (cond ((pair? cat) (lset-union eq? cat union)) ((symbol? cat) (lset-adjoin eq? cat union)) (else union)))) '() all-markup-commands)) (categories (append ordered-categories (sort (lset-difference eq? raw-categories ordered-categories) symbol