#? stdtmpl(subsChar = '$', metaChar = '#') ## SPDX-License-Identifier: AGPL-3.0-only #import strutils, xmltree, strformat, options, unicode #import ../types, ../utils, ../formatters, ../prefs # #proc getTitle(tweet: Tweet; retweet: string): string = #if tweet.pinned: result = "Pinned: " #elif retweet.len > 0: result = &"RT by @{retweet}: " #elif tweet.reply.len > 0: result = &"R to @{tweet.reply[0]}: " #end if #var text = stripHtml(tweet.text) ##if unicode.runeLen(text) > 32: ## text = unicode.runeSubStr(text, 0, 32) & "..." ##end if #result &= xmltree.escape(text) #if result.len > 0: return #end if #if tweet.photos.len > 0: # result &= "Image" #elif tweet.video.isSome: # result &= "Video" #elif tweet.gif.isSome: # result &= "Gif" #end if #end proc # #proc getDescription(desc: string; cfg: Config): string = Twitter feed for: ${desc}. Generated by ${cfg.hostname} #end proc # #proc renderRssTweet(tweet: Tweet; cfg: Config): string = #let tweet = tweet.retweet.get(tweet) #let urlPrefix = getUrlPrefix(cfg) #let text = replaceUrls(tweet.text, defaultPrefs, absolute=urlPrefix)

${text.replace("\n", "
\n")}

#if tweet.quote.isSome and get(tweet.quote).available: # let quoteLink = getLink(get(tweet.quote))

${cfg.hostname}${quoteLink}

#end if #if tweet.photos.len > 0: # for photo in tweet.photos: # end for #elif tweet.video.isSome: #elif tweet.gif.isSome: # let thumb = &"{urlPrefix}{getPicUrl(get(tweet.gif).thumb)}" # let url = &"{urlPrefix}{getPicUrl(get(tweet.gif).url)}" #elif tweet.card.isSome: # let card = tweet.card.get() # if card.image.len > 0: # end if #end if #end proc # #proc renderRssTweets(tweets: seq[Tweet]; cfg: Config): string = #let urlPrefix = getUrlPrefix(cfg) #var links: seq[string] #for t in tweets: # let retweet = if t.retweet.isSome: t.user.username else: "" # let tweet = if retweet.len > 0: t.retweet.get else: t # let link = getLink(tweet) # if link in links: continue # end if # links.add link ${getTitle(tweet, retweet)} @${tweet.user.username} ${getRfc822Time(tweet)} ${urlPrefix & link} ${urlPrefix & link} #end for #end proc # #proc renderTimelineRss*(profile: Profile; cfg: Config; multi=false): string = #let urlPrefix = getUrlPrefix(cfg) #result = "" #let handle = (if multi: "" else: "@") & profile.user.username #var title = profile.user.fullname #if not multi: title &= " / " & handle #end if #title = xmltree.escape(title).sanitizeXml ${title} ${urlPrefix}/${profile.user.username} ${getDescription(handle, cfg)} en-us 40 ${title} ${urlPrefix}/${profile.user.username} ${urlPrefix}${getPicUrl(profile.user.getUserPic(style="_400x400"))} 128 128 #if profile.tweets.content.len > 0: ${renderRssTweets(profile.tweets.content, cfg)} #end if #end proc # #proc renderListRss*(tweets: seq[Tweet]; list: List; cfg: Config): string = #let link = &"{getUrlPrefix(cfg)}/i/lists/{list.id}" #result = "" ${xmltree.escape(list.name)} / @${list.username} ${link} ${getDescription(&"{list.name} by @{list.username}", cfg)} en-us 40 ${renderRssTweets(tweets, cfg)} #end proc # #proc renderSearchRss*(tweets: seq[Tweet]; name, param: string; cfg: Config): string = #let link = &"{getUrlPrefix(cfg)}/search" #let escName = xmltree.escape(name) #result = "" Search results for "${escName}" ${link} ${getDescription(&"Search \"{escName}\"", cfg)} en-us 40 ${renderRssTweets(tweets, cfg)} #end proc