From eed4d4033fe602278a03d960fca0498f7093de25 Mon Sep 17 00:00:00 2001 From: Zed Date: Thu, 30 Dec 2021 03:59:11 +0100 Subject: [PATCH] Add canonical header to help search engines Fixes #472 --- src/formatters.nim | 2 +- src/utils.nim | 6 ++++-- src/views/general.nim | 17 +++++++++++------ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/formatters.nim b/src/formatters.nim index f2cdfcf..6119024 100644 --- a/src/formatters.nim +++ b/src/formatters.nim @@ -158,7 +158,7 @@ proc getTwitterLink*(path: string; params: Table[string, string]): string = path = "/search" if "/search" notin path and query.fromUser.len < 2: - return $(twitter / path ? filterParams(params)) + return $(twitter / path) let p = { "f": if query.kind == users: "user" else: "live", diff --git a/src/utils.nim b/src/utils.nim index 518d7af..e92d220 100644 --- a/src/utils.nim +++ b/src/utils.nim @@ -52,8 +52,10 @@ proc cleanFilename*(filename: string): string = result &= ".png" proc filterParams*(params: Table): seq[(string, string)] = - const filter = ["name", "id", "list", "referer", "scroll"] - toSeq(params.pairs()).filterIt(it[0] notin filter and it[1].len > 0) + const filter = ["name", "tab", "id", "list", "referer", "scroll"] + for p in params.pairs(): + if p[1].len > 0 and p[0] notin filter: + result.add p proc isTwitterUrl*(uri: Uri): bool = uri.hostname in twitterDomains diff --git a/src/views/general.nim b/src/views/general.nim index 144b8cc..1d10811 100644 --- a/src/views/general.nim +++ b/src/views/general.nim @@ -11,8 +11,7 @@ const doctype = "\n" lp = readFile("public/lp.svg") -proc renderNavbar*(cfg: Config, rss: string; req: Request): VNode = - let twitterPath = getTwitterLink(req.path, req.params) +proc renderNavbar(cfg: Config; req: Request; rss, canonical: string): VNode = var path = $(parseUri(req.path) ? filterParams(req.params)) if "/status" in path: path.add "#m" @@ -27,14 +26,14 @@ proc renderNavbar*(cfg: Config, rss: string; req: Request): VNode = icon "search", title="Search", href="/search" if cfg.enableRss and rss.len > 0: icon "rss-feed", title="RSS Feed", href=rss - icon "bird", title="Open in Twitter", href=twitterPath + icon "bird", title="Open in Twitter", href=canonical a(href="https://liberapay.com/zedeus"): verbatim lp icon "info", title="About", href="/about" iconReferer "cog", "/settings", path, title="Preferences" proc renderHead*(prefs: Prefs; cfg: Config; titleText=""; desc=""; video=""; images: seq[string] = @[]; banner=""; ogTitle=""; theme=""; - rss=""): VNode = + rss=""; canonical=""): VNode = let ogType = if video.len > 0: "video" elif rss.len > 0: "object" @@ -58,6 +57,9 @@ proc renderHead*(prefs: Prefs; cfg: Config; titleText=""; desc=""; video=""; link(rel="search", type="application/opensearchdescription+xml", title=cfg.title, href=opensearchUrl) + if canonical.len > 0: + link(rel="canonical", href=canonical) + if cfg.enableRss and rss.len > 0: link(rel="alternate", type="application/rss+xml", href=rss, title="RSS feed") @@ -117,11 +119,14 @@ proc renderMain*(body: VNode; req: Request; cfg: Config; prefs=defaultPrefs; if "theme" in req.params: theme = toLowerAscii(req.params["theme"]).replace(" ", "_") + let canonical = getTwitterLink(req.path, req.params) + let node = buildHtml(html(lang="en")): - renderHead(prefs, cfg, titleText, desc, video, images, banner, ogTitle, theme, rss) + renderHead(prefs, cfg, titleText, desc, video, images, banner, ogTitle, + theme, rss, canonical) body: - renderNavbar(cfg, rss, req) + renderNavbar(cfg, req, rss, canonical) tdiv(class="container"): body