Offline JS Library
This commit is contained in:
@@ -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>
|
||||
|
||||
52
ReportEngine/renderers/libs/README.md
Normal file
52
ReportEngine/renderers/libs/README.md
Normal 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文件大小
|
||||
- 对于不需要图表和数学公式的简单报告,这些库仍然会被包含
|
||||
- 如果需要减小文件大小,可以考虑使用更轻量的替代方案
|
||||
14
ReportEngine/renderers/libs/chart.js
Normal file
14
ReportEngine/renderers/libs/chart.js
Normal file
File diff suppressed because one or more lines are too long
7
ReportEngine/renderers/libs/chartjs-chart-sankey.js
Normal file
7
ReportEngine/renderers/libs/chartjs-chart-sankey.js
Normal file
File diff suppressed because one or more lines are too long
20
ReportEngine/renderers/libs/html2canvas.min.js
vendored
Normal file
20
ReportEngine/renderers/libs/html2canvas.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
398
ReportEngine/renderers/libs/jspdf.umd.min.js
vendored
Normal file
398
ReportEngine/renderers/libs/jspdf.umd.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
ReportEngine/renderers/libs/mathjax.js
Normal file
1
ReportEngine/renderers/libs/mathjax.js
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user