v0.20 alpha skill-driven python core
This commit is contained in:
+7
-56
@@ -41,6 +41,8 @@ from pathlib import Path
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
||||
|
||||
from scripts.lib.zenmux_client import load_secrets # noqa: F401 (为一致性)
|
||||
from scripts.reporting.fonts import resolve_quarto_fonts
|
||||
from scripts.reporting.references import build_references_block
|
||||
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parent.parent
|
||||
@@ -172,9 +174,10 @@ def prepare_qmd(
|
||||
subtitle = manifest.get("report_subtitle", "")
|
||||
date = manifest.get("date", "")
|
||||
|
||||
# 决定字体名称:思源宋体 CN 作正文,思源黑体 CN 作标题
|
||||
main_font = "Source Han Serif CN"
|
||||
sans_font = "Source Han Sans CN"
|
||||
# 决定字体名称:Quarto/xelatex 使用系统字体 family name。
|
||||
fonts = resolve_quarto_fonts(fonts_dir)
|
||||
main_font = fonts.main_font
|
||||
sans_font = fonts.sans_font
|
||||
|
||||
# Write LaTeX header file for CJK font setup.
|
||||
# Using a separate .tex file avoids YAML escape issues with backslashes.
|
||||
@@ -248,7 +251,7 @@ def prepare_qmd(
|
||||
)
|
||||
|
||||
# Replace REFERENCES placeholder with actual references from sources.jsonl
|
||||
ref_block = _build_references_block(sources_path, md_text)
|
||||
ref_block = build_references_block(sources_path, md_text)
|
||||
md_text = re.sub(
|
||||
r"\[REFERENCES will be filled.*?\]",
|
||||
ref_block,
|
||||
@@ -286,58 +289,6 @@ def prepare_qmd(
|
||||
output_qmd.write_text(front_matter + md_text, encoding="utf-8")
|
||||
print(f" .qmd prepared: {output_qmd.name} ({len(wide_ranges)} landscape table(s))")
|
||||
|
||||
|
||||
def _build_references_block(sources_path: Path | None, md_text: str) -> str:
|
||||
"""从 sources.jsonl 生成参考文献列表,只包含在正文中实际引用的信源。"""
|
||||
if not sources_path or not sources_path.exists():
|
||||
return "(参考文献列表:sources.jsonl 未找到)"
|
||||
|
||||
# Find cited src_ids
|
||||
cited = set(re.findall(r"\[src_([a-z0-9_]+)\]", md_text))
|
||||
if not cited:
|
||||
return ""
|
||||
|
||||
sources: dict[str, dict] = {}
|
||||
with open(sources_path, encoding="utf-8") as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
try:
|
||||
obj = json.loads(line)
|
||||
sid = obj.get("id", "")
|
||||
key = sid.replace("src_", "")
|
||||
if key in cited:
|
||||
sources[sid] = obj
|
||||
except json.JSONDecodeError:
|
||||
pass
|
||||
|
||||
if not sources:
|
||||
return ""
|
||||
|
||||
lines = ["## 参考文献\n"]
|
||||
for sid in sorted(sources.keys()):
|
||||
s = sources[sid]
|
||||
authors = ", ".join(s.get("authors", [])) if s.get("authors") else ""
|
||||
year = s.get("year", "")
|
||||
title = s.get("title", sid)
|
||||
venue = s.get("venue", "")
|
||||
url = s.get("url", "")
|
||||
entry = f"- **[{sid}]** "
|
||||
if authors:
|
||||
entry += f"{authors}. "
|
||||
if year:
|
||||
entry += f"({year}). "
|
||||
entry += f"*{title}*"
|
||||
if venue:
|
||||
entry += f". {venue}"
|
||||
if url:
|
||||
entry += f". <{url}>"
|
||||
lines.append(entry)
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def build_pdf_quarto(
|
||||
md_path: Path,
|
||||
manifest: dict,
|
||||
|
||||
Reference in New Issue
Block a user