mirror of
https://github.com/smarty-php/smarty.git
synced 2025-10-27 18:31:36 +01:00
180 lines
5.6 KiB
Plaintext
Executable File
180 lines
5.6 KiB
Plaintext
Executable File
;; $Id$
|
|
;;
|
|
;; This file is part of the Modular DocBook Stylesheet distribution.
|
|
;; See ../README or http://www.berkshire.net/~norm/dsssl/
|
|
;;
|
|
|
|
;; ========================== TABLE OF CONTENTS =========================
|
|
|
|
(define %toc-indent% 2pi)
|
|
(define %toc-spacing-factor% 0.4)
|
|
|
|
;; Returns the depth of auto TOC that should be made at the nd-level
|
|
(define (toc-depth nd)
|
|
(if (string=? (gi nd) (normalize "book"))
|
|
7
|
|
1))
|
|
|
|
(define (format-page-number)
|
|
(current-node-page-number-sosofo))
|
|
|
|
;; Prints the TOC title if first? is true, otherwise does nothing
|
|
(define (toc-title first?)
|
|
(let ((hsize (if (or (equal? (gi (current-node)) (normalize "article"))
|
|
(equal? (gi (current-node)) (normalize "part")))
|
|
(HSIZE 3)
|
|
(HSIZE 4))))
|
|
(if first?
|
|
(make paragraph
|
|
font-family-name: %title-font-family%
|
|
font-weight: 'bold
|
|
font-size: hsize
|
|
line-spacing: (* hsize %line-spacing-factor%)
|
|
space-before: (* hsize %head-before-factor%)
|
|
space-after: (* hsize %head-after-factor%)
|
|
start-indent: 0pt
|
|
first-line-start-indent: 0pt
|
|
quadding: %component-title-quadding%
|
|
heading-level: (if %generate-heading-level% 1 0)
|
|
keep-with-next?: #t
|
|
(literal (gentext-element-name (normalize "toc"))))
|
|
(empty-sosofo))))
|
|
|
|
;; Prints the TOC title if first? is true, otherwise does nothing
|
|
(define (lot-title first? lotgi)
|
|
(if first?
|
|
(make paragraph
|
|
font-family-name: %title-font-family%
|
|
font-weight: 'bold
|
|
font-size: (HSIZE 4)
|
|
line-spacing: (* (HSIZE 4) %line-spacing-factor%)
|
|
space-before: (* (HSIZE 4) %head-before-factor%)
|
|
space-after: (* (HSIZE 4) %head-after-factor%)
|
|
start-indent: 0pt
|
|
first-line-start-indent: 0pt
|
|
quadding: %component-title-quadding%
|
|
heading-level: (if %generate-heading-level% 1 0)
|
|
keep-with-next?: #t
|
|
(literal ($lot-title$ lotgi)))
|
|
(empty-sosofo)))
|
|
|
|
;; Print the TOC entry for tocentry
|
|
(define ($toc-entry$ tocentry level)
|
|
(make paragraph
|
|
start-indent: (+ %body-start-indent%
|
|
(* %toc-indent% level))
|
|
first-line-start-indent: (* -1 %toc-indent%)
|
|
font-weight: (if (= level 1) 'bold 'medium)
|
|
space-before: (if (= level 1) (* %toc-spacing-factor% 6pt) 0pt)
|
|
space-after: (if (= level 1) (* %toc-spacing-factor% 6pt) 0pt)
|
|
keep-with-next?: (if (= level 1) #t #f)
|
|
quadding: 'start
|
|
(make link
|
|
destination: (node-list-address tocentry)
|
|
(make sequence
|
|
(if (equal? (element-label tocentry) "")
|
|
(empty-sosofo)
|
|
(make sequence
|
|
(element-label-sosofo tocentry)
|
|
(literal (gentext-label-title-sep (gi tocentry)))))
|
|
(element-title-sosofo tocentry)))
|
|
(if (and (= level 1)
|
|
;; ??? %chapter-title-page-separate%
|
|
%page-number-restart%)
|
|
(empty-sosofo) ;; Don't need the leader etc then
|
|
(make sequence
|
|
(make leader (literal "."))
|
|
(make link
|
|
destination: (node-list-address tocentry)
|
|
(make sequence
|
|
(if %page-number-restart%
|
|
(literal
|
|
(string-append
|
|
(if (= level 1)
|
|
(element-label tocentry #t)
|
|
(substring (element-label tocentry #t)
|
|
0 (string-index (element-label tocentry #t) ".")))
|
|
(gentext-intra-label-sep "_pagenumber")))
|
|
(empty-sosofo))
|
|
(with-mode toc-page-number-mode
|
|
(process-node-list tocentry))))))))
|
|
|
|
;; Build a TOC starting at nd reaching down depth levels.
|
|
;; The optional arguments are used on recursive calls to build-toc
|
|
;; and shouldn't be set by the initial caller...
|
|
;;
|
|
(define (build-toc nd depth #!optional (first? #t) (level 1))
|
|
(let* ((toclist (toc-list-filter
|
|
(node-list-filter-by-gi (children nd)
|
|
(append (division-element-list)
|
|
(component-element-list)
|
|
(section-element-list))))))
|
|
(if (or (<= depth 0)
|
|
(node-list-empty? toclist))
|
|
(empty-sosofo)
|
|
(make sequence
|
|
(toc-title first?)
|
|
(let loop ((nl toclist))
|
|
(if (node-list-empty? nl)
|
|
(empty-sosofo)
|
|
(sosofo-append
|
|
($toc-entry$ (node-list-first nl) level)
|
|
(build-toc (node-list-first nl) (- depth 1) #f (+ level 1))
|
|
(loop (node-list-rest nl)))))))))
|
|
|
|
;; Print the LOT entry
|
|
(define ($lot-entry$ tocentry)
|
|
(make paragraph
|
|
start-indent: (+ %body-start-indent% %toc-indent%)
|
|
first-line-start-indent: (* -1 %toc-indent%)
|
|
font-weight: 'medium
|
|
space-before: 0pt
|
|
space-after: 0pt
|
|
quadding: 'start
|
|
(make link
|
|
destination: (node-list-address tocentry)
|
|
(make sequence
|
|
(if (equal? (element-label tocentry) "")
|
|
(empty-sosofo)
|
|
(make sequence
|
|
(element-label-sosofo tocentry #t)
|
|
(literal (gentext-label-title-sep (gi tocentry)))))
|
|
(element-title-sosofo tocentry)))
|
|
(make leader (literal "."))
|
|
(make link
|
|
destination: (node-list-address tocentry)
|
|
(make sequence
|
|
(if %page-number-restart%
|
|
(make sequence
|
|
(literal (substring (element-label tocentry #t)
|
|
0 (string-index (element-label tocentry #t) "-")))
|
|
(literal (gentext-intra-label-sep "_pagenumber")))
|
|
(empty-sosofo))
|
|
(with-mode toc-page-number-mode
|
|
(process-node-list tocentry))))))
|
|
|
|
;; Build a LOT starting at nd for all the lotgi's it contains.
|
|
;; The optional arguments are used on recursive calls to build-toc
|
|
;; and shouldn't be set by the initial caller...
|
|
;;
|
|
(define (build-lot nd lotgi #!optional (first? #t))
|
|
(let* ((lotlist (select-elements (descendants nd)
|
|
(normalize lotgi))))
|
|
(if (node-list-empty? lotlist)
|
|
(empty-sosofo)
|
|
(make sequence
|
|
(lot-title first? lotgi)
|
|
(let loop ((nl lotlist))
|
|
(if (node-list-empty? nl)
|
|
(empty-sosofo)
|
|
(make sequence
|
|
(if (string=? (gi (node-list-first nl)) lotgi)
|
|
($lot-entry$ (node-list-first nl))
|
|
(empty-sosofo))
|
|
(build-lot (node-list-first nl) lotgi #f)
|
|
(loop (node-list-rest nl)))))))))
|
|
|
|
(mode toc-page-number-mode
|
|
(default
|
|
(format-page-number)))
|