diff --git a/build.py b/build.py index 40fe1f3..f16a56b 100644 --- a/build.py +++ b/build.py @@ -10,7 +10,10 @@ import argparse import glob +import html +from io import StringIO import markdown +import operator import os import re import shutil @@ -24,6 +27,8 @@ deploy_directory = '~/src/www-home' md_extensions = [ 'fenced_code', 'codehilite', 'nl2br', 'toc', 'smarty', 'tables', 'linkify'] +blog_entries = [] + def print_file(in_file, out_file): print('%-62s -> %s' % (in_file, out_file)) @@ -42,6 +47,13 @@ def copy_static_files(): shutil.copy2(source, dest) +def find_update_date(text): + match = re.search(r'^Published:? (\d{4}-\d{2}-\d{2})', text, re.MULTILINE) + if not match: + return None + return match.group(1) + + def process_markdown_files(): template = open('template.html').read() for (dirpath, _, filenames) in os.walk(input_directory): @@ -50,6 +62,8 @@ def process_markdown_files(): if not markdown_filename.endswith('.md'): continue + blog_entry = {} + markdown_file = open(markdown_filename) text = markdown_file.read() markdown_file.close() @@ -62,6 +76,9 @@ def process_markdown_files(): title = match.group(1).lstrip('# ') else: title = text + + blog_entry['title'] = html.escape(title) + title += ' | Colin McMillen' if markdown_filename == os.path.join(input_directory, 'index.md'): title = 'Colin McMillen' @@ -75,9 +92,16 @@ def process_markdown_files(): if page_url.endswith('index.html'): # strip off index.html page_url = page_url[:-len('index.html')] - html = markdown.markdown( + update_date = find_update_date(text) + if update_date: + blog_entry['url'] = 'https://www.mcmillen.dev/' + page_url + blog_entry['date'] = update_date + blog_entries.append(blog_entry) + + html_content = markdown.markdown( text, extensions=md_extensions, output_format='html5') - output = template.format(title=title, content=html, page_url=page_url) + output = template.format( + title=title, content=html_content, page_url=page_url) os.makedirs(out_dirpath, exist_ok=True) print_file(markdown_filename, out_fullpath) @@ -93,15 +117,71 @@ grep -v ^output/google | grep -v ^output/drafts | perl -pe 's|output|https://www.mcmillen.dev|' > output/sitemap.txt""".split('\n')) + print_file('', 'output/sitemap.txt') os.system(sitemap_command) -def make_rss(): # TODO: implement. - pass +def make_atom_feed(): + atom_template = ''' + + + Colin McMillen's Blog + + + {last_update} + + Colin McMillen + + https://www.mcmillen.dev/ + + {entries} + +''' + + entry_template = ''' + + {title} + {url} + + {updated} + {summary} + +''' + + blog_entries.sort(key=operator.itemgetter('date')) + + entries_io = StringIO() + last_update = None + for entry in blog_entries: + # We lie and pretend that all entries were written at noon UTC. + update_date = entry['date'] + 'T12:00:00+00:00' + last_update = update_date + entries_io.write(entry_template.format( + url=entry['url'], + title=entry['title'], + updated=update_date, + summary='TODO: fill this out.')) + + entries_text = entries_io.getvalue() + + atom_feed = atom_template.format( + last_update=last_update, + entries=entries_io.getvalue()) + entries_io.close() + + atom_filename = os.path.join(output_directory, 'atom.xml') + print_file('', atom_filename) + atom_file = open(atom_filename, 'w') + atom_file.write(atom_feed) + atom_file.close() + + +def copy_site(): + os.system('cp -r output/* %s' % deploy_directory) def deploy_site(): - os.system('cp -r output/* %s' % deploy_directory) + copy_site() os.chdir(os.path.expanduser(deploy_directory)) os.system('git add .') os.system('git commit -m "automated update from build.py"') @@ -116,9 +196,12 @@ def main(): parser.add_argument( '--fast', action='store_true', help='only rebuild content files') + parser.add_argument( + '--copy', action='store_true', + help='copy output files to www-home git repo') parser.add_argument( '--deploy', action='store_true', - help='deploy the site by pushing to the www-home git repo') + help='deploy the site by pushing the www-home git repo to production') args = parser.parse_args() if args.clean: @@ -128,7 +211,10 @@ def main(): copy_static_files() process_markdown_files() make_sitemap() - make_rss() + make_atom_feed() + + if args.copy and not args.deploy: + copy_site() if args.deploy: if args.fast: diff --git a/template.html b/template.html index 9240b16..7e63acf 100644 --- a/template.html +++ b/template.html @@ -6,6 +6,7 @@ + {title}