--- /dev/null
+type css = string list
+
+type uri = string
+
+type ext = string
+
+type anchor = string
+
+type absolute = bool
+
+type size = {
+ y : int; (* first row *)
+ x : int; (* first column *)
+ rf: int; (* finite rows *)
+ cf: int; (* finite columns *)
+ ri: int; (* infinite rows *)
+ ci: int; (* infinite columns *)
+ p : bool option; (* parent kind *)
+}
+
+type border = {
+ n: bool; (* north *)
+ s: bool; (* south *)
+ e: bool; (* east *)
+ w: bool; (* west *)
+}
+
+type text = Plain of string
+ | Link of absolute * string * string
+
+type key = Text of text list
+ | Glue of int option
+
+type table = {
+ tn: anchor; (* named anchor *)
+ mutable tc: css; (* css classes *)
+ mutable tu: uri; (* uri *)
+ mutable tx: ext; (* uri extension *)
+ mutable ts: size; (* dimension *)
+ tb: border; (* border *)
+ te: entry; (* contents *)
+ ti: int; (* table identifier *)
+}
+
+and entry = Key of key
+ | Line of bool * table list (* true for a row *)
+
+let id =
+ let current = ref 0 in
+ fun () -> incr current; !current
+
+let no_size = {
+ y = 0; x = 0; rf = 0; cf = 0; ri = 0; ci = 0; p = None;
+}
+
+let border b = {
+ n = b; s = b; e = b; w = b;
+}
+
+let mk_key k tc tu tx tn = {
+ ts = no_size; tb = border false; te = Key k;
+ tc = tc; tu = tu; tx = tx; tn = tn;
+ ti = id ();
+}
+
+let mk_line b tl tc tu tx tn = {
+ ts = no_size; tb = border b; te = Line (b, tl);
+ tc = tc; tu = tu; tx = tx; tn = tn;
+ ti = id ();
+}