From 139fc994e218f3d2e95f38d5f6dae11e8b0b8d58 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 28 Mar 2017 14:16:08 +0200 Subject: [PATCH] Fix #408 - link @ names in bios --- app/lib/formatter.rb | 16 +++++++++++++--- app/lib/tag_manager.rb | 6 ++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index b58952ae0f2..da7ad202751 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -9,8 +9,6 @@ class Formatter include ActionView::Helpers::TextHelper include ActionView::Helpers::SanitizeHelper - AUTOLINK_RE = /https?:\/\/([\S]+\.[!#$&-;=?-[\]_a-z~]|%[\w\d]{2}]+[\w])/i - def format(status) return reformat(status.content) unless status.local? @@ -39,6 +37,7 @@ class Formatter html = encode(account.note) html = link_urls(html) + html = link_accounts(html) html = link_hashtags(html) html.html_safe # rubocop:disable Rails/OutputSafety @@ -59,12 +58,23 @@ class Formatter def link_mentions(html, mentions) html.gsub(Account::MENTION_RE) do |match| acct = Account::MENTION_RE.match(match)[1] - mention = mentions.find { |item| item.account.acct.casecmp(acct).zero? } + mention = mentions.find { |item| TagManager.instance.same_acct?(item.account.acct, acct) } mention.nil? ? match : mention_html(match, mention.account) end end + def link_accounts(html) + html.gsub(Account::MENTION_RE) do |match| + acct = Account::MENTION_RE.match(match)[1] + username, domain = acct.split('@') + domain = nil if TagManager.instance.local_domain?(domain) + account = Account.find_remote(username, domain) + + account.nil? ? match : mention_html(match, account) + end + end + def link_hashtags(html) html.gsub(Tag::HASHTAG_RE) do |match| hashtag_html(match) diff --git a/app/lib/tag_manager.rb b/app/lib/tag_manager.rb index 34c3edc4b7c..2a5e7a40953 100644 --- a/app/lib/tag_manager.rb +++ b/app/lib/tag_manager.rb @@ -60,6 +60,12 @@ class TagManager domain.nil? || domain.gsub(/[\/]/, '').casecmp(Rails.configuration.x.local_domain).zero? end + def same_acct?(canonical, needle) + return true if canonical.casecmp(needle).zero? + username, domain = needle.split('@') + local_domain?(domain) && canonical.casecmp(username).zero? + end + def local_url?(url) uri = Addressable::URI.parse(url) domain = uri.host + (uri.port ? ":#{uri.port}" : '')