X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fdocument-backend.scm;h=0ba63b2cfc46163b41850d7e8221a436c61b99c8;hb=refs%2Fheads%2Fupstream;hp=12432f142201ae95ce44e417b556ffdac3a63e45;hpb=f9190dbeef516bfa931447ba46bbae6eaa941c4e;p=lilypond.git diff --git a/scm/document-backend.scm b/scm/document-backend.scm index 12432f1422..0ba63b2cfc 100644 --- a/scm/document-backend.scm +++ b/scm/document-backend.scm @@ -1,202 +1,244 @@ -;;; backend-documentation-lib.scm -- Functions for backend documentation -;;; -;;; source file of the GNU LilyPond music typesetter -;;; -;;; (c) 2000--2004 Han-Wen Nienhuys -;;; Jan Nieuwenhuizen - - -;;; This file generates documentation for the backend of lilypond. - -;; alist of property descriptions - -;; -" -TODO: - - -Grob bla - -Created by: - - * preset properties + explanation - -Interfaces: - - * properties available. - -" - +;;;; This file is part of LilyPond, the GNU music typesetter. +;;;; +;;;; Copyright (C) 2000--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 (sort-grob-properties props) + ;; force 'meta to the end of each prop-list + (let ((meta (assoc 'meta props))) + (append (sort (assoc-remove! props 'meta) ly:alist-citexi + 'backend pr grob-description))) + (iprops (filter (lambda (x) (object-property x 'backend-internal)) + props)) + (uprops (filter + (lambda (x) (not (object-property x 'backend-internal))) + props)) + (user-propdocs (map docfunc uprops)) + (internal-propdocs (map docfunc iprops))) + (string-append desc - "\n\n" - (description-list->texi propdocs)) - )) + (if (pair? uprops) + (string-append + "\n\n@subsubheading User settable properties:\n" + (description-list->texi user-propdocs #t)) + "") -(define iface->grob-table (make-vector 61 '())) + (if (pair? iprops) + (string-append + "\n\n@subsubheading Internal properties:\n" + (description-list->texi internal-propdocs #t)) + "")))) + +(define iface->grob-table (make-hash-table 61)) ;; extract ifaces, and put grob into the hash table. -(map +(for-each (lambda (x) - (let* - ( - (metah (assoc 'meta (cdr x))) - (meta (cdr metah)) - (ifaces (cdr (assoc 'interfaces meta))) - ) - - (map (lambda (iface) - (hashq-set! - iface->grob-table iface - (cons (car x) - (hashq-ref iface->grob-table iface '()) - ))) - ifaces) - )) + (let* ((meta (assoc-get 'meta (cdr x))) + (ifaces (assoc-get 'interfaces meta))) + + (for-each (lambda (iface) + (hashq-set! + iface->grob-table iface + (cons (car x) + (hashq-ref iface->grob-table iface '())))) + ifaces))) all-grob-descriptions) ;; First level Interface description (define (interface-doc interface) - (let ((name (symbol->string (car interface)))) + (let* ((name (symbol->string (car interface))) + (interface-list (human-listify + (map ref-ify + (sort + (map symbol->string + (hashq-ref iface->grob-table + (car interface) + '())) + ly:string-ci #:name name #:text (string-append - (interface-doc-string (cdr interface) #f) - "\n\n" - "This grob interface is used in the following graphical objects: " - - (human-listify - (map ref-ify - (map symbol->string - (hashq-ref iface->grob-table (car interface) '() ))))) - - ))) + (interface-doc-string (cdr interface) '()) + "\n\n" + "This grob interface " + (if (equal? interface-list "none") + "is not used in any graphical object" + (string-append + "is used in the following graphical object(s): " + interface-list)) + ".")))) + +(define (grob-alist->texi alist) + (let* ((uprops (filter (lambda (x) (not (object-property x 'backend-internal))) + (map car alist)))) + + (description-list->texi + (map (lambda (y) (property->texi 'backend y alist)) + uprops) + #t))) (define (grob-doc description) "Given a property alist DESCRIPTION, make a documentation node." - - (let* - ( - (metah (assoc 'meta description)) - - (meta (cdr metah)) - (name (cdr (assoc 'name meta))) - (ifaces (map lookup-interface (cdr (assoc 'interfaces meta)))) - (ifacedoc (map (lambda (iface) - (string-append -" -@subsubheading " -(ref-ify (symbol->string (car iface))) - -"\n\n" - (interface-doc-string iface description))) - (reverse ifaces))) - (engravers (filter - (lambda (x) (engraver-makes-grob? name x)) all-engravers-list)) - (namestr (symbol->string name)) - (engraver-names (map symbol->string (map ly:translator-name engravers))) - ) + + (let* ((meta (assoc-get 'meta description)) + (name (assoc-get 'name meta)) + ;; (bla (display name)) + (ifaces (map lookup-interface (assoc-get 'interfaces meta))) + (ifacedoc (map ref-ify + (sort + (map (lambda (iface) + (if (pair? iface) + (symbol->string (car iface)) + (ly:error (_ "pair expected in doc ~s") name))) + ifaces) + ly:string-cistring name)) + (engraver-names (map symbol->string + (map ly:translator-name engravers))) + (engraver-list (human-listify + (map ref-ify + (map engraver-name engraver-names))))) (make #:name namestr #:text (string-append - namestr " grobs are created by: " - (human-listify (map ref-ify - (map engraver-name engraver-names))) - (apply string-append ifacedoc) - )) - )) + namestr " objects " + (if (equal? engraver-list "none") + "are not created by any engraver" + (string-append + "are created by: " + engraver-list)) + "." + + "\n\nStandard settings:\n" + (grob-alist->texi description) + "\n\nThis object supports the following interface(s):\n" + (human-listify ifacedoc) + ".")))) (define (all-grobs-doc) (make #:name "All layout objects" - #:desc "Description and defaults for all Grobs" + #:desc "Description and defaults for all graphical objects (grobs)." #:children (map (lambda (x) (grob-doc (cdr x))) all-grob-descriptions))) (define interface-description-alist (hash-fold (lambda (key val prior) - (cons (cons key val) prior) - ) + (cons (cons key val) prior)) '() (ly:all-grob-interfaces))) -(set! interface-description-alist (sort interface-description-alist alist #:name "Graphical Object Interfaces" - #:desc "Building blocks of graphical objects" + #:desc "Building blocks of graphical objects." #:children - (map interface-doc interface-description-alist) - )) + (map interface-doc interface-description-alist))) (define (backend-properties-doc-string lst) - (let* - ( - (ps (sort (map symbol->string lst) stringsymbol prop) 'backend #f)) - ps)) - (texi (description-list->texi descs)) - ) + (let* ((ps (sort (map symbol->string lst) ly:string-citexi 'backend (string->symbol prop) '())) ps)) + (texi (description-list->texi descs #f))) texi)) -(define (all-backend-properties-doc) - (make - #:name "All backend properties" - #:desc "All grob properties in a big list" - #:text (backend-properties-doc-string all-backend-properties))) - - -;(dump-node (grob-doc (cdadr all-grob-descriptions)) (current-output-port) 0 ) +;;(dump-node (grob-doc (cdadr all-grob-descriptions)) (current-output-port) 0 ) (define (backend-doc-node) (make #:name "Backend" - #:desc "Reference for the layout engine" + #:desc "Reference for the layout engine." #:children (list (all-grobs-doc) (all-interfaces-doc) - (all-backend-properties-doc) - ) - )) + (make + #:name "User backend properties" + #:desc "All tunable properties in a big list." + #:text (backend-properties-doc-string all-user-grob-properties)) + (make + #:name "Internal backend properties" + #:desc "All internal layout properties in a big list." + #:text (backend-properties-doc-string all-internal-grob-properties)))))