;; $Id: dbgloss.dsl,v 1.4 2003/01/15 08:24:23 adicarlo Exp $
;;
;; This file is part of the Modular DocBook Stylesheet distribution.
;; See ../README or http://docbook.sourceforge.net/projects/dsssl/
;;

;; ========================= GLOSSARY ELEMENTS ==========================

(element glossary ($component$))
(element (article glossary) ($section$)) ;; this is a special case
(element (glossary title) (empty-sosofo))

(element glossdiv ($section$))
(element (glossdiv title) (empty-sosofo))

(element glosslist ($block-container$))
(element glossentry  (process-children))

;; a glossentry glossterm
(element (glossentry glossterm) ($lowtitle$ 3 2))
(element (glossdiv glossentry glossterm) ($lowtitle$ 3 3))
(element (glossentry acronym) (empty-sosofo))
(element (glossentry abbrev) (empty-sosofo))
(element glossdef ($indent-para-container$))

(element glosssee ($italic-seq$))

(element (glossentry glosssee)
  (let ((otherterm (attribute-string (normalize "otherterm"))))
    (make paragraph
      space-before: %para-sep%
      space-after: %para-sep%
      start-indent: (+ (inherited-start-indent) (* (ILSTEP) 2))
      quadding: %default-quadding%
      ($italic-seq$ (literal (gentext-element-name (current-node))
			     (gentext-label-title-sep (gi))))
      (if otherterm
	  (make link 
	    destination: (node-list-address (element-with-id otherterm))
	    (with-mode otherterm
	      (process-element-with-id otherterm)))
	  (process-children)))))

;; When we hit the first GLOSSSEEALSO, process all of them as a node-list
(element glossseealso
  (if (first-sibling?)
      (make paragraph
	($italic-seq$ (literal (gentext-element-name (current-node))
			       (gentext-label-title-sep (gi))))
	(with-mode glossseealso
	  (process-node-list
	   (select-elements (children (parent)) '(glossseealso))))
	(literal "."))
      (empty-sosofo)))

(mode glossseealso

  (element glossseealso
    (let ((otherterm (attribute-string (normalize "otherterm"))))
      (make sequence
	(if (first-sibling?)
	    (empty-sosofo)
	    ($italic-seq$ (literal ", ")))

	(if otherterm ;; but this should be required...
	    (make link 
	      destination: (node-list-address (element-with-id otherterm))
	      (with-mode otherterm
		(process-element-with-id 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 glossentry
    (process-children))
  (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 link 
	  destination: (node-list-address (element-with-id linkend))
	  ($italic-seq$))
	($italic-seq$))))

;; a first glossterm
(element firstterm
  (let* ((linkend (attribute-string (normalize "linkend")))
	 (sosofo  (if linkend
		      (make link 
			destination: (node-list-address
				      (element-with-id linkend))
			($italic-seq$))
		      ($italic-seq$))))
    (if firstterm-bold
	(make sequence
	  font-weight: 'bold
	  sosofo)
	sosofo)))
