X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fmatita%2FmatitaMathView.ml;h=d07f31b55f5647806c493d63645067558a933c93;hb=6fbeff97e37927fd95b3aee3eb23b4309fc465c4;hp=10b7470a5b463f93661fd40f8a9331be1780e424;hpb=27fb9381ae7c71e9055f3f95f03175a023d7256f;p=helm.git diff --git a/helm/software/matita/matitaMathView.ml b/helm/software/matita/matitaMathView.ml index 10b7470a5..d07f31b55 100644 --- a/helm/software/matita/matitaMathView.ml +++ b/helm/software/matita/matitaMathView.ml @@ -252,7 +252,7 @@ object (self) match self#get_term_by_id cic_info id with | SelTerm (t, father_hyp) -> let sequent = self#sequent_of_id ~paste_kind:`Pattern id in - let text = self#string_of_cic_sequent sequent in + let text = self#string_of_cic_sequent ~output_type:`Pattern sequent in (match father_hyp with | None -> None, [], Some text | Some hyp_name -> None, [ hyp_name, text ], None) @@ -264,7 +264,7 @@ object (self) match self#get_term_by_id cic_info id with | SelTerm (t, father_hyp) -> let sequent = self#sequent_of_id ~paste_kind:`Term id in - let text = self#string_of_cic_sequent sequent in + let text = self#string_of_cic_sequent ~output_type:`Term sequent in text | SelHyp (hyp_name, _ctxt) -> hyp_name @@ -288,14 +288,13 @@ object (self) reductions_menu_item#set_submenu reductions; tactics_menu_item#set_submenu tactics; let normalize = add_menu_item ~menu:reductions ~label:"Normalize" () in - let reduce = add_menu_item ~menu:reductions ~label:"Reduce" () in let simplify = add_menu_item ~menu:reductions ~label:"Simplify" () in let whd = add_menu_item ~menu:reductions ~label:"Weak head" () in menu#append (GMenu.separator_item ()); let copy = add_menu_item ~stock:`COPY () in let gui = get_gui () in List.iter (fun item -> item#misc#set_sensitive gui#canCopy) - [ copy; check; normalize; reduce; simplify; whd ]; + [ copy; check; normalize; simplify; whd ]; let reduction_action kind () = let pat = self#tactic_text_pattern_of_selection in let statement = @@ -303,13 +302,14 @@ object (self) "\n" ^ GrafiteAstPp.pp_executable ~term_pp:(fun s -> s) ~lazy_term_pp:(fun _ -> assert false) ~obj_pp:(fun _ -> assert false) - (GrafiteAst.Tactical (loc, - GrafiteAst.Tactic (loc, GrafiteAst.Reduce (loc, kind, pat)), - Some (GrafiteAst.Semicolon loc))) in + ~map_unicode_to_tex:(Helm_registry.get_bool + "matita.paste_unicode_as_tex") + (GrafiteAst.Tactic (loc, + Some (GrafiteAst.Reduce (loc, kind, pat)), + GrafiteAst.Semicolon loc)) in (MatitaScript.current ())#advance ~statement () in connect_menu_item copy gui#copy; connect_menu_item normalize (reduction_action `Normalize); - connect_menu_item reduce (reduction_action `Reduce); connect_menu_item simplify (reduction_action `Simpl); connect_menu_item whd (reduction_action `Whd); menu#popup ~button:right_button ~time @@ -434,41 +434,37 @@ object (self) let tactic_text_pattern = self#tactic_text_pattern_of_node node in GrafiteAstPp.pp_tactic_pattern ~term_pp:(fun s -> s) ~lazy_term_pp:(fun _ -> assert false) + ~map_unicode_to_tex:(Helm_registry.get_bool + "matita.paste_unicode_as_tex") tactic_text_pattern | `Term -> self#tactic_text_of_node node else string_of_dom_node node - method private string_of_cic_sequent cic_sequent = + method private string_of_cic_sequent ~output_type cic_sequent = let script = MatitaScript.current () in let metasenv = if script#onGoingProof () then script#proofMetasenv else [] in - (* - let _, (acic_sequent, _, _, ids_to_inner_sorts, _) = - Cic2acic.asequent_of_sequent metasenv cic_sequent in - let _, _, _, annterm = acic_sequent in - let ast, ids_to_uris = - TermAcicContent.ast_of_acic ids_to_inner_sorts annterm in - let pped_ast = TermContentPres.pp_ast ast in - let markup = CicNotationPres.render ids_to_uris pped_ast in - BoxPp.render_to_string text_width markup - *) - ApplyTransformation.txt_of_cic_sequent_conclusion - text_width metasenv cic_sequent - - method private pattern_of term context unsh_sequent = - let context_len = List.length context in + let map_unicode_to_tex = + Helm_registry.get_bool "matita.paste_unicode_as_tex" in + ApplyTransformation.txt_of_cic_sequent_conclusion ~map_unicode_to_tex + ~output_type text_width metasenv cic_sequent + + method private pattern_of term father_hyp unsh_sequent = let _, unsh_context, conclusion = unsh_sequent in - try - (match - List.nth unsh_context (List.length unsh_context - context_len - 1) - with - | None -> assert false (* can't select a restricted hypothesis *) - | Some (name, Cic.Decl ty) -> - ProofEngineHelpers.pattern_of ~term:ty [term] - | Some (name, Cic.Def (bo, _)) -> - ProofEngineHelpers.pattern_of ~term:bo [term]) - with Failure _ | Invalid_argument _ -> - ProofEngineHelpers.pattern_of ~term:conclusion [term] + let where = + match father_hyp with + None -> conclusion + | Some name -> + let rec aux = + function + [] -> assert false + | Some (Cic.Name name', Cic.Decl ty)::_ when name' = name -> ty + | Some (Cic.Name name', Cic.Def (bo,_))::_ when name' = name-> bo + | _::tl -> aux tl + in + aux unsh_context + in + ProofEngineHelpers.pattern_of ~term:where [term] method private get_cic_info id = match self#cic_info with @@ -482,14 +478,17 @@ object (self) let cic_info, unsh_sequent = self#get_cic_info id in let cic_sequent = match self#get_term_by_id cic_info id with - | SelTerm (t, _father_hyp) -> + | SelTerm (t, father_hyp) -> +(* +IDIOTA: PRIMA SI FA LA LOCATE, POI LA PATTERN_OF. MEGLIO UN'UNICA pattern_of CHE PRENDA IN INPUT UN TERMINE E UN SEQUENTE. PER IL MOMENTO RISOLVO USANDO LA father_hyp PER RITROVARE L'IPOTESI PERDUTA +*) let occurrences = ProofEngineHelpers.locate_in_conjecture t unsh_sequent in (match occurrences with | [ context, _t ] -> (match paste_kind with | `Term -> ~-1, context, t - | `Pattern -> ~-1, [], self#pattern_of t context unsh_sequent) + | `Pattern -> ~-1, [], self#pattern_of t father_hyp unsh_sequent) | _ -> HLog.error (sprintf "found %d occurrences while 1 was expected" (List.length occurrences)); @@ -550,7 +549,8 @@ object (self) ids_to_terms, ids_to_hypotheses, ids_to_father_ids, Hashtbl.create 1, None)); if BuildTimeConf.debug then begin - let name = "sequent_viewer.xml" in + let name = + "/tmp/sequent_viewer_" ^ string_of_int (Unix.getuid ()) ^ ".xml" in HLog.debug ("load_sequent: dumping MathML to ./" ^ name); ignore (domImpl#saveDocumentToFile ~name ~doc:mathml ()) end; @@ -572,7 +572,8 @@ object (self) self#thaw | _ -> if BuildTimeConf.debug then begin - let name = "cic_browser.xml" in + let name = + "/tmp/cic_browser_" ^ string_of_int (Unix.getuid ()) ^ ".xml" in HLog.debug ("cic_browser: dumping MathML to ./" ^ name); ignore (domImpl#saveDocumentToFile ~name ~doc:mathml ()) end; @@ -617,11 +618,11 @@ class sequentsViewer ~(notebook:GPack.notebook) ~(cicMathView:cicMathView) () = method load_logo = notebook#set_show_tabs false; - notebook#append_page logo + ignore(notebook#append_page logo) method load_logo_with_qed = notebook#set_show_tabs false; - notebook#append_page logo_with_qed + ignore(notebook#append_page logo_with_qed) method reset = cicMathView#remove_selections; @@ -646,7 +647,9 @@ class sequentsViewer ~(notebook:GPack.notebook) ~(cicMathView:cicMathView) () = _metasenv <- []; self#script#setGoal None - method load_sequents { proof = (_,metasenv,_,_) as proof; stack = stack } = + method load_sequents + { proof = (_,metasenv,_subst,_,_, _) as proof; stack = stack } + = _metasenv <- metasenv; pages <- 0; let win goal_switch = @@ -693,7 +696,8 @@ class sequentsViewer ~(notebook:GPack.notebook) ~(cicMathView:cicMathView) () = let add_tab markup goal_switch = let goal = Stack.goal_of_switch goal_switch in if not (List.mem goal !added_goals) then begin - notebook#append_page ~tab_label:(tab_label markup) (win goal_switch); + ignore(notebook#append_page + ~tab_label:(tab_label markup) (win goal_switch)); page2goal <- (!page, goal_switch) :: page2goal; goal2page <- (goal_switch, !page) :: goal2page; incr page; @@ -787,14 +791,17 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) "^cic:/([^/]+/)*[^/]+\\.(con|ind|var)(#xpointer\\(\\d+(/\\d+)+\\))?$" in let dir_RE = Pcre.regexp "^cic:((/([^/]+/)*[^/]+(/)?)|/|)$" in + let metadata_RE = Pcre.regexp "^metadata:/(deps)/(forward|backward)/(.*)$" in let whelp_query_RE = Pcre.regexp "^\\s*whelp\\s+([^\\s]+)\\s+(\"|\\()(.*)(\\)|\")$" in + let is_metadata txt = Pcre.pmatch ~rex:metadata_RE txt in let is_whelp txt = Pcre.pmatch ~rex:whelp_RE txt in let is_uri txt = Pcre.pmatch ~rex:uri_RE txt in let is_dir txt = Pcre.pmatch ~rex:dir_RE txt in let gui = get_gui () in let (win: MatitaGuiTypes.browserWin) = gui#newBrowserWin () in + let gviz = LablGraphviz.graphviz ~packing:win#graphScrolledWin#add () in let queries = ["Locate";"Hint";"Match";"Elim";"Instance"] in let combo,_ = GEdit.combo_box_text ~strings:queries () in let activate_combo_query input q = @@ -807,6 +814,29 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) win#queryInputText#set_text input; combo#set_active (aux 0 queries); in + let searchText = + GSourceView.source_view ~auto_indent:false ~editable:false () + in + let _ = + win#scrolledwinContent#add (searchText :> GObj.widget); + let callback () = + let text = win#entrySearch#text in + let highlight start end_ = + searchText#source_buffer#move_mark `INSERT ~where:start; + searchText#source_buffer#move_mark `SEL_BOUND ~where:end_; + searchText#scroll_mark_onscreen `INSERT + in + let iter = searchText#source_buffer#get_iter `SEL_BOUND in + match iter#forward_search text with + | None -> + (match searchText#source_buffer#start_iter#forward_search text with + | None -> () + | Some (start,end_) -> highlight start end_) + | Some (start,end_) -> highlight start end_ + in + ignore(win#entrySearch#connect#activate ~callback); + ignore(win#buttonSearch#connect#clicked ~callback); + in let set_whelp_query txt = let query, arg = try @@ -839,22 +869,27 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) let load_easter_egg = lazy ( win#browserImage#set_file (MatitaMisc.image_path "meegg.png")) in - let load_coerchgraph () = + let load_coerchgraph tred () = let str = CoercGraph.generate_dot_file () in - let filename, oc = Filename.open_temp_file "xx" ".dot" in + let filename, oc = Filename.open_temp_file "matita" ".dot" in output_string oc str; close_out oc; - let ps = Filename.temp_file "yy" ".png" in - ignore (Unix.system ("/usr/bin/dot -Tpng -o" ^ ps ^ " " ^ filename)); - Sys.remove filename; - at_exit (fun _ -> Sys.remove ps); - win#browserImage#set_file ps + if tred then + gviz#load_graph_from_file ~gviz_cmd:"tred|dot" filename + else + gviz#load_graph_from_file filename; + HExtlib.safe_remove filename in object (self) inherit scriptAccessor (* Whelp bar queries *) + val mutable gviz_graph = MetadataDeps.DepGraph.dummy + val mutable gviz_uri = UriManager.uri_of_string "cic:/dummy.con"; + + val dep_contextual_menu = GMenu.menu () + initializer activate_combo_query "" "locate"; win#whelpBarComboVbox#add combo#coerce; @@ -878,8 +913,8 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) win#mathOrListNotebook#set_show_tabs false; win#browserForwardButton#misc#set_sensitive false; win#browserBackButton#misc#set_sensitive false; - ignore (win#browserUri#entry#connect#activate (handle_error' (fun () -> - self#loadInput win#browserUri#entry#text))); + ignore (win#browserUri#connect#activate (handle_error' (fun () -> + self#loadInput win#browserUri#text))); ignore (win#browserHomeButton#connect#clicked (handle_error' (fun () -> self#load (`About `Current_proof)))); ignore (win#browserRefreshButton#connect#clicked @@ -890,10 +925,6 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) ignore (win#toplevel#event#connect#delete (fun _ -> let my_id = Oo.id self in cicBrowsers := List.filter (fun b -> Oo.id b <> my_id) !cicBrowsers; - if !cicBrowsers = [] && - Helm_registry.get "matita.mode" = "cicbrowser" - then - GMain.quit (); false)); ignore(win#whelpResultTreeview#connect#row_activated ~callback:(fun _ _ -> @@ -901,13 +932,77 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) mathView#set_href_callback (Some (fun uri -> handle_error (fun () -> self#load (`Uri (UriManager.uri_of_string uri))))); + gviz#connect_href (fun button_ev attrs -> + let time = GdkEvent.Button.time button_ev in + let uri = List.assoc "href" attrs in + gviz_uri <- UriManager.uri_of_string uri; + match GdkEvent.Button.button button_ev with + | button when button = left_button -> self#load (`Uri gviz_uri) + | button when button = right_button -> + dep_contextual_menu#popup ~button ~time + | _ -> ()); + connect_menu_item win#depGraphMenuItem (fun () -> + match self#currentCicUri with + | Some uri -> self#load (`Metadata (`Deps (`Fwd, uri))) + | None -> ()); + connect_menu_item win#invDepGraphMenuItem (fun () -> + match self#currentCicUri with + | Some uri -> self#load (`Metadata (`Deps (`Back, uri))) + | None -> ()); + connect_menu_item win#browserCloseMenuItem (fun () -> + let my_id = Oo.id self in + cicBrowsers := List.filter (fun b -> Oo.id b <> my_id) !cicBrowsers; + win#toplevel#misc#hide(); win#toplevel#destroy ()); + (* remove hbugs *) + (* + connect_menu_item win#hBugsTutorsMenuItem (fun () -> + self#load (`HBugs `Tutors)); + *) + win#hBugsTutorsMenuItem#misc#hide (); + connect_menu_item win#browserUrlMenuItem (fun () -> + win#browserUri#misc#grab_focus ()); + connect_menu_item win#univMenuItem (fun () -> + match self#currentCicUri with + | Some uri -> self#load (`Univs uri) + | None -> ()); + + (* fill dep graph contextual menu *) + let go_menu_item = + GMenu.image_menu_item ~label:"Browse it" + ~packing:dep_contextual_menu#append () in + let expand_menu_item = + GMenu.image_menu_item ~label:"Expand" + ~packing:dep_contextual_menu#append () in + let collapse_menu_item = + GMenu.image_menu_item ~label:"Collapse" + ~packing:dep_contextual_menu#append () in + dep_contextual_menu#append (go_menu_item :> GMenu.menu_item); + dep_contextual_menu#append (expand_menu_item :> GMenu.menu_item); + dep_contextual_menu#append (collapse_menu_item :> GMenu.menu_item); + connect_menu_item go_menu_item (fun () -> self#load (`Uri gviz_uri)); + connect_menu_item expand_menu_item (fun () -> + MetadataDeps.DepGraph.expand gviz_uri gviz_graph; + self#redraw_gviz ~center_on:gviz_uri ()); + connect_menu_item collapse_menu_item (fun () -> + MetadataDeps.DepGraph.collapse gviz_uri gviz_graph; + self#redraw_gviz ~center_on:gviz_uri ()); + self#_load (`About `Blank); toplevel#show () val mutable current_entry = `About `Blank + (** @return None if no object uri can be built from the current entry *) + method private currentCicUri = + match current_entry with + | `Uri uri + | `Metadata (`Deps (_, uri)) -> Some uri + | _ -> None + val model = new MatitaGtkMisc.taggedStringListModel tags win#whelpResultTreeview + val model_univs = + new MatitaGtkMisc.multiStringListModel ~cols:2 win#universesTreeview val mutable lastDir = "" (* last loaded "directory" *) @@ -947,8 +1042,12 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) * * Use only these functions to switch between the tabs *) - method private _showMath = win#mathOrListNotebook#goto_page 0 - method private _showList = win#mathOrListNotebook#goto_page 1 + method private _showMath = win#mathOrListNotebook#goto_page 0 + method private _showList = win#mathOrListNotebook#goto_page 1 + method private _showList2 = win#mathOrListNotebook#goto_page 5 + method private _showSearch = win#mathOrListNotebook#goto_page 6 + method private _showGviz = win#mathOrListNotebook#goto_page 3 + method private _showHBugs = win#mathOrListNotebook#goto_page 4 method private back () = try @@ -965,17 +1064,24 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) method private _load ?(force=false) entry = handle_error (fun () -> if entry <> current_entry || entry = `About `Current_proof || entry = - `About `Coercions || force then + `About `Coercions || entry = `About `CoercionsFull || force then begin (match entry with | `About `Current_proof -> self#home () | `About `Blank -> self#blank () | `About `Us -> self#egg () - | `About `Coercions -> self#coerchgraph () + | `About `CoercionsFull -> self#coerchgraph false () + | `About `Coercions -> self#coerchgraph true () + | `About `TeX -> self#tex () + | `About `Grammar -> self#grammar () | `Check term -> self#_loadCheck term | `Cic (term, metasenv) -> self#_loadTermCic term metasenv | `Dir dir -> self#_loadDir dir + | `HBugs `Tutors -> self#_loadHBugsTutors + | `Metadata (`Deps ((`Fwd | `Back) as dir, uri)) -> + self#dependencies dir uri () | `Uri uri -> self#_loadUriManagerUri uri + | `Univs uri -> self#_loadUnivs uri | `Whelp (query, results) -> set_whelp_query query; self#_loadList (List.map (fun r -> "obj", @@ -995,20 +1101,64 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) win#mathOrListNotebook#goto_page 2; Lazy.force load_easter_egg - method private coerchgraph () = - win#mathOrListNotebook#goto_page 2; - load_coerchgraph () + method private redraw_gviz ?center_on () = + let tmpfile, oc = Filename.open_temp_file "matita" ".dot" in + let fmt = Format.formatter_of_out_channel oc in + MetadataDeps.DepGraph.render fmt gviz_graph; + close_out oc; + gviz#load_graph_from_file ~gviz_cmd:"tred | dot" tmpfile; + (match center_on with + | None -> () + | Some uri -> gviz#center_on_href (UriManager.string_of_uri uri)) +(* HExtlib.safe_remove tmpfile *) + + method private dependencies direction uri () = + let dbd = LibraryDb.instance () in + let graph = + match direction with + | `Fwd -> MetadataDeps.DepGraph.direct_deps ~dbd uri + | `Back -> MetadataDeps.DepGraph.inverse_deps ~dbd uri in + gviz_graph <- graph; (** XXX check this for memory consuption *) + self#redraw_gviz ~center_on:uri (); + self#_showGviz + + method private coerchgraph tred () = + load_coerchgraph tred (); + self#_showGviz + + method private tex () = + let text = String.concat "\n" + (List.map (fun (k,vs) -> + let vs = + List.sort (fun a b -> String.length a - String.length b) vs + in + let vs = + if List.length vs < 4 then vs else + let vs, _ = HExtlib.split_nth 4 vs in vs + in + k ^ "\t" ^ String.concat ", " vs) + (Utf8Macro.pp_table ())) + in + self#_loadText text + + method private _loadText text = + searchText#source_buffer#set_text text; + win#entrySearch#misc#grab_focus (); + self#_showSearch + + method private grammar () = + self#_loadText (Print_grammar.ebnf_of_term ()); method private home () = self#_showMath; match self#script#grafite_status.proof_status with - | Proof (uri, metasenv, bo, ty) -> + | Proof (uri, metasenv, _subst, bo, ty, attrs) -> let name = UriManager.name_of_uri (HExtlib.unopt uri) in - let obj = Cic.CurrentProof (name, metasenv, bo, ty, [], []) in + let obj = Cic.CurrentProof (name, metasenv, Lazy.force bo, ty, [], attrs) in self#_loadObj obj - | Incomplete_proof { proof = (uri, metasenv, bo, ty) } -> + | Incomplete_proof { proof = (uri, metasenv, _subst, bo, ty, attrs) } -> let name = UriManager.name_of_uri (HExtlib.unopt uri) in - let obj = Cic.CurrentProof (name, metasenv, bo, ty, [], []) in + let obj = Cic.CurrentProof (name, metasenv, Lazy.force bo, ty, [], attrs) in self#_loadObj obj | _ -> self#blank () @@ -1018,9 +1168,21 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) let uri = UriManager.strip_xpointer uri in let (obj, _) = CicEnvironment.get_obj CicUniv.empty_ugraph uri in self#_loadObj obj + + method private _loadUnivs uri = + let uri = UriManager.strip_xpointer uri in + let (_, u) = CicEnvironment.get_obj CicUniv.empty_ugraph uri in + let _,us = CicUniv.do_rank u in + let l = + List.map + (fun u -> + [ CicUniv.string_of_universe u ; string_of_int (CicUniv.get_rank u)]) + us + in + self#_loadList2 l method private _loadDir dir = - let content = Http_getter.ls dir in + let content = Http_getter.ls ~local:false dir in let l = List.fast_sort Pervasives.compare @@ -1033,8 +1195,11 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) lastDir <- dir; self#_loadList l + method private _loadHBugsTutors = + self#_showHBugs + method private setEntry entry = - win#browserUri#entry#set_text (MatitaTypes.string_of_entry entry); + win#browserUri#set_text (MatitaTypes.string_of_entry entry); current_entry <- entry method private _loadObj obj = @@ -1055,6 +1220,11 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) model#list_store#clear (); List.iter (fun (tag, s) -> model#easy_append ~tag s) l; self#_showList + + method private _loadList2 l = + model_univs#list_store#clear (); + List.iter model_univs#easy_mappend l; + self#_showList2 (** { public methods, all must call _load!! } *) @@ -1063,19 +1233,32 @@ class cicBrowser_impl ~(history:MatitaTypes.mathViewer_entry MatitaMisc.history) (** this is what the browser does when you enter a string an hit enter *) method loadInput txt = + let parse_metadata s = + let subs = Pcre.extract ~rex:metadata_RE s in + let uri = UriManager.uri_of_string ("cic:/" ^ subs.(3)) in + match subs.(1), subs.(2) with + | "deps", "forward" -> `Deps (`Fwd, uri) + | "deps", "backward" -> `Deps (`Back, uri) + | _ -> assert false + in let txt = HExtlib.trim_blanks txt in + (* (* ZACK: what the heck? *) let fix_uri txt = UriManager.string_of_uri (UriManager.strip_xpointer (UriManager.uri_of_string txt)) in + *) if is_whelp txt then begin set_whelp_query txt; (MatitaScript.current ())#advance ~statement:(txt ^ ".") () end else begin let entry = match txt with - | txt when is_uri txt -> `Uri (UriManager.uri_of_string (fix_uri txt)) + | txt when is_uri txt -> + `Uri (UriManager.uri_of_string ((*fix_uri*) txt)) | txt when is_dir txt -> `Dir (MatitaMisc.normalize_dir txt) + | txt when is_metadata txt -> `Metadata (parse_metadata txt) + | "hbugs:/tutors/" -> `HBugs `Tutors | txt -> (try MatitaTypes.entry_of_string txt