Browse code
init
Ed L authored on 16/01/2012 23:56:56
Showing 4 changed files
Showing 4 changed files
3 | 3 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,17 @@ |
1 |
+from flask import Flask, url_for |
|
2 |
+from slides import * |
|
3 |
+app = Flask(__name__) |
|
4 |
+ |
|
5 |
+slideshow = 'slideshow' |
|
6 |
+ |
|
7 |
+@app.route('/') |
|
8 |
+def main(): |
|
9 |
+ with file(slideshow) as f: |
|
10 |
+ sshow = read_slides(f) |
|
11 |
+ |
|
12 |
+ sshow = [make_slide(slide) for slide in sshow] |
|
13 |
+ return make_document(sshow).encode('utf-8') |
|
14 |
+ |
|
15 |
+ |
|
16 |
+if __name__ == '__main__': |
|
17 |
+ app.run() |
0 | 18 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,76 @@ |
1 |
+import yaml |
|
2 |
+import markdown |
|
3 |
+ |
|
4 |
+class RuleSet(object): |
|
5 |
+ def __init__(self, selector, **styles): |
|
6 |
+ self.selector = selector |
|
7 |
+ self.styles = styles |
|
8 |
+ |
|
9 |
+ def __str__(self): |
|
10 |
+ print self.styles |
|
11 |
+ styles = ';\n '.join(': '.join(item) for item in self.styles.items()) |
|
12 |
+ return '''\n%s {\n%s\n}''' % (self.selector, styles) |
|
13 |
+ |
|
14 |
+def read_slides(fil): |
|
15 |
+ slides = fil.read().split('\n------\n') |
|
16 |
+ result = [] |
|
17 |
+ for slide in slides: |
|
18 |
+ slide = slide.split('\n---\n') |
|
19 |
+ |
|
20 |
+ result.append(dict( |
|
21 |
+ config=yaml.load(slide[0]), |
|
22 |
+ text=markdown.markdown(slide[1]) |
|
23 |
+ )) |
|
24 |
+ return result |
|
25 |
+ |
|
26 |
+import mako.template |
|
27 |
+template = mako.template.Template(file('template.mako').read()) |
|
28 |
+ |
|
29 |
+def make_slide(slide): |
|
30 |
+ config = slide['config'] |
|
31 |
+ print config |
|
32 |
+ text = slide['text'] |
|
33 |
+ |
|
34 |
+ attrs = config.get('attrs', {}) |
|
35 |
+ attrs_out = [] |
|
36 |
+ for attr, value in attrs.items(): |
|
37 |
+ attrs_out.append('data-%s="%s"' % (attr, value)) |
|
38 |
+ return template.get_def('slide').render(id='%s' % config['id'], attr=' '.join(attrs_out), text=text), RuleSet('#%s' % config['id'], **config.get('style', {})) |
|
39 |
+ |
|
40 |
+def make_document(slides): |
|
41 |
+ slides, styles = zip(*slides) |
|
42 |
+ styles = '\n'.join( |
|
43 |
+ str(ruleset) for ruleset in styles |
|
44 |
+ ) |
|
45 |
+ return template.get_def('document').render(style='%s' % styles, slides=slides) |
|
46 |
+ |
|
47 |
+if __name__ == '__main__': |
|
48 |
+ import argparse |
|
49 |
+ import twisted.web.resource |
|
50 |
+ |
|
51 |
+ class SlideshowResource(twisted.web.resource.Resource): |
|
52 |
+ parser = argparse.ArgumentParser() |
|
53 |
+ parser.add_argument('slideshow', nargs=1) |
|
54 |
+ parser.add_argument('static_files', nargs=1) |
|
55 |
+ options = parser.parse_args() |
|
56 |
+ slideshow = options.slideshow[0] |
|
57 |
+ static_files = options.static_files[0] |
|
58 |
+ |
|
59 |
+ def render_GET(self, request): |
|
60 |
+ with file(self.slideshow) as f: |
|
61 |
+ slideshow = read_slides(f) |
|
62 |
+ |
|
63 |
+ slideshow = [make_slide(slide) for slide in slideshow] |
|
64 |
+ |
|
65 |
+ return make_document(slideshow).encode('utf-8') |
|
66 |
+ |
|
67 |
+ from twisted.internet import reactor |
|
68 |
+ from twisted.web import static, server |
|
69 |
+ root = static.File('static_files') |
|
70 |
+ root.putChild('', SlideshowResource()) |
|
71 |
+ import os |
|
72 |
+ port = int(os.getenv('PORT', 8080)) |
|
73 |
+ reactor.listenTCP(port, server.Site(root)) |
|
74 |
+ reactor.run() |
|
75 |
+ |
|
76 |
+ |
0 | 77 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,55 @@ |
1 |
+<!doctype html> |
|
2 |
+ |
|
3 |
+ |
|
4 |
+<%! import markdown %> |
|
5 |
+<%def name="slide(id, attr, text)"> |
|
6 |
+ <div id="${id}" class="step" ${attr}> |
|
7 |
+ ${ text } |
|
8 |
+ </div> |
|
9 |
+</%def> |
|
10 |
+ |
|
11 |
+<%def name="impress()"> |
|
12 |
+ <div id="impress"> |
|
13 |
+ <div class="no-support-message" style="font-size: x-large;font-weight: bolder"> |
|
14 |
+ Your browser doesn't support impress.js. Try Chrome or Safari. |
|
15 |
+ </div> |
|
16 |
+ |
|
17 |
+ ${caller.body()} |
|
18 |
+ |
|
19 |
+ </div> |
|
20 |
+ <!--<script type="text/javascript" src="https://raw.github.com/bartaz/impress.js/master/js/impress.js"></script>--> |
|
21 |
+ <script type="text/javascript" src="impress.js"></script> |
|
22 |
+</%def> |
|
23 |
+ |
|
24 |
+ |
|
25 |
+ |
|
26 |
+ |
|
27 |
+<%def name="document(style, slides)"> |
|
28 |
+<html> |
|
29 |
+ <head> |
|
30 |
+ <title>Impress Tutorial</title> |
|
31 |
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
|
32 |
+ |
|
33 |
+ <style type='text/css'> |
|
34 |
+ @import url('slideshow.css'); |
|
35 |
+ |
|
36 |
+ .no-support-message { display:none; } |
|
37 |
+ .impress-not-supported .no-support-message { display:block; } |
|
38 |
+ |
|
39 |
+ ${style} |
|
40 |
+ |
|
41 |
+ </style> |
|
42 |
+ </head> |
|
43 |
+ <body> |
|
44 |
+ |
|
45 |
+ <%self:impress> |
|
46 |
+ %for slide in slides: |
|
47 |
+ ${slide} |
|
48 |
+ %endfor |
|
49 |
+ </%self:impress> |
|
50 |
+ |
|
51 |
+ |
|
52 |
+ </body> |
|
53 |
+</html> |
|
54 |
+</%def> |
|
55 |
+ |