4 Commits

Author SHA1 Message Date
Salastil 85a03a575e Regex fixes, nre is not compiling 2026-05-15 17:05:46 -04:00
Salastil a78d4655cd Add cashtag filter option 2026-05-15 16:52:01 -04:00
Zed 74f5ff8acc Fix thread test 2026-04-16 02:46:43 +02:00
Zed 4e38317582 Fix verified type enum parsing error
Fixes #1387
2026-04-16 02:31:52 +02:00
6 changed files with 46 additions and 30 deletions
+3 -3
View File
@@ -1,4 +1,4 @@
import std/[algorithm, unicode, re, strutils, strformat, options, nre]
import std/[algorithm, unicode, re, strutils, strformat, options]
import jsony
import utils, slices
import ../types/user as userType
@@ -8,7 +8,7 @@ let
unRegex = re.re"(^|[^A-z0-9-_./?])@([A-z0-9_]{1,15})"
unReplace = "$1<a href=\"/$2\">@$2</a>"
htRegex = nre.re"""(*U)(^|[^\w-_.?])([#$])([\w_]*+)(?!</a>|">|#)"""
htRegex = re.re"(^|[^a-zA-Z0-9_-_.?])([#$])([a-zA-Z0-9_]+)"
htReplace = "$1<a href=\"/search?f=tweets&q=%23$3\">$2$3</a>"
proc expandUserEntities(user: var User; raw: RawUser) =
@@ -29,7 +29,7 @@ proc expandUserEntities(user: var User; raw: RawUser) =
user.bio = orig.replacedWith(replacements, 0 .. orig.len)
.replacef(unRegex, unReplace)
.replace(htRegex, htReplace)
.replacef(htRegex, htReplace)
proc getBanner(user: RawUser): string =
if user.profileBannerUrl.len > 0:
+7 -3
View File
@@ -6,6 +6,10 @@ import experimental/parser/unifiedcard
proc parseGraphTweet(js: JsonNode): Tweet
proc parseVerifiedType(s: string; current: VerifiedType): VerifiedType =
try: parseEnum[VerifiedType](s)
except ValueError: current
proc parseCommunityNote(js: JsonNode): string =
let subtitle = js{"subtitle"}
result = subtitle{"text"}.getStr
@@ -35,7 +39,7 @@ proc parseUser(js: JsonNode; id=""): User =
result.verifiedType = blue
with verifiedType, js{"verified_type"}:
result.verifiedType = parseEnum[VerifiedType](verifiedType.getStr)
result.verifiedType = parseVerifiedType(verifiedType.getStr, result.verifiedType)
result.expandUserEntities(js)
@@ -66,7 +70,7 @@ proc parseGraphUser(js: JsonNode): User =
result.verifiedType = blue
with verifiedType, user{"verification", "verified_type"}:
result.verifiedType = parseEnum[VerifiedType](verifiedType.getStr)
result.verifiedType = parseVerifiedType(verifiedType.getStr, result.verifiedType)
proc parseAboutAccount*(js: JsonNode): AccountInfo =
if js.isNull: return
@@ -88,7 +92,7 @@ proc parseAboutAccount*(js: JsonNode): AccountInfo =
if user{"is_blue_verified"}.getBool(false):
result.verifiedType = blue
with verifiedType, user{"verification", "verified_type"}:
result.verifiedType = parseEnum[VerifiedType](verifiedType.getStr)
result.verifiedType = parseVerifiedType(verifiedType.getStr, result.verifiedType)
with about, user{"about_profile"}:
result.basedIn = about{"account_based_in"}.getStr
+1 -1
View File
@@ -16,7 +16,7 @@ let
unRegex = re"(^|[^A-z0-9-_./?])@([A-z0-9_]{1,15})"
unReplace = "$1<a href=\"/$2\">@$2</a>"
htRegex = re"(^|[^\w-_./?])([#$]|)([\w_]+)"
htRegex = re"(^|[^a-zA-Z0-9_-_.?])([#$]|)([a-zA-Z0-9_]+)"
htReplace = "$1<a href=\"/search?f=tweets&q=%23$3\">$2$3</a>"
type
+1 -1
View File
@@ -8,7 +8,7 @@ const
"media", "images", "twimg", "videos",
"native_video", "consumer_video", "spaces",
"links", "news", "quote", "mentions",
"replies", "retweets", "nativeretweets"
"replies", "retweets", "nativeretweets", "cashtags"
]
emptyQuery* = "include:nativeretweets"
+2 -1
View File
@@ -15,7 +15,8 @@ const toggles = {
"links": "Links",
"images": "Images",
"quote": "Quotes",
"spaces": "Spaces"
"spaces": "Spaces",
"cashtags": "Cashtags"
}.toOrderedTable
proc renderSearch*(): VNode =
+32 -21
View File
@@ -1,27 +1,38 @@
from base import BaseTestCase, Conversation
from parameterized import parameterized
from base import BaseTestCase, Conversation
thread = [
['octonion/status/975253897697611777', [], 'Based', ['Crystal', 'Julia'], [
['For', 'Then', 'Okay,', 'Python', 'Speed', 'Java', 'Coding', 'I', 'You'],
['yeah,']
]],
['octonion/status/975254452625002496', ['Based'], 'Crystal', ['Julia'], []],
['octonion/status/975256058384887808', ['Based', 'Crystal'], 'Julia', [], []],
['gauravssnl/status/975364889039417344',
['Based', 'For', 'Then', 'Okay,', 'Python'], 'Speed', [], [
['Java', 'Coding', 'I', 'You'], ['JAVA!']
]],
['d0m96/status/1141811379407425537', [], 'I\'m',
['The', 'The', 'Today', 'Some', 'If', 'There', 'Above'],
[['Thank', 'Also,']]],
['gmpreussner/status/999766552546299904', [], 'A', [],
[['I', 'Especially'], ['I']]]
[
"octonion/status/975253897697611777",
[],
"Based",
["Crystal", "Julia"],
[["yeah,"]],
],
["octonion/status/975254452625002496", ["Based"], "Crystal", ["Julia"], []],
["octonion/status/975256058384887808", ["Based", "Crystal"], "Julia", [], []],
[
"gauravssnl/status/975364889039417344",
["Based", "For", "Then", "Okay,", "Python"],
"Speed",
[],
[["Java", "Coding", "I", "You"], ["JAVA!"]],
],
[
"d0m96/status/1141811379407425537",
[],
"I'm",
["The", "The", "Today", "Some", "If", "There", "Above"],
[["Thank", "Also,"]],
],
[
"gmpreussner/status/999766552546299904",
[],
"A",
[],
[["I", "Especially"], ["I"]],
],
]