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)