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



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

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

除了使用部分,有没有办法在页面的多个区域实例化 Redcarpet 渲染器?所以在index.html.erb,会有这样的东西:

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

我尝试基于几个教程构建一个帮助程序,但我还不太擅长 Rails。

编辑我的 config.rb 助手看起来像:

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

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

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

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

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

若要使事情正常工作,可以更改在视图中调用 markdown 帮助程序方法的方式

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

或者您更改了降价助手以接受阻止

def markdown
  Redcarpet.new(yield).to_html
end

PS:自 Railscast 以来,Redcarpet 语法发生了一些变化,所以如果你使用的是更新的 gem 版本,以这种方式实现它是行不通的。

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

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

最新的文档可以在这里找到:https://github.com/vmg/redcarpet

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

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

这是我所做的:

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

它使用默认的中间人降价渲染。

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

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

设置context: @app参数以处理图像,与中间人助手的链接并避免异常。

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

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

相关内容

  • 没有找到相关文章

最新更新