mad_man.erl 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. -module(mad_man).
  2. -doc("Generate n2o.dev man pages.").
  3. -compile(export_all).
  4. man(["html"]) ->
  5. Temp = template(),
  6. [ generate(filename:basename(I,".erl"),Temp)
  7. || I <- filelib:wildcard("*/src/**/*.erl")
  8. ++ filelib:wildcard("src/**/*.erl") ],
  9. {ok,man};
  10. man(["new",Lower]) ->
  11. Temp = template(),
  12. Name = string:to_upper(Lower),
  13. Tem2 = replace(Temp,"MAN_TOOL",hd(string:tokens(Name,"_"))),
  14. CNAME = binary_to_list(element(2,file:read_file("CNAME"))),
  15. Tem3 = replace(Tem2,"MAN_CNAME",trim(CNAME)),
  16. Bin = iolist_to_binary(replace(Tem3,"MAN_NAME",fix(string:tokens(Name,"_")))),
  17. filelib:ensure_dir("man/"),
  18. Gen = lists:concat(["man/",Lower,".htm"]),
  19. case file:read_file_info(Gen) of
  20. {error,_} -> write(Gen, Bin);
  21. {ok,_} -> io:format("man: file ~p already exists.~n",[Gen]) end,
  22. {ok,man};
  23. man(["groff"]) ->
  24. case lists:all(fun(X) -> mad_groff:do(X) == ok end,
  25. filelib:wildcard("man/**/*.htm")
  26. ++ filelib:wildcard("articles/**/*.htm")
  27. ++ filelib:wildcard("**/*.html")
  28. ++ filelib:wildcard("**/*.htm")
  29. ++ filelib:wildcard("*.html")
  30. ++ filelib:wildcard("*.htm")) of
  31. true -> {ok,check};
  32. false -> {error,check} end;
  33. man(["check"]) ->
  34. case lists:all(fun(X) -> element(1,X) == ok end, [ check(I)
  35. || I <- filelib:wildcard("*.htm")
  36. ++ filelib:wildcard("**/*.html")
  37. ++ filelib:wildcard("**/*.htm")
  38. ++ filelib:wildcard("*.html")
  39. ++ filelib:wildcard("man/**/*.htm")
  40. ++ filelib:wildcard("articles/**/*.htm") ]) of
  41. true -> {ok,check};
  42. false -> {error,check} end.
  43. write(Gen,Bin) -> io:format("Generated: ~p~n",[Gen]), file:write_file(Gen,Bin).
  44. replace(S,A,B) -> re:replace(S,A,B,[global,{return,list}]).
  45. trim(A) when is_list(A) -> trim(unicode:characters_to_binary(A,utf8));
  46. trim(A) when is_binary(A) -> re:replace(A, "(^\\s+)|(\\s+$)", "", [global,{return,list}]).
  47. fix([Prefix]) -> Prefix;
  48. fix([_Prefix,Name|_Rest]) -> Name.
  49. check(Filename) ->
  50. try _ = xmerl_scan:file(Filename), {ok,Filename} catch E:R ->
  51. io:format("man: ~p error: ~p~n",[Filename, case R of function_clause -> erlang:get_stacktrace(); _ -> R end]), {error,Filename} end.
  52. generate(Lower,Temp) ->
  53. Name = string:to_upper(Lower),
  54. Tem2 = replace(Temp,"MAN_TOOL",hd(string:tokens(Name,"_"))),
  55. CNAME = binary_to_list(element(2,file:read_file("CNAME"))),
  56. Tem3 = replace(Tem2,"MAN_CNAME",trim(CNAME)),
  57. Bin = iolist_to_binary(replace(Tem3,"MAN_NAME",fix(string:tokens(Name,"_")))),
  58. Gen = lists:concat(["man/",Lower,".htm"]),
  59. case file:read_file_info(Gen) of
  60. {error,_} -> write(Gen, Bin);
  61. {ok,_} -> io:format("man: file ~p already exists.~n",[Gen])
  62. % case element(2,A) > size(Bin) of
  63. % true -> skip;
  64. % false -> write(Gen,Bin) end
  65. end.
  66. template() ->
  67. mad_repl:load(),
  68. try lists:flatten(
  69. [case string:str(File,"priv/man") of 1 -> Bin; _ -> []
  70. end || {File,Bin} <- ets:tab2list(filesystem), is_list(File)])
  71. catch _:_ -> [] end.