Merge branch 'feature/test-suite'
[tatoo.git] / src / tree / naive.ml
index 1086b1e..ee93863 100644 (file)
@@ -14,7 +14,7 @@
 (***********************************************************************)
 
 (*
-  Time-stamp: <Last modified on 2013-02-07 09:59:37 CET by Kim Nguyen>
+  Time-stamp: <Last modified on 2013-03-09 18:49:04 CET by Kim Nguyen>
 *)
 open Utils
 
@@ -72,7 +72,7 @@ struct
           "NODE " ^  string_of_int n.preorder)
 
   let debug_node fmt node =
-    Format.fprintf fmt "{ tag=%s; preorder=%i; data=%s; first_child=%a; next_sibling=%a; parent=%a }"
+    Format.fprintf fmt "{ tag=%s; preorder=%i; data=%S; first_child=%a; next_sibling=%a; parent=%a }"
       (QName.to_string node.tag)
       node.preorder
       node.data
@@ -108,6 +108,7 @@ struct
   let text_string = QName.to_string QName.text
   let attr_map_string = QName.to_string QName.attribute_map
 
+  let att_pref = QName.node QName.attribute_prefix
   let rec start_element_handler parser_ ctx tag attr_list =
     do_text parser_ ctx;
     let parent = top ctx in
@@ -122,26 +123,19 @@ struct
     if parent.first_child == dummy then parent.first_child <- n
     else parent.next_sibling <- n;
     push n ctx;
-    match attr_list with
-      [] -> ()
-    | _ ->
-      start_element_handler parser_ ctx attr_map_string [];
-      List.iter (do_attribute parser_ ctx) attr_list;
-      end_element_handler parser_ ctx attr_map_string
+    List.iter (do_attribute parser_ ctx) attr_list
 
   and do_attribute parser_ ctx (att, value) =
-    let att_tag = " " ^ att in
+    let att_tag = att_pref ^ att in
     start_element_handler parser_ ctx att_tag [];
-    start_element_handler parser_ ctx text_string [];
     let n = top ctx in n.data <- value;
-    end_element_handler parser_ ctx text_string;
     end_element_handler parser_ ctx att_tag
 
   and consume_closing ctx n =
     if n.next_sibling != dummy then
       let _ = pop ctx in consume_closing ctx (top ctx)
 
-  and end_element_handler parser_ ctx tag =
+  and end_element_handler parser_ ctx _ =
     do_text parser_ ctx;
     let node = top ctx in
     if node.first_child == dummy then node.first_child <- nil
@@ -161,7 +155,7 @@ struct
 
 
 
-  let character_data_handler parser_ ctx text =
+  let character_data_handler _parser ctx text =
     Buffer.add_string ctx.text_buffer text
 
   let create_parser () =
@@ -225,44 +219,47 @@ let output_escape_string out s =
     | c -> output_char out c
   done
 
-let rec print_attributes out tree_ node =
-  if node != nil then begin
-    output_string out (QName.to_string node.tag);
+let rec print_attributes ?(sep=true) out tree_ node =
+  let tag = node.tag in
+  if QName.has_attribute_prefix tag then begin
+    let ntag = QName.node tag in
+    if sep then output_char out ' ';
+    output out ntag 1 (String.length ntag - 1);
     output_string out "=\"";
-    output_escape_string out node.first_child.data;
+    output_escape_string out node.data;
     output_char out '"';
     print_attributes out tree_ node.next_sibling
-  end
+ end
+ else
+  node
 
 let rec print_xml out tree_ node =
   if node != nil then
-    let () =
-      if node.tag == QName.text then
-        output_escape_string out node.data
-      else
-        let tag = QName.to_string node.tag in
-        output_char out '<';
-        output_string out tag;
-        let fchild =
-          if node.first_child.tag == QName.attribute_map then
-            let () =
-              print_attributes out tree_ node.first_child.first_child
-            in
-            node.first_child.next_sibling
-          else
-            node.first_child
-        in
-        if fchild == nil then output_string out "/>"
-        else begin
-          output_char out '>';
-          print_xml out tree_ fchild;
-          output_string out "</";
-          output_string out tag;
-          output_char out '>'
-        end
-    in
-    print_xml out tree_ node.next_sibling
+  let () =
+    if node.tag == QName.text then
+    output_escape_string out node.data
+    else
+    let tag = QName.to_string node.tag in
+    output_char out '<';
+    output_string out tag;
+    let fchild = print_attributes out tree_ node.first_child in
+    if fchild == nil then output_string out "/>"
+    else begin
+      output_char out '>';
+      print_xml out tree_ fchild;
+      output_string out "</";
+      output_string out tag;
+      output_char out '>'
+    end
+  in
+  print_xml out tree_ node.next_sibling
 
+let print_xml out tree_ node =
+  let nnode =  { node with next_sibling = nil } in
+  if QName.has_attribute_prefix nnode.tag then
+    ignore (print_attributes ~sep:false out tree_ nnode)
+  else
+    print_xml out tree_ nnode
 
 let root t = t.root
 let first_child _ n = n.first_child
@@ -271,3 +268,5 @@ let parent _ n = n.parent
 let tag _ n = n.tag
 let data _ n = n.data
 let preorder _ n = n.preorder
+
+let print_node fmt n = Parser.debug_node fmt n