35
36:- module(www_browser,
37 [ www_open_url/1, 38 expand_url_path/2 39 ]). 40:- autoload(library(lists),[member/2]). 41
42:- if(exists_source(library(process))). 43:- autoload(library(process), [process_create/3]). 44:- endif. 45:- if(exists_source(library(desktop))). 46:- autoload(library(desktop), [desktop_open/2]). 47:- endif. 48
49:- multifile
50 known_browser/2.
84www_open_url(Spec) :- 85 expand_url_path(Spec, URL),
86 open_url(URL).
87
88open_url(URL) :-
89 current_prolog_flag(browser, Browser),
90 expand_browser_flag(Browser, Command, Mode),
91 has_command(Command),
92 !,
93 run_command(Command, [URL], Mode).
94:- if(current_predicate(desktop_open/2)). 95open_url(URL) :- 96 catch(desktop_open(URL, []), error(_,_), fail),
97 !.
98:- endif. 99:- if(current_predicate(win_shell/2)). 100open_url(URL) :- 101 win_shell(open, URL), 102 !.
103:- endif. 104open_url(URL) :- 105 getenv('BROWSER', Browser),
106 has_command(Browser),
107 !,
108 run_browser(Browser, URL).
109open_url(URL) :- 110 known_browser(Browser, _),
111 has_command(Browser),
112 !,
113 run_browser(Browser, URL).
114
115expand_browser_flag(Command-Mode, Command, Mode) :- !.
116expand_browser_flag(Command, Command, bg) :- atomic(Command).
122run_browser(Browser, URL) :-
123 run_command(Browser, [URL], bg).
130:- if(current_predicate(process_create/3)). 131run_command(Command, Args, fg) :-
132 !,
133 process_create(path(Command), Args, [stderr(null)]).
134:- endif. 135:- if(current_prolog_flag(unix, true)). 136run_command(Command, [Arg], fg) :-
137 format(string(Cmd), "\"~w\" \"~w\" &> /dev/null", [Command, Arg]),
138 shell(Cmd).
139run_command(Command, [Arg], bg) :-
140 format(string(Cmd), "\"~w\" \"~w\" &> /dev/null &", [Command, Arg]),
141 shell(Cmd).
142:- else. 143run_command(Command, [Arg], fg) :-
144 format(string(Cmd), "\"~w\" \"~w\"", [Command, Arg]),
145 shell(Cmd).
146run_command(Command, [Arg], bg) :-
147 format(string(Cmd), "\"~w\" \"~w\" &", [Command, Arg]),
148 shell(Cmd).
149:- endif.
156known_browser(firefox, netscape).
157known_browser(mozilla, netscape).
158known_browser(netscape, netscape).
159known_browser(konqueror, -).
160known_browser(opera, -).
168:- dynamic
169 command_cache/2. 170:- volatile
171 command_cache/2. 172
173has_command(Command) :-
174 command_cache(Command, Path),
175 !,
176 Path \== (-).
177has_command(Command) :-
178 ( getenv('PATH', Path),
179 ( current_prolog_flag(windows, true)
180 -> Sep = (;)
181 ; Sep = (:)
182 ),
183 atomic_list_concat(Parts, Sep, Path),
184 member(Part, Parts),
185 prolog_to_os_filename(PlPart, Part),
186 atomic_list_concat([PlPart, Command], /, Exe),
187 access_file(Exe, execute)
188 -> assert(command_cache(Command, Exe))
189 ; assert(command_cache(Command, -)),
190 fail
191 ).
192
193
194
203:- multifile
204 user:url_path/2. 205
206user:url_path(swipl, 'http://www.swi-prolog.org').
207user:url_path(swipl_book, 'http://books.google.nl/books/about/\c
208 SWI_Prolog_Reference_Manual_6_2_2.html?\c
209 id=q6R3Q3B-VC4C&redir_esc=y').
210
211user:url_path(swipl_faq, swipl('FAQ')).
212user:url_path(swipl_man, swipl('pldoc/doc_for?object=manual')).
213user:url_path(swipl_mail, swipl('Mailinglist.html')).
214user:url_path(swipl_download, swipl('Download.html')).
215user:url_path(swipl_pack, swipl('pack/list')).
216user:url_path(swipl_bugs, swipl('bug.html')).
217user:url_path(swipl_quick, swipl('man/quickstart.html')).
227expand_url_path(URL, URL) :-
228 atomic(URL),
229 !. 230expand_url_path(Spec, URL) :-
231 Spec =.. [Path, Local],
232 ( user:url_path(Path, Spec2)
233 -> expand_url_path(Spec2, URL0),
234 ( Local == '.'
235 -> URL = URL0
236 ; sub_atom(Local, 0, _, _, #)
237 -> atom_concat(URL0, Local, URL)
238 ; sub_atom(URL0, 0, _, _, /)
239 -> absolute_file_name(Local, URL, [relative_to(URL0)])
240 ; atomic_list_concat([URL0, Local], /, URL)
241 )
242 ; throw(error(existence_error(url_path, Path), expand_url_path/2))
243 )
Open a URL in the users browser
This library deals with the highly platform specific task of opening a web page. In addition, is provides a mechanism similar to absolute_file_name/3 that expands compound terms to concrete URLs. For example, the SWI-Prolog home page can be opened using: