replace urls in t.co redirect and fix missing X urls in replacer

This commit is contained in:
Cynthia Foxwell 2025-04-15 14:12:10 -06:00
parent 9b3862de69
commit c09266cd17
No known key found for this signature in database
3 changed files with 16 additions and 13 deletions

View File

@ -9,8 +9,8 @@ const
twitter = parseUri("https://twitter.com") twitter = parseUri("https://twitter.com")
let let
twRegex = re"(?<=(?<!\S)https:\/\/|(?<=\s))(www\.|mobile\.)?twitter\.com" twRegex = re"(?<=(?<!\S)https:\/\/|(?<=\s))(www\.|mobile\.)?(twitter|x)\.com"
twLinkRegex = re"""<a href="https:\/\/twitter.com([^"]+)">twitter\.com(\S+)</a>""" twLinkRegex = re"""<a href="https:\/\/(twitter|x).com([^"]+)">(twitter|x)\.com(\S+)</a>"""
ytRegex = re(r"([A-z.]+\.)?youtu(be\.com|\.be)", {reStudy, reIgnoreCase}) ytRegex = re(r"([A-z.]+\.)?youtu(be\.com|\.be)", {reStudy, reIgnoreCase})
@ -58,12 +58,12 @@ proc replaceUrls*(body: string; prefs: Prefs; absolute=""): string =
if prefs.replaceYouTube.len > 0 and "youtu" in result: if prefs.replaceYouTube.len > 0 and "youtu" in result:
result = result.replace(ytRegex, prefs.replaceYouTube) result = result.replace(ytRegex, prefs.replaceYouTube)
if prefs.replaceTwitter.len > 0 and ("twitter.com" in body or tco in body): if prefs.replaceTwitter.len > 0 and ("twitter.com" in result or "/x.com" in result or tco in result):
result = result.replace(tco, https & prefs.replaceTwitter & "/t.co") result = result.replace(tco, https & prefs.replaceTwitter & "/t.co")
result = result.replace(cards, prefs.replaceTwitter & "/cards") result = result.replace(cards, prefs.replaceTwitter & "/cards")
result = result.replace(twRegex, prefs.replaceTwitter) result = result.replace(twRegex, prefs.replaceTwitter)
result = result.replacef(twLinkRegex, a( result = result.replacef(twLinkRegex, a(
prefs.replaceTwitter & "$2", href = https & prefs.replaceTwitter & "$1")) prefs.replaceTwitter & "$4", href = https & prefs.replaceTwitter & "$2"))
if prefs.replaceReddit.len > 0 and ("reddit.com" in result or "redd.it" in result): if prefs.replaceReddit.len > 0 and ("reddit.com" in result or "redd.it" in result):
result = result.replace(rdShortRegex, prefs.replaceReddit & "/comments/") result = result.replace(rdShortRegex, prefs.replaceReddit & "/comments/")

View File

@ -4,22 +4,26 @@ import strutils
import jester import jester
import router_utils import router_utils
import ".."/[types, api] import ".."/[types, api, formatters]
import ../views/general import ../views/general
template respResolved*(url, kind: string): untyped = template respResolved*(url, kind: string; prefs: Prefs): untyped =
let u = url let u = url
if u.len == 0: if u.len == 0:
resp showError("Invalid $1 link" % kind, cfg) resp showError("Invalid $1 link" % kind, cfg)
else: else:
redirect(u) redirect(replaceUrls(u, prefs))
proc createResolverRouter*(cfg: Config) = proc createResolverRouter*(cfg: Config) =
router resolver: router resolver:
get "/cards/@card/@id": get "/cards/@card/@id":
let url = "https://cards.twitter.com/cards/$1/$2" % [@"card", @"id"] let
respResolved(await resolve(url, cookiePrefs()), "card") prefs = cookiePrefs()
url = "https://cards.twitter.com/cards/$1/$2" % [@"card", @"id"]
respResolved(await resolve(url, prefs), "card", prefs)
get "/t.co/@url": get "/t.co/@url":
let url = "https://t.co/" & @"url" let
respResolved(await resolve(url, cookiePrefs()), "t.co") prefs = cookiePrefs()
url = "https://t.co/" & @"url"
respResolved(await resolve(url, prefs), "t.co", prefs)

View File

@ -3,8 +3,7 @@ import strutils, strformat, options, json, sequtils, times, math
import ".."/[types, formatters, utils] import ".."/[types, formatters, utils]
proc formatTweetForMastoAPI*(tweet: Tweet, cfg: Config, prefs: Prefs): string = proc formatTweetForMastoAPI*(tweet: Tweet, cfg: Config, prefs: Prefs): string =
var content = replaceUrls(tweet.text, prefs) var content = replaceUrls(tweet.text, prefs, absolute=getUrlPrefix(cfg))
content = content.replace("href=\"/", &"href=\"{getUrlPrefix(cfg)}/")
if tweet.poll.isSome(): if tweet.poll.isSome():
let poll = get(tweet.poll) let poll = get(tweet.poll)