aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2025-10-03 17:30:23 +0200
committerDaniel Schadt <kingdread@gmx.de>2025-10-03 17:30:23 +0200
commitc19f244ed4f8cd9e4f612a631149329309af2104 (patch)
tree897965306b2372470d0c29bb49bba3453b7dcb23
parentd3da26e6ab79fdb222a30854960967374a1e5c52 (diff)
downloadfietsboek-c19f244ed4f8cd9e4f612a631149329309af2104.tar.gz
fietsboek-c19f244ed4f8cd9e4f612a631149329309af2104.tar.bz2
fietsboek-c19f244ed4f8cd9e4f612a631149329309af2104.zip
add opengraph tags
-rw-r--r--fietsboek/templates/details.jinja212
-rw-r--r--fietsboek/templates/layout.jinja21
-rw-r--r--fietsboek/views/detail.py32
3 files changed, 45 insertions, 0 deletions
diff --git a/fietsboek/templates/details.jinja2 b/fietsboek/templates/details.jinja2
index d8c9250..4fd3341 100644
--- a/fietsboek/templates/details.jinja2
+++ b/fietsboek/templates/details.jinja2
@@ -1,6 +1,18 @@
{% extends "layout.jinja2" %}
{% import "util.jinja2" as util with context %}
+{% block extrahead %}
+<meta property="og:title" content="{{ track.title | default(track.date | format_datetime, true) }}">
+<meta property="og:type" content="website">
+<meta property="og:url" content="{{ request.url }}">
+<meta property="og:image" content="{{ request.route_url('track-map', track_id=track.id) }}">
+<meta property="og:image:url" content="{{ request.route_url('track-map', track_id=track.id) }}">
+<meta property="og:image:type" content="image/png">
+<meta property="og:image:alt" content="Track overview">
+<meta property="og:description" content="{{ (track.length / 1000) | round(2) | format_decimal }} km{% if og_description %}: {{ og_description }}{% endif %}">
+<meta property="og:site_name" content="Fietsboek">
+{% endblock %}
+
{% block content %}
<div class="container">
<h1>
diff --git a/fietsboek/templates/layout.jinja2 b/fietsboek/templates/layout.jinja2
index c96716d..e1ce5db 100644
--- a/fietsboek/templates/layout.jinja2
+++ b/fietsboek/templates/layout.jinja2
@@ -32,6 +32,7 @@ const Fullscreenbutton = true;
const Legende = false;
</script>
+ {% block extrahead %}{% endblock %}
</head>
<body>
diff --git a/fietsboek/views/detail.py b/fietsboek/views/detail.py
index acc7bfe..209b516 100644
--- a/fietsboek/views/detail.py
+++ b/fietsboek/views/detail.py
@@ -4,8 +4,10 @@ import datetime
import gzip
import io
import logging
+from html.parser import HTMLParser
import gpxpy
+from markupsafe import Markup
from pyramid.httpexceptions import (
HTTPFound,
HTTPInternalServerError,
@@ -36,6 +38,34 @@ def _sort_key(image_name: str) -> str:
return image_name.split("_", 1)[1]
+class _DescriptionParser(HTMLParser):
+ # We don't go overboard with the parsing here, as we expect to only be fed
+ # output from the markdown conversion (so simple documents)
+ def __init__(self):
+ super().__init__()
+ self.par = False
+ self.text = ""
+
+ def handle_starttag(self, tag, attrs):
+ if tag == "p":
+ self.par = True
+
+ def handle_endtag(self, tag):
+ if tag == "p":
+ self.par = False
+
+ def handle_data(self, data):
+ if self.par:
+ self.text += data
+
+
+def _og_description(description: Markup) -> str:
+ """Returns a truncated, non-marked up description of the given input description."""
+ parser = _DescriptionParser()
+ parser.feed(str(description))
+ return parser.text
+
+
@view_config(
route_name="details", renderer="fietsboek:templates/details.jinja2", permission="track.view"
)
@@ -49,6 +79,7 @@ def details(request):
"""
track = request.context
description = util.safe_markdown(track.description)
+ og_description = _og_description(description)
show_edit_link = track.owner == request.identity
on_disk_images = []
@@ -83,6 +114,7 @@ def details(request):
"mps_to_kph": util.mps_to_kph,
"comment_md_to_html": util.safe_markdown,
"description": description,
+ "og_description": og_description,
"images": images,
}