%%-------------------------------------------------------------------- %% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2010. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in %% compliance with the License. You should have received a copy of the %% Erlang Public License along with this software. If not, it can be %% retrieved online at http://www.erlang.org/. %% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and limitations %% under the License. %% %% %CopyrightEnd% %% %%----------------------------------------------------------------- %% File: otp_man_index.erl %% %% Description: %% This file generates the module overview in the documentation. %% %%----------------------------------------------------------------- -module(otp_man_index). -export([gen/1]). -include_lib("kernel/include/file.hrl"). gen([RootDir, OutFile]) when is_atom(RootDir), is_atom(OutFile)-> Bases = [{"../lib/", filename:join(RootDir, "lib")}, {"../", RootDir}], Apps = find_application_paths(Bases), RefPages = find_ref_files(Apps), gen_html(RefPages, atom_to_list(OutFile)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Find Reference files %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% find_ref_files(Apps) -> find_ref_files(Apps, []). find_ref_files([], Acc) -> Acc; find_ref_files([{App, Vsn, AppPath, RelPath} |Apps], Acc) -> case filelib:wildcard(filename:join(AppPath, "*.html")) of [] -> find_ref_files(Apps, Acc); Result -> Refs1 = lists:filter(fun(Ref) -> case file:read_file(Ref) of {ok, Bin} -> case re:run(Bin, ".*.*",[]) of {match, _} -> true; nomatch -> false end; {error, Reason} -> exit(io_lib:format("~p : ~s\n", [Reason, Ref])) end end, Result), Refs2 = lists:map(fun(Ref) -> Module = filename:basename(Ref, ".html"), {string:to_lower(Module), Module, App ++ "-" ++ Vsn, RelPath, filename:join(RelPath, filename:basename(Ref))} end, Refs1), find_ref_files(Apps, Refs2 ++ Acc) end. find_application_paths([]) -> []; find_application_paths([{URL, Dir} | Paths]) -> Sub1 = "doc/html", AppDirs = get_app_dirs(Dir), AppPaths = lists:map( fun({App, AppPath}) -> VsnFile = filename:join(AppPath, "vsn.mk"), VsnStr = case file:read_file(VsnFile) of {ok, Bin} -> case re:run(Bin, ".*VSN\s*=\s*([0-9\.]+).*",[{capture,[1],list}]) of {match, [V]} -> V; nomatch -> exit(io_lib:format("No VSN variable found in ~s\n", [VsnFile])) end; {error, Reason} -> exit(io_lib:format("~p : ~s\n", [Reason, VsnFile])) end, AppURL = URL ++ App ++ "-" ++ VsnStr, {App, VsnStr, AppPath ++ "/" ++ Sub1, AppURL ++ "/" ++ Sub1} end, AppDirs), AppPaths ++ find_application_paths(Paths). get_app_dirs(Dir) -> {ok, Files} = file:list_dir(Dir), AFiles = lists:map(fun(File) -> {File, filename:join([Dir, File])} end, Files), lists:zf(fun is_app_with_doc/1, AFiles). is_app_with_doc({"." ++ ADir, _APath}) -> false; is_app_with_doc({ADir, APath}) -> case file:read_file_info(filename:join([APath, "info"])) of {ok, _FileInfo} -> {true, {ADir, APath}}; _ -> false end. gen_html(RefPages, OutFile)-> case file:open(OutFile, [write]) of {ok, Out} -> io:fwrite(Out, "~s\n", [html_header()]), SortedPages = lists:sort(RefPages), lists:foreach(fun({_,Module, App, AppDocDir, RefPagePath}) -> io:fwrite(Out, "
Manual Page | Application | \n" "
---|