Files
redux-scraper/app/helpers/domain/domains_helper.rb
2025-08-17 18:51:55 +00:00

143 lines
3.9 KiB
Ruby

# typed: strict
module Domain::DomainsHelper
extend T::Sig
extend T::Helpers
include HelpersInterface
abstract!
# If a URL is detected in plain text and is one of these domains,
# it will be converted to an anchor tag.
ALLOWED_PLAIN_TEXT_URL_DOMAINS = %w[
e621.net
furaffinity.net
inkbunny.net
bsky.app
].freeze
# If a link is detected in an anchor tag and is one of these domains,
# it will be converted to a link.
ALLOWED_EXTERNAL_LINK_DOMAINS =
T.let(
(
%w[
archiveofourown.org
behance.net
bigcartel.com
boosty.to
bsky.app
carrd.co
deviantart.com
discord.gg
dribbble.com
e621.net
facebook.com
furaffinity.net
gumroad.com
hipolink.me
inkbunny.net
itch.io
instagram.com
ko-fi.com
livejournal.com
mstdn.social
patreon.com
pinterest.com
pixiv.net
redbubble.com
spreadshirt.com
spreadshirt.de
subscribestar.adult
linktr.ee
t.me
trello.com
tumblr.com
twitch.tv
twitter.com
vimeo.com
weasyl.com
x.com
youtube.com
sofurry.com
aethy.com
] + ALLOWED_PLAIN_TEXT_URL_DOMAINS
).freeze,
T::Array[String],
)
DOMAIN_TO_ICON_PATH =
T.let(
{
"bigcartel.com" => "bigcartel.png",
"boosty.to" => "boosty.png",
"bsky.app" => "bsky.png",
"carrd.co" => "carrd.png",
"deviantart.com" => "deviantart.png",
"e621.net" => "e621.png",
"furaffinity.net" => "fa.png",
"ib.metapix.net" => "inkbunny.png",
"inkbunny.net" => "inkbunny.png",
"itaku.ee" => "itaku.png",
"ko-fi.com" => "ko-fi.png",
"newgrounds.com" => "newgrounds.png",
"patreon.com" => "patreon.png",
"pixiv.net" => "pixiv.png",
"redbubble.com" => "redbubble.png",
"spreadshirt.com" => "spreadshirt.png",
"spreadshirt.de" => "spreadshirt.png",
"subscribestar.com" => "subscribestar.png",
"subscribestar.adult" => "subscribestar.png",
"gumroad.com" => "gumroad.png",
"itch.io" => "itch-io.png",
"t.me" => "telegram.png",
"tumblr.com" => "tumblr.png",
"twitter.com" => "x-twitter.png",
"trello.com" => "trello.png",
"weasyl.com" => "weasyl.png",
"wixmp.com" => "deviantart.png",
"x.com" => "x-twitter.png",
"linktr.ee" => "linktree.png",
"aethy.com" => "aethy.png",
}.freeze,
T::Hash[String, String],
)
DOMAIN_TITLE_MAPPERS =
T.let(
[
[%r{://t.me/([^/]+)}, ->(match) { match[1] }],
[%r{://bsky.app/profile/([^/]+)}, ->(match) { match[1] }],
[%r{://(.*\.)?x.com/([^/]+)}, ->(match) { match[2] }],
[%r{://(.*\.)?twitter.com/([^/]+)}, ->(match) { match[2] }],
[%r{://(.*\.)?patreon.com/([^/]+)}, ->(match) { match[2] }],
[%r{://(.*\.)?furaffinity.net/user/([^/]+)}, ->(match) { match[2] }],
],
T::Array[[Regexp, T.proc.params(match: MatchData).returns(String)]],
)
sig { params(domain: String, host: String).returns(T::Boolean) }
def url_matches_domain?(domain, host)
host == domain || host.end_with?(".#{domain}")
end
sig { params(domain: String).returns(T.nilable(String)) }
def icon_path_for_domain(domain)
for test_domain, icon in DOMAIN_TO_ICON_PATH
if url_matches_domain?(test_domain, domain)
return asset_path("domain-icons/#{icon}")
end
end
nil
end
sig { params(url: String).returns(String) }
def title_for_url(url)
url = url.to_s
for mapper in DOMAIN_TITLE_MAPPERS
if (match = mapper[0].match(url)) && (group = mapper[1].call(match))
return group
end
end
url
end
end