]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blob - search-tags.py
228866b8a8f5fa625dbc6d3bba5523351693a7c2
[phdru.name/cgi-bin/blog-ru/search-tags.git] / search-tags.py
1 #! /usr/bin/env python3
2 # coding: koi8-r
3 """Search tags CGI"""
4
5 __author__ = "Oleg Broytman <phd@phdru.name>"
6 __copyright__ = "Copyright (C) 2014-2024 PhiloSoft Design"
7 __license__ = "GNU GPL"
8
9 from html import escape
10 from urllib.parse import parse_qs
11 import os
12 import sys
13
14 from lark import ParseError
15
16 from html_output.response import redirect, response
17 from parser import parser
18
19 qs_dict = parse_qs(os.environ['QUERY_STRING'], encoding='koi8-r')
20 if 'q' not in qs_dict or len(qs_dict['q']) > 1:
21     status = "400 Bad request"
22     title = "Error!"
23     body = "Required parameter is missing!"
24
25 else:
26     q = qs_dict['q'][0]
27     try:
28         tree = parser.parse(q)
29     except ParseError:
30         status = "400 Bad request"
31         title = "Error!"
32         body = "Bad query syntax!"
33     else:
34         if tree[0] == 'NAME':  # Single tag - just do redirect
35             tag = tree[1]
36             assert isinstance(tag, str)
37             from tags import real_tag
38             rtag = real_tag(tag)
39             if rtag:
40                 redirect(
41                     "/Russian/blog/tags/%s.html" % rtag.replace(' ', '_'),
42                     status="301 Moved")
43                 sys.exit()
44             status = "404 Tag not found"
45             title = "Ошибка!"
46             body = "Тег %s не существует!" % tag
47         else:  # Process tree
48             from tags import find_tags
49             posts = find_tags(tree)
50             status = None
51             title = "Записи, найденные для выражения " + escape(q)
52             if posts:
53                 _posts = ["""\
54     <p class="head">
55     <ul>
56     """]
57                 for year, month, day, suburl, _title in posts:
58                     _posts.append(
59                         '<li>%s-%s-%s '
60                         '<a href="../../../../Russian/blog/%s">%s</a></li>\n'
61                         % (year, month, day, suburl, _title))
62                 _posts .append("""\
63     </ul>
64     </p>
65     """)
66                 body = ''.join(_posts)
67             else:
68                 body = "Не найдено ни одной записи."
69
70 response(title, body, status)