]>
Commit | Line | Data |
---|---|---|
5aece86f AM |
1 | from flask import Flask, render_template |
2 | from flask.ext.script import Manager | |
3 | from flask_frozen import Freezer | |
4 | from flask.ext.assets import Environment, Bundle, ManageAssets | |
5 | from lib.flatpages import FlatPages | |
6 | from lib.mdjinja import MarkdownJinja | |
7 | ||
8 | # | |
9 | # Config | |
10 | # | |
11 | ||
12 | DEBUG = True | |
13 | ||
14 | # Use Markdown for simple pages/content | |
15 | FLATPAGES_AUTO_RELOAD = DEBUG | |
16 | FLATPAGES_EXTENSION = '.md' | |
17 | ||
18 | # FREEZER_BASE_URL = "http://localhost/" | |
19 | FREEZER_RELATIVE_URLS = False | |
20 | ||
21 | ASSETS_DEBUG = DEBUG | |
22 | ||
23 | app = Flask(__name__, static_folder="assets") | |
24 | app.config.from_object(__name__) | |
25 | ||
26 | # | |
27 | # Jinja, CSS, LESS, and JS Assets | |
28 | # | |
29 | WATCH_PATTERNS = ( | |
30 | "README.md", | |
31 | "/templates/**", | |
32 | "/pages/**", | |
33 | "/assets/**" | |
34 | ) | |
35 | ||
36 | assets = Environment(app) | |
37 | ||
38 | css_files = ['home.less'] | |
39 | css_all = Bundle(*['less/' + file for file in css_files], | |
40 | filters=['less', 'cleancss'], output='gen/css_all.css') | |
41 | assets.register("css_all", css_all) | |
42 | ||
43 | js_files = ['home.js'] | |
44 | js_all = Bundle(*['js/' + file for file in js_files], | |
45 | filters='rjsmin', output='gen/js_all.js') | |
46 | assets.register("js_all", js_all) | |
47 | ||
48 | css_lib_files = ['bootstrap.css', 'bootstrap-theme.css'] | |
49 | css_lib = Bundle(*['lib/css/' + file for file in css_lib_files], | |
50 | filters='cleancss', output='gen/css_lib.css') | |
51 | assets.register("css_lib", css_lib) | |
52 | ||
53 | js_lib_files = ['jquery.js', 'underscore.js', 'bootstrap.js', 'd3.js'] | |
54 | js_lib = Bundle(*['lib/js/' + file for file in js_lib_files], | |
55 | filters='rjsmin', output='gen/js_lib.js') | |
56 | assets.register("js_lib", js_lib) | |
57 | ||
58 | # | |
59 | # Plugins | |
60 | # | |
61 | ||
62 | freezer = Freezer(app) | |
63 | pages = FlatPages(app) | |
64 | md = MarkdownJinja(app) | |
65 | manager = Manager(app) | |
66 | manager.add_command("assets", ManageAssets(assets)) | |
67 | ||
68 | # | |
69 | # Routes | |
70 | # | |
71 | ||
72 | ||
73 | @app.route('/') | |
74 | def index(): | |
75 | page = pages.get("index") | |
7fee232b | 76 | return render_template("page.jinja", page=page) |
5aece86f AM |
77 | |
78 | ||
79 | @app.route('/list/') | |
80 | def list(): | |
7fee232b | 81 | return render_template("allpages.jinja", pages=pages) |
5aece86f AM |
82 | |
83 | ||
84 | @app.route('/pages/<path:path>/') | |
85 | def page(path): | |
86 | page = pages.get_or_404(path) | |
7fee232b | 87 | return render_template('page.jinja', page=page) |
5aece86f AM |
88 | |
89 | ||
90 | @app.route('/tag/<string:tag>/') | |
91 | def tag(tag): | |
92 | tagged = [p for p in pages if tag in p.meta.get('tags', [])] | |
7fee232b | 93 | return render_template('alltags.jinja', pages=tagged, tag=tag) |
5aece86f AM |
94 | |
95 | ||
96 | # | |
97 | # livereload infra | |
98 | # | |
99 | ||
100 | ||
101 | from livereload import Server, shell | |
102 | from formic import FileSet | |
103 | from os import getcwd, path | |
104 | ||
105 | ||
106 | def make_livereload_server(wsgi_app): | |
107 | server = Server(wsgi_app) | |
108 | ||
109 | # XXX: build step could be useful, e.g. | |
110 | # making it `python app.py build`, but | |
111 | # in this use case not really necessary | |
112 | build_cmd = "true" | |
113 | ||
114 | print "Files being monitored:" | |
115 | ||
116 | cwd = getcwd() | |
117 | ||
118 | for pattern in WATCH_PATTERNS: | |
119 | print "Pattern: ", pattern | |
120 | for filepath in FileSet(include=pattern): | |
121 | print "=>", path.relpath(filepath, cwd) | |
122 | server.watch(filepath, build_cmd) | |
123 | ||
124 | ||
125 | return server | |
126 | ||
127 | ||
128 | # | |
129 | # Commands | |
130 | # | |
131 | ||
132 | ||
133 | @manager.command | |
134 | def build(): | |
135 | """Creates a static version of site in ./build.""" | |
136 | freezer.freeze() | |
137 | ||
138 | ||
139 | @manager.command | |
140 | def livereload(): | |
141 | """Runs the Flask development server under livereload.""" | |
142 | # wire livereload to Flask via wsgi | |
143 | flask_wsgi_app = app.wsgi_app | |
144 | server = make_livereload_server(flask_wsgi_app) | |
145 | # serve application | |
146 | server.serve(host='127.0.0.1', port=5000) | |
147 | ||
148 | ||
149 | if __name__ == "__main__": | |
150 | manager.run() |