使用Middleman在Markdown中渲染ERb模板的部分

时间:2013-09-20 15:07:12

标签: ruby markdown erb middleman redcarpet

我第一次使用Middleman(以及Ruby和Rails),在使用Redcarpet作为我的降价处理器和ERb进行布局渲染单个页面时,我遇到了一些障碍。 / p>

我想使用Markdown来设置单个内容块的样式,但每个页面都有多个内容,风格独特。

有没有办法在页面的多个区域实例化Redcarpet渲染器,而不是使用partials?所以在index.html.erb中,会出现这样的情况:

<div class="grid5 container">
    <% markdown do %>
    # Some markdown
    <% end %>
</div>

<section class="grid6">
    <% markdown do %>
    ## More markdown
    <% end %>
</section>

我已经尝试构建helper based on several tutorials,但我在Rails方面还不是很好。

修改 我的config.rb帮助器看起来像:

module MD
    def markdown(text)
        Redcarpet.new(text).to_html
    end
end

helpers MD

上面链接的每个ASCIIcast,我的ERb模板使用与上面相似的代码:

<span class="g6 pre3">
<% markdown do %>
...etc...
<% end %>

但是我在加载页面时遇到错误:ArgumentError at /about wrong number of arguments (0 for 1)

5 个答案:

答案 0 :(得分:4)

您定义了降价方法以接收一个名为text的参数。但是你在视图中提供的是一个块。

要使工作正常,您可以更改在视图中调用markdown辅助方法的方式

<%= markdown 'this is some markdown text in here' %>

或者您更改降价助手以接受块

def markdown
  Redcarpet.new(yield).to_html
end

P.S。:自Railscast之后,Redcarpet语法发生了一些变化,所以如果你使用的是更新的gem版本,那么以这种方式实现它将不起作用。

至少从3.3.4开始,也许更早,你必须创建一个特定的渲染器,然后使用markdown作为参数调用render,即

def markdown
   Redcarpet::Render::XHTML.new.render(yield)
end

最新文档可在此处找到:https://github.com/vmg/redcarpet

答案 1 :(得分:1)

我有同样的问题。上面没用。这是一个更简单的解决方案,没有自定义代码。

https://github.com/middleman/middleman/issues/1221#issuecomment-38104894

答案 2 :(得分:1)

这就是我所做的:

helpers do
  def markdown(&block)
    raise ArgumentError, "Missing block" unless block_given?
    content = capture_html(&block)
    concat Tilt['markdown'].new { content }.render
  end
end

它使用默认的Middleman降价渲染。

答案 3 :(得分:1)

帮助将markdown字符串转换为中间人的html

helpers do
    def markdown(content)
        Tilt['markdown'].new(context: @app) { content }.render
    end
end

设置context: @app参数以处理图像,与中间人帮助者链接并避免例外。

答案 4 :(得分:0)

我尝试了几种我在这里找到的方法,没有成功。最后,这是对我有用的解决方案:

def markdown(text)
  require 'redcarpet'
  require 'redcarpet/render_strip'
  markdown = Redcarpet::Markdown.new(Redcarpet::Render::StripDown)
  Markdown.new(text).to_html
end