#!/usr/bin/env python

import os
import sys
import markdown
import re

#   SRC
#   +-2022/
#   | +-10/
#   | +-12/
#   |   +-25/
#   +-2023/
#   | +-1/
#   |   +-26/
#   | +-3/
#   ... 

def print_usage():
    print("\nusage: python mkblog.py SRC DEST\n")
    print("\n")
    print("\t\tSRC\tinput markdown file")
    print("\t\tDEST\tdestination html file")

# check args
if len(sys.argv) != 3:
    print_usage()
    sys.exit(1)

src_file = sys.argv[1]
dest_file = sys.argv[2]

# check blog root exists
if not os.path.isfile(src_file):
    print("{blog_root} doesn't exist")
    sys.exit(1)

# make dest dir if it doesnt exist

dest_dir = os.path.dirname(dest_file)
print(dest_dir)
if not os.path.isdir(dest_dir):
    os.makedirs(dest_dir)

# write markdown into a dummy file first so that we can add lines before it in the final output
dummy_file = f"{dest_file}.bak"
open(dummy_file, 'w').close()

print(f"{src_file} -> {dummy_file}")
markdown.markdownFromFile(input=src_file, output=dummy_file, extensions=["fenced_code"])

print(f"{dummy_file} -> {dest_file}")
with open(dummy_file, 'r') as read_file, open(dest_file, 'w') as write_file:
    write_file.write("#include blogstart.html\n")

    # modify the basic html to make it nicer for styling later
    html = read_file.read()

    # extract images from their enclosing <p> tags
    html = re.sub('(<p>(<img(?:.+)/>)</p>)', r'\2', html)

    # insert text-panel start between non-<p> and <p> elements
    html = re.sub('((?<!</p>)\n)(<p>)', r'\1<div class="text-panel">\n\2', html)
    # insert para-block end between <p> and non-<p> elements
    html = re.sub('(</p>\n)((?!<p>))', r'\1</div>\n\2', html)

    # insert code-panel start before <pre> elements
    html = re.sub('(<pre>)', r'<div class="code-panel">\n\1', html)
    # insert code-panel end after </pre> elements
    html = re.sub('(</pre>)', r'\1\n</div>', html)

    # replace horizontal rules with nice separator dot
    html = re.sub('<hr />', r'<div class="separator"></div>', html)

    lines = html.split("\n")

    # tack on a closing div because we will have opened one without closing it on the final <p>
    lines.append("</div>")

    for line in lines:
        write_file.write(line + "\n")

    write_file.write("\n#include blogend.html\n")

os.remove(dummy_file)