Web-LangTag/search.py
Stephane Bortzmeyer ff68c1111f * List of HTML files
* Improved search script
2023-08-01 20:58:15 +02:00

88 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python3
# You can test it with:
# curl --request POST --data string=foobar\&what=language http://localhost:4000
import wsgiref.simple_server as server
import urllib.parse
# PostgreSQL interface
import psycopg2
# HTML templates http://www.yattag.org/
from yattag import Doc
PORT = 4000
#REDIRECTION_URL = "file:///home/stephane/src/Language-tags/GaBuZoMeu/registry-html" # Firefox does not accept a redirect to a file
REDIRECTION_URL = "https://www.langtag.net/registries/registry-html"
def pack(start_response, status, data, headers = []):
datae = data.encode() # Always encode to UTF-8
response_headers = [("Content-type", "text/plain; charset=UTF-8"), # TODO allows the type HTML
("Content-Length", str(len(datae)))]
if headers != []:
for header in headers:
response_headers.append(header)
start_response(status, response_headers)
return [datae]
def application(environ, start_response):
if environ["REQUEST_METHOD"] != "POST":
status = "405 Method unavailable"
output = "Unsupported HTTP method \"%s\"\r\n" % environ["REQUEST_METHOD"]
return pack(start_response, status, output)
try:
body_size = int(environ.get("CONTENT_LENGTH", 0))
except (ValueError):
body_size = 0
body = environ["wsgi.input"].read(body_size)
query = urllib.parse.parse_qsl(body.decode())
form = {}
headers = []
for q in query:
form[q[0]] = q[1]
for mandatory in ["string", "what"]:
if mandatory not in form:
status = "400 Invalid request"
output = "Missing \"%s\" in request\r\n" % mandatory
return pack(start_response, status, output)
if form["what"] == "language":
sql = "SELECT * FROM Languages WHERE code = %s"
term = form["string"].lower()
elif form["what"] == "script":
sql = "SELECT * FROM Scripts WHERE code = %s"
term = form["string"].capitalize()
else:
status = "400 Invalid request"
output = "Unknown search category \"%s\"\r\n" % form["what"]
return pack(start_response, status, output)
cursor.execute(sql, (term, ))
mytuple = cursor.fetchone()
status = "200 OK"
if mytuple is not None:
status = "308 Redirect"
url = "%s/%s/%s.html" % (REDIRECTION_URL, form["what"], mytuple[1])
headers.append(("Location", url))
output = "Redirect to %s\r\n" % (url)
else:
if form["what"] == "language":
sql = "SELECT * FROM Languages,Descriptions_Languages,Descriptions WHERE Descriptions_Languages.description = Descriptions.id AND Descriptions_Languages.lang = Languages.code AND position(%s in lower(Descriptions.description)) > 0;"
elif form["what"] == "script":
raise "TODO not implemented"
cursor.execute(sql, (term, ))
found = False
output = ""
for tuple in cursor.fetchall():
output += "TODO %s\r\n" % str(tuple) # TODO make it a HTML list
found = True
if not found:
output = "\"%s\" not found\r\n" % term
return pack(start_response, status, output, headers)
if __name__ == "__main__":
conn = psycopg2.connect("dbname=lsr")
cursor = conn.cursor()
httpd = server.make_server("", PORT, application)
print("Listening on port %s" % PORT)
httpd.serve_forever()