(* Copyright (C) 2000, HELM Team. * * This file is part of HELM, an Hypertextual, Electronic * Library of Mathematics, developed at the Computer Science * Department, University of Bologna, Italy. * * HELM is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * HELM is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HELM; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * * For details, see the HELM World-Wide-Web page, * http://cs.unibo.it/helm/. *) (******************************************************************************) (* *) (* PROJECT HELM *) (* *) (* Claudio Sacerdoti Coen *) (* 24/01/2000 *) (* *) (* This is the main (top level) module of a parser for cic objects from xml *) (* files to the internal representation. It uses the modules cicParser2 *) (* (objects level) and cicParser3 (terms level) *) (* *) (******************************************************************************) exception Getter_failure of string * string exception Parser_failure of string (** tries to recover from a parse error caused by the parsing of a getter * error message (e.g. Key_not_found exception). Unfortunately we have to * re-parse xml document to extract exception data *) let try_recover exn filename = let rc = ref None in (try let entity_manager = Pxp_ev_parser.create_entity_manager ~is_document:true PxpHelmConf.pxp_config (Pxp_types.from_file filename) in let pull_parser = Pxp_ev_parser.create_pull_parser PxpHelmConf.pxp_config (`Entry_document []) entity_manager in let rec find_exn p = match p () with | None -> () | Some (Pxp_types.E_start_tag ("html", attrs, _, _)) -> let exn = List.assoc "helm:exception" attrs in let arg = try List.assoc "helm:exception_arg" attrs with Not_found -> "" in rc := Some (Getter_failure (exn, arg)) | _ -> find_exn p in find_exn pull_parser with _ -> raise (Parser_failure (Printexc.to_string exn))); match !rc with | None -> raise (Parser_failure (Printexc.to_string exn)) | Some exn -> raise exn let parse_document filename = try Pxp_tree_parser.parse_document_entity PxpHelmConf.pxp_config (Pxp_types.from_file ~alt:[PxpUrlResolver.url_resolver] filename) CicParser3.domspec with exn -> raise (try_recover exn filename) (* given the filename of an xml file of a cic object it returns its internal *) (* representation. *) let annobj_of_xml filename filenamebody = let root, rootbody = let doc = parse_document filename in let docroot = doc#root in match filenamebody with None -> docroot,None | Some filename -> let docbody = parse_document filename in docroot,Some docbody#root in CicParser2.get_term root rootbody let obj_of_xml filename filenamebody = Deannotate.deannotate_obj (annobj_of_xml filename filenamebody)