annotate presen/scripts/md/render.py @ 10:5c57e35e19b6

add presen
author sugi
date Tue, 23 Apr 2013 23:31:26 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
5c57e35e19b6 add presen
sugi
parents:
diff changeset
1 #!/usr/bin/env python
5c57e35e19b6 add presen
sugi
parents:
diff changeset
2
5c57e35e19b6 add presen
sugi
parents:
diff changeset
3 import codecs
5c57e35e19b6 add presen
sugi
parents:
diff changeset
4 import re
5c57e35e19b6 add presen
sugi
parents:
diff changeset
5 import jinja2
5c57e35e19b6 add presen
sugi
parents:
diff changeset
6 import markdown
5c57e35e19b6 add presen
sugi
parents:
diff changeset
7
5c57e35e19b6 add presen
sugi
parents:
diff changeset
8 def process_slides():
5c57e35e19b6 add presen
sugi
parents:
diff changeset
9 with codecs.open('../../presentation-output.html', 'w', encoding='utf8') as outfile:
5c57e35e19b6 add presen
sugi
parents:
diff changeset
10 md = codecs.open('slides.md', encoding='utf8').read()
5c57e35e19b6 add presen
sugi
parents:
diff changeset
11 md_slides = md.split('\n---\n')
5c57e35e19b6 add presen
sugi
parents:
diff changeset
12 print 'Compiled %s slides.' % len(md_slides)
5c57e35e19b6 add presen
sugi
parents:
diff changeset
13
5c57e35e19b6 add presen
sugi
parents:
diff changeset
14 slides = []
5c57e35e19b6 add presen
sugi
parents:
diff changeset
15 # Process each slide separately.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
16 for md_slide in md_slides:
5c57e35e19b6 add presen
sugi
parents:
diff changeset
17 slide = {}
5c57e35e19b6 add presen
sugi
parents:
diff changeset
18 sections = md_slide.split('\n\n')
5c57e35e19b6 add presen
sugi
parents:
diff changeset
19 # Extract metadata at the beginning of the slide (look for key: value)
5c57e35e19b6 add presen
sugi
parents:
diff changeset
20 # pairs.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
21 metadata_section = sections[0]
5c57e35e19b6 add presen
sugi
parents:
diff changeset
22 metadata = parse_metadata(metadata_section)
5c57e35e19b6 add presen
sugi
parents:
diff changeset
23 slide.update(metadata)
5c57e35e19b6 add presen
sugi
parents:
diff changeset
24 remainder_index = metadata and 1 or 0
5c57e35e19b6 add presen
sugi
parents:
diff changeset
25 # Get the content from the rest of the slide.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
26 content_section = '\n\n'.join(sections[remainder_index:])
5c57e35e19b6 add presen
sugi
parents:
diff changeset
27 html = markdown.markdown(content_section)
5c57e35e19b6 add presen
sugi
parents:
diff changeset
28 slide['content'] = postprocess_html(html, metadata)
5c57e35e19b6 add presen
sugi
parents:
diff changeset
29
5c57e35e19b6 add presen
sugi
parents:
diff changeset
30 slides.append(slide)
5c57e35e19b6 add presen
sugi
parents:
diff changeset
31
5c57e35e19b6 add presen
sugi
parents:
diff changeset
32 template = jinja2.Template(open('base.html').read())
5c57e35e19b6 add presen
sugi
parents:
diff changeset
33
5c57e35e19b6 add presen
sugi
parents:
diff changeset
34 outfile.write(template.render(locals()))
5c57e35e19b6 add presen
sugi
parents:
diff changeset
35
5c57e35e19b6 add presen
sugi
parents:
diff changeset
36 def parse_metadata(section):
5c57e35e19b6 add presen
sugi
parents:
diff changeset
37 """Given the first part of a slide, returns metadata associated with it."""
5c57e35e19b6 add presen
sugi
parents:
diff changeset
38 metadata = {}
5c57e35e19b6 add presen
sugi
parents:
diff changeset
39 metadata_lines = section.split('\n')
5c57e35e19b6 add presen
sugi
parents:
diff changeset
40 for line in metadata_lines:
5c57e35e19b6 add presen
sugi
parents:
diff changeset
41 colon_index = line.find(':')
5c57e35e19b6 add presen
sugi
parents:
diff changeset
42 if colon_index != -1:
5c57e35e19b6 add presen
sugi
parents:
diff changeset
43 key = line[:colon_index].strip()
5c57e35e19b6 add presen
sugi
parents:
diff changeset
44 val = line[colon_index + 1:].strip()
5c57e35e19b6 add presen
sugi
parents:
diff changeset
45 metadata[key] = val
5c57e35e19b6 add presen
sugi
parents:
diff changeset
46
5c57e35e19b6 add presen
sugi
parents:
diff changeset
47 return metadata
5c57e35e19b6 add presen
sugi
parents:
diff changeset
48
5c57e35e19b6 add presen
sugi
parents:
diff changeset
49 def postprocess_html(html, metadata):
5c57e35e19b6 add presen
sugi
parents:
diff changeset
50 """Returns processed HTML to fit into the slide template format."""
5c57e35e19b6 add presen
sugi
parents:
diff changeset
51 if metadata.get('build_lists') and metadata['build_lists'] == 'true':
5c57e35e19b6 add presen
sugi
parents:
diff changeset
52 html = html.replace('<ul>', '<ul class="build">')
5c57e35e19b6 add presen
sugi
parents:
diff changeset
53 html = html.replace('<ol>', '<ol class="build">')
5c57e35e19b6 add presen
sugi
parents:
diff changeset
54 return html
5c57e35e19b6 add presen
sugi
parents:
diff changeset
55
5c57e35e19b6 add presen
sugi
parents:
diff changeset
56 if __name__ == '__main__':
5c57e35e19b6 add presen
sugi
parents:
diff changeset
57 process_slides()