pnbp

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 3d4e98659436f0300103160205c5bddb98e68722
parent 8e2561a2f5fdc616419b809f20c0d90b0088601a
Author: Paul Longtine <paullongtine@gmail.com>
Date:   Sat Aug 30 18:54:13 2014

tabify.

Diffstat:
 src/buildsite.py   | 122 +++++++-------
 src/core.py        | 474 ++++++++++++++++++++++++++++++++++++++----------------
 src/initbasic.py   |  10 +-
 src/main.py        |  14 +-
 src/module/blog.py | 172 ++++++++++----------
 5 files changed, 496 insertions(+), 296 deletions(-)

diff --git a/src/buildsite.py b/src/buildsite.py @@ -10,74 +10,74 @@ import os, shutil # Builds the site off of a filestructure dictionary. #site = dict of site directory tree/pages, loc = root of site def buildSite(site,loc): - try: - shutil.rmtree(loc) - - except: - print("No directory {}, ignoring".format(loc)) - - os.mkdir(loc) - for page, subpages in site.items(): - if page == "index": - if loc[-1] == "/": - currentDir = loc[0:-1] - - else: - currentDir = loc - - else: - if loc[-1] == "/": - currentDir = loc+page - - else: - currentDir = loc+"/"+page - - try: - os.mkdir(currentDir) - - except: - pass - - subpageLoop(subpages,currentDir) - - if loc[-1] != "/": - loc = loc + "/" - try: - for i in os.listdir("data/static/"): - try: - shutil.copytree("data/static/"+i,loc+i) - - except: - shutil.copy2("data/static/"+i,loc+i) - except: - print("No directory data/static, ignoring") + try: + shutil.rmtree(loc) + + except: + print("No directory {}, ignoring".format(loc)) + + os.mkdir(loc) + for page, subpages in site.items(): + if page == "index": + if loc[-1] == "/": + currentDir = loc[0:-1] + + else: + currentDir = loc + + else: + if loc[-1] == "/": + currentDir = loc+page + + else: + currentDir = loc+"/"+page + + try: + os.mkdir(currentDir) + + except: + pass + + subpageLoop(subpages,currentDir) + + if loc[-1] != "/": + loc = loc + "/" + try: + for i in os.listdir("data/static/"): + try: + shutil.copytree("data/static/"+i,loc+i) + + except: + shutil.copy2("data/static/"+i,loc+i) + except: + print("No directory data/static, ignoring") #Recursive loop through all subpages #d = dict of all subpages, cd = Current directory def subpageLoop(d,currentDir): - for k, v in d.iteritems(): - if isinstance(v, dict): - subpageLoop(v,currentDir + "/" + k) - else: - if k == "default": - k = "" + for k, v in d.iteritems(): + if isinstance(v, dict): + subpageLoop(v,currentDir + "/" + k) + else: + if k == "default": + k = "" - else: - k = k + "/" + else: + k = k + "/" - try: - file("{}/{}index.html".format(currentDir,k), "w").write(v) + try: + file("{}/{}index.html".format(currentDir,k), "w").write(v) - except: - try: - os.mkdir("{}".format(currentDir)) + except: + try: + os.mkdir("{}".format(currentDir)) - except: - pass + except: + pass - try: - os.mkdir("{}/{}".format(currentDir,k)) - except: - pass + try: + os.mkdir("{}/{}".format(currentDir,k)) + except: + pass - file("{}/{}index.html".format(currentDir,k), "w").write(v) + file("{}/{}index.html".format(currentDir,k), "w").write(v) diff --git a/src/core.py b/src/core.py @@ -22,178 +22,378 @@ pagedata = {} #CLI Interface function #args = list of command line arguementsn def cli(args): - bd = "site/" - if len(args) > 1: - for i in args: - if i[0] != "-" and args.index(i) != 0: - bd = i - - elif i == "-d": - try: - os.chdir(args.pop(args.index(i)+1)) - except: - pass - - elif i == "--help": - print("Usage: build [OPTION(s)]... [DIR]...\n" - "Build site in DIR using configuration in pwd\n" - "\n" - " -d DIR Use configuration in DIR, when not specified DIR is 'site/'\n" - " -i, --init Make a new site using the bare minimium config and build it in DIR\n" - " --help Display this help and exit\n") - - sys.exit() - - elif 0 != args.index(i): - print("Unknown option: {}".format(i)) - - if "--init" in args or "-i" in args: - init() - - return bd + bd = "site/" + if len(args) > 1: + for i in args: + if i[0] != "-" and args.index(i) != 0: + bd = i + + elif i == "-d": + try: + os.chdir(args.pop(args.index(i)+1)) + except: + pass + + elif i == "--help": + print("Usage: build [OPTION(s)]... [DIR]...\n" + "Build site in DIR using configuration in pwd\n" + "\n" + " -d DIR Use configuration in DIR, when not specified DIR is 'site/'\n" + " -i, --init Make a new site using the bare minimium config and build it in DIR\n" + " --help Display this help and exit\n") + + sys.exit() + + elif 0 != args.index(i): + print("Unknown option: {}".format(i)) + + if "--init" in args or "-i" in args: + init() + + return bd # Adds in variables defined in pages.json # # t = raw template, var = "pagevar" variables in pages.json (<pagename> -> "pagevar") def generateTemplate(t,var,page): - if page == "index": - page = "" + if page == "index": + page = "" - t = t.replace("%page%",page) - t = runInlineScript(t,page) - - for search,replace in var.items(): - if search[0] == ":": - try: - t.index("%"+search+"%") - exists = True + t = t.replace("%page%",page) + t = runInlineScript(t,page) + + for search,replace in var.items(): + if search[0] == ":": + try: + t.index("%"+search+"%") + exists = True - except: - exists = False + except: + exists = False - if exists: - inc = file(replace).read() - inc = generateTemplate(inc,var,page) - print("Building include: '"+search+"'") - t = t.replace("%"+search+"%",inc) + if exists: + inc = file(replace).read() + inc = generateTemplate(inc,var,page) + print("Building include: '"+search+"'") + t = t.replace("%"+search+"%",inc) - else: - t = t.replace("%"+search+"%",replace) + else: + t = t.replace("%"+search+"%",replace) - return t + return t #Takes all code blocks in templates ("{:print("Hi"):}") and executes it, and replaces the block with the "returns" variable def runInlineScript(template,page): - for script in re.findall("{:(.*?):}",template, re.DOTALL): - returns = "" - exec(script) - template = template.replace("{:"+script+":}",returns) - - return template + for script in re.findall("{:(.*?):}",template, re.DOTALL): + returns = "" + exec(script) + template = template.replace("{:"+script+":}",returns) + + return template # Built-in module, generates page as subpage def genPage(t,var,data,name,page): - if 'settings' in data: - try: - if 'template' in data['settings']: - template = file(data['settings']['template']).read() + if 'settings' in data: + try: + if 'template' in data['settings']: + template = file(data['settings']['template']).read() - except: - print("Error occured at {} using module page".format(page)) - print("Cannot open file {}".format(data['settings']['template'])) - sys.exit() + except: + print("Error occured at {} using module page".format(page)) + print("Cannot open file {}".format(data['settings']['template'])) + sys.exit() - else: - template = t + else: + template = t - if 'pagevar' in var: - if 'settings' in data: - if 'pagevar' in data['settings']: - var['pagevar'].update(data['settings']['pagevar']) + if 'pagevar' in var: + if 'settings' in data: + if 'pagevar' in data['settings']: + var['pagevar'].update(data['settings']['pagevar']) - template = generateTemplate(template,var['pagevar'],name) + template = generateTemplate(template,var['pagevar'],name) - else: - template = runInlineScript(template,name) - - if not 'settings' == data: - t = {'default':template} + else: + template = runInlineScript(template,name) + + if not 'settings' == data: + t = {'default':template} - else: - if 'location' in meta: - t = {data['settings']['location']:{'default':template}} + else: + if 'location' in meta: + t = {data['settings']['location']:{'default':template}} - return t + return t # Gets subpages from module specified in data def getSubpages(t,var,data,name,page): - returns = {} - if not "settings" in data: - data['settings'] = {} + returns = {} + if not "settings" in data: + data['settings'] = {} - try: - returns = getattr(module, data['mod']).getPages(t, data['settings'], name, page) + try: + returns = getattr(module, data['mod']).getPages(t, data['settings'], name, page) - except Exception,e: - print("Error occured at {} using module {}:".format(page,data['mod'])) - if type(e) == KeyError: - print("Missing attribute {}".format(e)) - sys.exit() + except Exception,e: + print("Error occured at {} using module {}:".format(page,data['mod'])) + if type(e) == KeyError: + print("Missing attribute {}".format(e)) + sys.exit() - else: - print(e) - - return returns + else: + print(e) + + return returns # Runs modules defined in pages.json # # t = raw template, var = "pagemod" variables in pages.json (<pagename> -> "pagemod") def runMod(t,var,page): - subpage = {} - for name, meta in var['pagemod'].items(): - if meta['mod'] != "page": - subpage.update( - getSubpages(t,var,meta,name,page) - ) + subpage = {} + for name, meta in var['pagemod'].items(): + if meta['mod'] != "page": + subpage.update( + getSubpages(t,var,meta,name,page) + ) - elif meta['mod'] == "page": - subpage.update( - genPage(t,var,meta,name,page) - ) + elif meta['mod'] == "page": + subpage.update( + genPage(t,var,meta,name,page) + ) - return subpage + return subpage def build(arg): - global pages, pagedata - - bd = cli(arg) - - #Try to get the config - try: pages = file("pages.yml") - except: - print("Can't open file 'pages.yml'") - sys.exit() - - pagedata = yaml.load(pages) - - site = {} - #Loops through defined "sites" - for name,v in pagedata.items(): - #Read the template - try: template = file(v['template']).read() - except: - print("{}: Can't open file '{}'".format(name,v['template'])) - sys.exit() - - #Check if pagevar is defined, skip the variable replacement step - if 'pagevar' in v: - template = generateTemplate(template,v['pagevar'],name) - - else: - template = runInlineScript(template,name) - - print("Running modules for page: '"+name+"'") - site[name] = runMod(template,v,name) - print("Built page: '"+ name +"'\n") - - buildSite(site,bd) + global pages, pagedata + + bd = cli(arg) + + #Try to get the config + try: pages = file("pages.yml") + except: + print("Can't open file 'pages.yml'") + sys.exit() + + pagedata = yaml.load(pages) + + site = {} + #Loops through defined "sites" + for name,v in pagedata.items(): + #Read the template + try: template = file(v['template']).read() + except: + print("{}: Can't open file '{}'".format(name,v['template'])) + sys.exit() + + #Check if pagevar is defined, skip the variable replacement step + if 'pagevar' in v: + template = generateTemplate(template,v['pagevar'],name) + + else: + template = runInlineScript(template,name) + + print("Running modules for page: '"+name+"'") + site[name] = runMod(template,v,name) + print("Built page: '"+ name +"'\n") + + buildSite(site,bd) +''' +' pnbp - pnbp is not a blogging platform +' core.py +' Paul Longtine - paullongtine@gmail.com +' +' For documentation, please visit http://static.nanner.co/pnbp +''' +#Core imports +import os, sys, json, yaml, re + +#Helper imports +import module +from buildsite import * +from functions import * +from initbasic import * + +#Global variables + +pages = "" +pagedata = {} + +#CLI Interface function +#args = list of command line arguementsn +def cli(args): + bd = "site/" + if len(args) > 1: + for i in args: + if i[0] != "-" and args.index(i) != 0: + bd = i + + elif i == "-d": + try: + os.chdir(args.pop(args.index(i)+1)) + except: + pass + + elif i == "--help": + print("Usage: build [OPTION(s)]... [DIR]...\n" + "Build site in DIR using configuration in pwd\n" + "\n" + " -d DIR Use configuration in DIR, when not specified DIR is 'site/'\n" + " -i, --init Make a new site using the bare minimium config and build it in DIR\n" + " --help Display this help and exit\n") + + sys.exit() + + elif 0 != args.index(i): + print("Unknown option: {}".format(i)) + + if "--init" in args or "-i" in args: + init() + + return bd + +# Adds in variables defined in pages.json +# +# t = raw template, var = "pagevar" variables in pages.json (<pagename> -> "pagevar") +def generateTemplate(t,var,page): + if page == "index": + page = "" + + t = t.replace("%page%",page) + t = runInlineScript(t,page) + + for search,replace in var.items(): + if search[0] == ":": + try: + t.index("%"+search+"%") + exists = True + + except: + exists = False + + if exists: + inc = file(replace).read() + inc = generateTemplate(inc,var,page) + print("Building include: '"+search+"'") + t = t.replace("%"+search+"%",inc) + + else: + t = t.replace("%"+search+"%",replace) + + return t + +#Takes all code blocks in templates ("{:print("Hi"):}") and executes it, and replaces the block with the "returns" variable +def runInlineScript(template,page): + for script in re.findall("{:(.*?):}",template, re.DOTALL): + returns = "" + exec(script) + template = template.replace("{:"+script+":}",returns) + + return template + +# Built-in module, generates page as subpage +def genPage(t,var,data,name,page): + if 'settings' in data: + try: + if 'template' in data['settings']: + template = file(data['settings']['template']).read() + + except: + print("Error occured at {} using module page".format(page)) + print("Cannot open file {}".format(data['settings']['template'])) + sys.exit() + + else: + template = t + + if 'pagevar' in var: + if 'settings' in data: + if 'pagevar' in data['settings']: + var['pagevar'].update(data['settings']['pagevar']) + + template = generateTemplate(template,var['pagevar'],name) + + else: + template = runInlineScript(template,name) + + if not 'settings' == data: + t = {'default':template} + + else: + if 'location' in meta: + t = {data['settings']['location']:{'default':template}} + + return t + +# Gets subpages from module specified in data +def getSubpages(t,var,data,name,page): + returns = {} + if not "settings" in data: + data['settings'] = {} + + try: + returns = getattr(module, data['mod']).getPages(t, data['settings'], name, page) + + except Exception,e: + print("Error occured at {} using module {}:".format(page,data['mod'])) + if type(e) == KeyError: + print("Missing attribute {}".format(e)) + sys.exit() + + else: + print(e) + + return returns + +# Runs modules defined in pages.json +# +# t = raw template, var = "pagemod" variables in pages.json (<pagename> -> "pagemod") +def runMod(t,var,page): + subpage = {} + for name, meta in var['pagemod'].items(): + if meta['mod'] != "page": + subpage.update( + getSubpages(t,var,meta,name,page) + ) + + elif meta['mod'] == "page": + subpage.update( + genPage(t,var,meta,name,page) + ) + + return subpage + +def build(arg): + global pages, pagedata + + bd = cli(arg) + + #Try to get the config + try: pages = file("pages.yml") + except: + print("Can't open file 'pages.yml'") + sys.exit() + + pagedata = yaml.load(pages) + + site = {} + #Loops through defined "sites" + for name,v in pagedata.items(): + #Read the template + try: template = file(v['template']).read() + except: + print("{}: Can't open file '{}'".format(name,v['template'])) + sys.exit() + + #Check if pagevar is defined, skip the variable replacement step + if 'pagevar' in v: + template = generateTemplate(template,v['pagevar'],name) + + else: + template = runInlineScript(template,name) + + print("Running modules for page: '"+name+"'") + site[name] = runMod(template,v,name) + print("Built page: '"+ name +"'\n") + + buildSite(site,bd) + diff --git a/src/initbasic.py b/src/initbasic.py @@ -1,8 +1,8 @@ -basicConfig = "index:\n template: \"template.html\"\n pagevar:\n title: \"I'm basic\"\n pagemod:\n page:\n mod: \"page\"" -basicTemplate = "<html>\n <body>\n <h1>%title%</h1>\n </body>\n</html>" +basicConfig = "index:\n template: \"template.html\"\n pagevar:\n title: \"I'm basic\"\n pagemod:\n page:\n mod: \"page\"" +basicTemplate = "<html>\n <body>\n <h1>%title%</h1>\n </body>\n</html>" def init(): - file("pages.yml","w").write(basicConfig) - file("template.html","w").write(basicTemplate) + file("pages.yml","w").write(basicConfig) + file("template.html","w").write(basicTemplate) - + diff --git a/src/main.py b/src/main.py @@ -11,13 +11,13 @@ from time import time from core import build if __name__ == "__main__": - #Save the time for the caluation - start = time() - - #Try to build the site - build(sys.argv) + #Save the time for the caluation + start = time() + + #Try to build the site + build(sys.argv) - #Print the time it took to build the site - print("Finished in {} ms.".format((time()-start)*1000)) + #Print the time it took to build the site + print("Finished in {} ms.".format((time()-start)*1000)) diff --git a/src/module/blog.py b/src/module/blog.py @@ -1,101 +1,101 @@ import json,time def getPages(template,settings,name,page): - pages = {} - settings['postTemplate'] = settings.get("postTemplate","./templates/post.html") - settings['defaultPostCount'] = settings.get("defaultPostCount","0") - settings['description'] = settings.get("description","0") - data = json.load(file(settings['data'])) - temp = file(settings['postTemplate']).read() - - # Generates all posts on page (/all) - a = "" - posts = 0 - for i in data: - a = generatePost(i,temp,page) + a - posts += 1 - - pages['all']= {} - pages['all']['default'] = template.replace("%"+name+"%",a) - - # Generates index - a = "" - for i in data: - if int(settings['defaultPostCount']) == 0 or int(i['post']) >= posts-int(settings['defaultPostCount']): - back = i['content'] - if settings['description'] != "0": - i['content'] = i['description'] - a = generatePost(i,temp,page) + a - i['content'] = back - - pages['default'] = template.replace("%"+name+"%",a) - - # Generates individual pages referenced by title (/post/<title>) - pages['post'] = {} - for i in data: - post = generatePost(i,temp,page) - pages['post'][slug(i['title'])] = template.replace("%"+name+"%",post) - - return pages + pages = {} + settings['postTemplate'] = settings.get("postTemplate","./templates/post.html") + settings['defaultPostCount'] = settings.get("defaultPostCount","0") + settings['description'] = settings.get("description","0") + data = json.load(file(settings['data'])) + temp = file(settings['postTemplate']).read() + + # Generates all posts on page (/all) + a = "" + posts = 0 + for i in data: + a = generatePost(i,temp,page) + a + posts += 1 + + pages['all']= {} + pages['all']['default'] = template.replace("%"+name+"%",a) + + # Generates index + a = "" + for i in data: + if int(settings['defaultPostCount']) == 0 or int(i['post']) >= posts-int(settings['defaultPostCount']): + back = i['content'] + if settings['description'] != "0": + i['content'] = i['description'] + a = generatePost(i,temp,page) + a + i['content'] = back + + pages['default'] = template.replace("%"+name+"%",a) + + # Generates individual pages referenced by title (/post/<title>) + pages['post'] = {} + for i in data: + post = generatePost(i,temp,page) + pages['post'][slug(i['title'])] = template.replace("%"+name+"%",post) + + return pages #Generates post out of given template, data and page name, returns string def generatePost(data, post, page): - for name,x in data.items(): - if name == 'title': - if page == "index": - linkpage = "" - - else: - linkpage = page + "/" - - post = post.replace("%titlelink%","/"+linkpage+"post/"+slug(x)) - post = post.replace("%"+name+"%", x) - - elif name == 'date': - config = getConfig("%date:",post) - if config == "none": - post = post.replace("%date:none%",x) - elif config == "-1": - post = post.replace("%date%",x) - else: - post = post.replace( - "%date:"+config+"%", - time.strftime(config.replace("&","%"),time.strptime(x,"%Y-%m-%d"))) - elif name == 'description': - pass - - else: - post = post.replace("%"+name+"%", x) - - return post - + for name,x in data.items(): + if name == 'title': + if page == "index": + linkpage = "" + + else: + linkpage = page + "/" + + post = post.replace("%titlelink%","/"+linkpage+"post/"+slug(x)) + post = post.replace("%"+name+"%", x) + + elif name == 'date': + config = getConfig("%date:",post) + if config == "none": + post = post.replace("%date:none%",x) + elif config == "-1": + post = post.replace("%date%",x) + else: + post = post.replace( + "%date:"+config+"%", + time.strftime(config.replace("&","%"),time.strptime(x,"%Y-%m-%d"))) + elif name == 'description': + pass + + else: + post = post.replace("%"+name+"%", x) + + return post + # Helper functions # slug(string -> "hi's") -> his- removes all "unwanted" characters and creates a URL-friendly slug def slug(string): - invalidChars = [ - "<",">","#","%","{","}", - "|","\\","^","[","]","`", - "'",";","/","?",":","@", - "&","+",",","." - ] - for x in invalidChars: - string = string.replace(x, "") - - string = string.replace(" ","_") - return string.lower() + invalidChars = [ + "<",">","#","%","{","}", + "|","\\","^","[","]","`", + "'",";","/","?",":","@", + "&","+",",","." + ] + for x in invalidChars: + string = string.replace(x, "") + + string = string.replace(" ","_") + return string.lower() # getConfig(string -> index, string -> data) -> gets "config" data ex. (%blah:<config>%) def getConfig(index,data): - retVal = "" - try: - pointer = data.index(index)+len(index) - except: - retVal = "-1" - if retVal != "-1": - while data[pointer] != "%" and retVal != "-1": - retVal = retVal + data[pointer] - pointer += 1 - return retVal + retVal = "" + try: + pointer = data.index(index)+len(index) + except: + retVal = "-1" + if retVal != "-1": + while data[pointer] != "%" and retVal != "-1": + retVal = retVal + data[pointer] + pointer += 1 + return retVal