Do you want to pick up from where you left of?
Take me there

Embedded Elixir (EEx)

Tak jak w Ruby mamy ERB, a w Javie istnieje JSP, tak i Elixir ma EEx - Embedded Elixir. Dzięki EEx możemy osadzać kod Elixira w ciągach znaków.

API

API EEx pozwala na pracę zarówno z ciągami znaków jak i plikami. Jest ono podzielone na trzy główne komponenty: prostą ewaluację, definiowanie funkcji i kompilację do AST Elixira.

Ewaluacja

Używając funkcji eval_string/3 i eval_file/2 możemy ewaluować ciągi znaków jak i pliki. Jest to najprostsze podejście, ale też najwolniejsze ponieważ kod jest tylko interpretowany, a nie kompilowany.

iex> EEx.eval_string "Hi, <%= name %>", [name: "Sean"]
"Hi, Sean"

Definiowanie funkcji

Najszybszą, i preferowaną, metodą użycia EEx jest osadzenie szablonu w module dzięki czemu można go skompilować. By to zrobić potrzebujemy w czasie kompilacji modułu pliku z szablonem oraz makr function_from_string/5 i function_from_file/5.

Przenieśmy nasze powitanie do osobnego pliku, szablonu, i zdefiniujmy dla niego funkcję w module:

# greeting.eex
Hi, <%= name %>

defmodule Example do
  require EEx
  EEx.function_from_file(:def, :greeting, "greeting.eex", [:name])
end

iex> Example.greeting("Sean")
"Hi, Sean"

Kompilacja

W końcu, EEx pozwala nam na bezpośrednie stworzenie AST Elixira z ciągu znaków lub z pliku za pomocą funkcji, odpowiednio compile_string/2 i compile_file/2. Funkcje te są przede wszystkim używane przez wyżej opisane API, ale są też dostępne jeżeli chcemy stworzyć własną obsługę wbudowanego Elixira.

Znaczniki

Domyślnie EEx wspiera cztery znaczniki:

<% Wyrażenie Elixir - wywołanie zwracające wartość %>
<%= Wyrażenie Elixir - zamieniane na rezultat wyrażenia %>
<%% Wyrażenie EEx - wartość po ewaluowacji wyrażenia %>
<%# Komentarz - usuwany ze źródła %>

Wszystkie wyrażenia, które coś zwracają muszą używać znaku równości (=). Ważną rzeczą jest to, że w przeciwieństwie do innych języków szablonów EEx nie traktuje wyrażeń w rodzaju if w specjalny sposób. Bez znaku = nic nie zostanie wyświetlone:

<%= if true do %>
  jeżeli prawda
<% else %>
  jeżeli fałsz
<% end %>

Silnik

Domyślnie Elixir używa silnika EEx.SmartEngine, który zawiera wsparcie dla przypisywania zmiennych (na przykład @name):

iex> EEx.eval_string "Hi, <%= @name %>", assigns: [name: "Sean"]
"Hi, Sean"

Przypisania obecne w EEx.SmartEngine są bardzo przydatne ponieważ pozwalają wprowadzać zmiany bez konieczności rekompilacji szablonu.

Zainteresowany stworzeniem własnego silnika? Sprawdź jak działa EEx.Engine by zobaczyć co jest wymagane.

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!