From ff236e6f3f7e3b04927886694a7b28f3a0bb1017 Mon Sep 17 00:00:00 2001 From: cydia2001 Date: Tue, 10 Mar 2026 22:50:00 +0000 Subject: [PATCH] refactor: switch citation display to footnote style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use numbered superscript references [1] [2] inline with an ordered list bibliography at page bottom. Each entry has a back-link (↩) to the citation site. Co-Authored-By: Claude Opus 4.6 --- tools/prepare_mdbook_zh.py | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/tools/prepare_mdbook_zh.py b/tools/prepare_mdbook_zh.py index b0b5a86..27e0bba 100644 --- a/tools/prepare_mdbook_zh.py +++ b/tools/prepare_mdbook_zh.py @@ -279,19 +279,17 @@ def _format_cite_label(author: str, year: str) -> str: def _render_bibliography( cited_keys: list[str], bib_db: dict[str, dict[str, str]] ) -> list[str]: - """Render a bibliography section for the cited keys.""" - lines: list[str] = ["---", "", "## 参考文献", ""] - for key in cited_keys: + """Render a footnote-style bibliography section for the cited keys.""" + lines: list[str] = ["---", "", "## 参考文献", "", "
    "] + for idx, key in enumerate(cited_keys, 1): entry = bib_db.get(key) if not entry: - lines.append(f'

    [{key}] {key}.

    ') - lines.append("") + lines.append(f'
  1. {key}.
  2. ') continue author = clean_bibtex(entry.get("author", "")) title = clean_bibtex(entry.get("title", "")) year = entry.get("year", "") venue = clean_bibtex(entry.get("journal", "") or entry.get("booktitle", "")) - label = _format_cite_label(entry.get("author", ""), year) parts: list[str] = [] if author: parts.append(author) @@ -302,15 +300,15 @@ def _render_bibliography( if year: parts.append(year) text = ". ".join(parts) + "." if parts else f"{key}." - lines.append(f'

    [{label}] {text}

    ') - lines.append("") + lines.append(f'
  3. {text}
  4. ') + lines.append("
") return lines def process_citations( markdown: str, bib_db: dict[str, dict[str, str]] ) -> str: - """Replace :cite: references with linked citations and append bibliography.""" + """Replace :cite: references with footnote-style numbered citations.""" cited_keys: list[str] = [] def _replace_cite(match: re.Match[str]) -> str: @@ -320,17 +318,13 @@ def process_citations( cited_keys.append(key) if not bib_db: return "[" + ", ".join(keys) + "]" - parts: list[str] = [] + nums: list[str] = [] for key in keys: - entry = bib_db.get(key) - if entry: - label = _format_cite_label( - entry.get("author", ""), entry.get("year", "") - ) - parts.append(f'{label}') - else: - parts.append(key) - return "[" + "; ".join(parts) + "]" + idx = cited_keys.index(key) + 1 + nums.append( + f'[{idx}]' + ) + return "".join(nums) processed = CITE_RE.sub(_replace_cite, markdown) if cited_keys and bib_db: