from flask_flatpages import FlatPages, pygments_style_defs import flask_flatpages from flask import url_for import re from utils import path_depth,pjoin2,pjoin,list_dir, page_to_link, file_to_link from functools import partial from werkzeug.utils import cached_property from collections import namedtuple FileLists=namedtuple("FileLists", ["list_files", "list_images", "sub_pages", "sub_index_pages", "breadcrumbs"]) # List all non *.md files within the directory list_dir_md=partial(list_dir, not_ext=["md","~"]) # List all jpg images within the directory list_dir_img=partial(list_dir, ext=["jpg", "jpeg","JPG"]) class FlatPagesIndex(FlatPages): FLATPAGES_ROOT="." def __init__(self,app=None,name=None): self.default_template="page.html" super(FlatPagesIndex, self).__init__(app=app, name=name) @staticmethod def get_breadcrumb_paths(path): """ breadcrumbs decompose the path a/b/index -> [a/index a/b/index] """ elements = path.split('/') # print "i: %s" % elements elements2 = ['index'] if len(elements)>2: for i in range(1,len(elements)): # print "i: %s" % elements[0:i] elements2.append(pjoin2(elements[0:i])+u'/index') return elements2 def breadcrumbs(self, page): "Parse a path or the path of a page into breadcrumbs" if type(page) is flask_flatpages.Page: return self.get_pages( FlatPagesIndex.get_breadcrumb_paths(page.path)) else: return self.get_pages(FlatPagesIndex.get_breadcrumb_paths(page)) def get_pages(self, paths): "get pages for a list of paths" if paths is None: raise AttributeError("paths for get_pages can't be None") return (self.get(p) for p in paths) @staticmethod def get_paths(pages): return (p.path for p in pages) def __iter__(self): return (FlatPagesIndex.page_defaults(p,"",False) for p in super(self.__class__,self).__iter__()) @cached_property def _pages(self): d=super(FlatPagesIndex,self)._pages for path in d: d[path]=FlatPagesIndex.page_defaults(d[path],"") return d def page_defaults(self, page, dirpath, is_index=False): is_index = (page.path.split('/')[-1]=='index') page.meta["is_index"]=is_index dirpath='/'.join(path.split('/')[0:-1]) # remove index from path page.meta["dirpath"]=dirpath if is_index: page.meta["title"]=page.meta.get("title", dirpath.split('/')[-1]) else: page.meta["title"]=page.meta.get("title", page.path.split('/')[-1]) page.meta["template"]=page.meta.get("template", self.default_template) return page @staticmethod def is_subpage(path,root,page_root=""): return (path.startswith(root) and # is a subpage path_depth(path)