1 #! /usr/bin/env python3
4 from fnmatch import fnmatch
6 from news import write_if_changed
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()
16 for pat in args.exclude:
18 if not pat.endswith('/*'):
19 exclude.append(pat + '/*')
21 os.chdir(args.root_dir)
22 fullpath = os.getcwd()
23 fp_len = len(fullpath)
26 current_subtree = tree[1]
29 for dirpath, dirs, files in sorted(os.walk(fullpath)):
31 dirpath = dirpath[fp_len:]
35 if fnmatch(dirpath, pat):
37 parts = dirpath.split('/')
38 level = len(parts) - 2
39 if level < save_level:
40 current_subtree = tree[1]
41 for i in range(level):
42 current_subtree = current_subtree[-1][1]
43 elif level > save_level:
44 assert level - save_level == 1
45 current_subtree = current_subtree[-1][1]
46 # else: # level == save_level:
47 current_subtree.append((parts[-1], []))
53 def _tree2html(tree, path='', level=0):
55 indent = " " * (level + 1)
56 for title, subtree in tree:
57 subpath = "%s/%s" % (path, title)
58 if subpath.startswith('/'):
60 href = '<a href="%s/">%s</a>' % (subpath, title)
62 subparts.append(indent + "<li>%s" % href)
63 subparts.append(_tree2html(subtree, subpath, level+2))
64 subparts.append(indent + "</li>")
66 subparts.append(indent + "<li>%s</li>" % href)
67 s = "\n".join(subparts)
71 parts.append(indent + "<ul>")
73 parts.append(indent + "</ul>")
75 return "\n".join(parts)
81 #attr $Title = 'Sitemap'
82 #attr $Copyright = 2015
87 sitemap_tmpl.append(_tree2html(tree[1]))
89 sitemap_tmpl.append("""
91 $phd_site.respond(self)
94 write_if_changed("sitemap.tmpl", ''.join(sitemap_tmpl))