Add dynamic page title

This commit is contained in:
Zed 2019-06-24 22:40:48 +02:00
parent fb3c8ab5c3
commit 38565e2e1f
4 changed files with 17 additions and 9 deletions

View file

@ -7,9 +7,9 @@ Inspired by the [invidio.us](https://github.com/omarroth/invidious) project.
- All requests go through the backend, client never talks to Twitter - All requests go through the backend, client never talks to Twitter
- Prevents Twitter from tracking your IP or JavaScript fingerprint - Prevents Twitter from tracking your IP or JavaScript fingerprint
- Unofficial API (no rate limits or developer account required) - Unofficial API (no rate limits or developer account required)
- Lightweight (for [@nim_lang](https://twitter.com/nim_lang), 32KB vs 552KB from twitter.com)
- AGPLv3 licensed, no proprietary instances permitted - AGPLv3 licensed, no proprietary instances permitted
- Dark theme - Dark theme
- Lightweight (for [@nim_lang](https://twitter.com/nim_lang), 36KB vs 580KB from twitter.com)
## Installation ## Installation

View file

@ -79,3 +79,9 @@ proc linkUser*(profile: Profile; class=""): string =
result &= span("", class="verified-icon", title="Verified account") result &= span("", class="verified-icon", title="Verified account")
if not username and profile.protected: if not username and profile.protected:
result &= span("🔒", class="protected-icon", title="Protected account") result &= span("🔒", class="protected-icon", title="Protected account")
proc pageTitle*(profile: Profile): string =
&"{profile.fullname} (@{profile.username}) | Nitter"
proc pageTitle*(page: string): string =
&"{page} | Nitter"

View file

@ -1,7 +1,7 @@
import asyncdispatch, asyncfile, httpclient, strutils, uri, os import asyncdispatch, asyncfile, httpclient, strutils, strformat, uri, os
import jester import jester
import api, utils, types, cache import api, utils, types, cache, formatters
import views/[user, general, conversation] import views/[user, general, conversation]
const cacheDir {.strdefine.} = "/tmp/nitter" const cacheDir {.strdefine.} = "/tmp/nitter"
@ -16,11 +16,12 @@ proc showTimeline(name: string; num=""): Future[string] {.async.} =
if profile.username.len == 0: if profile.username.len == 0:
return "" return ""
return renderMain(renderProfile(profile, await tweetsFut, num.len == 0)) let profileHtml = renderProfile(profile, await tweetsFut, num.len == 0)
return renderMain(profileHtml, title=pageTitle(profile))
routes: routes:
get "/": get "/":
resp renderMain(renderSearchPanel()) resp renderMain(renderSearchPanel(), title=pageTitle("Search"))
post "/search": post "/search":
if @"query".len == 0: if @"query".len == 0:
@ -44,7 +45,8 @@ routes:
if conversation.tweet.id.len == 0: if conversation.tweet.id.len == 0:
resp Http404, showError("Tweet not found") resp Http404, showError("Tweet not found")
resp renderMain(renderConversation(conversation)) let title = pageTitle(conversation.tweet.profile)
resp renderMain(renderConversation(conversation), title=title)
get "/pic/@sig/@url": get "/pic/@sig/@url":
cond "http" in @"url" cond "http" in @"url"

View file

@ -2,11 +2,11 @@
#import user #import user
#import xmltree #import xmltree
# #
#proc renderMain*(body: string): string = #proc renderMain*(body: string; title="Nitter"): string =
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Nitter</title> <title>${xmltree.escape(title)}</title>
<link rel="stylesheet" type="text/css" href="/style.css"> <link rel="stylesheet" type="text/css" href="/style.css">
</head> </head>
@ -46,5 +46,5 @@
#end proc #end proc
# #
#proc showError*(error: string): string = #proc showError*(error: string): string =
${renderMain(renderError(error))} ${renderMain(renderError(error), title="Error | Nitter")}
#end proc #end proc