module Text =
struct
- type t (* pointer to the text collection *)
+
(* Todo *)
external nullt : unit -> [`Text ] node = "caml_xml_tree_nullt"
let nil = nullt ()
external tag : t -> [`Tree ] node -> Tag.t = "caml_xml_tree_tag"
external tag_id : t -> [`Tree ] node -> unit = "caml_xml_tree_tag_id"
- external text_collection : t -> Text.t = "caml_xml_tree_text_collection"
-
let is_last t n = equal nil (next_sibling t n)
external prev_text : t -> [`Tree] node -> [`Text ] node = "caml_xml_tree_prev_text"
external is_ancestor : t -> [`Tree ] node -> [`Tree ] node -> bool = "caml_xml_tree_is_ancestor"
let print_skel t =
- let textcol = text_collection t in
let rec aux id =
if (is_nil id)
then Printf.eprintf "#\n"
(Tag.to_string (tag t id))
(node_xml_id t id)
(int_of_node (prev_text t id))
- (Text.get_text textcol (prev_text t id))
+ (Text.get_text t (prev_text t id))
(int_of_node (my_text t id))
- (Text.get_text textcol (my_text t id))
+ (Text.get_text t (my_text t id))
(int_of_node (next_text t id))
- (Text.get_text textcol (next_text t id));
+ (Text.get_text t (next_text t id));
aux(first_child t id);
aux(next_sibling t id);
end
aux (root t)
let traversal t =
- let textcol = text_collection t in
let rec aux id =
if not (is_nil id)
then
begin
(* ignore (tag t id);
- ignore (Text.get_text textcol (prev_text t id));
+ ignore (Text.get_text t (prev_text t id));
if (is_leaf t id)
- then ignore (Text.get_text textcol (my_text t id));
+ then ignore (Text.get_text t (my_text t id));
if (is_last t id)
- then ignore (Text.get_text textcol (next_text t id)); *)
+ then ignore (Text.get_text t (next_text t id)); *)
aux (first_child t id);
aux (next_sibling t id);
end
type doc = t
- type t = { doc : doc;
- text : Text.t;
+ type t = { doc : doc;
node : descr }
let dump { doc=t } = Tree.print_skel t
open Tree
let node_of_t t = { doc= t;
- text = text_collection t;
node = Node(NC (root t)) }
let equal a b = (compare a b) == 0
let string t = match t.node with
- | String i -> Text.get_text t.text i
+ | String i -> Text.get_text t.doc i
| _ -> assert false
let norm (n : [`Tree ] node ) = if is_nil n then Nil else Node (NC n)
match n.node with
| Node (NC t) when is_leaf n.doc t ->
let txt = my_text n.doc t in
- if Text.is_empty n.text txt
+ if Text.is_empty n.doc txt
then Nil
else Node(SC (txt,Tree.nil))
| Node (NC t) ->
let fs = first_child n.doc t in
let txt = prev_text n.doc fs in
- if Text.is_empty n.text txt
+ if Text.is_empty n.doc txt
then norm fs
else Node (SC (txt, fs))
| Node(SC (i,_)) -> String i
| Node(NC t) ->
let ns = next_sibling n.doc t in
let txt = next_text n.doc t in
- if Text.is_empty n.text txt
+ if Text.is_empty n.doc txt
then norm ns
else Node (SC (txt, ns))
| Nil | String _ -> failwith "next_sibling"
| _ -> false
let contains t s =
- Array.fold_left (fun a i -> DocIdSet.add i a) DocIdSet.empty (Text.contains t.text s)
+ Array.fold_left (fun a i -> DocIdSet.add i a) DocIdSet.empty (Text.contains t.doc s)
let contains_old t s =
let regexp = Str.regexp_string s in
let rec aux n =
match n.node with
| Nil -> ()
- | String i -> () (*ignore(Text.get_text t.text i) *)
+ | String i -> () (*ignore(Text.get_text t.doc i) *)
| Node(_) ->
(* tag_id n; *)
aux (first_child n);
match n.node with
| Node (NC t) when is_leaf_ n.doc t ->
let txt = my_text_ n.doc t in
- if is_empty_ n.text txt
+ if is_empty_ n.doc txt
then Nil
else Node(SC (txt,XML.Tree.nil))
| Node (NC t) ->
let fs = first_child_ n.doc t in
let txt = prev_text_ n.doc fs in
- if is_empty_ n.text txt
+ if is_empty_ n.doc txt
then norm fs
else Node (SC (txt, fs))
| Node(SC (i,_)) -> String i
| Node (SC (_,ns)) -> norm ns
| Node(NC t) ->
let ns = next_sibling_ n.doc t in
- let txt = next_text_ n.doc t in
- if is_empty_ n.text txt
+ let txt =
+ if XML.Tree.is_nil ns then
+ next_text_ n.doc t
+ else prev_text_ n.doc ns
+ in
+ if is_empty_ n.doc txt
then norm ns
else Node (SC (txt, ns))
| Nil | String _ -> failwith "next_sibling"
| { doc=d; node=Node(SC (i,_) )} -> text_xml_id_ d i
| _ -> failwith "id"
-
(* Wrapper around critical function *)
let string t = time ("TextCollection.GetText()") (string) t
let left = first_child
end
module Binary = DEBUGTREE
-