1 ;; $Id: dbindex.dsl,v 1.5 2003/01/15 08:24:13 adicarlo Exp $
3 ;; This file is part of the Modular DocBook Stylesheet distribution.
4 ;; See ../README or http://docbook.sourceforge.net/projects/dsssl/
7 ;; ................... INDEX TERMS (EMBEDDED MARKERS) ...................
11 (let* ((id (if (attribute-string (normalize "id"))
12 (attribute-string (normalize "id"))
15 attributes: (list (list "NAME" id))
19 (element primary (empty-sosofo))
20 (element secondary (empty-sosofo))
21 (element tertiary (empty-sosofo))
22 (element see (empty-sosofo))
23 (element seealso (empty-sosofo))
25 ;; =========================== INDEX ELEMENTS ===========================
27 (element (setindex title) (empty-sosofo))
29 (let ((preamble (node-list-filter-by-not-gi
30 (children (current-node))
31 (list (normalize "indexentry"))))
32 (entries (node-list-filter-by-gi
33 (children (current-node))
34 (list (normalize "indexentry")))))
36 (with-mode head-title-mode
37 (literal (element-title-string (current-node))))
38 (make element gi: "DIV"
39 attributes: (list (list "CLASS" (gi)))
40 ($component-separator$)
42 (process-node-list preamble)
43 (if (node-list-empty? entries)
45 (make element gi: "DL"
46 (process-node-list entries)))))))
48 (element (index title) (empty-sosofo))
50 (let ((preamble (node-list-filter-by-not-gi
51 (children (current-node))
52 (list (normalize "indexentry"))))
53 (entries (node-list-filter-by-gi
54 (children (current-node))
55 (list (normalize "indexentry")))))
57 (with-mode head-title-mode
58 (literal (element-title-string (current-node))))
59 (make element gi: "DIV"
60 attributes: (list (list "CLASS" (gi)))
61 ($component-separator$)
63 (process-node-list preamble)
64 (if (node-list-empty? entries)
66 (make element gi: "DL"
67 (process-node-list entries)))))))
70 (element (indexdiv title) (empty-sosofo))
72 (let ((preamble (node-list-filter-by-not-gi
73 (children (current-node))
74 (list (normalize "indexentry"))))
75 (entries (node-list-filter-by-gi
76 (children (current-node))
77 (list (normalize "indexentry")))))
79 (with-mode head-title-mode
80 (literal (element-title-string (current-node))))
81 (make element gi: "DIV"
82 attributes: (list (list "CLASS" (gi)))
85 (process-node-list preamble)
86 (if (node-list-empty? entries)
88 (make element gi: "DL"
89 (process-node-list entries)))))))
91 (define (break-node-list nodes breakatgi)
92 ;; Given a _node_ list "PRIM SEC TERT SEC SEC TERT PRIM SEC PRIM PRIM"
93 ;; and the breakatgi of "PRIM", returns the _list_ of _node_ lists:
94 ;; '("PRIM SEC TERT SEC SEC TERT" "PRIM SEC" "PRIM" "PRIM")
95 (let loop ((nl nodes) (result '()) (curlist (empty-node-list)))
96 (if (node-list-empty? nl)
97 (if (node-list-empty? curlist)
99 (append result (list curlist)))
100 (if (equal? (gi (node-list-first nl)) breakatgi)
101 (loop (node-list-rest nl)
102 (if (node-list-empty? curlist)
104 (append result (list curlist)))
105 (node-list-first nl))
106 (loop (node-list-rest nl)
108 (node-list curlist (node-list-first nl)))))))
110 (define (process-primary primnode secnl)
111 (let ((see? (equal? (gi (node-list-first secnl))
112 (normalize "seeie")))
113 (seealso? (equal? (gi (node-list-first secnl))
114 (normalize "seealsoie")))
115 (second (break-node-list secnl (normalize "secondaryie"))))
116 (if (or see? seealso?)
117 (process-terminal primnode secnl #t)
119 (process-nonterminal primnode)
120 (if (node-list-empty? secnl)
122 (make element gi: "DD"
123 (make element gi: "DL"
124 (let sloop ((secs second))
128 (let* ((nodes (car secs))
129 (sec (node-list-first nodes))
130 (terts (node-list-rest nodes)))
131 (process-secondary sec terts))
132 (sloop (cdr secs))))))))))))
134 (define (process-secondary secnode tertnl)
135 (let ((see? (equal? (gi (node-list-first tertnl))
136 (normalize "seeie")))
137 (seealso? (equal? (gi (node-list-first tertnl))
138 (normalize "seealsoie")))
139 (tert (break-node-list tertnl (normalize "tertiaryie"))))
140 (if (or see? seealso?)
141 (process-terminal secnode tertnl)
143 (process-nonterminal secnode)
144 (make element gi: "DD"
145 (make element gi: "DL"
146 (let tloop ((terts tert))
150 (let* ((nodes (car terts))
151 (tert (node-list-first nodes))
152 (sees (node-list-rest nodes)))
153 (process-tertiary tert sees))
154 (tloop (cdr terts)))))))))))
156 (define (process-tertiary tertnode seenl)
157 (process-terminal tertnode seenl))
159 (define (process-terminal node seenl #!optional (output-id #f))
160 (let ((id (attribute-string (normalize "id") (parent node))))
162 (make element gi: "DT"
164 (make element gi: "A"
165 attributes: (list (list "NAME" id))
168 (process-node-list node))
169 (if (node-list-empty? seenl)
171 (make element gi: "DD"
172 (make element gi: "DL"
173 (let loop ((nl seenl))
174 (if (node-list-empty? nl)
177 (make element gi: "DT"
179 (node-list-first nl)))
180 (loop (node-list-rest nl)))))))))))
182 (define (process-nonterminal node)
183 (make element gi: "DT"
184 (process-node-list node)))
187 (let* ((primary (break-node-list (children (current-node))
188 (normalize "primaryie"))))
190 (let ploop ((prims primary))
194 (let* ((nodes (car prims))
195 (prim (node-list-first nodes))
196 (secs (node-list-rest nodes)))
197 (process-primary prim secs))
198 (ploop (cdr prims))))))))
200 (element primaryie (process-children))
201 (element secondaryie (process-children))
202 (element tertiaryie (process-children))
204 (define (indexentry-link nd)
205 (let* ((preferred (not (node-list-empty?
206 (select-elements (children (current-node))
207 (normalize "emphasis"))))))
208 (make element gi: "A"
209 attributes: (list (list "HREF"
210 (attribute-string (normalize "url"))))
211 (process-children))))
213 (element (primaryie ulink)
214 (indexentry-link (current-node)))
216 (element (secondaryie ulink)
217 (indexentry-link (current-node)))
219 (element (tertiaryie ulink)
220 (indexentry-link (current-node)))
223 (let ((linkend (attribute-string (normalize "linkend"))))
225 (make element gi: "A"
226 attributes: (list (list "HREF"
227 (href-to (element-with-id linkend))))
228 (literal (gentext-element-name (current-node)))
229 (literal (gentext-label-title-sep (current-node)))
232 (literal (gentext-element-name (current-node)))
233 (literal (gentext-label-title-sep (current-node)))
234 (process-children)))))
237 (let* ((alinkends (attribute-string (normalize "linkends")))
238 (linkends (if alinkends
241 (linkend (if alinkends
245 (make element gi: "A"
246 attributes: (list (list "HREF"
247 (href-to (element-with-id linkend))))
248 (literal (gentext-element-name (current-node)))
249 (literal (gentext-label-title-sep (current-node)))
252 (literal (gentext-element-name (current-node)))
253 (literal (gentext-label-title-sep (current-node)))
254 (process-children)))))
256 ;; =====================HTML INDEX PROCESSING ==============================
258 (define (htmlnewline)
259 (make formatting-instruction data: " "))
261 (define (htmlindexattr attr)
262 (if (attribute-string (normalize attr))
264 (make formatting-instruction data: attr)
265 (make formatting-instruction data: " ")
266 (make formatting-instruction data: (attribute-string
271 (define (htmlindexterm)
272 (let* ((attr (gi (current-node)))
273 (content (data (current-node)))
274 (string (string-replace content " " " "))
275 (sortas (attribute-string (normalize "sortas"))))
277 (make formatting-instruction data: attr)
280 (make formatting-instruction data: "[")
281 (make formatting-instruction data: sortas)
282 (make formatting-instruction data: "]"))
284 (make formatting-instruction data: " ")
285 (make formatting-instruction data: string)
288 (define (htmlindexzone zone)
289 (let loop ((idlist (split zone)))
293 (htmlindexzone1 (car idlist))
294 (loop (cdr idlist))))))
296 (define (htmlindexzone1 id)
297 (let* ((target (ancestor-member (element-with-id id)
298 (append (book-element-list)
299 (division-element-list)
300 (component-element-list)
301 (section-element-list))))
302 (title (string-replace (element-title-string target) " " " ")))
304 (make formatting-instruction data: "ZONE ")
305 (make formatting-instruction data: (href-to target))
308 (make formatting-instruction data: "TITLE ")
309 (make formatting-instruction data: title)
313 ;; this mode is really just a hack to get at the root element
314 (root (process-children))
317 (if (node-list=? (current-node) (sgml-root-element))
319 system-id: (html-entity-file html-index-filename)
320 (process-node-list (select-elements
321 (descendants (current-node))
322 (normalize "indexterm"))))
326 (let* ((target (ancestor-member (current-node)
327 (append (book-element-list)
328 (division-element-list)
329 (component-element-list)
330 (section-element-list))))
331 (title (string-replace (element-title-string target) " " " ")))
333 (make formatting-instruction data: "INDEXTERM ")
334 (make formatting-instruction data: (href-to target))
337 (make formatting-instruction data: "INDEXPOINT ")
338 (make formatting-instruction data: (href-to (current-node)))
341 (make formatting-instruction data: "TITLE ")
342 (make formatting-instruction data: title)
345 (htmlindexattr "scope")
346 (htmlindexattr "significance")
347 (htmlindexattr "class")
349 (htmlindexattr "startref")
351 (if (attribute-string (normalize "zone"))
352 (htmlindexzone (attribute-string (normalize "zone")))
357 (make formatting-instruction data: "/INDEXTERM")