def run_static_renderer(self, incremental=False): """This will go through all possible things in the blog and statically render everything to the ``static_dir`` specified in the config file. This figures out all the possible ``path_info`` settings and calls ``self.run()`` a bazillion times saving each file. :param incremental: Whether (True) or not (False) to incrementally render the pages. If we're incrementally rendering pages, then we render only the ones that have changed. """ self.initialize() config = self._request.get_configuration() data = self._request.get_data() print "Performing static rendering." if incremental: print "Incremental is set." staticdir = config.get("static_dir", "") datadir = config["datadir"] if not staticdir: print "Error: You must set static_dir in your config file." return 0 flavours = config.get("static_flavours", ["html"]) renderme = [] monthnames = config.get("static_monthnames", True) monthnumbers = config.get("static_monthnumbers", False) yearindexes = config.get("static_yearindexes", True) dates = {} categories = {} # first we handle entries and categories listing = tools.walk(self._request, datadir) for mem in listing: # skip the ones that have bad extensions ext = mem[mem.rfind(".")+1:] if not ext in data["extensions"].keys(): continue # grab the mtime of the entry file mtime = time.mktime(tools.filestat(self._request, mem)) # remove the datadir from the front and the bit at the end mem = mem[len(datadir):mem.rfind(".")] # this is the static filename fn = os.path.normpath(staticdir + mem) # grab the mtime of one of the statically rendered file try: smtime = os.stat(fn + "." + flavours[0])[8] except: smtime = 0 # if the entry is more recent than the static, we want to # re-render if smtime < mtime or not incremental: # grab the categories temp = os.path.dirname(mem).split(os.sep) for i in range(len(temp)+1): p = os.sep.join(temp[0:i]) categories[p] = 0 # grab the date mtime = time.localtime(mtime) year = time.strftime("%Y", mtime) month = time.strftime("%m", mtime) day = time.strftime("%d", mtime) if yearindexes: dates[year] = 1 if monthnumbers: dates[year + "/" + month] = 1 dates[year + "/" + month + "/" + day] = 1 if monthnames: monthname = tools.num2month[month] dates[year + "/" + monthname] = 1 dates[year + "/" + monthname + "/" + day] = 1 # toss in the render queue for f in flavours: renderme.append( (mem + "." + f, "") ) print "rendering %d entries." % len(renderme) # handle categories categories = categories.keys() categories.sort() # if they have stuff in their root category, it'll add a "/" # to the category list and we want to remove that because it's # a duplicate of "". if "/" in categories: categories.remove("/") print "rendering %d category indexes." % len(categories) for mem in categories: mem = os.path.normpath(mem + "/index.") for f in flavours: renderme.append((mem + f, "")) # now we handle dates dates = dates.keys() dates.sort() dates = ["/" + d for d in dates] print "rendering %d date indexes." % len(dates) for mem in dates: mem = os.path.normpath(mem + "/index.") for f in flavours: renderme.append((mem + f, "")) # now we handle arbitrary urls additional_stuff = config.get("static_urls", []) print "rendering %d arbitrary urls." % len(additional_stuff) for mem in additional_stuff: if mem.find("?") != -1: url = mem[:mem.find("?")] query = mem[mem.find("?")+1:] else: url = mem query = "" renderme.append((url, query)) # now we pass the complete render list to all the plugins via # cb_staticrender_filelist and they can add to the filelist # any (url, query) tuples they want rendered. print "(before) building %s files." % len(renderme) tools.run_callback("staticrender_filelist", {'request': self._request, 'filelist': renderme, 'flavours': flavours, 'incremental': incremental}) renderme = sorted(set(renderme)) print "building %s files." % len(renderme) for url, q in renderme: url = url.replace(os.sep, "/") print "rendering '%s' ..." % url tools.render_url_statically(config, url, q) # we're done, clean up self.cleanup()
def run_static_renderer(self, incremental=False): """This will go through all possible things in the blog and statically render everything to the ``static_dir`` specified in the config file. This figures out all the possible ``path_info`` settings and calls ``self.run()`` a bazillion times saving each file. :param incremental: Whether (True) or not (False) to incrementally render the pages. If we're incrementally rendering pages, then we render only the ones that have changed. """ self.initialize() config = self._request.get_configuration() data = self._request.get_data() print "Performing static rendering." if incremental: print "Incremental is set." static_dir = config.get("static_dir", "") data_dir = config["datadir"] if not static_dir: print "Error: You must set static_dir in your config file." return 0 flavours = config.get("static_flavours", ["html"]) index_flavours = config.get("static_index_flavours", ["html"]) render_me = [] month_names = config.get("static_monthnames", True) month_numbers = config.get("static_monthnumbers", False) year_indexes = config.get("static_yearindexes", True) dates = {} categories = {} # first we handle entries and categories listing = tools.walk(self._request, data_dir) for mem in listing: # skip the ones that have bad extensions ext = mem[mem.rfind(".") + 1:] if not ext in data["extensions"].keys(): continue # grab the mtime of the entry file mtime = time.mktime(tools.filestat(self._request, mem)) # remove the datadir from the front and the bit at the end mem = mem[len(data_dir):mem.rfind(".")] # this is the static filename fn = os.path.normpath(static_dir + mem) # grab the mtime of one of the statically rendered file try: smtime = os.stat(fn + "." + flavours[0])[8] except: smtime = 0 # if the entry is more recent than the static, we want to # re-render if smtime < mtime or not incremental: # grab the categories temp = os.path.dirname(mem).split(os.sep) for i in range(len(temp) + 1): p = os.sep.join(temp[0:i]) categories[p] = 0 # grab the date mtime = time.localtime(mtime) year = time.strftime("%Y", mtime) month = time.strftime("%m", mtime) day = time.strftime("%d", mtime) if year_indexes: dates[year] = 1 if month_numbers: dates[year + "/" + month] = 1 dates[year + "/" + month + "/" + day] = 1 if month_names: monthname = tools.num2month[month] dates[year + "/" + monthname] = 1 dates[year + "/" + monthname + "/" + day] = 1 # toss in the render queue for f in flavours: render_me.append((mem + "." + f, "")) print "rendering %d entries." % len(render_me) # handle categories categories = categories.keys() categories.sort() # if they have stuff in their root category, it'll add a "/" # to the category list and we want to remove that because it's # a duplicate of "". if "/" in categories: categories.remove("/") print "rendering %d category indexes." % len(categories) for mem in categories: mem = os.path.normpath(mem + "/index.") for f in index_flavours: render_me.append((mem + f, "")) # now we handle dates dates = dates.keys() dates.sort() dates = ["/" + d for d in dates] print "rendering %d date indexes." % len(dates) for mem in dates: mem = os.path.normpath(mem + "/index.") for f in index_flavours: render_me.append((mem + f, "")) # now we handle arbitrary urls additional_stuff = config.get("static_urls", []) print "rendering %d arbitrary urls." % len(additional_stuff) for mem in additional_stuff: if mem.find("?") != -1: url = mem[:mem.find("?")] query = mem[mem.find("?") + 1:] else: url = mem query = "" render_me.append((url, query)) # now we pass the complete render list to all the plugins via # cb_staticrender_filelist and they can add to the filelist # any (url, query) tuples they want rendered. print "(before) building %s files." % len(render_me) tools.run_callback( "staticrender_filelist", { 'request': self._request, 'filelist': render_me, 'flavours': flavours, 'incremental': incremental }) render_me = sorted(set(render_me)) print "building %s files." % len(render_me) for url, q in render_me: url = url.replace(os.sep, "/") print "rendering '%s' ..." % url tools.render_url_statically(dict(config), url, q) # we're done, clean up self.cleanup()
def page(request, num_entries, entry_list): http = request.get_http() config = request.get_configuration() data = request.get_data() first_text = config.get("paginate_first_text", "<<<") previous_text = config.get("paginate_previous_text", "<<") next_text = config.get("paginate_next_text", ">>") last_text = config.get("paginate_last_text", ">>>") first_last = config.get("paginate_first_last", 0) if first_last > 1: first_last = 1 link_style = config.get("paginate_linkstyle", 1) if link_style > 1: link_style = 1 entries_per_page = num_entries count_from = config.get("paginate_count_from", 0) if isinstance(entry_list, list) and 0 < entries_per_page < len(entry_list): page = count_from url = http.get("REQUEST_URI", http.get("HTTP_REQUEST_URI", "")) url_template = url if not data.get("STATIC"): form = request.get_form() if form: try: page = int(form.getvalue("page")) except (TypeError, ValueError): page = count_from # Restructure the querystring so that page= is at the end # where we can fill in the next/previous pages. if url_template.find("?") != -1: query = url_template[url_template.find("?") + 1:] url_template = url_template[:url_template.find("?")] query = query.split("&") query = [m for m in query if not m.startswith("page=")] if len(query) == 0: url_template = url_template + "?" + "page=%d" else: # Note: We're using & here because it needs to # be url_templateencoded. url_template = (url_template + "?" + "&".join(query) + "&page=%d") else: url_template += "?page=%d" else: try: page = data["paginate_page"] except KeyError: page = count_from # The REQUEST_URI isn't the full url here--it's only the # path and so we need to add the base_url. base_url = config["base_url"].rstrip("/") url_template = base_url + url_template url_template = url_template.split("/") ret = url_template[-1].rsplit("_", 1) if len(ret) == 1: fn, ext = os.path.splitext(ret[0]) pageno = "_page%d" else: fn, pageno = ret pageno, ext = os.path.splitext(pageno) pageno = "_page%d" url_template[-1] = fn + pageno + ext url_template = "/".join(url_template) url_first_page = url_template.split("_page") url_first_page = url_first_page[0] + ext begin = (page - count_from) * entries_per_page end = (page + 1 - count_from) * entries_per_page if end > len(entry_list): end = len(entry_list) max_pages = ((len(entry_list) - 1) / entries_per_page) + 1 + count_from data["entry_list"] = entry_list[begin:end] data["page_navigation"] = PageDisplay(url_template, url_first_page, page, max_pages, count_from, previous_text, next_text, link_style, first_last, first_text, last_text, request) # If we're static rendering and there wasn't a page specified # and this is one of the flavours to statically render, then # this is the first page and we need to render all the rest of # the pages, so we do that here. static_flavours = config.get("static_flavours", ["html"]) if ((data.get("STATIC") and page == count_from and data.get("flavour") in static_flavours)): # Turn http://example.com/index.html into # http://example.com/index_page5.html for each page. url = url.split('/') fn = url[-1] fn, ext = os.path.splitext(fn) template = '/'.join(url[:-1]) + '/' + fn + '_page%d' if ext: template = template + ext for i in range(count_from + 1, max_pages): print " rendering page %s ..." % (template % i) render_url_statically(dict(config), template % i, '')
def page(request, num_entries, entry_list): http = request.get_http() config = request.get_configuration() data = request.get_data() first_text = config.get("paginate_first_text", "<<<") previous_text = config.get("paginate_previous_text", "<<") next_text = config.get("paginate_next_text", ">>") last_text = config.get("paginate_last_text", ">>>") first_last = config.get("paginate_first_last", 0) if first_last > 1: first_last = 1 link_style = config.get("paginate_linkstyle", 1) if link_style > 1: link_style = 1 entries_per_page = num_entries count_from = config.get("paginate_count_from", 0) if isinstance(entry_list, list) and 0 < entries_per_page < len(entry_list): page = count_from url = http.get("REQUEST_URI", http.get("HTTP_REQUEST_URI", "")) url_template = url if not data.get("STATIC"): form = request.get_form() if form: try: page = int(form.getvalue("page")) except (TypeError, ValueError): page = count_from # Restructure the querystring so that page= is at the end # where we can fill in the next/previous pages. if url_template.find("?") != -1: query = url_template[url_template.find("?") + 1:] url_template = url_template[:url_template.find("?")] query = query.split("&") query = [m for m in query if not m.startswith("page=")] if len(query) == 0: url_template = url_template + "?" + "page=%d" else: # Note: We're using & here because it needs to # be url_templateencoded. url_template = (url_template + "?" + "&".join(query) + "&page=%d") else: url_template += "?page=%d" else: try: page = data["paginate_page"] except KeyError: page = count_from # The REQUEST_URI isn't the full url here--it's only the # path and so we need to add the base_url. base_url = config["base_url"].rstrip("/") url_template = base_url + url_template url_template = url_template.split("/") ret = url_template[-1].rsplit("_", 1) if len(ret) == 1: fn, ext = os.path.splitext(ret[0]) pageno = "_page%d" else: fn, pageno = ret pageno, ext = os.path.splitext(pageno) pageno = "_page%d" url_template[-1] = fn + pageno + ext url_template = "/".join(url_template) begin = (page - count_from) * entries_per_page end = (page + 1 - count_from) * entries_per_page if end > len(entry_list): end = len(entry_list) max_pages = ((len(entry_list) - 1) / entries_per_page) + 1 + count_from data["entry_list"] = entry_list[begin:end] data["page_navigation"] = PageDisplay( url_template, page, max_pages, count_from, previous_text, next_text, link_style, first_last, first_text, last_text, request) # If we're static rendering and there wasn't a page specified # and this is one of the flavours to statically render, then # this is the first page and we need to render all the rest of # the pages, so we do that here. static_flavours = config.get("static_flavours", ["html"]) if ((data.get("STATIC") and page == count_from and data.get("flavour") in static_flavours)): # Turn http://example.com/index.html into # http://example.com/index_page5.html for each page. url = url.split('/') fn = url[-1] fn, ext = os.path.splitext(fn) template = '/'.join(url[:-1]) + '/' + fn + '_page%d' if ext: template = template + ext for i in range(count_from + 1, max_pages): print " rendering page %s ..." % (template % i) render_url_statically(dict(config), template % i, '')