Skip to content

Commit

Permalink
Migrate Rendering to the EntryComponent so we have access to routes
Browse files Browse the repository at this point in the history
  • Loading branch information
zspencer committed Jul 20, 2023
1 parent 1a05b2c commit 41de505
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 57 deletions.
28 changes: 1 addition & 27 deletions app/furniture/journal/entries/_entry.html.erb
Original file line number Diff line number Diff line change
@@ -1,27 +1 @@
<article class="w-full p-2 my-2 bg-white rounded flex flex-col justify-between">
<header class="border-b border-primary-500">
<h2 class=" text-primary-900"><%= entry.headline %></h2>
<%- if entry.published?%>
<em>Published on <%= link_to entry.published_at.to_fs(:long_ordinal), entry.location %></em>
<%- else %>
<em>Unpublished.</em>
<%- end %>
</header>

<div class="prose">
<%= entry.to_html.html_safe %>
</div>

<footer class="flex justify-between my-2">
<%- if policy(entry).update? %>
<%= link_to "Edit", entry.location(:edit) %>
<%- if !entry.published? %>
<%= link_to "Publish Now", (entry.location() + [{ entry: { published_at: Time.now } }]), data: { turbo_method: :put } %>
<%- end %>
<%- end %>

<%- if policy(entry).destroy? %>
<%= link_to "Delete", entry.location, data: { turbo_method: :delete } %>
<%- end %>
</footer>
</article>
<%= render Journal::EntryComponent.new(entry: entry) %>
16 changes: 0 additions & 16 deletions app/furniture/journal/entry.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ class Entry < ApplicationRecord
location(parent: :journal)

self.table_name = "journal_entries"
include RendersMarkdown
extend StripsNamespaceFromModelName

scope :recent, -> { order("published_at DESC NULLS FIRST") }
Expand Down Expand Up @@ -38,21 +37,6 @@ def published?
published_at.present?
end

def to_html
render_markdown(body)
end

def self.renderer
@_renderer ||= Redcarpet::Markdown.new(
Renderer.new(filter_html: true, with_toc_data: true),
autolink: true, strikethrough: true,
no_intra_emphasis: true,
lax_spacing: true,
fenced_code_blocks: true, disable_indented_code_blocks: true,
tables: true, footnotes: true, superscript: true, quote: true
)
end

def extract_keywords
self.keywords = journal.keywords.extract_and_create_from!(body).pluck(:canonical_keyword)
end
Expand Down
27 changes: 27 additions & 0 deletions app/furniture/journal/entry_component.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<article class="w-full p-2 my-2 bg-white rounded flex flex-col justify-between">
<header class="border-b border-primary-500">
<h2 class=" text-primary-900"><%= entry.headline %></h2>
<%- if entry.published?%>
<em>Published on <%= link_to published_at, entry.location %></em>
<%- else %>
<em>Unpublished.</em>
<%- end %>
</header>

<div class="prose">
<%== body_html %>
</div>

<footer class="flex justify-between my-2">
<%- if policy(entry).update? %>
<%= link_to "Edit", entry.location(:edit) %>
<%- if !entry.published? %>
<%= link_to "Publish Now", (entry.location() + [{ entry: { published_at: Time.now } }]), data: { turbo_method: :put } %>
<%- end %>
<%- end %>

<%- if policy(entry).destroy? %>
<%= link_to "Delete", entry.location, data: { turbo_method: :delete } %>
<%- end %>
</footer>
</article>
30 changes: 30 additions & 0 deletions app/furniture/journal/entry_component.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
class Journal
class EntryComponent < ApplicationComponent
include RendersMarkdown
attr_accessor :entry

def initialize(*args, entry:, **kwargs)
self.entry = entry
super(*args, **kwargs)
end

def body_html
render_markdown(entry.body)
end

def published_at
entry.published_at.to_fs(:long_ordinal)
end

def self.renderer
@_renderer ||= Redcarpet::Markdown.new(
Renderer.new(filter_html: true, with_toc_data: true),
autolink: true, strikethrough: true,
no_intra_emphasis: true,
lax_spacing: true,
fenced_code_blocks: true, disable_indented_code_blocks: true,
tables: true, footnotes: true, superscript: true, quote: true
)
end
end
end
4 changes: 1 addition & 3 deletions app/furniture/journal/renderer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@ def autolink(link, link_type)
end

def postprocess(doc)
doc
.gsub(/@([a-zA-Z\d]*)@(.*\.[a-zA-Z]*)/, '<a href="https://\2/@\1">@\1@\2</a>')
.gsub(/#(\w+)/, '{keyword_\1}')
doc.gsub(/@([a-zA-Z\d]*)@(.*\.[a-zA-Z]*)/, '<a href="https://\2/@\1">@\1@\2</a>')
end
end
end
10 changes: 10 additions & 0 deletions spec/furniture/journal/entry_component_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
require "rails_helper"

RSpec.describe Journal::EntryComponent, type: :component do
subject(:output) { render_inline(component) }

let(:component) { described_class.new(entry: entry) }
let(:entry) { create(:journal_entry, body: "https://www.google.com @[email protected] #GoodTimes") }

it { is_expected.to have_link("https://www.google.com", href: "https://www.google.com") }
end
11 changes: 0 additions & 11 deletions spec/furniture/journal/entry_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,6 @@
it { is_expected.to have_one(:room).through(:journal) }
it { is_expected.to have_one(:space).through(:journal) }

describe "#to_html" do
subject(:to_html) { entry.to_html }

context "when #body is 'https://www.google.com @[email protected] #GoodTimes'" do
let(:entry) { build(:journal_entry, body: "https://www.google.com @[email protected] #GoodTimes") }

it { is_expected.to include('<a href="https://www.google.com">https://www.google.com</a>') }
it { is_expected.to include("{keyword_GoodTimes}") }
end
end

describe "#save" do
let(:entry) { create(:journal_entry, body: "#GoodTimes") }
let(:journal) { entry.journal }
Expand Down

0 comments on commit 41de505

Please sign in to comment.