-#! /usr/bin/env python
+#! /usr/bin/env python3
import argparse
from fnmatch import fnmatch
import os
+from news import write_if_changed
parser = argparse.ArgumentParser(description='Generate sitemap')
+parser.add_argument('-x', '--exclude', action='append',
+ help='exclude directories (pattern)')
parser.add_argument('root_dir', help='Root dicrectory')
args = parser.parse_args()
+exclude = []
+if args.exclude:
+ for pat in args.exclude:
+ exclude.append(pat)
+ if not pat.endswith('/*'):
+ exclude.append(pat + '/*')
+
os.chdir(args.root_dir)
fullpath = os.getcwd()
fp_len = len(fullpath)
+tree = ('', [])
+current_subtree = tree[1]
+save_level = 0
+
for dirpath, dirs, files in sorted(os.walk(fullpath)):
- dirpath = dirpath[fp_len:]
- if not dirpath:
- continue
- parts = dirpath.split('/')
- level = len(parts) - 2
- print ' ' * level + parts[-1]
+ try:
+ dirpath = dirpath[fp_len:]
+ if not dirpath:
+ continue
+ for pat in exclude:
+ if fnmatch(dirpath, pat):
+ raise StopIteration
+ parts = dirpath.split('/')
+ level = len(parts) - 2
+ if level < save_level:
+ current_subtree = tree[1]
+ for i in range(level):
+ current_subtree = current_subtree[-1][1]
+ elif level > save_level:
+ assert level - save_level == 1
+ current_subtree = current_subtree[-1][1]
+ # else: # level == save_level:
+ current_subtree.append((parts[-1], []))
+ save_level = level
+ except StopIteration:
+ pass
+
+
+def _tree2html(tree, path='', level=0):
+ subparts = []
+ indent = " " * (level + 1)
+ for title, subtree in tree:
+ subpath = "%s/%s" % (path, title)
+ if subpath.startswith('/'):
+ subpath = subpath[1:]
+ href = '<a href="%s/">%s</a>' % (subpath, title)
+ if subtree:
+ subparts.append(indent + "<li>%s" % href)
+ subparts.append(_tree2html(subtree, subpath, level+2))
+ subparts.append(indent + "</li>")
+ else:
+ subparts.append(indent + "<li>%s</li>" % href)
+ s = "\n".join(subparts)
+
+ parts = []
+ indent = " " * level
+ parts.append(indent + "<ul>")
+ parts.append(s)
+ parts.append(indent + "</ul>")
+
+ return "\n".join(parts)
+
+
+sitemap_tmpl = ["""\
+#extends phd_site
+#implements respond
+#attr $Title = 'Sitemap'
+#attr $Copyright = 2015
+##
+#def body_html
+"""]
+
+sitemap_tmpl.append(_tree2html(tree[1]))
+
+sitemap_tmpl.append("""
+#end def
+$phd_site.respond(self)
+""")
+
+write_if_changed("sitemap.tmpl", ''.join(sitemap_tmpl))