+++ /dev/null
-(* $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.
- *
- *)
-