43
votes

I'm trying to nest markdown in an HTML file while using Jekyll. Is there a way to achieve something like the following?

# index.html

---
layout: default
---


<p>[Stack Overflow](http://www.stackoverflow.com)</p>

Note: I'm aware that I could do this instead.

# index.html

---
layout: default
---


<p><a href="http://www.stackoverflow.com">Stack Overflow</a></p>
7

7 Answers

76
votes

If you are using Kramdown, based on their doc you can do this:

<div markdown="1">
   My text with **markdown** syntax
</div>

And this way, the text within the div is rendered as markdown.

Make sure to use the .md or .markdown extension for the file, as .html files aren't sent to Kramdown for processing!

27
votes

Here's how you can define a markdown block with a Jekyll plugin:

module Jekyll
  class MarkdownBlock < Liquid::Block
    def initialize(tag_name, text, tokens)
      super
    end
    require "kramdown"
    def render(context)
      content = super
      "#{Kramdown::Document.new(content).to_html}"
    end
  end
end
Liquid::Template.register_tag('markdown', Jekyll::MarkdownBlock)

(To install this snippet as a plugin, put it in a *.rb file under _plugins directory of your source site root)

Then, use it like this:

{% markdown %}
[Stack Overflow](http://www.stackoverflow.com)
{% endmarkdown %}

EDIT: See @Cristian's answer for a better solution! If you're using Kramdown (which is likely the case since you are using Jekyll), you can use it's feature to render markdown inside div's with a markdown="1" attribute.

11
votes

As of current Jekyll 3.6.2 life can be a lot simpler with the following two options:

enter image description here

<div>
{{ "## Yes, this renders as markdown" | markdownify }}
</div>

note the markdown-attribute:

<div markdown="1">
## some markdown
inside some html. `snippet` _italic_ **bold**
</div>
9
votes

@sunny-juneja, check out the Liquid Extension Filter called markdownify:

https://github.com/mojombo/jekyll/wiki/liquid-extensions#markdownify

Use it like this:

<p>{{ '[Stack Overflow](http://www.stackoverflow.com)' | markdownify }}</p>

Put single or double quotes around your string inside of the Output tag.

Works for me on Jekyll 1.0.0beta3

3
votes

To convert the markdown-formatted string to HTML in a Jekyll page, there are THREE WAYS can be selected as below:


1. Kramdown:

If you are using Kramdown, based on their doc you can do this:

<div markdown="1">
## Some Markdown Title
Let's have a look. `snippet` _italic_ **bold**
</div>

The markdown attribute:

  • If an HTML tag has an attribute markdown="0", then the tag is parsed as raw HTML block.
  • If an HTML tag has an attribute markdown="1", then the default mechanism for parsing syntax in this tag is used.
  • If an HTML tag has an attribute markdown="block", then the content of the tag is parsed as block level elements.
  • If an HTML tag has an attribute markdown="span", then the content of the tag is parsed as span level elements.

Requirments:

  • The markdown content need to be within the DIV tag.
  • Make sure to use the .md or .markdown extension for the file as .html files aren't sent to Kramdown for processing)

2. Liquid Extension Filter

There is a liquid extension filter called markdownify, it also can help you convert a Markdown-formatted string into HTML.

<div>
{{ "Renders as markdown. `snippet` _italic_ **bold**" | markdownify }}
</div>

3. Jekyll plugin:

jekyll-spaceship - 🚀 A Jekyll plugin to provide powerful supports for table, mathjax, mermaid, plantuml, emoji, youtube, vimeo, dailymotion, etc.

https://github.com/jeffreytse/jekyll-spaceship

With this plugin, it's easy to write markdown inside HTML:

<script type="text/markdown">
# Hybrid HTML with Markdown is a not bad choice ^\_^

##2. Table Usage

| :        Fruits \|\| Food       : |||
| :--------- | :-------- | :--------  |
| Apple      | :  Apple :| Apple      \
| Banana     |   Banana  | Banana     \
| Orange     |   Orange  | Orange     |
| :   Rowspan is 4    : || How's it?  |
|^^    A. Peach         ||   1. Fine :|
|^^    B. Orange        ||^^ 2. Bad   |
|^^    C. Banana        ||  It's OK!  |

## PlantUML Usage

@startuml
Bob -> Alice : hello
@enduml

## Video Usage

![](https://www.youtube.com/watch?v=Ptk_1Dc2iPY)
</script>
2
votes

Take a look at Paul Irish's Gist for a JS code that can interpret sections of your page from Markdown to HTML.

2
votes

I just recently spent way too many hours trying to do something similar. @J.T.'s 2nd bullet point, referencing markdownify, is what ultimately got me moving in the right direction.

I had in my _layouts directory a few different layouts. One of them, I wanted to add a bit of an "index" before the page content. The index was working perfectly as a partial, if I called it directly from a page or post, but not when trying to add it to a layout.

Here's what I had:

---
layout: default
---

<div class="table-of-contents">
  
  {% include series_index.md %}
  
  {{ content }}
</div>

But it wouldn't work. Instead of rendering HTML on the page, the include was spitting out the markdown, which was then being added to the page as an ugly block of markdown, instead of rendering the markdown as HTML.

So, I tried tacking | markdownify to the include statement, like so:

  {% include jekyll-bug-fix-index.md | markdownify %}

and that didn't work.

The solution, using a variable, a capture "block", and markdownify

So, I captured the markdown, saved to a variable, and then rendered the variable with the liquid markdownify tag:

  {% capture index %}
  {% include series_index.md %}
  {% endcapture %}
  
  {{ index | markdownify }}

And this works! The Markdown is rendered as HTML on my pages, and all is right in the world.

I have no doubt this is unconventional, and I hope to someday learn a better solution, but it's 100% good enough for me, and I wanted to share so others might benefit from this.