Жемчужина Redcarpet Markdown: создание экземпляра объекта Markdown только один раз и повторное использование его между разборами

Я читал документацию от Redcarpet и наткнулся на это предложение:

The Markdown object is encouraged to be instantiated once with the required settings, and reused between parses.

Как лучше всего сделать это в приложении Rails?

Я смотрел рельсовую трансляцию Райана Бейтса на Redcarpet, и у него есть вспомогательный метод в application_helper.rb, где каждый вызов метода создает экземпляр нового объекта Redcarpet, например так:

def markdown(text)
  options = [:hard_wrap, :filter_html, :autolink, :no_intraemphasis, :fenced_code, :gh_blockcode]
  Redcarpet.new(text, *options).to_html.html_safe
end

Разве это не лучший способ сделать это? Спасибо за любой совет.


person Kurt Mueller    schedule 14.08.2013    source источник


Ответы (1)


Не уверен, что это способ работы rails, но он выглядит нормально и не нарушает POLA или тому подобное, поэтому, надеюсь, он удовлетворит ваши потребности.

Создайте файл markdown.rb в папке config/initializers/ и используйте вариант следующего фрагмента кода:

class MultiRenderer < Redcarpet::Render::HTML
  include Redcarpet::Render::SmartyPants
end

module Paradox
  Markdown = Redcarpet::Markdown.new(MultiRenderer)
end

Замените Paradox на имя вашего приложения. Вы можете добавить различные параметры к средству визуализации или экземпляру уценки, как описано в файле readme. Созданный мной рендерер (MultiRenderer) имеет встроенные умные штаны, поэтому вы можете округлять кавычки и еще много чего.

Чтобы использовать Markdown, просто вызовите YourApp::Markdown.render(text), и вы получите обратно html. Вам, вероятно, нужно запустить html_safe для этого.

person paradox460    schedule 14.09.2013
comment
Является ли этот глобальный поток рендерера безопасным? Очень важно при использовании многопоточных сред, таких как Puma или Sidekiq. - person mpoisot; 27.09.2013
comment
может ли кто-нибудь подтвердить, является ли потокобезопасным использование объекта redcarpet между несколькими потоками. например: с тонким или пума?? - person Arun Satyarth; 08.02.2016
comment
Я протестировал его с помощью простого скрипта, используя concurrent-ruby и защелки, и он кажется потокобезопасным, поскольку уценка рендеринга не влияет на средство рендеринга уценки (вы можете проверить это, заморозив свой объект уценки) - person paradox460; 11.02.2016