feat(messages): render markdown in message body

uses redcarpet gem to render markdown to html. Also a html email template
is added.
This commit is contained in:
Philipp Rothmann 2023-01-30 13:14:37 +01:00
parent fb8ccfea4a
commit f7302bc8fc
5 changed files with 29 additions and 3 deletions

View File

@ -60,6 +60,7 @@ gem 'mime-types'
gem 'midi-smtp-server' gem 'midi-smtp-server'
gem 'rswag-api' gem 'rswag-api'
gem 'rswag-ui' gem 'rswag-ui'
gem 'maildown'
# we use the git version of acts_as_versioned, and need to include it in this Gemfile # we use the git version of acts_as_versioned, and need to include it in this Gemfile
gem 'acts_as_versioned', git: 'https://github.com/technoweenie/acts_as_versioned.git' gem 'acts_as_versioned', git: 'https://github.com/technoweenie/acts_as_versioned.git'
@ -75,6 +76,7 @@ gem 'foodsoft_polls', path: 'plugins/polls'
# gem 'foodsoft_printer', path: 'plugins/printer' # gem 'foodsoft_printer', path: 'plugins/printer'
# gem 'foodsoft_uservoice', path: 'plugins/uservoice' # gem 'foodsoft_uservoice', path: 'plugins/uservoice'
group :development do group :development do
gem 'sqlite3', '~> 1.3.6' gem 'sqlite3', '~> 1.3.6'
gem 'mailcatcher' gem 'mailcatcher'
@ -126,3 +128,5 @@ group :test do
gem 'rswag-specs' gem 'rswag-specs'
gem 'hashie', '~> 3.4.6', require: false # https://github.com/westfieldlabs/apivore/issues/114 gem 'hashie', '~> 3.4.6', require: false # https://github.com/westfieldlabs/apivore/issues/114
end end
gem "redcarpet", "~> 3.6"

View File

@ -283,6 +283,10 @@ GEM
activerecord activerecord
kaminari-core (= 1.2.2) kaminari-core (= 1.2.2)
kaminari-core (1.2.2) kaminari-core (1.2.2)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
less (2.6.0) less (2.6.0)
commonjs (~> 0.2.7) commonjs (~> 0.2.7)
less-rails (5.0.0) less-rails (5.0.0)
@ -308,6 +312,9 @@ GEM
skinny (>= 0.1.2) skinny (>= 0.1.2)
sqlite3-ruby sqlite3-ruby
thin thin
maildown (3.3.1)
actionmailer (>= 4.0.0)
kramdown-parser-gfm
marcel (1.0.2) marcel (1.0.2)
matrix (0.4.2) matrix (0.4.2)
method_source (1.0.0) method_source (1.0.0)
@ -413,6 +420,7 @@ GEM
rb-fsevent (0.11.2) rb-fsevent (0.11.2)
rb-inotify (0.10.1) rb-inotify (0.10.1)
ffi (~> 1.0) ffi (~> 1.0)
redcarpet (3.6.0)
redis (5.0.5) redis (5.0.5)
redis-client (>= 0.9.0) redis-client (>= 0.9.0)
redis-client (0.11.2) redis-client (0.11.2)
@ -635,6 +643,7 @@ DEPENDENCIES
listen listen
mail (~> 2.7.1) mail (~> 2.7.1)
mailcatcher mailcatcher
maildown
midi-smtp-server midi-smtp-server
mime-types mime-types
mysql2 mysql2
@ -652,6 +661,7 @@ DEPENDENCIES
rails_tokeninput rails_tokeninput
ransack ransack
recurring_select! recurring_select!
redcarpet (~> 3.6)
resque resque
roo roo
roo-xls roo-xls
@ -686,4 +696,4 @@ DEPENDENCIES
whenever whenever
BUNDLED WITH BUNDLED WITH
2.4.3 2.4.5

View File

@ -132,9 +132,15 @@ class Message < ApplicationRecord
user.role_admin? user.role_admin?
end end
def render_markdown
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, tables: true, strikethrough: true, footnotes: true)
return markdown.render(body)
end
private private
def create_salt def create_salt
self.salt = [Array.new(6) { rand(256).chr }.join].pack("m").chomp self.salt = [Array.new(6) { rand(256).chr }.join].pack("m").chomp
end end
end
end

View File

@ -33,7 +33,7 @@
- if @message.can_toggle_private?(current_user) - if @message.can_toggle_private?(current_user)
= link_to t('.change_visibility'), toggle_private_message_path(@message), method: :post, class: 'btn btn-mini' = link_to t('.change_visibility'), toggle_private_message_path(@message), method: :post, class: 'btn btn-mini'
%hr/ %hr/
%p= simple_format(h(@message.body)) = raw @message.render_markdown
%hr/ %hr/
%p %p
= link_to t('.reply'), new_message_path(:message => {:reply_to => @message.id}), class: 'btn' = link_to t('.reply'), new_message_path(:message => {:reply_to => @message.id}), class: 'btn'

View File

@ -0,0 +1,6 @@
= raw @message.render_markdown
%hr/
%pre
- if @message.group
= raw t '.footer_group', group: @message.group.name
= raw t '.footer', reply_url: new_message_url('message[reply_to]' => @message.id), msg_url: message_url(@message), profile_url: my_profile_url