]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blob - tags.py
Process tree (parsed expression)
[phdru.name/cgi-bin/blog-ru/search-tags.git] / tags.py
1 blog_filename = "blog_dict.pickle"
2
3 try:
4    import cPickle as pickle
5 except ImportError:
6    import pickle
7
8 try:
9    blog_file = open(blog_filename, "rb")
10 except IOError:
11    blog_dict = {}
12 else:
13    blog_dict = pickle.load(blog_file)
14    blog_file.close()
15
16
17 # blog_dict is a mapping
18 # (year, month, day) => [list of (file, title, lead, tags)]
19
20 def tag_exists(tag):
21     for posts in blog_dict.itervalues():
22         for _file, _title, _lead, _tags in posts:
23             if tag in _tags:
24                 return True
25     return False
26
27 def _test_post(post, tree):
28     op = tree[0]
29     if op == 'NAME':
30         tag = tree[1]
31         assert isinstance(tag, str)
32         _tags = post[3]
33         return tag in _tags
34     elif op in ('AND', 'OR'):
35         value1 = _test_post(post, tree[1])
36         value2 = _test_post(post, tree[2])
37         if op == 'AND':
38             return value1 and value2
39         if op == 'OR':
40             return value1 or value2
41     elif op == 'NOT':
42         return not _test_post(post, tree[1])
43     else:
44         raise ValueError("Cannot get there")
45
46 def calc_tree(tree):
47     _posts = []
48     for (year, month, day), posts in blog_dict.iteritems():
49         for post in posts:
50             if _test_post(post, tree):
51                 _posts.append((
52                     '/'.join((year, month, day, post[0].replace('.tmpl', '.html'))),
53                     post[1]))
54     _posts.sort()
55     return _posts