Spec-Zone.ru › Phoenix

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}
]

Пакет Hex Предпросмотр Hex Просмотреть llms.txt Скачать версию ePub

Создано с помощью ExDoc (v0.40.3) для языка программирования Elixir

© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix-live-view.hexdocs.pm/Phoenix.LiveView.HTMLFormatter.TagFormatter.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API