Phoenix.LiveView.HTMLFormatter.TagFormatter поведение
Исходный кодПоведение для форматирования определённых тегов.
Краткое описание
- render_tag(tag, opts)
Обратный вызов, вызываемый для форматирования каждого тега.
Обратные вызовы
Обратные вызовы
render_tag(tag, opts)Исходный код
@callback render_tag(
tag :: {String.t(), map(), String.t()},
opts :: keyword()
) :: {:ok, String.t()} | :skip Обратный вызов, вызываемый для форматирования каждого тега.
Обратный вызов получает кортеж {tag_name, attrs, content} и параметры форматирования Mix .
Примечание: поскольку форматировщик не компилирует код, атрибут :type макрокомпонента передаётся в виде строки, как в шаблоне. Если вы создали псевдоним для Phoenix.LiveView.ColocatedHook, вы получите версию с псевдонимом в виде строки. Например:
<script :type={ColocatedHook} manifest="foo.ts">
export default {
mounted() {
console.log("mounted");
}
}
</script>
вызовет обратный вызов со следующими данными:
-
{tag_name, attrs, content}, гдеtag_nameравно"script", attrs — это%{"manifest" => "foo.ts", ":type" => "ColocatedHook"}, аcontent— строковое содержимое внутри тега<script> - opts:
[file: "/path/to/template.html.heex", line: ...]параметры форматирования Mix .
Пример форматирования с помощью prettier
defmodule Prettier do
@moduledoc false
@behaviour Phoenix.LiveView.HTMLFormatter.TagFormatter
require Logger
@impl true
def render_tag({"script", attrs, content}, _opts) do
suffix =
case attrs do
%{":type" => _} ->
# assume ColocatedHook / ColocatedJS and check for extension in manifest attribute
Map.get(attrs, "manifest", "index.js")
_ ->
"tmp.js"
end
tmp_file =
Path.join(System.tmp_dir!(), "prettier_#{System.unique_integer([:positive])}_#{suffix}")
try do
File.write!(tmp_file, content)
# This example assumes that your project has prettier installed as a dependency
# in your package.json. If not, you should pin prettier to a specific version like
# "prettier@3.8.1" to avoid potential issues when prettier updates.
case System.cmd("npx", ["prettier", tmp_file], stderr_to_stdout: true) do
{output, 0} ->
{:ok, String.trim(output)}
{error, _} ->
Logger.error("Failed to format with prettier: #{error}")
:skip
end
after
File.rm(tmp_file)
end
end
end
# .formatter.exs
[
plugins: [Phoenix.LiveView.HTMLFormatter],
tag_formatters: %{script: Prettier}
]
© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix-live-view.hexdocs.pm/Phoenix.LiveView.HTMLFormatter.TagFormatter.html