aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2025-10-11 22:18:08 +0200
committerDaniel Schadt <kingdread@gmx.de>2025-10-11 22:18:08 +0200
commit028cc8bd08f4e2442539a1c840ceffe725d20f6d (patch)
tree5fcb455dbceaedc62a2c549b6ca2b0069b8c47f4
parentd3da26e6ab79fdb222a30854960967374a1e5c52 (diff)
parente56d0d0fcf9914d43ffec1686b76771143570132 (diff)
downloadfietsboek-028cc8bd08f4e2442539a1c840ceffe725d20f6d.tar.gz
fietsboek-028cc8bd08f4e2442539a1c840ceffe725d20f6d.tar.bz2
fietsboek-028cc8bd08f4e2442539a1c840ceffe725d20f6d.zip
Merge branch 'opengraph-tags'
-rw-r--r--fietsboek/templates/details.jinja217
-rw-r--r--fietsboek/templates/layout.jinja21
-rw-r--r--fietsboek/views/detail.py32
3 files changed, 50 insertions, 0 deletions
diff --git a/fietsboek/templates/details.jinja2 b/fietsboek/templates/details.jinja2
index d8c9250..631149c 100644
--- a/fietsboek/templates/details.jinja2
+++ b/fietsboek/templates/details.jinja2
@@ -1,6 +1,23 @@
{% extends "layout.jinja2" %}
{% import "util.jinja2" as util with context %}
+{% block extrahead %}
+{% if 'secret' in request.GET %}
+{% set preview_url = request.route_url('track-map', track_id=track.id, _query=[('secret', request.GET['secret'])]) %}
+{% else %}
+{% set preview_url = request.route_url('track-map', track_id=track.id) %}
+{% endif %}
+<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="{{ preview_url }}">
+<meta property="og:image:url" content="{{ preview_url }}">
+<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,
}