;; $Id: dbqanda.dsl,v 1.1 2003/03/25 19:53:41 adicarlo Exp $
;;
;; This file is part of the Modular DocBook Stylesheet distribution.
;; See ../README or http://docbook.sourceforge.net/projects/dsssl/
;;
;; ============================== QANDASET ==============================
(define (qanda-defaultlabel)
(normalize "number"))
(define (qanda-section-level)
;; FIXME: what if they nest inside each other?
(let* ((enclsect (ancestor-member (current-node)
(list (normalize "section")
(normalize "simplesect")
(normalize "sect5")
(normalize "sect4")
(normalize "sect3")
(normalize "sect2")
(normalize "sect1")
(normalize "refsect3")
(normalize "refsect2")
(normalize "refsect1")))))
(SECTLEVEL enclsect)))
(define (qandadiv-section-level)
(let ((depth (length (hierarchical-number-recursive
(normalize "qandadiv")))))
(+ (qanda-section-level) depth)))
(element qandaset
(let ((title (select-elements (children (current-node))
(normalize "title")))
;; process title and rest separately so that we can put the TOC
;; in the rigth place...
(rest (node-list-filter-by-not-gi (children (current-node))
(list (normalize "title")))))
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(process-node-list title)
(if ($generate-qandaset-toc$)
(process-qanda-toc)
(empty-sosofo))
(process-node-list rest))))
(element (qandaset title)
(let* ((htmlgi (string-append "H" (number->string
(+ (qanda-section-level) 1)))))
(make element gi: htmlgi
attributes: (list (list "CLASS" (gi (current-node))))
(process-children))))
(element qandadiv
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(process-children)))
(element (qandadiv title)
(let* ((hnr (hierarchical-number-recursive (normalize "qandadiv")
(current-node)))
(number (let loop ((numlist hnr) (number "") (sep ""))
(if (null? numlist)
number
(loop (cdr numlist)
(string-append number
sep
(number->string (car numlist)))
"."))))
(htmlgi (string-append "H" (number->string
(+ (qandadiv-section-level) 1)))))
(make element gi: htmlgi
(make element gi: "A"
attributes: (list (list "NAME" (element-id
(parent (current-node)))))
(empty-sosofo))
(literal number ". ")
(process-children))))
(element qandaentry
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(process-children)))
(element question
(let* ((chlist (children (current-node)))
(firstch (node-list-first chlist))
(restch (node-list-rest chlist)))
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(make element gi: "P"
(make element gi: "A"
attributes: (list (list "NAME" (element-id)))
(empty-sosofo))
(make element gi: "B"
(literal (question-answer-label (current-node)) " "))
(process-node-list (children firstch)))
(process-node-list restch))))
(element answer
(let* ((inhlabel (inherited-attribute-string (normalize "defaultlabel")))
(deflabel (if inhlabel inhlabel (qanda-defaultlabel)))
(label (attribute-string (normalize "label")))
(chlist (children (current-node)))
(firstch (node-list-first chlist))
(restch (node-list-rest chlist)))
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(make element gi: "P"
(make element gi: "B"
(literal (question-answer-label (current-node)) " "))
(process-node-list (children firstch)))
(process-node-list restch))))
;; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
(define (process-qanda-toc #!optional (node (current-node)))
(let* ((divs (node-list-filter-by-gi (children node)
(list (normalize "qandadiv"))))
(entries (node-list-filter-by-gi (children node)
(list (normalize "qandaentry"))))
(inhlabel (inherited-attribute-string (normalize "defaultlabel")))
(deflabel (if inhlabel inhlabel (qanda-defaultlabel))))
(make element gi: "DL"
(with-mode qandatoc
(process-node-list divs))
(with-mode qandatoc
(process-node-list entries)))))
(mode qandatoc
(element qandadiv
(let ((title (select-elements (children (current-node))
(normalize "title"))))
(make sequence
(make element gi: "DT"
(process-node-list title))
(make element gi: "DD"
(process-qanda-toc)))))
(element (qandadiv title)
(let* ((hnr (hierarchical-number-recursive (normalize "qandadiv")
(current-node)))
(number (let loop ((numlist hnr) (number "") (sep ""))
(if (null? numlist)
number
(loop (cdr numlist)
(string-append number
sep
(number->string (car numlist)))
".")))))
(make sequence
(literal number ". ")
(make element gi: "A"
attributes: (list (list "HREF"
(href-to (parent (current-node)))))
(process-children)))))
(element qandaentry
(process-children))
(element question
(let* ((chlist (children (current-node)))
(firstch (node-list-first chlist)))
(make element gi: "DT"
(literal (question-answer-label (current-node)) " ")
(make element gi: "A"
attributes: (list (list "HREF" (href-to (current-node))))
(process-node-list (children firstch))))))
(element answer
(empty-sosofo))
)