1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/src/Tools/WWW_Find/mime.ML Fri Nov 20 18:36:44 2009 +1100
1.3 @@ -0,0 +1,56 @@
1.4 +(* Title: mime_types.ML
1.5 + Author: Timothy Bourke, NICTA
1.6 +
1.7 +Rudimentary support for mime_types.
1.8 +*)
1.9 +
1.10 +signature MIME =
1.11 +sig
1.12 + datatype t = Type of {
1.13 + main : string,
1.14 + sub : string,
1.15 + params : (string * string) list
1.16 + }
1.17 +
1.18 + val plain : t
1.19 + val html : t
1.20 +
1.21 + val parse_type : string -> t option
1.22 + val show_type : t -> string
1.23 +end;
1.24 +
1.25 +structure Mime: MIME =
1.26 +struct
1.27 +
1.28 +datatype t = Type of {
1.29 + main : string,
1.30 + sub : string,
1.31 + params : (string * string) list
1.32 + };
1.33 +
1.34 +val strip =
1.35 + Substring.dropl Char.isSpace
1.36 + #> Substring.dropr Char.isSpace;
1.37 +
1.38 +val split_fields =
1.39 + Substring.splitl (fn c => c <> #"=")
1.40 + #> apsnd (Substring.triml 1)
1.41 + #> pairself (Substring.string o strip);
1.42 +
1.43 +fun show_param (n, v) = concat ["; ", n, "=", v];
1.44 +
1.45 +fun show_type (Type {main, sub, params}) =
1.46 + concat ([main, "/", sub] @ map show_param params);
1.47 +
1.48 +fun parse_type s =
1.49 + (case Substring.fields (Char.contains "/;") (Substring.full s) of
1.50 + t::s::ps => SOME (Type { main = (Substring.string o strip) t,
1.51 + sub = (Substring.string o strip) s,
1.52 + params = map split_fields ps })
1.53 + | _ => NONE);
1.54 +
1.55 +val plain = the (parse_type "text/plain; charset=utf-8");
1.56 +val html = the (parse_type "text/html; charset=utf-8");
1.57 +
1.58 +end;
1.59 +