【问题标题】:Rendering sections of ERb templates in Markdown with Middleman使用 Middleman 在 Markdown 中渲染 ERb 模板的部分
【发布时间】:2013-09-20 15:07:11
【问题描述】:

我是第一次使用 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>

我尝试构建一个helperbased onseveraltutorials,但我还不太擅长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)

【问题讨论】:

  • 我实际上并没有真正理解您的问题?例如,为什么 Railscast 中内置的帮助器在一个视图中不能多次工作?是的,为每个 Markdown 部分重新创建渲染器的性能不是很好,但它应该可以工作,对吧?或者您想知道如何提高效率?
  • 实际上,它根本不起作用,我也不知道为什么。我将使用我正在使用的代码和我遇到的错误更新问题......
  • 好的,让我们这样做,然后我们会看到!
  • @lawitschka 已更新以包含有关代码本身的更多信息。
  • “参数数量错误”错误专门指向显示def markdown(text) 的行。

标签: ruby markdown erb middleman redcarpet


【解决方案1】:

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

要使事情正常进行,您可以更改在视图中调用 markdown 辅助方法的方式

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

或者你改变markdown助手来接受一个块

def markdown
  Redcarpet.new(yield).to_html
end

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

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

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

【讨论】:

  • 我实际上也尝试了类似于您的后一个示例的方法,基于原始文档(和an article linked from it),但无法使其正常工作。上面的def 会导致错误,所以我将它隐藏在一个助手as you can see on pastebin 后面。助手返回文本,但就像纯文本一样——没有降价解析。我到底做错了什么?我是否从正确的角度来处理这个问题?
  • 实际上创建了a gist,为了拉动和分叉。要点的描述应该有助于解释我要完成的工作。
  • 我刚刚从上述要点中通过puts markdown.render(yield) 发现 Redcarpet 正在处理该块;我现在只是不确定如何用已处理的块替换未处理的块。
  • 就像您在上面的问题中所做的那样。在您的视图中使用 ERB 标签并将降价放在您的块中。请记住使用带有等号的 ERB 标签,即 。否则该方法的结果将不会显示在您的视图中。
  • 我这样做了,但我得到了一个奇怪的语法错误:/path/to/about.html.erb:2: syntax error, unexpected ')' ; @_out_buf.concat(( md do ).to_s) ^ /path/to/about.html.erb:66: syntax error, unexpected keyword_ensure, expecting ')' /path/to/about.html.erb:68: syntax error, unexpected keyword_end, expecting ')' 令人困惑,因为 about.erb 的第 2 行没有 ),第 68 行也没有 keyword_ensure
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这就是我所做的:

    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 markdown 渲染。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-06-03
          • 2014-01-24
          • 1970-01-01
          • 1970-01-01
          • 2011-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-11
          相关资源
          最近更新 更多