]> git.phdru.name Git - phdru.name/phdru.name.git/blobdiff - gen-sitemap.py
gen-sitemap: generate template
[phdru.name/phdru.name.git] / gen-sitemap.py
index d57d42230f4721c19d891f3749c8f2e1fd1c50b6..088f83819e4c8d491fa0ac69e4eb8ab632c3cb06 100755 (executable)
@@ -3,19 +3,84 @@
 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 = []
+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, level=0):
+    indent = "  " * level
+    strings = []
+    strings.append(indent + "<ul>")
+
+    level += 1
+    indent2 = "  " * level
+
+    for title, subtree in tree:
+        if subtree:
+            strings.append(indent2 + "<li>%s" % title)
+            strings.append(_tree2html(subtree, level+1))
+            strings.append(indent2 + "</li>")
+        else:
+            strings.append(indent2 + "<li>%s</li>" % title)
+
+    strings.append(indent + "</ul>")
+    return '\n'.join(strings)
+
+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))