#!/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_TITLE = re.compile(r"
(.*?)")
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()
image = DATA_BACKGROUND.search(content)
title = PRES_TITLE.search(content)
if content and image and title:
logging.debug('Image for %s = %s', filename, image.group(1))
logging.debug('Title for %s = %s', filename, title.group(1))
result = (image.group(1), 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 = check_presentations(files)
# holy shit, talk about abusing Python internals
content.sort(cmp=lambda x, y: -1 if x['title'] < y['title'] else 1)
with open('index.json', 'w') as output:
output.write(json.dumps(content))
return
if __name__ == "__main__":
main()