1:- module( spuds_docs, [ spuds_docs/0,
2 all_sources_visible/1,
3 load_user_file/1,
4 spuds_report/1
5 ] ). 6
7:- use_module( library(pldoc/doc_library) ). 8
9:- multifile( prolog:doc_directory/1 ). 10:- dynamic( prolog:doc_directory/1 ). 11
12:- dynamic( spuds_debug/1 ). 14
17spuds_report( What ) :-
18 debugging( spuds ),
19 !,
20 open( '/tmp/repo.txt', append, Out ),
21 write( Out, What ), nl( Out ),
22 close( Out ).
23spuds_report( _What ).
24
25load_verbosity( Silent ) :- 26 debugging( spuds ),
27 !,
28 Silent = false.
29load_verbosity( true ).
39all_sources_visible( true ) :-
40 !,
41 retractall( prolog:doc_directory(_) ),
42 assert( prolog:doc_directory(_) ).
43all_sources_visible( false ) :-
44 retractall( prolog:doc_directory(_) ).
45
46spuds_docs :-
47 48 49 spuds_report( starting_spuds_docs ),
50 private_docs,
51 spuds_report( done_private ),
52 system_docs, 53 spuds_report( done_system ),
54 packs_docs,
55 spuds_report( done_packs ).
56 57
58load_user_file( DcsF ) :-
59 spuds_report( testing_user_file(DcsF) ),
60 exists_file( DcsF ),
61 spuds_report( file_exists(DcsF) ),
62 !,
63 consult( DcsF ).
64load_user_file( File ) :-
65 print_message( informational, spuds(no_priv_file(File)) ).
66
67private_docs :-
68 private_docs_files,
69 private_docs_dirs,
70 private_docs_warn.
71
72private_docs_files :-
73 current_predicate( user:prolog_source_file/1 ),
74 prolog_source_file(File),
75 docs_for_file( File, xref ),
76 fail.
77private_docs_files.
78
79private_docs_dirs :-
80 os_sub_does_not_load,
81 !,
82 spuds_report( os_sub_does_not_load ).
83private_docs_dirs :-
84 85 Mod = spuds_docs,
86 spuds_report( mod_for_dirs(Mod) ),
87 current_predicate( Mod:prolog_source_directory/1 ),
88 spuds_report( defined_in(Mod) ),
89 Mod:prolog_source_directory( Dir ),
90 spuds_report( doing_dir(Dir) ),
91 docs_for_dir( Dir, xref, [] ),
92 fail.
93private_docs_dirs :-
94 current_predicate( user:prolog_source_directory/2 ),
95 prolog_source_directory( Dir, SubOpts ),
96 docs_for_dir( Dir, xref, SubOpts ),
97 fail.
98private_docs_dirs.
99
100packs_docs :-
101 absolute_file_name( swi(pack), PackDir ),
102 directory_files( PackDir, Files ),
103 assert( real:r_started(true) ),
104 105 106 spuds_report( pack_dirs(Files) ),
107 maplist( pack_subs_docs(PackDir), Files ).
108
109pack_subs_docs( Dir, OsObj ) :-
110 directory_file_path( Dir, OsObj, Path ),
111 exists_directory( Path ),
112 directory_file_path( Path, prolog, PackPlDir ),
113 exists_directory( PackPlDir ),
114 directory_files( PackPlDir, PackFiles ),
115 spuds_report( pack_files(PackFiles) ),
116 maplist( pack_files_docs(PackPlDir), PackFiles ),
117 !.
118pack_subs_docs( _, _ ).
119
120pack_files_docs( _Dir, File ) :-
121 122 has_prolog_extension( File, Stem ),
123 spuds_report( pack_doc_file(File) ),
124 docs_for_file( library(Stem), use_module ),
125 !.
126pack_files_docs( _Dir, _File ).
127
128docs_for_dir( Dir, Meth, OptsIn ) :-
129 working_directory( Old, Dir ),
130 ( is_list(OptsIn) -> Opts = OptsIn; Opts = [OptsIn] ),
131 ForFiles = [return(files)|Opts],
132 spuds_report( os_sub(Dir) ),
133 os_sub( '.', os(Subs), ForFiles ),
134 spuds_report( subs(Subs) ),
135 include( docs_for_file_if_prolog(Meth,Dir), Subs, _Xrefs ),
136 working_directory( _, Old ).
137
138docs_for_file_if_prolog( _Meth, Dir, File ) :-
139 directory_file_path( Dir, File, AbsFile ),
140 current_predicate( spuds_docs:file_is_blocked_prolog_source/1 ),
141 spuds_docs:file_is_blocked_prolog_source( AbsFile ),
142 !. 143docs_for_file_if_prolog( Meth, Dir, File ) :-
144 directory_file_path( Dir, File, AbsFile ),
145 is_prolog_file( AbsFile ),
146 docs_for_file( AbsFile, Meth ).
147
148is_prolog_file( File ) :-
149 file_name_extension( _, pl, File ).
150is_prolog_file( File ) :-
151 current_predicate( file_is_prolog_source/1 ),
152 file_is_prolog_source( File ).
153
154docs_for_file( File ) :-
155 docs_for_file( File, xref ).
156
157docs_for_file( LibIndex, _Method ) :-
158 atomic( LibIndex ),
159 directory_file_path( _, 'LibIndex.pl', LibIndex ),
160 !.
161 162docs_for_file( File, Method ) :-
163 spuds_report( for_file(File) ),
164 165 166 assert( swi_doc_seen(File) ),
167 168 spuds_report( method_file(Method,File) ),
169 docs_for_file_by_method( Method, File ).
170 171 172
173docs_for_file_by_method( xref, Abs ) :-
174 open( Abs, read, In ), read( In, First ), close( In ),
175 spuds_report( of_first(Abs,First) ),
176 load_verbosity( Silent ),
177 spuds_report( l_verbo(Silent) ),
178 ( First=(:- module(_,_)) ->
179 180 spuds_report( load_files(Abs,[silent(Silent)]) ),
181 load_files( Abs, [silent(Silent)] )
182 ;
183 Opts = [comments(store),silent(Silent)],
184 spuds_report( xref_source(Abs,Opts) ),
185 ( catch( xref_source(Abs,Opts), _, fail ) ->
186 true
187 ;
188 spuds_report( file_failure(Abs) )
189 )
190 ),
191 spuds_report( done_xrefed(Abs) ).
192docs_for_file_by_method( use_module, Abs ) :-
193 spuds_report( abs(Abs) ),
194 catch( use_module(Abs), _, true ).
195 196
211system_docs :-
212 213 214 true.
215
216os_sub_does_not_load :-
217 catch( load_files(library(os_sub),[silent(true)]), _, fail ),
218 225 !,
226 fail.
227os_sub_does_not_load :-
228 print_message( warning, spuds(os_sub_not_present) ).
229
230private_docs_warn :-
231 \+ current_predicate( user:prolog_source_file/1 ),
232 \+ current_predicate( user:prolog_source_directory/1 ),
233 \+ current_predicate( user:prolog_source_directory/2 ),
234 print_message( informational, spuds(no_priv_docs) ),
235 !.
236private_docs_warn. 237
238has_prolog_extension( File, Stem ) :-
239 file_name_extension( Stem, pl, File ),
240 !.
241has_prolog_extension( File, Stem ) :-
242 file_name_extension( Stem, prolog, File ),
243 !.
244has_prolog_extension( File, Stem ) :-
245 file_name_extension( Stem, yap, File ).
246
247:- multifile prolog:message/3. 248
249prolog:message( spuds(no_priv_docs) ) -->
250 [ 'Found no private predicates to publish.', nl,
251 'Define prolog_source_file/1 and/or prolog_source_directory/1,2,', nl,
252 'if you wish to add some.' ].
253
254prolog:message( spuds(no_priv_file(File)) ) -->
255 [ 'Found no file with user preferences.' - [], nl,
256 'Create one at ~w if you wish to do so.' - [File] ].
257
258prolog:message( spuds(os_sub_not_present) ) -->
259 [ 'To load documentation via prolog_source_directory/1 we need library(os_sub).',
260 nl,
261 'It can be installed via ?- pack_install(os_sub).'
262 ]