From 0139f71bf27d332c5564de82088e1b6adafce154 Mon Sep 17 00:00:00 2001 From: Jose Farias Date: Wed, 18 Dec 2024 16:37:33 -0600 Subject: [PATCH] Use redcarpet as markdown renderer --- Gemfile | 4 +- Gemfile.lock | 14 ++---- config/initializers/markdown.rb | 2 +- lib/markdown_renderer.rb | 69 ++++++++++++++------------- lib/rails_ext/action_text_markdown.rb | 12 ++++- 5 files changed, 51 insertions(+), 50 deletions(-) diff --git a/Gemfile b/Gemfile index c1cc15622..18f89bdc3 100644 --- a/Gemfile +++ b/Gemfile @@ -10,7 +10,6 @@ gem "propshaft" gem "stimulus-rails" gem "turbo-rails" gem "hotwire_combobox", github: "josefarias/hotwire_combobox", branch: :main -gem "house_md", bc: "house", branch: :renderer # Deployment and drivers gem "bootsnap", require: false @@ -21,7 +20,8 @@ gem "thruster", require: false # Features gem "bcrypt", "~> 3.1.7" gem "rqrcode" -gem "rouge", "~> 4.5" +gem "redcarpet" +gem "rouge" gem "jbuilder" # Telemetry diff --git a/Gemfile.lock b/Gemfile.lock index 4cfbbd656..0b8769eb0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,12 +1,3 @@ -GIT - remote: https://github.com/basecamp/house - revision: a8b19e70bbb95a7a0d27e38985a99c2d697a6650 - branch: renderer - specs: - house_md (1.0.0) - rails - zeitwerk - GIT remote: https://github.com/josefarias/hotwire_combobox.git revision: 57ee6c9087320fab9383a07fa919fe75e0ea72ba @@ -261,6 +252,7 @@ GEM ffi (~> 1.0) rdoc (6.8.1) psych (>= 4.0.0) + redcarpet (3.6.0) regexp_parser (2.9.3) reline (0.5.12) io-console (~> 0.5) @@ -375,13 +367,13 @@ DEPENDENCIES debug hotwire-spark hotwire_combobox! - house_md! importmap-rails jbuilder propshaft puma (>= 5.0) rails! - rouge (~> 4.5) + redcarpet + rouge rqrcode rubocop-rails-omakase selenium-webdriver diff --git a/config/initializers/markdown.rb b/config/initializers/markdown.rb index 2d3a879a3..b5b61401d 100644 --- a/config/initializers/markdown.rb +++ b/config/initializers/markdown.rb @@ -1,4 +1,4 @@ ActiveSupport.on_load :action_text_markdown do require "markdown_renderer" - ActionText::Markdown.html_renderer = -> { MarkdownRenderer.new } + ActionText::Markdown.html_renderer = ->(content) { MarkdownRenderer.build.render(content) } end diff --git a/lib/markdown_renderer.rb b/lib/markdown_renderer.rb index 9117b28d0..6f466434c 100644 --- a/lib/markdown_renderer.rb +++ b/lib/markdown_renderer.rb @@ -1,47 +1,48 @@ require "rouge/plugins/redcarpet" -class MarkdownRenderer < HouseMd::Renderer - class Generator < HouseMd::Generator::Html - include Rouge::Plugins::Redcarpet +class MarkdownRenderer < Redcarpet::Render::HTML + include Rouge::Plugins::Redcarpet - def initialize - @id_counts = Hash.new 0 - end + def self.build + Redcarpet::Markdown.new MarkdownRenderer.new(filter_html: false), + autolink: true, highlight: true, no_intra_emphasis: true, + fenced_code_blocks: true, lax_spacing: true, strikethrough: true, tables: true + end - def header(text, header_level) - unique_id(text).then do |id| - <<~HTML.chomp - - #{text} - - HTML - end - end + def initialize(...) + super + @id_counts = Hash.new 0 + end - def image(url, alt_text) + def header(text, header_level) + unique_id(text).then do |id| <<~HTML.chomp - - #{alt_text} - + + #{text} + HTML end + end - def code_block(code, language) - block_code(code, language) # call Rouge Redcarpet plugin - end + def image(url, title, alt_text) + <<~HTML.chomp + + #{alt_text} + + HTML + end - private - attr_reader :id_counts + def code_block(code, language) + block_code(code, language) # call Rouge Redcarpet plugin + end - def unique_id(text) - text.parameterize.then do |base_id| - id_counts[base_id] += 1 - id_counts[base_id] > 1 ? "#{base_id}-#{id_counts[base_id]}" : base_id - end + private + attr_reader :id_counts + + def unique_id(text) + text.parameterize.then do |base_id| + id_counts[base_id] += 1 + id_counts[base_id] > 1 ? "#{base_id}-#{id_counts[base_id]}" : base_id end - end - - def initialize - @generator = Generator.new - end + end end diff --git a/lib/rails_ext/action_text_markdown.rb b/lib/rails_ext/action_text_markdown.rb index f5d57ece1..65b71fa7f 100644 --- a/lib/rails_ext/action_text_markdown.rb +++ b/lib/rails_ext/action_text_markdown.rb @@ -10,11 +10,19 @@ module ActionText end def to_unsafe_html - (html_renderer.try(:call) || html_renderer).render(content) + if html_renderer.respond_to? :call + html_renderer.call content + else + html_renderer.render content + end end def to_plain_text - (plain_renderer.try(:call) || plain_renderer).render(content) + if plain_renderer.respond_to? :call + plain_renderer.call content + else + plain_renderer.render content + end end end end