RDiscount :generate_toc with Sinatra

强颜欢笑 提交于 2020-01-04 09:11:11

问题


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?


回答1:


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.




回答2:


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



来源:https://stackoverflow.com/questions/10965644/rdiscount-generate-toc-with-sinatra

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!