浏览代码

Support reading mustache 'lists' from files

This commit add support for reading mustache 'lists' from files, so you
can use the list section functionality when templating things.

An example of the list syntax is as follows:

{package_commands, {list, [[{name, "riak"}], [{name, "riak-admin"}], [{name, "search-cmd"}]]}}.

Then you can, for each of the list elements, render some text:

{{#package_commands}}
chmod +x bin/{{name}}
{{/package_commands}}
pull/3/head
Andrew Thompson 12 年前
父节点
当前提交
ee8919420d
共有 1 个文件被更改,包括 17 次插入7 次删除
  1. +17
    -7
      src/rebar_templater.erl

+ 17
- 7
src/rebar_templater.erl 查看文件

@ -81,6 +81,9 @@ resolve_variables([], Dict) ->
resolve_variables([{Key, Value0} | Rest], Dict) when is_list(Value0) ->
Value = render(list_to_binary(Value0), Dict),
resolve_variables(Rest, dict:store(Key, Value, Dict));
resolve_variables([{Key, {list, Dicts}} | Rest], Dict) when is_list(Dicts) ->
%% just un-tag it so mustache can use it
resolve_variables(Rest, dict:store(Key, Dicts, Dict));
resolve_variables([_Pair | Rest], Dict) ->
resolve_variables(Rest, Dict).
@ -134,14 +137,14 @@ create1(Config, TemplateId) ->
undefined ->
Context0;
File ->
case file:consult(File) of
{ok, Terms} ->
%% TODO: Cleanup/merge with similar code in rebar_reltool
M = fun(_Key, _Base, Override) -> Override end,
dict:merge(M, Context0, dict:from_list(Terms));
case consult(load_file([], file, File)) of
{error, Reason} ->
?ABORT("Unable to load template_vars from ~s: ~p\n",
[File, Reason])
[File, Reason]);
Terms ->
%% TODO: Cleanup/merge with similar code in rebar_reltool
M = fun(_Key, _Base, Override) -> Override end,
dict:merge(M, Context0, dict:from_list(Terms))
end
end,
@ -275,7 +278,7 @@ consult(Cont, Str, Acc) ->
case Result of
{ok, Tokens, _} ->
{ok, Term} = erl_parse:parse_term(Tokens),
consult([], Remaining, [Term | Acc]);
consult([], Remaining, [maybe_dict(Term) | Acc]);
{eof, _Other} ->
lists:reverse(Acc);
{error, Info, _} ->
@ -286,6 +289,13 @@ consult(Cont, Str, Acc) ->
end.
maybe_dict({Key, {list, Dicts}}) ->
%% this is a 'list' element; a list of lists representing dicts
{Key, {list, [dict:from_list(D) || D <- Dicts]}};
maybe_dict(Term) ->
Term.
write_file(Output, Data, Force) ->
%% determine if the target file already exists
FileExists = filelib:is_regular(Output),

正在加载...
取消
保存