tech::hexagram

personal note for technical issue.

EExでタグをエスケープする場合には%を重ねる

koseki.hatenablog.com

こちらを見てピンときたので、Elixirの EEx でも確認した所同様にできるのでメモ。

foo <%= bar %>

例えば、これをそのまま出力したい場合。

iex(1)> EEx.eval_string("foo <%%= bar %>")
"foo <%= bar %>"
iex(2)> EEx.eval_string("foo <%%= bar %>", [bar: "piyo"])
"foo <%= bar %>"

エスケープした場合第二引数の bindingsbarアサインしようとしてもそのまま出力される。

<% %> についてもそのまま出力したい場合は前方の % を2つ重ねればよい。

foo <% bar %>
iex(3)> EEx.eval_string("foo <%% bar %>")
"foo <% bar %>"

後方の % だけ2つ重ねるとエラーが出るので要注意。

iex(3)> EEx.eval_string("foo <% bar %%>")
** (TokenMissingError) nofile:1: syntax error: expression is incomplete
    lib/eex/compiler.ex:45: EEx.Compiler.generate_buffer/4
    lib/eex.ex:196: EEx.eval_string/3
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (iex) lib/iex/evaluator.ex:245: IEx.Evaluator.handle_eval/5
    (iex) lib/iex/evaluator.ex:225: IEx.Evaluator.do_eval/3
    (iex) lib/iex/evaluator.ex:203: IEx.Evaluator.eval/3

両方の % を重ねると、後半だけ重ねた状態でそのまま出力される。これを利用することはないとは思うが、挙動だけ覚えておいたほうが良さそう。

iex(4)> EEx.eval_string("foo <%% bar %%>")
"foo <% bar %%>"

プログラミングElixir

プログラミングElixir