Packages
mdex
0.2.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.5
retired
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Fast and extensible Markdown for Elixir
Current section
Files
Jump to
Current section
Files
examples/live_view.exs
Mix.install([
{:mdex, path: ".."},
{:phoenix_live_view, "~> 0.20"},
{:phoenix_playground, "~> 0.1"}
])
defmodule MDEx.LiveView do
# unescape HTML entities
# https://github.com/sasa1977/erlangelist/blob/c5ddea9180732e56095b1a20b930dd5f686a62c0/site/lib/erlangelist/web/blog/code_highlighter.ex#L48-L62
entities = [{"&", ?&}, {"<", ?<}, {">", ?>}, {""", ?"}, {"'", ?'}]
for {encoded, decoded} <- entities do
def unescape_html(unquote(encoded) <> rest) do
[unquote(decoded) | unescape_html(rest)]
end
end
def unescape_html(<<c, rest::binary>>) do
[c | unescape_html(rest)]
end
def unescape_html(<<>>) do
[]
end
# https://github.com/phoenixframework/phoenix_live_view/blob/1b1c9bc5e24fbb01dad24ce29279f852cf0ae6f6/lib/phoenix_component.ex#L791
defmacro sigil_M({:<<>>, meta, [expr]}, []) do
unless Macro.Env.has_var?(__CALLER__, {:assigns, nil}) do
raise "~M requires a variable named \"assigns\" to exist and be set to a map"
end
md =
expr
# manipulate MDEx options here
|> MDEx.to_html!()
|> MDEx.LiveView.unescape_html()
|> IO.iodata_to_binary()
options = [
engine: Phoenix.LiveView.TagEngine,
file: __CALLER__.file,
line: __CALLER__.line + 1,
caller: __CALLER__,
indentation: meta[:indentation] || 0,
source: md,
tag_handler: Phoenix.LiveView.HTMLEngine
]
EEx.compile_string(md, options)
end
end
defmodule DemoLive do
use Phoenix.LiveView
use Phoenix.Component
import MDEx.LiveView
def mount(_params, _session, socket) do
{:ok, assign(socket, path: "/?hello=world")}
end
def handle_params(_params, uri, socket) do
IO.puts("Received a patch request to #{uri}")
{:noreply, socket}
end
def render(assigns) do
~M"""
# Phoenix LiveView Example
Convert this markdown into a [Phoenix.LiveView.Rendered](https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.Rendered.html) struct.
## Examples
* `.link` with `:href` expression - <.link href={URI.parse("https://elixir-lang.org")}>link to elixir-lang.org</.link>
* `.link` with an @assign in `:patch` (see console logs) - <.link patch={@path}>link to @path</.link>
"""
end
end
PhoenixPlayground.start(live: DemoLive)