Home | History | Annotate | Download | only in scripts
      1 #!/usr/bin/env python
      2 
      3 import os
      4 import glob
      5 import shutil
      6 import string
      7 import subprocess
      8 
      9 
     10 # call markdown as a subprocess, and capture the output
     11 def markdown(raw_file):
     12   extensions = '-x tables' + ' ' + '-x "toc(title=In This Document)"'
     13   command = 'markdown' + ' ' + extensions + ' ' + raw_file
     14   p = subprocess.Popen(command, stdout = subprocess.PIPE, shell = True)
     15   return p.communicate()[0]
     16 
     17 
     18 # read just the title (first heading) from a source page
     19 def get_title(raw_file):
     20   for line in open(raw_file, 'r'):
     21     if '#' in line:
     22       return line.strip(' #\n')
     23   return ""
     24 
     25 
     26 # directory to compile the site to (will be clobbered during build!)
     27 HTML_DIR = 'out'
     28 # directory to look in for markdown source files
     29 SRC_DIR = 'src'
     30 # directory to look in for html templates
     31 TEMPLATE_DIR = 'templates'
     32 
     33 # filenames of templates to load, in order
     34 TEMPLATE_LIST = ['includes', 'header', 'sidebar', 'main', 'footer'] 
     35 
     36 t = ""
     37 for f in TEMPLATE_LIST:
     38   t += open(os.path.join(TEMPLATE_DIR, f), 'r').read()
     39 template = string.Template(t)
     40 
     41 if os.path.exists(HTML_DIR):
     42   shutil.rmtree(HTML_DIR)
     43 
     44 os.mkdir(HTML_DIR)
     45 
     46 category = 'home'
     47 parents = {}
     48 for curdir, subdirs, files in os.walk(SRC_DIR):
     49   print 'Processing %s...'  % (curdir,),
     50   outdir = [x for x in curdir.split(os.path.sep) if x]
     51   outdir[0] = HTML_DIR
     52   if len(outdir) == 2:
     53     category = outdir[-1]
     54   outdir = os.path.join(*outdir)
     55 
     56   for subdir in subdirs:
     57     os.mkdir(os.path.join(outdir, subdir))
     58 
     59   parentdir = os.path.dirname(curdir)
     60   if parentdir in parents:
     61     parent = parents[parentdir]
     62   else:
     63     parent = ('', '')
     64 
     65   if 'sidebar.md' in files:
     66     sidebar = markdown(os.path.join(curdir, 'sidebar.md'))
     67     del files[files.index('sidebar.md')]
     68   else:
     69     sidebar = parent[0]
     70 
     71   if 'sidebar2.md' in files:
     72     sidebar2 = markdown(os.path.join(curdir, 'sidebar2.md'))
     73     del files[files.index('sidebar2.md')]
     74   else:
     75     sidebar2 = parent[1]
     76 
     77   parents[curdir] = (sidebar, sidebar2)
     78 
     79   for f in files:
     80     print ' .',
     81     if f.endswith('.md'):
     82       main = markdown(os.path.join(curdir, f))
     83       final = template.safe_substitute(main=main, sidebar=sidebar, sidebar2=sidebar2, \
     84           category=category, title=get_title(os.path.join(curdir, f)))
     85     
     86       html = file(os.path.join(outdir, f.replace('.md', '.html')), 'w')
     87       html.write(final)
     88     else:
     89       shutil.copy(os.path.join(curdir, f), os.path.join(outdir, f))
     90   print
     91 
     92 print 'Done.'
     93