Added Full lecture build script
This commit is contained in:
parent
1f45a281e9
commit
45229d0575
Binary file not shown.
BIN
lecture/Lecture.pdf
Normal file
BIN
lecture/Lecture.pdf
Normal file
Binary file not shown.
74
lecture/build_lecture.py
Normal file
74
lecture/build_lecture.py
Normal file
@ -0,0 +1,74 @@
|
||||
from functools import wraps
|
||||
from pathlib import Path
|
||||
from re import compile
|
||||
from subprocess import run
|
||||
from typing import Callable, Dict, Iterable, List, Mapping, ParamSpec, Tuple, TypeVar
|
||||
|
||||
|
||||
WORKDIR = Path.cwd()
|
||||
PROJECT_DIR = Path(__file__).resolve().absolute().parent.relative_to(WORKDIR)
|
||||
OUTPUT_FILE = PROJECT_DIR / "Lecture.pdf"
|
||||
idRegex = compile(r"^(\d+)\..+$")
|
||||
|
||||
def get_id(file: Path):
|
||||
matches = idRegex.search(file.name)
|
||||
if matches is None:
|
||||
print(f"WARNING: File '{file.name}' hasn't got an id in the filename!")
|
||||
return None
|
||||
return int(matches.group(1))
|
||||
|
||||
def not_output_file(file: Path):
|
||||
global OUTPUT_FILE
|
||||
return file != OUTPUT_FILE
|
||||
|
||||
T = TypeVar("T")
|
||||
Params = ParamSpec("Params")
|
||||
|
||||
def get_sequential(f: Callable[Params, Mapping[int, T]]) -> Callable[Params, List[T]]:
|
||||
@wraps(f)
|
||||
def wrapper(*args: Params.args, **kwargs: Params.kwargs):
|
||||
items = f(*args, **kwargs)
|
||||
def get_or_raise(i: int):
|
||||
item = items.get(i)
|
||||
if item is None:
|
||||
raise Exception(f"Expected Item with index {i}, but it was not found!")
|
||||
return item
|
||||
return list(map(get_or_raise, range(len(items))))
|
||||
return wrapper
|
||||
|
||||
def only_unique_ids(f: Callable[Params, Iterable[Tuple[int, T]]]) -> Callable[Params, Dict[int, T]]:
|
||||
@wraps(f)
|
||||
def wrapper(*args: Params.args, **kwargs: Params.kwargs):
|
||||
items: Dict[int, T] = dict()
|
||||
for uid, pdf in f(*args, **kwargs):
|
||||
existing = items.get(uid)
|
||||
if existing is not None:
|
||||
raise ValueError(f"Got item '{pdf}' with id {uid}, but '{existing}' already has that id!")
|
||||
items[uid] = pdf
|
||||
return items
|
||||
return wrapper
|
||||
|
||||
@get_sequential
|
||||
@only_unique_ids
|
||||
def get_files(path: Path):
|
||||
global OUTPUT_FILE
|
||||
files = path.rglob("*.pdf")
|
||||
for file in files:
|
||||
if file == OUTPUT_FILE: continue
|
||||
number = get_id(file)
|
||||
if number is None: continue
|
||||
yield number, file
|
||||
|
||||
def main():
|
||||
pdfs = get_files(PROJECT_DIR)
|
||||
for pdf in pdfs:
|
||||
print(f"Adding file {pdf.name}")
|
||||
cmd = ["pdftk"]
|
||||
cmd.extend(map(str, pdfs))
|
||||
cmd.append("cat")
|
||||
cmd.append("output")
|
||||
cmd.append(str(OUTPUT_FILE))
|
||||
run(cmd)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user