aayushmau5

aayushmau5

LiveView + MDEx: How do I use phoenix components in render function?

Hi there! With the release of MDEx v0.11.0 which adds support for Phoenix components. I have been trying to render the markdown with phoenix components in it, but I’m not able to do that.

Here’s how my system is working:

I have some markdown files that roughly look like this:

%{ title: "First blog", description: "a description" }
---

# Hello World

<.button>This is a button</.button>

and I use nimble_publisher with MDEx to compile these markdown files into HTML:

# Using Nimble publisher
defmodule MyApp.Blog do
  use NimblePublisher,
    build: MyApp.Blog.Article,
    from: Application.app_dir(:my_app, "priv/posts/*.md"),
    as: :blogs,
    html_converter: MyApp.Converter

  def all_blogs, do: @blogs
end

# MyApp.Blog.Article 
defmodule MyApp.Blog.Article do
  defstruct title: "",,
            description: "",
            body: ""

  def build(filepath, attrs, body) do

    struct!(
      __MODULE__,
      [body: body] ++ Map.to_list(attrs)
    )
  end
end

# MyApp.Converter
defmodule MyApp.Converter do
  def convert(_path, body, attrs, _opts) do
    MDEx.to_html!(body, extension: [phoenix_heex: true, autolink: true, header_ids: ""])
  end
end

Here’s how the compiled markdown looks like:

<h1><a href=\"#hello-world\" aria-hidden=\"true\" class=\"anchor\" id=\"hello-world\"></a>Hello World</h1>\n<.button>This is a button</.button>

And In my LiveView, I don’t have any idea how to get Phoenix to render the components:

defmodule MyApp.BlogLive.Show do
  use MyAppWeb, :live_view

  alias MyApp.Blog

  @impl true
  def mount(_params, _session, socket) do
    [blog] = Blog.all_blogs()
    %{body: body} = blog

    {:ok, socket |> assign(body: body)}
  end

  @impl true
  def render(assigns) do
    ~H"""
    <Layouts.app>
      {raw(@body)}
    </Layouts.app>
    """
  end
end

I understand that raw function won’t work because It’ll just render the HTML part.

How do I get Phoenix to render the HTML along with Phoenix components here?

Any help is appreciated!

Most Liked

leandrocp

leandrocp

Working on a new function to make the integration with nimble_publisher, tableau, and SSG more straightforward. To be released very soon.

Where Next?

Popular in Questions Top

electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
Emily
I have VueJS GUIs with the project generated using Webpack. I have Elixir modules that will need to be used by the VueJS GUIs. I forese...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

Other popular topics Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" =&gt; #BSON.ObjectId&lt;58eb1a7a9ad169198c3dXXXX&gt;, "email" =&gt; ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New

We're in Beta

About us Mission Statement