-module(mad_man). -doc("Generate n2o.dev man pages."). -compile(export_all). man(["html"]) -> Temp = template(), [ generate(filename:basename(I,".erl"),Temp) || I <- filelib:wildcard("*/src/**/*.erl") ++ filelib:wildcard("src/**/*.erl") ], {ok,man}; man(["new",Lower]) -> Temp = template(), Name = string:to_upper(Lower), Tem2 = replace(Temp,"MAN_TOOL",hd(string:tokens(Name,"_"))), CNAME = binary_to_list(element(2,file:read_file("CNAME"))), Tem3 = replace(Tem2,"MAN_CNAME",trim(CNAME)), Bin = iolist_to_binary(replace(Tem3,"MAN_NAME",fix(string:tokens(Name,"_")))), filelib:ensure_dir("man/"), Gen = lists:concat(["man/",Lower,".htm"]), case file:read_file_info(Gen) of {error,_} -> write(Gen, Bin); {ok,_} -> io:format("man: file ~p already exists.~n",[Gen]) end, {ok,man}; man(["groff"]) -> case lists:all(fun(X) -> mad_groff:do(X) == ok end, filelib:wildcard("man/**/*.htm") ++ filelib:wildcard("articles/**/*.htm") ++ filelib:wildcard("**/*.html") ++ filelib:wildcard("**/*.htm") ++ filelib:wildcard("*.html") ++ filelib:wildcard("*.htm")) of true -> {ok,check}; false -> {error,check} end; man(["check"]) -> case lists:all(fun(X) -> element(1,X) == ok end, [ check(I) || I <- filelib:wildcard("*.htm") ++ filelib:wildcard("**/*.html") ++ filelib:wildcard("**/*.htm") ++ filelib:wildcard("*.html") ++ filelib:wildcard("man/**/*.htm") ++ filelib:wildcard("articles/**/*.htm") ]) of true -> {ok,check}; false -> {error,check} end. write(Gen,Bin) -> io:format("Generated: ~p~n",[Gen]), file:write_file(Gen,Bin). replace(S,A,B) -> re:replace(S,A,B,[global,{return,list}]). trim(A) when is_list(A) -> trim(unicode:characters_to_binary(A,utf8)); trim(A) when is_binary(A) -> re:replace(A, "(^\\s+)|(\\s+$)", "", [global,{return,list}]). fix([Prefix]) -> Prefix; fix([_Prefix,Name|_Rest]) -> Name. check(Filename) -> try _ = xmerl_scan:file(Filename), {ok,Filename} catch E:R -> io:format("man: ~p error: ~p~n",[Filename, case R of function_clause -> erlang:get_stacktrace(); _ -> R end]), {error,Filename} end. generate(Lower,Temp) -> Name = string:to_upper(Lower), Tem2 = replace(Temp,"MAN_TOOL",hd(string:tokens(Name,"_"))), CNAME = binary_to_list(element(2,file:read_file("CNAME"))), Tem3 = replace(Tem2,"MAN_CNAME",trim(CNAME)), Bin = iolist_to_binary(replace(Tem3,"MAN_NAME",fix(string:tokens(Name,"_")))), Gen = lists:concat(["man/",Lower,".htm"]), case file:read_file_info(Gen) of {error,_} -> write(Gen, Bin); {ok,_} -> io:format("man: file ~p already exists.~n",[Gen]) % case element(2,A) > size(Bin) of % true -> skip; % false -> write(Gen,Bin) end end. template() -> mad_repl:load(), try lists:flatten( [case string:str(File,"priv/man") of 1 -> Bin; _ -> [] end || {File,Bin} <- ets:tab2list(filesystem), is_list(File)]) catch _:_ -> [] end.