From: Oleg Broytman Date: Tue, 20 May 2014 04:19:21 +0000 (+0400) Subject: Process tree (parsed expression) X-Git-Tag: v0.1~16 X-Git-Url: https://git.phdru.name/?p=phdru.name%2Fcgi-bin%2Fblog-ru%2Fsearch-tags.git;a=commitdiff_plain;h=9379ed3a21cf6aaacc9c3d3a2f6349aa22b7d3ee Process tree (parsed expression) Recursively evaluate the tree for every post and return a list of matched posts. --- diff --git a/search-tags.py b/search-tags.py index 8e047e1..27f14f0 100755 --- a/search-tags.py +++ b/search-tags.py @@ -38,5 +38,17 @@ else: 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('%s' % (suburl, title)) + body = "
\n".join(_posts) + else: + body = "îÅ ÎÁÊÄÅÎÏ ÎÉ ÏÄÎÏÊ ÚÁÐÉÓÉ." response(title, body, status) diff --git a/tags.py b/tags.py index 7ff886d..35c4634 100644 --- a/tags.py +++ b/tags.py @@ -19,7 +19,37 @@ 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): + 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]) + else: + raise ValueError("Cannot get there") + +def calc_tree(tree): + _posts = [] + for (year, month, day), posts in blog_dict.iteritems(): + for post in posts: + if _test_post(post, tree): + _posts.append(( + '/'.join((year, month, day, post[0].replace('.tmpl', '.html'))), + post[1])) + _posts.sort() + return _posts