#? stdtmpl(subsChar = '$', metaChar = '#') #import xmltree, strutils, strformat, sequtils, times, uri #import ../types, ../formatters, ../utils # #proc renderHeading(tweet: Tweet): string = #if tweet.retweet.isSome:
🔄 ${get(tweet.retweet).by} retweeted
#end if #if tweet.pinned:
📌 Pinned Tweet
#end if
${genImg(tweet.profile.getUserpic("_bigger"), "avatar")}
${linkUser(tweet.profile, class="fullname")} ${linkUser(tweet.profile, class="username")}
${tweet.shortTime}
#end proc # #proc renderMediaGroup(tweet: Tweet): string = #let groups = if tweet.photos.len > 2: tweet.photos.distribute(2) else: @[tweet.photos] #let class = if groups.len == 1 and groups[0].len == 1: "single-image" else: "" #var first = true
#for photos in groups: #let margin = if not first: "margin-top: .25em;" else: "" #let flex = if photos.len > 1 or groups.len > 1: "display: flex;" else: "" #first = false #end for
#end proc # #proc renderVideo(video: Video): string =
#end proc # #proc renderGif(gif: Gif): string =
#end proc # #proc renderPoll(poll: Poll): string =
#for i in 0 ..< poll.options.len: #let leader = if poll.leader == i: " leader" else: ""
${poll.values[i]}% ${poll.options[i]}
#end for ${poll.votes} votes • ${poll.status}
#end proc # #proc renderStats(stats: TweetStats): string =
💬 ${$stats.replies} 🔄 ${$stats.retweets} 👍 ${$stats.likes}
#end proc # #proc renderShowThread(tweet: Tweet | Quote): string = Show this thread #end proc # #proc renderReply(tweet: Tweet | Quote): string = #let usernames = tweet.reply.mapIt(&"""@{it}""")
Replying to ${usernames.join(" ")}
#end proc # #proc renderQuote(quote: Quote): string = #let hasMedia = quote.thumb.len > 0 or quote.sensitive #if not quote.available:
This tweet is unavailable
#return #end if
#if hasMedia:
#if quote.thumb.len > 0: ${genImg(quote.thumb)} #if quote.badge.len > 0:
${quote.badge}
#end if #elif quote.sensitive:
#end if
#end if
${linkUser(quote.profile, class="fullname")} ${linkUser(quote.profile, class="username")}
#if quote.reply.len > 0: ${renderReply(quote)} #end if
${linkifyText(quote.text)}
#if quote.hasThread: ${renderShowThread(quote)} #end if
#end proc # #proc renderTweet*(tweet: Tweet; class=""; first=true; last=false): string = #var divClass = if last: "thread-last " & class else: class #if divClass.len > 0:
#end if #if tweet.available:
${renderHeading(tweet)} #if first and tweet.reply.len > 0: ${renderReply(tweet)} #end if
${linkifyText(tweet.text)}
#if tweet.photos.len > 0: ${renderMediaGroup(tweet)} #elif tweet.video.isSome: ${renderVideo(tweet.video.get())} #elif tweet.gif.isSome: ${renderGif(tweet.gif.get())} #elif tweet.quote.isSome: ${renderQuote(tweet.quote.get())} #elif tweet.poll.isSome: ${renderPoll(tweet.poll.get())} #end if ${renderStats(tweet.stats)} #if tweet.hasThread and "timeline" in class: ${renderShowThread(tweet)} #end if
#else:
This tweet is unavailable
#end if #if divClass.len > 0:
#end if #end proc