1:- module( lib_mkindex, [lib_mkindex/2,lib/1,lib/2] ). 2 3:- use_module( library(lib) ). % ??? fixme: 4 5:- dynamic( lib_mkindex_defines:defines/2 ). 6 7% lib( A, _B ) :- lib( A ). 8lib( _A, _B ). 9lib( defines(Pn/Pa) ) :- !, assert( lib_mkindex_defines:defines(Pn,Pa) ). 10lib(SysLib) :- atomic(SysLib), lib:lib_loading_context( Cxt ), catch(ensure_loaded(Cxt:library(SysLib)),_,true). 11% lib(_). 12% lib_suggests( _ ). 13% lib_init( _ ).
Opts (can be unlistted singleton
load(Load=true)
set to false to stop loading of the main file (
homonyms(Hnms=false)
set to true to only index homonyms
29lib_mkindex( Repo, ArgS) :- 30 ( is_list(ArgS) -> ArgS = Args; Args = [ArgS] ), 31 % en_list( ArgS, Args ), 32 % Defs = [homonyms(false),load(false)], 33 Defs = [homonyms(false),load(true)], 34 append( Args, Defs, Opts ), 35 lib:lib_type( Repo, Type, Mod, Root, Load ), 36 debug( lib, 'Mkindex for: ~w, of type: ~w, mod: ~w, load: ~w, root: ~w', [Repo,Type,Mod,Load,Root] ), 37 lib_mkindex( Type, Repo, Mod, Root, Load, Opts ). 38 % fixme: unload_file ??? 39 40lib_mkindex( lib, Repo, Mod, Root, Load, Opts ) :- 41 Setup = asserta( lib_tables:lib_context(Repo,Root) ), 42 Goal = lib:lib_load_file( Load, Repo, Opts ), 43 Clean = ( once(retract(lib_tables:lib_context(Repo,Root))) ), 44 setup_call_cleanup(Setup, Goal, Clean), 45 memberchk( homonyms(Hmns), Opts ), 46 lib_mkindex_dir( Mod, Hmns, Root, '', Pairs ), 47 directory_file_path( Root, 'LibIndex.pl', LibIndex ), 48 mk_index_portray_clauses( Pairs, file(LibIndex) ), 49 debug( lib, 'Wrote on file: ~w', LibIndex ). 50 51lib_mkindex_dir( Repo, Hmns, Root, Sub, Sort ) :- 52 directory_file_path( Root, Sub, Full ), 53 lib:lib_dir_contents( Full, Files, Dirs ), 54 maplist( lib_mkindex_dir(Repo,Hmns,Full), Dirs, Dest ), 55 maplist( lib_mkindex_file(Repo,Root,Hmns), Files, Fest ), 56 flatten( [Dest,Fest], Pairs ), 57 sort( Pairs, Sort ). 58 59lib_mkindex_file( Repo, Root, Hmns, AbsF, [Sourced,Asserted] ) :- 60 directory_file_path( _TheDir, File, AbsF ), 61 file_name_extension( Stem, pl, File ), 62 Stem \== 'LibIndex', 63 !, 64 % ensure_loaded( Repo:AbsF ), 65 % findall( Pn/Pa-AbsF, () ). 66 % findall( lib_index(Pn,Pa,any,user,AbsF), ) 67 directory_file_path( Root, RelF, AbsF ), 68 file_name_extension( RelS, pl, RelF ), 69 findall( lib_index(Pn,Pa,any,user,RelS), 70 ( 71 source_file(Repo:Head,AbsF), 72 functor(Head,Pn,Pa), 73 lib_mkindex_homonym(Hmns,Stem,Pn) 74 ), 75 Sourced ), 76 findall( lib_index(Pn,Pa,any,user,RelS), 77 lib_mkindex_defines:defines(Pn,Pa) 78 , 79 Asserted ), 80 retractall( lib_mkindex_defines:defines(_,_) ). 81 % unload_file( AbsF ). 82 % fixme: unload_file ??? 83lib_mkindex_file( _Repo, _Root, _Hmns, _File, [] ). 84 85lib_mkindex_homonym( true, Stem, Stem ). 86lib_mkindex_homonym( false, _, _ ). 87 88mk_index_portray_clauses( Pairs, file(LibIndex) ) :- 89 open( LibIndex, write, Out ), 90 maplist( portray_clause(Out), Pairs ), 91 close( Out )