Show SPARQL query on details page with link to WDQS

Closes: #23
This commit is contained in:
Edward Betts 2024-01-10 16:24:54 +00:00
parent b631476844
commit 1625f3d5d1
3 changed files with 31 additions and 4 deletions

View file

@ -102,17 +102,17 @@ def wd_uri_to_qid(value: str) -> str:
return value[len(wd_entity) - 1 :] return value[len(wd_entity) - 1 :]
def geosearch_query(lat: float, lon: float) -> list[Row]: def geosearch_query(lat: float, lon: float) -> str:
"""Geosearch via WDQS.""" """Geosearch via WDQS."""
lat_str, lon_str = f"{lat:f}", f"{lon:f}" lat_str, lon_str = f"{lat:f}", f"{lon:f}"
query = render_template("sparql/geosearch.sparql", lat=lat_str, lon=lon_str) query = render_template("sparql/geosearch.sparql", lat=lat_str, lon=lon_str)
return wdqs(query) return query
def geosearch(lat: float, lon: float) -> Row | None: def geosearch(lat: float, lon: float) -> Row | None:
"""Geosearch.""" """Geosearch."""
default_max_dist = 1 default_max_dist = 1
rows = geosearch_query(lat, lon) rows = wdqs(geosearch_query(lat, lon))
max_dist = { max_dist = {
"Q188509": 1, # suburb "Q188509": 1, # suburb
"Q3957": 2, # town "Q3957": 2, # town

View file

@ -12,6 +12,9 @@ from time import time
import sqlalchemy.exc import sqlalchemy.exc
import werkzeug.debug.tbtools import werkzeug.debug.tbtools
from flask import Flask, jsonify, redirect, render_template, request, url_for from flask import Flask, jsonify, redirect, render_template, request, url_for
from pygments import highlight
from pygments.formatters import HtmlFormatter
from pygments.lexers import SparqlLexer
from sqlalchemy import func from sqlalchemy import func
from sqlalchemy.orm.query import Query from sqlalchemy.orm.query import Query
from werkzeug.wrappers import Response from werkzeug.wrappers import Response
@ -138,7 +141,9 @@ def lat_lon_to_wikidata(lat: float, lon: float) -> dict[str, typing.Any]:
elements = [] elements = []
result = wikidata.build_dict(hit, lat, lon) result = wikidata.build_dict(hit, lat, lon)
return {"elements": elements, "result": result} query = wikidata.geosearch_query(lat, lon)
return {"elements": elements, "result": result, "query": query}
def get_admin_level(tags: Tags) -> int | None: def get_admin_level(tags: Tags) -> int | None:
@ -301,6 +306,16 @@ def wikidata_tag() -> str:
) )
def highlight_sparql(query: str) -> str:
"""Highlight SPARQL query syntax using Pygments."""
lexer = SparqlLexer()
formatter = HtmlFormatter()
return highlight(query, lexer, formatter)
app.jinja_env.filters["highlight_sparql"] = highlight_sparql
def build_detail_page(lat: float, lon: float) -> str: def build_detail_page(lat: float, lon: float) -> str:
"""Run lookup and build detail page.""" """Run lookup and build detail page."""
if lat < -90 or lat > 90 or lon < -180 or lon > 180: if lat < -90 or lat > 90 or lon < -180 or lon > 180:
@ -319,6 +334,8 @@ def build_detail_page(lat: float, lon: float) -> str:
element = reply["result"].pop("element", None) element = reply["result"].pop("element", None)
geojson = reply["result"].pop("geojson", None) geojson = reply["result"].pop("geojson", None)
css = HtmlFormatter().get_style_defs(".highlight")
return render_template( return render_template(
"detail.html", "detail.html",
lat=lat, lat=lat,
@ -326,6 +343,7 @@ def build_detail_page(lat: float, lon: float) -> str:
str=str, str=str,
element_id=element, element_id=element,
geojson=geojson, geojson=geojson,
css=css,
**reply, **reply,
) )

View file

@ -54,6 +54,8 @@ L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
width: 48% width: 48%
} }
{{ css | safe }}
</style> </style>
{% endblock %} {% endblock %}
@ -96,6 +98,13 @@ L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
<p>No elements found</p> <p>No elements found</p>
{% endif %} {% endif %}
{% if query %}
<p>Searching for Wikimedia Commons categories using this SPARQL query. <a href="https://query.wikidata.org/#{{ query | urlencode }}">Wikidata Query service</a></p>
<div>
{{ query | highlight_sparql | safe }}
</div>
{% endif %}
{% for element in elements %} {% for element in elements %}
{% set tags = element.tags %} {% set tags = element.tags %}
<div class="rounded border border-4 p-1 my-2{% if element_id == element.osm_id %} bg-primary-subtle{% endif %}"> <div class="rounded border border-4 p-1 my-2{% if element_id == element.osm_id %} bg-primary-subtle{% endif %}">