university-setup/scripts/lectures.py

151 lines
4.3 KiB
Python
Raw Normal View History

2019-09-15 20:42:11 +02:00
#!/usr/bin/python3
import locale
import re
import subprocess
2021-09-16 13:28:51 +02:00
from datetime import datetime
2019-09-15 20:42:11 +02:00
2021-09-16 13:28:51 +02:00
from config import get_week, DATE_FORMAT, LOCALE, DEFAULT_MASTER_FILE_NAME
2019-09-15 20:42:11 +02:00
# TODO
locale.setlocale(locale.LC_TIME, LOCALE)
2019-09-15 20:42:11 +02:00
def number2filename(n):
return 'lec_{0:02d}.tex'.format(n)
2021-09-16 13:28:51 +02:00
2019-09-15 20:42:11 +02:00
def filename2number(s):
return int(str(s).replace('.tex', '').replace('lec_', ''))
2021-09-16 13:28:51 +02:00
class Lecture:
2019-09-15 20:42:11 +02:00
def __init__(self, file_path, course):
with file_path.open() as f:
for line in f:
2021-09-16 13:28:51 +02:00
lecture_match = re.search(r'lecture{(.*?)}{(.*?)}{(.*)}', line)
2019-09-15 20:42:11 +02:00
if lecture_match:
2021-09-16 13:28:51 +02:00
break
2019-09-15 20:42:11 +02:00
# number = int(lecture_match.group(1))
date_str = lecture_match.group(2)
date = datetime.strptime(date_str, DATE_FORMAT)
week = get_week(date)
title = lecture_match.group(3)
self.file_path = file_path
self.date = date
self.week = week
self.number = filename2number(file_path.stem)
self.title = title
self.course = course
def edit(self):
subprocess.Popen([
"x-terminal-emulator",
"-e", "zsh", "-i", "-c",
f"\\vim --servername kulak --remote-silent {str(self.file_path)}"
])
def __str__(self):
return f'<Lecture {self.course.info["short"]} {self.number} "{self.title}">'
class Lectures(list):
def __init__(self, course):
self.course = course
self.root = course.path
if 'master_file' in course.info:
self.master_file = self.root / course.info['master_file']
else:
self.master_file = self.root / DEFAULT_MASTER_FILE_NAME
2019-09-15 20:42:11 +02:00
list.__init__(self, self.read_files())
def read_files(self):
files = self.root.glob('lec_*.tex')
return sorted((Lecture(f, self.course) for f in files), key=lambda l: l.number)
def parse_lecture_spec(self, string):
if len(self) == 0:
return 0
if string.isdigit():
return int(string)
elif string == 'last':
return self[-1].number
elif string == 'prev':
return self[-1].number - 1
def parse_range_string(self, arg):
all_numbers = [lecture.number for lecture in self]
if 'all' in arg:
return all_numbers
if '-' in arg:
start, end = [self.parse_lecture_spec(bit) for bit in arg.split('-')]
return list(set(all_numbers) & set(range(start, end + 1)))
return [self.parse_lecture_spec(arg)]
@staticmethod
def get_header_footer(filepath):
part = 0
header = ''
footer = ''
with filepath.open() as f:
for line in f:
# order of if-statements is important here!
if 'end lectures' in line:
part = 2
if part == 0:
header += line
if part == 2:
footer += line
if 'start lectures' in line:
part = 1
2021-09-16 13:28:51 +02:00
return header, footer
2019-09-15 20:42:11 +02:00
def update_lectures_in_master(self, r):
header, footer = self.get_header_footer(self.master_file)
body = ''.join(
' ' * 4 + r'\input{' + number2filename(number) + '}\n' for number in r)
self.master_file.write_text(header + body + footer)
def new_lecture(self):
if len(self) != 0:
new_lecture_number = self[-1].number + 1
else:
new_lecture_number = 1
new_lecture_path = self.root / number2filename(new_lecture_number)
today = datetime.today()
date = today.strftime(DATE_FORMAT)
new_lecture_path.touch()
new_lecture_path.write_text(f'\\lecture{{{new_lecture_number}}}{{{date}}}{{}}\n')
if new_lecture_number == 1:
self.update_lectures_in_master([1])
else:
self.update_lectures_in_master([new_lecture_number - 1, new_lecture_number])
self.read_files()
2021-09-16 13:28:51 +02:00
lec = Lecture(new_lecture_path, self.course)
2019-09-15 20:42:11 +02:00
2021-09-16 13:28:51 +02:00
return lec
2019-09-15 20:42:11 +02:00
def compile_master(self):
2020-05-19 17:52:06 +02:00
result = subprocess.run(
['latexmk', '-f', '-interaction=nonstopmode', str(self.master_file)],
2019-09-15 20:42:11 +02:00
stdout=subprocess.DEVNULL,
2020-05-19 17:52:06 +02:00
stderr=subprocess.DEVNULL,
cwd=str(self.root)
2019-09-15 20:42:11 +02:00
)
2020-05-19 17:51:51 +02:00
return result.returncode