From af618eaa458b769804ad0a405703c96fc62e38aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Thu, 29 Jun 2023 17:39:51 +0200 Subject: [PATCH] Extract markdown helper logic to a class This way it'll be easier for other Consul installations to overwrite parts of the code, like the default options. --- app/helpers/application_helper.rb | 21 +---------- app/models/legislation/draft_version.rb | 6 ++-- lib/markdown_converter.rb | 48 +++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 24 deletions(-) create mode 100644 lib/markdown_converter.rb diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index d5afea8cca2..1377b27d2be 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -11,26 +11,7 @@ def rtl?(locale = I18n.locale) end def markdown(text, **render_options) - return text if text.blank? - - default_render_options = { - filter_html: false, - hard_wrap: true, - link_attributes: { target: "_blank" } - } - renderer = Redcarpet::Render::HTML.new(default_render_options.merge(render_options)) - - extensions = { - autolink: true, - fenced_code_blocks: true, - lax_spacing: true, - no_intra_emphasis: true, - strikethrough: true, - superscript: true, - tables: true - } - - AdminLegislationSanitizer.new.sanitize(Redcarpet::Markdown.new(renderer, extensions).render(text)) + MarkdownConverter.new(text, **render_options).render end def wysiwyg(text) diff --git a/app/models/legislation/draft_version.rb b/app/models/legislation/draft_version.rb index f470a51f109..b36cb688a71 100644 --- a/app/models/legislation/draft_version.rb +++ b/app/models/legislation/draft_version.rb @@ -22,13 +22,11 @@ class Legislation::DraftVersion < ApplicationRecord scope :published, -> { where(status: "published").order("id DESC") } def body_html - ApplicationController.helpers.markdown(body, with_toc_data: true) + MarkdownConverter.new(body, with_toc_data: true).render end def toc_html - renderer = Redcarpet::Render::HTML_TOC.new(with_toc_data: true) - - Redcarpet::Markdown.new(renderer).render(body) + MarkdownConverter.new(body).render_toc end def display_title diff --git a/lib/markdown_converter.rb b/lib/markdown_converter.rb new file mode 100644 index 00000000000..d5d9845f096 --- /dev/null +++ b/lib/markdown_converter.rb @@ -0,0 +1,48 @@ +class MarkdownConverter + attr_reader :text, :render_options + + def initialize(text, **render_options) + @text = text + @render_options = render_options + end + + def render + return text if text.blank? + + AdminLegislationSanitizer.new.sanitize(Redcarpet::Markdown.new(renderer, extensions).render(text)) + end + + def render_toc + Redcarpet::Markdown.new(toc_renderer).render(text) + end + + private + + def renderer + Redcarpet::Render::HTML.new(default_render_options.merge(render_options)) + end + + def toc_renderer + Redcarpet::Render::HTML_TOC.new(with_toc_data: true) + end + + def default_render_options + { + filter_html: false, + hard_wrap: true, + link_attributes: { target: "_blank" } + } + end + + def extensions + { + autolink: true, + fenced_code_blocks: true, + lax_spacing: true, + no_intra_emphasis: true, + strikethrough: true, + superscript: true, + tables: true + } + end +end