#!/usr/bin/env python # -*- encoding: utf-8 -*- """Build the JSON with the list of presentions.""" import os import re import logging import argparse import datetime import json DATA_BACKGROUND = re.compile(r"data-background=['\"](.*?)['\"]") PRES_TITLE1 = re.compile(r"(.*?)") PRES_TITLE2 = re.compile(r"(.*?)") HEADER = re.compile(r"section.*data-background=['\"]" r"(?P.*?)['\"].*data-header" r"(?P.*?)section", re.M | re.S) def retrieve_presentation_info(filename): """Open a file and try to retrieve the presentation information, like background-image and title. """ result = (None, None) content = '' with open(filename) as data: content = data.read() header = HEADER.search(content) if not header: logging.debug('%s has no header', filename) return result logging.debug('Header: %r', header.groupdict()) image = header.groupdict()['image'] title = PRES_TITLE1.search(header.groupdict()['content']) if not title: title = PRES_TITLE2.search(header.groupdict()['content']) if content and image and title: logging.debug('Image for %s = %s', filename, image) logging.debug('Title for %s = %s', filename, title.group(1)) result = (image, title.group(1)) elif not content: logging.debug('%s has no content', filename) elif not image: logging.debug('%s has no image', filename) else: logging.debug('%s has no title', filename) return result def check_presentations(file_list): """Check if the any of the files in the file list are presentations.""" result = [] for filename in file_list: logging.debug('-->') if not filename.endswith('.html'): # presentations are HTML only logging.debug('%s ignored, not an HTML file', filename) continue (image, title) = retrieve_presentation_info(filename) if image and title: stat_info = os.stat(filename) date = datetime.datetime.fromtimestamp(stat_info.st_mtime) logging.debug('Modified date = %s', date) result.append({'presentation': filename, 'title': title, 'image': image, 'changed': date.strftime('%Y-%m-%d %H:%M:%S')}) else: logging.debug('Missing information on %s', filename) return result def main(): """Main function.""" parser = argparse.ArgumentParser() parser.add_argument('-d', '--debug', action='store_const', dest='debug', default=False, const=True, help='Enable debugging messages') args = parser.parse_args() level = logging.INFO if args.debug: level = logging.DEBUG logging.basicConfig(level=level) for (root, _, files) in os.walk('.'): if not root == '.': # only files in the current directly will be checked continue content = sorted(check_presentations(files), key=lambda r: r['title']) with open('index.json', 'w') as output: output.write(json.dumps(content)) return if __name__ == "__main__": main()