Packages
mdex
0.3.2
0.13.4
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
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
examples/live_view.exs
Mix.install([
{:mdex, path: ".."},
{:phoenix_live_view, "~> 1.0"},
{:phoenix_playground, "~> 0.1"},
{:html_entities, "~> 0.5"}
])
defmodule MDEx.LiveView do
# unescape all but <pre> tags
# MDEx eventually should mark which tags must be preserved
# instead of trying to guess it, but it works
# for a simple example or for simple use cases
def unescape(html) do
~r/(<pre.*?<\/pre>)/s
|> Regex.split(html, include_captures: true)
|> Enum.map(fn part ->
if String.starts_with?(part, "<pre") do
part
else
HtmlEntities.decode(part)
end
end)
|> Enum.join()
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
# manipulate MDEx options here
opts = [
extension: [
strikethrough: true,
tagfilter: true,
table: true,
tasklist: true,
footnotes: true,
shortcodes: true
],
parse: [
relaxed_tasklist_matching: true
],
render: [
unsafe_: true
]
]
md =
expr
|> MDEx.to_html!(opts)
|> MDEx.LiveView.unescape()
|> 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>
```php
<?php echo 'Hello, World!'; ?>
```
```heex
<%= @hello %>
{ @hello }
```
Elixir was created by José Valim.
"""
end
end
PhoenixPlayground.start(live: DemoLive)