X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Ftree%2Fnaive.ml;h=ee93863a21bed37792dcf79c7fca6f7cc393f7af;hb=7aa6c5c4e2b329bbf5fa7cc31a7542ba48ace84f;hp=37683f34e34852b69584c63226095602f0ae2902;hpb=a3d6ecbcea379fa51785848a5b8b53bca4e4bdd2;p=tatoo.git diff --git a/src/tree/naive.ml b/src/tree/naive.ml index 37683f3..ee93863 100644 --- a/src/tree/naive.ml +++ b/src/tree/naive.ml @@ -14,7 +14,7 @@ (***********************************************************************) (* - Time-stamp: + Time-stamp: *) 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 @@ -123,19 +123,12 @@ 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_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 = @@ -226,16 +219,19 @@ let output_escape_string out s = | c -> output_char out c done -let rec print_attributes out tree_ node = - if node != nil then begin - let ntag = QName.to_string node.tag in - output_char out ' '; +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 @@ -246,13 +242,7 @@ let rec print_xml out tree_ node = 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 + let fchild = print_attributes out tree_ node.first_child in if fchild == nil then output_string out "/>" else begin output_char out '>'; @@ -264,6 +254,12 @@ let rec print_xml out tree_ node = 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 @@ -272,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