#!/usr/bin/env python3
import re
import subprocess
from pathlib import Path
MC_SOURCE_ROOT = Path(__file__).parent.parent
if not (MC_SOURCE_ROOT / "doc/man/mc.1.in").exists():
raise FileNotFoundError("cannot read doc/man/mc.1.in")
warnings = []
for manpage in (MC_SOURCE_ROOT / "doc").glob("**/*.1.*"):
print(manpage)
for renderer in ("groff", "nroff"):
warnings.extend(
subprocess.check_output(
f"{renderer} -K UTF-8 -Tutf8 -mandoc -ww '{manpage}' | grep 'warning:' || true",
shell=True,
stderr=subprocess.STDOUT,
).splitlines()
)
content = "\n".join(manpage.read_text().splitlines()[1:]) # skip first line
# https://mandoc.bsd.lv/mdoc/intro/escaping.html
for pattern in ("\\\\", "\\.", "\\!"):
if pattern in content:
warnings.append(f"{manpage}: forbidden pattern '{pattern}'")
if re.findall(r"\b-\b", content):
warnings.append(f"{manpage}: unescaped dash ('-')")
if re.findall(r'[^.]\\"', content):
warnings.append(f"{manpage}: escaped quote ('\"')")
# Check that English manuals are in ASCII
for manpage in (MC_SOURCE_ROOT / "doc/man").glob("*.1.in"):
print(manpage)
warnings.extend(
subprocess.check_output(
f"groff -Tascii -winput '{manpage}' | grep 'warning:' || true",
shell=True,
stderr=subprocess.STDOUT,
).splitlines()
)
if set(warnings):
raise AssertionError(f"roff warnings: {set(warnings)}")