| #!/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() |