| 1 |
abate |
250 |
include "xhtml-strict.cd";; |
| 2 |
|
|
include "xhtml-categ.cd";; |
| 3 |
|
|
|
| 4 |
abate |
253 |
type Site = <site>[ <page {|input=String; output=String|}>[]* ];; |
| 5 |
|
|
|
| 6 |
abate |
250 |
type Page = <page>[ |
| 7 |
|
|
<title>String |
| 8 |
|
|
<banner>[InlineText*] |
| 9 |
|
|
<navig>[ NavigBox* ] <main>[ Box* ] ];; |
| 10 |
|
|
|
| 11 |
|
|
type Author = <author>String;; |
| 12 |
|
|
type Paper = |
| 13 |
|
|
<paper file=?String>[ |
| 14 |
|
|
<title>String |
| 15 |
|
|
Author+ |
| 16 |
|
|
<comment>[InlineText*] |
| 17 |
|
|
<abstract>Content ];; |
| 18 |
|
|
type Slides = |
| 19 |
|
|
<slides file=String>[ |
| 20 |
|
|
<title>String |
| 21 |
|
|
Author+ |
| 22 |
|
|
<comment>[InlineText*] |
| 23 |
|
|
];; |
| 24 |
|
|
|
| 25 |
|
|
type Link = |
| 26 |
|
|
<link url=String; title=String>[InlineText*];; |
| 27 |
|
|
|
| 28 |
|
|
|
| 29 |
|
|
type Content = |
| 30 |
|
|
[ ( <p {||}>[InlineText*] |
| 31 |
|
|
| <ul {||}>[<li {||}>Content +] |
| 32 |
|
|
| <section title=String>Content |
| 33 |
|
|
| Paper | Slides | Link | InlineText )* ];; |
| 34 |
|
|
|
| 35 |
|
|
type InlineText = |
| 36 |
|
|
Char |
| 37 |
|
|
| <(`b|`i) {||}>[InlineText*] |
| 38 |
abate |
254 |
| <duce>[InlineText*] |
| 39 |
abate |
250 |
| Xa |
| 40 |
abate |
254 |
| Ximg | Xbr |
| 41 |
abate |
250 |
;; |
| 42 |
|
|
|
| 43 |
|
|
type Box = <box title=String; subtitle=?String; link=String>Content |
| 44 |
|
|
| <meta>Content;; |
| 45 |
|
|
type NavigBox = <box>Content | <toc>[];; |
| 46 |
|
|
|
| 47 |
|
|
let fun authors ([Author+] -> String) |
| 48 |
|
|
| [ <author>a ] -> a |
| 49 |
|
|
| [ <author>a1 <author>a2 ] -> a1 @ ", and " @ a2 |
| 50 |
|
|
| [ <author>a; rem ] -> a @ ", " @ authors rem;; |
| 51 |
|
|
|
| 52 |
abate |
254 |
let fun text (t : [InlineText*]) : Inlines = |
| 53 |
|
|
map t with |
| 54 |
|
|
<duce>x -> <b>[ <tt>(text x) ] |
| 55 |
|
|
| <b>x -> <b>(text x) |
| 56 |
|
|
| <i>x -> <i>(text x) |
| 57 |
|
|
| z -> z;; |
| 58 |
|
|
|
| 59 |
abate |
250 |
let fun content (t : Content) : Flow = |
| 60 |
|
|
transform t with |
| 61 |
|
|
| <section title=title>c -> [ <h4>title !(content c) ] |
| 62 |
|
|
| <paper (r)>[ <title>tit aut::Author* <comment>com <abstract>ab ] -> |
| 63 |
|
|
[ |
| 64 |
|
|
(match r with |
| 65 |
|
|
| { file = f } -> <a href=f>tit |
| 66 |
|
|
| _ -> <b>tit |
| 67 |
|
|
) '. ' |
| 68 |
|
|
!(authors aut) '. ' |
| 69 |
abate |
254 |
!(text com) |
| 70 |
abate |
250 |
<div class="abstract">[ 'Abstract:' !(content ab) ] |
| 71 |
|
|
] |
| 72 |
|
|
| <slides file=f>[ <title>tit aut::Author* <comment>com ] -> |
| 73 |
abate |
254 |
[ <a href=f>tit '. ' !(authors aut) '. ' !(text com) ] |
| 74 |
abate |
250 |
| <link url=url; title=title>com -> |
| 75 |
abate |
254 |
[ <a href=url>title '. ' !(text com) ] |
| 76 |
abate |
250 |
| <ul>lis -> [ <ul>(map lis with <li>x -> <li>(content x)) ] |
| 77 |
abate |
254 |
| <p>x -> [ <p>(text x) ] |
| 78 |
|
|
| <ul>x -> [ <ul>(text x) ] |
| 79 |
|
|
| x -> text [ x ];; |
| 80 |
abate |
250 |
|
| 81 |
|
|
let fun main2html (Box -> Flow) |
| 82 |
|
|
<box (r)>c -> |
| 83 |
|
|
[ <div class="box">[ |
| 84 |
|
|
<h2>(r.title) |
| 85 |
|
|
!(match r with { subtitle = t } -> [<b>t] | _ -> []) |
| 86 |
|
|
<a name=r.link>[] |
| 87 |
|
|
!(content c) ] ] |
| 88 |
|
|
| <meta>c -> [ <div class="meta">(content c) ];; |
| 89 |
|
|
|
| 90 |
|
|
|
| 91 |
|
|
let fun page2html (Page -> Xhtml) |
| 92 |
|
|
<page>[ <title>title <banner>banner <navig>navig <main>main ] -> |
| 93 |
|
|
let toc = |
| 94 |
|
|
transform main with <box title=t; link=l>_ -> [ <li>[ <a href=('#',l)>t ] ] in |
| 95 |
|
|
let toc = match toc with [] -> [] | lis -> [ <ul>lis ] in |
| 96 |
|
|
let navig : Flow = transform navig with |
| 97 |
|
|
| <box>c -> [ <div class="box">(content c) ] |
| 98 |
|
|
| <toc>[] -> [ <div class="box">toc ] |
| 99 |
|
|
in |
| 100 |
|
|
<html>[ |
| 101 |
|
|
<head>[ |
| 102 |
|
|
<title>title |
| 103 |
|
|
<meta content="text/html; charset=iso-8859-1"; http-equiv="Content-Type">[] |
| 104 |
|
|
<link rel="stylesheet"; href="cduce.css"; type="text/css"> [] |
| 105 |
|
|
] |
| 106 |
|
|
<body>[ |
| 107 |
abate |
254 |
<div class="title">[ <h1>(text banner) ] |
| 108 |
abate |
250 |
<div id="Sidelog">navig |
| 109 |
|
|
<div id="Content">(transform main with b -> main2html b) |
| 110 |
|
|
] |
| 111 |
|
|
];; |
| 112 |
|
|
|
| 113 |
abate |
253 |
let fun do_page((String,String) -> []) |
| 114 |
|
|
(inf,outf) -> |
| 115 |
|
|
let _ = print [ 'Loading ' !inf '... ' ] in |
| 116 |
|
|
let page = match load_xml inf with |
| 117 |
|
|
| Page & p -> p |
| 118 |
abate |
254 |
| _ -> raise ("Invalid input document: " @ inf) in |
| 119 |
abate |
253 |
let _ = print [ 'Generating html ... ' ] in |
| 120 |
|
|
let html : String = |
| 121 |
|
|
[ '<?xml version="1.0" encoding="iso-8859-1"?>' |
| 122 |
|
|
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"' |
| 123 |
|
|
' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' |
| 124 |
|
|
!(print_xml (page2html page)) ] in |
| 125 |
|
|
let _ = print [ 'Saving to ' !outf '...\n' ] in |
| 126 |
|
|
dump_to_file outf html;; |
| 127 |
abate |
250 |
|
| 128 |
|
|
|
| 129 |
abate |
253 |
let site = |
| 130 |
|
|
let _ = print [ 'Loading site.xml ...\n' ] in |
| 131 |
|
|
match load_xml "site.xml" with |
| 132 |
|
|
| Site & <site>s -> |
| 133 |
|
|
(transform s with <page input=inf; output=outf>[] -> |
| 134 |
|
|
do_page(inf,outf)) |
| 135 |
|
|
| _ -> raise "Invalid site.xml";; |