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