(******************************************************************************) (* *) (* PROJECT HELM *) (* *) (* Claudio Sacerdoti Coen *) (* 28/12/2000 *) (* *) (* This is the parser that reads the configuration file of helm *) (* *) (******************************************************************************) let filename = try Sys.getenv "HELM_STYLECONFIGURATION_PATH" with Not_found -> let tmp_filename = C.tmpdir ^ "/style-configuration.xml" in if Sys.file_exists tmp_filename then tmp_filename else begin let styleconf = Getter.raw_get "getstyleconf" in let out_channel = open_out tmp_filename in output_string out_channel styleconf; close_out out_channel; tmp_filename end exception Warnings;; class warner = object method warn w = print_endline ("WARNING: " ^ w) ; (raise Warnings : unit) end ;; let xml_document () = let module Y = Pxp_yacc in try let config = {Y.default_config with Y.warner = new warner} in Y.parse_document_entity config (Y.from_file filename) Y.default_spec with e -> print_endline (Pxp_types.string_of_exn e) ; raise e ;; exception Impossible;; let styles = Hashtbl.create 13;; let applies = Hashtbl.create 13;; (* we trust the xml file to be valid because of the validating xml parser *) let _ = List.iter (function n -> match n#node_type with Pxp_document.T_element "style" -> let key = try n#attribute "key" with Not_found -> n#data Hashtbl.add styles key n#data | Pxp_document.T_element "apply" -> let keys = List.map (function n -> match n#node_type with Pxp_document.T_element "style-ref" -> n#attribute "key" | _ -> raise Impossible ) n#sub_nodes in Hashtbl.add applies (n#attribute "name") keys | _ -> raise Impossible ) ((xml_document ())#root#sub_nodes) ;; let style_of_key key = Hashtbl.lookup styles key let key_list_of_mode_name name = Hashtbl.lookup applies name