Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Render span-level string using Kramdown

Tags:

ruby

kramdown

I know that I can parse and render an HTML document with Kramdown in ruby using something like

require 'kramdown'

s = 'This is a _document_'
Kramdown::Document.new(s).to_html
# '<p>This is a <i>document</i></p>'

In this case, the string s may contain a full document in markdown syntax.

What I want to do, however, is to parse s assuming that it only contains span-level markdown syntax, and obtain the rendered html. In particular there should be no <p>, <blockquote>, or, e.g., <table> in the rendered html.

s = 'This is **only** a span-level string'
# .. ??? ...
# 'This is <b>only</b> a span-level string'

How can I do this?

like image 377
Juan A. Navarro Avatar asked Apr 28 '26 17:04

Juan A. Navarro


2 Answers

I would post-process the output with the sanitize gem.

require 'sanitize'

html = Kramdown::Document.new(s).to_html
output = Sanitize.fragment(html, elements:['b','i','em'])

The elements are a whitelist of allowed tags, just add all the tags you want. The gem has a set of predefined whitelists, but none match exactly what you're looking for. (BTW, if you want a list of all the HTML5 elements allowed in a span, see the WHATWG's list of "phrasing content").

I know this wasn't tagged rails, but for the benefit of readers using Rails: use the built-in sanitize helper.

like image 68
Mark Thomas Avatar answered Apr 30 '26 11:04

Mark Thomas


You can create a custom parser, and empty its internal list of block-level parsers.

class Kramdown::Parser::SpanKramdown < Kramdown::Parser::Kramdown
  def initialize(source, options)
    super
    @block_parsers = []
  end
end

Then you can use it like this:

text = Kramdown::Document.new(text, :input => 'SpanKramdown').to_html

This should do what you want "the right way".

like image 45
rr- Avatar answered Apr 30 '26 10:04

rr-



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!