erlydtl_runtime.erl 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. -module(erlydtl_runtime).
  2. -compile(export_all).
  3. find_value(_, undefined) ->
  4. undefined;
  5. find_value(Key, Fun) when is_function(Fun, 1) ->
  6. Fun(Key);
  7. find_value(Key, L) when is_list(L) ->
  8. case proplists:get_value(Key, L) of
  9. undefined ->
  10. case proplists:get_value(atom_to_list(Key), L) of
  11. undefined ->
  12. proplists:get_value(list_to_binary(atom_to_list(Key)), L);
  13. Val -> Val
  14. end;
  15. Val -> Val
  16. end;
  17. find_value(Key, {GBSize, GBData}) when is_integer(GBSize) ->
  18. case gb_trees:lookup(Key, {GBSize, GBData}) of
  19. {value, Val} ->
  20. Val;
  21. _ ->
  22. undefined
  23. end;
  24. find_value(Key, Tuple) when is_tuple(Tuple) ->
  25. Module = element(1, Tuple),
  26. case Module of
  27. dict ->
  28. case dict:find(Key, Tuple) of
  29. {ok, Val} ->
  30. Val;
  31. _ ->
  32. undefined
  33. end;
  34. Module ->
  35. case proplists:get_value(Key, Module:module_info(exports)) of
  36. 1 ->
  37. Tuple:Key();
  38. _ ->
  39. undefined
  40. end
  41. end.
  42. fetch_value(Key, Data) ->
  43. case find_value(Key, Data) of
  44. undefined ->
  45. throw({undefined_variable, Key});
  46. Val ->
  47. Val
  48. end.
  49. are_equal(Arg1, Arg2) when Arg1 =:= Arg2 ->
  50. true;
  51. are_equal(Arg1, Arg2) when is_binary(Arg1) ->
  52. are_equal(binary_to_list(Arg1), Arg2);
  53. are_equal(Arg1, Arg2) when is_binary(Arg2) ->
  54. are_equal(Arg1, binary_to_list(Arg2));
  55. are_equal(Arg1, Arg2) when is_integer(Arg1) ->
  56. are_equal(integer_to_list(Arg1), Arg2);
  57. are_equal(Arg1, Arg2) when is_integer(Arg2) ->
  58. are_equal(Arg1, integer_to_list(Arg2));
  59. are_equal([Arg1], Arg2) when is_list(Arg1) ->
  60. are_equal(Arg1, Arg2);
  61. are_equal(Arg1, [Arg2]) when is_list(Arg1) ->
  62. are_equal(Arg1, Arg2);
  63. are_equal(Arg1, Arg2) when is_atom(Arg1), is_list(Arg2) ->
  64. are_equal(atom_to_list(Arg1), Arg2);
  65. are_equal(Arg1, Arg2) when is_list(Arg1), is_atom(Arg2) ->
  66. are_equal(Arg1, atom_to_list(Arg2));
  67. are_equal(_, _) ->
  68. false.
  69. is_false("") ->
  70. true;
  71. is_false(false) ->
  72. true;
  73. is_false(undefined) ->
  74. true;
  75. is_false("0") ->
  76. true;
  77. is_false(<<"0">>) ->
  78. true;
  79. is_false(<<>>) ->
  80. true;
  81. is_false(_) ->
  82. false.
  83. stringify_final(In) ->
  84. stringify_final(In, []).
  85. stringify_final([], Out) ->
  86. lists:reverse(Out);
  87. stringify_final([El | Rest], Out) when is_atom(El) ->
  88. stringify_final(Rest, [atom_to_list(El) | Out]);
  89. stringify_final([El | Rest], Out) ->
  90. stringify_final(Rest, [El | Out]).
  91. init_counter_stats(List) ->
  92. init_counter_stats(List, undefined).
  93. init_counter_stats(List, Parent) ->
  94. [{counter, 1},
  95. {counter0, 0},
  96. {revcounter, length(List)},
  97. {revcounter0, length(List) - 1},
  98. {first, true},
  99. {last, length(List) =:= 1},
  100. {parentloop, Parent}].
  101. increment_counter_stats([{counter, Counter}, {counter0, Counter0}, {revcounter, RevCounter},
  102. {revcounter0, RevCounter0}, {first, _}, {last, _}, {parentloop, Parent}]) ->
  103. [{counter, Counter + 1},
  104. {counter0, Counter0 + 1},
  105. {revcounter, RevCounter - 1},
  106. {revcounter0, RevCounter0 - 1},
  107. {first, false}, {last, RevCounter0 =:= 1},
  108. {parentloop, Parent}].
  109. cycle(NamesTuple, Counters) when is_tuple(NamesTuple) ->
  110. element(fetch_value(counter0, Counters) rem size(NamesTuple) + 1, NamesTuple).
  111. firstof([]) ->
  112. [];
  113. firstof(Any) ->
  114. io:format("Unhandled firstof: ~p~n", [Any]).