#!/usr/bin/env python3 import os.path import json from collections import OrderedDict from jinja2 import Environment, FileSystemLoader from utils.reST import reST_to_html def build_entry(template, fname, entry, older=None, newer=None): source_file = 'entries/{}.rst'.format(entry['file']) with open(source_file, 'r') as f: source = f.read() rendered_source = reST_to_html(source) rendered = template.render(entry=entry, older=older, newer=newer, content=rendered_source) with open('out/{}.html'.format(fname), 'w+') as f: f.write(rendered) def build_archive(template, filename, title, entries): rendered = template.render(title=title, entries=entries) with open('out/{}.html'.format(filename), 'w+') as f: f.write(rendered) def load_metadata(name): with open(name) as f: entries = json.load(f) published = [] unpublished = [] tags = {} for entry in entries: path = 'entries/{}.rst'.format(entry['file']) if not os.path.isfile(path): print('''Source file '{}' for entry '{}' does not exist. Skipping.''' .format(path, entry['title'])) continue if entry.get('published', "True") == "True": published.append(entry) else: unpublished.append(entry) for tag in entry.get('tags', []): if not tag in tags: tags[tag] = [] tags[tag].append(entry) return (published, unpublished, tags) if __name__ == '__main__': jenv = Environment(loader=FileSystemLoader('templates'), trim_blocks=True, lstrip_blocks=True) entry_tmpl = jenv.get_template('entry.html') archive_tmpl = jenv.get_template('archive.html') tags_tmpl = jenv.get_template('tags.html') published, unpublished, tags = load_metadata('metadata.json') for entry in unpublished: build_entry(entry_tmpl, entry['file'], entry) for index, entry in enumerate(published): older = published[index-1:index] newer = published[index+1:index+2] build_entry(entry_tmpl, entry['file'], entry, older, newer) build_entry(entry_tmpl, 'index', published[-1], older=published[-2:-1]) build_archive(archive_tmpl, 'archive', 'Archive', published) tag_list = OrderedDict(sorted(map(lambda k: (k, 0), tags.keys()))) for tag in tags: build_archive(archive_tmpl, 'tag-{}'.format(tag), tag, tags[tag]) tag_list[tag] = len(tags[tag]) build_archive(tags_tmpl, 'tags', 'Tags', tag_list)