#! /usr/bin/python import os import shutil import optparse import string import markdown import rfc822 from codecs import open p = optparse.OptionParser() p.add_option('-t', '--template', dest='template', default='template.html', help='Location of HTML template') p.add_option('-b', '--base', dest='base', default='', help='Base URL for contest') p.add_option('-p', '--puzzles', dest='puzzles', default='puzzles', help='Directory containing puzzles') p.add_option('-w', '--htmldir', dest='htmldir', default='puzzler', help='Directory to write HTML puzzle tree') p.add_option('-k', '--keyfile', dest='keyfile', default='puzzler.keys', help='Where to write keys') opts, args = p.parse_args() keys = [] tmpl_f = open(opts.template, encoding='utf-8') template = string.Template(tmpl_f.read()) tmpl_f.close() js = ''' ''' for cat in os.listdir(opts.puzzles): dirname = os.path.join(opts.puzzles, cat) for points in os.listdir(dirname): pointsdir = os.path.join(dirname, points) if not os.path.isdir(pointsdir): continue outdir = os.path.join(opts.htmldir, cat, points) try: os.makedirs(outdir) except OSError: pass readme = '' files = [] for fn in os.listdir(pointsdir): path = os.path.join(pointsdir, fn) if fn == 'key': for key in open(path, encoding='utf-8'): key = key.rstrip() keys.append((cat, points, key)) elif fn == 'hint': pass elif fn == 'index.exe': p = os.popen(path) m = rfc822.Message(p) for key in m.getallmatchingheaders('Key'): print key keys.append((cat, points, key)) readme = m.fp.read() if m.get('Content-Type', 'text/markdown') == 'text/markdown': readme = markdown.markdown(readme) elif fn == 'index.html': readme = open(path, encoding='utf-8').read() elif fn == 'index.mdwn': readme = open(path, encoding='utf-8').read() readme = markdown.markdown(readme) elif fn.endswith('~'): pass else: files.append((fn, path)) title = '%s for %s points' % (cat, points) body = [] if readme: body.append('
%s
\n' % readme) if files: body.append('\n') body.append('''
Your answer: Team:
Password:
Key:
''' % {'base': opts.base, 'cat': cat, 'points': points}) page = template.substitute(hdr=js, title=title, base=opts.base, links='', body_class='', onload = "getTeamInfo()", body=''.join(body)) f = open(os.path.join(outdir, 'index.html'), 'w', encoding='utf-8') f.write(page) f = open(opts.keyfile, 'w', encoding='utf-8') for key in keys: f.write('%s\t%s\t%s\n' % key)