Skip to content

Commit f7d0c8c

Browse files
committed
Add handle_body/1 callback to EEx.Engine
1 parent 4e93dab commit f7d0c8c

File tree

4 files changed

+42
-5
lines changed

4 files changed

+42
-5
lines changed

lib/eex/lib/eex/compiler.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ defmodule EEx.Compiler do
5151
raise EEx.SyntaxError, message: "unexpected token: #{inspect chars} at line #{inspect line}"
5252
end
5353

54-
defp generate_buffer([], buffer, [], _state) do
55-
buffer
54+
defp generate_buffer([], buffer, [], state) do
55+
state.engine.handle_body(buffer)
5656
end
5757

5858
defp generate_buffer([], _buffer, _scope, _state) do

lib/eex/lib/eex/engine.ex

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
defmodule EEx.Engine do
22
@moduledoc ~S"""
33
This is the basic EEx engine that ships with Elixir.
4-
An engine needs to implement two functions:
4+
An engine needs to implement three functions:
5+
6+
* `handle_body(quoted)` - receives the final built quoted
7+
expression, should do final post-processing and return a
8+
quoted expression;
59
610
* `handle_text(buffer, text)` - it receives the buffer,
711
the text and must return a new quoted expression;
@@ -22,9 +26,18 @@ defmodule EEx.Engine do
2226

2327
use Behaviour
2428

29+
defcallback handle_body(Macro.t) :: Macro.t
2530
defcallback handle_text(Macro.t, binary) :: Macro.t
2631
defcallback handle_expr(Macro.t, binary, Macro.t) :: Macro.t
2732

33+
@doc """
34+
The default implementation implementation simply returns the
35+
given expression.
36+
"""
37+
def handle_body(quoted) do
38+
quoted
39+
end
40+
2841
@doc """
2942
The default implementation simply concatenates text to the buffer.
3043
"""
@@ -54,4 +67,4 @@ defmodule EEx.Engine do
5467
tmp
5568
end
5669
end
57-
end
70+
end

lib/eex/lib/eex/smart_engine.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ defmodule EEx.TransformerEngine do
1515
quote do
1616
@behaviour EEx.Engine
1717

18+
def handle_body(body) do
19+
EEx.Engine.handle_body(body)
20+
end
21+
1822
def handle_text(buffer, text) do
1923
EEx.Engine.handle_text(buffer, text)
2024
end
@@ -39,7 +43,7 @@ defmodule EEx.TransformerEngine do
3943
other
4044
end
4145

42-
defoverridable [transform: 1, handle_expr: 3, handle_text: 2]
46+
defoverridable [transform: 1, handle_body: 1, handle_expr: 3, handle_text: 2]
4347
end
4448
end
4549
end

lib/eex/test/eex_test.exs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,26 @@ foo
344344
}
345345
end
346346

347+
defmodule TestEngine do
348+
@behaviour EEx.Engine
349+
350+
def handle_body(body) do
351+
{ :wrapped, body }
352+
end
353+
354+
def handle_text(buffer, text) do
355+
EEx.Engine.handle_text(buffer, text)
356+
end
357+
358+
def handle_expr(buffer, mark, expr) do
359+
EEx.Engine.handle_expr(buffer, mark, expr)
360+
end
361+
end
362+
363+
test "calls handle_body" do
364+
assert { :wrapped, "foo" } = EEx.eval_string("foo", [], engine: TestEngine)
365+
end
366+
347367
defp assert_eval(expected, actual) do
348368
result = EEx.eval_string(actual, [], file: __ENV__.file, engine: EEx.Engine)
349369
assert result == expected

0 commit comments

Comments
 (0)