Рендеринг разделов шаблонов ERb в Markdown с Middleman
Я использую Middleman (и Ruby, и Rails) впервые, и я столкнулся с некоторыми препятствиями, когда дело доходит до рендеринга отдельных страниц с использованием Redcarpet в качестве моего процессора уценки и 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)
5 ответов
Вы определили свой метод уценки для получения одного параметра с именем text
, Но то, что вы предоставляете в ваших взглядах, является блоком.
Чтобы все заработало, вы должны либо изменить способ вызова markdown
вспомогательный метод в представлении
<%= markdown 'this is some markdown text in here' %>
или вы меняете помощника по уценке, чтобы принять блок
def markdown
Redcarpet.new(yield).to_html
end
PS: Синтаксис Redcarpet немного изменился со времен Railscast, поэтому, если вы используете более свежую версию гема, его реализация не будет работать.
Начиная, по крайней мере, с 3.3.4, возможно, раньше, вы должны создать определенный рендерер, а затем вызвать рендер для него с уценкой в качестве аргумента, т.е.
def markdown
Redcarpet::Render::XHTML.new.render(yield)
end
Актуальную документацию можно найти здесь: https://github.com/vmg/redcarpet
Помощник для преобразования markdown
Строка в HTML в посреднике
helpers do
def markdown(content)
Tilt['markdown'].new(context: @app) { content }.render
end
end
Задавать context: @app
аргумент для обработки изображений, ссылки с помощниками посредников и избегать исключений.
Вот что я сделал:
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.
Я была такая же проблема. Выше не сработало. Это гораздо более простое решение без специального кода.
Я попробовал несколько методов, которые я нашел здесь, но безуспешно. Наконец, это решение, которое сработало для меня:
def markdown(text)
require 'redcarpet'
require 'redcarpet/render_strip'
markdown = Redcarpet::Markdown.new(Redcarpet::Render::StripDown)
Markdown.new(text).to_html
end