Adding initial sitemap, differentiate class directive in tree building.
[treecutter.git] / src / tree-cutter.py
index 0dd68b65fb3be70ec6e0652179a7d3f490d6dd28..35d4bb5a497aec5c57cef445011e5344f632948b 100755 (executable)
@@ -8,6 +8,7 @@ import tempfile
 import errno
 import time
 import argparse
+import shutil
 from amara import bindery
 from amara.xslt import transform
 from Cheetah.Template import Template
@@ -35,7 +36,7 @@ def mkdir_p(path):
         else: raise
 
 def publish(src,target):
-    cmd = ["rsync","-a",src,target]
+    cmd = ["rsync","-a","--delete",src,target]
     retcode = subprocess.call(cmd)
     if retcode:
         print 'Error: '+' '.join(cmd)+' Returncode ['+str(retcode)+']'
@@ -50,16 +51,20 @@ def generateSitemap():
       sitemap.append(dict(link=f))
   except IOError, what_error:
     print 'Sitemap missing - generating one.'
+
   for dirname, dirnames, filenames in os.walk('.'):
     for filename in filenames:
       if fnmatch.fnmatch(filename, '*.xml'):
         xfile = os.path.join(dirname,filename)
         doc = bindery.parse(xfile,
                             prefixes={u'db': u'http://docbook.org/ns/docbook',
-                                      u'xi': u'http://www.w3.org/2001/XInclude'})
+                                      u'xi': u'http://www.w3.org/2001/XInclude',
+                                      u'xl': u'http://www.w3.org/1999/xlink'})
         title = doc.xml_select(u'/db:article/db:info/db:title')
         menu  = doc.xml_select(u'/db:article/db:info/db:titleabbrev')
         code  = doc.xml_select(u"//xi:include[@parse='text']")
+        resource = doc.xml_select(u"//db:link[@xl:href]")
+        image = doc.xml_select(u"//db:imagedata[@fileref]")
         exe = 0
         for c in code:
           (p, ext) = os.path.splitext(c.href)
@@ -70,13 +75,23 @@ def generateSitemap():
           found = 0
           base = xfile.split('.')[1]
           link = base.replace('index','')
-          level = len(filter(None,re.split(r'(/\w*/)',link)))
+          level = len(filter(None,re.split(r'(^/\w*/|\w*/)',link)))
+          res = []
+          for r in resource:
+              rf = os.path.join(dirname,r.href)
+              if os.path.isfile(rf):
+                  res.append(rf)
+          for i in image:
+              im = os.path.join(dirname,i.fileref)
+              if os.path.isfile(im):
+                  res.append(im)
           page = dict(title=unicode(doc.article.info.title),
                       menu=unicode(doc.article.info.titleabbrev),
                       output=os.path.join(dirname,
                                           filename.replace('xml','html')),
                       exe=exe,
                       file=xfile,
+                      res=res,
                       level=level)
           for l in sitemap:
             if l['link'] == link:
@@ -138,9 +153,11 @@ def xsltConvert(doc):
 def genMenu(page,sitemap,slevel,elevel):
   title = None
   sm = []
-  if elevel == MAXLEVEL or elevel == 1:
+  if elevel == MAXLEVEL or elevel == 1 or page == None:
+    html = '<ul>\n'
     sm = sitemap
   else:
+    html = '<ul class="tree">\n'
     idx = sitemap.index(page)
     while (sitemap[idx]['level'] == page['level']):
       idx = idx-1
@@ -150,7 +167,7 @@ def genMenu(page,sitemap,slevel,elevel):
       sm.append(sitemap[idx])
       idx = idx+1
   oldlevel = slevel
-  html = '<ul>\n'
+
   for p in sm:
     if slevel > p['level'] or elevel < p['level']:
       continue
@@ -163,8 +180,8 @@ def genMenu(page,sitemap,slevel,elevel):
       if p['link'][-1] == '/':
         html+='</li>\n'
       html+='</ul>\n</li>\n'
-    if page == p:
-      html+='<li><a href="%s">[%s]</a>' % (p['link'],p['menu'])
+    if page != None and page == p:
+      html+='<li class="selected"><a href="%s">%s</a>' % (p['link'],p['menu'])
     else:
       html+='<li><a href="%s">%s</a>' % (p['link'],p['menu'])
     if p['link'][-1] != '/' or p['link'] == '/':
@@ -182,14 +199,34 @@ def writeToTemplate(page,doc,sitemap):
                                   {'article':doc},
                                   {'levelmenu':levelmenu},
                                   {'levelname':levelname}])
-  outfile = args.output+page['output']
-  out = open('result', 'w')
+  outfile = tmptarget+page['output']
+  mkdir_p(os.path.dirname(outfile))
+  out = open(outfile, 'w')
   out.write(str(template))
   out.close()
-  publish('result',outfile)
-  os.remove('result')
+  for r in page['res']:
+      mkdir_p(os.path.dirname(tmptarget+r))
+      shutil.copyfile(r, tmptarget+r)
+
+def createSitemap(sitemap):
+  (menu,menuname) = genMenu(None,sitemap,1,MAXLEVEL)
+  template = Template(file=style_tmpl,
+                      searchList=[
+          {'title':'Sitemap'},
+          {'menu':menu},
+          {'article':menu},
+          {'levelmenu':''},
+          {'levelname':''}])
+  outfile = tmptarget+'sitemap.en.html'
+  mkdir_p(os.path.dirname(outfile))
+  out = open(outfile, 'w')
+  out.write(str(template))
+  out.close()
+
+
 
 sitemap = generateSitemap()
+tmptarget = tempfile.mkdtemp()+'/'
 for page in sitemap:
   t1 = time.time()
   print "Page : %-30s %30s" % (page['link'],
@@ -197,7 +234,10 @@ for page in sitemap:
   doc = expandXincludeTxt(page)
   pubdoc = xsltConvert(doc)
   writeToTemplate(page,pubdoc,sitemap)
-  publish(args.style+"css", args.output)
-  publish(args.style+"images",args.output)
   t2 = time.time()
   print "[%5.2f s]" % (round(t2-t1,2))
+
+createSitemap(sitemap)
+publish(tmptarget, args.output)
+publish(args.style+"css", args.output)
+publish(args.style+"images",args.output)