(* $Id$ * ---------------------------------------------------------------------- *) type node_type = T_element of string | T_data class type [ 'node ] extension = [ 'node ] Pxp_document.extension class type [ 'ext, 'node ] pxp_extension_type = object ('self) method clone : 'self method node : 'self Pxp_document.node method set_node : 'self Pxp_document.node -> unit method markup_node : 'node method set_markup_node : 'node -> unit method set_index : 'self Pxp_yacc.index -> unit method index : 'self Pxp_yacc.index end ;; class type [ 'ext ] node = object ('self) constraint 'ext = 'ext node #extension method pxp_node : (('ext, 'ext node) pxp_extension_type) Pxp_document.node method extension : 'ext method delete : unit method parent : 'ext node method root : 'ext node method orphaned_clone : 'ext node method orphaned_flat_clone : 'ext node method add_node : 'ext node -> unit method add_pinstr : Markup_dtd.proc_instruction -> unit method pinstr : string -> Markup_dtd.proc_instruction list method pinstr_names : string list method sub_nodes : 'ext node list method iter_nodes : ('ext node -> unit) -> unit method iter_nodes_sibl : ('ext node option -> 'ext node -> 'ext node option -> unit) -> unit method set_nodes : 'ext node list -> unit method data : string method node_type : node_type method attribute : string -> Markup_types.att_value method attribute_names : string list method attribute_type : string -> Markup_types.att_type method attributes : (string * Markup_types.att_value) list method required_string_attribute : string -> string method required_list_attribute : string -> string list method optional_string_attribute : string -> string option method optional_list_attribute : string -> string list method quick_set_attributes : (string * Markup_types.att_value) list -> unit method find : string -> 'ext node method reset_finder : unit method dtd : Markup_dtd.dtd method create_element : Markup_dtd.dtd -> node_type -> (string * string) list -> 'ext node method create_data : Markup_dtd.dtd -> string -> 'ext node method local_validate : unit method keep_always_whitespace_mode : unit method write_compact_as_latin1 : Markup_types.output_stream -> unit method internal_adopt : 'ext node option -> unit method internal_delete : 'ext node -> unit method internal_init : Markup_dtd.dtd -> string -> (string * string) list -> unit end ;; class [ 'ext ] pxp_extension init_markup_node = (object (self : 'self) (* constraint 'ext = 'ext node #extension *) val mutable pxp_node = (None : 'self Pxp_document.node option) (* 'ext pxp_extension Pxp_document.node option *) val mutable markup_node = (init_markup_node : 'ext node) val mutable index = (None : 'self Pxp_yacc.index option) method clone = {< >} method node = match pxp_node with None -> assert false | Some n -> n method set_node n = pxp_node <- Some n method markup_node = markup_node method set_markup_node n = markup_node <- n method set_index ix = index <- Some ix method index = match index with None -> assert false | Some x -> x end : ['ext, 'ext node] pxp_extension_type ) ;; class [ 'ext ] emulate_markup_node init_ext init_pxp_node = object (self) constraint 'ext = 'ext node #extension val mutable pxp_node = (init_pxp_node : ('ext, 'ext #node) pxp_extension_type Pxp_document.node option) val mutable extension = (init_ext : 'ext) method pxp_node = match pxp_node with None -> assert false | Some n -> n method extension = extension method delete = self # pxp_node # delete method parent = self # pxp_node # parent # extension # markup_node method root = self # pxp_node # root # extension # markup_node method orphaned_clone = let ext' = extension # clone in let pxp' = self # pxp_node # orphaned_clone in let n = new emulate_markup_node ext' (Some pxp') in ext' # set_node (n : 'ext #node :> 'ext node); pxp' # extension # set_markup_node n; n method orphaned_flat_clone = let ext' = extension # clone in let pxp' = self # pxp_node # orphaned_flat_clone in let n = new emulate_markup_node ext' (Some pxp') in ext' # set_node (n : 'ext #node :> 'ext node); pxp' # extension # set_markup_node n; n method dtd = self # pxp_node # dtd method add_node (n : 'ext node) = let n_pxp = n # pxp_node in self # pxp_node # add_node n_pxp method add_pinstr pi = self # pxp_node # add_pinstr pi method sub_nodes = let l = self # pxp_node # sub_nodes in List.map (fun n_pxp -> n_pxp # extension # markup_node) l method pinstr name = self # pxp_node # pinstr name method pinstr_names = self # pxp_node # pinstr_names method iter_nodes f = self # pxp_node # iter_nodes (fun n_pxp -> f (n_pxp # extension # markup_node)) method iter_nodes_sibl f = self # pxp_node # iter_nodes_sibl (fun left_pxp node_pxp right_pxp -> let left = match left_pxp with None -> None | Some n_pxp -> Some (n_pxp # extension # markup_node) in let right = match right_pxp with None -> None | Some n_pxp -> Some (n_pxp # extension # markup_node) in let node = node_pxp # extension # markup_node in f left node right ) method set_nodes (l : 'ext node list) = let l_pxp = List.map (fun n -> n # pxp_node) l in self # pxp_node # set_nodes l_pxp method data = self # pxp_node # data method node_type = match self # pxp_node # node_type with Pxp_document.T_data -> T_data | Pxp_document.T_element name -> T_element name | Pxp_document.T_super_root -> T_element "-vr" | Pxp_document.T_pinstr _ -> T_element "-pi" | _ -> assert false method attribute name = self # pxp_node # attribute name method attribute_names = self # pxp_node # attribute_names method attribute_type name = self # pxp_node # attribute_type name method attributes = self # pxp_node # attributes method required_string_attribute name = self # pxp_node # required_string_attribute name method required_list_attribute name = self # pxp_node # required_list_attribute name method optional_string_attribute name = self # pxp_node # optional_string_attribute name method optional_list_attribute name = self # pxp_node # optional_list_attribute name method quick_set_attributes l = self # pxp_node # quick_set_attributes l method find (name : string) = let index = self # root # pxp_node # extension # index in let n = index # find name in (* may raise Not_found *) n # extension # markup_node method reset_finder = () method create_element dtd nt atts = let nt_pxp = match nt with T_data -> Pxp_document.T_data | T_element name -> Pxp_document.T_element name in let node_pxp = self # pxp_node # create_element dtd nt_pxp atts in let ext' = extension # clone in let n = new emulate_markup_node ext' (Some node_pxp) in ext' # set_node (n : 'ext #node :> 'ext node); node_pxp # extension # set_markup_node n; n method create_data dtd s = let node_pxp = self # pxp_node # create_data dtd s in let ext' = extension # clone in let n = new emulate_markup_node ext' (Some node_pxp) in ext' # set_node (n : 'ext #node :> 'ext node); node_pxp # extension # set_markup_node n; n method keep_always_whitespace_mode = self # pxp_node # keep_always_whitespace_mode method write_compact_as_latin1 out = self # pxp_node # write_compact_as_latin1 out method local_validate = self # pxp_node # local_validate() method internal_adopt (p:'ext node option) = assert false; () method internal_delete (n:'ext node) = assert false; () method internal_init (d:Markup_dtd.dtd) (s:string) (atts:(string*string)list) = assert false; () end ;; class [ 'ext ] data_impl ext data = object (self) inherit [ 'ext ] emulate_markup_node ext None constraint 'ext = 'ext node #extension initializer if data <> "" then failwith "Emulation of Markup_document: Cannot instantiate data node with non-empty string"; let self' = (self : 'ext #node :> 'ext node ) in pxp_node <- Some (new Pxp_document.data_impl (new pxp_extension self')) end ;; class [ 'ext ] element_impl ext = object (self) inherit [ 'ext ] emulate_markup_node ext None initializer let self' = (self : 'ext #node :> 'ext node ) in pxp_node <- Some (new Pxp_document.element_impl (new pxp_extension self')) end ;; class [ 'ext ] document w = object (self) val pxp_doc = new Pxp_document.document (w : Markup_types.collect_warnings :> Pxp_types.collect_warnings) val mutable standalone_flag = false method init_xml_version v = pxp_doc # init_xml_version v method xml_version = pxp_doc # xml_version method init_xml_standalone b = standalone_flag <- b method xml_standalone = standalone_flag method init_root (r : 'ext node) = pxp_doc # init_root (r # pxp_node); self # dtd # set_standalone_declaration standalone_flag (* questionable *) method root = let pxp_root = pxp_doc # root in pxp_root # extension # markup_node method dtd = pxp_doc # dtd method add_pinstr pi = pxp_doc # add_pinstr pi method pinstr name = pxp_doc # pinstr name method pinstr_names = pxp_doc # pinstr_names method write_compact_as_latin1 out = pxp_doc # write_compact_as_latin1 out end ;; (* ====================================================================== * History: * * $Log$ * Revision 1.1 2000/11/17 09:57:30 lpadovan * Initial revision * * Revision 1.6 2000/08/18 20:19:00 gerd * Changed the emulation: there are now wrapper objects for nodes. * This was necessary because node_type changed in PXP such that it became * incompatible with Markup's node_type. * * Revision 1.5 2000/07/14 21:35:35 gerd * Updated because of the simplification of Pxp_types.collect_warnings. * * Revision 1.4 2000/07/08 17:40:50 gerd * Updated the simulation. * * Revision 1.3 2000/06/14 22:19:27 gerd * Update because of additional 'encoding' methods. * * Revision 1.2 2000/05/30 00:08:40 gerd * Bugfix. * * Revision 1.1 2000/05/29 23:43:51 gerd * Initial compatibility revision. * *)