]> git.phdru.name Git - phdru.name/phdru.name.git/blob - gen-sitemap.py
gen-sitemap: refactoring
[phdru.name/phdru.name.git] / gen-sitemap.py
1 #! /usr/bin/env python
2
3 import argparse
4 from fnmatch import fnmatch
5 import os
6 from news import write_if_changed
7
8 parser = argparse.ArgumentParser(description='Generate sitemap')
9 parser.add_argument('-x', '--exclude', action='append',
10                     help='exclude directories (pattern)')
11 parser.add_argument('root_dir', help='Root dicrectory')
12 args = parser.parse_args()
13
14 exclude = []
15 for pat in args.exclude:
16     exclude.append(pat)
17     if not pat.endswith('/*'):
18         exclude.append(pat + '/*')
19
20 os.chdir(args.root_dir)
21 fullpath = os.getcwd()
22 fp_len = len(fullpath)
23
24 tree = ('', [])
25 current_subtree = tree[1]
26 save_level = 0
27
28 for dirpath, dirs, files in sorted(os.walk(fullpath)):
29     try:
30         dirpath = dirpath[fp_len:]
31         if not dirpath:
32             continue
33         for pat in exclude:
34             if fnmatch(dirpath, pat):
35                 raise StopIteration
36         parts = dirpath.split('/')
37         level = len(parts) - 2
38         if level < save_level:
39             current_subtree = tree[1]
40             for i in range(level):
41                 current_subtree = current_subtree[-1][1]
42         elif level > save_level:
43             assert level - save_level == 1
44             current_subtree = current_subtree[-1][1]
45         #else: # level == save_level:
46         current_subtree.append((parts[-1], []))
47         save_level = level
48     except StopIteration:
49         pass
50
51 def _tree2html(tree, level=0):
52     subparts = []
53     indent = "  " * (level + 1)
54     for title, subtree in tree:
55         if subtree:
56             subparts.append(indent + "<li>%s" % title)
57             subparts.append(_tree2html(subtree, level+2))
58             subparts.append(indent + "</li>")
59         else:
60             subparts.append(indent + "<li>%s</li>" % title)
61     s = "\n".join(subparts)
62
63     parts = []
64     indent = "  " * level
65     parts.append(indent + "<ul>")
66     parts.append(s)
67     parts.append(indent + "</ul>")
68
69     return "\n".join(parts)
70
71 sitemap_tmpl = ["""\
72 #extends phd_site
73 #implements respond
74 #attr $Title = 'Sitemap'
75 #attr $Copyright = 2015
76 ##
77 #def body_html
78 """]
79
80 sitemap_tmpl.append(_tree2html(tree[1]))
81
82 sitemap_tmpl.append("""
83 #end def
84 $phd_site.respond(self)
85 """)
86
87 write_if_changed("sitemap.tmpl", ''.join(sitemap_tmpl))