mad_static.erl 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. -module(mad_static).
  2. %-author('Yuri Artemev').
  3. -export([
  4. main/2,
  5. app/1
  6. ]).
  7. -define(NODE(Bin), "node_modules/.bin/" ++ Bin).
  8. main(_Config, ["min"]) ->
  9. {ok,[SysConfig]} = file:consult("sys.config"),
  10. N4U = proplists:get_value(n4u,SysConfig,[]),
  11. AppName = proplists:get_value(app,N4U,sample),
  12. Minify = proplists:get_value(minify,N4U,[]),
  13. Command = lists:concat(["uglify -s ", string:join(erlang:element(2, Minify),", "),
  14. " -o ", erlang:element(1, Minify), "/", AppName, ".min.js"]),
  15. io:format("Minify: ~p~n",[Command]),
  16. case sh:run(Command) of
  17. {_,0,_} -> {ok,static};
  18. {_,_,_} -> mad:info("minifyjs not installed. try `npm install -g uglify`~n"), {error,minifier}
  19. end;
  20. main(Config, ["watch"]) ->
  21. case mad_utils:get_value(static, Config, []) of
  22. [] -> {ok,static};
  23. SC ->
  24. Port = mad_utils:get_value(assets_port, SC, 3000),
  25. install_deps(), serve_static(Port)
  26. end;
  27. main(Config, _Params) ->
  28. case mad_utils:get_value(static, Config, []) of
  29. [] -> {ok,static};
  30. SC ->
  31. Files = mad_utils:get_value(files, SC, []),
  32. install_deps(), compile_static(Files)
  33. end.
  34. install_deps() ->
  35. case filelib:is_dir("node_modules/mincer-erl") of
  36. true -> {ok,static};
  37. _ ->
  38. case sh:oneliner("npm install mincer-erl") of
  39. {_,0,_} -> {ok,static};
  40. {_,_,_} -> mad:info("error while installing mincer-erl~n"), {error,install}
  41. end
  42. end.
  43. % FIXME exit
  44. serve_static(Port) ->
  45. PortStr = integer_to_list(Port),
  46. Res = sh:oneliner([?NODE("mincer-erl-serve"), "-p " ++ PortStr]),
  47. case Res of
  48. {_,0,_} -> {ok,static};
  49. {_,_,_} -> mad:info("error while serving assets~n"), {error,assests} end.
  50. compile_static(Files) ->
  51. Res = sh:oneliner([?NODE("mincer-erl-compile")] ++ Files),
  52. case Res of
  53. {_,0,_} -> {ok,static};
  54. {_,_,_} -> mad:info("error while compiling assets~n"), {error,compile} end.
  55. app([]) -> app(["sample"]);
  56. app(Params) ->
  57. [Name] = Params,
  58. mad_repl:load(),
  59. Apps = ets:tab2list(filesystem),
  60. [ case string:str(File,"priv/web") of
  61. 1 -> Relative = unicode:characters_to_list(Name ++ string:replace(string:substr(File, 9), "sample", Name, all), utf8),
  62. mad:info("Create File: ~p~n",[Relative]),
  63. filelib:ensure_dir(Relative),
  64. BinNew = string:replace(Bin, "sample", Name, all),
  65. file:write_file(Relative, BinNew);
  66. _ -> skip
  67. end || {File,Bin} <- Apps, erlang:is_list(File) ], {ok,Name}.