Support tweet locations
This commit is contained in:
parent
80d6191e74
commit
f8f4487c33
|
@ -103,3 +103,8 @@ proc getTwitterLink*(path: string; params: Table[string, string]): string =
|
|||
result = $(parseUri("https://twitter.com") / path ? p)
|
||||
if username.len > 0:
|
||||
result = result.replace("/" & username, "")
|
||||
|
||||
proc getLocation*(u: Profile | Tweet): (string, string) =
|
||||
let loc = u.location.split(":")
|
||||
let url = if loc.len > 1: "/search?q=place:" & loc[1] else: ""
|
||||
(loc[0], url)
|
||||
|
|
|
@ -108,6 +108,7 @@ proc parseTweet*(node: XmlNode): Tweet =
|
|||
stats: parseTweetStats(tweet),
|
||||
reply: parseTweetReply(tweet),
|
||||
mediaTags: getMediaTags(tweet),
|
||||
location: getTweetLocation(tweet),
|
||||
hasThread: tweet.select(".content > .self-thread-context") != nil,
|
||||
pinned: "pinned" in tweet.attr("class"),
|
||||
available: true
|
||||
|
|
|
@ -285,3 +285,9 @@ proc getMediaTags*(node: XmlNode): seq[Profile] =
|
|||
let un = user["screen_name"].getStr
|
||||
if un notin usernames: continue
|
||||
result.add Profile(username: un, fullname: user["name"].getStr)
|
||||
|
||||
proc getTweetLocation*(node: XmlNode): string =
|
||||
let geo = node.select(".js-geo-pivot-link")
|
||||
if geo == nil: return
|
||||
result = geo.innerText().stripText()
|
||||
result &= ":" & geo.attr("data-place-id")
|
||||
|
|
|
@ -128,6 +128,10 @@
|
|||
font-size: 13px;
|
||||
}
|
||||
|
||||
.tweet-geo {
|
||||
color: var(--fg_faded);
|
||||
}
|
||||
|
||||
.replying-to {
|
||||
color: var(--fg_faded);
|
||||
margin: -2px 0 4px;
|
||||
|
@ -168,6 +172,7 @@
|
|||
.show-thread {
|
||||
display: block;
|
||||
pointer-events: all;
|
||||
padding-top: 2px;
|
||||
}
|
||||
|
||||
.unavailable-box {
|
||||
|
|
|
@ -147,6 +147,7 @@ type
|
|||
hasThread*: bool
|
||||
available*: bool
|
||||
tombstone*: string
|
||||
location*: string
|
||||
stats*: TweetStats
|
||||
retweet*: Option[Retweet]
|
||||
attribution*: Option[Profile]
|
||||
|
|
|
@ -31,11 +31,11 @@ proc renderProfileCard*(profile: Profile; prefs: Prefs): VNode =
|
|||
if profile.location.len > 0:
|
||||
tdiv(class="profile-location"):
|
||||
span: icon "location"
|
||||
let loc = profile.location.split(":")
|
||||
if loc.len > 1:
|
||||
a(href=("/search?q=place:" & loc[1])): text loc[0]
|
||||
let (place, url) = profile.getLocation()
|
||||
if url.len > 1:
|
||||
a(href=url): text place
|
||||
else:
|
||||
span: text loc[0]
|
||||
span: text place
|
||||
|
||||
if profile.website.len > 0:
|
||||
tdiv(class="profile-website"):
|
||||
|
|
|
@ -245,6 +245,17 @@ proc renderQuote(quote: Quote; prefs: Prefs): VNode =
|
|||
a(class="show-thread", href=getLink(quote)):
|
||||
text "Show this thread"
|
||||
|
||||
proc renderLocation*(tweet: Tweet): string =
|
||||
let (place, url) = tweet.getLocation()
|
||||
if place.len == 0: return
|
||||
let node = buildHtml(span(class="tweet-geo")):
|
||||
text " – at "
|
||||
if url.len > 1:
|
||||
a(href=url): text place
|
||||
else:
|
||||
text place
|
||||
return $node
|
||||
|
||||
proc renderTweet*(tweet: Tweet; prefs: Prefs; path: string; class="";
|
||||
index=0; total=(-1); last=false; showThread=false;
|
||||
mainTweet=false): VNode =
|
||||
|
@ -272,7 +283,7 @@ proc renderTweet*(tweet: Tweet; prefs: Prefs; path: string; class="";
|
|||
renderReply(tweet)
|
||||
|
||||
tdiv(class="tweet-content media-body", dir="auto"):
|
||||
verbatim replaceUrl(tweet.text, prefs)
|
||||
verbatim replaceUrl(tweet.text, prefs) & renderLocation(tweet)
|
||||
|
||||
if tweet.attribution.isSome:
|
||||
renderAttribution(tweet.attribution.get())
|
||||
|
|
Loading…
Reference in New Issue