Browse Source

feat: implement Open Graph protocol

Also made site title compatible with Urban Dictionary one.
Zubarev Grigoriy 7 months ago
parent
commit
f12c208049
3 changed files with 30 additions and 4 deletions
  1. 0 1
      pyproject.toml
  2. 18 2
      src/rural_dict/__main__.py
  3. 12 1
      src/rural_dict/templates/index.html

+ 0 - 1
pyproject.toml

@@ -78,7 +78,6 @@ select = [
     "SIM", # flake8-simplify
     "RET", # flake8-return
     "YTT", # flake8-2020
-    "DTZ", # flake8-datetimez
     "RUF", # ruff-specific rules
     "TCH", # flake8-type-checking
     "PTH", # flake8-use-pathlib

+ 18 - 2
src/rural_dict/__main__.py

@@ -1,4 +1,5 @@
 from contextlib import asynccontextmanager
+from datetime import datetime
 from json import JSONDecodeError
 from pathlib import Path
 
@@ -62,9 +63,13 @@ async def catch_all(response: Request):
     except (KeyError, JSONDecodeError):
         thumbs_data = {}
 
+    site_description = None
     for definition in definitions:
         word = definition.css_first("a.word").text()
-        meaning = remove_classes(definition.css_first("div.meaning")).html
+        meaning_node = remove_classes(definition.css_first("div.meaning"))
+        if site_description is None:
+            site_description = meaning_node.text(strip=True, separator=" ")
+        meaning = meaning_node.html
         example = remove_classes(definition.css_first("div.example")).html
         contributor = remove_classes(definition.css_first("div.contributor")).html
         definition_id = int(definition.attributes["data-defid"] or "-1")
@@ -79,13 +84,24 @@ async def catch_all(response: Request):
         pagination.attrs["class"] = "pagination"  # pyright: ignore [reportIndexIssue]
         pagination = pagination.html
 
+    term = response.query_params.get("term", results[0][1])
+    site_title = "Rural Dictionary"
+    match response.url.path:
+        case "/":
+            # add current date for page with words of the day
+            site_title += f', {datetime.now().strftime("%d %B")}'
+        case "/random.php":
+            term = "Random words"
+    site_title += f": {term}"
+
     return templates.TemplateResponse(
         "index.html",
         {
             "request": response,
             "results": results,
             "pagination": pagination,
-            "term": response.query_params.get("term"),
+            "site_title": site_title,
+            "site_description": site_description,
         },
     )
 

+ 12 - 1
src/rural_dict/templates/index.html

@@ -1,12 +1,22 @@
 <!doctype html>
 <html lang="en">
   <head>
-    <title>Rural Dictionary{% if term %}: {{ term }}{% endif %}</title>
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
     <meta name="robots" content="index, follow" />
     <link rel="stylesheet" href="{{ url_for('static', path='css/main.css') }}" />
     <link rel="icon" type="image/png" href="{{ url_for('static', path='img/favicon.png') }}" />
+    <title>{{ site_title }}</title>
+    <meta name="description" content="{{ site_description }}" />
+    <!-- Open Graph meta tags -->
+    <meta property="og:url" content="{{ request.url }}" />
+    <meta property="og:type" content="website" />
+    <meta property="og:title" content="{{ site_title }}" />
+    <meta property="og:description" content="{{ site_description }}" />
+    <meta property="twitter:domain" content="{{ request.url.hostname }}" />
+    <meta property="twitter:url" content="{{ request.url }}" />
+    <meta name="twitter:title" content="{{ site_title }}" />
+    <meta name="twitter:description" content="{{ site_description }}" />
   </head>
   <body>
     <div style="text-align: center">
@@ -20,6 +30,7 @@
           id="term"
           name="term"
           placeholder="Search"
+          aria-label="Search"
           autofocus
         />
         <button>Go</button>