diff --git a/ReportEngine/renderers/html_renderer.py b/ReportEngine/renderers/html_renderer.py
index 89a9c3f..a3d3199 100644
--- a/ReportEngine/renderers/html_renderer.py
+++ b/ReportEngine/renderers/html_renderer.py
@@ -59,6 +59,8 @@ class HTMLRenderer:
self.heading_label_map: Dict[str, Dict[str, Any]] = {}
self.primary_heading_index = 0
self.secondary_heading_index = 0
+ self.toc_rendered = False
+ self.hero_kpi_signature: tuple | None = None
# ====== 公共入口 ======
@@ -78,6 +80,7 @@ class HTMLRenderer:
self.heading_counter = 0
self.metadata = self.document.get("metadata", {}) or {}
raw_chapters = self.document.get("chapters", []) or []
+ self.toc_rendered = False
self.chapters = self._prepare_chapters(raw_chapters)
self.chapter_anchor_map = {
chapter.get("chapterId"): chapter.get("anchor")
@@ -90,6 +93,8 @@ class HTMLRenderer:
metadata = self.metadata
theme_tokens = metadata.get("themeTokens") or self.document.get("themeTokens", {})
title = metadata.get("title") or metadata.get("query") or "智能舆情报告"
+ hero_kpis = (metadata.get("hero") or {}).get("kpis")
+ self.hero_kpi_signature = self._kpi_signature_from_items(hero_kpis)
head = self._render_head(title, theme_tokens)
body = self._render_body()
@@ -320,12 +325,15 @@ class HTMLRenderer:
"""
if not self.toc_entries:
return ""
+ if self.toc_rendered:
+ return ""
toc_config = self.metadata.get("toc") or {}
toc_title = toc_config.get("title") or "📚 目录"
toc_items = "".join(
self._format_toc_entry(entry)
for entry in self.toc_entries
)
+ self.toc_rendered = True
return f"""