X-Git-Url: https://git.donarmstrong.com/lilypond.git?a=blobdiff_plain;f=scm%2Fdocument-markup.scm;h=bbc8939e0281943478a32bfb2e7eed3fc1c8ba70;hb=8659a99f233f5c4684292728e7ad4206669b35b0;hp=ee70eab22d319e7058c8f1a23343250a8f3b182e;hpb=91e7cbaa6e54e004365d28e0f10c9362a7f13320;p=lilypond.git diff --git a/scm/document-markup.scm b/scm/document-markup.scm index ee70eab22d..bbc8939e02 100644 --- a/scm/document-markup.scm +++ b/scm/document-markup.scm @@ -1,53 +1,152 @@ -;;;; document-markup.scm -- part of generated backend documentation +;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; source file of the GNU LilyPond music typesetter -;;;; -;;;; (c) 1998--2005 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 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) + " " ))) -(define (doc-markup-function func) - (let* ((doc-str (procedure-documentation func)) - (f-name (symbol->string (procedure-name func))) - (c-name (regexp-substitute/global #f "-markup$" f-name 'pre "" 'post)) - (sig (object-property func 'markup-signature)) - (arg-names - (map symbol->string - (cddr (cadr (procedure-source func))))) - - (sig-type-names (map type-name sig)) - (signature (zip arg-names sig-type-names)) - (signature-str - (string-join - (map (lambda (x) (string-append - "@var{" (car x) "} (" (cadr x) ")" )) - (zip arg-names sig-type-names)) - " " ))) - (string-append "\n\n@item @code{\\" c-name "} " signature-str - - "\n@findex " f-name "\n" - "\n@cindex @code{" c-name "}\n" - + "\n@funindex \\" c-name "\n" + "\n@cindex \\" c-name "\n" (if (string? doc-str) - 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-functionstring (procedure-name a)) (symbol->string (procedure-name b)))) +(define (markup-namestring (car a)) (symbol->string (car b)))) -(define (markup-doc-string) - (string-append - - "@table @asis" - (apply string-append - - (map doc-markup-function - (sort markup-function-list markup-functionstring 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 - #:name "Markup functions" - #:desc "Definitions of the markup functions." - #:text (markup-doc-string))) + #: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