Packages
mdex
0.4.3
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/heex.exs
Mix.install([
{:mdex, path: ".."},
{:phoenix_live_view, "~> 1.0"},
{:html_entities, "~> 0.5"}
])
defmodule MDEx.HEEx 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
defp 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()
|> IO.iodata_to_binary()
end
def to_html!(markdown, assigns \\ %{}) do
opts = [
extension: [
strikethrough: true,
tagfilter: true,
table: true,
tasklist: true,
footnotes: true,
shortcodes: true
],
parse: [
relaxed_tasklist_matching: true
],
render: [
unsafe_: true
]
]
markdown
|> MDEx.to_html!(opts)
|> unescape()
|> render_heex!(assigns)
end
defp render_heex!(html, assigns) do
env = env()
opts = [
source: html,
engine: Phoenix.LiveView.TagEngine,
tag_handler: Phoenix.LiveView.HTMLEngine,
file: "nofile",
caller: env,
line: 1,
indentation: 0
]
{rendered, _} =
html
|> EEx.compile_string(opts)
|> Code.eval_quoted([assigns: assigns], env)
rendered
|> Phoenix.HTML.Safe.to_iodata()
|> IO.iodata_to_binary()
end
defp env do
import Phoenix.Component, warn: false
__ENV__
end
end
markdown = """
# Phoenix HEEx Example
## Examples
`@path = <%= @path %>`
* `.link` with `:href` expression - <.link href={URI.parse("https://elixir-lang.org")}>link to elixir-lang.org</.link>
* `.link` with an @assign - <.link href={@path}>link to @path</.link>
```php
<?php echo 'Hello, World!'; ?>
```
```heex
<%= @hello %>
{ @hello }
```
Elixir was created by José Valim.
"""
html = MDEx.HEEx.to_html!(markdown, %{path: "https://elixir-lang.org"})
File.write!("heex.html", html)
IO.puts(html)