Offline JS Library

This commit is contained in:
马一丁
2025-11-17 14:46:52 +08:00
parent dd963d6689
commit 26c133c998
7 changed files with 546 additions and 5 deletions

View File

@@ -8,6 +8,8 @@ import ast
import copy
import html
import json
import os
from pathlib import Path
from typing import Any, Dict, List
@@ -61,6 +63,38 @@ class HTMLRenderer:
self.secondary_heading_index = 0
self.toc_rendered = False
self.hero_kpi_signature: tuple | None = None
self._lib_cache: Dict[str, str] = {}
@staticmethod
def _get_lib_path() -> Path:
"""获取第三方库文件的目录路径"""
return Path(__file__).parent / "libs"
def _load_lib(self, filename: str) -> str:
"""
加载指定的第三方库文件内容
参数:
filename: 库文件名
返回:
str: 库文件的JavaScript代码内容
"""
if filename in self._lib_cache:
return self._lib_cache[filename]
lib_path = self._get_lib_path() / filename
try:
with open(lib_path, 'r', encoding='utf-8') as f:
content = f.read()
self._lib_cache[filename] = content
return content
except FileNotFoundError:
print(f"警告: 库文件 {filename} 未找到将使用CDN备用链接")
return ""
except Exception as e:
print(f"警告: 读取库文件 {filename} 时出错: {e}")
return ""
# ====== 公共入口 ======
@@ -147,16 +181,31 @@ class HTMLRenderer:
str: head片段HTML。
"""
css = self._build_css(theme_tokens)
# 加载第三方库
chartjs = self._load_lib("chart.js")
chartjs_sankey = self._load_lib("chartjs-chart-sankey.js")
html2canvas = self._load_lib("html2canvas.min.js")
jspdf = self._load_lib("jspdf.umd.min.js")
mathjax = self._load_lib("mathjax.js")
# 如果库文件加载失败使用CDN备用链接
chartjs_tag = f"<script>{chartjs}</script>" if chartjs else '<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>'
sankey_tag = f"<script>{chartjs_sankey}</script>" if chartjs_sankey else '<script src="https://cdn.jsdelivr.net/npm/chartjs-chart-sankey@4"></script>'
html2canvas_tag = f"<script>{html2canvas}</script>" if html2canvas else '<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>'
jspdf_tag = f"<script>{jspdf}</script>" if jspdf else '<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>'
mathjax_tag = f"<script defer>{mathjax}</script>" if mathjax else '<script defer src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>'
return f"""
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{self._escape_html(title)}</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-chart-sankey@4"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
{chartjs_tag}
{sankey_tag}
{html2canvas_tag}
{jspdf_tag}
<script>
window.MathJax = {{
tex: {{
@@ -169,7 +218,7 @@ class HTMLRenderer:
}}
}};
</script>
<script defer src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
{mathjax_tag}
<style>
{css}
</style>

View File

@@ -0,0 +1,52 @@
# 第三方JavaScript库
本目录包含HTML报告渲染所需的第三方JavaScript库。这些库已经被内联到生成的HTML文件中以便在离线环境中使用。
## 包含的库
1. **chart.js** (204KB) - 用于图表渲染
- 版本: 4.5.1
- 来源: https://cdn.jsdelivr.net/npm/chart.js
2. **chartjs-chart-sankey.js** (10KB) - Sankey图表插件
- 版本: 0.12.0
- 来源: https://unpkg.com/chartjs-chart-sankey@0.12.0/dist/chartjs-chart-sankey.min.js
3. **html2canvas.min.js** (194KB) - HTML转Canvas工具
- 版本: 1.4.1
- 来源: https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js
4. **jspdf.umd.min.js** (356KB) - PDF导出库
- 版本: 2.5.1
- 来源: https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js
5. **mathjax.js** (1.1MB) - 数学公式渲染引擎
- 版本: 3.2.2
- 来源: https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-mml-chtml.js
## 功能说明
HTML渲染器(`html_renderer.py`)会自动从本目录加载这些库文件并将它们内联到生成的HTML中。这样做有以下优点
- ✅ 离线环境可用 - 无需网络连接即可正常显示报告
- ✅ 加载速度快 - 不依赖外部CDN
- ✅ 稳定性高 - 不受CDN服务中断影响
- ✅ 版本固定 - 确保功能的一致性
## 备用机制
如果库文件加载失败如文件不存在或读取错误渲染器会自动回退到使用CDN链接确保在任何情况下都能正常工作。
## 更新库文件
如需更新库文件,请:
1. 从相应的CDN下载最新版本
2. 替换本目录中的对应文件
3. 更新本README文件中的版本信息
## 注意事项
- 总大小约为1.86MB会增加生成的HTML文件大小
- 对于不需要图表和数学公式的简单报告,这些库仍然会被包含
- 如果需要减小文件大小,可以考虑使用更轻量的替代方案

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long