X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Fhtml.ml;h=f5aa8b21ff5d5e6cbded32a1cf92e06bd89940d3;hp=b35f17d1cc32e59cef0f01861d4f79a7a8daf712;hb=fee64144491afab22d71f6e2de72a9f18f35cd55;hpb=35abea737ead2d4fd121d0cb8bdbda38cfcaa8d3 diff --git a/src/html.ml b/src/html.ml index b35f17d..f5aa8b2 100644 --- a/src/html.ml +++ b/src/html.ml @@ -36,15 +36,21 @@ let finalize_node n r b = Hashtbl.replace final n (b,r) module K = struct - type t = int * StateSet.t * StateSet.t - let hash (a,b,c) = HASHINT3(a, (b.StateSet.id :> int), (c.StateSet.id :> int)) - let equal ((a1,b1,c1) as x) ((a2,b2,c2) as y) = - x == y || (a1 == a2 && b1 == b2 && c1 == c2) + type t = StateSet.t list + let hash l = + List.fold_left (fun acc set -> + HASHINT2(acc, (set.StateSet.id :> int))) 17 l + + let equal l1 l2 = + try + List.for_all2 (==) l1 l2 + with _ -> false end module CTable = Hashtbl.Make (K) let ctable = CTable.create 20 + let rgb x = let h = K.hash x in let r = h land 0xff @@ -52,7 +58,8 @@ let rgb x = and b = (h lsr 16) land 0xff in r, g, b -let color ((a,b,c) as x) = + +let color x = try CTable.find ctable x with @@ -64,41 +71,31 @@ let color ((a,b,c) as x) = in CTable.add ctable x s; s + let text_color x = let r,g,b = rgb x in let av = (r + g + b) / 3 in if av > 128 then "rgb(0,0,0)" else "rgb(255,255,255)" +let get_conf sel l i = + List.fold_left (fun (accb,accl) a -> + accb || StateSet.intersect a.(i) sel, + a.(i) :: accl) (false,[]) l -let gen_trace (type s) = fun auto t tree -> +let gen_trace (type s) = fun auto sat_arrays t tree -> let module T = (val (t) : Tree.S with type t = s) in let root = T.root tree in - let rec loop osvg ohtml node parent x y = + let sel = Ata.get_selecting_states auto in + let rec loop output node parent x y = if node != T.nil then begin - let m = - try - Hashtbl.find info (T.preorder tree node) - with Not_found -> M.empty - in let node_id = T.preorder tree node in - let marked, last_round = try Hashtbl.find final node_id with Not_found -> - Printf.eprintf ">>> %i\n%!" node_id; false, !max_round; - in - let scolor, tcolor = - let { sat ; todo; _ } = - match M.find last_round m with - [] -> { sat = StateSet.empty; todo= StateSet.empty; msg = "ERROR" } - | [ e ] -> e - | l -> List.hd (List.tl (List.rev l)) - in - let c = (last_round, StateSet.union sat todo, StateSet.empty) in - color c, text_color c - in + let marked, conf = get_conf sel sat_arrays node_id in + let scolor, tcolor = color conf, text_color conf in let tag = QName.to_string (T.tag tree node) in let lbox = (String.length tag + 2) * 10 in let s_node = "node" ^ (string_of_int node_id) in - fprintf osvg + fprintf output "\n%!" s_node @@ -109,75 +106,96 @@ let gen_trace (type s) = fun auto t tree -> (if marked then ";stroke-width:4" else ";stroke-width:2;stroke-dasharray:2,2"); - fprintf osvg "%s\n" (x+10) (y+15) tcolor s_node tag; - fprintf ohtml "data['%s'] = new Array();\n" s_node; - M.iter - (fun i l -> - let msg = String.concat "" (List.rev_map (fun x -> x.msg) l) in - fprintf ohtml "data['%s'][%i] = '%s';\n" s_node i msg) - m; let first = T.first_child tree node in - let maxw1, maxy1 = loop osvg ohtml first node x (y + 40) in + let maxw1, maxy1 = loop output first node x (y + 40) in let next = T.next_sibling tree node in let x_next = max (x+lbox) (maxw1+10) in if node != root then begin if node == T.first_child tree parent then - fprintf osvg "\n" (x + lbox / 2) (y-20) (x + lbox / 2) (y); if next != T.nil then - fprintf osvg "\n" (x + lbox) (y+10) x_next (y+10); end; - let maxw2, maxy2 = loop osvg ohtml next node x_next y in + let maxw2, maxy2 = loop output next node x_next y in maxw2, max maxy1 maxy2 end else x, y in ignore (Sys.command "mkdir -p tests/trace"); - let osvg_ = open_out "tests/trace/trace.svg" in let ohtml_ = open_out "tests/trace/trace.html" in - let osvg = formatter_of_out_channel osvg_ in let ohtml = formatter_of_out_channel ohtml_ in fprintf ohtml "\ -\ \ +\ \ \
%a
-
\ -\n
\n" + fprintf ohtml "\n
\n"; + let maxw, maxh = loop ohtml (T.root tree) T.nil 50 50 in + fprintf ohtml "\n\ +
\n%!" maxw maxh; - let fi = open_in "tests/trace/trace.svg" in - try - while true do - let s = input_line fi in - fprintf ohtml "%s\n" s; - done - with - End_of_file -> - fprintf ohtml "\n
\n%!"; - pp_print_flush ohtml (); - close_out ohtml_; - close_in fi + pp_print_flush ohtml (); + close_out ohtml_