![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|||||
|
|
|||||
| XML to HTML conversions: chunking | |||||
| Introduction: XML to HTML conversions: chunking |
Sample
This program uses the mart.xml sample input file.
down-translate with xml ; Use XML parser.
global counter chap-no initial {0}
global stream toc
global stream cba
global stream chap-title
document-start
;
; Table of contents (toc).
;
open toc as referent "toc"
;
; Contents by audience.
;
open cba with referents-allowed as referent "cba"
element doc
output "%sc"
element #implied
output "%c"
element title when parent is doc
local stream title
set title to "%c"
output "<title>%g(title)</title>%n"
|| "<h1>%g(title)</h1>%n"
element author
output "by: %c%n"
;
; This is where we want the table of contents.
;
output "<hr><h2>Table of Contents</h2>%n"
|| '<ul>%n'
|| referent "toc"
|| '</ul>'
;
; This is where we want the contents by audience.
;
output "<hr><h2>Contents by Audience</h2>%n"
|| '<ul>%n'
|| referent "cba"
|| '</ul>'
element audience
local stream aud
set aud to "%c"
output "<b>For:</b> <i>%g(aud)</i>%n"
;
; Handle contents by audience.
;
do when referents hasnt key "audtype-%g(aud)"
;
; Give it a starting value.
;
set referent
"audtype-%g(aud)" to "<li>%g(aud): "
;
; Create a place for this list of audience references
; in the contents by audience referent.
;
put cba referent "audtype-%g(aud)"
else
;
; A referent for this audience exists, so just append
; the desired delimiter (a semicolon in this case).
;
set referent
"audtype-%g(aud)" to referents ^ "audtype-%g(aud)" || "; "
done
;
; Now write the necessary linking information to the end of the
; audience referent.
;
using attribute id of parent
set referent
"audtype-%g(aud)" to referents ^ "audtype-%g(aud)"
|| '<a href="chap-%d(chap-no).htm">%g(chap-title)</a>'
element p
output "<p>%n%n%c"
element glossary
set file "gloss.htm" to
'<font size=-2>'
|| '<a href="chunk.htm">[Tables of Contents]</a><br>%n'
|| '</font>'
|| "<h2>Glossary</h2>%n%n"
|| "<ul>%n%c"
|| "</ul>%n"
element term
local stream term
set term to "%c" ; Content linking.
output '<a name="content-%g(term)">'
|| "<li>%g(term):"
element part
local stream part
set part to "%c"
output '<a href="gloss.htm#content-%g(part)">'
|| "%g(part)"
|| '</a>'
element defn
output " %c%n"
; Explicit links.
element xref
output referent "chapfile-%v(idref)"
suppress
element chapter
increment chap-no
set file "chap-%d(chap-no).htm" with referents-allowed to '%c'
element title when parent is chapter
local counter prev-chap-no
set chap-title to "Chapter %d(chap-no), %c"
;
; Small navigation font.
;
output "<font size=-2>"
;
; Backward linking.
;
do when chap-no > 1
set prev-chap-no to chap-no - 1
output '<a ref="chap-%d(prev-chap-no).htm">'
|| '[Previous Chapter]'
|| '</a><br>'
else
output '<font color=gray>'
|| '[Previous Chapter]'
|| '</font><br>'
done
;
; Forward linking (output a referent, set a default in case
; there are no more chapters).
;
output referent "chap-forw-link-%d(chap-no)"
set referent
"chap-forw-link-%d(chap-no)" to
"<font color=gray>[Next Chapter]</font><br>"
; in case there isn't a next
set referent
"chap-forw-link-%d(prev-chap-no)" to
'<a href="chap-%d(chap-no).htm">'
|| '[Next Chapter]</a><br>'
; backfill
;
; A couple of hardcoded ones to assist navigation.
;
output
'<a href="chunk.htm">[Tables of Contents]</a><br>%n'
output
'<a href="gloss.htm">[Glossary]</a><br>%n'
output
"</font>"
;
output
"<h2>%g(chap-title)</h2>%n"
using attribute id of parent
do
set referent
"chapfile-%v(id)" to '<a href="chap-%d(chap-no).htm">'
|| '%g(chap-title)</a>'
put toc '<li><a href="chap-%d(chap-no).htm">%g(chap-title)</a>'
done
document-end
;
; Some browsers don't link well to things at the bottom of
; a page, so put in extra blank lines.
;
output "<br>" ||* 45
|| "<center><i>The End</i></center>%n"
; Some cleanup.
;
translate white-space+ content-end
| ---- |