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 ).   13% :- spuds_debug(true).
   14
   15% see in server/spuds_daemon.pl on how to start debugging the server.
   16% we should use levels....
   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 ) :- % added that post-hoc. cann't remember what it should be...
   26	debugging( spuds ),
   27	!, 
   28	Silent = false.
   29load_verbosity( true ).
 all_sources_visible(+Bool)
A coarse way to turn on (Bool=true) or off (Bool=false) the displaying of source code for each predicate. Beware, calling this with true will make all sources visible. The default for the Linux server is set totrue.
   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	% current_prolog_flag( verbose_load, Verb ),
   48	% set_prolog_flag( verbose_load, silent ),
   49	spuds_report( starting_spuds_docs ),
   50	private_docs,
   51	spuds_report( done_private ),
   52	system_docs, % after privates, that check for os_sub
   53	spuds_report( done_system ),
   54	packs_docs,
   55	spuds_report( done_packs ).
   56	% set_prolog_flag( verbose_load, Verb ).
   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	% member( Mod, [user,spuds_docs] ),
   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	% select( os, Files, NonOsFiles ),
  105	% maplist( pack_subs_docs(PackDir), [os|NonOsFiles] ).
  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	% directory_file_path( Dir, File, Path ),
  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	!.  % forget you saw this file
  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	% Maybe we should add docs_for_required
  162docs_for_file( File, Method ) :-
  163	spuds_report( for_file(File) ),
  164	% absolute_file_name( File, Abs ),
  165	% assert( swi_doc_seen(Abs) ),
  166	assert( swi_doc_seen(File) ),
  167	% docs_for_file_by_method( Method, Abs ).
  168	spuds_report( method_file(Method,File) ),
  169	docs_for_file_by_method( Method, File ).
  170			% fixme: remove silent(true) to see all warnings  
  171			% fixme: or/and add setting
  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		% catch( use_module(Abs,[]), _, true )
  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	% catch( use_module(Abs,[]), _, true ).
  196
  197/*  docserver does this nowdays ...?
  198system_docs :-
  199	current_predicate( blocked_sys_library/1 ),
  200	!,
  201	findall( Blc1, (   pldoc_library:blocked(SlBlc1),
  202	                   atom_concat('/',Blc1,SlBlc1) ),
  203				        Blc1s ),
  204	findall( Blc2, blocked_sys_library(Blc2), Blc2s ),
  205	append( Blc1s, Blc2s, Blcs ),
  206	partition( has_prolog_extension, Blcs, BlcFs, BlcDs ),
  207	Opts = [blocked_dirs(BlcDs),blocked_files(BlcFs)],
  208	absolute_file_name( swi(library), Dir, [file_type(directory)] ),
  209	docs_for_dir( Dir, use_module, Opts ).
  210	*/
  211system_docs :-
  212	% catch( doc_load_library, _, true ).
  213	% doc_load_library.
  214	true.
  215
  216os_sub_does_not_load :-
  217	catch( load_files(library(os_sub),[silent(true)]), _, fail ),
  218	/*
  219	( catch( load_files([library(os_sub)],[silent(true)]), _, fail ) -> true
  220		; file_search_path(swi, Swi),
  221	       atomic_list_concat( [Swi,pack,os_sub,prolog,os_sub], '/', OsSub ),
  222		  catch( use_module(OsSub), _, fail )
  223	),
  224	*/
  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.  % be quite otherwise
  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	]