Smarky
Smarky takes Markdown and turns it into structured (as opposed to flat) HTML.
This is easier to show than to explain. Say we have this Markdown:
# The Trial
## Chapter 1
Someone must have been telling lies about Josef K. [...]
## Chapter 2
K. was informed by telephone [...]
Traditional Markdown renderers will translate this to the following HTML:
<h1>The Trial</h1>
<h2>Chapter 1</h2>
<p>Someone must have been telling lies about Joseph K. [...]</p>
<h2>Chapter 2</h2>
<p>K. was informed by telephone [...]</p>
This is flat. Smarky will produce this instead:
<article id="the-trial">
<h1>The Trial</h1>
<section id="chapter-1">
<h2>Chapter 1</h2>
<p>Someone must have been telling lies about Joseph K. [...]</p>
</section>
<section id="chapter-2">
<h2>Chapter 2</h2>
<p>K. was informed by telephone [...]</p>
</section>
</article>
Usage
article = Smarky.parse('This is some *sweet* Markdown.')
# => a Smarky::Element representing the top-level <article>
article.children
# => an array of Smarky::Element objects (w/ #to_html and #inner_html methods)
article.sections
# => an array of just the child sections (useful for, e.g., a table of contents)
article.to_html
# => the structured HTML
article.to_html(:omit_titles => true)
# => if you want to exclude the <h1>, <h2>, etc. tags from the HTML output
article.inner_html
# => if you want to inject the HTML into an existing container
Choosing a Markdown renderer
Smarky lets you pick which Markdown renderer you want to use. Right now you have three options:
To specify a renderer, pass an options hash with :markdown_renderer
to Smarky.parse
:
Smarky.parse(markdown, :markdown_renderer => :kramdown)
Obviously, you'll need the appropriate gem installed in order to use it (Smarky doesn't eagerly specify a dependency on any of them). The default is currently Redcarpet.