pnbp

a terrible but reliable site builder
Log | Files | Refs | README

builder.py (2540B)


      1 '''
      2 '  pnbp - pnbp is not a blogging platform
      3 '  builder.py
      4 '  Paul Longtine <paul@nanner.co>
      5 '''
      6 import os, shutil
      7 
      8 from datetime import date, datetime
      9 
     10 import core.template
     11 import core.module
     12 
     13 #Builds the site off of a filestructure dictionary.
     14 #site = dict of site directory tree/pages, loc = root of site
     15 def makeSite(site,loc):
     16 	if not (os.path.isdir("history")):
     17 		os.mkdir("history")
     18 
     19 	shutil.move(loc,
     20 		os.path.join("history",
     21 		              loc+date.strftime(datetime.now(), "%Y-%m-%d-%H-%M-%S")
     22 		)
     23 	)
     24 
     25 	if (os.path.isdir(loc)):
     26 		shutil.rmtree(loc)
     27 
     28 	os.mkdir(loc)
     29 
     30 	for page, subpages in site.items():
     31 		currentDir = handleDirectory(page,loc)
     32 
     33 		subpageLoop(subpages,currentDir)
     34 	
     35 	try:
     36 
     37 		for i in os.listdir("data/static/"):
     38 			try:
     39 				shutil.copytree(
     40 					os.path.join("data/static/", i),
     41 					os.path.join(loc, i)
     42 				)
     43 			
     44 			except:
     45 				shutil.copy2(
     46 					os.path.join("data/static/", i),
     47 					os.path.join(loc, i)
     48 				)
     49 
     50 	except:
     51 		print("No directory data/static, ignoring")
     52 
     53 # Handles directories
     54 #p = name of page, l = location
     55 def handleDirectory(p,l):
     56 	if p == "index":
     57 		r = l[0:-1] if l[-1] == "/" else l
     58 
     59 	else:
     60 		r = l+p if l[-1] == "/" else l+"/"+p
     61 
     62 		try:
     63 			os.mkdir(r)
     64 
     65 		except:
     66 			pass
     67 
     68 	return r
     69 	
     70 #Recursive loop through all subpages
     71 #d = dict of all subpages, cd = Current directory
     72 def subpageLoop(d,cur):
     73 	for k, v in d.iteritems():
     74 		if isinstance(v, dict):
     75 			subpageLoop(v, os.path.join(cur, k))
     76 		else:
     77 			f = k.split(".")
     78 			fl = ""
     79 
     80 			if len(f) < 2:
     81 				if f[0] != "default":
     82 					fl = f[0] + "/index.html"
     83 
     84 				else:
     85 					fl = "index.html"
     86 					k = ""
     87 
     88 			else:
     89 				if f[0] != "raw":
     90 					fl = f[0] + "." + f[1]
     91 
     92 				else:
     93 					fl = f[0]
     94 
     95 			try:
     96 				file("{}/{}".format(cur,fl), "w").write(v)
     97 
     98 			except:
     99 				try: os.mkdir("{}".format(cur))
    100 				except: pass
    101 
    102 				try: os.mkdir("{}/{}".format(cur,k))
    103 				except: pass
    104 
    105 				file("{}/{}".format(cur,fl), "w").write(v)
    106 
    107 def build(pd,directory):
    108 	site = {}
    109 	for name,v in pd.items():
    110 		#Read the template
    111 		if 'template' in v:
    112 			try:
    113 				temp = file(v['template']).read()
    114 
    115 			except:
    116 				print("{}: Can't open file '{}'".format(name,v['template']))
    117 				sys.exit()
    118 
    119 		else:
    120 			temp = ""
    121 
    122 		#Check if pagevar is defined, skip the variable replacement step
    123 		if 'pagevar' in v:
    124 			temp = core.template.generate(temp,v['pagevar'],name)
    125 
    126 		else:
    127 			temp = core.template.run(temp,name)
    128 		
    129 		print("Running modules for page: '"+name+"'")
    130 
    131 		site[name] = core.module.run(temp,v,name)
    132 
    133 		print("Built page: '"+ name +"'\n")
    134 
    135 	makeSite(site,directory)