X-Git-Url: http://git.megacz.com/?p=wix.git;a=blobdiff_plain;f=src%2FHtml.scala;fp=src%2FHtml.scala;h=8ffdea3d7e80bc8c90746e56614954f6a287130b;hp=0000000000000000000000000000000000000000;hb=13421e4b1878491e2607ca6d11c3f9b8bcf884b8;hpb=d60804399a886f1dc26f0f22fc066ba0dd49dc16
diff --git a/src/Html.scala b/src/Html.scala
new file mode 100644
index 0000000..8ffdea3
--- /dev/null
+++ b/src/Html.scala
@@ -0,0 +1,216 @@
+trait ToHtml {
+ def toHtml : String
+}
+
+object Html {
+
+ def style : String =
+ "\n\n"
+
+ def 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=="
+
+ def 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"
+
+ def printIconBase64 =
+ "data:image/png;base64,"+
+ "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAOCAMAAADHVLbdAAAALHRFWHRDcmVhdGlvbiBUaW1l"+
+ "AEZyaSAxOSBTZXAgMjAwMyAxODozOTozMiAtMDAwME2jAt8AAAAHdElNRQfTCRMRKABXeznM"+
+ "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAACRQTFRF////AAAA7+/v"+
+ "3t7ezs7OtbW1ra2tlJSUnJycEBAQKSkphISEbGtEogAAAAF0Uk5TAEDm2GYAAABLSURBVHja"+
+ "nY1BEsAgCAMDKm31//81qB3l6h4Y4mYQQNvAmXNv7W/gytcTRj6pppQHNWoW6JWS13Ix86yr"+
+ "O7MEPkDWuWLPK/7hoYEOxksDsk8eppEAAAAASUVORK5CYII="
+
+ def emailIconBase64 =
+ "data:image/png;base64,"+
+ "iVBORw0KGgoAAAANSUhEUgAAABUAAAAOCAMAAAD32Kf8AAAALHRFWHRDcmVhdGlvbiBUaW1l"+
+ "AEZyaSAxOSBTZXAgMjAwMyAxODo0MjowOSAtMDAwMBDwv7IAAAAHdElNRQfTCRMRKhqYL6I0"+
+ "AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAADBQTFRF////AAAAhISE"+
+ "9/fv9/f3////CAgI7+/v1tbOxsa9tbWtpaWclJSMlJSUe3t7a2trxDv8WgAAAAF0Uk5TAEDm"+
+ "2GYAAABiSURBVHjabc9JEoAgDETRpNOKs/e/rSEYF8jfhHpQFAi6JHpHBg5VOdIj+KeXkgO9"+
+ "tUj/Bldo3WdRnktt3fbjgoWKK5EKsunkyryCn86Oxsj/UZqKEkFmNF+mvieFdSK16wFr7QK5"+
+ "tASqkwAAAABJRU5ErkJggg=="
+
+ def 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=="
+
+ def jsMath =
+ "\n"+
+ "\n"+
+ "\n"+
+ "\n"
+
+ def urlEscape (s:Seq[Char]) =
+ s.map(urlEscapeChar).foldLeft("")(_ + _)
+
+ def htmlEscape (s:Seq[Char]) =
+ s.map(htmlEscapeChar).foldLeft("")(_ + _)
+
+ private def urlEscapeChar (c:Char) : String =
+ c match {
+ // non-alphanumerics which may appear unescaped
+ case '$' => "$"
+ case '-' => "-"
+ case '_' => "_"
+ case '.' => "."
+ case '!' => "!"
+ case '*' => "*"
+ case '\'' => "\'"
+ case '(' => "("
+ case ')' => ")"
+ case ',' => ","
+
+ // technically these aren't allowed by RFC, but we include them anyways
+ case '/' => "/"
+ case ';' => ";"
+ case '&' => "&"
+ case '=' => "="
+
+ // FIXME: this will wind up "disencoding" a %-encoded question mark
+ case '?' => "?"
+
+ case _ => {
+ if ((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9'))
+ 'c'+""
+ else {
+ val s = "00"+java.lang.Integer.toString(c & 0xff, 16)
+ return '%'+s.substring(s.length()-1, 2)
+ }
+ }
+ }
+
+ private def htmlEscapeChar (c:Char) =
+ c match {
+ case '<' => "<"
+ case '>' => ">"
+ case '&' => "&"
+ case '\'' => "'"
+ case '\"' => """
+ case c => ""+c
+ }
+
+ def mapToHtml[A <: ToHtml](h:Seq[A]) : String =
+ h.map((s:A) => s.toHtml).foldLeft("")(_ + _)
+
+ def joinStrings(strings:Seq[String], separator:String) =
+ if (strings.length == 0) ""
+ else if (strings.length == 1) strings(0)
+ else strings(0)+strings.tail.map( (s:String) => separator+s ).foldLeft("")(_ + _)
+
+ def stag(t:String) = "\n<"+t+">"+t+">\n"
+ def stag(t:String, body:ToHtml) = "\n<"+t+">\n"+body.toHtml+"\n"+t+">\n"
+ def stag0(t:String, body:String) = "\n<"+t+">\n"+body+"\n"+t+">\n"
+ def tag(t:String, body:ToHtml) = "<"+t+">"+body.toHtml+""+t+">"
+ def stag_(t:String, body:Seq[ToHtml]) = "\n<"+t+">\n"+mapToHtml(body)+"\n"+t+">\n"
+ def tag_(t:String, body:Seq[ToHtml]) = "<"+t+">"+mapToHtml(body)+""+t+">"
+
+ def link(ref:String, body:Seq[ToHtml]) : String = {
+ val img = "style='vertical-align: text-bottom;' border=0 "
+ val icon = if (ref.endsWith(".pdf")) " "
+ else if (ref.startsWith("mailto:")) " "
+ else ""
+ return ""+icon+mapToHtml(body)+""
+ }
+
+ private def pre_(c:Char) : String =
+ c match {
+ case ' ' => " "
+ case '\n' => "
\n"
+ case a => htmlEscapeChar(a)
+ }
+
+ def pre(x:String) : String =
+ "\n