#!/usr/bin/env python

import sys
from os import path
from hoedown import Markdown, HtmlRenderer, HtmlTocRenderer, SmartyPants, \
    EXT_NO_INTRA_EMPHASIS, EXT_TABLES, EXT_FENCED_CODE, EXT_AUTOLINK, \
    EXT_STRIKETHROUGH, EXT_SPACE_HEADERS, EXT_SUPERSCRIPT, \
    HTML_SKIP_HTML, HTML_USE_XHTML, HTML_ESCAPE, \
    HTML_HARD_WRAP, HTML_SMARTYPANTS


hoedown_extensions = {
    '--parse-no-intra-emphasis': EXT_NO_INTRA_EMPHASIS,
    '--parse-tables': EXT_TABLES,
    '--parse-fenced-code': EXT_FENCED_CODE,
    '--parse-autolink': EXT_AUTOLINK,
    '--parse-strikethrough': EXT_STRIKETHROUGH,
    '--parse-space-headers': EXT_SPACE_HEADERS,
    '--parse-superscript': EXT_SUPERSCRIPT
}

hoedown_html_flags = {
    '--render-skip-html': HTML_SKIP_HTML,
    '--render-hard_wrap': HTML_HARD_WRAP,
    '--render-use-xhtml': HTML_USE_XHTML,
    '--render-escape': HTML_ESCAPE,
    '--smarty': HTML_SMARTYPANTS
}


help = '''Usage: hoedownpy [--parse-<extension>...] [--render-<flag>...] [--smarty] [<file>...]

Parser extensions:
%s

Render flags:
%s
''' % (
    '\n'.join(['  %s' % a for a in hoedown_extensions]),
    '\n'.join(['  %s' % a for a in hoedown_html_flags]))


if __name__ == '__main__':
    args = sys.argv[1:]

    files = []
    flags = 0
    extensions = 0

    for arg in args:
        if arg in ('-h', '--help'):
            print(help)
            sys.exit(0)
        elif arg in hoedown_html_flags:
            flags |= hoedown_html_flags[arg]
        elif arg in hoedown_extensions:
            extensions |= hoedown_extensions[arg]
        else:
            # If it's not a extension or HTML flag,
            # then it must be a file, right?
            files.append(arg)

    if flags & HTML_SMARTYPANTS:
        class HtmlRenderer(HtmlRenderer, SmartyPants):
            pass

    renderer = HtmlRenderer(flags)
    to_html = Markdown(renderer, extensions).render

    if files:
        for fn in files:
            fn = path.abspath(fn)
            if not path.exists(fn):
                print('Does not exist: %s' % fn)
            else:
                with open(fn, 'r') as fd:
                    source = fd.read()
                print(to_html(source))
    else:
        print(to_html(sys.stdin.read()))
