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

Я попытался создать помощник на основе несколько tutorials, но я пока не очень хорошо разбираюсь в 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)


person bigsweater    schedule 20.09.2013    source источник
comment
Я на самом деле не очень понимаю вашу проблему? Почему помощник, встроенный, например, в Railscast, не работает несколько раз в представлении? Да, пересоздавать рендерер для каждого раздела Markdown не очень эффективно, но ведь должно работать, верно? Или вы хотите знать, как сделать его более эффективным?   -  person lawitschka    schedule 20.09.2013
comment
На самом деле он вообще не работает, и я не могу понять, почему. Я обновлю вопрос с помощью кода, который я использую, и ошибки, которую я получаю...   -  person bigsweater    schedule 20.09.2013
comment
Хорошо, давайте сделаем это, а потом посмотрим!   -  person lawitschka    schedule 20.09.2013
comment
@lawitschka Обновлено, чтобы включить немного больше информации о самом коде.   -  person bigsweater    schedule 20.09.2013
comment
Ошибка «неправильное количество аргументов» указывает конкретно на строку, в которой указано def markdown(text).   -  person bigsweater    schedule 20.09.2013


Ответы (5)


Вы определили свой метод уценки для получения одного параметра с именем text. Но то, что вы предоставляете в своих представлениях, является блоком.

Чтобы все заработало, вы либо меняете способ вызова вспомогательного метода markdown в представлении

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

или вы меняете помощник уценки, чтобы принять блок

def markdown
  Redcarpet.new(yield).to_html
end

P.S.: Синтаксис Redcarpet немного изменился со времен Railscast, поэтому, если вы используете более позднюю версию gem, реализовать его таким образом не получится.

Начиная как минимум с 3.3.4, а может и раньше, приходится создавать конкретный рендерер и потом вызывать на нем рендер с уценкой в ​​качестве аргумента, т.е.

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

Актуальную документацию можно найти здесь: https://github.com/vmg/redcarpet

person lawitschka    schedule 20.09.2013
comment
На самом деле я попробовал что-то похожее на ваш последний пример, основываясь на исходной документации (и статья, связанная с ним), но не удалось заставить его работать. def выше приводит к ошибке, поэтому я спрятал ее за помощником, как вы можете видеть на pastebin. Помощник возвращает текст, но так же, как обычный текст — без синтаксического анализа уценки. Какого черта я делаю неправильно? Я вообще подхожу к этому с правильного угла? - person bigsweater; 21.09.2013
comment
На самом деле создал суть, ради извлечений и разветвлений. Описание сути должно помочь объяснить, чего я пытаюсь достичь. - person bigsweater; 21.09.2013
comment
Я только что обнаружил, выполнив puts markdown.render(yield) из вышеизложенного, что Redcarpet обрабатывает блок; Я просто не уверен, как заменить необработанный блок обработанным. - person bigsweater; 22.09.2013
comment
Так же, как вы сделали это в своем вопросе выше. Используйте теги ERB в своем представлении и поместите уценку в свой блок. Не забудьте использовать тег ERB со знаком равенства, т. е. ‹%= %›. В противном случае результат метода не будет отображаться в вашем представлении. - person lawitschka; 22.09.2013
comment
Я так и сделал, но получаю странную синтаксическую ошибку: /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 ')' Запутанно, потому что нет ) в строке 2 файла about.erb и keyword_ensure в строке 68. - person bigsweater; 22.09.2013
comment
Я создал Gist для Redcarpet в Rails. Таким образом, это работает с Rails. gist.github.com/lawitschka/6667570. Я попробовал то же самое с Миддлманом и получил ту же ошибку, что и вы. Он пытается оценить ERB, но не захватывает весь блок, а останавливается в конце тега ERB. Похоже на ошибку в геме Tilt (т.е. рендерере ERB) или Tilt просто не поддерживает блоки ERB. При использовании HAML это сработало... - person lawitschka; 23.09.2013
comment
Хм. Я тогда зарегистрирую ошибку. ERB — это один из языков шаблонов, с которым Middleman создан для использования, поэтому я не понимаю, почему он не поддерживает блоки ERB… опять же, я новичок в этом деле. Большое спасибо за расследование. - person bigsweater; 24.09.2013

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

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

person don.najd    schedule 19.03.2014

Вот что я сделал:

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 по умолчанию.

person danigb    schedule 01.10.2014

Помощник для преобразования строки markdown в html в посреднике

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

Установите аргумент context: @app, чтобы обрабатывать изображения, ссылки с помощниками посредников и избегать исключений.

person Atika    schedule 31.01.2018

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

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