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