\begin{code}
+-- Copyright 2008 the Contributors, as shown in the revision logs.
+-- Licensed under the Apache Public Source License 2.0 ("the License").
+-- You may not use this file except in compliance with the License.
+
module Html
where
import Edu_Berkeley_Sbp_Haskell_SBP
" LI { margin-top: 5px; }\n"++
" body { color: #333333; }\n"++
" blockquote { font-style: italic; width: 100% }\n"++
- " div.warn { border: 1px solid red; background-color: #fbb; color: white; }\n"++
+ " div.warn { border: 1px solid #f44; border-top: 5px solid #f44; background-color: #fbb; color: white; }\n"++
" td.warn { color: black; }\n"++
" div.announce { border: 1px solid green; background-color: #bfb; color: white; }\n"++
" td.announce { color: black; }\n"++
" a:hover { text-decoration: none; border-bottom:1px solid; }\n"++
" table.footer { border-top: silver solid 1px; }\n"++
" span.signature { color: #bbb; }\n"++
- " .signature a:link { color: #bbb; }\n"++
- " .signature a:visited { color: #bbb; }\n"++
+ " .signature a:link { color: #aaf; }\n"++
+ " .signature a:visited { color: #faa; }\n"++
" .signature a:hover { color: blue; border-bottom: 1px solid blue; }\n"++
" span.highlight { background: yellow; color: black; padding: 3px }\n"++
" div.pre {\n"++
" text-align: left;\n"++
" font-family: monospace;\n"++
- " border-style: solid;\n"++
+ " border-style: none;\n"++
" border-width: 2px 2px 2px 2px;\n"++
" border-color: #6666aa;\n"++
" color: #FFFFFF;\n"++
- " background-color: #000000;\n"++
+ " background-color: #333333;\n"++
" margin-right: 25px;\n"++
" margin-left: 25px;\n"++
" padding: 10px;\n"++
(toHtml secs) ++
"<br><br>\n"++
"<table width=100% class=footer><tr><td align=left>"++
- "<img src=/images/print.icon.png></td>"++
+ "<img src='"++printIconBase64++"'></td>"++
"<td align=right><span class='signature'>rendered from "++
"<a href=http://www.megacz.com/software/wix>"++
"W<span style='vertical-align:-20%'>I</span>X</a></span></div></td></tr></table>\n"++
"</td></tr></table></center>\n"++
"</body></html>"
+quoteIconBase64 =
+ "data:image/png;base64,"
+ ++"iVBORw0KGgoAAAANSUhEUgAAABAAAAAVCAYAAABPPm7SAAAABmJLR0QA/wD/AP+gvaeTAAAA"
+ ++"CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1wQPAx0rP5obpAAAAWJJREFUOMvdlKFvg0AU"
+ ++"xr8tVZ1cbU+04lUuwc2WypMX9AxiomoJ/RNYqmaaYKpb5kBys1UkWBCdKLqVs8zwFnrQmYol"
+ ++"+xLC8X55H/e+wAENhWGoPM/zT6eThQ4lSWJf5EEQuAAqAJXv+95vXCkVtpwZuq4bmM1pmlrM"
+ ++"LctKWzuwbTsBUNX3lph3Njfd6/WZ9vv9iHkYhsrkPa21zQ9aa9v3fRsAFovFK9cMPgIApdT7"
+ ++"eDz+RB1Y1XEBwEVe54ZbXKm/N7haNwCQ5zmtVqtnE0op49lspgFgPp+/dfF/EGIPAAaDgZBS"
+ ++"xgBwPB7vd7vdIwD0+/2v5ry8juNYmgY/P1GWZQ9sQER3XOcwD4fDkA2IqGiNwN8+ERVNY/Pt"
+ ++"RFQIIcozg+Vy+VKW5dDcMmuz2ThFURAATKfTj7MQ1+v1Ezc7jrMVQpTmocOjOY6znUwmRSvR"
+ ++"KIpknud0KfEoimSWZQ/N2jfhtb1AvGklDQAAAABJRU5ErkJggg=="
+
+warnIconBase64 =
+ "data:image/png;base64,"
+ ++"iVBORw0KGgoAAAANSUhEUgAAABQAAAAREAYAAACN1FD9AAAABmJLR0QA/wD/AP+gvaeTAAAA"
+ ++"CXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAUAAAAEQDeTN6UAAAD/ElEQVRIx8WUbUyV"
+ ++"ZRjHf+chxDi8yZcDa0mKh/wSuNE5eNYHZBiRwoespayEkdgx22hmjB1glTlenDYlMccAX1cb"
+ ++"CDFlg+aQ1JGEazGWpixdbbweDucctPF2PNxXX3pw00gL09+X59m1+77+v+d+nueCBRJ+ECAs"
+ ++"78dnAPp2nLEDtMdpPwMYZhfaf8GU1gLsixwdBRDRr7lRAHmxT0zs+UKAuKmhXgDfGleAYZVh"
+ ++"lXynC/Z1AYyeX+IFiLjw+MwWAxDQuBqgNVsX+iNta/nWcnV0vD+9Ir1CndDre68AfDH42PzW"
+ ++"2QDW79UFxkxh6WHp8o5a5lznXCfJ/nPX867nSYArO7AssEyOjOwE8GfGZwC84Pu3edrDLgzK"
+ ++"AFj06q7DAPt/1evBK4szizMlpXy4tqO2g/MHa9sm2ibwP23M78zvFE0rBAg4U24DqFpieAqA"
+ ++"6kd+cjuiAAqu6Sfn/n55/fJ6CZOc6YHpATmkNWgNWoOIZtSMmlFE1d9ae2utvDt21ZRiSpHV"
+ ++"+r43LwFkBT4ysehigKgDvxcC3P5QD5qxNtU11anj8hfhg+GD4YMixipjlbFK5pjyHok8Enn3"
+ ++"m7yyG2DAEdIFYLy9YMHDLoBjK/WA8fhkb7JXtcqMnJbT4tJFYlpiWmJaRKJio2KjYu8KSp9K"
+ ++"UAly2ZtpSbWkql/0PrsuAJR3/2cx65cA1qujRgBV6HpWy9fy5dydOz2JPYlqQO4hwZ/gT/CL"
+ ++"mB1mh9kh93Enq2tP1x7V4wo0pBnS5KehVwBmPjA7AcxtDy2mBQIYPmk/B/CDb26MxGw5teWU"
+ ++"+krmIdWaak21iiR2JHYkdsi83G7KtmRb1HG9b+PHAK2lJAEQ9EDBt88C5BybGyOLQgtCC8Su"
+ ++"gkesI1axzRd8Mvdk7slckeoN1RuqN8wvODsyVDNUIxaXP0SFKHlfz8l4GSDTfd+B6Tdh5QCh"
+ ++"hUUvAlR8o9eDI4qSipLkJcOEqdvUzaX5HmzSNGmaNMFN+037TTvgxInzb96QKTovOo/LRmuJ"
+ ++"r8QnFr3+2esAB/IX9wAEjd+3cfc+gD2euTFSv2zzss0SIdnTG6c3SqU8AFulrdJWKRJSElIS"
+ ++"UiLia/Y1+5r/YcNHM9tntku1e2KFZ4VHAvXcwnyAksY5MfNvAOYdQ+8BzHytL5warDtRd2I2"
+ ++"QjWNh46HqjR11LvGu0aVqUOei56LYlD7PRWeCmlWpe4p95R87h66Yb9hV+7+o71BvUHKoWyj"
+ ++"jlGHSlbPOTc5N6kkFTqybWSbeksxfHb4rGqd9Q3nDOdI5lRHTXtNu6rWc/vfAJjoXHoNYOl6"
+ ++"Q70CaFEpYwAZhof+m/5nvv0UoDFLW/UagCXuSQvdSzwAiTv/BGXg1AxNKyCeAAAAAElFTkSu"
+ ++"QmCC"
+
+printIconBase64 =
+ "data:image/png;base64,"
+ ++"iVBORw0KGgoAAAANSUhEUgAAAA8AAAAOCAMAAADHVLbdAAAALHRFWHRDcmVhdGlvbiBUaW1l"
+ ++"AEZyaSAxOSBTZXAgMjAwMyAxODozOTozMiAtMDAwME2jAt8AAAAHdElNRQfTCRMRKABXeznM"
+ ++"AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAACRQTFRF////AAAA7+/v"
+ ++"3t7ezs7OtbW1ra2tlJSUnJycEBAQKSkphISEbGtEogAAAAF0Uk5TAEDm2GYAAABLSURBVHja"
+ ++"nY1BEsAgCAMDKm31//81qB3l6h4Y4mYQQNvAmXNv7W/gytcTRj6pppQHNWoW6JWS13Ix86yr"
+ ++"O7MEPkDWuWLPK/7hoYEOxksDsk8eppEAAAAASUVORK5CYII="
+
+
+emailIconBase64 =
+ "data:image/png;base64,"
+ ++"iVBORw0KGgoAAAANSUhEUgAAABUAAAAOCAMAAAD32Kf8AAAALHRFWHRDcmVhdGlvbiBUaW1l"
+ ++"AEZyaSAxOSBTZXAgMjAwMyAxODo0MjowOSAtMDAwMBDwv7IAAAAHdElNRQfTCRMRKhqYL6I0"
+ ++"AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAADBQTFRF////AAAAhISE"
+ ++"9/fv9/f3////CAgI7+/v1tbOxsa9tbWtpaWclJSMlJSUe3t7a2trxDv8WgAAAAF0Uk5TAEDm"
+ ++"2GYAAABiSURBVHjabc9JEoAgDETRpNOKs/e/rSEYF8jfhHpQFAi6JHpHBg5VOdIj+KeXkgO9"
+ ++"tUj/Bldo3WdRnktt3fbjgoWKK5EKsunkyryCn86Oxsj/UZqKEkFmNF+mvieFdSK16wFr7QK5"
+ ++"tASqkwAAAABJRU5ErkJggg=="
+
+pdfIconBase64 =
+ "data:image/png;base64,"
+ ++"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAK3RFWHRDcmVhdGlvbiBUaW1l"
+ ++"AFRodSA2IE5vdiAyMDAzIDE1OjMwOjAwIC0wMDAwSwt8PwAAAAd0SU1FB9MLBg8fD1x8/t4A"
+ ++"AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAEZ0FNQQAAsY8L/GEFAAAAQlBMVEX///9zc3Nra2uE"
+ ++"hITGxsaUlJScnJx7e3uMjIz////39/fv7+/n5+fe3t69vb1jY2OlpaXW1ta1tbVaWlqtra3O"
+ ++"zs5w48BYAAAAAXRSTlMAQObYZgAAAIdJREFUeNpNz1ESBBEMBNCRwSCJMOT+V10WW9vKz6uO"
+ ++"iusa0R137ShxjImwHsnSMCbEX6dPiIje+SUKC6hav8CbAQlZD/RmJ1Tdz6oTwETMfAByK0hT"
+ ++"1kgH7E1phFfjdvS2JlJpN8RAyEHMhgJgaexJTBPyA1JiGoD0BXgg2H8wcFs3/jDvPB+sOwir"
+ ++"+o6iKQAAAABJRU5ErkJggg=="
+
instance ToHtml Section where
toHtml (Section level header paragraphs) =
"\n<h"++(show (level+1))++">\n"++
instance ToHtml Paragraph where
toHtml (Blockquote t) = "\n<table class=blockquote border=0 cellpadding=5px>\n"
- ++"<tr><td valign=top><image src=/images/blockquote.png></td>\n"
+ ++"<tr><td valign=top><image src='"++quoteIconBase64++"'></td>\n"
++"<td class=warn>\n"
++(toHtml t)
++"</td></tr></table>\n"
toHtml (P t) = stag "p" $ toHtml t
-link ref body = "<a href='"++ref++"'>"++icon++body++"</a>"
+link ref body = "<a href='"++(urlify ref)++"'>"++icon++body++"</a>"
where
- icon = if ".pdf" `isSuffixOf` ref then "<img "++img++" src=/images/pdf.icon.png> "
- else if "mailto:" `isPrefixOf` ref then "<img "++img++" src=/images/email.icon.png> "
+ urlify = toHtml
+ icon = if ".pdf" `isSuffixOf` ref then "<img "++img++" src='"++pdfIconBase64++"'> "
+ else if "mailto:" `isPrefixOf` ref then "<img "++img++" src='"++emailIconBase64++"'> "
else ""
img = "style='vertical-align: text-bottom;' border=0 "
-- margin-bottom: -2px; padding-bottom: 2px; border-bottom: 1px blue solid;
toHtml (Quotes x) = "“"++(toHtml x)++"”"
toHtml (Verbatim x) = pre x
toHtml (Link t ref) = link (show ref) (toHtml t)
+ toHtml (Command "comment" y) = ""
toHtml (Command "url" y) = "<tt>"++(link (toHtml y) (toHtml y))++"</tt>"
toHtml (Command "WiX" y) = "W<span style='vertical-align:-20%'>I</span>X"
toHtml (Command "TeX" y) = "T<span style='vertical-align:-20%'>E</span>X"
toHtml (Command "green" y) = "<font color=green>"++(toHtml y)++"</font>"
toHtml (Command "sc" y) = "<sc>"++(toHtml y)++"</sc>"
toHtml (Command "image" y) = "<img src='"++(toHtml y)++"'/>"
+ toHtml (Command "imagec" y) = "<center><img src='"++(toHtml y)++"'/></center>"
+ toHtml (Command "image2" y) = "<img width=180px src='"++(toHtml y)++"'/>"
toHtml (Command "image3" y) = "<img width=200px src='"++(toHtml y)++"'/>"
toHtml (Command "image4" y) = "<center><img width=550px src='"++(toHtml y)++"'/></center>"
toHtml (Command "warn" y) = "\n<div class=warn>\n<table border=0 cellpadding=5px>\n"
- ++"<tr><td valign=top><image src=/images/warn.png></td>\n"
+ ++"<tr><td valign=top><image src='"++warnIconBase64++"'></td>\n"
++"<td class=warn>\n"
++(toHtml y)
++"</td></tr></table></div>\n"
toHtml (Command "br" _) = "\n<br/>\n"
toHtml (Command "cent" _) = "½"
toHtml (Command "euro" _) = "€"
- toHtml (Command "ordinal" x) = (toHtml x)++"<sup>"++"th"++"</sup>"
+
+ -- gross hack
+ toHtml (Command "ordinal" x) | (last (toHtml x) == '1') = (toHtml x)++"<sup>"++"st"++"</sup>"
+ | (last (toHtml x) == '2') = (toHtml x)++"<sup>"++"nd"++"</sup>"
+ | (last (toHtml x) == '3') = (toHtml x)++"<sup>"++"rd"++"</sup>"
+ | otherwise = (toHtml x)++"<sup>"++"th"++"</sup>"
+
-- FIXME: use "unicode vulgar fractions" here
toHtml (Command "fraction" [n,d]) = "<sup>"++(toHtml n)++"</sup>"++"/"++"<sub>"++(toHtml d)++"</sub>"
toHtml (Command "rfc" x) = "<tt><a href=http://tools.ietf.org/html/rfc"++(toHtml x)++">RFC"++(toHtml x)++"</a></tt>"
toHtml (GlyphText TradeMark) = "™"
toHtml (GlyphText ServiceMark) = "™"
toHtml (GlyphText Emdash) = "—"
- toHtml (GlyphText Ellipsis) = "…"
+ toHtml (GlyphText Ellipsis) = "…" -- &cdots;?
toHtml (GlyphText Cent) = "½"
toHtml (GlyphText Daggar) = "†"
toHtml (GlyphText DoubleDaggar) = "‡"
toHtml (GlyphText Sharp) = "⋘"
toHtml (GlyphText CheckMark) = "✓"
toHtml (GlyphText XMark) = "✗"
- toHtml (GlyphText LeftArrow) = "&#;" -- FIXME
+ toHtml (GlyphText LeftArrow) = "←"
+ toHtml (GlyphText RightArrow) = "→"
toHtml (GlyphText DoubleLeftArrow) = "&#;" -- FIXME
toHtml (GlyphText DoubleRightArrow) = "&#;" -- FIXME
toHtml (GlyphText DoubleLeftRightArrow) = "&#;" -- FIXME
instance ToHtml String where
toHtml s = concatMap htmlEscapeChar s
- where
- htmlEscapeChar '<' = "<"
- htmlEscapeChar '>' = ">"
- htmlEscapeChar '&' = "&"
- htmlEscapeChar '\'' = "'"
- htmlEscapeChar '\"' = """
- htmlEscapeChar c = [c]
-
-pre x = "\n<div class=pre>"++ (pre' x) ++ "\n</div>\n"
+
+htmlEscapeChar '<' = "<"
+htmlEscapeChar '>' = ">"
+htmlEscapeChar '&' = "&"
+htmlEscapeChar '\'' = "'"
+htmlEscapeChar '\"' = """
+htmlEscapeChar c = [c]
+
+pre x = "\n<div class=pre style='white-space:nowrap'>"++ (pre' x) ++ "\n</div>\n"
where
pre' (' ':b) = " "++(pre' b)
pre' ('\n':b) = "<br/>\n"++(pre' b)
- pre' (a:b) = a:(pre' b)
+ pre' (a:b) = (htmlEscapeChar a)++(pre' b)
pre' [] = []
\end{code}