-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcli.py
More file actions
73 lines (61 loc) · 2.67 KB
/
cli.py
File metadata and controls
73 lines (61 loc) · 2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from __future__ import annotations
import argparse
from vrain.utils import load_config, ensure_dir
from vrain.typesetter import Typesetter, GridCfg, PageCfg
from vrain.typography import Typography, TypoRules
from vrain.background import BackgroundCfg
from vrain.output import save_outputs
def parse_args():
ap = argparse.ArgumentParser(description="vRain Python (modular)")
ap.add_argument("--text", required=True, help="UTF-8 text file")
ap.add_argument("--config", required=True, help="JSON config file")
ap.add_argument("--out", required=True, help="output PDF path")
return ap.parse_args()
def main():
args = parse_args()
cfg = load_config(args.config)
# Page/grid/typo configs
page_cfg = PageCfg(
width=cfg["page"]["width"],
height=cfg["page"]["height"],
dpi=cfg["page"].get("dpi", 300),
background=BackgroundCfg(
mode=cfg["background"].get("mode", "paper"),
bg_color=cfg["background"].get("bg_color", "#f7f3e8"),
texture_image=cfg["background"].get("texture_image"),
frame=cfg["background"].get("frame", True),
frame_color=cfg["background"].get("frame_color", "#4a3f2f"),
frame_width=cfg["background"].get("frame_width", 6),
margin_top=cfg["grid"]["margin_top"],
margin_bottom=cfg["grid"]["margin_bottom"],
margin_left=cfg["grid"]["margin_left"],
margin_right=cfg["grid"]["margin_right"],
fish_tail_text=cfg["background"].get("fish_tail_text"),
fish_tail_color=cfg["background"].get("fish_tail_color", "#4a3f2f"),
)
)
grid_cfg = GridCfg(**cfg["grid"])
typo = Typography(
primary_font=cfg["font"]["primary"],
fallback_font=cfg["font"].get("fallback"),
size=cfg["font"].get("size", 64),
color=cfg["font"].get("fill", "#222222"),
rotate_quotes=cfg["font"].get("rotate_quotes", True)
)
typo.load()
rules = TypoRules(
filter_punct=cfg.get("rules", {}).get("filter_punct", False),
normalize_to_period=cfg.get("rules", {}).get("normalize_to_period", False),
nonspacing_punct=cfg.get("rules", {}).get("nonspacing_punct", True),
)
with open(args.text, "r", encoding="utf-8") as f:
raw = f.read()
engine = Typesetter(page_cfg, grid_cfg, typo, rules)
result = engine.layout(raw)
out_png_dir = cfg.get("output", {}).get("png_dir")
if cfg.get("output", {}).get("page_png", False):
ensure_dir(out_png_dir or "./pages")
save_outputs(result.pages, args.out, png_dir=out_png_dir)
print(f"Generated {len(result.pages)} page(s) → {args.out}")
if __name__ == "__main__":
main()