pnbp

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

blog.py (3025B)


      1 import markdown,json,time
      2 
      3 def getPages(template,settings,name,page):
      4 	pages = {}
      5 	settings['postTemplate'] = settings.get("postTemplate","./templates/post.html")
      6 	settings['defaultPostCount'] = settings.get("defaultPostCount","0")
      7 	settings['description'] = settings.get("description","0")
      8 	settings['database'] = settings.get("database","markdown")
      9 	settings['backend'] = settings.get("backend","json")
     10 
     11 	data = getDB(settings['data'],settings['backend'],settings['database'])
     12 
     13 	temp = file(settings['postTemplate']).read()
     14 
     15 	# Generates all posts on page (/all)
     16 	a = ""
     17 	posts = 0
     18 	for i in data:
     19 		a = generatePost(i,temp,page) + a
     20 		posts += 1
     21 
     22 	pages['all']= {}
     23 	pages['all']['default'] = template.replace("%"+name+"%",a)
     24 	
     25 	# Generates index
     26 	a = ""
     27 	for i in data:
     28 		if int(settings['defaultPostCount']) == 0 or int(i['post']) >= posts-int(settings['defaultPostCount']):
     29 			back = i['content']
     30 			if settings['description'] != "0":
     31 				i['content'] = i['description']
     32 			a = generatePost(i,temp,page) + a
     33 			i['content'] = back
     34 
     35 	pages['default'] = template.replace("%"+name+"%",a)
     36 
     37 	# Generates individual pages referenced by title (/post/<title>)
     38 	pages['post'] = {}
     39 	for i in data:
     40 		post = generatePost(i,temp,page)
     41 		pages['post'][slug(i['title'])] = template.replace("%"+name+"%",post)
     42 
     43 	return pages
     44 
     45 
     46 #Generates post out of given template, data and page name, returns string
     47 def generatePost(data, post, page):
     48 	for name,x in data.items():
     49 		if name == 'title':
     50 			if page == "index":
     51 				linkpage = ""
     52 
     53 			else:
     54 				linkpage = page + "/"
     55 
     56 			post = post.replace("%titlelink%","/"+linkpage+"post/"+slug(x))
     57 			post = post.replace("%"+name+"%", x)
     58 
     59 		elif name == 'date':
     60 			config = getConfig("%date:",post)
     61 			if config == "none":
     62 				post = post.replace("%date:none%",x)
     63 			elif config == "-1":
     64 				post = post.replace("%date%",x)
     65 			else:
     66 				post = post.replace(
     67 					"%date:"+config+"%",
     68 					time.strftime(config.replace("&","%"),time.strptime(x,"%Y-%m-%d")))
     69 		elif name == 'description':
     70 			pass
     71 
     72 		else:
     73 			post = post.replace("%"+name+"%", x)
     74 
     75 	return post
     76 				
     77 
     78 # Helper functions
     79 
     80 # slug(string -> "hi's") -> his- removes all "unwanted" characters and creates a URL-friendly slug
     81 def slug(string):
     82 	invalidChars = [
     83 		"<",">","#","%","{","}",
     84 		"|","\\","^","[","]","`",
     85 		"'",";","/","?",":","@",
     86 		"&","+",",","."
     87 		]
     88 	for x in invalidChars:
     89 		string = string.replace(x, "")
     90 
     91 	string = string.replace(" ","_")
     92 	return string.lower()
     93 
     94 # getConfig(string -> index, string -> data) -> gets "config" data ex. (%blah:<config>%)
     95 def getConfig(index,data):
     96 	retVal = ""
     97 	try:
     98 		pointer = data.index(index)+len(index)
     99 	except:
    100 		retVal = "-1"
    101 	if retVal != "-1":
    102 		while data[pointer] != "%" and retVal != "-1":
    103 			retVal = retVal + data[pointer]
    104 			pointer += 1
    105 	return retVal
    106 
    107 def getDB(db, backend, content):
    108 	dbdata = {}
    109 	if backend == "json":
    110 		dbdata = json.load(file(db))
    111 		if content == "markdown":
    112 			for post in dbdata:
    113 				post['content'] = markdown.markdown(post['content'])
    114 
    115 	return dbdata