create redacted pdf version

This commit is contained in:
Jörn-Michael Miehe 2025-05-11 20:06:35 +00:00
parent f7ae8705d0
commit f5e639f59c
2 changed files with 65 additions and 5 deletions

View file

@ -21,7 +21,7 @@ pdfFilesInt := $(call suffixSubst,$(mdFiles),md,pdf,$(suffixInt))
texFilesInt := $(call suffixSubst,$(mdFiles),md,tex,$(suffixInt))
.PHONY: all pdf pdfPub pdfInt tex texPub texInt
all: pdfPub
all: pdf
pdf: pdfPub pdfInt
pdfPub: $(pdfFilesPub)
@ -47,8 +47,14 @@ compile = pandoc \
--variable lang:de-DE \
--output $(2)
%.pdf: %.md lenaisten-defs.sty
$(call compile,$<,$@)
%$(suffixPub).pdf: %.md lenaisten-defs.sty
python3 ./redact.py $< | $(call compile,-,$@)
%.tex: %.md lenaisten-defs.sty
$(call compile,$<,$@)
%$(suffixPub).tex: %.md lenaisten-defs.sty
python3 ./redact.py $< | $(call compile,-,$@)
%$(suffixInt).pdf: %.md lenaisten-defs.sty
python3 ./redact.py -i $< | $(call compile,-,$@)
%$(suffixInt).tex: %.md lenaisten-defs.sty
python3 ./redact.py -i $< | $(call compile,-,$@)

54
redact.py Normal file
View file

@ -0,0 +1,54 @@
#!/usr/bin/env python3
# parse CLI arguments
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("file", help="File to open")
parser.add_argument("-i", "--internal", help="Output internal version", action="store_true")
args = parser.parse_args()
# read file
from pathlib import Path
txt = Path(args.file).read_text()
# redaction syntax
import re
inlinepat = re.compile(r"\(\(\((([^>]*?):::)?(.*?)\)\)\)", re.MULTILINE|re.DOTALL)
tokenpat = re.compile(r"\[redact(:::(.*?))?\](.*?)\[\/redact\]", re.MULTILINE|re.DOTALL)
# match handling
def subredact(match):
_, reason, content = match.groups()
if reason:
reason = reason.strip()
else:
reason = ""
if args.internal:
retval = content.lstrip(" ").rstrip()
# retval = re.sub(r"(\s*[+\-\*]\s+)?(.*)", r"\1*\2*", retval, re.MULTILINE)
retval = f"*{retval}*"
retval = re.sub(r"\n(\s*[+\-\*]\s+)?", r"*\n\1*", retval, re.MULTILINE)
else:
retval = reason + " [intern]"
# DEBUG output
# print("GROUPS", match.groups())
# print("REASON", reason.strip())
# print("CONTENT", content.strip())
# print("RET", retval)
# print("~~~~~~")
return retval
# matching
txt = tokenpat.sub(subredact, txt)
txt = inlinepat.sub(subredact, txt)
# pipe to stdout
print(txt)