]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blobdiff - search-tags.py
Version 0.8: Python 3
[phdru.name/cgi-bin/blog-ru/search-tags.git] / search-tags.py
index d1bc93ef697cc40a9593e9a58bb0c39e6e7818a7..228866b8a8f5fa625dbc6d3bba5523351693a7c2 100755 (executable)
@@ -1,54 +1,70 @@
-#! /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 find_tags
-        posts = find_tags(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 real_tag
+            rtag = real_tag(tag)
+            if rtag:
+                redirect(
+                    "/Russian/blog/tags/%s.html" % rtag.replace(' ', '_'),
+                    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)