import sys from flask import Flask, Blueprint,render_template, send_from_directory,jsonify, url_for from flask_flatpages import FlatPages, pygments_style_defs from flatpages import FlatPagesIndex from flask_frozen import Freezer from config import Config import os import re from os.path import isfile, abspath from utils import pjoin2 from utils import pjoin, list_dir, path_depth from functools import partial from collections import namedtuple package_directory = os.path.dirname(os.path.abspath(__file__)) cfg = Config(file(os.path.join(package_directory, 'config.cfg'))) # Loading constants from config file FLATPAGES_AUTO_RELOAD = cfg.pages_reload FLATPAGES_EXTENSION = '.md' FLATPAGES_ROOT = abspath(cfg.pages_root) FLATPAGES_FP_ROOT = abspath(cfg.pages_root) # Initialize application app = Flask(__name__) flatpages = FlatPagesIndex(app) flatpages.get('index') freezer = Freezer(app) app.config.from_object(__name__) page_blueprint = Blueprint('intern', __name__) # 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") # List all subpages of the current page get_sub_pages = partial(FlatPagesIndex.get_sub_pages, flatpages) get_sub_ipages = partial(FlatPagesIndex.get_sub_ipages, flatpages) def get_bc(path): return flatpages.get_pages(FlatPagesIndex.breadcrumbs(path)) # return get_breadcrumb_pages(get_breadcrumb_paths(path)) # completes the meta hash if a configuration is not set def page_defaults(page, is_index, path): page.meta["title"]=page.meta.get("title", path.split('/')[-1]) page.meta["template"]=page.meta.get("template", cfg.default_template) return page def load_lists_for_templates(path, is_index): path2 = pjoin(FLATPAGES_ROOT,path) if is_index == True: ld=list_dir_md(path2) il=list_dir_img(path2) sp=list(get_sub_pages(path)) spi=list(get_sub_ipages(path)) else: ld=[] sp=[] spi=[] il=[] bc=get_bc(path) return (ld, il, sp, spi,bc) @page_blueprint.route('//') @page_blueprint.route('/') def post(name='index'): is_index, path, page = flatpages.get_flatpage(name) app.logger.info('render '+name) if not page is None: page=page_defaults(page, is_index, path) ld, il, sp, spi, bc = load_lists_for_templates(path,is_index) return render_template(page.meta["template"], ld=ld, post=page, sp=sp, spi=spi, il=il, pth=path, pagebreadcrumbs=bc) if os.path.exists(os.path.join(FLATPAGES_ROOT,path)): return send_from_directory(FLATPAGES_ROOT,path) else: return send_from_directory('static',path) def json_url_for(paths): for p in paths: yield url_for('intern.postjson', name=p) @page_blueprint.route('/.json/') def postjson(name='index'): is_index, path, page = flatpages.get_flatpage(name) if not page is None: ld, il, sp, spi, bc = load_lists_for_templates(path, is_index) page_defaults(page, is_index, path) p=page.meta p["depth"]=path_depth(path) p["path"]=path p["breadcrumbs"]=list(bc) p["subfolders"]=list(json_url_for(FlatPagesIndex.get_paths(spi))) p["subpages"]= list(json_url_for(FlatPagesIndex.get_paths(sp))) p["text"]=page.html return jsonify(page=p) if os.path.exists(u'{}/{}'.format(FLATPAGES_ROOT,path)): return send_from_directory(FLATPAGES_ROOT,path) else: return send_from_directory('static',path) app.register_blueprint(page_blueprint, url_prefix=cfg.url_prefix,static_folder='static') app.add_url_rule('%s//' % cfg.url_prefix,'page', post)