#!/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/python | |
import codecs | |
import re | |
import jinja2 | |
import markdown | |
def process_slides(): | |
with codecs.open('../presentation.html', 'w', encoding='utf8') as outfile: | |
md = codecs.open('slides.md', encoding='utf8').read() | |
md_slides = md.split('\n---\n') | |
print len(md_slides) | |
slides = [] | |
# Process each slide separately. | |
for md_slide in md_slides: | |
slide = {} | |
sections = md_slide.split('\n\n') | |
# Extract metadata at the beginning of the slide (look for key: value) | |
# pairs. | |
metadata_section = sections[0] | |
metadata = parse_metadata(metadata_section) | |
slide.update(metadata) | |
remainder_index = metadata and 1 or 0 | |
# Get the content from the rest of the slide. | |
content_section = '\n\n'.join(sections[remainder_index:]) | |
html = markdown.markdown(content_section) | |
slide['content'] = postprocess_html(html, markdown) | |
slides.append(slide) | |
template = jinja2.Template(open('base.html').read()) | |
outfile.write(template.render(locals())) | |
def parse_metadata(section): | |
"""Given the first part of a slide, returns metadata associated with it.""" | |
metadata = {} | |
metadata_lines = section.split('\n') | |
for line in metadata_lines: | |
colon_index = line.find(':') | |
if colon_index != -1: | |
key = line[:colon_index].strip() | |
val = line[colon_index + 1:].strip() | |
metadata[key] = val | |
return metadata | |
def postprocess_html(html, metadata): | |
"""Returns processed HTML to fit into the slide template format.""" | |
return html | |
if __name__ == '__main__': | |
process_slides() |