diff --git a/app/assets/stylesheets/simple_discussion.scss b/app/assets/stylesheets/simple_discussion.scss index c63f794..507cce2 100644 --- a/app/assets/stylesheets/simple_discussion.scss +++ b/app/assets/stylesheets/simple_discussion.scss @@ -248,8 +248,13 @@ border: 1px solid #80808029; .card-body { + overflow-x: auto; margin-top: 16px; } + .card-body iframe { + border-radius: $post-body-border-radius; + border: 2px solid #80808029; + } } // Formatting the listtile for user details @@ -296,3 +301,25 @@ .thread-page-container { padding: 24px; } + +.preview::before { + content: "Preview"; + width: 80px; +} + +p { + font-size: 18px; +} + +blockquote { + border-left: 5px solid #e9ecef; + padding: 10px 20px; + margin: 10px 0; + font-size: 18px; + font-weight: 500; + color: #6c757d; +} + +.CodeMirror-line span { + font-size: 18px; +} diff --git a/app/helpers/simple_discussion/forum_posts_helper.rb b/app/helpers/simple_discussion/forum_posts_helper.rb index c63c4a6..f642614 100644 --- a/app/helpers/simple_discussion/forum_posts_helper.rb +++ b/app/helpers/simple_discussion/forum_posts_helper.rb @@ -1,3 +1,46 @@ +require "redcarpet" +class CustomRenderer < Redcarpet::Render::HTML + def initialize(circuit_embed: false, video_embed: false, user_tagging: false) + @circuit_embed = circuit_embed + @video_embed = video_embed + @user_tagging = user_tagging + super() + end + + def image(url, title, alt_text) + case alt_text + when "Circuit" + if @circuit_embed + "
" + else + "\"#{alt_text}\"
" + end + when "Video" + if @video_embed + video_id = url.split("v=")[1].split("&")[0] + "
" + else + "\"#{alt_text}\"
" + end + else + # default image rendering + "\"#{alt_text}\"
" + end + end + + def link(link, _title, content) + if @user_tagging && link.start_with?("/users/") + uri = URI.parse(link) + uri.path =~ %r{^/users/\d+/?$} + # remove the brackets from the content + content = content.gsub(/[()]/, "") + "#{content}" + else + "#{content}" + end + end +end + module SimpleDiscussion::ForumPostsHelper def category_link(category) link_to category.name, simple_discussion.forum_category_forum_threads_path(category), @@ -6,7 +49,20 @@ def category_link(category) # Override this method to provide your own content formatting like Markdown def formatted_content(text) - simple_format(text) + options = { + hard_wrap: true, + filter_html: true, + autolink: true, + tables: true + } + + renderer = CustomRenderer.new( + circuit_embed: SimpleDiscussion.markdown_circuit_embed, + video_embed: SimpleDiscussion.markdown_video_embed, + user_tagging: SimpleDiscussion.markdown_user_tagging + ) + markdown = Redcarpet::Markdown.new(renderer, options) + markdown.render(text).html_safe end def forum_post_classes(forum_post) diff --git a/app/views/layouts/simple_discussion.html.erb b/app/views/layouts/simple_discussion.html.erb index c4f1dd5..64d665a 100644 --- a/app/views/layouts/simple_discussion.html.erb +++ b/app/views/layouts/simple_discussion.html.erb @@ -76,6 +76,10 @@ <% parent_layout("application") %> + + + + diff --git a/app/views/simple_discussion/forum_posts/_form.html.erb b/app/views/simple_discussion/forum_posts/_form.html.erb index 1a99524..c982866 100644 --- a/app/views/simple_discussion/forum_posts/_form.html.erb +++ b/app/views/simple_discussion/forum_posts/_form.html.erb @@ -1,7 +1,14 @@
<%= form_for [@forum_thread, @forum_post], url: (@forum_post.persisted? ? simple_discussion.forum_thread_forum_post_path(@forum_thread, @forum_post) : simple_discussion.forum_thread_forum_posts_path(@forum_thread)), - html: { data: { behavior: "comment-form" } } do |f| %> + html: { + data: { + controller: "simplemde", + simplemde_circuit_embed_value: SimpleDiscussion.markdown_circuit_embed, + simplemde_user_tagging_value: SimpleDiscussion.markdown_user_tagging, + simplemde_video_embed_value: SimpleDiscussion.markdown_video_embed, + } + } do |f| %> <% if @forum_post.errors.any? %> <% end %> -
-
- <%= f.text_area :body, placeholder: t('add_a_comment'), rows: 8, class: "form-control simplemde", data: { behavior: "comment-body" } %> +
+
+ <%= f.text_area :body, placeholder: t('add_a_comment'), rows: 8, class: "form-control", data: { simplemde_target: "textarea" } %> +
+ <%= f.button "#{f.object.new_record? ? t('comment') : t('update_comment')}", class: "btn forum-primary-btn", style: "bottom: 10px; right: 10px", data: { disable_with: " #{t('saving_comment')}" } %>
- <%= f.button "#{f.object.new_record? ? t('comment') : t('update_comment') }", class: "btn forum-primary-btn", style: "bottom: 10px; right: 10px", data: {disable_with: " #{t('saving_comment')}"} %> -
- - <%# Describe text formatting options here with a link %> - <%#= link_to "Parsed with Markdown", "https://guides.github.com/features/mastering-markdown/", target: "_blank" %> + + <% end %> + + + + + + diff --git a/app/views/simple_discussion/forum_posts/_spam_report.html.erb b/app/views/simple_discussion/forum_posts/_spam_report.html.erb index 87e4148..7e75a34 100644 --- a/app/views/simple_discussion/forum_posts/_spam_report.html.erb +++ b/app/views/simple_discussion/forum_posts/_spam_report.html.erb @@ -31,7 +31,7 @@
- <%= link_to spam_report.user.name, user_path(spam_report.user), class: "btn btn-outline-primary", title: t('user_profile') %> + <%= link_to spam_report.user.name, user_profile_link(spam_report.user), class: "btn btn-outline-primary", title: t('user_profile') %>
diff --git a/app/views/simple_discussion/forum_threads/_form.html.erb b/app/views/simple_discussion/forum_threads/_form.html.erb index 49e37e8..cbf9318 100644 --- a/app/views/simple_discussion/forum_threads/_form.html.erb +++ b/app/views/simple_discussion/forum_threads/_form.html.erb @@ -1,6 +1,14 @@ <%= form_for @forum_thread, url: (@forum_thread.persisted? ? simple_discussion.forum_thread_path(@forum_thread) : simple_discussion.forum_threads_path), - html: { data: {behavior: "comment-form"} } do |f| %> + html: { + data: { + behavior: "comment-form", + controller: "simplemde", + simplemde_circuit_embed_value: SimpleDiscussion.markdown_circuit_embed, + simplemde_user_tagging_value: SimpleDiscussion.markdown_user_tagging, + simplemde_video_embed_value: SimpleDiscussion.markdown_video_embed, + } + } do |f| %> <% if @forum_thread.errors.any? %> + + + <% end %> + + + + + + diff --git a/app/views/simple_discussion/forum_threads/show.html.erb b/app/views/simple_discussion/forum_threads/show.html.erb index fb4f016..3201d9f 100644 --- a/app/views/simple_discussion/forum_threads/show.html.erb +++ b/app/views/simple_discussion/forum_threads/show.html.erb @@ -27,6 +27,7 @@
+
<%= t("created_by") %> <%= @forum_thread.user.name %> • <%= time_ago_in_words(@forum_thread.created_at) %> <%= t("ago") %> diff --git a/gemfiles/rails_6_1.gemfile.lock b/gemfiles/rails_6_1.gemfile.lock index cffead0..2f16a98 100644 --- a/gemfiles/rails_6_1.gemfile.lock +++ b/gemfiles/rails_6_1.gemfile.lock @@ -6,6 +6,7 @@ PATH friendly_id (>= 5.2.0) language_filter (>= 0.3.01) rails (>= 4.2) + redcarpet (>= 3.3.4) will_paginate (>= 3.1.0) GEM @@ -122,7 +123,7 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.3) - nokogiri (1.16.6-x86_64-linux) + nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) orm_adapter (0.5.0) parallel (1.25.1) @@ -165,6 +166,7 @@ GEM thor (~> 1.0) rainbow (3.1.1) rake (13.2.1) + redcarpet (3.6.0) regexp_parser (2.9.2) responders (3.1.1) actionpack (>= 5.2) diff --git a/gemfiles/rails_7.gemfile.lock b/gemfiles/rails_7.gemfile.lock index 2ded953..427ffc2 100644 --- a/gemfiles/rails_7.gemfile.lock +++ b/gemfiles/rails_7.gemfile.lock @@ -6,6 +6,7 @@ PATH friendly_id (>= 5.2.0) language_filter (>= 0.3.01) rails (>= 4.2) + redcarpet (>= 3.3.4) will_paginate (>= 3.1.0) GEM @@ -128,7 +129,7 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.3) - nokogiri (1.16.6-x86_64-linux) + nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) orm_adapter (0.5.0) parallel (1.25.1) @@ -171,6 +172,7 @@ GEM zeitwerk (~> 2.5) rainbow (3.1.1) rake (13.2.1) + redcarpet (3.6.0) regexp_parser (2.9.2) responders (3.1.1) actionpack (>= 5.2) diff --git a/gemfiles/rails_7_1.gemfile.lock b/gemfiles/rails_7_1.gemfile.lock index d2ea195..b603725 100644 --- a/gemfiles/rails_7_1.gemfile.lock +++ b/gemfiles/rails_7_1.gemfile.lock @@ -6,6 +6,7 @@ PATH friendly_id (>= 5.2.0) language_filter (>= 0.3.01) rails (>= 4.2) + redcarpet (>= 3.3.4) will_paginate (>= 3.1.0) GEM @@ -145,7 +146,7 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.3) - nokogiri (1.16.6-x86_64-linux) + nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) orm_adapter (0.5.0) parallel (1.25.1) @@ -198,6 +199,7 @@ GEM rake (13.2.1) rdoc (6.7.0) psych (>= 4.0.0) + redcarpet (3.6.0) regexp_parser (2.9.2) reline (0.5.9) io-console (~> 0.5) diff --git a/gemfiles/rails_main.gemfile.lock b/gemfiles/rails_main.gemfile.lock index 25885b2..c138c8d 100644 --- a/gemfiles/rails_main.gemfile.lock +++ b/gemfiles/rails_main.gemfile.lock @@ -1,6 +1,6 @@ GIT remote: https://github.com/rails/rails - revision: 0db535f88d856bcac66faee901df51aa493b639b + revision: c01ee683aa700b109f704a5b6611107fe2dc5476 branch: main specs: actioncable (8.0.0.alpha) @@ -103,6 +103,7 @@ PATH friendly_id (>= 5.2.0) language_filter (>= 0.3.01) rails (>= 4.2) + redcarpet (>= 3.3.4) will_paginate (>= 3.1.0) GEM @@ -177,17 +178,17 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.3) - nokogiri (1.16.6-aarch64-linux) + nokogiri (1.16.7-aarch64-linux) racc (~> 1.4) - nokogiri (1.16.6-arm-linux) + nokogiri (1.16.7-arm-linux) racc (~> 1.4) - nokogiri (1.16.6-arm64-darwin) + nokogiri (1.16.7-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.6-x86-linux) + nokogiri (1.16.7-x86-linux) racc (~> 1.4) - nokogiri (1.16.6-x86_64-darwin) + nokogiri (1.16.7-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.6-x86_64-linux) + nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) orm_adapter (0.5.0) parallel (1.25.1) @@ -218,6 +219,7 @@ GEM rake (13.2.1) rdoc (6.7.0) psych (>= 4.0.0) + redcarpet (3.6.0) regexp_parser (2.9.2) reline (0.5.9) io-console (~> 0.5) diff --git a/lib/simple_discussion.rb b/lib/simple_discussion.rb index 974718d..57ed634 100644 --- a/lib/simple_discussion.rb +++ b/lib/simple_discussion.rb @@ -13,9 +13,16 @@ module SimpleDiscussion mattr_accessor :send_email_notifications mattr_accessor :send_slack_notifications mattr_accessor :profanity_filter + mattr_accessor :markdown_circuit_embed + mattr_accessor :markdown_video_embed + mattr_accessor :markdown_user_tagging + @@send_email_notifications = true @@send_slack_notifications = true @@profanity_filter = true + @@markdown_circuit_embed = true + @@markdown_video_embed = true + @@markdown_user_tagging = true def self.setup yield self diff --git a/lib/simple_discussion/engine.rb b/lib/simple_discussion/engine.rb index 5181d2c..e32ac37 100644 --- a/lib/simple_discussion/engine.rb +++ b/lib/simple_discussion/engine.rb @@ -6,5 +6,24 @@ class Engine < ::Rails::Engine config.after_initialize do SimpleDiscussion::Engine.routes.default_url_options = ActionMailer::Base.default_url_options end + + # javascripts assets precompiled for dropdown and markdown text editor + @@javascripts = [] + + initializer "simple_discussion.assets.precompile" do |app| + app.config.assets.precompile += [ + "simple_discussion/application.js" + ] + end + + def self.add_javascript(script) + @@javascripts << script + end + + def self.javascripts + @@javascripts + end + + add_javascript "simple_discussion/application.js" end end diff --git a/simple_discussion.gemspec b/simple_discussion.gemspec index 3bcc7c4..824e7db 100644 --- a/simple_discussion.gemspec +++ b/simple_discussion.gemspec @@ -27,6 +27,7 @@ Gem::Specification.new do |spec| spec.add_dependency "rails", ">= 4.2" spec.add_dependency "will_paginate", ">= 3.1.0" spec.add_dependency "language_filter", ">= 0.3.01" + spec.add_dependency "redcarpet", ">= 3.3.4" spec.metadata["rubygems_mfa_required"] = "true" end diff --git a/test/dummy/app/helpers/application_helper.rb b/test/dummy/app/helpers/application_helper.rb index de6be79..fb1a9b2 100644 --- a/test/dummy/app/helpers/application_helper.rb +++ b/test/dummy/app/helpers/application_helper.rb @@ -1,2 +1,5 @@ module ApplicationHelper + def user_profile_link(user) + "/users/#{user.id}" + end end