lib/phoenix_webcomponent/markdown.ex

defmodule Phoenix.WebComponent.Markdown do
  @moduledoc """
  Render markdown in to remark-element.

  The remark-element supported markdown featrues:
    * github flavor
    * auto highlight code with lowlight.js and auto detect system light/dark themes.
    * charts render by mermaid.js

  """

  import Phoenix.HTML.Tag

  @doc """
  Generates a html customElement remark-element to preview markdown.

  Docs of remark-element (See https://gsmlg-dev.github.io/lit/?path=/story/gsmlg-remark-element--basic).

  Useful to ensure that links that change data are not triggered by
  search engines and other spidering software.

  ## Examples

      wc_remark("# Hello", class: "dark")
      #=> <remark-element class="dark" content="# Hello"></remark-element>

      wc_remark(content: "# Hello", class: "btn")
      #=> <remark-element class="btn" content="# Hello"></remark-element>

  ## Options

    * `:debug` - print log in browser console

    * `:content` - The content of markdown, replace innerHTML.

  All other options are forwarded to the underlying button input.

  """
  def wc_remark(text, opts) when is_binary(text) and is_list(opts) do
    opts = Keyword.put(opts, :content, text)
    wc_remark(opts)
  end

  def wc_remark(text) when is_binary(text) do
    opts = Keyword.put([], :content, text)
    wc_remark(opts)
  end

  def wc_remark(opts) when is_list(opts) do
    {text, opts} = Keyword.pop(opts, :content, "")
    content_tag(:"remark-element", text, opts)
  end
end