]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blobdiff - tags.py
Docs(TODO): Try Pyleri
[phdru.name/cgi-bin/blog-ru/search-tags.git] / tags.py
diff --git a/tags.py b/tags.py
index 7ff886d544ec0a70bc9f8eb6926633671ab872f4..44f1a070d02b08c02e9b1f265ba9ec8095bd5fb5 100644 (file)
--- a/tags.py
+++ b/tags.py
@@ -6,7 +6,7 @@ except ImportError:
    import pickle
 
 try:
-   blog_file = open(blog_filename, "rb")
+   blog_file = open('../../../../phdru.name/ru/' + blog_filename, "rb")
 except IOError:
    blog_dict = {}
 else:
@@ -19,7 +19,50 @@ else:
 
 def tag_exists(tag):
     for posts in blog_dict.itervalues():
-        for _file, _title, _lead, tags in posts:
-            if tag in tags:
+        for _file, _title, _lead, _tags in posts:
+            if tag in _tags:
                 return True
     return False
+
+def _test_post(post, tree):
+    """Test if the list of tags in the post satisfies condition
+
+    Recursively evaluate the tree against the list of tags in the post.
+
+    """
+    op = tree[0]
+    if op == 'NAME':
+        tag = tree[1]
+        assert isinstance(tag, str)
+        _tags = post[3]
+        return tag in _tags
+    elif op in ('AND', 'OR'):
+        value1 = _test_post(post, tree[1])
+        value2 = _test_post(post, tree[2])
+        if op == 'AND':
+            return value1 and value2
+        if op == 'OR':
+            return value1 or value2
+    elif op == 'NOT':
+        return not _test_post(post, tree[1])
+    elif op == 'PARENS':
+        return _test_post(post, tree[1])
+    else:
+        raise ValueError("Cannot get there")
+
+def find_tags(tree):
+    """Test every blog post against parsed expression
+
+    Return all posts that passed the test.
+
+    """
+    _posts = []
+    for (year, month, day), posts in blog_dict.iteritems():
+        for post in posts:
+            if _test_post(post, tree):
+                _posts.append((
+                    year, month, day,
+                    '/'.join((year, month, day, post[0][:-len("tmpl")] + "html")),
+                    post[1]))
+    _posts.sort(reverse=True)
+    return _posts