瀏覽代碼

Render article cards and polls in RSS feed

Fixes #679
Zed 2 月之前
父節點
當前提交
3e290eab6a
共有 1 個文件被更改,包括 56 次插入2 次删除
  1. 56 2
      src/views/rss.nimf

+ 56 - 2
src/views/rss.nimf

@@ -12,7 +12,7 @@
 #elif retweet.len > 0: prefix = &"RT by @{retweet}: "
 #elif tweet.reply.len > 0: prefix = &"R to @{tweet.reply[0]}: "
 #end if
-#var text = stripHtml(tweet.text)
+#var text = strutils.splitWhitespace(stripHtml(tweet.text)).join(" ")
 ##if unicode.runeLen(text) > 32:
 ##  text = unicode.runeSubStr(text, 0, 32) & "..."
 ##end if
@@ -34,6 +34,12 @@
 #    end case
 #  end if
 #end if
+#if result.len == 0 and tweet.articlePreview.isSome:
+#  let art = tweet.articlePreview.get()
+#  if art.title.len > 0:
+#    result = prefix & xmltree.escape(art.title)
+#  end if
+#end if
 #if result.len == 0 and tweet.card.isSome:
 #  let card = tweet.card.get()
 #  if card.kind notin {hidden, unknown} and card.title.len > 0:
@@ -69,6 +75,8 @@ Twitter feed for: ${desc}. Generated by ${getUrlPrefix(cfg)}
 #proc renderRssCard(card: Card; prefs: Prefs; urlPrefix: string): string =
 #let cardLink = if card.url.startsWith("/"): urlPrefix & card.url else: replaceUrls(card.url, prefs)
 #let title = xmltree.escape(card.title)
+<hr/>
+<b>Link</b><br>
 #if cardLink.len > 0:
 <a href="${xmltree.escape(cardLink)}">
 #end if
@@ -87,11 +95,49 @@ Twitter feed for: ${desc}. Generated by ${getUrlPrefix(cfg)}
 #if card.text.len > 0:
 <p>${xmltree.escape(card.text)}</p>
 #end if
-#if card.dest.len > 0:
+#if cardLink.len > 0:
+#  let destText = if card.dest.len > 0: xmltree.escape(card.dest) else: xmltree.escape(cardLink)
+<small><a href="${xmltree.escape(cardLink)}">${destText}</a></small>
+#elif card.dest.len > 0:
 <small>${xmltree.escape(card.dest)}</small>
 #end if
 #end proc
 #
+#proc renderRssArticle(article: ArticlePreview; urlPrefix: string): string =
+#let link = urlPrefix & "/i/article/" & $article.tweetId
+<hr/>
+<b>Article</b><br>
+<a href="${link}">
+#if article.coverImage.len > 0:
+<img src="${urlPrefix}${getPicUrl(article.coverImage)}" style="max-width:250px;" />
+#end if
+#if article.title.len > 0:
+#  if article.coverImage.len > 0:
+<br>
+#  end if
+<b>${xmltree.escape(article.title)}</b>
+#end if
+</a>
+#if article.previewText.len > 0:
+<p>${xmltree.escape(article.previewText)}</p>
+#end if
+#end proc
+#
+#proc renderRssPoll(poll: Poll): string =
+<hr/>
+<b>Poll</b>
+<p>
+#for i in 0 ..< poll.options.len:
+#  let perc = if poll.votes > 0: poll.values[i] / poll.votes * 100 else: 0.0
+#  let pct = (&"{perc:.0f}").strip(chars={'.'})
+#  let line = pct & "% — " & xmltree.escape(poll.options[i])
+${line}<br>
+#end for
+#let votesStr = insertSep($poll.votes, ',')
+<i>${votesStr} votes • ${xmltree.escape(poll.status)}</i>
+</p>
+#end proc
+#
 #proc getTweetsWithPinned(profile: Profile): seq[Tweets] =
 #result = profile.tweets.content
 #if profile.pinned.isSome and result.len > 0:
@@ -114,7 +160,9 @@ Twitter feed for: ${desc}. Generated by ${getUrlPrefix(cfg)}
 #let tweet = tweet.retweet.get(tweet)
 #let urlPrefix = getUrlPrefix(cfg)
 #let text = replaceUrls(tweet.text, prefs, absolute=urlPrefix)
+#if text.len > 0:
 <p>${text.replace("\n", "<br>\n")}</p>
+#end if
 #if tweet.media.len > 0:
 #  for media in tweet.media:
 ${renderRssMedia(media, tweet, urlPrefix)}
@@ -122,6 +170,12 @@ ${renderRssMedia(media, tweet, urlPrefix)}
 #elif tweet.card.isSome and tweet.card.get().kind notin {hidden, unknown}:
 ${renderRssCard(tweet.card.get(), prefs, urlPrefix)}
 #end if
+#if tweet.articlePreview.isSome:
+${renderRssArticle(tweet.articlePreview.get(), urlPrefix)}
+#end if
+#if tweet.poll.isSome:
+${renderRssPoll(tweet.poll.get())}
+#end if
 #if tweet.note.len > 0 and not prefs.hideCommunityNotes:
 <p><b>Community note:</b> ${replaceUrls(tweet.note, prefs, absolute=urlPrefix)}</p>
 #end if