#
View Source EEx.Engine behaviour (EEx v1.15.7)

Basic EEx engine that ships with Elixir.

An engine needs to implement all callbacks below.

This module also ships with a default engine implementation you can delegate to. See `EEx.SmartEngine` as an example.

# Summary

## Types

state()

## Callbacks

handle_begin(state)

Invoked at the beginning of every nesting.

handle_body(state)

Called at the end of every template.

handle_end(state)

Invokes at the end of a nesting.

handle_expr(state, marker, expr)

Called for the dynamic/code parts of a template.

handle_text(state, list, text)

Called for the text/static parts of a template.

init(opts)

Called at the beginning of every template.

## Functions

handle_assign(arg)

Handles assigns in quoted expressions.

handle_begin(state)

Default implementation for `handle_begin/1`.

handle_body(state)

Default implementation for `handle_body/1`.

handle_end(quoted)

Default implementation for `handle_end/1`.

handle_expr(state, marker, ast)

Default implementation for `handle_expr/3`.

handle_text(state, meta, text)

Default implementation for `handle_text/3`.

init(opts)

Default implementation for `init/1`.

# Types

Link to this type

# state()

View Source

    @type state() :: term()

# Callbacks

Link to this callback

# handle_begin(state)

View Source

    @callback handle_begin(state()) :: state()

Invoked at the beginning of every nesting.

It must return a new state that is used only inside the nesting. Once the nesting terminates, the current `state` is resumed.

Link to this callback

# handle_body(state)

View Source

    @callback handle_body(state()) :: Macro.t()

Called at the end of every template.

It must return Elixir's quoted expressions for the template.

Link to this callback

# handle_end(state)

View Source

    @callback handle_end(state()) :: Macro.t()

Invokes at the end of a nesting.

It must return Elixir's quoted expressions for the nesting.

Link to this callback

# handle_expr(state, marker, expr)

View Source

    @callback handle_expr(state(), marker :: String.t(), expr :: Macro.t()) :: state()

Called for the dynamic/code parts of a template.

The marker is what follows exactly after `<%`. For example, `<% foo %>` has an empty marker, but `<%= foo %>` has `"="` as marker. The allowed markers so far are:

- `""`
- `"="`
- `"/"`
- `"|"`

Markers `"/"` and `"|"` are only for use in custom EEx engines and are not implemented by default. Using them without an appropriate implementation raises `EEx.SyntaxError`.

It must return the updated state.

Link to this callback

# handle_text(state, list, text)

View Source

    @callback handle_text(
      state(),
      [line: pos_integer(), column: pos_integer()],
      text :: String.t()
    ) :: state()

Called for the text/static parts of a template.

It must return the updated state.

Link to this callback

# init(opts)

View Source

    @callback init(opts :: keyword()) :: state()

Called at the beginning of every template.

It must return the initial state.

# Functions

Link to this function

# handle_assign(arg)

View Source

    @spec handle_assign(Macro.t()) :: Macro.t()

Handles assigns in quoted expressions.

A warning will be printed on missing assigns. Future versions will raise.

This can be added to any custom engine by invoking `handle_assign/1` with `Macro.prewalk/2`:

    def handle_expr(state, token, expr) do
      expr = Macro.prewalk(expr, &EEx.Engine.handle_assign/1)
      super(state, token, expr)
    end

Link to this function

# handle_begin(state)

View Source

Default implementation for `handle_begin/1`.

Link to this function

# handle_body(state)

View Source

Default implementation for `handle_body/1`.

Link to this function

# handle_end(quoted)

View Source

Default implementation for `handle_end/1`.

Link to this function

# handle_expr(state, marker, ast)

View Source

Default implementation for `handle_expr/3`.

Link to this function

# handle_text(state, meta, text)

View Source

Default implementation for `handle_text/3`.

Link to this function

# init(opts)

View Source

Default implementation for `init/1`.