mirror of
				https://github.com/smarty-php/smarty.git
				synced 2025-10-30 20:01:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1905 lines
		
	
	
		
			67 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1905 lines
		
	
	
		
			67 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
| ;; $Id$
 | |
| ;;
 | |
| ;; This file is part of the Modular DocBook Stylesheet distribution.
 | |
| ;; See ../README or http://nwalsh.com/docbook/dsssl/
 | |
| ;;
 | |
| ;; This file contains general functions common to both print and HTML
 | |
| ;; versions of the DocBook stylesheets.
 | |
| ;;
 | |
| 
 | |
| ;; If **ANY** change is made to this file, you _MUST_ alter the
 | |
| ;; following definition:
 | |
| 
 | |
| (define %docbook-common-version%
 | |
|   "Modular DocBook Stylesheet Common Functions")
 | |
| 
 | |
| ;; === element lists ====================================================
 | |
| 
 | |
| ;; these have to be functions because they have to be evaluated when
 | |
| ;; there is a current-node so that normalize can know what declaration
 | |
| ;; is in effect
 | |
| 
 | |
| (define (set-element-list)
 | |
|   (list (normalize "set")))
 | |
| 
 | |
| (define (book-element-list)
 | |
|   (list (normalize "book")))
 | |
| 
 | |
| (define (division-element-list)
 | |
|   (list (normalize "part")))
 | |
| 
 | |
| (define (component-element-list)
 | |
|   (list (normalize "preface")
 | |
| 	(normalize "chapter")
 | |
| 	(normalize "appendix") 
 | |
| 	(normalize "article")
 | |
| 	(normalize "glossary")
 | |
| 	(normalize "bibliography")
 | |
| 	(normalize "index")
 | |
| 	(normalize "colophon")
 | |
| 	(normalize "setindex")
 | |
| 	(normalize "reference")
 | |
| 	(normalize "refentry")
 | |
| 	(normalize "book"))) ;; just in case nothing else matches...
 | |
| 
 | |
| (define (major-component-element-list)
 | |
|   (list (normalize "preface")
 | |
| 	(normalize "chapter") 
 | |
| 	(normalize "appendix") 
 | |
| 	(normalize "article")
 | |
| 	(normalize "glossary")
 | |
| 	(normalize "bibliography")
 | |
| 	(normalize "index")
 | |
| 	(normalize "colophon")
 | |
| 	(normalize "setindex")
 | |
| 	(normalize "reference")
 | |
| 	(normalize "refentry")
 | |
| 	(normalize "part")
 | |
| 	(normalize "book"))) ;; just in case nothing else matches...
 | |
| 
 | |
| (define (section-element-list)
 | |
|   (list (normalize "sect1")
 | |
| 	(normalize "sect2")
 | |
| 	(normalize "sect3") 
 | |
| 	(normalize "sect4")
 | |
| 	(normalize "sect5")
 | |
| 	(normalize "section")
 | |
| 	(normalize "simplesect")
 | |
| 	(normalize "refsect1") 
 | |
| 	(normalize "refsect2") 
 | |
| 	(normalize "refsect3")))
 | |
| 
 | |
| (define (block-element-list)
 | |
|   (list (normalize "example") 
 | |
| 	(normalize "figure") 
 | |
| 	(normalize "table") 
 | |
| 	(normalize "equation") 
 | |
| 	(normalize "procedure")))
 | |
| 
 | |
| (define (outer-parent-list)
 | |
|   (list (normalize "toc") 
 | |
| 	(normalize "lot") 
 | |
| 	(normalize "appendix") 
 | |
| 	(normalize "chapter") 
 | |
| 	(normalize "part") 
 | |
| 	(normalize "preface") 
 | |
| 	(normalize "reference")
 | |
| 	(normalize "bibliography") 
 | |
| 	(normalize "glossary") 
 | |
| 	(normalize "index") 
 | |
| 	(normalize "setindex")
 | |
| 	(normalize "sect1") 
 | |
| 	(normalize "sect2") 
 | |
| 	(normalize "sect3") 
 | |
| 	(normalize "sect4") 
 | |
| 	(normalize "sect5") 
 | |
| 	(normalize "simplesect")
 | |
| 	(normalize "partintro") 
 | |
| 	(normalize "bibliodiv") 
 | |
| 	(normalize "glossdiv") 
 | |
| 	(normalize "indexdiv")
 | |
| 	(normalize "refentry") 
 | |
| 	(normalize "refsect1") 
 | |
| 	(normalize "refsect2") 
 | |
| 	(normalize "refsect3")
 | |
| 	(normalize "msgtext") 
 | |
| 	(normalize "msgexplan")))
 | |
| 
 | |
| (define (list-element-list)
 | |
|   (list (normalize "orderedlist") 
 | |
| 	(normalize "itemizedlist") 
 | |
| 	(normalize "variablelist") 
 | |
| 	(normalize "segmentedlist")
 | |
|         (normalize "simplelist") 
 | |
| 	(normalize "calloutlist") 
 | |
| 	(normalize "step")))
 | |
| 
 | |
| (define (info-element-list)
 | |
|   (list (normalize "appendixinfo")
 | |
| 	(normalize "articleinfo")
 | |
| 	(normalize "bibliographyinfo")
 | |
| 	(normalize "bookinfo")
 | |
| 	(normalize "chapterinfo")
 | |
| 	(normalize "glossaryinfo")
 | |
| 	(normalize "indexinfo")
 | |
| 	(normalize "objectinfo")
 | |
| 	(normalize "partinfo")
 | |
| 	(normalize "prefaceinfo")
 | |
| 	(normalize "refentryinfo")
 | |
| 	(normalize "referenceinfo")
 | |
| 	(normalize "refsect1info")
 | |
| 	(normalize "refsect2info")
 | |
| 	(normalize "refsect3info")
 | |
| 	(normalize "refsynopsisdivinfo")
 | |
| 	(normalize "sect1info")
 | |
| 	(normalize "sect2info")
 | |
| 	(normalize "sect3info")
 | |
| 	(normalize "sect4info")
 | |
| 	(normalize "sect5info")
 | |
| 	(normalize "sectioninfo")
 | |
| 	(normalize "setindexinfo")
 | |
| 	(normalize "setinfo")
 | |
| 	(normalize "sidebarinfo")
 | |
| 	;; historical
 | |
| 	(normalize "artheader")
 | |
| 	(normalize "docinfo")))
 | |
| 
 | |
| ;; === automatic TOC ====================================================
 | |
| 
 | |
| ;; Returns #t if nd should appear in the auto TOC
 | |
| (define (appears-in-auto-toc? nd)
 | |
|   (if (or (equal? (gi nd) (normalize "refsect1"))
 | |
| 	  (have-ancestor? (normalize "refsect1") nd))
 | |
|       #f
 | |
|       #t))
 | |
| 
 | |
| ;; # return elements of nl for which appears-in-auto-toc? is #t
 | |
| (define (toc-list-filter nodelist)
 | |
|   (let loop ((toclist (empty-node-list)) (nl nodelist))
 | |
|     (if (node-list-empty? nl)
 | |
| 	toclist
 | |
| 	(if (appears-in-auto-toc? (node-list-first nl))
 | |
| 	    (loop (node-list toclist (node-list-first nl))
 | |
| 		  (node-list-rest nl))
 | |
| 	    (loop toclist (node-list-rest nl))))))
 | |
|   
 | |
| ;; === common ===========================================================
 | |
| 
 | |
| (define (INLIST?)
 | |
|   (has-ancestor-member? (current-node) (list-element-list)))
 | |
| 
 | |
| (define (INBLOCK?)
 | |
|   (has-ancestor-member? (current-node) 
 | |
| 			(list (normalize "example") 
 | |
| 			      (normalize "informalexample")
 | |
| 			      (normalize "figure") 
 | |
| 			      (normalize "informalfigure")
 | |
| 			      (normalize "equation")
 | |
| 			      (normalize "informalequation")
 | |
| 			      (normalize "funcsynopsis")
 | |
| 			      (normalize "programlistingco")
 | |
| 			      (normalize "screenco")
 | |
| 			      (normalize "graphicco"))))
 | |
| 
 | |
| (define (PARNUM)
 | |
|   (child-number (parent (current-node))))
 | |
| 
 | |
| (define (NESTEDFNUM n fmt)
 | |
|   (if (number? n)
 | |
|       (format-number n fmt)
 | |
|       #f))
 | |
| 
 | |
| (define (FNUM n) (NESTEDFNUM n "1"))
 | |
| 
 | |
| (define (book-start?)
 | |
|   ;; Returns #t if the current-node is in the first division or 
 | |
|   ;; component of a book.
 | |
|   (let ((book (ancestor (normalize "book")))
 | |
| 	(nd   (ancestor-member 
 | |
| 	       (current-node) 
 | |
| 	       (append (component-element-list) (division-element-list)))))
 | |
|     (let loop ((ch (children book)))
 | |
|       (if (node-list-empty? ch)
 | |
| 	  #f
 | |
| 	  (if (member (gi (node-list-first ch)) 
 | |
| 		      (append (component-element-list) (division-element-list)))
 | |
| 	      (node-list=? (node-list-first ch) nd)
 | |
| 	      (loop (node-list-rest ch)))))))
 | |
| 
 | |
| (define (first-chapter?)
 | |
|   ;; Returns #t if the current-node is in the first chapter of a book
 | |
|   (let* ((book (ancestor (normalize "book")))
 | |
| 	 (nd   (ancestor-member 
 | |
| 		(current-node) 
 | |
| 		(append (component-element-list) (division-element-list))))
 | |
| 	 (bookch (children book))
 | |
| 	 (bookcomp (expand-children bookch (list (normalize "part")))))
 | |
|     (let loop ((nl bookcomp))
 | |
|       (if (node-list-empty? nl)
 | |
| 	  #f
 | |
| 	  (if (equal? (gi (node-list-first nl)) (normalize "chapter"))
 | |
| 	      (if (node-list=? (node-list-first nl) nd)
 | |
| 		  #t
 | |
| 		  #f)
 | |
| 	      (loop (node-list-rest nl)))))))
 | |
| 
 | |
| ;; === bibliographic ====================================================
 | |
| 
 | |
| ;; Localized author-string
 | |
| 
 | |
| (define (author-list-string #!optional (author (current-node)))
 | |
|   ;; Return a formatted string representation of the contents of AUTHOR
 | |
|   ;; *including appropriate punctuation* if the AUTHOR occurs in a list
 | |
|   ;; of AUTHORs in an AUTHORGROUP:
 | |
|   ;;
 | |
|   ;;   John Doe
 | |
|   ;; or
 | |
|   ;;   John Doe and Jane Doe
 | |
|   ;; or
 | |
|   ;;   John Doe, Jane Doe, and A. Nonymous
 | |
|   ;;
 | |
| 
 | |
|   (let* ((author-node-list (select-elements
 | |
| 			    (descendants 
 | |
| 			     (ancestor (normalize "authorgroup") author))
 | |
| 			    (normalize "author")))
 | |
| 	 (corpauthor-node-list (select-elements
 | |
| 				(descendants 
 | |
| 				 (ancestor (normalize "authorgroup") author))
 | |
| 				(normalize "corpauthor")))
 | |
| 	 (othercredit-node-list (select-elements
 | |
| 				 (descendants 
 | |
| 				  (ancestor (normalize "authorgroup") author))
 | |
| 				 (normalize "othercredit")))
 | |
| 	 (editor-node-list (select-elements
 | |
| 			    (descendants 
 | |
| 			     (ancestor (normalize "authorgroup")))
 | |
| 			    (normalize "editor")))
 | |
| 	 (author-count (if (have-ancestor? (normalize "authorgroup") author)
 | |
| 			   (+ (node-list-length author-node-list)
 | |
| 			      (node-list-length corpauthor-node-list)
 | |
| 			      (node-list-length othercredit-node-list)
 | |
| 			      (node-list-length editor-node-list))
 | |
| 			   1))
 | |
| 	 (this-count (if (have-ancestor? (normalize "authorgroup") author)
 | |
| 			 (+ (node-list-length (preced author)) 1)
 | |
| 			 1)))
 | |
|     (string-append
 | |
|      (if (and (> author-count 1)
 | |
| 	      (last-sibling? author))
 | |
| 	 (string-append (gentext-and) " ")
 | |
| 	 "")
 | |
| 
 | |
|      (author-string author)
 | |
| 
 | |
|      (if (> author-count 2)
 | |
| 	 (if (> (- author-count this-count) 1)
 | |
| 	     (gentext-listcomma)
 | |
| 	     (if (= (- author-count this-count) 1)
 | |
| 		 (gentext-lastlistcomma)
 | |
| 		 ""))
 | |
| 	 "")
 | |
|      (if (and (> author-count 1)
 | |
| 	      (not (last-sibling? author)))
 | |
| 	 " "
 | |
| 	 ""))))
 | |
| 
 | |
| ;; === procedures =======================================================
 | |
| 
 | |
| (define ($proc-hierarch-number-format$ depth)
 | |
|   (case (modulo depth 5)
 | |
|     ((1) "1")
 | |
|     ((2) "a")
 | |
|     ((3) "i")
 | |
|     ((4) "A")
 | |
|     (else "I")))
 | |
| 
 | |
| (define ($proc-hierarch-number$ nd seperator)
 | |
|   (if (equal? (gi nd) (normalize "step"))
 | |
|       (string-append
 | |
|        (format-number
 | |
| 	(child-number nd) 
 | |
| 	($proc-hierarch-number-format$ ($proc-step-depth$ nd)))
 | |
|        seperator)
 | |
|       ""))
 | |
| 
 | |
| (define ($proc-step-depth$ nd)
 | |
|   (let loop ((step nd) (depth 0))
 | |
|     (if (equal? (gi step) (normalize "procedure"))
 | |
| 	depth
 | |
| 	(loop (parent step) 
 | |
| 	      (if (equal? (gi step) (normalize "step"))
 | |
| 		  (+ depth 1)
 | |
| 		  depth)))))
 | |
| 
 | |
| (define ($proc-step-number$ nd)
 | |
|   (let* ((step (if (equal? (gi nd) (normalize "step")) nd (parent nd)))
 | |
| 	 (str ($proc-hierarch-number$ step "")))
 | |
|     (string-append str (gentext-label-title-sep (normalize "step")))))
 | |
| 
 | |
| (define ($proc-step-xref-number$ nd)
 | |
|   (let loop ((step nd) (str "") (first #t))
 | |
|     (if (equal? (gi step) (normalize "procedure"))
 | |
| 	str
 | |
| 	(loop (parent step) 
 | |
| 	      (if (equal? (gi step) (normalize "step"))
 | |
| 		  (string-append 
 | |
| 		   ($proc-hierarch-number$ step
 | |
| 				      (if first
 | |
| 					  ""
 | |
| 					  (gentext-intra-label-sep (normalize "step"))))
 | |
| 		   str)
 | |
| 		  str)
 | |
| 	      (if (equal? (gi step) (normalize "step"))
 | |
| 		  #f
 | |
| 		  first)))))
 | |
| 
 | |
| ;; === sections =========================================================
 | |
| 
 | |
| (define (section-level-by-gi chunked? gi)
 | |
|   ;; Figure out the heading level of an element by its name.  We need
 | |
|   ;; to distinguish between the chunked processing mode (for HTML) and
 | |
|   ;; the non-chunked (print or HTML).  It is important that no heading
 | |
|   ;; level is skipped in a document structure (e.g., sect1 = 2, sect2
 | |
|   ;; = 4); this results in broken PDF bookmarks.
 | |
|   (if chunked?
 | |
|       (cond
 | |
|        ((equal? gi (normalize "sect5")) 5)
 | |
|        ((equal? gi (normalize "sect4")) 4)
 | |
|        ((equal? gi (normalize "sect3")) 3)
 | |
|        ((equal? gi (normalize "sect2")) 2)
 | |
|        ((equal? gi (normalize "sect1")) 1)
 | |
|        ((equal? gi (normalize "refsect3")) 4)
 | |
|        ((equal? gi (normalize "refsect2")) 3)
 | |
|        ((equal? gi (normalize "refsect1")) 2)
 | |
|        ((equal? gi (normalize "refsynopsisdiv")) 2)
 | |
|        ((equal? gi (normalize "bibliography")) 1)
 | |
|        ((equal? gi (normalize "bibliodiv")) 2)
 | |
|        ((equal? gi (normalize "index")) 1)
 | |
|        ((equal? gi (normalize "setindex")) 1)
 | |
|        ((equal? gi (normalize "indexdiv")) 2)
 | |
|        (else 1))
 | |
|       (cond
 | |
|        ((equal? gi (normalize "sect5")) 6)
 | |
|        ((equal? gi (normalize "sect4")) 5)
 | |
|        ((equal? gi (normalize "sect3")) 4)
 | |
|        ((equal? gi (normalize "sect2")) 3)
 | |
|        ((equal? gi (normalize "sect1")) 2)
 | |
|        ;; The next four are not used by the HTML stylesheets.
 | |
|        ((equal? gi (normalize "refsect3")) 5)
 | |
|        ((equal? gi (normalize "refsect2")) 4)
 | |
|        ((equal? gi (normalize "refsect1")) 3)
 | |
|        ((equal? gi (normalize "refsynopsisdiv")) 3)
 | |
|        ((equal? gi (normalize "bibliography")) 1)
 | |
|        ((equal? gi (normalize "bibliodiv")) 2)
 | |
|        ((equal? gi (normalize "index")) 1)
 | |
|        ((equal? gi (normalize "setindex")) 1)
 | |
|        ((equal? gi (normalize "indexdiv")) 2)
 | |
|        (else 1))))
 | |
| 
 | |
| (define (section-level-by-node chunked? sect)
 | |
|   (if (equal? (gi sect) (normalize "section"))
 | |
|       ;; Section is special, it is recursive.
 | |
|       (let ((depth (length (hierarchical-number-recursive 
 | |
| 			    (normalize "section")))))
 | |
| 	(if (> depth 5)
 | |
| 	    6
 | |
| 	    (+ depth 1)))
 | |
|       (if (equal? (gi sect) (normalize "simplesect"))
 | |
| 	  ;; SimpleSect is special, it should be level "n+1", where "n" is
 | |
| 	  ;; the level of the numbered section that contains it.  If it is
 | |
| 	  ;; the *first* sectioning element in a chapter, make it 
 | |
| 	  ;; %default-simplesect-level%
 | |
|           (cond
 | |
|            ((have-ancestor? (normalize "sect5"))
 | |
| 	    (+ 1 (section-level-by-gi chunked? (normalize "sect5"))))
 | |
|            ((have-ancestor? (normalize "sect4"))
 | |
| 	    (+ 1 (section-level-by-gi chunked? (normalize "sect4"))))
 | |
|            ((have-ancestor? (normalize "sect3"))
 | |
| 	    (+ 1 (section-level-by-gi chunked? (normalize "sect3"))))
 | |
|            ((have-ancestor? (normalize "sect2"))
 | |
| 	    (+ 1 (section-level-by-gi chunked? (normalize "sect2"))))
 | |
|            ((have-ancestor? (normalize "sect1"))
 | |
| 	    (+ 1 (section-level-by-gi chunked? (normalize "sect1"))))
 | |
|            ((have-ancestor? (normalize "refsect3"))
 | |
| 	    (+ 1 (section-level-by-gi chunked? (normalize "refsect3"))))
 | |
|            ((have-ancestor? (normalize "refsect2"))
 | |
| 	    (+ 1 (section-level-by-gi chunked? (normalize "refsect2"))))
 | |
|            ((have-ancestor? (normalize "refsect1"))
 | |
| 	    (+ 1 (section-level-by-gi chunked? (normalize "refsect1"))))
 | |
|            (else %default-simplesect-level%))
 | |
| 	  ;; the rest of the section elements can be identified by name
 | |
| 	  (section-level-by-gi chunked? (gi sect)))))
 | |
|   
 | |
| ;; === synopsis =========================================================
 | |
| 
 | |
| ;; The following definitions match those given in the reference
 | |
| ;; documentation for DocBook V3.0
 | |
| (define	%arg-choice-opt-open-str% "[")
 | |
| (define	%arg-choice-opt-close-str% "]")
 | |
| (define	%arg-choice-req-open-str% "{")
 | |
| (define	%arg-choice-req-close-str% "}")
 | |
| (define	%arg-choice-plain-open-str% " ")
 | |
| (define	%arg-choice-plain-close-str% " ")
 | |
| (define	%arg-choice-def-open-str% "[")
 | |
| (define	%arg-choice-def-close-str% "]")
 | |
| (define	%arg-rep-repeat-str% "...")
 | |
| (define	%arg-rep-norepeat-str% "")
 | |
| (define	%arg-rep-def-str% "")
 | |
| (define %arg-or-sep% " | ")
 | |
| (define %cmdsynopsis-hanging-indent% 4pi)
 | |
| 
 | |
| ;; === linking ==========================================================
 | |
| 
 | |
| ;; From the DocBook V3.0 Reference entry for element XREF:
 | |
| ;;
 | |
| ;; Description
 | |
| ;;
 | |
| ;;   Cross reference link to another part of the document. XRef is empty,
 | |
| ;;   and has common, Linkend, and Endterm attributes.
 | |
| ;;
 | |
| ;;   Processing Expectations
 | |
| ;;
 | |
| ;;   XRef must have a Linkend, but the Endterm is optional. If it is used,
 | |
| ;;   the content of the element it points to is displayed as the text of
 | |
| ;;   the cross reference; if it is absent, the XRefLabel of the
 | |
| ;;   cross-referenced object is displayed.
 | |
| ;;
 | |
| ;; If neither the ENDTERM nor the XREFLABEL is present, then the cross
 | |
| ;; reference text is taken from the (gentext-xref-strings) function
 | |
| ;; in the localization file, like this
 | |
| ;; 
 | |
| ;; A cross reference to an element, the target, begins with the
 | |
| ;; text returned by (gentext-xref-strings (gi target)).  Within
 | |
| ;; that text, the following substitutions are made:
 | |
| ;; 
 | |
| ;; %p is replaced by the number of the page on which target occurs
 | |
| ;; %g is replaced by the (gentext-element-name)
 | |
| ;; %n is replaced by the label
 | |
| ;; %t is replaced by the title
 | |
| ;;
 | |
| ;; After the "direct" cross reference, a number of indirect references
 | |
| ;; are possible.  If the target element is in a different block, section,
 | |
| ;; component, division, or book an indirect cross reference may be made.
 | |
| ;;
 | |
| ;; The indirect cross reference will only be made if
 | |
| ;;
 | |
| ;;   (auto-xref-indirect? target ancestor) 
 | |
| ;;
 | |
| ;; returns #t. The indirect reference is created by appending the
 | |
| ;; connect returned by (auto-xref-indirect-connector) to the direct
 | |
| ;; reference and then adding a direct refernce to the ancestor.
 | |
| ;; The process is repeated for each ancestral element.
 | |
| ;;
 | |
| ;; For example, if a direct reference to a section returns
 | |
| ;;
 | |
| ;;    "the section called %t"
 | |
| ;;
 | |
| ;; and a direct reference to a chapter returns 
 | |
| ;;
 | |
| ;;    "Chapter %n"
 | |
| ;;
 | |
| ;; and (auto-xref-indirect? sect1 chapter) returns #t, and 
 | |
| ;; (auto-xref-indirect-connector chapter) returns "in", then
 | |
| ;; an xref to a section in another chapter will be:
 | |
| ;;
 | |
| ;;    "the section called %t in Chapter %n"
 | |
| ;;
 | |
| ;; Where %t and %n will be filled in accordingly.
 | |
| ;;
 | |
| ;; ======================================================================
 | |
| 
 | |
| (define (auto-xref-indirect? target ancestor)
 | |
|   ;; This function answers the question: should an indirect reference
 | |
|   ;; to ancestor be made for target?  For example:
 | |
|   ;;
 | |
|   ;; (auto-xref-indirect? SECT1 CHAP)
 | |
|   ;;
 | |
|   ;; should return #t iff a reference of the form "in [CHAP-xref]" should
 | |
|   ;; be generated for a reference to SECT1 if SECT1 is in a different
 | |
|   ;; chapter than the XREF to SECT1.
 | |
|   ;;
 | |
|   ;; This function _does not_ have to consider the case of whether or
 | |
|   ;; not target and the xref are in the same ancestor.  
 | |
|   ;;
 | |
|   (cond
 | |
|    ;; Always add indirect references to another book
 | |
|    ((member (gi ancestor) (book-element-list))
 | |
|     #t)
 | |
|    ;; Add indirect references to the section or component a block
 | |
|    ;; is in iff chapters aren't autolabelled.  (Otherwise "Figure 1-3"
 | |
|    ;; is sufficient)
 | |
|    ((and (member (gi target) (block-element-list))
 | |
| 	 (not %chapter-autolabel%))
 | |
|     #t)
 | |
|    ;; Add indirect references to the component a section is in if
 | |
|    ;; the sections are not autolabelled
 | |
|    ((and (member (gi target) (section-element-list))
 | |
| 	 (member (gi ancestor) (component-element-list))
 | |
| 	 (not %section-autolabel%))
 | |
|     #t)
 | |
|    (else #f)))
 | |
| 
 | |
| (define (auto-xref-direct target 
 | |
| 			  #!optional 
 | |
| 			  (xref-string (gentext-xref-strings target)))
 | |
|   (let* ((substitute (list
 | |
| 		      (list "%g"  (element-gi-sosofo target))
 | |
| 		      (list "%n"  (element-label-sosofo target))
 | |
| 		      (list "%p"  (element-page-number-sosofo target))
 | |
| 		      (list "%t"  (element-title-xref-sosofo target))))
 | |
| 	 (tlist   (match-split-list xref-string (assoc-objs substitute))))
 | |
|     (string-list-sosofo tlist substitute)))
 | |
| 
 | |
| (define (auto-xref-indirect target 
 | |
| 			    #!optional
 | |
| 			    (xref-string (gentext-xref-strings target)))
 | |
|   (make sequence
 | |
|     (auto-xref-indirect-connector target)
 | |
|     (auto-xref-direct target xref-string)))
 | |
| 
 | |
| (define (auto-xref target 
 | |
| 		   #!optional (xref-string (gentext-xref-strings target)))
 | |
|   (let ((source (current-node))
 | |
| 	(cont-blok (ancestor-member target (block-element-list)))
 | |
| 	(cont-sect (ancestor-member target (section-element-list)))
 | |
| 	(cont-comp (ancestor-member target (component-element-list)))
 | |
| 	(cont-divn (ancestor-member target (division-element-list)))
 | |
| 	(cont-book (ancestor-member target (book-element-list))))
 | |
|     (make sequence
 | |
|       (auto-xref-direct target xref-string)
 | |
|       (if (or (node-list=? cont-blok 
 | |
| 			   (ancestor-member source (block-element-list)))
 | |
| 	      (node-list=? cont-blok target)
 | |
| 	      (not (auto-xref-indirect? target cont-blok)))
 | |
| 	  (empty-sosofo)
 | |
| 	  (auto-xref-indirect cont-blok))
 | |
|       (if (or (node-list=? cont-sect 
 | |
| 			   (ancestor-member source (section-element-list)))
 | |
| 	      (node-list=? cont-sect target)
 | |
| 	      (not (auto-xref-indirect? target cont-sect)))
 | |
| 	  (empty-sosofo)
 | |
| 	  (auto-xref-indirect cont-sect))
 | |
|       (if (or (node-list=? cont-comp 
 | |
| 			   (ancestor-member source (component-element-list)))
 | |
| 	      (node-list=? cont-comp target)
 | |
| 	      (not (auto-xref-indirect? target cont-comp)))
 | |
| 	  (empty-sosofo)
 | |
| 	  (auto-xref-indirect cont-comp))
 | |
|       (if (or (node-list=? cont-divn 
 | |
| 			   (ancestor-member source (division-element-list)))
 | |
| 	      (node-list=? cont-divn target)
 | |
| 	      (not (auto-xref-indirect? target cont-divn)))
 | |
| 	  (empty-sosofo)
 | |
| 	  (auto-xref-indirect cont-divn))
 | |
|       (if (or (node-list=? cont-book 
 | |
| 			   (ancestor-member source (book-element-list)))
 | |
| 	      (node-list=? cont-book target)
 | |
| 	      (not (auto-xref-indirect? target cont-book)))
 | |
| 	  (empty-sosofo)
 | |
| 	  (auto-xref-indirect cont-book)))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| 
 | |
| (define (set-number-restart-list cmp)       (list (normalize "set")))
 | |
| (define (book-number-restart-list cmp)      (list (normalize "set")))
 | |
| (define (part-number-restart-list cmp)      (list (normalize "book")))
 | |
| (define (reference-number-restart-list cmp) (list (normalize "book")))
 | |
| (define (preface-number-restart-list cmp)   (list (normalize "book")))
 | |
| (define (chapter-number-restart-list cmp)   (list (normalize "book")))
 | |
| (define (appendix-number-restart-list cmp)  (list (normalize "book") 
 | |
| 						  (normalize "article")))
 | |
| (define (article-number-restart-list cmp)   (list (normalize "book")))
 | |
| (define (glossary-number-restart-list cmp)  (list (normalize "book")))
 | |
| (define (bibliography-number-restart-list cmp) (list (normalize "book")))
 | |
| (define (index-number-restart-list cmp)     (list (normalize "book")))
 | |
| (define (setindex-number-restart-list cmp)  (list (normalize "set")))
 | |
| (define (refentry-number-restart-list cmp)  (list (normalize "reference")))
 | |
| (define (default-number-restart-list cmp)   (list (normalize "book")))
 | |
| 
 | |
| (define (component-number-restart-list cmp)
 | |
|   ;; Return the list of elements at which numbering of 'cmp' should reset.
 | |
|   ;; For example, for CHAPTER, it might return '("BOOK") causing chapters
 | |
|   ;; to be sequentially numbered across a book.  If it returned
 | |
|   ;; '("BOOK" "PART") then chapter numbering would restart at each 
 | |
|   ;; BOOK or PART.
 | |
|   (let ((name (gi cmp)))
 | |
|     (cond
 | |
|      ((equal? name (normalize "set"))       (set-number-restart-list cmp))
 | |
|      ((equal? name (normalize "book"))      (book-number-restart-list cmp))
 | |
|      ((equal? name (normalize "part"))      (part-number-restart-list cmp))
 | |
|      ((equal? name (normalize "reference")) (reference-number-restart-list cmp))
 | |
|      ((equal? name (normalize "preface"))   (preface-number-restart-list cmp))
 | |
|      ((equal? name (normalize "chapter"))   (chapter-number-restart-list cmp))
 | |
|      ((equal? name (normalize "appendix"))  (appendix-number-restart-list cmp))
 | |
|      ((equal? name (normalize "article"))   (article-number-restart-list cmp))
 | |
|      ((equal? name (normalize "glossary"))  (glossary-number-restart-list cmp))
 | |
|      ((equal? name (normalize "bibliography")) (bibliography-number-restart-list cmp))
 | |
|      ((equal? name (normalize "index"))     (index-number-restart-list cmp))
 | |
|      ((equal? name (normalize "setindex"))  (setindex-number-restart-list cmp))
 | |
|      ((equal? name (normalize "refentry"))  (refentry-number-restart-list cmp))
 | |
|      (else (default-number-restart-list cmp)))))
 | |
| 
 | |
| (define (set-number-ignore-list cmp)       '())
 | |
| (define (book-number-ignore-list cmp)      '())
 | |
| (define (part-number-ignore-list cmp)      '())
 | |
| (define (reference-number-ignore-list cmp) (list (normalize "part")))
 | |
| (define (preface-number-ignore-list cmp)   (list (normalize "part")))
 | |
| (define (chapter-number-ignore-list cmp)   (list (normalize "part")))
 | |
| (define (appendix-number-ignore-list cmp)  (list (normalize "part")))
 | |
| (define (article-number-ignore-list cmp)   (list (normalize "part")))
 | |
| (define (glossary-number-ignore-list cmp)  (list (normalize "part")))
 | |
| (define (bibliography-number-ignore-list cmp) (list (normalize "part")))
 | |
| (define (index-number-ignore-list cmp)     (list (normalize "part")))
 | |
| (define (setindex-number-ignore-list cmp)  (list (normalize "part")))
 | |
| (define (refentry-number-ignore-list cmp)  '())
 | |
| (define (default-number-ignore-list cmp)   '())
 | |
| 
 | |
| (define (component-number-ignore-list cmp)
 | |
|   ;; Return the list of elements (inside the restart list) which are
 | |
|   ;; hierarchy levels which should be ignored.  For example, for CHAPTER,
 | |
|   ;; it might return '("PART") causing chapter numbering inside books
 | |
|   ;; to ignore parts.
 | |
|   ;;
 | |
|   ;; Basically, if you skip up past a component/division element in
 | |
|   ;; the restart list, you better put the element(s) you skipped in 
 | |
|   ;; the ignore list or the stylesheet may never see your component
 | |
|   ;; when it's trying to do the numbering.
 | |
|   (let ((name (gi cmp)))
 | |
|     (cond
 | |
|      ((equal? name (normalize "set"))       (set-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "book"))      (book-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "part"))      (part-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "reference")) (reference-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "preface"))   (preface-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "chapter"))   (chapter-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "appendix"))  (appendix-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "article"))   (article-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "glossary"))  (glossary-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "bibliography")) (bibliography-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "index"))     (index-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "setindex"))  (setindex-number-ignore-list cmp))
 | |
|      ((equal? name (normalize "refentry"))  (refentry-number-ignore-list cmp))
 | |
|      (else (default-number-ignore-list cmp)))))
 | |
| 
 | |
| (define (set-number-sibling-list cmp)       '())
 | |
| (define (book-number-sibling-list cmp)      '())
 | |
| (define (part-number-sibling-list cmp)      '())
 | |
| (define (reference-number-sibling-list cmp) '())
 | |
| (define (preface-number-sibling-list cmp)   '())
 | |
| (define (chapter-number-sibling-list cmp)   '())
 | |
| (define (appendix-number-sibling-list cmp)  '())
 | |
| (define (article-number-sibling-list cmp)   '())
 | |
| (define (glossary-number-sibling-list cmp)  '())
 | |
| (define (bibliography-number-sibling-list cmp) '())
 | |
| (define (index-number-sibling-list cmp)     '())
 | |
| (define (setindex-number-sibling-list cmp)  '())
 | |
| (define (refentry-number-sibling-list cmp)  '())
 | |
| (define (default-number-sibling-list cmp)   '())
 | |
| 
 | |
| (define (component-number-sibling-list cmp)
 | |
|   ;; Return the list of elements with which 'cmp' should be numbered.
 | |
|   ;; For example, for PART it might return '("PART" "REFERENCE") causing
 | |
|   ;; sibling parts and references to be numbered together.
 | |
|   (let ((name (gi cmp)))
 | |
|     (cond
 | |
|      ((equal? name (normalize "set"))       (set-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "book"))      (book-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "part"))      (part-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "reference")) (reference-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "preface"))   (preface-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "chapter"))   (chapter-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "appendix"))  (appendix-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "article"))   (article-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "glossary"))  (glossary-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "bibliography")) (bibliography-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "index"))     (index-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "setindex"))  (setindex-number-sibling-list cmp))
 | |
|      ((equal? name (normalize "refentry"))  (refentry-number-sibling-list cmp))
 | |
|      (else (default-number-sibling-list cmp)))))
 | |
| 
 | |
| (define (component-number component-node)
 | |
|   (let* ((root  (ancestor-member component-node 
 | |
| 				 (component-number-restart-list 
 | |
| 				  component-node)))
 | |
| 	 (clist (expand-children (children root) 
 | |
| 				 (component-number-ignore-list
 | |
| 				  component-node)))
 | |
| 	 (slist (append (list (gi component-node))
 | |
| 			(component-number-sibling-list component-node))))
 | |
|     (let loop ((nl clist) (count 1))
 | |
|       (if (node-list-empty? nl) 
 | |
| 	  1
 | |
| 	  (if (node-list=? (node-list-first nl) component-node)
 | |
| 	      count
 | |
| 	      (if (member (gi (node-list-first nl)) slist)
 | |
| 		  (loop (node-list-rest nl) (+ count 1))
 | |
| 		  (loop (node-list-rest nl) count)))))))
 | |
| 
 | |
| ;; == components and divisions == 
 | |
| 
 | |
| (define (set-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (book-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (part-autolabel nd #!optional (force-label? #f))
 | |
|   (format-number (component-number nd) (label-number-format nd)))
 | |
| 
 | |
| (define (reference-autolabel nd #!optional (force-label? #f))
 | |
|   (format-number (component-number nd) (label-number-format nd)))
 | |
| 
 | |
| (define (preface-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (chapter-autolabel nd #!optional (force-label? #f))
 | |
|   (if (or force-label? %chapter-autolabel%)
 | |
|       (format-number (component-number nd) (label-number-format nd))
 | |
|       ""))
 | |
| 
 | |
| (define (appendix-autolabel nd #!optional (force-label? #f))
 | |
|   ;; Abandoned special processing for appendixes in articles. Maybe
 | |
|   ;; it's a good idea, but it can't be done here because it screws
 | |
|   ;; up cross references to appendixes.
 | |
|   (if (or force-label? %chapter-autolabel%)
 | |
|       (format-number (component-number nd) (label-number-format nd))
 | |
|       ""))
 | |
| 
 | |
| (define (article-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (glossary-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (bibliography-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (index-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (indexdiv-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (colophon-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (setindex-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (refentry-autolabel nd #!optional (force-label? #f))
 | |
|   (let* ((isep       (gentext-intra-label-sep nd))
 | |
| 	 (refnamediv (select-elements (children nd)
 | |
| 				      (normalize "refnamediv")))
 | |
| 	 (refd       (select-elements (children refnamediv)
 | |
| 				      (normalize "refdescriptor")))
 | |
| 	 (refnames   (select-elements (children refnamediv)
 | |
| 				      (normalize "refname"))))
 | |
|     ""))
 | |
| 
 | |
| ;; == /components and divisions == 
 | |
| 
 | |
| (define (dedication-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (bibliodiv-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (glossdiv-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (section-autolabel-prefix nd)
 | |
|   (let* ((isep   (gentext-intra-label-sep nd))
 | |
| 	 (haschn (not (node-list-empty? (ancestor (normalize "chapter") nd))))
 | |
| 	 (hasapn (not (node-list-empty? (ancestor (normalize "appendix") nd)))))
 | |
|     (cond
 | |
|      (haschn (string-append 
 | |
| 	      (element-label (ancestor (normalize "chapter") nd)) isep))
 | |
|      (hasapn (string-append 
 | |
| 	      (element-label (ancestor (normalize "appendix") nd)) isep))
 | |
|      (else ""))))
 | |
| 
 | |
| (define (section-autolabel nd #!optional (force-label? #f))
 | |
|   (let* ((isep (gentext-intra-label-sep nd))
 | |
| 	 (hasprf (not (node-list-empty? (ancestor (normalize "preface") nd))))
 | |
| 	 (prefix (section-autolabel-prefix nd)))
 | |
|     (if (and (or force-label? %section-autolabel%)
 | |
| 	     (or %label-preface-sections%
 | |
| 		 (not hasprf)))
 | |
| 	(cond
 | |
| 	 ((equal? (gi nd) (normalize "sect1"))
 | |
| 	  (string-append prefix (format-number (child-number nd) 
 | |
| 					       (label-number-format nd))))
 | |
| 	 ((equal? (gi nd) (normalize "sect2"))
 | |
| 	  (string-append 
 | |
| 	   (element-label (ancestor (normalize "sect1") nd) force-label?)
 | |
| 	   isep 
 | |
| 	   (format-number (child-number nd) (label-number-format nd))))
 | |
| 	 ((equal? (gi nd) (normalize "sect3"))
 | |
| 	  (string-append
 | |
| 	   (element-label (ancestor (normalize "sect2") nd) force-label?)
 | |
| 	   isep 
 | |
| 	   (format-number (child-number nd) (label-number-format nd))))
 | |
| 	 ((equal? (gi nd) (normalize "sect4"))
 | |
| 	  (string-append
 | |
| 	   (element-label (ancestor (normalize "sect3") nd) force-label?)
 | |
| 	   isep 
 | |
| 	   (format-number (child-number nd) (label-number-format nd))))
 | |
| 	 ((equal? (gi nd) (normalize "sect5"))
 | |
| 	  (string-append 
 | |
| 	   (element-label (ancestor (normalize "sect4") nd) force-label?)
 | |
| 	   isep 
 | |
| 	   (format-number (child-number nd) (label-number-format nd))))
 | |
| 
 | |
| 	 ((equal? (gi nd) (normalize "simplesect"))
 | |
| 	  (let* ((possible-sect-ancestors
 | |
| 		  (node-list (ancestor (normalize "section") nd)
 | |
| 			     (ancestor (normalize "sect5") nd)
 | |
| 			     (ancestor (normalize "sect4") nd)
 | |
| 			     (ancestor (normalize "sect3") nd)
 | |
| 			     (ancestor (normalize "sect2") nd)
 | |
| 			     (ancestor (normalize "sect1") nd)))
 | |
| 		 (section-ancestor (node-list-first possible-sect-ancestors)))
 | |
| 	    (if (node-list-empty? section-ancestor)
 | |
| 		(string-append prefix (format-number (child-number nd) 
 | |
| 						     (label-number-format nd)))
 | |
| 		(string-append 
 | |
| 		 (element-label section-ancestor force-label?)
 | |
| 		 isep 
 | |
| 		 (format-number (child-number nd) (label-number-format nd))))))
 | |
| 
 | |
| 	 ((equal? (gi nd) (normalize "section"))
 | |
| 	  (if (node-list-empty? (ancestor (normalize "section") nd))
 | |
| 	      (string-append prefix (format-number (child-number nd) 
 | |
| 						   (label-number-format nd)))
 | |
| 	      (string-append 
 | |
| 	       (element-label (ancestor (normalize "section") nd) force-label?)
 | |
| 	       isep 
 | |
| 	       (format-number (child-number nd) (label-number-format nd)))))
 | |
| 	 (else (string-append (gi nd) " IS NOT A SECTION!")))
 | |
| 	"")))
 | |
|   
 | |
| (define (refsection-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (step-autolabel nd #!optional (force-label? #f))
 | |
|   ($proc-step-xref-number$ nd))
 | |
| 
 | |
| (define (listitem-autolabel nd #!optional (force-label? #f))
 | |
|   (if (equal? (gi (parent nd)) (normalize "orderedlist"))
 | |
|       (number->string (child-number nd))
 | |
|       "[xref to LISTITEM only supported in ORDEREDLIST]"))
 | |
| 
 | |
| (define (sidebar-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (legalnotice-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (abstract-autolabel nd #!optional (force-label? #f))
 | |
|   "")
 | |
| 
 | |
| (define (block-autolabel nd #!optional (force-label? #f))
 | |
|   (let* ((chn    (element-label (ancestor (normalize "chapter") nd)))
 | |
| 	 (apn    (element-label (ancestor (normalize "appendix") nd)))
 | |
| 	 (rfn    (element-label (ancestor (normalize "refentry") nd)))
 | |
| 	 ;; If the root of this document isn't in component-element-list, these
 | |
| 	 ;; things all wind up being numbered 0. To avoid that, we force the
 | |
| 	 ;; root element to be in the list of components if it isn't already
 | |
| 	 ;; a component.
 | |
| 	 (incomp (member (gi (sgml-root-element)) (component-element-list)))
 | |
| 	 ;; In articles in books, number blocks from book not from article.
 | |
| 	 ;; Otherwise you get 1, 1, 1, 1, etc. for the first figure in each
 | |
| 	 ;; article.
 | |
| 	 (artinbook (and (not (node-list-empty? (ancestor (normalize "article") nd)))
 | |
| 			 (not (node-list-empty? (ancestor (normalize "book") nd)))))
 | |
| 
 | |
| 	 (bkn    (if artinbook
 | |
| 		     (format-number (component-child-number
 | |
| 				     nd
 | |
| 				     (list (normalize "book")))
 | |
| 				    (label-number-format nd))
 | |
| 		     (if incomp
 | |
| 			 (format-number (component-child-number
 | |
| 					 nd
 | |
| 					 (component-element-list))
 | |
| 					(label-number-format nd))
 | |
| 			 (format-number (component-child-number
 | |
| 					 nd
 | |
| 					 (append (component-element-list)
 | |
| 						 (list (gi (sgml-root-element)))))
 | |
| 					(label-number-format nd))))))
 | |
|     (if (equal? chn "")
 | |
| 	(if (equal? apn "")
 | |
| 	    (if (equal? rfn "")
 | |
| 		bkn
 | |
| 		(string-append rfn (gentext-intra-label-sep nd) bkn))
 | |
| 	    (string-append apn (gentext-intra-label-sep nd) bkn))
 | |
| 	(string-append chn (gentext-intra-label-sep nd) bkn))))
 | |
| 
 | |
| ;; For all elements, if a LABEL attribute is present, that is the label
 | |
| ;; that they get.  Otherwise:
 | |
| ;; BOOK gets the Book volume, by book-autolabel
 | |
| ;; PREFACE gets "", by preface-autolabel
 | |
| ;; CHAPTER gets the Chapter number, by chapter-autolabel
 | |
| ;; APPENDIX gets the Appendix letter, by appendix-autolabel
 | |
| ;; REFERENCE gets "", by reference-autolabel
 | |
| ;; REFENTRY gets "", by refentry-autolabel
 | |
| ;; SECT* gets the nested section number (e.g., 1.3.5), by section-autolabel
 | |
| ;; REFSECT* gets the nested section number, by refsection-autolabel
 | |
| ;; everything else gets numbered by block-autolabel
 | |
| ;;
 | |
| (define (element-label #!optional (nd (current-node)) (force-label? #f))
 | |
|   (if (node-list-empty? nd)
 | |
|       ""
 | |
|       (let ((label (attribute-string (normalize "label") nd)))
 | |
| 	(if label
 | |
| 	    label
 | |
| 	    (cond
 | |
| 	     ;; Use a seperately defined assoc list?
 | |
| 	     ((equal? (gi nd) (normalize "abstract"))
 | |
| 	      (abstract-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "appendix"))
 | |
| 	      (appendix-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "article"))
 | |
| 	      (article-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "bibliodiv"))
 | |
| 	      (bibliodiv-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "bibliography"))
 | |
| 	      (bibliography-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "book"))
 | |
| 	      (book-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "chapter"))
 | |
| 	      (chapter-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "dedication"))
 | |
| 	      (dedication-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "glossary"))
 | |
| 	      (glossary-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "glossdiv"))
 | |
| 	      (glossdiv-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "index"))
 | |
| 	      (index-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "colophon"))
 | |
| 	      (colophon-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "indexdiv"))
 | |
| 	      (indexdiv-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "setindex"))
 | |
| 	      (setindex-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "legalnotice"))
 | |
| 	      (legalnotice-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "listitem"))
 | |
| 	      (listitem-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "part"))
 | |
| 	      (part-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "preface"))
 | |
| 	      (preface-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "refentry"))
 | |
| 	      (refentry-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "reference"))
 | |
| 	      (reference-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "refsynopsisdiv"))
 | |
| 	      (refsection-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "refsect1"))
 | |
| 	      (refsection-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "refsect2"))
 | |
| 	      (refsection-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "refsect3"))
 | |
| 	      (refsection-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "sect1"))
 | |
| 	      (section-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "sect2"))
 | |
| 	      (section-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "sect3"))
 | |
| 	      (section-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "sect4"))
 | |
| 	      (section-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "sect5"))
 | |
| 	      (section-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "section"))
 | |
| 	      (section-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "simplesect"))
 | |
| 	      (section-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "set"))
 | |
| 	      (set-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "sidebar"))
 | |
| 	      (sidebar-autolabel nd force-label?))
 | |
| 	     ((equal? (gi nd) (normalize "step"))
 | |
| 	      (step-autolabel nd force-label?))
 | |
| 	     (else (block-autolabel nd force-label?)))))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| 
 | |
| ;; Returns the element label as a sosofo
 | |
| ;;
 | |
| (define (element-label-sosofo nd #!optional (force-label? #f))
 | |
|   (if (string=? (element-label nd force-label?) "")
 | |
|       (empty-sosofo)
 | |
|       (make sequence
 | |
| 	(literal (element-label nd force-label?)))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| 
 | |
| (define (set-title nd)
 | |
|   (let* ((setinfo (select-elements (children nd) (normalize "setinfo")))
 | |
| 	 (sititles (select-elements  
 | |
| 		    (expand-children (children setinfo) 
 | |
| 				     (list (normalize "bookbiblio") 
 | |
| 					    (normalize "bibliomisc")
 | |
| 					    (normalize "biblioset")))
 | |
| 		    (normalize "title")))
 | |
| 	 (settitles (select-elements (children nd) (normalize "title")))
 | |
| 	 (titles   (if (node-list-empty? settitles)
 | |
| 		       sititles
 | |
| 		       settitles)))
 | |
|     (if (node-list-empty? titles)
 | |
| 	""
 | |
| 	(node-list-first titles))))
 | |
| 
 | |
| (define (book-title nd)
 | |
|   (let* ((bookinfo (select-elements (children nd) (normalize "bookinfo")))
 | |
| 	 (bititles (select-elements  
 | |
| 		    (expand-children (children bookinfo) 
 | |
| 				     (list (normalize "bookbiblio") 
 | |
| 					   (normalize "bibliomisc")
 | |
| 					   (normalize "biblioset")))
 | |
| 		    (normalize "title")))
 | |
| 	 (chtitles (select-elements (children nd) (normalize "title")))
 | |
| 	 (titles   (if (node-list-empty? chtitles)
 | |
| 		       bititles
 | |
| 		       chtitles)))
 | |
|     (if (node-list-empty? titles)
 | |
| 	""
 | |
| 	(node-list-first titles))))
 | |
| 
 | |
| (define (part-title nd)
 | |
|   (let* ((docinfo  (select-elements (children nd) (normalize "docinfo")))
 | |
| 	 (dititles (select-elements  
 | |
| 		    (expand-children (children docinfo) 
 | |
| 				     (list (normalize "bookbiblio") 
 | |
| 					   (normalize "bibliomisc")
 | |
| 					   (normalize "biblioset")))
 | |
| 		    (normalize "title")))
 | |
| 	 (chtitles (select-elements (children nd) (normalize "title")))
 | |
| 	 (titles   (if (node-list-empty? chtitles)
 | |
| 		       dititles
 | |
| 		       chtitles)))
 | |
|     (if (node-list-empty? titles)
 | |
| 	""
 | |
| 	(node-list-first titles))))
 | |
| 
 | |
| (define (article-title nd)
 | |
|   (let* ((artchild  (children nd))
 | |
| 	 (artheader (select-elements artchild (normalize "artheader")))
 | |
| 	 (ahtitles  (select-elements (children artheader) 
 | |
| 				     (normalize "title")))
 | |
| 	 (artitles  (select-elements artchild (normalize "title")))
 | |
| 	 (titles    (if (node-list-empty? artitles)
 | |
| 			ahtitles
 | |
| 			artitles)))
 | |
|     (if (node-list-empty? titles)
 | |
| 	""
 | |
| 	(node-list-first titles))))
 | |
| 
 | |
| (define (preface-title nd)
 | |
|   (chapter-title nd))
 | |
| 
 | |
| (define (chapter-title nd)
 | |
|   (let* ((docinfo  (select-elements (children nd) (normalize "docinfo")))
 | |
| 	 (dititles (select-elements  
 | |
| 		    (expand-children (children docinfo) 
 | |
| 				     (list (normalize "bookbiblio") 
 | |
| 					   (normalize "bibliomisc")
 | |
| 					   (normalize "biblioset")))
 | |
| 		    (normalize "title")))
 | |
| 	 (chtitles (select-elements (children nd) (normalize "title")))
 | |
| 	 (titles   (if (node-list-empty? chtitles)
 | |
| 		       dititles
 | |
| 		       chtitles)))
 | |
|     (if (node-list-empty? titles)
 | |
| 	""
 | |
| 	(node-list-first titles))))
 | |
| 
 | |
| (define (appendix-title nd)
 | |
|   (chapter-title nd))
 | |
| 
 | |
| (define (reference-title nd)
 | |
|   (chapter-title nd))
 | |
| 
 | |
| (define (refsynopsisdiv-title nd)
 | |
|   (optional-title nd))
 | |
| 
 | |
| ;; Returns either the REFENTRYTITLE or the first REFNAME.
 | |
| ;;
 | |
| (define (refentry-title nd)
 | |
|   (let* ((refmeta (select-elements (descendants nd) (normalize "refmeta")))
 | |
| 	 (refttl  (select-elements (descendants refmeta) (normalize "refentrytitle")))
 | |
| 	 (refndiv (select-elements (descendants nd) (normalize "refnamediv")))
 | |
| 	 (refname (select-elements (descendants refndiv) (normalize "refname"))))
 | |
|     (if (node-list-empty? refttl)
 | |
| 	(if (node-list-empty? refname)
 | |
| 	    ""
 | |
| 	    (node-list-first refname))
 | |
| 	(node-list-first refttl))))
 | |
| 
 | |
| (define (optional-title nd)
 | |
|   (let* ((docinfo  (select-elements (children nd) (normalize "docinfo")))
 | |
| 	 (dititles (select-elements (children docinfo) (normalize "title")))
 | |
| 	 (chtitles (select-elements (children nd) (normalize "title")))
 | |
| 	 (titles   (if (node-list-empty? chtitles)
 | |
| 		       dititles
 | |
| 		       chtitles)))
 | |
|     (if (node-list-empty? titles)
 | |
| 	(gentext-element-name nd)
 | |
| 	(node-list-first titles))))
 | |
| 
 | |
| (define (glossary-title nd)
 | |
|   (optional-title nd))
 | |
| 
 | |
| (define (bibliography-title nd)
 | |
|   (optional-title nd))
 | |
| 
 | |
| (define (index-title nd)
 | |
|   (optional-title nd))
 | |
| 
 | |
| (define (setindex-title nd)
 | |
|   (optional-title nd))
 | |
| 
 | |
| (define (dedication-title nd)
 | |
|   (optional-title nd))
 | |
| 
 | |
| (define (colophon-title nd)
 | |
|   (gentext-element-name nd))
 | |
| 
 | |
| (define (section-title nd)
 | |
|   (let* ((info     (select-elements (children nd) 
 | |
| 				    (list (normalize "sect1info")
 | |
| 					  (normalize "sect2info")
 | |
| 					  (normalize "sect3info")
 | |
| 					  (normalize "sect4info")
 | |
| 					  (normalize "sect5info")
 | |
| 					  (normalize "section"))))
 | |
| 	 (ititles  (select-elements (children info) (normalize "title")))
 | |
| 	 (ctitles  (select-elements (children nd) (normalize "title")))
 | |
| 	 (titles   (if (node-list-empty? ctitles)
 | |
| 		       ititles
 | |
| 		       ctitles)))
 | |
|     (if (node-list-empty? titles)
 | |
| 	""
 | |
| 	(node-list-first titles))))
 | |
| 
 | |
| (define (refsection-title nd)
 | |
|   (let* ((info     (select-elements (children nd) 
 | |
| 				    (list (normalize "refsect1info")
 | |
| 					  (normalize "refsect2info") 
 | |
| 					  (normalize "refsect3info"))))
 | |
| 	 (ititles  (select-elements (children info) (normalize "title")))
 | |
| 	 (ctitles  (select-elements (children nd) (normalize "title")))
 | |
| 	 (titles   (if (node-list-empty? ctitles)
 | |
| 		       ititles
 | |
| 		       ctitles)))
 | |
|     (if (node-list-empty? titles)
 | |
| 	""
 | |
| 	(node-list-first titles))))
 | |
| 
 | |
| (define (block-title nd)
 | |
|   (let ((titles (select-elements (children nd) (normalize "title"))))
 | |
|     (if (node-list-empty? titles)
 | |
| 	""
 | |
| 	(node-list-first titles))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| 
 | |
| (define (set-title-sosofo nd)
 | |
|   (let ((title (set-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (book-title-sosofo nd)
 | |
|   (let ((title (book-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (part-title-sosofo nd)
 | |
|   (let ((title (part-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (article-title-sosofo nd)
 | |
|   (let ((title (article-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (preface-title-sosofo nd)
 | |
|   (let ((title (preface-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (chapter-title-sosofo nd)
 | |
|   (let ((title (chapter-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (appendix-title-sosofo nd)
 | |
|   (let ((title (appendix-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (reference-title-sosofo nd)
 | |
|   (let ((title (reference-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (refsynopsisdiv-title-sosofo nd)
 | |
|   (optional-title-sosofo nd))
 | |
| 
 | |
| (define (refentry-title-sosofo nd)
 | |
|   (let ((title (refentry-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (optional-title-sosofo nd)
 | |
|   (let ((title (optional-title nd)))
 | |
|     (if (string? title)
 | |
| 	(literal title)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (glossary-title-sosofo nd)
 | |
|   (optional-title-sosofo nd))
 | |
| 
 | |
| (define (bibliography-title-sosofo nd)
 | |
|   (optional-title-sosofo nd))
 | |
| 
 | |
| (define (index-title-sosofo nd)
 | |
|   (optional-title-sosofo nd))
 | |
| 
 | |
| (define (setindex-title-sosofo nd)
 | |
|   (optional-title-sosofo nd))
 | |
| 
 | |
| (define (dedication-title-sosofo nd)
 | |
|   (optional-title-sosofo nd))
 | |
| 
 | |
| (define (colophon-title-sosofo nd)
 | |
|   (literal (gentext-element-name nd)))
 | |
| 
 | |
| (define (section-title-sosofo nd)
 | |
|   (let ((title (section-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (refsection-title-sosofo nd)
 | |
|   (let ((title (refsection-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (define (block-title-sosofo nd)
 | |
|   (let ((title (block-title nd)))
 | |
|     (if (string? title)
 | |
| 	(empty-sosofo)
 | |
| 	(with-mode title-sosofo-mode
 | |
| 	  (process-node-list title)))))
 | |
| 
 | |
| (mode title-sosofo-mode
 | |
|   (element title
 | |
|     (process-children-trim))
 | |
| 
 | |
|   (element citetitle
 | |
|     (process-children-trim))
 | |
| 
 | |
|   (element refname
 | |
|     (process-children-trim))
 | |
| 
 | |
|   (element refentrytitle
 | |
|     (process-children-trim)))
 | |
| 
 | |
| ;; Returns the title of the element as a sosofo.
 | |
| ;;
 | |
| (define (element-title-sosofo #!optional (nd (current-node)))
 | |
|   (if (node-list-empty? nd)
 | |
|       (empty-sosofo)
 | |
|       (cond
 | |
|        ;; Use a seperately defined assoc list?
 | |
|        ((equal? (gi nd) (normalize "appendix")) (appendix-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "article")) (article-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "bibliography")) (bibliography-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "book")) (book-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "chapter")) (chapter-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "dedication")) (dedication-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "glossary")) (glossary-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "index")) (index-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "colophon")) (colophon-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "setindex")) (index-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "part")) (part-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "preface")) (preface-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "refentry")) (refentry-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "reference")) (reference-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "refsect1")) (refsection-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "refsect2")) (refsection-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "refsect3")) (refsection-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "refsynopsisdiv")) (refsynopsisdiv-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "sect1")) (section-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "sect2")) (section-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "sect3")) (section-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "sect4")) (section-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "sect5")) (section-title-sosofo nd))
 | |
|        ((equal? (gi nd) (normalize "set")) (set-title-sosofo nd))
 | |
|        (else (block-title-sosofo nd)))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| 
 | |
| ;; Returns the title of the element; returns a node if possible, or a string
 | |
| (define (element-title nd)
 | |
|   (if (node-list-empty? nd)
 | |
|       ""
 | |
|       (cond
 | |
|        ;; Use a seperately defined assoc list?
 | |
|        ((equal? (gi nd) (normalize "appendix")) (appendix-title nd))
 | |
|        ((equal? (gi nd) (normalize "article")) (article-title nd))
 | |
|        ((equal? (gi nd) (normalize "bibliography")) (bibliography-title nd))
 | |
|        ((equal? (gi nd) (normalize "book")) (book-title nd))
 | |
|        ((equal? (gi nd) (normalize "chapter")) (chapter-title nd))
 | |
|        ((equal? (gi nd) (normalize "dedication")) (dedication-title nd))
 | |
|        ((equal? (gi nd) (normalize "glossary")) (glossary-title nd))
 | |
|        ((equal? (gi nd) (normalize "index")) (index-title nd))
 | |
|        ((equal? (gi nd) (normalize "colophon")) (colophon-title nd))
 | |
|        ((equal? (gi nd) (normalize "setindex")) (setindex-title nd))
 | |
|        ((equal? (gi nd) (normalize "part")) (part-title nd))
 | |
|        ((equal? (gi nd) (normalize "preface")) (preface-title nd))
 | |
|        ((equal? (gi nd) (normalize "refentry")) (refentry-title nd))
 | |
|        ((equal? (gi nd) (normalize "reference")) (reference-title nd))
 | |
|        ((equal? (gi nd) (normalize "refsect1")) (refsection-title nd))
 | |
|        ((equal? (gi nd) (normalize "refsect2")) (refsection-title nd))
 | |
|        ((equal? (gi nd) (normalize "refsect3")) (refsection-title nd))
 | |
|        ((equal? (gi nd) (normalize "refsynopsisdiv")) (refsynopsisdiv-title nd))
 | |
|        ((equal? (gi nd) (normalize "sect1")) (section-title nd))
 | |
|        ((equal? (gi nd) (normalize "sect2")) (section-title nd))
 | |
|        ((equal? (gi nd) (normalize "sect3")) (section-title nd))
 | |
|        ((equal? (gi nd) (normalize "sect4")) (section-title nd))
 | |
|        ((equal? (gi nd) (normalize "sect5")) (section-title nd))
 | |
|        ((equal? (gi nd) (normalize "set")) (set-title nd))
 | |
|        (else (block-title nd)))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| ;; Returns the data of a node, carefully excising INDEXTERMs from 
 | |
| ;; the data content
 | |
| ;;
 | |
| 
 | |
| (define (data-of node)
 | |
|   ;; return the data characters of a node, except for the content of
 | |
|   ;; indexterms which are suppressed.
 | |
|   (let loop ((nl (children node)) (result ""))
 | |
|     (if (node-list-empty? nl)
 | |
| 	result
 | |
| 	(if (equal? (node-property 'class-name (node-list-first nl)) 'element)
 | |
| 	    (if (or (equal? (gi (node-list-first nl)) (normalize "indexterm"))
 | |
| 		    (equal? (gi (node-list-first nl)) (normalize "comment"))
 | |
| 		    (equal? (gi (node-list-first nl)) (normalize "remark")))
 | |
| 		(loop (node-list-rest nl) result)
 | |
| 		(loop (node-list-rest nl)
 | |
| 		      (string-append result (data-of (node-list-first nl)))))
 | |
| 	    (if (or (equal? (node-property 'class-name (node-list-first nl))
 | |
| 			    'data-char)
 | |
| 		    (equal? (node-property 'class-name (node-list-first nl))
 | |
| 			    'sdata))
 | |
| 		(loop (node-list-rest nl)
 | |
| 		      (string-append result (data (node-list-first nl))))
 | |
| 		(loop (node-list-rest nl) result))))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| ;; Returns the element title data of nd
 | |
| ;;
 | |
| (define (element-title-string nd)
 | |
|   (let ((title (element-title nd)))
 | |
|     (if (string? title)
 | |
| 	title
 | |
| 	(data-of title))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| ;; Returns the element gi as a sosofo
 | |
| ;;
 | |
| (define (element-gi-sosofo nd)
 | |
|   (if (node-list-empty? nd)
 | |
|       (empty-sosofo)
 | |
|       (make sequence
 | |
| 	(literal (gentext-element-name nd)))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| 
 | |
| (define (titlepage-info-elements node info #!optional (intro (empty-node-list)))
 | |
|   ;; Returns a node-list of the elements that might appear on a title
 | |
|   ;; page.  This node-list is constructed as follows:
 | |
|   ;;
 | |
|   ;; 1. The "title" child of node is considered as a possibility
 | |
|   ;; 2. If info is not empty, then node-list starts as the children
 | |
|   ;;    of info.  If the children of info don't include a title, then
 | |
|   ;;    the title from the node is added.
 | |
|   ;; 3. If info is empty, then node-list starts as the children of node,
 | |
|   ;;    but with "partintro" filtered out.
 | |
| 
 | |
|   (let* ((title (select-elements (children node) (normalize "title")))
 | |
| 	 (nl    (if (node-list-empty? info)
 | |
| 		    (node-list-filter-by-not-gi (children node) 
 | |
| 						(list (normalize "partintro")))
 | |
| 		    (children info)))
 | |
| 	 (nltitle (node-list-filter-by-gi nl (list (normalize "title")))))
 | |
|     (if (node-list-empty? info)
 | |
| 	(node-list nl
 | |
| 		   intro)
 | |
| 	(node-list (if (node-list-empty? nltitle)
 | |
| 		       title
 | |
| 		       (empty-node-list))
 | |
| 		   nl
 | |
| 		   intro))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| 
 | |
| (define (info-element #!optional (nd (current-node)))
 | |
|   ;; Returns the *INFO element for the nd or (empty-node-list) if no
 | |
|   ;; such node exists...
 | |
|   (cond
 | |
|    ((equal? (gi nd) (normalize "set"))
 | |
|     (select-elements (children nd) (normalize "setinfo")))
 | |
|    ((equal? (gi nd) (normalize "book"))
 | |
|     (select-elements (children nd) (normalize "bookinfo")))
 | |
|    ((equal? (gi nd) (normalize "section"))
 | |
|     (select-elements (children nd) (normalize "sectioninfo")))
 | |
|    ((equal? (gi nd) (normalize "sect1"))
 | |
|     (select-elements (children nd) (normalize "sect1info")))
 | |
|    ((equal? (gi nd) (normalize "sect2"))
 | |
|     (select-elements (children nd) (normalize "sect2info")))
 | |
|    ((equal? (gi nd) (normalize "sect3"))
 | |
|     (select-elements (children nd) (normalize "sect3info")))
 | |
|    ((equal? (gi nd) (normalize "sect4"))
 | |
|     (select-elements (children nd) (normalize "sect4info")))
 | |
|    ((equal? (gi nd) (normalize "sect5"))
 | |
|     (select-elements (children nd) (normalize "sect5info")))
 | |
|    ((equal? (gi nd) (normalize "refsect1"))
 | |
|     (select-elements (children nd) (normalize "refsect1info")))
 | |
|    ((equal? (gi nd) (normalize "refsect2"))
 | |
|     (select-elements (children nd) (normalize "refsect2info")))
 | |
|    ((equal? (gi nd) (normalize "refsect3"))
 | |
|     (select-elements (children nd) (normalize "refsect3info")))
 | |
|    ((equal? (gi nd) (normalize "refsynopsisdiv"))
 | |
|     (select-elements (children nd) (normalize "refsynopsisdivinfo")))
 | |
|    ((equal? (gi nd) (normalize "article"))
 | |
|     (node-list-filter-by-gi (children nd) (list
 | |
| 					   (normalize "artheader")
 | |
| 					   (normalize "articleinfo"))))
 | |
|    (else ;; BIBLIODIV, GLOSSDIV, INDEXDIV, PARTINTRO, SIMPLESECT
 | |
|     (select-elements (children nd) (normalize "docinfo")))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| ;;
 | |
| ;; Bibliography filtering...
 | |
| 
 | |
| (define (biblio-filter allentries)
 | |
|   (let* ((all  (descendants (sgml-root-element)))
 | |
| 	 (link (select-elements all (normalize "link")))
 | |
| 	 (xref (select-elements all (normalize "xref")))
 | |
| 	 (cite (select-elements all (normalize "citation")))
 | |
| 	 (xref-elements (node-list link xref)))
 | |
|     (let loop ((entries allentries) (used (empty-node-list)))
 | |
|       (if (node-list-empty? entries)
 | |
| 	  used
 | |
| 	  (if (or (cited-by-xref (node-list-first entries) xref-elements)
 | |
| 		  (cited-by-citation (node-list-first entries) cite))
 | |
| 	      (loop (node-list-rest entries) 
 | |
| 		    (node-list used (node-list-first entries)))
 | |
| 	      (loop (node-list-rest entries) used))))))
 | |
| 
 | |
| (define (cited-by-xref bib xref-elements)
 | |
|   (let* ((id (attribute-string (normalize "id") bib)))
 | |
|     (if id
 | |
| 	(let loop ((links xref-elements))
 | |
| 	  (if (node-list-empty? links)
 | |
| 	      #f
 | |
| 	      (if (equal? (attribute-string (normalize "linkend") 
 | |
| 					    (node-list-first links)) id)
 | |
| 		  #t
 | |
| 		  (loop (node-list-rest links)))))
 | |
| 	#f)))
 | |
| 
 | |
| (define (cited-by-citation bib citations)
 | |
|   (let loop ((links citations))
 | |
|     (if (node-list-empty? links)
 | |
| 	#f
 | |
| 	(if (citation-matches-target? (node-list-first links) bib)
 | |
| 	    #t
 | |
| 	    (loop (node-list-rest links))))))
 | |
| 
 | |
| (define (citation-matches-target? citation target)
 | |
|   (let* ((fchild (node-list-first 
 | |
| 		  (node-list-filter-out-pis 
 | |
| 		   (children target))))
 | |
| 	 (abbrev (if (equal? (gi fchild) (normalize "abbrev"))
 | |
| 		     fchild
 | |
| 		     (empty-node-list)))
 | |
| 	 (cite   (data-of citation)))
 | |
|     (or (equal? (attribute-string "id" target) (normalize cite))
 | |
| 	(equal? (attribute-string "xreflabel" target) (normalize cite))
 | |
| 	(equal? (normalize cite) (normalize (data-of abbrev))))))
 | |
| 
 | |
| (define (bibentry-number bibentry)
 | |
|   (let* ((bgraphy (ancestor-member bibentry 
 | |
| 				   (list (normalize "bibliography"))))
 | |
| 	 (comps   (expand-children (children bgraphy) 
 | |
| 				   (list (normalize "bibliodiv")))))
 | |
|     (let loop ((nl comps) (count 1))
 | |
|       (if (node-list-empty? nl) 
 | |
| 	  0
 | |
| 	  (if (node-list=? (node-list-first nl) bibentry)
 | |
| 	      count
 | |
| 	      (if (or (equal? (gi (node-list-first nl))
 | |
| 			      (normalize "biblioentry"))
 | |
| 		      (equal? (gi (node-list-first nl))
 | |
| 			      (normalize "bibliomixed")))
 | |
| 		  (loop (node-list-rest nl) (+ count 1))
 | |
| 		  (loop (node-list-rest nl) count)))))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| 
 | |
| (define (olink-resource-title pubid sysid)
 | |
|   ;; This version of olink-resource-title expects public identifiers
 | |
|   ;; with the following format:
 | |
|   ;;
 | |
|   ;;   -//owner//TEXT title Vx.x//EN
 | |
|   ;; 
 | |
|   ;; Specifically the title is the description field of the public
 | |
|   ;; identifier minus the first word (TEXT, the type) and the last
 | |
|   ;; word, in my case a version string.  Words are blank delimited.
 | |
|   ;; The parsing will fail if a "/" appears anywhere in any field.
 | |
|   ;; The system identifier is ignored
 | |
|   ;; 
 | |
|   (let* ((pubidparts   (if pubid
 | |
| 			   (split pubid '(#\/))
 | |
| 			   (split "-//none//type version//la" '(#\/))))
 | |
| 	 (description  (car (cdr (cdr pubidparts))))
 | |
| 	 (descparts    (split description))
 | |
| 	 (titleparts   (list-head (cdr descparts) (- (length descparts) 2))))
 | |
|     (join titleparts)))
 | |
| 
 | |
| ;; ======================================================================
 | |
| 
 | |
| (define (orderedlist-listitem-number listitem)
 | |
|   ;; return the number of listitem, taking continuation into account
 | |
|   (let* ((orderedlist (parent listitem))
 | |
| 	 (listitems (select-elements (children orderedlist)
 | |
| 				     (normalize "listitem")))
 | |
| 	 (continue? (equal? (attribute-string (normalize "continuation")
 | |
| 					      orderedlist)
 | |
| 			    (normalize "continues")))
 | |
| 
 | |
| ;; If a list is the continuation of a previous list, we must find the
 | |
| ;; list that is continued in order to calculate the starting
 | |
| ;; item number of this list.
 | |
| ;;
 | |
| ;; Of all the lists in this component, only the following are candidates:
 | |
| ;; 1. Lists which precede this list
 | |
| ;; 2. Lists which are not ancestors of this list
 | |
| ;; 3. Lists that do not have ancestors that are lists which precede this one
 | |
| ;;
 | |
| ;; Of the candidates, the last one, in document order, is the preceding
 | |
| ;; list
 | |
| 	 (all-lists (select-elements
 | |
| 		     (descendants (ancestor-member orderedlist
 | |
| 						   (component-element-list)))
 | |
| 		     (normalize "orderedlist")))
 | |
| 
 | |
| 	 (cand1     (if continue?
 | |
| 			(let loop ((nl all-lists)
 | |
| 				   (prec (empty-node-list)))
 | |
| 			  (if (node-list-empty? nl)
 | |
| 			      prec
 | |
| 			      (if (node-list=? (node-list-first nl)
 | |
| 					       orderedlist)
 | |
| 				  prec
 | |
| 				  (loop (node-list-rest nl)
 | |
| 					(node-list prec
 | |
| 						   (node-list-first nl))))))
 | |
| 			(empty-node-list)))
 | |
| 
 | |
| 	 (cand2     (let loop ((nl cand1)
 | |
| 			       (cand2lists (empty-node-list)))
 | |
| 		      (if (node-list-empty? nl)
 | |
| 			  cand2lists
 | |
| 			  (loop (node-list-rest nl)
 | |
| 				(if (descendant-of? (node-list-first nl)
 | |
| 						    orderedlist)
 | |
| 				    cand2lists
 | |
| 				    (node-list cand2lists
 | |
| 					       (node-list-first nl)))))))
 | |
| 
 | |
| 	 ;; now find the last item of cand2 that is not a descendant
 | |
| 	 ;; of some other element of the cand2 list.
 | |
| 	 (preclist  (let loop ((nl (node-list-reverse cand2)))
 | |
| 		      (if (node-list-empty? nl)
 | |
| 			  (empty-node-list)
 | |
| 			  (if (descendant-member-of?
 | |
| 			       (node-list-first nl)
 | |
| 			       (node-list-rest nl))
 | |
| 			      (loop (node-list-rest nl))
 | |
| 			      (node-list-first nl)))))
 | |
| 
 | |
| 	 (precitem (if (node-list-empty? preclist)
 | |
| 		       (empty-node-list)
 | |
| 		       (node-list-last (children preclist))))
 | |
| 	 (precitem-number (if (and continue? (not (node-list-empty? precitem)))
 | |
| 			      (orderedlist-listitem-number precitem)
 | |
| 			      0)))
 | |
| 
 | |
|     (+ precitem-number (child-number listitem))))
 | |
| 
 | |
| (define (descendant-member-of? node node-list)
 | |
|   ;; return true if node is a descedant of any member of node-list
 | |
|   (let loop ((nl node-list))
 | |
|     (if (node-list-empty? nl)
 | |
| 	#f
 | |
| 	(if (descendant-of? (node-list-first nl) node)
 | |
| 	    #t
 | |
| 	    (loop (node-list-rest nl))))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| 
 | |
| (define (orderedlist-listitem-label listitem)
 | |
|   ;; return the formatted number of listitem
 | |
|   (let* ((number  (orderedlist-listitem-number listitem))
 | |
| 	 (depth   (length (hierarchical-number-recursive
 | |
| 			   (normalize "orderedlist")
 | |
| 			   listitem)))
 | |
| 	 (numeration (inherited-attribute-string (normalize "numeration")
 | |
| 						 listitem))
 | |
| 	 ;; rawnum allows for numbering to alternate
 | |
| 	 (rawnum (cond
 | |
| 		  ((equal? numeration (normalize "arabic")) 1)
 | |
| 		  ((equal? numeration (normalize "loweralpha")) 2)
 | |
| 		  ((equal? numeration (normalize "lowerroman")) 3)
 | |
| 		  ((equal? numeration (normalize "upperalpha")) 4)
 | |
| 		  ((equal? numeration (normalize "upperroman")) 0)
 | |
| 		  (else (modulo depth 5)))))
 | |
|     (case rawnum
 | |
|       ((1) (format-number number "1"))
 | |
|       ((2) (format-number number "a"))
 | |
|       ((3) (format-number number "i"))
 | |
|       ((4) (format-number number "A"))
 | |
|       ((0) (format-number number "I")))))
 | |
| 
 | |
| (define (orderedlist-listitem-label-recursive listitem)
 | |
|   ;; return the recursively formatted number of the listitem.
 | |
|   ;; In other words, something of the form 1.2.3 for a third level
 | |
|   ;; nested ordered list
 | |
|   (let loop ((li (parent listitem)) 
 | |
| 	     (label (orderedlist-listitem-label listitem)))
 | |
|     (if (or (node-list-empty? li)
 | |
| 	    (node-list-empty? (ancestor (normalize "orderedlist") li)))
 | |
| 	label
 | |
| 	(if (and (equal? (gi li) (normalize "listitem"))
 | |
| 		 (equal? (gi (parent li)) (normalize "orderedlist")))
 | |
| 	    (loop (parent li)
 | |
| 		  (string-append 
 | |
| 		   (orderedlist-listitem-label li)
 | |
| 		   (gentext-intra-label-sep li)
 | |
| 		   label))
 | |
| 	    (loop (parent li) label)))))
 | |
| 
 | |
| (define (question-answer-label #!optional (node (current-node)))
 | |
|   (let* ((inhlabel (inherited-attribute-string (normalize "defaultlabel")
 | |
| 					       node))
 | |
| 	 (deflabel (if inhlabel inhlabel (qanda-defaultlabel)))
 | |
| 	 (label    (attribute-string (normalize "label") node))
 | |
| 	 (hnr      (hierarchical-number-recursive (normalize "qandadiv")
 | |
| 						  node))
 | |
| 
 | |
| 	 (parsect  (ancestor-member node (section-element-list)))
 | |
| 
 | |
| 	 (defnum   (if (and %qanda-inherit-numeration% 
 | |
| 			    %section-autolabel%)
 | |
| 		       (if (node-list-empty? parsect)
 | |
| 			   (section-autolabel-prefix node)
 | |
| 			   (section-autolabel parsect))
 | |
| 		       ""))
 | |
| 
 | |
| 	 (hnumber  (let loop ((numlist hnr) (number defnum) 
 | |
| 			      (sep (if (equal? defnum "") "" ".")))
 | |
| 		     (if (null? numlist)
 | |
| 			 number
 | |
| 			 (loop (cdr numlist) 
 | |
| 			       (string-append number
 | |
| 					      sep
 | |
| 					      (number->string (car numlist)))
 | |
| 			       "."))))
 | |
| 	 (cnumber  (child-number (parent node)))
 | |
| 	 (number   (string-append hnumber 
 | |
| 				  (if (equal? hnumber "")
 | |
| 				      ""
 | |
| 				      ".")
 | |
| 				  (number->string cnumber))))
 | |
|     (cond
 | |
|      ((equal? deflabel (normalize "qanda"))
 | |
|       (gentext-element-name node))
 | |
|      ((equal? deflabel (normalize "label"))
 | |
|       label)
 | |
|      ;; Note: only questions are numbered...
 | |
|      ((and (equal? deflabel (normalize "number"))
 | |
| 	   (equal? (gi node) (normalize "question")))
 | |
|       (string-append number "."))
 | |
|      (else ""))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| ;; Calculate term lengths...
 | |
| 
 | |
| (define (varlistentry-term-too-long? vle termlength)
 | |
|   (let loop ((nl (select-elements (children vle) (normalize "term")))
 | |
| 	     (too-long? #f))
 | |
|     (if (or too-long? (node-list-empty? nl))
 | |
| 	too-long?
 | |
| 	(loop (node-list-rest nl)
 | |
| 	      (> (string-length (data (node-list-first nl)))
 | |
| 		 termlength)))))
 | |
| 
 | |
| (define (variablelist-term-too-long? termlength)
 | |
|   (let loop ((nl (select-elements (children (current-node))
 | |
| 				  (normalize "varlistentry")))
 | |
| 	     (too-long? #f))
 | |
|     (if (or too-long? (node-list-empty? nl))
 | |
| 	too-long?
 | |
| 	(loop (node-list-rest nl)
 | |
| 	      (varlistentry-term-too-long? (node-list-first nl) termlength)))))
 | |
| 
 | |
| ;; ======================================================================
 | |
| ;; bibliography elements
 | |
| 
 | |
| (define (biblioentry-inline-elements)
 | |
|   (list (normalize "abbrev")
 | |
| 	(normalize "affiliation")
 | |
| 	(normalize "artpagenums")
 | |
| 	(normalize "author")
 | |
| 	(normalize "authorgroup")
 | |
| 	(normalize "authorinitials")
 | |
| 	(normalize "citetitle")
 | |
| 	(normalize "collab")
 | |
| 	(normalize "confgroup")
 | |
| 	(normalize "contractnum")
 | |
| 	(normalize "contractsponsor")
 | |
| 	(normalize "contrib")
 | |
| 	(normalize "copyright")
 | |
| 	(normalize "corpauthor")
 | |
| 	(normalize "corpname")
 | |
| 	(normalize "date")
 | |
| 	(normalize "edition")
 | |
| 	(normalize "editor")
 | |
| 	(normalize "firstname")
 | |
| 	(normalize "honorific")
 | |
| 	(normalize "invpartnumber")
 | |
| 	(normalize "isbn")
 | |
| 	(normalize "issn")
 | |
| 	(normalize "issuenum")
 | |
| 	(normalize "lineage")
 | |
| 	(normalize "orgname")
 | |
| 	(normalize "othercredit")
 | |
| 	(normalize "othername")
 | |
| 	(normalize "pagenums")
 | |
| 	(normalize "productname")
 | |
| 	(normalize "productnumber")
 | |
| 	(normalize "pubdate")
 | |
| 	(normalize "publisher")
 | |
| 	(normalize "publishername")
 | |
| 	(normalize "pubsnumber")
 | |
| 	(normalize "releaseinfo")
 | |
| 	(normalize "seriesvolnums")
 | |
| 	(normalize "subtitle")
 | |
| 	(normalize "surname")
 | |
| 	(normalize "title")
 | |
| 	(normalize "titleabbrev")
 | |
| 	(normalize "volumenum")))
 | |
| 
 | |
| (define (biblioentry-block-elements)
 | |
|   (list (normalize "abstract")
 | |
| 	(normalize "address")
 | |
| 	(normalize "authorblurb")
 | |
| 	(normalize "printhistory")
 | |
| 	(normalize "revhistory")
 | |
| 	(normalize "seriesinfo")))
 | |
| 
 | |
| (define (biblioentry-flatten-elements)
 | |
|   (list (normalize "artheader")
 | |
| 	(normalize "biblioset")
 | |
| 	(normalize "bookbiblio")))
 | |
| 
 | |
| ;; === db31 common ======================================================
 | |
| 
 | |
| (define (data-filename dataobj)
 | |
|   (let* ((entityref (attribute-string (normalize "entityref") dataobj))
 | |
| 	 (fileref   (attribute-string (normalize "fileref") dataobj))
 | |
| 	 (filename  (if fileref
 | |
| 			fileref
 | |
| 			(system-id-filename entityref)))
 | |
| 	 (ext       (file-extension filename)))
 | |
|     (if (or (not filename)
 | |
| 	    (not %graphic-default-extension%)
 | |
| 	    (member ext %graphic-extensions%))
 | |
| 	filename
 | |
| 	(string-append filename "." %graphic-default-extension%))))
 | |
| 
 | |
| (define (normalized-member string string-list)
 | |
|   (if (string? string)
 | |
|       (let loop ((sl string-list))
 | |
| 	(if (null? sl)
 | |
| 	    #f
 | |
| 	    (if (string=? (normalize string) (normalize (car sl)))
 | |
| 		#t
 | |
| 		(loop (cdr sl)))))
 | |
|       #f))
 | |
| 
 | |
| (define (find-displayable-object objlist notlist extlist)
 | |
|   (let loop ((nl objlist))
 | |
|     (if (node-list-empty? nl)
 | |
| 	(empty-node-list)
 | |
| 	(let* ((objdata  (node-list-filter-by-gi
 | |
| 			  (children (node-list-first nl))
 | |
| 			  (list (normalize "videodata")
 | |
| 				(normalize "audiodata")
 | |
| 				(normalize "imagedata"))))
 | |
| 	       (filename  (data-filename objdata))
 | |
| 	       (extension (file-extension filename))
 | |
| 	       (notation  (attribute-string (normalize "format") objdata)))
 | |
| 	  (if (or (normalized-member notation notlist)
 | |
| 		  (normalized-member extension extlist)
 | |
| 		  (and notation
 | |
| 		       (string=? notation (normalize "linespecific"))))
 | |
| 	      (node-list-first nl)
 | |
| 	      (loop (node-list-rest nl)))))))
 | |
| 
 | |
| (define (select-displayable-object objlist)
 | |
|   (let ((pref (find-displayable-object objlist
 | |
| 				       preferred-mediaobject-notations
 | |
| 				       preferred-mediaobject-extensions))
 | |
| 	(ok   (find-displayable-object objlist
 | |
| 				       acceptable-mediaobject-notations
 | |
| 				       acceptable-mediaobject-extensions)))
 | |
|     (if (node-list-empty? pref)
 | |
| 	ok
 | |
| 	pref)))
 | |
| 
 | |
| (define ($mediaobject$)
 | |
|   (let* ((objects (node-list-filter-by-gi
 | |
| 		   (children (current-node))
 | |
| 		   (list (normalize "videoobject")
 | |
| 			 (normalize "imageobject")
 | |
| 			 (normalize "audioobject"))))
 | |
| 	 (dobject (select-displayable-object objects))
 | |
| 	 (textobj (select-elements (children (current-node))
 | |
| 				   (normalize "textobject")))
 | |
| 	 (caption (select-elements (children (current-node))
 | |
| 				   (normalize "caption"))))
 | |
|     (make sequence
 | |
|       (if (node-list-empty? dobject)
 | |
| 	  (if (node-list-empty? textobj)
 | |
| 	      (empty-sosofo)
 | |
| 	      (process-node-list (node-list-first textobj)))
 | |
| 	  (process-node-list dobject))
 | |
|       (process-node-list caption))))
 | |
| 
 | |
| ;; ======================================================================
 |