import re import itertools import email.utils import os.path import time from datetime import datetime DEFAULT_LANG = "en" BASE_URL = "http://www.xythobuz.de" # ----------------------------------------------------------------------------- # preconvert hooks # ----------------------------------------------------------------------------- def hook_preconvert_anotherlang(): MKD_PATT = r'\.(?:md|mkd|mdown|markdown)$' _re_lang = re.compile(r'^[\s+]?lang[\s+]?[:=]((?:.|\n )*)', re.MULTILINE) vpages = [] # Set of all virtual pages for p in pages: current_lang = DEFAULT_LANG # Default language langs = [] # List of languages for the current page page_vpages = {} # Set of virtual pages for the current page text_lang = re.split(_re_lang, p.source) text_grouped = dict(zip([current_lang,] + \ [lang.strip() for lang in text_lang[1::2]], \ text_lang[::2])) for lang, text in text_grouped.iteritems(): spath = p.fname.split(os.path.sep) langs.append(lang) if lang == "en": filename = re.sub(MKD_PATT, "%s\g<0>" % "", p.fname).split(os.path.sep)[-1] else: filename = re.sub(MKD_PATT, ".%s\g<0>" % lang, p.fname).split(os.path.sep)[-1] vp = Page(filename, virtual=text) # Copy real page attributes to the virtual page for attr in p: if not vp.has_key(attr): vp[attr] = p[attr] # Define a title in the proper language vp["title"] = p["title_%s" % lang] \ if p.has_key("title_%s" % lang) \ else p["title"] # Keep track of the current lang of the virtual page vp["lang"] = lang # Fix post name if exists if vp.has_key("post"): if lang == "en": vp["post"] = vp["post"][:] else: vp["post"] = vp["post"][:-len(lang) - 1] page_vpages[lang] = vp # Each virtual page has to know about its sister vpages for lang, vpage in page_vpages.iteritems(): vpage["lang_links"] = dict([(l, v["url"]) for l, v in page_vpages.iteritems()]) vpage["other_lang"] = langs # set other langs and link vpages += page_vpages.values() pages[:] = vpages _COMPAT = """ case "%s": $loc = "%s/%s"; break; """ _COMPAT_404 = """ default: $loc = "%s"; break; """ def hook_preconvert_compat(): fp = open(os.path.join(options.project, "output", "index.php"), 'w') fp.write("") _SITEMAP = """ %s """ _SITEMAP_URL = """ %s/%s %s %s %s """ def hook_preconvert_sitemap(): date = datetime.strftime(datetime.now(), "%Y-%m-%d") urls = [] for p in pages: urls.append(_SITEMAP_URL % (options.base_url.rstrip('/'), p.url, date, p.get("changefreq", "monthly"), p.get("priority", "0.5"))) fname = os.path.join(options.project, "output", "sitemap.xml") fp = open(fname, 'w') fp.write(_SITEMAP % "".join(urls)) fp.close() # ----------------------------------------------------------------------------- # postconvert hooks # ----------------------------------------------------------------------------- _RSS = """ %s %s %s en-us %s %s http://blogs.law.harvard.edu/tech/rss Poole %s """ _RSS_ITEM = """ %s %s %s %s %s """ def hook_postconvert_rss(): items = [] posts = [p for p in pages if "post" in p] # get all blog post pages posts.sort(key=lambda p: p.date, reverse=True) for p in posts: title = p.post link = "%s/%s" % (BASE_URL, p.url) desc = htmlspecialchars(p.get("description", "Electronics & Software Projects")) date = time.mktime(time.strptime("%s 12" % p.date, "%Y-%m-%d %H")) date = email.utils.formatdate(date) items.append(_RSS_ITEM % (title, link, desc, date, link)) items = "".join(items) title = "xythobuz.de Blog" link = "%s/blog.html" % BASE_URL feed = "%s/rss.xml" % BASE_URL desc = htmlspecialchars("xythobuz Electronics & Software Projects") date = email.utils.formatdate() rss = _RSS % (title, link, feed, desc, date, date, items) fp = open(os.path.join(output, "rss.xml"), 'w') fp.write(rss) fp.close()