45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""页码 CSS 生成"""
|
|
from typing import Any, Dict
|
|
|
|
|
|
def _resolve_page_number_config(config: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""从模板 JSON 解析页码配置"""
|
|
show = config.get("showPageNumber")
|
|
if show is None:
|
|
show = config.get("show_page_number", True)
|
|
return {
|
|
"show": bool(show),
|
|
"position": config.get("pageNumberPosition", "footer"),
|
|
"align": config.get("pageNumberAlign", "center"),
|
|
"format": config.get("pageNumberFormat", "chinese"),
|
|
"font_size": config.get("pageNumberFontSize", 10),
|
|
"color": config.get("pageNumberColor", "#666666"),
|
|
}
|
|
|
|
|
|
def build_page_number_css(config: Dict[str, Any]) -> str:
|
|
"""生成 WeasyPrint @page 页码 margin 规则"""
|
|
cfg = _resolve_page_number_config(config)
|
|
if not cfg["show"]:
|
|
return ""
|
|
|
|
edge = "top" if cfg["position"] == "header" else "bottom"
|
|
margin_box = f"{edge}-{cfg['align']}"
|
|
|
|
fmt = cfg["format"]
|
|
if fmt == "fraction":
|
|
content = 'counter(page) " / " counter(pages)'
|
|
elif fmt == "english":
|
|
content = '"Page " counter(page) " of " counter(pages)'
|
|
else:
|
|
content = '"第 " counter(page) " 页 / 共 " counter(pages) " 页"'
|
|
|
|
return f"""
|
|
@{margin_box} {{
|
|
content: {content};
|
|
font-size: {float(cfg['font_size'])}pt;
|
|
color: {cfg['color']};
|
|
}}"""
|