;; $Id: dbgloss.dsl,v 1.4 2003/01/15 08:24:13 adicarlo Exp $
;;
;; This file is part of the Modular DocBook Stylesheet distribution.
;; See ../README or http://docbook.sourceforge.net/projects/dsssl/
;;
;; ========================= GLOSSARY ELEMENTS ==========================
;; HACK ALERT! There is no top-level wrapper around one or more GLOSSENTRYs,
;; so this code has to look around and output the right thing for the
;; front matter and then the GLOSSENTRYs. Ugh.
(define ($glossary-frontmatter$)
(let loop ((nl (children (current-node))) (headlist (empty-node-list)))
(if (node-list-empty? nl)
headlist
(if (equal? (gi (node-list-first nl)) (normalize "glossentry"))
headlist
(loop (node-list-rest nl) (node-list
headlist
(node-list-first nl)))))))
(define ($glossary-glossentrys$)
(let loop ((nl (children (current-node))) (gelist (empty-node-list)))
(if (node-list-empty? nl)
gelist
(loop (node-list-rest nl)
(if (equal? (gi (node-list-first nl)) (normalize "glossentry"))
(node-list gelist (node-list-first nl))
gelist)))))
(define ($glossary-body$)
(make element gi: "DIV"
attributes: '(("CLASS" "GLOSSARY"))
($component-title$)
(process-node-list ($glossary-frontmatter$))
(if (not (node-list-empty? ($glossary-glossentrys$)))
(make element gi: "DL"
(process-node-list ($glossary-glossentrys$)))
(empty-sosofo))))
(element glossary
(html-document (with-mode head-title-mode
(literal (element-title-string (current-node))))
($glossary-body$)))
(element (glossary title) (empty-sosofo))
(element glossdiv
(make element gi: "DIV"
attributes: (list
(list "CLASS" (gi)))
($section-title$)
(process-node-list ($glossary-frontmatter$))
(if (not (node-list-empty? ($glossary-glossentrys$)))
(make element gi: "DL"
(process-node-list ($glossary-glossentrys$)))
(empty-sosofo))))
(element (glossdiv title) (empty-sosofo))
(element glosslist
(make element gi: "DIV"
attributes: (list
(list "CLASS" (gi)))
(make element gi: "DL"
(process-children))))
(element glossentry (process-children))
(element (glossentry glossterm)
(let ((id (attribute-string (normalize "id") (parent (current-node)))))
(make element gi: "DT"
(if id
(make sequence
(make element gi: "A"
attributes: (list
(list "NAME" id))
(empty-sosofo))
(make element gi: "B"
(process-children)))
(make element gi: "B"
(process-children))))))
(element (glossentry acronym)
(make sequence
(literal " (")
(process-children)
(literal ")")))
(element (glossentry abbrev) (empty-sosofo))
(element (glossentry glossdef)
(make element gi: "DD"
(process-children)))
(element (glossterm revhistory)
(empty-sosofo))
(element (glossentry glosssee)
(make element gi: "DD"
(if (attribute-string (normalize "otherterm"))
(make element gi: "P"
(make element gi: "EM"
(literal (gentext-element-name (gi))
(gentext-label-title-sep (gi))))
(make element gi: "A"
attributes: (list (list "HREF"
(link-target
(attribute-string
(normalize "otherterm")))))
(with-mode otherterm
(process-element-with-id
(attribute-string (normalize "otherterm"))))))
(process-children))))
;; When we hit the first GLOSSSEEALSO, process all of them as a node-list
(element glossseealso
(if (first-sibling?)
(make element gi: "P"
(make sequence
(make element gi: "EM"
(literal (gentext-element-name (gi))
(gentext-label-title-sep (gi))))
(with-mode glossseealso
(process-node-list
(select-elements (children (parent)) '(glossseealso))))
(literal ".")))
(empty-sosofo)))
(mode glossseealso
(element glossseealso
(make sequence
(if (first-sibling?)
(empty-sosofo)
(make element gi: "EM"
(literal ", ")))
(if (attribute-string (normalize "otherterm")) ;; but this should be required...
(make element gi: "A"
attributes: (list (list "HREF"
(link-target
(attribute-string
(normalize "otherterm")))))
(with-mode otherterm
(process-element-with-id
(attribute-string (normalize "otherterm")))))
(process-children)))))
;; This is referenced within the GLOSSSEE and GLOSSSEEALSO element
;; construction expressions. The OTHERTERM attributes on GLOSSSEE and
;; GLOSSSEEALSO (should) refer to GLOSSENTRY elements but we're only
;; interested in the text within the GLOSSTERM. Discard the revision
;; history and the definition from the referenced term.
(mode otherterm
(element glossterm
(process-children))
(element glossdef
(empty-sosofo))
(element revhistory
(empty-sosofo))
(element glosssee
(empty-sosofo))
(element (glossentry acronym)
(empty-sosofo))
(element (glossentry abbrev)
(empty-sosofo)))
;; an inline gloss term
(element glossterm
(let* ((linkend (attribute-string (normalize "linkend"))))
(if linkend
(make element gi: "A"
attributes: (list (list "HREF" (href-to (element-with-id
linkend))))
($italic-seq$))
($italic-seq$))))
;; a first glossterm
(element firstterm
(let* ((linkend (attribute-string (normalize "linkend")))
(sosofo (if linkend
(make element gi: "A"
attributes: (list (list "HREF"
(href-to
(element-with-id
linkend))))
($italic-seq$))
($italic-seq$))))
(if firstterm-bold
(make element gi: "B"
sosofo)
sosofo)))