mad_static.erl 2.6 KB

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