]> matita.cs.unibo.it Git - helm.git/blobdiff - matita/matita/contribs/lambdadelta/bin/xhtbl/textUnparser.ml
update in lambdadelta
[helm.git] / matita / matita / contribs / lambdadelta / bin / xhtbl / textUnparser.ml
diff --git a/matita/matita/contribs/lambdadelta/bin/xhtbl/textUnparser.ml b/matita/matita/contribs/lambdadelta/bin/xhtbl/textUnparser.ml
new file mode 100644 (file)
index 0000000..cf7724c
--- /dev/null
@@ -0,0 +1,101 @@
+module L = List
+module P = Printf
+module S = String
+
+module T = Table
+module F = Fold
+
+type status = {
+   i: int;              (* indentation *)
+   out: string -> unit; (* output function *)
+}
+
+let home = {
+   i = 0; out = print_string
+}
+
+let indent st =
+   S.make st.i ' '
+
+let add st = {st with i = st.i + 3}
+
+let sub st = {st with i = st.i - 3}
+
+let parent = function
+   | None       -> "key"
+   | Some false -> "col"
+   | Some true  -> "row"
+
+let size ts =
+   P.sprintf "(%u, %u); (%u+%u, %u+%u); %s"
+      ts.T.y ts.T.x ts.T.rf ts.T.ri ts.T.cf ts.T.ci (parent ts.T.p)
+
+let border tb =
+   let str = S.make 4 ' ' in
+   if tb.T.w then str.[0] <- 'W';
+   if tb.T.n then str.[1] <- 'N';
+   if tb.T.e then str.[2] <- 'E';
+   if tb.T.s then str.[3] <- 'S';
+   str
+
+let css tc =
+   P.sprintf "\"%s\"" (S.concat " " tc)
+
+let uri tu tx =
+   P.sprintf "@\"%s\" \"%s\"" tu tx
+
+let name tn =
+   P.sprintf "$\"%s\"" tn
+
+
+let text = function
+   | T.Plain s              -> P.sprintf "\"%s\"" s
+   | T.Link (true, uri, s)  -> P.sprintf "@(\"%s\" \"%s\")" uri s
+   | T.Link (false, uri, s) -> P.sprintf "@@(\"%s\" \"%s\")" uri s
+
+let key = function
+   | T.Text sl       -> S.concat " ^ " (L.map text sl)
+   | T.Glue None     -> "*"
+   | T.Glue (Some i) -> P.sprintf "%u" i
+
+let entry = function
+   | false -> "column"
+   | true  -> "row"
+
+(****************************************************************************)
+
+let open_table st t =
+   let str = 
+      P.sprintf "%s[{#%u: %s; %s; %s; %s; %s}\n"    
+         (indent st) t.T.ti (size t.T.ts) (border t.T.tb) (css t.T.tc) (uri t.T.tu t.T.tx) (name t.T.tn)
+   in
+   st.out str; add st
+
+let close_table st t =
+   let st = sub st in
+   let str = P.sprintf "%s]\n" (indent st) in
+   st.out str; st
+
+let map_key st k =
+   let str = P.sprintf "%s%s\n" (indent st) (key k) in
+   st.out str; st
+   
+let open_line b st =
+   let str = P.sprintf "%s%s\n" (indent st) (entry b) in
+   st.out str; st
+
+let close_line b st = st
+
+let open_entry b st = st
+
+let close_entry b st sst = st
+
+let cb = {
+   F.open_table = open_table; F.close_table = close_table;   
+   F.open_line = open_line; F.close_line = close_line;
+   F.open_entry = open_entry; F.close_entry = close_entry;
+   F.map_key = map_key;
+}
+
+let debug t =
+   let _ = F.fold_table cb home t in ()