Skip to content

Commit 50ad307

Browse files
committed
Extract developer guide cover prep into script
1 parent bf76cd1 commit 50ad307

File tree

2 files changed

+78
-38
lines changed

2 files changed

+78
-38
lines changed

.github/workflows/developer-guide-docs.yml

Lines changed: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -62,44 +62,11 @@ jobs:
6262
GENERATED_PNG="docs/developer-guide/book-cover.generated.png"
6363
cp "$SOURCE" "$GENERATED_SVG"
6464
export GENERATED_SVG
65-
python3 - <<'PY'
66-
import os
67-
import pathlib
68-
import re
69-
70-
target = pathlib.Path(os.environ['GENERATED_SVG'])
71-
text = target.read_text(encoding='utf-8')
72-
73-
rev = os.environ.get('REV_NUMBER', 'UNKNOWN')
74-
date = os.environ.get('REV_HUMAN_DATE') or os.environ.get('REV_DATE', '')
75-
replacement = f"Version {rev}" + (f" - {date}" if date else '')
76-
77-
new_text, count = re.subn(r'Version\s+[^<]+', replacement.strip(), text, count=1)
78-
if count != 1:
79-
raise RuntimeError('Could not find version text placeholder in cover artwork')
80-
81-
variables = {
82-
name: value.strip()
83-
for name, value in re.findall(r'--([\w-]+):\s*([^;]+);', new_text)
84-
}
85-
86-
var_counter = {'count': 0}
87-
88-
def replace_var(match):
89-
name = match.group(1)
90-
value = variables.get(name)
91-
if value is None:
92-
return match.group(0)
93-
var_counter['count'] += 1
94-
return value
95-
96-
new_text = re.sub(r'var\(--([\w-]+)\)', replace_var, new_text)
97-
98-
target.write_text(new_text, encoding='utf-8')
99-
100-
print(f"Injected cover legend: {replacement.strip()}")
101-
print(f"Resolved {var_counter['count']} CSS variable references for rasterization")
102-
PY
65+
python3 scripts/developer-guide/prepare_cover_artwork.py \
66+
"$GENERATED_SVG" \
67+
--rev-number "$REV_NUMBER" \
68+
--rev-human-date "$REV_HUMAN_DATE" \
69+
--rev-date "$REV_DATE"
10370
echo "Rasterizing cover artwork to ${GENERATED_PNG}" >&2
10471
rsvg-convert -w 2551 -h 3579 "$GENERATED_SVG" -o "$GENERATED_PNG"
10572
ls -l "$GENERATED_PNG"
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#!/usr/bin/env python3
2+
"""Prepare developer guide cover artwork for rasterization."""
3+
4+
from __future__ import annotations
5+
6+
import argparse
7+
import pathlib
8+
import re
9+
import sys
10+
11+
12+
VERSION_PATTERN = re.compile(r"Version\s+[^<]+")
13+
CSS_VARIABLE_DECL_PATTERN = re.compile(r"--([\w-]+):\s*([^;]+);")
14+
CSS_VARIABLE_REF_PATTERN = re.compile(r"var\(--([\w-]+)\)")
15+
16+
17+
def parse_args(argv: list[str]) -> argparse.Namespace:
18+
parser = argparse.ArgumentParser(description=__doc__)
19+
parser.add_argument("svg_path", help="Path to the SVG file to update")
20+
parser.add_argument("--rev-number", required=True, help="Revision number to embed")
21+
parser.add_argument("--rev-human-date", default="", help="Human readable revision date")
22+
parser.add_argument("--rev-date", default="", help="Fallback machine readable revision date")
23+
return parser.parse_args(argv)
24+
25+
26+
def inject_version_label(svg_text: str, version_label: str) -> str:
27+
updated_text, count = VERSION_PATTERN.subn(version_label, svg_text, count=1)
28+
if count != 1:
29+
raise RuntimeError("Could not find version text placeholder in cover artwork")
30+
return updated_text
31+
32+
33+
def resolve_css_variables(svg_text: str) -> tuple[str, int]:
34+
variables = {name: value.strip() for name, value in CSS_VARIABLE_DECL_PATTERN.findall(svg_text)}
35+
replacement_count = 0
36+
37+
def replace(match: re.Match[str]) -> str:
38+
nonlocal replacement_count
39+
name = match.group(1)
40+
value = variables.get(name)
41+
if value is None:
42+
return match.group(0)
43+
replacement_count += 1
44+
return value
45+
46+
resolved_text = CSS_VARIABLE_REF_PATTERN.sub(replace, svg_text)
47+
return resolved_text, replacement_count
48+
49+
50+
def main(argv: list[str]) -> int:
51+
args = parse_args(argv)
52+
53+
svg_path = pathlib.Path(args.svg_path)
54+
svg_text = svg_path.read_text(encoding="utf-8")
55+
56+
revision_date = args.rev_human_date or args.rev_date
57+
version_label = f"Version {args.rev_number}".strip()
58+
if revision_date:
59+
version_label = f"{version_label} - {revision_date.strip()}"
60+
61+
svg_text = inject_version_label(svg_text, version_label)
62+
svg_text, replacement_count = resolve_css_variables(svg_text)
63+
64+
svg_path.write_text(svg_text, encoding="utf-8")
65+
66+
print(f"Injected cover legend: {version_label}")
67+
print(f"Resolved {replacement_count} CSS variable references for rasterization")
68+
69+
return 0
70+
71+
72+
if __name__ == "__main__":
73+
sys.exit(main(sys.argv[1:]))

0 commit comments

Comments
 (0)