mirror of
https://github.com/smarty-php/smarty.git
synced 2025-10-08 10:20:16 +02: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))))
|
|
|
|
;; ======================================================================
|