Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
Publishing
docbook-dsssl-stylesheets
dbtohtml.dsl
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File dbtohtml.dsl of Package docbook-dsssl-stylesheets
<!doctype style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN"> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; dbtohtml.dsl - DSSSL style sheet for DocBook to HTML conversion (jadeware) ; ; Author : Mark Burton (markb@ordern.com) ; Created On : Fri Jun 13 18:21:14 1997 ; Last Modified By: Mark Burton ; Last Modified On: Sat Nov 21 22:04:53 1998 ; ; $Id: dbtohtml.dsl,v 1.23 1998/11/21 22:11:14 markb Exp $ ; ; Usage: ; ; jade -d dbtohtml.dsl -t sgml yourdoc.sgm ; ; Additional command line options: ; ; -V %no-split-output% sends all the output to one file ; -V %no-make-index% disables index creation ; -V %no-make-toc% disables TOC creation ; -V %no-shade-screen% disables grey background to SCREEN regions ; -V %show-comments% includes contents of COMMENT regions ; ; See below for more variables that can be set. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Contributors ; Mark Eichin (eichin@cygnus.com) ; Jason Molenda (crash@cygnus.co.jp) ; Tony Graham (tgraham@mulberrytech.com) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Parameterisation ; This style sheet can easily be parameterised by the use of a driver. ; Here is a simple example that sets the output file basename and directory. ; If the driver is foo.dsl, use: jade -d foo.dsl -t sgml yourdoc.sgm <!-- <!doctype style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [ <!ENTITY dbtohtml.dsl SYSTEM "dbtohtml.dsl" CDATA DSSSL > ]> <style-specification id="foodbtohtml" use="dbtohtml"> (define %output-basename% "foo") (define %output-directory% "foodir") </style-specification> <external-specification id="dbtohtml" document="dbtohtml.dsl"> --> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; declare non-standard functions (declare-flow-object-class element "UNREGISTERED::James Clark//Flow Object Class::element") (declare-flow-object-class empty-element "UNREGISTERED::James Clark//Flow Object Class::empty-element") (declare-flow-object-class document-type "UNREGISTERED::James Clark//Flow Object Class::document-type") (declare-flow-object-class processing-instruction "UNREGISTERED::James Clark//Flow Object Class::processing-instruction") (declare-flow-object-class entity "UNREGISTERED::James Clark//Flow Object Class::entity") (declare-flow-object-class entity-ref "UNREGISTERED::James Clark//Flow Object Class::entity-ref") (declare-flow-object-class formatting-instruction "UNREGISTERED::James Clark//Flow Object Class::formatting-instruction") (declare-characteristic preserve-sdata? "UNREGISTERED::James Clark//Characteristic::preserve-sdata?" #f) (define all-element-number (external-procedure "UNREGISTERED::James Clark//Procedure::all-element-number")) (define debug (external-procedure "UNREGISTERED::James Clark//Procedure::debug")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; variables (define %no-split-output% #f) ; if #t puts all output in one file (define %no-split-refentries% #f) ; if #t don't put refentries ; in separate files (define %no-make-toc% #f) ; if #t disables TOC creation (define %no-make-index% #f) ; if #t disables index creation (define %no-shade-screen% #f) ; if #t disables grey ; background to SCREEN regions (define %show-comments% #f) ; if #t includes contents of ; COMMENT regions (define %shade-width% "100%") ; width string or #f (define %email-element% "TT") ; font changing element or #f (define %lineannotation-color% "green") ; colour or #f (ignored if ; %stylesheet-name% is not #f) (define %warning-color% "red") ; colour or #f (define %important-color% #f) ; colour or #f (define %caution-color% #f) ; colour or #f (define %tip-color% #f) ; colour or #f (define %note-color% #f) ; colour or #f (define %example-color% #f) ; colour or #f (define %display-dpi% 100) ; for converting lengths into pixels (define %centre-figures% #t) ; whether figures should be centred (define %default-graphic-format% "gif") (define %graphic-directory% #f) ; name of directory containing ; graphics or #f (define %html-public-id% "-//W3C//DTD HTML 4.0//EN") (define %stylesheet-name% #f) ; name of css style-sheet to ; be used or #f (define %have-javascript% #f) ; true if browser groks JavaScript (define %make-nav-links% #f) ; true if pages should have ; navigation links at their ; top and bottom (define %body-bgcolor% "white") ; document background colour ; (ignored if %stylesheet-name% is ; not #f (define %output-directory% ".") ; where to write generated HTML (define %output-basename% "DBTOHTML") ; generated filenames are ; based on this (define %output-suffix% ".html") ; generated filename suffix (define %newline% "\U-000D") ; there must be an easier way ; to specify \n ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; top-level sections (element BOOK (if %no-split-output% ; everything goes in one file (make-file (string-append %output-basename% %output-suffix%) (make sequence (process-children) (cond ((not %no-make-index%) (make sequence (make-fat-rule) (make-index))) (#t (empty-sosofo)))) (current-node) (node-list) (node-list)) (make sequence ; split output into separate files (let* ((content (make sequence (process-first-descendant "TITLE") (process-first-descendant "BOOKINFO"))) (children (children (current-node))) (linkable-children (node-list (select-elements children "PREFACE") (select-elements children "ARTICLE") (select-elements children "CHAPTER") (select-elements children "APPENDIX")))) (make-file (string-append %output-basename% %output-suffix%) (if %stylesheet-name% (make element gi: "DIV" attributes: '(("class" "book")) content) content) (current-node) (node-list-last linkable-children) (node-list-first linkable-children))) (process-matching-children "PREFACE" "ARTICLE" "CHAPTER" "APPENDIX" "BIBLIOGRAPHY" "GLOSSARY" "ARTHEADER") (if %no-make-index% (empty-sosofo) (make-file (index-file-name) (make sequence (make-nav-links (current-node)) (make-index) (make-nav-links (current-node))) (current-node) (node-list) (node-list)))))) (define (make-file file-name content top-node preceding-node following-node) (make entity system-id: (string-append %output-directory% "/" file-name) (make sequence (make document-type name: "HTML" public-id: %html-public-id%) (make element gi: "HTML" (make sequence (make element gi: "HEAD" (make sequence (make element gi: "TITLE" (with-mode extract-title-text (process-first-descendant "TITLE"))) (if %stylesheet-name% (make empty-element gi: "LINK" attributes: (list (list "rel" "stylesheet") (list "type" "text/css") (list "href" %stylesheet-name%))) (empty-sosofo)) (if %have-javascript% (make element gi: "SCRIPT" attributes: '(("type" "text/javascript")) (make sequence (make formatting-instruction data: (string-append %newline% "<" "!--" %newline%)) (literal "var toppage='" (link-file-name top-node) "';" %newline% "var nextpage='" (if (node-list-empty? following-node) (link-file-name top-node) (link-file-name following-node)) "';" %newline% "var prevpage='" (if (node-list-empty? preceding-node) (link-file-name top-node) (link-file-name preceding-node)) "';" %newline% (if %no-make-index% "" (string-append "var indexpage='" (index-file-name) "';" %newline%)) ) (make formatting-instruction data: (string-append "// -->" %newline%)))) (empty-sosofo)))) (make element gi: "BODY" attributes: (if %stylesheet-name% (list) (list (list "bgcolor" %body-bgcolor%))) (make sequence (if %stylesheet-name% (make element gi: "DIV" (make-anchor)) (make-anchor)) content (make-footer)))))))) (define (make-footer) (let ((copyright (select-elements (descendants (book-node)) '("BOOKINFO" "COPYRIGHT")))) (cond ((node-list-empty? copyright) (empty-sosofo)) (#t (make sequence (make-fat-rule) (process-node-list copyright)))))) (define (node-list-last nl) (node-list-ref nl (- (node-list-length nl) 1))) (define (filtered-preceding-node) (let* ((preceding-node (node-list-last (preced (current-node)))) (acceptable-neighbours '("CHAPTER" "APPENDIX" "GLOSSARY" "REFENTRY"))) (if (member (gi preceding-node) acceptable-neighbours) preceding-node (node-list)))) (define (filtered-following-node) (let* ((following-node (node-list-first (follow (current-node)))) (acceptable-neighbours '("CHAPTER" "APPENDIX" "GLOSSARY" "REFENTRY"))) (if (member (gi following-node) acceptable-neighbours) following-node (node-list)))) (define (make-nav-links up-node) (if %make-nav-links% (let ((gubbins (let ((filtered-preceding-node (filtered-preceding-node)) (filtered-following-node (filtered-following-node))) (make sequence (make empty-element gi: "P") (make element gi: "A" attributes: (list (list "href" (link-file-name up-node))) (literal "Up")) (literal " ") (if (node-list-empty? filtered-following-node) (empty-sosofo) (make element gi: "A" attributes: (list (list "href" (link-file-name filtered-following-node))) (literal "Forward"))) (literal " ") (if (node-list-empty? filtered-preceding-node) (empty-sosofo) (make element gi: "A" attributes: (list (list "href" (link-file-name filtered-preceding-node))) (literal "Back"))) (make empty-element gi: "P"))))) (if %stylesheet-name% (make element gi: "DIV" attributes: '(("class" "navlinks")) gubbins) gubbins)) (empty-sosofo))) (define (make-major-div) (cond (%no-split-output% (make sequence (make-anchor) (make-fat-rule) (process-children))) (#t (make-file (link-file-name (current-node)) (make sequence (make-nav-links (book-node)) (if %stylesheet-name% (make element gi: "DIV" attributes: '(("class" "chapter")) (process-children)) (process-children)) (make-nav-links (book-node))) (book-node) (filtered-preceding-node) (filtered-following-node))))) (element ARTICLE (make-major-div)) (element PREFACE (make-major-div)) (element CHAPTER (make-major-div)) (element APPENDIX (make-major-div)) (element BEGINPAGE (make-thin-rule)) (element BIBLIOGRAPHY (make-major-div)) (element BOOKBIBLIO (process-children)) (element BIBLIODIV (process-children)) (element GLOSSARY (make-major-div)) ; (element GLOSSDIV (make-major-div)) (element ARTHEADER (process-children)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; sections (element SECT1 (make sequence (make empty-element gi: "P") (make-anchor) (process-children))) (element SECT2 (make sequence (make-anchor) (process-children))) (element SECT3 (make sequence (make-anchor) (process-children))) (element SECT4 (make sequence (make-anchor) (process-children))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; reference pages (element REFENTRY (if (or %no-split-output% %no-split-refentries%) (make sequence (make-anchor) (make-fat-rule) (process-children)) (let ((filename (link-file-name (current-node))) (title-text (with-mode make-toc-links (process-first-descendant "REFMETA")))) (make sequence (make-file filename (make sequence (make-nav-links (parent (current-node))) (if %stylesheet-name% (make element gi: "DIV" attributes: '(("class" "refentry")) (process-children)) (process-children)) (make-nav-links (parent (current-node)))) (parent (current-node)) (filtered-preceding-node) (filtered-following-node)) (make empty-element gi: "P") (make element gi: "A" attributes: (list (list "href" filename)) title-text))))) (define (refmeta) (make sequence (process-matching-children "REFENTRYTITLE") (literal "(") (process-matching-children "MANVOLNUM") (literal ")"))) (define (refentrytitle) (process-children-trim)) (define (manvolnum) (process-children-trim)) (mode make-toc-links (element REFMETA (refmeta)) (element REFENTRYTITLE (refentrytitle)) (element MANVOLNUM (manvolnum))) (element REFMETA (if %stylesheet-name% (make element gi: "DIV" attributes: '(("style" "text-align: right")) (refmeta)) (refmeta))) (element REFENTRYTITLE (refentrytitle)) (element MANVOLNUM (manvolnum)) (element REFNAMEDIV (make sequence (make element gi: "H2" (literal "NAME")) (process-matching-children "REFNAME") (literal " - ") (process-matching-children "REFPURPOSE"))) (element REFNAME (process-children-trim)) (element REFPURPOSE (process-children-trim)) (element REFSYNOPSISDIV (process-children)) (element REFSECT1 (process-children)) (element REFSECT2 (process-children)) (element REFSECT3 (process-children)) (element REFSECT4 (process-children)) (element CMDSYNOPSIS (make element gi: "TT")) (element ARG (let ((optional (equal? (attribute-string "CHOICE") "OPT")) (repeat (equal? (attribute-string "REP") "REPEAT")) (content (process-children-trim))) (if optional (make sequence (literal " [ ") content (if repeat (literal " ... ") (empty-sosofo)) (literal " ] ")) (make sequence (literal " ") content (if repeat (literal " ... ") (empty-sosofo)) (literal " "))))) (element FUNCSYNOPSIS (let ((gubbins (make sequence (process-matching-children "FUNCSYNOPSISINFO") (process-matching-children "FUNCDEF" "PARAMDEF")))) (if %stylesheet-name% gubbins (make element gi: "TT" gubbins)))) (element FUNCSYNOPSISINFO (make element gi: "PRE" attributes: '(("class" "funcsynopsisinfo")))) (element FUNCDEF (make sequence (make empty-element gi: "TABLE") (make empty-element gi: "TR" attributes: (list '("valign" "top"))) (make empty-element gi: "TD") (make empty-element gi: "PRE" attributes: '(("class" "plain"))) (make empty-element gi: "TT") (process-children-trim))) (element PARAMDEF (let ((head (if (equal? (gi (node-list-last (preced (current-node)))) "PARAMDEF") (literal ", ") (make sequence (literal "(") (make empty-element gi: "/TT") (make empty-element gi: "/PRE") (make empty-element gi: "TD") (make empty-element gi: "TT")))) (tail (if (equal? (gi (node-list-first (follow (current-node)))) "PARAMDEF") (empty-sosofo) (make sequence (literal " );") (make empty-element gi: "/TT") (make empty-element gi: "/TABLE"))))) (make sequence head (process-children-trim) tail))) (element CITEREFENTRY (make sequence (process-matching-children "REFENTRYTITLE") (literal "(") (process-matching-children "MANVOLNUM") (literal ")"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; titles (mode extract-title-text (element (TITLE) (process-children))) (element (BOOK TITLE) (let ((content (make element gi: "H1" attributes: '(("class" "book")) (process-children-trim)))) (if %stylesheet-name% content (make element gi: "CENTER" content)))) (element (CHAPTER TITLE) (make element gi: "H1" attributes: '(("class" "chapter")) (make sequence (literal (chap-app-head-label "Chapter")) (process-children-trim)))) (element (APPENDIX TITLE) (make element gi: "H1" attributes: '(("class" "appendix")) (make sequence (literal (chap-app-head-label "Appendix")) (process-children-trim)))) (element (BIBLIOGRAPHY TITLE) (make element gi: "H1" attributes: '(("class" "bibliography")) (make sequence (literal (chap-app-head-label "Bibliography")) (process-children-trim)))) (element (BOOKBIBLIO TITLE) (make element gi: "H2" attributes: '(("class" "bookbiblio")) (make sequence ;;; (literal (chap-app-head-label "Bibliography")) (process-children-trim)))) (element (BIBLIODIV TITLE) (make element gi: "H2" attributes: '(("class" "bibliodiv")) (make sequence (process-children-trim)))) (element (GLOSSARY TITLE) (make element gi: "H1" attributes: '(("class" "glossary")) (make sequence (literal "Glossary") ; (process-children-trim) ))) (element (GLOSSDIV TITLE) (make element gi: "H2" attributes: '(("class" "glossdiv")) (process-children-trim))) (element (ARTHEADER TITLE) (let ((content (make element gi: "H1" attributes: '(("class" "artheader")) (process-children-trim)))) (if %stylesheet-name% content (make element gi: "CENTER" content)))) (element (SECT1 TITLE) (make element gi: "H2" attributes: '(("class" "sect1")))) (element (SECT2 TITLE) (make element gi: "H3" attributes: '(("class" "sect2")))) (element (SECT3 TITLE) (make element gi: "H4" attributes: '(("class" "sect3")))) (element (SECT4 TITLE) (make element gi: "H5" attributes: '(("class" "sect1")))) (element (FORMALPARA TITLE) (make element gi: "H4" attributes: '(("class" "formalpara")))) (element (SIDEBAR TITLE) (make element gi: "H2" attributes: '(("class" "sidebar")))) (element (REFSYNOPSISDIV TITLE) (make element gi: "H2" attributes: '(("class" "refsynopsisdiv")))) (element (REFSECT1 TITLE) (make element gi: "H2" attributes: '(("class" "refsect1")))) (element (REFSECT2 TITLE) (make element gi: "H3" attributes: '(("class" "refsect2")))) (element (REFSECT3 TITLE) (make element gi: "H4" attributes: '(("class" "refsect1")))) (element (REFSECT4 TITLE) (make element gi: "H5" attributes: '(("class" "sect4")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; font changers (element LINEANNOTATION (cond (%stylesheet-name% (make element gi: "SPAN" attributes: '(("class" "lineannotation")) (process-children-trim))) (%lineannotation-color% (make element gi: "FONT" attributes: (list (list "color" %lineannotation-color%)) (process-children-trim))) (#t (process-children-trim)))) (element EMPHASIS (make element gi: "I")) (element TYPE (make element gi: "B" (make element gi: "TT"))) (element REPLACEABLE (make element gi: "I" (make element gi: "B" (make element gi: "TT")))) (element TOKEN (if %stylesheet-name% (make element gi: "SPAN" attributes: '(("class" "token")) (process-children-trim)) (process-children-trim))) (element PARAMETER (make element gi: "I")) (element FIRSTTERM (make element gi: "I")) (element APPLICATION (make element gi: "TT")) (element SYSTEMITEM (make element gi: "TT")) (element FILENAME (make element gi: "TT")) (element LITERAL (make element gi: "TT")) (element ENVAR (make element gi: "TT")) (element SUBSCRIPT (make element gi: "SUB")) (element SUPERSCRIPT (make element gi: "SUP")) (element CITETITLE (make element gi: "I")) (element GUIBUTTON (make element gi: "I")) (element GUIMENU (make element gi: "I")) (element GUIMENUITEM (make element gi: "I")) (element GUILABEL (make element gi: "I")) (element STRUCTNAME (make element gi: "TT")) (element STRUCTFIELD (make element gi: "TT")) (element COMMAND (make element gi: "TT")) (element OPTION (make element gi: "TT")) (element USERINPUT (make element gi: "TT")) (element COMPUTEROUTPUT (make element gi: "TT")) (element PROMPT (make element gi: "TT")) (element PRODUCTNAME (make element gi: "I")) (element SGMLTAG (make element gi: "TT")) (element (FUNCDEF FUNCTION) (make element gi: "B" (make element gi: "TT"))) (element FUNCTION (make element gi: "TT")) (element SYMBOL (make element gi: "TT")) (element LITERALLAYOUT (make element gi: "PRE" attributes: '(("class" "literallayout")))) (element FOREIGNPHRASE (make element gi: "I")) (element ABBREV (process-children-trim)) (element EMAIL (if %email-element% (make element gi: %email-element% (process-children-trim)) (process-children-trim))) (element QUOTE (make sequence (make entity-ref name: "quot") (process-children-trim) (make entity-ref name: "quot"))) (element ADDRESS (make element gi: "ADDRESS" (process-children-trim))) (element (ADDRESS CITY) (make sequence (make empty-element gi: "BR") (process-children-trim))) (element (ADDRESS COUNTRY) (make sequence (make empty-element gi: "BR") (process-children-trim))) (element (ADDRESS EMAIL) (make sequence (make empty-element gi: "BR") (if %email-element% (make element gi: %email-element% (process-children-trim)) (process-children-trim)))) (element (ADDRESS FAX) (make sequence (make empty-element gi: "BR") (process-children-trim))) (element (ADDRESS OTHERADDR) (make sequence (make empty-element gi: "BR") (process-children-trim))) (element (ADDRESS POB) (make sequence (make empty-element gi: "BR") (process-children-trim))) (element (ADDRESS PHONE) (make sequence (make empty-element gi: "BR") (process-children-trim))) (element (ADDRESS POSTCODE) (process-children-trim)) (element (ADDRESS STATE) (process-children-trim)) (element (ADDRESS STREET) (make sequence (make empty-element gi: "BR") (process-children-trim))) (element PROGRAMLISTING (make element gi: "PRE" attributes: '(("class" "programlisting")))) (element SECT2INFO (empty-sosofo)) (element SYNOPSIS (make element gi: "PRE" attributes: '(("class" "synopsis")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; paragraph like things (element CAUTION (if %caution-color% (make-color-para %caution-color%) (make-special-para))) (element IMPORTANT (if %important-color% (make-color-para %important-color%) (make-special-para))) (element WARNING (if %warning-color% (make-color-para %warning-color%) (make-special-para))) (element NOTE (if %note-color% (make-color-para %note-color%) (make-special-para))) (element TIP (if %tip-color% (make-color-para %tip-color%) (make-special-para))) (element EXAMPLE (if %example-color% (make-color-para %example-color%) (make-special-para))) (element COMMENT (if %show-comments% (make-color-para "red") (empty-sosofo))) (element PARA (make sequence (make empty-element gi: "P") (make-anchor) (with-mode footnote-ref (process-children)) (with-mode footnote-def (process-matching-children "FOOTNOTE")))) (element BLOCKQUOTE (make element gi: "BLOCKQUOTE")) (element SCREEN (let ((gubbins (make element gi: "PRE" attributes: '(("class" "screen")) (process-children)))) (make sequence (make empty-element gi: "P") (if (or %stylesheet-name% %no-shade-screen%) gubbins (make element gi: "TABLE" attributes: (append (list '("border" "0") '("bgcolor" "#E0E0E0")) (if %shade-width% (list (list "width" %shade-width%)) '())) (make element gi: "TR" (make element gi: "TD" gubbins))))))) (element FORMALPARA (process-children)) (element PHRASE (maybe-bold-children)) (mode footnote-ref (element FOOTNOTE (let ((num (format-number (element-number (current-node)) "1"))) (make element gi: "SUP" attributes: '(("class" "footnoteref")) (make element gi: "A" attributes: (list (list "href" (string-append "#footnote-" num))) (literal num)))))) (mode footnote-def (element FOOTNOTE (let ((num (format-number (element-number (current-node)) "1"))) (make element gi: "BLOCKQUOTE" attributes: '(("class" "footnote")) (make sequence (make empty-element gi: "P") (make element gi: "A" attributes: (list (list "name" (string-append "footnote-" num))) (make element gi: "SUP" attributes: '(("class" "footnote")) (literal num))) (process-children)))))) (element (CAUTION TITLE) (make element gi: "H5")) (element (IMPORTANT TITLE) (make element gi: "H5")) (element (WARNING TITLE) (make element gi: "H5")) (element (NOTE TITLE) (make element gi: "H5")) (element (TIP TITLE) (make element gi: "H5")) (element (EXAMPLE TITLE) (make element gi: "H5")) (element (BIBLIOENTRY TITLE) (make element gi: "H3")) (element (SIDEBAR) (make sequence (make empty-element gi: "P") (make element gi: "TABLE" attributes: '(("border" "1") ("bgcolor" "#f0f0f0") ("width" "100%")) (make element gi: "TR" (make element gi: "TD" (process-children)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; lists (element ITEMIZEDLIST (make sequence (make empty-element gi: "P") (make-anchor) (make element gi: "UL"))) (element ORDEREDLIST (make sequence (make empty-element gi: "P") (make-anchor) (make element gi: "OL"))) (element (ITEMIZEDLIST LISTITEM) (make sequence (make empty-element gi: "LI") (process-children) (make empty-element gi: "P"))) (element (ORDEREDLIST LISTITEM) (make sequence (make empty-element gi: "LI") (process-children) (make empty-element gi: "P"))) (element VARIABLELIST (make sequence (make empty-element gi: "P") (make-anchor) (make element gi: "DL"))) (element VARLISTENTRY (process-children)) (element (VARLISTENTRY LISTITEM) (make sequence (make empty-element gi: "DD") (process-children) (make empty-element gi: "P"))) (element (VARLISTENTRY TERM) (let ((content (make sequence (make-anchor) (maybe-bold-children)))) (make sequence (make empty-element gi: "DT") (cond ((equal? (inherited-element-attribute-string "VARIABLELIST" "role") "bold") (make element gi: "B" content)) ((equal? (inherited-element-attribute-string "VARIABLELIST" "role") "fixed") (make element gi: "TT" content)) (#t content))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; glossary (element GLOSSTERM (process-children)) (element GLOSSDIV (make sequence (make empty-element gi: "P") (process-children))) (element (GLOSSENTRY GLOSSSEE) (make sequence (make empty-element gi: "DD") (literal "See ") (make element gi: "A" attributes: (list (list "href" (string-append "#" (if (string? (attribute-string "otherterm")) (attribute-string "otherterm") (gloss-entry-name (current-node)))))) (if (string? (attribute-string "otherterm")) (with-mode glosssee (process-element-with-id (attribute-string "OTHERTERM"))) (process-children-trim))) (make empty-element gi: "P"))) (define (gloss-entry-name glossterm) (string-append "gloss-" (data glossterm))) (element (GLOSSENTRY GLOSSTERM) (make sequence (make empty-element gi: "DT") (make element gi: "A" attributes: (list (list "name" (if (string? (inherited-attribute-string "ID")) (inherited-attribute-string "ID") (gloss-entry-name (current-node))))) (empty-sosofo)) (process-children))) (element GLOSSENTRY (make element gi: "DL" (process-children))) (element (GLOSSENTRY GLOSSDEF) (make sequence (make empty-element gi: "DD") (process-children) (make empty-element gi: "P"))) (element GLOSSSEEALSO (make sequence (if (first-sibling?) (make sequence (make empty-element gi: "P") (make element gi: "EM" (literal "See also "))) (make sequence (make element gi: "EM" (literal ", ")))) (make element gi: "a" attributes: (list (list "href" (string-append "#" (attribute-string "OTHERTERM")))) (with-mode glosssee (process-element-with-id (attribute-string "OTHERTERM")))))) ;; 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 glosssee (element GLOSSTERM (process-children)) (element REVHISTORY (empty-sosofo)) (element GLOSSDEF (empty-sosofo))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; index (define (index-entry-name indexterm) (string-append "index." (format-number (element-number indexterm) "1"))) (element INDEXTERM (make sequence (make-anchor) (make element gi: "A" attributes: (list (list "name" (index-entry-name (current-node)))) (literal "")) (empty-sosofo))) ; DIY string-ci>? (define (string-ci>? s1 s2) (let ((len1 (string-length s1)) (len2 (string-length s2))) (let loop ((i 0)) (cond ((= i len1) #f) ((= i len2) #t) (#t (let ((c1 (index-char-val (string-ref s1 i))) (c2 (index-char-val (string-ref s2 i)))) (cond ((= c1 c2) (loop (+ i 1))) (#t (> c1 c2))))))))) (define (equal-ci? s1 s2) (let ((len1 (string-length s1)) (len2 (string-length s2))) (if (= len1 len2) (let loop ((i 0)) (if (= i len1) #t (let ((c1 (index-char-val (string-ref s1 i))) (c2 (index-char-val (string-ref s2 i)))) (if (= c1 c2) (loop (+ i 1)) #f)))) #f))) (define (index-char-val ch) (case ch ((#\A #\a) 65) ((#\B #\b) 66) ((#\C #\c) 67) ((#\D #\d) 68) ((#\E #\e) 69) ((#\F #\f) 70) ((#\G #\g) 71) ((#\H #\h) 72) ((#\I #\i) 73) ((#\J #\j) 74) ((#\K #\k) 75) ((#\L #\l) 76) ((#\M #\m) 77) ((#\N #\n) 78) ((#\O #\o) 79) ((#\P #\p) 80) ((#\Q #\q) 81) ((#\R #\r) 82) ((#\S #\s) 83) ((#\T #\t) 84) ((#\U #\u) 85) ((#\V #\v) 86) ((#\W #\w) 87) ((#\X #\x) 88) ((#\Y #\y) 89) ((#\Z #\z) 90) ((#\ ) 32) ((#\0) 48) ((#\1) 49) ((#\2) 50) ((#\3) 51) ((#\4) 52) ((#\5) 53) ((#\6) 54) ((#\7) 55) ((#\8) 56) ((#\9) 57) ; laziness precludes me from filling this out further (else 0))) (define (string->number-list s) (let loop ((i (- (string-length s) 1)) (l '())) (if (< i 0) l (loop (- i 1) (cons (index-char-val (string-ref s i)) l))))) (define (number-list>? l1 l2) (cond ((null? l1) #f) ((null? l2) #t) ((= (car l1) (car l2)) (number-list>? (cdr l1) (cdr l2))) (#t (> (car l1) (car l2))))) ; return the string data for a given index entry (define (get-index-entry-data entry) (let ((primary (select-elements (children entry) "PRIMARY")) (secondary (select-elements (children entry) "SECONDARY"))) (if (node-list-empty? secondary) (data primary) (string-append (data primary) " - " (data secondary))))) (define (make-index-entry entry) (let ((text (get-index-entry-data entry))) (cons text (make sequence (make empty-element gi: "LI") (make element gi: "A" attributes: (list (list "href" (string-append (link-file-name entry) "#" (index-entry-name entry)))) (literal text)))))) (define (build-index nl) (let loop ((result '()) (nl nl)) (if (node-list-empty? nl) result (loop (cons (make-index-entry (node-list-first nl)) result) (node-list-rest nl))))) (define (sort-index il) (letrec ((list-head (lambda (l n) (if (> n 0) (cons (car l) (list-head (cdr l) (- n 1))) '()))) (merge (lambda (il1 il2) (cond ((null? il1) il2) ((null? il2) il1) ((string-ci>? (car (car il1)) (car (car il2))) (cons (car il2) (merge il1 (cdr il2)))) (#t (cons (car il1) (merge (cdr il1) il2))))))) (let* ((ll (length il)) (ldiv2 (quotient ll 2))) (if (> 2 ll) il (merge (sort-index (list-head il ldiv2)) (sort-index (list-tail il ldiv2))))))) (define (output-index il) (let extract-and-append ((il il) (result (empty-sosofo))) (if (null? il) result (extract-and-append (cdr il) (sosofo-append result (cdr (car il))))))) (define (make-index) (make sequence (make element gi: "H1" (make element gi: "A" attributes: (list (list "name" "INDEXTOP")) (literal "Index"))) (make element gi: "UL" (output-index (sort-index (build-index (select-elements (descendants (current-node)) "INDEXTERM"))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; links & cross-references (define (link-file-name target) (if %no-split-output% "" (string-append %output-basename% (cond ((equal? (gi target) "BOOK") "") ((equal? (gi target) "APPENDIX") (string-append "-APP-" (format-number (child-number target) "A"))) ((or (equal? (gi target) "CHAPTER") (equal? (gi target) "ARTICLE") (equal? (gi target) "GLOSSARY")) (string-append "-" (substring (gi target) 0 3) "-" (format-number (child-number target) "1"))) ((equal? (gi target) "REFENTRY") (string-append "-REF-" (number->string (all-element-number target)))) ((ancestor-child-number "APPENDIX" target) (string-append "-APP-" (format-number (ancestor-child-number "APPENDIX" target) "A"))) ((ancestor-child-number "CHAPTER" target) (string-append "-CHA-" (format-number (ancestor-child-number "CHAPTER" target) "1"))) ((ancestor-child-number "ARTICLE" target) (string-append "-ART-" (format-number (ancestor-child-number "ARTICLE" target) "1"))) ((ancestor-child-number "GLOSSARY" target) (string-append "-GLO-" (format-number (ancestor-child-number "GLOSSARY" target) "1"))) (#t (string-append "-XXX-" (number->string (all-element-number target))))) %output-suffix%))) (element LINK (let* ((target (element-with-id (attribute-string "linkend") (book-node))) (target-file-name (link-file-name target))) (make element gi: "A" attributes: (list (list "href" (string-append target-file-name "#" (attribute-string "linkend"))))))) (element ULINK (make element gi: "A" attributes: (list (list "href" (attribute-string "url"))))) (element XREF (let* ((linkend (attribute-string "linkend")) (target (element-with-id linkend (book-node))) (target-gi (gi target))) (make element gi: "A" attributes: (append (list (list "href" (string-append (link-file-name target) "#" linkend))) (if (equal? target-gi "CO") ;;; XREF must be in same file as CO for ;;; backlink to work correctly (list (list "name" (string-append "backlink-" linkend))) '())) (if (equal? target-gi "CO") (literal (or (attribute-string "label" target) "Unlabeled CO")) (with-mode extract-xref-text (process-node-list target)))))) (mode extract-xref-text (default (let ((titles (select-elements (children (current-node)) "TITLE"))) (if (node-list-empty? titles) (literal (string-append "Reference to " (id))) (with-mode extract-title-text (process-node-list (node-list-first titles))))))) (element CO (if (id) (make element gi: "A" attributes: (list (list "name" (id)) (list "href" (string-append "#backlink-" (id)))) (make element gi: "SPAN" attributes: '(("class" "co")) (literal (or (attribute-string "label") "Unlabeled CO")))) (empty-sosofo))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; figures (element FIGURE (let ((gubbins (make sequence (make empty-element gi: "P") (make-anchor) (process-children) (make empty-element gi: "P")))) (cond (%stylesheet-name% (make element gi: "DIV" attributes: '(("class" "figure")) gubbins)) (%centre-figures% (make element gi: "CENTER" gubbins)) (#t gubbins)))) (element (FIGURE TITLE) (make sequence (make element gi: "H5" attributes: '(("class" "figure")) (make sequence (literal "Figure: ") (process-children-trim))) (make empty-element gi: "P"))) (element GRAPHIC (let ((img (make sequence (make empty-element gi: "P") (make empty-element gi: "IMG" attributes: (let ((filename (string-append (or (and %graphic-directory% (string-append %graphic-directory% "/")) "") (attribute-string "fileref") "." (or (attribute-string "format") %default-graphic-format%)))) (list (list "src" filename) (list "alt" filename))))))) (if (equal? (attribute-string "align") "CENTER") (if %stylesheet-name% (make element gi: "DIV" attributes: '(("class" "center")) img) (make element gi: "CENTER" img)) img))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; tables (define (make-table-attributes) (append (if (equal? (attribute-string "frame") "ALL") '(("border" "1") ("cellpadding" "2")) '(("border" "0"))) ; (let ((wantcolsep (equal? (attribute-string "colsep") "1")) ; (wantrowsep (equal? (attribute-string "rowsep") "1"))) ; (list ; (cond ((and wantrowsep wantcolsep) '("rules" "all")) ; (wantcolsep '("rules" "cols")) ; (wantrowsep '("rules" "rows")) ; (#t '("rules" "none"))))) )) (element TABLE (let ((table (make sequence (make-anchor) (let ((tab (make sequence (make element gi: "TABLE" attributes: (make-table-attributes) (make sequence (make element gi: "CAPTION" (make sequence (literal "Table: ") (with-mode extract-title-text (process-first-descendant "TITLE")))) (with-mode footnote-ref (process-children)))) (with-mode footnote-def (process-node-list (select-elements (descendants (current-node)) "FOOTNOTE"))))) (roleattr (or (attribute-string "role") ""))) (if (or (equal-ci? roleattr "centre") (equal-ci? roleattr "center")) (if %stylesheet-name% (make element gi: "DIV" attributes: '(("class" "center")) tab) (make element gi: "CENTER" tab)) tab))))) (if %stylesheet-name% (make element gi: "DIV" attributes: '(("class" "table")) table) (make sequence (make empty-element gi: "P") table (make empty-element gi: "P"))))) (element (TABLE TITLE) (empty-sosofo)) (element INFORMALTABLE (make sequence (make empty-element gi: "P") (let ((tab (make element gi: "TABLE" attributes: (make-table-attributes) (process-children))) (roleattr (or (attribute-string "role") ""))) (if (or (equal-ci? roleattr "centre") (equal-ci? roleattr "center")) (if %stylesheet-name% (make element gi: "DIV" attributes: '(("class" "center")) tab) (make element gi: "CENTER" tab)) tab)) (make empty-element gi: "P"))) (element ENTRY (process-children-trim)) ; routine to convert a string consisting of a number followed by a ; unit (mm, cm, etc.) into a string consisting of just a number (in ; pixel units) (define (to-pixels lenstring) (let ((num (or (string->number lenstring) 0))) (number->string (truncate (* %display-dpi% 0.01388888 (if (quantity? num) (let ((qstr (quantity->string num))) ;; this assumes the unit string is "pt1" (string->number (substring qstr 0 (- (string-length qstr) 3)))) num)))))) ;; hairy stuff to get table entries to understand various attributes (define (process-table-entry entry entrycolnum span entrygi colspecs cols) (make sequence ;; loop through COLSPECs looking for one that has the right ;; column number (let loop ((specs colspecs) (nextspeccolnum 1)) (if (node-list-empty? specs) ;; we didn't find a COLSPEC for this column (let ((alignattr (or (inherited-attribute-string "align" entry) "left"))) (make empty-element gi: entrygi attributes: (append (list (list "align" alignattr)) (if (> span 1) (list (list "colspan" (number->string span))) '())))) ;; look at next COLSPEC and see if it is for this column the ;; column number can be explicitly given with a 'colnum' ;; attribute or implicitly one more than the last column ;; number (let* ((spec (node-list-first specs)) (colnumattr (attribute-string "colnum" spec)) (speccolnum (or (and colnumattr (string->number colnumattr)) nextspeccolnum))) (if (equal? speccolnum entrycolnum) ;; we matched column numbers so extract the align ;; attribute and do the right thing (let ((alignattr (or (attribute-string "align" entry) (attribute-string "align" spec) (inherited-attribute-string "align" entry) "left")) (widthattr (attribute-string "colwidth" spec))) (make empty-element gi: entrygi attributes: (append (if alignattr (list (list "align" alignattr)) '()) (if (and widthattr (= span 1)) (list (if %stylesheet-name% (list "style" (string-append "width: " (to-pixels widthattr))) (list "width" (to-pixels widthattr)))) '()) (if (> span 1) (list (list "colspan" (number->string span))) '())))) ;; didn't match column number so look at next in list (loop (node-list-rest specs) (+ speccolnum 1)))))) (process-node-list entry))) ;; determine the column number (1, 2, ...) that corresponds to the ;; supplied column name from the supplied COLSPECs. If none of the ;; COLSPECs has a matching name and the supplied column name is ;; actually a number, we return that number. (define (find-column-number colspecs colname) ;; loop searches for a COLSPEC whose name matches the supplied ;; column name (let loop ((specs colspecs) (colnum 1)) (if (node-list-empty? specs) ;; if the column name is actually a number use that, ;; otherwise, just return 1 (or (string->number colname) 1) (let* ((spec (node-list-first specs)) (nameattr (attribute-string "colname" spec)) (colnumattr (attribute-string "colnum" spec)) (speccolnum (if colnumattr (string->number colnumattr) colnum))) (if (equal? colname nameattr) speccolnum (loop (node-list-rest colspecs) (+ speccolnum 1))))))) ;; determine the number of columns spanned by the given table entry (define (columns-spanned entry) (let* ((colspecs (select-elements (ancestor "TGROUP" entry) "COLSPEC")) (namest (attribute-string "namest" entry)) (nameend (attribute-string "nameend" entry))) (if (and namest nameend) (+ (- (find-column-number colspecs nameend) (find-column-number colspecs namest)) 1) 1))) (define (process-table-row sofar row entrygi entryprocessor) (sosofo-append sofar (make empty-element gi: "TR") (let loop ((entries (children row)) (result (empty-sosofo)) (colnum 1)) (if (node-list-empty? entries) result (let* ((entry (node-list-first entries)) (span (columns-spanned entry))) (loop (node-list-rest entries) (sosofo-append result (entryprocessor entry colnum span entrygi)) (+ colnum span))))))) (define (process-table-group sofar group entrygi rowreducer) (sosofo-append sofar (node-list-reduce (select-elements (children group) "ROW") (lambda (sofar new) (rowreducer sofar new entrygi)) (empty-sosofo)))) (define (process-tgroup) (let* ((colspecs (select-elements (children (current-node)) "COLSPEC")) (cols (string->number (attribute-string "cols"))) (entryprocessor (lambda (new colnum span entrygi) (process-table-entry new colnum span entrygi colspecs cols))) (rowreducer (lambda (sofar new entrygi) (process-table-row sofar new entrygi entryprocessor))) (groupreducer (lambda (sofar new entrygi) (process-table-group sofar new entrygi rowreducer)))) (make sequence (node-list-reduce (select-elements (children (current-node)) "THEAD") (lambda (sofar new) (groupreducer sofar new "TH")) (empty-sosofo)) (node-list-reduce (select-elements (children (current-node)) "TBODY") (lambda (sofar new) (groupreducer sofar new "TD")) (empty-sosofo)) (node-list-reduce (select-elements (children (current-node)) "TFOOT") (lambda (sofar new) (groupreducer sofar new "TH")) (empty-sosofo))))) (element TGROUP (process-tgroup)) (element ENTRYTBL (make element gi: "TABLE" attributes: (make-table-attributes) (process-tgroup))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; book info (element BOOKINFO (make sequence (if %stylesheet-name% (make element gi: "DIV" attributes: '(("class" "bookinfo")) (process-children)) (make element gi: "CENTER" (process-children))) (cond ((not %no-make-toc%) (make sequence (make-fat-rule) (make element gi: "H2" (literal "Contents")) (make element gi: "ul" (with-mode make-toc-links (process-node-list (book-node)))))) (#t (empty-sosofo))))) (element AUTHORGROUP (let ((reducer (lambda (sofar new) (sosofo-append sofar (make element gi: "H2" attributes: '(("class" "bookinfo")) (process-node-list new)))))) (make sequence (node-list-reduce (select-elements (children (current-node)) "AUTHOR") reducer (empty-sosofo)) (node-list-reduce (select-elements (children (current-node)) "EDITOR") reducer (empty-sosofo)) (node-list-reduce (select-elements (children (current-node)) "CORPAUTHOR") reducer (empty-sosofo))))) (element (BIBLIOENTRY AUTHORGROUP) (let ((reducer (lambda (sofar new) (sosofo-append sofar (make element gi: "H3" (process-node-list new)))))) (make sequence (node-list-reduce (select-elements (children (current-node)) "AUTHOR") reducer (empty-sosofo)) (node-list-reduce (select-elements (children (current-node)) "EDITOR") reducer (empty-sosofo)) (node-list-reduce (select-elements (children (current-node)) "CORPAUTHOR") reducer (empty-sosofo))))) (element (BOOKINFO DATE) (process-children-trim)) (element (BOOKINFO EDITION) (make sequence (literal "Edition ") (process-children-trim))) (element COPYRIGHT (make element gi: "H4" (make sequence (make entity-ref name: "copy") (process-matching-children "HOLDER") (process-matching-children "YEAR")))) (element HOLDER (make sequence (literal " ") (process-children-trim))) (element YEAR (make sequence (literal " ") (process-children-trim))) (element CORPAUTHOR (process-children-trim)) (element AUTHOR (process-children-trim)) (element EDITOR (process-children-trim)) (element CONFGROUP (process-children-trim)) (element CONFTITLE (make sequence (make empty-element gi: "BR") (make element gi: "I" (process-children)))) (element CONFDATES (make sequence (make empty-element gi: "BR") (process-children))) (element HONORIFIC (make sequence (process-children-trim) (literal " "))) (element FIRSTNAME (make sequence (process-children-trim) (literal " "))) (element OTHERNAME (make sequence (process-children-trim) (literal " "))) (element SURNAME (make sequence (process-children-trim) (literal " "))) (element LINEAGE (make sequence (process-children-trim) (literal " "))) (element TRADEMARK (process-children)) (element PUBLISHERNAME (process-children)) (element BIBLIOENTRY (process-children)) (element ACRONYM (process-children)) (element RELEASEINFO (make sequence (make empty-element gi: "BR") (make element gi: "B"))) (element AFFILIATION (make sequence (make element gi: "I"))) (element ORGNAME (make sequence (make empty-element gi: "BR") (process-children))) (element JOBTITLE (make sequence (make empty-element gi: "BR") (process-children))) (element ORGDIV (make sequence (make empty-element gi: "BR") (process-children))) (element PUBLISHER (make sequence (make empty-element gi: "BR") (process-children))) (element ISBN (make sequence (make empty-element gi: "BR") (process-children))) (element PUBDATE (make sequence (make empty-element gi: "BR") (process-children))) (element REVHISTORY (empty-sosofo)) (element LEGALNOTICE (make sequence (if %stylesheet-name% (make element gi: "DIV" attributes: '(("align" "left"))) (process-children)))) (element KEYWORDSET (empty-sosofo)) (element SUBJECTSET (empty-sosofo)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; TOC (element LOF (empty-sosofo)) (element LOT (empty-sosofo)) (element TOC (empty-sosofo)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; DIY TOC (mode make-toc-links (element (BOOK) (sosofo-append (process-children) (cond ((not %no-make-index%) (make sequence (make empty-element gi: "LI") (make element gi: "A" attributes: (list (list "href" (cond (%no-split-output% "#INDEXTOP") (#t (string-append (index-file-name) "#INDEXTOP"))))) (literal "Index")))) (#t (empty-sosofo))))) (element (ARTICLE) (process-matching-children "SECT1")) (element (CHAPTER) (make-major-div-toc-links)) (element (APPENDIX) (make-major-div-toc-links)) (element (GLOSSARY) (make-major-div-toc-links)) (element (SECT1) (make sequence (make empty-element gi: "LI") (let ((title-text (with-mode extract-title-text (process-first-descendant "TITLE")))) (make element gi: "A" attributes: (list (list "href" (string-append (link-file-name (current-node)) "#" (gi) (number->string (all-element-number (current-node)))))) title-text)) (let ((refentries (select-elements (children (current-node)) "REFENTRY"))) (if (node-list-empty? refentries) (empty-sosofo) (make element gi: "ul" (with-mode make-toc-links (process-node-list refentries))))))) (element (REFENTRY) (make sequence (make empty-element gi: "LI") (let ((title-text (process-first-descendant "REFMETA"))) (make element gi: "A" attributes: (list (list "href" (string-append (link-file-name (current-node)) "#" (gi) (number->string (all-element-number (current-node)))))) title-text)))) (default (empty-sosofo))) (define (make-major-div-toc-links) (make sequence (make empty-element gi: "LI") (let ((title-text (cond ((equal? (gi) "CHAPTER") (make sequence (literal (string-append "Chapter " (format-number (element-number (current-node)) "1") " - ")) (with-mode extract-title-text (process-first-descendant "TITLE")))) ((equal? (gi) "APPENDIX") (make sequence (literal (string-append "Appendix " (format-number (element-number (current-node)) "A") " - ")) (with-mode extract-title-text (process-first-descendant "TITLE")))) ((equal? (gi) "GLOSSARY") (literal "Glossary")) (#t (with-mode extract-title-text (process-first-descendant "TITLE")))))) (make element gi: "A" attributes: (list (list "href" (string-append (link-file-name (current-node)) "#" (gi) (number->string (all-element-number (current-node)))))) title-text)) (let ((wanted (node-list-reduce (children (current-node)) (lambda (sofar new) (if (or (equal? (gi new) "SECT1") (equal? (gi new) "REFENTRY")) (node-list sofar new) sofar)) (node-list)))) (if (node-list-empty? wanted) (empty-sosofo) (make element gi: "UL" (with-mode make-toc-links (process-node-list wanted))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; make the unimplemented bits stand out (default (make element gi: "FONT" attributes: '(("color" "red")) (make sequence (literal (string-append "<" (gi) ">")) (process-children) (literal (string-append "</" (gi) ">"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; standard subroutines (define (node-list-reduce nl combine init) (if (node-list-empty? nl) init (node-list-reduce (node-list-rest nl) combine (combine init (node-list-first nl))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; various homebrew subroutines (define (book-node) (cond ((equal? (gi) "BOOK") (current-node)) (#t (ancestor "BOOK")))) (define (make-fat-rule) (make empty-element gi: "HR" attributes: (if %stylesheet-name% '(("class" "fat")) '(("size" "5"))))) (define (make-thin-rule) (make empty-element gi: "HR" attributes: (if %stylesheet-name% '(("class" "thin")) '(("size" "2"))))) (define (index-file-name) (string-append %output-basename% "-IND" %output-suffix%)) (define (chap-app-head-label chap-or-app) (let ((label (attribute-string "label" (ancestor chap-or-app)))) (string-append chap-or-app " " (if label (if (equal? label "auto") (format-number (element-number (ancestor chap-or-app)) (if (equal? chap-or-app "Chapter") "1" "A")) label) (format-number (element-number (ancestor chap-or-app)) (if (equal? chap-or-app "Chapter") "1" "A"))) ". "))) (define (make-anchor) (make sequence (make element gi: "A" attributes: (list (list "name" (string-append (gi) (number->string (all-element-number (current-node)))))) (literal "")) (if (id) (make element gi: "A" attributes: (list (list "name" (id))) (literal "")) (empty-sosofo)))) (define (make-color-para color) (if %stylesheet-name% (make element gi: "DIV" attributes: (list (list "class" (string-append "{color: " color "}"))) (make-special-para)) (make element gi: "FONT" attributes: (list (list "color" color)) (make-special-para)))) (define (make-special-para) (make sequence (make empty-element gi: "P") (make element gi: "B" (literal (string-append (gi) ":"))) (make element gi: "BLOCKQUOTE" (process-children)))) (define (maybe-bold-children) (cond ((equal? (attribute-string "role") "bold") (make element gi: "B" (process-children-trim))) (#t (process-children-trim)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; the end
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor