#!/usr/bin/env python3 import argparse import os import re import sys HEADER = '\\documentclass[a4paper]{article}\n\n'\ '\\author{} %%TODO\n'\ '\\title{Huiswerk %s, week %d}\n\n'\ '\\usepackage{enumitem}\n'\ '\\usepackage[dutch]{babel}\n\n'\ '\\begin{document}\n\n'\ '\\maketitle\n' FOOTER = '\n\\end{document}' class ExercisesList: STYLES = ['\\arabic*.', '(\\alph*)', '\\roman*.'] def __init__(self, indent=0, style=None): self.indent = indent self.style = style if style is not None else self.STYLES[self.indent] self.exercises = [] def read(self, lines): i = -1 while i < len(lines) - 1: i += 1 line = lines[i] # Single item m = re.search(r'^\t{%d}(\d+)$' % self.indent, line) if m is not None: self.exercises.append(int(m.group(1))) continue # Range m = re.search(r'^\t{%d}(\d+)-(\d+)$' % self.indent, line) if m is not None: self.exercises += range(int(m.group(1)), int(m.group(2)) + 1) continue # Style m = re.search(r'^\t{%d}(\S.*)$' % self.indent, line) if m is not None: self.style = m.group(1) continue # Indent if line[:self.indent + 1] == '\t' * (self.indent + 1): sublist = ExercisesList(self.indent + 1) i += sublist.read(lines[i:]) - 1 self.exercises.append(sublist) continue # This line is not for us break return i def to_latex(self): latex = [] indent = '\t' * self.indent * 2 i = 1 latex.append(indent + '\\begin{enumerate}') if self.style != self.STYLES[self.indent]: latex[0] += '[label=%s]' % self.style for item in self.exercises: if type(item) is ExercisesList: latex += item.to_latex() else: if item != i: latex.append(indent + '\t\\setcounter{enumi%s}{%d}' % ('i' * self.indent, item - 1)) i = item latex.append(indent + '\t\\item %TODO ' + str(item)) i += 1 latex.append(indent + '\\end{enumerate}') return latex def parse_args(): """Parse command line arguments""" pars = argparse.ArgumentParser(description='TeX format') pars.add_argument( '-i', '--input', type=argparse.FileType('r'), default=sys.stdin) pars.add_argument( '-o', '--output', type=argparse.FileType('w'), default=sys.stdout) pars.add_argument('-c', '--course', type=str, required=True) pars.add_argument('-w', '--week', type=int, required=True) return pars.parse_args() def main(): args = parse_args() lines = [line[:-1] for line in args.input.readlines()] exercises = ExercisesList() exercises.read(lines) print(HEADER % (args.course, args.week)) print('\n'.join(exercises.to_latex())) print(FOOTER) if __name__ == '__main__': main()