Ver Fonte

Add canonical header to help search engines

Fixes #472
Zed há 4 anos atrás
pai
commit
eed4d4033f
3 ficheiros alterados com 16 adições e 9 exclusões
  1. 1 1
      src/formatters.nim
  2. 4 2
      src/utils.nim
  3. 11 6
      src/views/general.nim

+ 1 - 1
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",

+ 4 - 2
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

+ 11 - 6
src/views/general.nim

@@ -11,8 +11,7 @@ const
   doctype = "<!DOCTYPE html>\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