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()
15 for pat in args.exclude:
17 if not pat.endswith('/*'):
18 exclude.append(pat + '/*')
20 os.chdir(args.root_dir)
21 fullpath = os.getcwd()
22 fp_len = len(fullpath)
25 current_subtree = tree[1]
28 for dirpath, dirs, files in sorted(os.walk(fullpath)):
30 dirpath = dirpath[fp_len:]
34 if fnmatch(dirpath, pat):
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], []))
51 def _tree2html(tree, level=0):
54 strings.append(indent + "<ul>")
59 for title, subtree in tree:
61 strings.append(indent2 + "<li>%s" % title)
62 strings.append(_tree2html(subtree, level+1))
63 strings.append(indent2 + "</li>")
65 strings.append(indent2 + "<li>%s</li>" % title)
67 strings.append(indent + "</ul>")
68 return '\n'.join(strings)
73 #attr $Title = 'Sitemap'
74 #attr $Copyright = 2015
79 sitemap_tmpl.append(_tree2html(tree[1]))
81 sitemap_tmpl.append("""
83 $phd_site.respond(self)
86 write_if_changed("sitemap.tmpl", ''.join(sitemap_tmpl))