Рендеринг разделов шаблонов 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.

Я была такая же проблема. Выше не сработало. Это гораздо более простое решение без специального кода.

https://github.com/middleman/middleman/issues/1221

Я попробовал несколько методов, которые я нашел здесь, но безуспешно. Наконец, это решение, которое сработало для меня:

def markdown(text)
  require 'redcarpet'
  require 'redcarpet/render_strip'
  markdown = Redcarpet::Markdown.new(Redcarpet::Render::StripDown)
  Markdown.new(text).to_html
end
Другие вопросы по тегам