module A = Arg module F = Filename module L = List module O = Options module TP = TextParser module TL = TextLexer module TU = TextUnparser module P1 = Pass1 module P2 = Pass2 module P3 = Pass3 module M = Matrix module XU = XmlUnparser let help = "Usage: xhtbl [ -LX | -O | -d0 | -d1 | -d2 | -e1 | -e2 | -p0 | -p1 | -p2 | ]*" let help_L = " Output lexer tokens" let help_O = " Set this output directory" let help_X = " Clear all options" let help_b = " Set this base uri for relative links" let help_d0 = " Output table contents after phase zero (parsing)" let help_d1 = " Output table contents after phase one (sizing)" let help_d2 = " Output table contents after phase two (filling)" let help_e1 = " Disabled" let help_e2 = " Output debug information during phase two (filling)" let help_p0 = " Process until phase zero (parsing)" let help_p1 = " Process until phase one (sizing)" let help_p2 = " Process until phase two (filling)" let hook = "xhtbl" let includes, tables = ref [], ref [] let process_directive och bname (name, table, css, uri, ext) = tables := name :: !tables; if !O.d0 then TU.debug table; if not !O.p0 then begin let size = P1.process table in if !O.d1 then TU.debug table; if not !O.p1 then begin let matrix = M.make size in let _ = P2.process table matrix in if !O.d2 then TU.debug table; if not !O.p2 then P3.process css uri ext matrix; let name = if name = "" then bname else name in XU.output och name matrix end end let process_file fname = let bname = F.chop_extension (F.basename fname) in if List.mem bname !includes then () else begin let ich = open_in fname in let lexbuf = Lexing.from_channel ich in let ns, ds = TP.script TL.token lexbuf in close_in ich; includes := bname :: !includes; let ns = ("", "http://www.w3.org/1999/xhtml") :: ns in let och = XU.open_out bname ns in L.iter (process_directive och bname) ds; XU.close_out och end let main () = A.parse [ "-L", A.Set O.debug_lexer, help_L; "-O", A.String ((:=) O.output_dir), help_O; "-X", A.Unit O.clear, help_X; "-b", A.String ((:=) O.baseuri), help_b; "-d0", A.Set O.d0, help_d0; "-d1", A.Set O.d1, help_d1; "-d2", A.Set O.d2, help_d2; "-e1", A.Set O.e1, help_e1; "-e2", A.Set O.e2, help_e2; "-p0", A.Set O.p0, help_p0; "-p1", A.Set O.p1, help_p1; "-p2", A.Set O.p2, help_p2; ] process_file help; XU.write_hook hook !includes !tables let _ = main ()