X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=tags.py;h=3fe860bdfab7fcfaa196726a11fc9bcae95ca7b0;hb=f44018177d69b84a4e5aeb1ecf037f740dd1aaab;hp=df64a1c286a7e645a84239c0d6571a7af46ee89d;hpb=6b692a173291f4f217d99e4f73281bd2b4d1fa1f;p=phdru.name%2Fcgi-bin%2Fblog-ru%2Fsearch-tags.git diff --git a/tags.py b/tags.py index df64a1c..3fe860b 100644 --- a/tags.py +++ b/tags.py @@ -1,30 +1,36 @@ blog_filename = "blog_dict.pickle" try: - import cPickle as pickle + import cPickle as pickle except ImportError: - import pickle + import pickle try: - blog_file = open(blog_filename, "rb") + blog_file = open('../../../../phdru.name/ru/' + blog_filename, "rb") except IOError: - blog_dict = {} + blog_dict = {} else: - blog_dict = pickle.load(blog_file) - blog_file.close() + blog_dict = pickle.load(blog_file) + blog_file.close() # blog_dict is a mapping # (year, month, day) => [list of (file, title, lead, tags)] def tag_exists(tag): - for posts in blog_dict.itervalues(): + for posts in blog_dict.values(): 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] @@ -40,16 +46,26 @@ def _test_post(post, tree): 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 (year, month, day), posts in blog_dict.items(): for post in posts: if _test_post(post, tree): _posts.append(( - '/'.join((year, month, day, post[0].replace('.tmpl', '.html'))), + year, month, day, + '/'.join( + (year, month, day, post[0][:-len("tmpl")] + "html")), post[1])) - _posts.sort() + _posts.sort(reverse=True) return _posts