about summary refs log tree commit diff
path: root/app/lib/formatter.rb
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-09-09 20:04:34 +0200
committerEugen Rochko <eugen@zeonfederated.com>2016-09-09 20:04:34 +0200
commit3cc47beb6e1f646baca64fdf56168e2f2e2bc726 (patch)
tree295d9442bec8fa7434b6a2c37a6cb835a3725dfd /app/lib/formatter.rb
parent735b4cc62e3fb9ef7a10b657c8e437ac0cb3d1fe (diff)
Refactored generation of unique tags, URIs and object URLs into own classes,
as well as formatting of content
Diffstat (limited to 'app/lib/formatter.rb')
-rw-r--r--app/lib/formatter.rb47
1 files changed, 47 insertions, 0 deletions
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
new file mode 100644
index 000000000..52e229520
--- /dev/null
+++ b/app/lib/formatter.rb
@@ -0,0 +1,47 @@
+require 'singleton'
+
+class Formatter
+  include Singleton
+
+  include ActionView::Helpers::TextHelper
+  include ActionView::Helpers::SanitizeHelper
+
+  def format(status)
+    return reformat(status) unless status.local?
+
+    html = status.text
+    html = encode(html)
+    html = link_urls(html)
+    html = link_mentions(html, status.mentions)
+
+    html.html_safe
+  end
+
+  def reformat(status)
+    sanitize(status.content, tags: %w(a br p), attributes: %w(href rel))
+  end
+
+  private
+
+  def encode(html)
+    HTMLEntities.new.encode(html)
+  end
+
+  def link_urls(html)
+    auto_link(html, link: :urls, html: { rel: 'nofollow noopener' })
+  end
+
+  def link_mentions(html, mentions)
+    html.gsub(Account::MENTION_RE) do |match|
+      acct    = Account::MENTION_RE.match(match)[1]
+      mention = mentions.find { |mention| mention.account.acct.eql?(acct) }
+
+      return match if mention.nil?
+      mention_html(match, mention.account)
+    end
+  end
+
+  def mention_html(match, account)
+    "#{match.split('@').first}<a href=\"#{TagManager.instance.url_for(account)}\" class=\"mention\">@<span>#{account.acct}</span></a>"
+  end
+end