-#! /usr/bin/env python
+#! /usr/bin/env python3
# coding: koi8-r
"""Search tags CGI"""
__author__ = "Oleg Broytman <phd@phdru.name>"
-__copyright__ = "Copyright (C) 2014 PhiloSoft Design"
+__copyright__ = "Copyright (C) 2014-2024 PhiloSoft Design"
__license__ = "GNU GPL"
-import cgi, sys
-from ply.lex import LexError
+from html import escape
+from urllib.parse import parse_qs
+import os
+import sys
-from html.response import redirect, response
-from parser.parser import parser
+from lark import ParseError
-form = cgi.FieldStorage()
-if not form.has_key('q'):
+from html_output.response import redirect, response
+from parser import parser
+
+qs_dict = parse_qs(os.environ['QUERY_STRING'], encoding='koi8-r')
+if 'q' not in qs_dict or len(qs_dict['q']) > 1:
status = "400 Bad request"
title = "Error!"
body = "Required parameter is missing!"
else:
- q = form['q'].value
+ q = qs_dict['q'][0]
try:
tree = parser.parse(q)
- except LexError:
- tree = None
- if tree is None:
+ except ParseError:
status = "400 Bad request"
title = "Error!"
body = "Bad query syntax!"
- elif tree[0] == 'NAME': # Single tag - just do redirect
- tag = tree[1]
- assert isinstance(tag, str)
- from tags import tag_exists
- if tag_exists(tag):
- redirect("/Russian/blog/tags/%s.html" % tag, status="301 Moved")
- sys.exit()
- status = "404 Tag not found"
- title = "Ошибка!"
- body = "Тег %s не существует!" % tag
- else: # Process tree
- from tags import calc_tree
- posts = calc_tree(tree)
- status = None
- title = "Записи, найденные для выражения " + q
- if posts:
- _posts = []
- for suburl, title in posts:
- _posts.append('<a href="/Russian/blog/%s">%s</a>' % (suburl, title))
- body = "<br>\n".join(_posts)
- else:
- body = "Не найдено ни одной записи."
+ else:
+ if tree[0] == 'NAME': # Single tag - just do redirect
+ tag = tree[1]
+ assert isinstance(tag, str)
+ from tags import tag_exists
+ if tag_exists(tag):
+ redirect(
+ "/Russian/blog/tags/%s.html" % tag, status="301 Moved")
+ sys.exit()
+ status = "404 Tag not found"
+ title = "Ошибка!"
+ body = "Тег %s не существует!" % tag
+ else: # Process tree
+ from tags import find_tags
+ posts = find_tags(tree)
+ status = None
+ title = "Записи, найденные для выражения " + escape(q)
+ if posts:
+ _posts = ["""\
+ <p class="head">
+ <ul>
+ """]
+ for year, month, day, suburl, _title in posts:
+ _posts.append(
+ '<li>%s-%s-%s '
+ '<a href="../../../../Russian/blog/%s">%s</a></li>\n'
+ % (year, month, day, suburl, _title))
+ _posts .append("""\
+ </ul>
+ </p>
+ """)
+ body = ''.join(_posts)
+ else:
+ body = "Не найдено ни одной записи."
response(title, body, status)