]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/DEVEL/pxp/pxp/compatibility/markup_document.ml
Initial revision
[helm.git] / helm / DEVEL / pxp / pxp / compatibility / markup_document.ml
diff --git a/helm/DEVEL/pxp/pxp/compatibility/markup_document.ml b/helm/DEVEL/pxp/pxp/compatibility/markup_document.ml
new file mode 100644 (file)
index 0000000..bbc4979
--- /dev/null
@@ -0,0 +1,374 @@
+(* $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.
+ *
+ *)
+