diff --git a/src/infrastructure/reporting/generators.py b/src/infrastructure/reporting/generators.py index faa9ad9..61a416f 100644 --- a/src/infrastructure/reporting/generators.py +++ b/src/infrastructure/reporting/generators.py @@ -26,6 +26,12 @@ from .templates import HTMLTemplates MAX_CONCURRENT_DOWNLOADS = 10 AVATAR_CACHE_EXPIRE_TIME = 259200 +_VIEWPORT_TAG_PATTERN = re.compile( + r']*>', re.IGNORECASE +) +_DESKTOP_VIEWPORT_TAG = ( + '' +) class ReportGenerator(IReportGenerator): @@ -409,6 +415,7 @@ class ReportGenerator(IReportGenerator): logger.error("HTML报告渲染失败:返回空内容") return None, None + html_content = self._force_desktop_viewport(html_content) logger.info(f"HTML 内容生成完成,长度: {len(html_content)} 字符") # 保存 HTML 文件 @@ -479,6 +486,24 @@ class ReportGenerator(IReportGenerator): encoded_relative_url = quote(relative_url, safe="/") return caption + f"\n{base_url.rstrip('/')}/{encoded_relative_url}" + @staticmethod + def _force_desktop_viewport(rendered_html: str) -> str: + """统一导出 HTML 的 viewport,避免移动端按窄屏重排。""" + if _VIEWPORT_TAG_PATTERN.search(rendered_html): + return _VIEWPORT_TAG_PATTERN.sub( + _DESKTOP_VIEWPORT_TAG, rendered_html, count=1 + ) + + head_close = rendered_html.lower().find("") + if head_close != -1: + return ( + rendered_html[:head_close] + + f" {_DESKTOP_VIEWPORT_TAG}\n" + + rendered_html[head_close:] + ) + + return f"{_DESKTOP_VIEWPORT_TAG}\n{rendered_html}" + def generate_text_report(self, analysis_result: dict) -> str: """生成文本格式的分析报告""" stats = analysis_result["statistics"]