1 (* Copyright (C) 2000, HELM Team.
3 * This file is part of HELM, an Hypertextual, Electronic
4 * Library of Mathematics, developed at the Computer Science
5 * Department, University of Bologna, Italy.
7 * HELM is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * HELM is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with HELM; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22 * For details, see the HELM World-Wide-Web page,
23 * http://cs.unibo.it/helm/.
26 exception IllFormedXml of int;;
28 (* Utility functions that transform a Pxp attribute into something useful *)
30 let string_of_attr a =
31 let module T = Pxp_types in
34 | _ -> raise (IllFormedXml 0)
37 exception DontKnowWhatToDo;;
39 let rec string_of_annotations n =
40 let module D = Pxp_document in
41 let module T = Pxp_types in
42 match n#node_type with
47 match n#attribute att with
48 T.Value s -> " " ^ att ^ "=\"" ^ s ^ "\"" ^ i
49 | T.Implied_value -> i
50 | T.Valuelist l -> " " ^ att ^ "=\"" ^ String.concat " " l ^ "\"" ^ i
51 ) (n#attribute_names) "" ^
52 (match n#sub_nodes with
56 String.concat "" (List.map string_of_annotations l) ^
60 | _ -> raise DontKnowWhatToDo
63 let get_annotation_from_node n =
64 String.concat "" (List.map string_of_annotations (n#sub_nodes))
67 exception MoreThanOneAnnotationFor of Cic.id;;
69 let set_annotation ids_to_annotations id ann =
71 ignore (Hashtbl.find ids_to_annotations id) ;
72 raise (MoreThanOneAnnotationFor id)
74 Not_found -> Hashtbl.add ids_to_annotations id ann
77 let get_annotations n =
78 let module D = Pxp_document in
80 let ids_to_annotations = Hashtbl.create 503 in
82 let ntype = n # node_type in
84 D.T_element "Annotation" ->
85 let of_uri = string_of_attr (n # attribute "of") in
86 set_annotation ids_to_annotations of_uri (get_annotation_from_node n)
87 | D.T_element _ | D.T_data ->
88 raise (IllFormedXml 1)
89 | _ -> raise DontKnowWhatToDo
91 match n # node_type with
92 D.T_element "Annotations" ->
93 List.iter annotate_elem (n # sub_nodes) ;
95 | _ -> raise (IllFormedXml 2)