diff --git a/docutranslate/exporter/md/md2html_exporter.py b/docutranslate/exporter/md/md2html_exporter.py index ad5f129..503d11b 100644 --- a/docutranslate/exporter/md/md2html_exporter.py +++ b/docutranslate/exporter/md/md2html_exporter.py @@ -23,16 +23,69 @@ class MD2HTMLExporter(MDExporter): def export(self, document: MarkdownDocument) -> Document: cdn = self.cdn - # language=html - pico = f'' if not cdn else r'' html_template = resource_path("template/markdown.html").read_text(encoding="utf-8") - katex_css = f'' if not cdn else r"""""" - katex_js = f'' if not cdn else r"""""" - auto_render = f'' if not cdn else r"""""" - # 这是正确且推荐的 JS 配置,它与 pymdownx.arithmatex 配合工作 - # 它只寻找 arithmatex 生成的 \(...\) 和 \[...\] - # language=javascript + # CDN 基础 URL + cdn_base = "https://s4.zstatic.net/ajax/libs" + + def fetch_text(url_or_path: str) -> str: + """从 URL 或本地文件获取文本内容""" + try: + if url_or_path.startswith("http"): + import httpx + response = httpx.get(url_or_path, timeout=10.0) + response.raise_for_status() + return response.text + else: + return resource_path(url_or_path).read_text(encoding="utf-8") + except Exception as e: + print(f"Warning: Failed to fetch {url_or_path}: {e}") + return "" + + # 辅助函数:将 CSS 中的字体 URL 替换为 CDN 链接 + def replace_font_urls(css_content: str) -> str: + """将 CSS 中的 url(fonts/xxx) 替换为 CDN URL""" + def replace(match): + url_path = match.group(1) + if 'fonts/' in url_path: + font_filename = url_path.split('/')[-1] + return f'url({cdn_base}/KaTeX/0.16.9/fonts/{font_filename})' + return match.group(0) + return re.sub(r'url\(([^)]*fonts/[^)]*)\)', replace, css_content) + + # 辅助函数:包装为 style/script 标签 + def tag(content: str, tag_type: str) -> str: + if tag_type == "style": + return f"" + return f"" + + # Pico CSS + pico_url = f"{cdn_base}/picocss/2.1.1/pico.min.css" + pico = tag(fetch_text(pico_url), "style") + + # KaTeX CSS (字体使用 CDN) + katex_css_url = f"{cdn_base}/KaTeX/0.16.9/katex.min.css" + katex_css_content = fetch_text(katex_css_url) + katex_css_content = replace_font_urls(katex_css_content) + katex_css = tag(katex_css_content, "style") + + # KaTeX JS + katex_js_url = f"{cdn_base}/KaTeX/0.16.9/katex.min.js" + katex_js = tag(fetch_text(katex_js_url), "script") + + # copy-tex CSS + copy_tex_css_url = f"{cdn_base}/KaTeX/0.16.9/contrib/copy-tex.min.css" + copy_tex_css = tag(fetch_text(copy_tex_css_url), "style") + + # copy-tex JS + copy_tex_js_url = f"{cdn_base}/KaTeX/0.16.9/contrib/copy-tex.min.js" + copy_tex_js = tag(fetch_text(copy_tex_js_url), "script") + + # auto-render JS + auto_render_url = f"{cdn_base}/KaTeX/0.16.9/contrib/auto-render.min.js" + auto_render = tag(fetch_text(auto_render_url), "script") + + # renderMathInElement 配置 render_math_in_element = r""" """ - mermaid = f'' + # mermaid JS + mermaid_url = f"{cdn_base}/mermaid/10.6.1/mermaid.min.js" + mermaid = tag(fetch_text(mermaid_url), "script") - # 扩展配置保持不变,我们仍然使用 arithmatex + # 扩展配置 extensions = [ 'markdown.extensions.tables', 'pymdownx.arithmatex', @@ -97,6 +152,8 @@ class MD2HTMLExporter(MDExporter): pico=pico, katexCss=katex_css, katexJs=katex_js, + copyTexCss=copy_tex_css, + copyTexJs=copy_tex_js, autoRender=auto_render, markdown=html_content, renderMathInElement=render_math_in_element, @@ -106,11 +163,8 @@ class MD2HTMLExporter(MDExporter): if __name__ == '__main__': from pathlib import Path - - # d = Document.from_path(r"C:\Users\jxgm\Desktop\mcp文件夹\学习笔记\互联网认证授权机制\互联网认证授权机制.md") - # d = Document.from_path(r"C:\Users\jxgm\Desktop\matrixcalc_translated.md") d = Document.from_path(r"C:\Users\jxgm\Desktop\full_translated.md") exporter = MD2HTMLExporter() d1 = exporter.export(d) path = Path(r"C:\Users\jxgm\Desktop\a.html") - path.write_bytes(d1.content) \ No newline at end of file + path.write_bytes(d1.content) diff --git a/docutranslate/template/markdown.html b/docutranslate/template/markdown.html index 84a1cb3..07092b3 100644 --- a/docutranslate/template/markdown.html +++ b/docutranslate/template/markdown.html @@ -5,9 +5,9 @@ {{title}} {{pico}} {{katexCss}} - + {{copyTexCss}} {{katexJs}} - + {{copyTexJs}} {{autoRender}}