سؤال

So I have sinatra setup with Rdiscount to render a markdown file with a HAML layout. This all works but I want RDiscount to generate a table of contents based on the headers in my haml file. I've tried setting it in the sinatra configuration.

set :markdown, :generate_toc => true

but that doesn't seem to work.

I've also tried doing it when I render the markdown like so:

markdown :PAGENAMEHERE, :layout => :'layouts/PAGENAMEHERE', :generate_toc => true

which also doesn't work.

Is this even possible? If it is, what am I doing wrong?

هل كانت مفيدة؟

المحلول

While @three's answer helped me a lot, I would like to show a perhaps more general solution:

class MDWithTOC < ::Tilt::RDiscountTemplate
  def flags
    [:generate_toc]
  end
end

Tilt.register MDWithTOC, 'md'

Here we override the flags method of the RDiscount Tilt template handler and regiter it as a handler for the md format.

Now you can use the md helper as always and it will generate the TOC.

نصائح أخرى

This should work:

get '/' do
  text = File.read('README.md')
  markdown = RDiscount.new(text, :generate_toc)
  body = markdown.to_html
  haml :home, :layout => true, :locals => {:body => body}
end

You create the body directly via RDiscount and include it as plain HTML in your HAML layout. Whatever prevented toc creation should work this way natively. I found the solution via https://github.com/mjijackson/markdown/blob/master/app.rb

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top