There are many, many command line converters for turning Markdown into HTML, but for the most part these make HTML fragments, not full documents with CSS styling. That’s fine most of the time (e.g. when I’m writing blog posts), but sometimes I want a full, pretty document so I can print it out (typically for presentation notes).
To fill this hole I put together a small script that converts Markdown and wraps the HTML result in a template that includes Bootstrap CSS. I set the fonts to sans-serif
and monospace
so that they are taken from the defaults for your browser, making it easier to use your favorite fonts.
The script requires the Python libraries Python Markdown, mdx_smartypants (a Python-Markdown extension), and Jinja2.
#!/usr/bin/env python | |
import argparse | |
import sys | |
import jinja2 | |
import markdown | |
TEMPLATE = """<!DOCTYPE html> | |
<html> | |
<head> | |
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.0/css/bootstrap-combined.min.css" rel="stylesheet"> | |
<style> | |
body { | |
font-family: sans-serif; | |
} | |
code, pre { | |
font-family: monospace; | |
} | |
h1 code, | |
h2 code, | |
h3 code, | |
h4 code, | |
h5 code, | |
h6 code { | |
font-size: inherit; | |
} | |
</style> | |
</head> | |
<body> | |
<div class="container"> | |
{{content}} | |
</div> | |
</body> | |
</html> | |
""" | |
def parse_args(args=None): | |
d = 'Make a complete, styled HTML document from a Markdown file.' | |
parser = argparse.ArgumentParser(description=d) | |
parser.add_argument('mdfile', type=argparse.FileType('r'), nargs='?', | |
default=sys.stdin, | |
help='File to convert. Defaults to stdin.') | |
parser.add_argument('-o', '--out', type=argparse.FileType('w'), | |
default=sys.stdout, | |
help='Output file name. Defaults to stdout.') | |
return parser.parse_args(args) | |
def main(args=None): | |
args = parse_args(args) | |
md = args.mdfile.read() | |
extensions = ['extra', 'smarty'] | |
html = markdown.markdown(md, extensions=extensions, output_format='html5') | |
doc = jinja2.Template(TEMPLATE).render(content=html) | |
args.out.write(doc) | |
if __name__ == '__main__': | |
sys.exit(main()) |