]> git.phdru.name Git - phdru.name/phdru.name.git/blob - gen-sitemap.py
gen-sitemap: generate template
[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     indent = "  " * level
53     strings = []
54     strings.append(indent + "<ul>")
55
56     level += 1
57     indent2 = "  " * level
58
59     for title, subtree in tree:
60         if subtree:
61             strings.append(indent2 + "<li>%s" % title)
62             strings.append(_tree2html(subtree, level+1))
63             strings.append(indent2 + "</li>")
64         else:
65             strings.append(indent2 + "<li>%s</li>" % title)
66
67     strings.append(indent + "</ul>")
68     return '\n'.join(strings)
69
70 sitemap_tmpl = ["""\
71 #extends phd_site
72 #implements respond
73 #attr $Title = 'Sitemap'
74 #attr $Copyright = 2015
75 ##
76 #def body_html
77 """]
78
79 sitemap_tmpl.append(_tree2html(tree[1]))
80
81 sitemap_tmpl.append("""
82 #end def
83 $phd_site.respond(self)
84 """)
85
86 write_if_changed("sitemap.tmpl", ''.join(sitemap_tmpl))