|
@@ -113,9 +113,9 @@ init([]) ->
|
|
|
%% @end
|
|
|
%%--------------------------------------------------------------------
|
|
|
handle_call({compile, File, ModuleName, DocRoot, FunctionName}, _From, State) ->
|
|
|
- Reply = case parse(File) of
|
|
|
+ Reply = case erlydtl_base:parse(File) of
|
|
|
{ok, Ast} ->
|
|
|
- RelDir = rel_dir(filename:dirname(File), DocRoot),
|
|
|
+ RelDir = erlydtl_base:rel_dir(filename:dirname(File), DocRoot),
|
|
|
Ext = filename:extension(File),
|
|
|
compile(Ast, ModuleName, FunctionName, RelDir, Ext);
|
|
|
{error, Msg} = Err ->
|
|
@@ -172,52 +172,35 @@ code_change(_OldVsn, State, _Extra) ->
|
|
|
%%====================================================================
|
|
|
%% Internal functions
|
|
|
%%====================================================================
|
|
|
-
|
|
|
-
|
|
|
-parse(File) ->
|
|
|
- case file:read_file(File) of
|
|
|
- {ok, B} ->
|
|
|
- case erlydtl_scanner:scan(binary_to_list(B)) of
|
|
|
- {ok, Tokens} ->
|
|
|
- erlydtl_parser:parse(Tokens);
|
|
|
- Err ->
|
|
|
- io:format("TRACE ~p:~p ~p~n",[?MODULE, ?LINE, File ++ " Scanner failure:"]),
|
|
|
- io:format("TRACE ~p:~p ~p~n",[?MODULE, ?LINE, Err]),
|
|
|
- Err
|
|
|
- end;
|
|
|
- Err ->
|
|
|
- io:format("TRACE ~p:~p ~p: ~p~n",[?MODULE, ?LINE, "File read error with:", File]),
|
|
|
- Err
|
|
|
- end.
|
|
|
-
|
|
|
-
|
|
|
-compile([H | T], ModuleName, FunctionName, RelDir, Ext) ->
|
|
|
- {List, Args} = case build_tree(H, T, [], [], RelDir, Ext, [], []) of
|
|
|
- {regular, List0, Args0, _} ->
|
|
|
- {[parse_transform(X) || X <- List0], Args0};
|
|
|
- {inherited, List0, Arg0, _} ->
|
|
|
- {List0, Arg0}
|
|
|
- end,
|
|
|
- {Args1, BodyAST} = case Args of
|
|
|
- [] ->
|
|
|
- {[], [erl_syntax:list(List)]};
|
|
|
- _ ->
|
|
|
- Var = erl_syntax:variable(new_var(Args, 0)),
|
|
|
- BodyAST0 = lists:foldl(fun(X, Acc) ->
|
|
|
- X2 = list_to_atom(tl(atom_to_list(X))),
|
|
|
- A = erl_syntax:variable(X),
|
|
|
- B = erl_syntax:application(erl_syntax:atom(proplists),
|
|
|
- erl_syntax:atom(get_value), [erl_syntax:atom(X2), Var]),
|
|
|
- [erl_syntax:match_expr(A, B) | Acc]
|
|
|
- end,
|
|
|
- [erl_syntax:list(List)],
|
|
|
- Args),
|
|
|
- {[Var], BodyAST0}
|
|
|
- end,
|
|
|
- ClauseAST = erl_syntax:clause(Args1, none, BodyAST),
|
|
|
- FuncAST = erl_syntax:function(erl_syntax:atom(FunctionName), [ClauseAST]),
|
|
|
- [ModAST, CmpAST] = [erl_syntax:attribute(erl_syntax:atom(X), [erl_syntax:atom(Y)]) ||
|
|
|
- {X, Y} <- [{"module", ModuleName}, {"compile", "export_all"}]],
|
|
|
+compile([H | T], ModuleName, FunctionName, DocRoot, Ext) ->
|
|
|
+ {List, Args} = case erlydtl_base:build_tree(H, T, DocRoot, Ext) of
|
|
|
+ {regular, List0, Args0, _} ->
|
|
|
+ {[erlydtl_scanner:parse_transform(X) || X <- List0], Args0};
|
|
|
+ {inherited, List0, Arg0, _} ->
|
|
|
+ {List0, Arg0};
|
|
|
+ {error, Reason} ->
|
|
|
+ todo
|
|
|
+ end,
|
|
|
+ {Args1, BodyAST} = case Args of
|
|
|
+ [] ->
|
|
|
+ {[], [erl_syntax:list(List)]};
|
|
|
+ _ ->
|
|
|
+ Var = erl_syntax:variable(erlydtl_base:new_var(Args, 0)),
|
|
|
+ BodyAST0 = lists:foldl(fun(X, Acc) ->
|
|
|
+ X2 = list_to_atom(tl(atom_to_list(X))),
|
|
|
+ A = erl_syntax:variable(X),
|
|
|
+ B = erl_syntax:application(erl_syntax:atom(proplists),
|
|
|
+ erl_syntax:atom(get_value), [erl_syntax:atom(X2), Var]),
|
|
|
+ [erl_syntax:match_expr(A, B) | Acc]
|
|
|
+ end,
|
|
|
+ [erl_syntax:list(List)],
|
|
|
+ Args),
|
|
|
+ {[Var], BodyAST0}
|
|
|
+ end,
|
|
|
+ ClauseAST = erl_syntax:clause(Args1, none, BodyAST),
|
|
|
+ FuncAST = erl_syntax:function(erl_syntax:atom(FunctionName), [ClauseAST]),
|
|
|
+ [ModAST, CmpAST] = [erl_syntax:attribute(erl_syntax:atom(X), [erl_syntax:atom(Y)]) ||
|
|
|
+ {X, Y} <- [{"module", ModuleName}, {"compile", "export_all"}]],
|
|
|
Forms = [erl_syntax:revert(X) || X <- [ModAST, CmpAST, FuncAST]],
|
|
|
case compile:forms(Forms) of
|
|
|
{ok, Module, Bin} ->
|
|
@@ -226,194 +209,200 @@ compile([H | T], ModuleName, FunctionName, RelDir, Ext) ->
|
|
|
_ ->
|
|
|
{error, "compilation failed"}
|
|
|
end.
|
|
|
-
|
|
|
-
|
|
|
-build_tree(nil, [{extends, _Line, Name}], Out, Args, RelDir, Ext, _, _) ->
|
|
|
- case parse(filename:join([RelDir, Name])) of
|
|
|
- {ok, ParentAst} ->
|
|
|
- [H|T]=ParentAst,
|
|
|
- {_, List, Args1, _} = build_tree(H, T, [], [], RelDir, Ext, [], []),
|
|
|
- {List3, Args3} = lists:foldl(fun(X, {List2, Args2}) ->
|
|
|
- {List4, Args4} = parse_transform(X, Out, Args2, Ext, [],[]),
|
|
|
- {[List4 | List2], Args4}
|
|
|
- end,
|
|
|
- {[], Args1},
|
|
|
- List),
|
|
|
- {inherited, lists:reverse(lists:flatten([List3])), lists:flatten(Args3), []};
|
|
|
- {error, Msg} ->
|
|
|
- io:format("TRACE ~p:~p Parent Parser failure: ~p~n",[?MODULE, ?LINE, Name]),
|
|
|
- {regular, Out, Args, []}
|
|
|
- end;
|
|
|
-
|
|
|
-build_tree(nil, [{var, Line, Var}], Out, Args, DocRoot, Ext, Var, Rec) ->
|
|
|
- {regular, [erl_syntax:variable(Var) | Out], Args, Rec};
|
|
|
-
|
|
|
-build_tree(nil, [{var, Line, Ns, Var}], Out, Args, DocRoot, Ext, Ns, Rec) ->
|
|
|
- Var1 = lists:concat([Ns, ".", Var]),
|
|
|
- Rec1 = [list_to_atom(Var1) | Rec],
|
|
|
- {regular, [erl_syntax:variable(Var1) | Out], Args, Rec1};
|
|
|
-
|
|
|
-build_tree(nil, [{var, Line, Var}], Out, Args, _, _, _, Rec) ->
|
|
|
- case lists:member(Var, Args) of
|
|
|
- true ->
|
|
|
- {regular, [{var, Line, Var} | Out], Args, Rec};
|
|
|
- _ ->
|
|
|
- {regular, [{var, Line, Var} | Out], [Var | Args], Rec}
|
|
|
- end;
|
|
|
-
|
|
|
-build_tree(nil, [{tag, _Line, TagName, TagArgs}], Out, Args, _, Ext, _, Rec) ->
|
|
|
- Out2 = load_tag(TagName, TagArgs, Out, default, Ext),
|
|
|
- {regular, Out2, Args, Rec};
|
|
|
-
|
|
|
-build_tree(nil, [{for, _Line, It, Var, [HFor | TFor]}], Out, Args, _, Ext, _, Rec) ->
|
|
|
- {_, List1, Args1, Rec1} = build_tree(HFor, TFor, [], Args, undefined, Ext, It, []),
|
|
|
- Args2 = case lists:member(Var, Args1) of
|
|
|
- true ->
|
|
|
- Args1;
|
|
|
- _ ->
|
|
|
- [Var | Args1]
|
|
|
- end,
|
|
|
- ItAST = erl_syntax:variable(It),
|
|
|
- Out1 = case Rec1 of
|
|
|
- [] ->
|
|
|
- BodyAST = erl_syntax:generator(ItAST, erl_syntax:variable(Var)),
|
|
|
- erl_syntax:list_comp(erl_syntax:list(List1), [BodyAST]);
|
|
|
- _ ->
|
|
|
- FunBodyAST = lists:foldl(fun(X, Acc) ->
|
|
|
- [_,Prop] = string:tokens(tl(atom_to_list(X)), "."),
|
|
|
- A = erl_syntax:variable(X),
|
|
|
- B = erl_syntax:application(erl_syntax:atom(proplists),
|
|
|
- erl_syntax:atom(get_value), [erl_syntax:atom(Prop), ItAST]),
|
|
|
- [erl_syntax:match_expr(A, B) | Acc]
|
|
|
- end,
|
|
|
- [erl_syntax:list(List1)],
|
|
|
- Rec1),
|
|
|
- FunClauseAST = erl_syntax:clause([ItAST], none, FunBodyAST),
|
|
|
- erl_syntax:application(erl_syntax:atom(lists),
|
|
|
- erl_syntax:atom(map),
|
|
|
- [erl_syntax:fun_expr([FunClauseAST]), erl_syntax:variable(Var)])
|
|
|
- end,
|
|
|
- {regular, Out1, Args2, Rec};
|
|
|
-
|
|
|
-build_tree(nil, [Token], Out, Args, _, _, _, Rec) ->
|
|
|
- {regular, [Token | Out], Args, Rec};
|
|
|
-
|
|
|
-build_tree([H | T], [{var, Line, Var}], Out, Args, DocRoot, Ext, Var, Rec) ->
|
|
|
- build_tree(H, T, [erl_syntax:variable(Var) | Out], Args, DocRoot, Ext, Var, Rec);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
-build_tree([H | T], [{var, Line, Ns, Var}], Out, Args, DocRoot, Ext, Ns, Rec) ->
|
|
|
- Var1 = lists:concat([Ns, ".", Var]),
|
|
|
- Rec1 = [list_to_atom(Var1) | Rec],
|
|
|
- build_tree(H, T, [erl_syntax:variable(Var1) | Out], Args, DocRoot, Ext, Ns, Rec1);
|
|
|
-
|
|
|
-build_tree([H | T], [{var, Line, Var}], Out, Args, DocRoot, Ext, IgnoreVar, Rec) ->
|
|
|
- case lists:member(Var, Args) of
|
|
|
- true ->
|
|
|
- build_tree(H, T, [{var, Line, Var} | Out], Args, DocRoot, Ext, IgnoreVar, Rec);
|
|
|
- _ ->
|
|
|
- build_tree(H, T, [{var, Line, Var} | Out], [Var | Args], DocRoot, Ext, IgnoreVar, Rec)
|
|
|
- end;
|
|
|
-
|
|
|
-build_tree([H | T], [{tag, _Line, TagName, TagArgs}], Out, Args, DocRoot, Ext, IgnoreVar, Rec) ->
|
|
|
- Out2 = load_tag(TagName, TagArgs, Out, default, Ext),
|
|
|
- build_tree(H, T, Out2, Args, DocRoot, Ext, IgnoreVar, Rec);
|
|
|
-
|
|
|
-build_tree([H | T], [{for, _Line, It, Var, [HFor | TFor]}], Out, Args, DocRoot, Ext, IgnoreVar, Rec) ->
|
|
|
- {_, List1, Args1, Rec1} = build_tree(HFor, TFor, [], Args, undefined, Ext, It, []),
|
|
|
- Args2 = case lists:member(Var, Args1) of
|
|
|
- true ->
|
|
|
- Args1;
|
|
|
- _ ->
|
|
|
- [Var | Args1]
|
|
|
- end,
|
|
|
- ItAST = erl_syntax:variable(It),
|
|
|
- Out1 = case Rec1 of
|
|
|
- [] ->
|
|
|
- BodyAST = erl_syntax:generator(ItAST, erl_syntax:variable(Var)),
|
|
|
- erl_syntax:list_comp(erl_syntax:list(List1), [BodyAST]);
|
|
|
- _ ->
|
|
|
- FunBodyAST = lists:foldl(fun(X, Acc) ->
|
|
|
- [_,Prop] = string:tokens(tl(atom_to_list(X)), "."),
|
|
|
- A = erl_syntax:variable(X),
|
|
|
- B = erl_syntax:application(erl_syntax:atom(proplists),
|
|
|
- erl_syntax:atom(get_value), [erl_syntax:atom(Prop), ItAST]),
|
|
|
- [erl_syntax:match_expr(A, B) | Acc]
|
|
|
- end,
|
|
|
- [erl_syntax:list(List1)],
|
|
|
- Rec1),
|
|
|
- FunClauseAST = erl_syntax:clause([ItAST], none, FunBodyAST),
|
|
|
- erl_syntax:application(erl_syntax:atom(lists),
|
|
|
- erl_syntax:atom(map),
|
|
|
- [erl_syntax:fun_expr([FunClauseAST]), erl_syntax:variable(Var)])
|
|
|
- end,
|
|
|
- build_tree(H, T, lists:flatten([Out1, Out]), Args2, DocRoot, Ext, IgnoreVar, Rec);
|
|
|
-
|
|
|
-build_tree([H | T], [Token], Out, Args, DocRoot, Ext, IgnoreVar, Rec) ->
|
|
|
- build_tree(H, T, [Token | Out], Args, DocRoot, Ext, IgnoreVar, Rec).
|
|
|
-
|
|
|
-
|
|
|
-parse_transform({block, _Line, Name, [nil, Val]}, List, Args, Ext, IgnoreVar, Rec) ->
|
|
|
- case lists:keysearch(Name, 3, List) of
|
|
|
- false ->
|
|
|
- parse_transform(Val, List, Args, Ext, IgnoreVar, Rec);
|
|
|
- {value, {_, _, _, [H | T]}} ->
|
|
|
- {_, List2, Args2, Rec1} = build_tree(H, T, [], Args, undefined, Ext, IgnoreVar, Rec),
|
|
|
- parse_transform(lists:reverse(List2), List, Args2, Ext, IgnoreVar, Rec1)
|
|
|
- end;
|
|
|
-parse_transform(Other, _What, Args, _, _, _) ->
|
|
|
- {Other, Args}.
|
|
|
-
|
|
|
-
|
|
|
-parse_transform({var, Line, Val}, Var, Val) when is_atom(Var) ->
|
|
|
- {var, Line, Var}.
|
|
|
-
|
|
|
-
|
|
|
-parse_transform({var, _Line, Var}, Args) ->
|
|
|
- Var2 = list_to_atom(tl(atom_to_list(Var))),
|
|
|
- binary_string(proplists:get_value(Var2, Args));
|
|
|
-parse_transform(Other, _) ->
|
|
|
- Other.
|
|
|
-
|
|
|
-
|
|
|
-parse_transform({block, _Line , _Name, [nil, T]}) ->
|
|
|
- parse_transform(T);
|
|
|
-parse_transform({var, L, Val}) ->
|
|
|
- erl_syntax:variable(Val);
|
|
|
-parse_transform(Other) ->
|
|
|
- Other.
|
|
|
-
|
|
|
-
|
|
|
-load_tag(TagName, TagArgs, Acc0, default, Ext) ->
|
|
|
- case parse(filename:join([erlydtl_deps:get_base_dir(), "priv", "tags", atom_to_list(TagName) ++ Ext])) of
|
|
|
- {ok, ParentAst} ->
|
|
|
- [H|T]=ParentAst,
|
|
|
- {_, List, _, _} = build_tree(H, T, [], [], undefined, Ext, [], []),
|
|
|
- lists:foldl(fun(X, Acc) ->
|
|
|
- [parse_transform(X, TagArgs) | Acc]
|
|
|
- end,
|
|
|
- Acc0,
|
|
|
- lists:reverse(List));
|
|
|
- {error, Msg} ->
|
|
|
- Acc0
|
|
|
- end.
|
|
|
-
|
|
|
-
|
|
|
-binary_string(String) ->
|
|
|
- erl_syntax:binary([erl_syntax:binary_field(erl_syntax:integer(X)) || X <- String]).
|
|
|
-
|
|
|
-
|
|
|
-rel_dir(Dir, DocRoot) when Dir =:= DocRoot ->
|
|
|
- DocRoot;
|
|
|
-rel_dir(Dir, DocRoot) ->
|
|
|
- RelFile = string:substr(Dir, length(DocRoot)+2),
|
|
|
- filename:join([DocRoot, RelFile]).
|
|
|
-
|
|
|
-
|
|
|
-new_var(List, Acc) ->
|
|
|
- Var = list_to_atom(lists:concat(["A", Acc])),
|
|
|
- case lists:member(Var, List) of
|
|
|
- false ->
|
|
|
- Var;
|
|
|
- _ ->
|
|
|
- new_var(List, Acc + 1)
|
|
|
- end.
|
|
|
+%% build_tree(nil, [{extends, _Line, Name}], Out, Args, RelDir, Ext, _, _) ->
|
|
|
+%% case parse(filename:join([RelDir, Name])) of
|
|
|
+%% {ok, ParentAst} ->
|
|
|
+%% [H|T]=ParentAst,
|
|
|
+%% {_, List, Args1, _} = build_tree(H, T, [], [], RelDir, Ext, [], []),
|
|
|
+%% {List3, Args3} = lists:foldl(fun(X, {List2, Args2}) ->
|
|
|
+%% {List4, Args4} = parse_transform(X, Out, Args2, Ext, [],[]),
|
|
|
+%% {[List4 | List2], Args4}
|
|
|
+%% end,
|
|
|
+%% {[], Args1},
|
|
|
+%% List),
|
|
|
+%% {inherited, lists:reverse(lists:flatten([List3])), lists:flatten(Args3), []};
|
|
|
+%% {error, Msg} ->
|
|
|
+%% io:format("TRACE ~p:~p Parent Parser failure: ~p~n",[?MODULE, ?LINE, Name]),
|
|
|
+%% {regular, Out, Args, []}
|
|
|
+%% end;
|
|
|
+%%
|
|
|
+%% build_tree(nil, [{var, Line, Var}], Out, Args, DocRoot, Ext, Var, Rec) ->
|
|
|
+%% {regular, [erl_syntax:variable(Var) | Out], Args, Rec};
|
|
|
+%%
|
|
|
+%% build_tree(nil, [{var, Line, Ns, Var}], Out, Args, DocRoot, Ext, Ns, Rec) ->
|
|
|
+%% Var1 = lists:concat([Ns, ".", Var]),
|
|
|
+%% Rec1 = [list_to_atom(Var1) | Rec],
|
|
|
+%% {regular, [erl_syntax:variable(Var1) | Out], Args, Rec1};
|
|
|
+%%
|
|
|
+%% build_tree(nil, [{var, Line, Var}], Out, Args, _, _, _, Rec) ->
|
|
|
+%% case lists:member(Var, Args) of
|
|
|
+%% true ->
|
|
|
+%% {regular, [{var, Line, Var} | Out], Args, Rec};
|
|
|
+%% _ ->
|
|
|
+%% {regular, [{var, Line, Var} | Out], [Var | Args], Rec}
|
|
|
+%% end;
|
|
|
+%%
|
|
|
+%% build_tree(nil, [{tag, _Line, TagName, TagArgs}], Out, Args, _, Ext, _, Rec) ->
|
|
|
+%% Out2 = load_tag(TagName, TagArgs, Out, default, Ext),
|
|
|
+%% {regular, Out2, Args, Rec};
|
|
|
+%%
|
|
|
+%% build_tree(nil, [{for, _Line, It, Var, [HFor | TFor]}], Out, Args, _, Ext, _, Rec) ->
|
|
|
+%% {_, List1, Args1, Rec1} = build_tree(HFor, TFor, [], Args, undefined, Ext, It, []),
|
|
|
+%% Args2 = case lists:member(Var, Args1) of
|
|
|
+%% true ->
|
|
|
+%% Args1;
|
|
|
+%% _ ->
|
|
|
+%% [Var | Args1]
|
|
|
+%% end,
|
|
|
+%% ItAST = erl_syntax:variable(It),
|
|
|
+%% Out1 = case Rec1 of
|
|
|
+%% [] ->
|
|
|
+%% BodyAST = erl_syntax:generator(ItAST, erl_syntax:variable(Var)),
|
|
|
+%% erl_syntax:list_comp(erl_syntax:list(List1), [BodyAST]);
|
|
|
+%% _ ->
|
|
|
+%% FunBodyAST = lists:foldl(fun(X, Acc) ->
|
|
|
+%% [_,Prop] = string:tokens(tl(atom_to_list(X)), "."),
|
|
|
+%% A = erl_syntax:variable(X),
|
|
|
+%% B = erl_syntax:application(erl_syntax:atom(proplists),
|
|
|
+%% erl_syntax:atom(get_value), [erl_syntax:atom(Prop), ItAST]),
|
|
|
+%% [erl_syntax:match_expr(A, B) | Acc]
|
|
|
+%% end,
|
|
|
+%% [erl_syntax:list(List1)],
|
|
|
+%% Rec1),
|
|
|
+%% FunClauseAST = erl_syntax:clause([ItAST], none, FunBodyAST),
|
|
|
+%% erl_syntax:application(erl_syntax:atom(lists),
|
|
|
+%% erl_syntax:atom(map),
|
|
|
+%% [erl_syntax:fun_expr([FunClauseAST]), erl_syntax:variable(Var)])
|
|
|
+%% end,
|
|
|
+%% {regular, Out1, Args2, Rec};
|
|
|
+%%
|
|
|
+%% build_tree(nil, [Token], Out, Args, _, _, _, Rec) ->
|
|
|
+%% {regular, [Token | Out], Args, Rec};
|
|
|
+%%
|
|
|
+%% build_tree([H | T], [{var, Line, Var}], Out, Args, DocRoot, Ext, Var, Rec) ->
|
|
|
+%% build_tree(H, T, [erl_syntax:variable(Var) | Out], Args, DocRoot, Ext, Var, Rec);
|
|
|
+%%
|
|
|
+%% build_tree([H | T], [{var, Line, Ns, Var}], Out, Args, DocRoot, Ext, Ns, Rec) ->
|
|
|
+%% Var1 = lists:concat([Ns, ".", Var]),
|
|
|
+%% Rec1 = [list_to_atom(Var1) | Rec],
|
|
|
+%% build_tree(H, T, [erl_syntax:variable(Var1) | Out], Args, DocRoot, Ext, Ns, Rec1);
|
|
|
+%%
|
|
|
+%% build_tree([H | T], [{var, Line, Var}], Out, Args, DocRoot, Ext, IgnoreVar, Rec) ->
|
|
|
+%% case lists:member(Var, Args) of
|
|
|
+%% true ->
|
|
|
+%% build_tree(H, T, [{var, Line, Var} | Out], Args, DocRoot, Ext, IgnoreVar, Rec);
|
|
|
+%% _ ->
|
|
|
+%% build_tree(H, T, [{var, Line, Var} | Out], [Var | Args], DocRoot, Ext, IgnoreVar, Rec)
|
|
|
+%% end;
|
|
|
+%%
|
|
|
+%% build_tree([H | T], [{tag, _Line, TagName, TagArgs}], Out, Args, DocRoot, Ext, IgnoreVar, Rec) ->
|
|
|
+%% Out2 = load_tag(TagName, TagArgs, Out, default, Ext),
|
|
|
+%% build_tree(H, T, Out2, Args, DocRoot, Ext, IgnoreVar, Rec);
|
|
|
+%%
|
|
|
+%% build_tree([H | T], [{for, _Line, It, Var, [HFor | TFor]}], Out, Args, DocRoot, Ext, IgnoreVar, Rec) ->
|
|
|
+%% {_, List1, Args1, Rec1} = build_tree(HFor, TFor, [], Args, undefined, Ext, It, []),
|
|
|
+%% Args2 = case lists:member(Var, Args1) of
|
|
|
+%% true ->
|
|
|
+%% Args1;
|
|
|
+%% _ ->
|
|
|
+%% [Var | Args1]
|
|
|
+%% end,
|
|
|
+%% ItAST = erl_syntax:variable(It),
|
|
|
+%% Out1 = case Rec1 of
|
|
|
+%% [] ->
|
|
|
+%% BodyAST = erl_syntax:generator(ItAST, erl_syntax:variable(Var)),
|
|
|
+%% erl_syntax:list_comp(erl_syntax:list(List1), [BodyAST]);
|
|
|
+%% _ ->
|
|
|
+%% FunBodyAST = lists:foldl(fun(X, Acc) ->
|
|
|
+%% [_,Prop] = string:tokens(tl(atom_to_list(X)), "."),
|
|
|
+%% A = erl_syntax:variable(X),
|
|
|
+%% B = erl_syntax:application(erl_syntax:atom(proplists),
|
|
|
+%% erl_syntax:atom(get_value), [erl_syntax:atom(Prop), ItAST]),
|
|
|
+%% [erl_syntax:match_expr(A, B) | Acc]
|
|
|
+%% end,
|
|
|
+%% [erl_syntax:list(List1)],
|
|
|
+%% Rec1),
|
|
|
+%% FunClauseAST = erl_syntax:clause([ItAST], none, FunBodyAST),
|
|
|
+%% erl_syntax:application(erl_syntax:atom(lists),
|
|
|
+%% erl_syntax:atom(map),
|
|
|
+%% [erl_syntax:fun_expr([FunClauseAST]), erl_syntax:variable(Var)])
|
|
|
+%% end,
|
|
|
+%% build_tree(H, T, lists:flatten([Out1, Out]), Args2, DocRoot, Ext, IgnoreVar, Rec);
|
|
|
+%%
|
|
|
+%% build_tree([H | T], [Token], Out, Args, DocRoot, Ext, IgnoreVar, Rec) ->
|
|
|
+%% build_tree(H, T, [Token | Out], Args, DocRoot, Ext, IgnoreVar, Rec).
|
|
|
+%%
|
|
|
+%%
|
|
|
+%% parse_transform({block, _Line, Name, [nil, Val]}, List, Args, Ext, IgnoreVar, Rec) ->
|
|
|
+%% case lists:keysearch(Name, 3, List) of
|
|
|
+%% false ->
|
|
|
+%% parse_transform(Val, List, Args, Ext, IgnoreVar, Rec);
|
|
|
+%% {value, {_, _, _, [H | T]}} ->
|
|
|
+%% {_, List2, Args2, Rec1} = build_tree(H, T, [], Args, undefined, Ext, IgnoreVar, Rec),
|
|
|
+%% parse_transform(lists:reverse(List2), List, Args2, Ext, IgnoreVar, Rec1)
|
|
|
+%% end;
|
|
|
+%% parse_transform(Other, _What, Args, _, _, _) ->
|
|
|
+%% {Other, Args}.
|
|
|
+%%
|
|
|
+%%
|
|
|
+%% parse_transform({var, Line, Val}, Var, Val) when is_atom(Var) ->
|
|
|
+%% {var, Line, Var}.
|
|
|
+%%
|
|
|
+%%
|
|
|
+%% parse_transform({var, _Line, Var}, Args) ->
|
|
|
+%% Var2 = list_to_atom(tl(atom_to_list(Var))),
|
|
|
+%% binary_string(proplists:get_value(Var2, Args));
|
|
|
+%% parse_transform(Other, _) ->
|
|
|
+%% Other.
|
|
|
+%%
|
|
|
+%%
|
|
|
+%% parse_transform({block, _Line , _Name, [nil, T]}) ->
|
|
|
+%% parse_transform(T);
|
|
|
+%% parse_transform({var, L, Val}) ->
|
|
|
+%% erl_syntax:variable(Val);
|
|
|
+%% parse_transform(Other) ->
|
|
|
+%% Other.
|
|
|
+%%
|
|
|
+%%
|
|
|
+%% load_tag(TagName, TagArgs, Acc0, default, Ext) ->
|
|
|
+%% case parse(filename:join([erlydtl_deps:get_base_dir(), "priv", "tags", atom_to_list(TagName) ++ Ext])) of
|
|
|
+%% {ok, ParentAst} ->
|
|
|
+%% [H|T]=ParentAst,
|
|
|
+%% {_, List, _, _} = build_tree(H, T, [], [], undefined, Ext, [], []),
|
|
|
+%% lists:foldl(fun(X, Acc) ->
|
|
|
+%% [parse_transform(X, TagArgs) | Acc]
|
|
|
+%% end,
|
|
|
+%% Acc0,
|
|
|
+%% lists:reverse(List));
|
|
|
+%% {error, Msg} ->
|
|
|
+%% Acc0
|
|
|
+%% end.
|
|
|
+%%
|
|
|
+%%
|
|
|
+%% binary_string(String) ->
|
|
|
+%% erl_syntax:binary([erl_syntax:binary_field(erl_syntax:integer(X)) || X <- String]).
|
|
|
+%%
|
|
|
+%%
|
|
|
+%% rel_dir(Dir, DocRoot) when Dir =:= DocRoot ->
|
|
|
+%% DocRoot;
|
|
|
+%% rel_dir(Dir, DocRoot) ->
|
|
|
+%% RelFile = string:substr(Dir, length(DocRoot)+2),
|
|
|
+%% filename:join([DocRoot, RelFile]).
|
|
|
+%%
|
|
|
+%%
|
|
|
+%% new_var(List, Acc) ->
|
|
|
+%% Var = list_to_atom(lists:concat(["A", Acc])),
|
|
|
+%% case lists:member(Var, List) of
|
|
|
+%% false ->
|
|
|
+%% Var;
|
|
|
+%% _ ->
|
|
|
+%% new_var(List, Acc + 1)
|
|
|
+%% end.
|