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( _ ).
 lib_mkindex(Repo, Opts)
Make

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

author
- nicos angelopoulos
version
- 0.1 2017/3/2

*/

   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 )