改用katex进行渲染,支持离线渲染

This commit is contained in:
xunbu
2025-05-26 22:08:14 +08:00
parent 40a4cb0b62
commit 3390a1f967
10 changed files with 9169 additions and 522 deletions

211
.idea/workspace.xml generated
View File

@@ -5,9 +5,16 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="6b18b44a-df57-4212-a857-9e291ebe5dd2" name="更改" comment=""> <list default="true" id="6b18b44a-df57-4212-a857-9e291ebe5dd2" name="更改" comment="">
<change afterPath="$PROJECT_DIR$/docutranslate/static/autoRender.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/docutranslate/static/katex.css" afterDir="false" />
<change afterPath="$PROJECT_DIR$/docutranslate/static/katex.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docutranslate/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/__init__.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/docutranslate/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docutranslate/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/app.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docutranslate/static/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/static/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docutranslate/template/markdown.html" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/template/markdown.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docutranslate/translater.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/translater.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/docutranslate/translater.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/translater.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/requirements.txt" beforeDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -17,10 +24,10 @@
<component name="FileTemplateManagerImpl"> <component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES"> <option name="RECENT_TEMPLATES">
<list> <list>
<option value="CSS File" />
<option value="JavaScript File" />
<option value="Python Script" /> <option value="Python Script" />
<option value="HTML File" /> <option value="HTML File" />
<option value="CSS File" />
<option value="JavaScript File" />
</list> </list>
</option> </option>
</component> </component>
@@ -38,62 +45,63 @@
<option name="hideEmptyMiddlePackages" value="true" /> <option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" /> <option name="showLibraryContents" value="true" />
</component> </component>
<component name="PropertiesComponent">{ <component name="PropertiesComponent"><![CDATA[{
&quot;keyToString&quot;: { "keyToString": {
&quot;DefaultHtmlFileTemplate&quot;: &quot;HTML File&quot;, "DefaultHtmlFileTemplate": "HTML File",
&quot;JavaScript 调试.output.html (1).executor&quot;: &quot;Run&quot;, "JavaScript 调试.output.html (1).executor": "Run",
&quot;JavaScript 调试.output.html.executor&quot;: &quot;Run&quot;, "JavaScript 调试.output.html.executor": "Run",
&quot;JavaScript 调试.regex.md_中文.html.executor&quot;: &quot;Run&quot;, "JavaScript 调试.regex.md_中文.html.executor": "Run",
&quot;JavaScript 调试.regex_中文.html.executor&quot;: &quot;Run&quot;, "JavaScript 调试.regex_中文.html.executor": "Run",
&quot;JavaScript 调试.test.html.executor&quot;: &quot;Run&quot;, "JavaScript 调试.test.html.executor": "Run",
&quot;JavaScript 调试.test2.html.executor&quot;: &quot;Run&quot;, "JavaScript 调试.test2.html.executor": "Run",
&quot;JavaScript 调试.test2_英文.html.executor&quot;: &quot;Run&quot;, "JavaScript 调试.test2_英文.html.executor": "Run",
&quot;JavaScript 调试.test4-1_中文.html.executor&quot;: &quot;Run&quot;, "JavaScript 调试.test4-1_中文.html.executor": "Run",
&quot;JavaScript 调试.互联网认证授权机制.html.executor&quot;: &quot;Run&quot;, "JavaScript 调试.互联网认证授权机制.html.executor": "Run",
&quot;JavaScript 调试.互联网认证授权机制_英文.html.executor&quot;: &quot;Run&quot;, "JavaScript 调试.互联网认证授权机制_英文.html.executor": "Run",
&quot;JavaScript 调试.毕业论文_英文.html.executor&quot;: &quot;Run&quot;, "JavaScript 调试.毕业论文_英文.html.executor": "Run",
&quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;, "ModuleVcsDetector.initialDetectionPerformed": "true",
&quot;Python 测试.Python 测试 (markdown_mask.py 内).executor&quot;: &quot;Run&quot;, "Python 测试.Python 测试 (markdown_mask.py 内).executor": "Run",
&quot;Python 测试.markdown_mask.Test.test_basic_link_masking 的 Python 测试.executor&quot;: &quot;Run&quot;, "Python 测试.markdown_mask.Test.test_basic_link_masking 的 Python 测试.executor": "Run",
&quot;Python 测试.pytest (test_html.py 内).executor&quot;: &quot;Run&quot;, "Python 测试.pytest (test_html.py 内).executor": "Run",
&quot;Python.1test.executor&quot;: &quot;Run&quot;, "Python.1test.executor": "Run",
&quot;Python.2test2 (1).executor&quot;: &quot;Run&quot;, "Python.2test2 (1).executor": "Run",
&quot;Python.PDFtranslater (1).executor&quot;: &quot;Run&quot;, "Python.3testhtml.executor": "Run",
&quot;Python.PDFtranslater (2).executor&quot;: &quot;Run&quot;, "Python.PDFtranslater (1).executor": "Run",
&quot;Python.agent.executor&quot;: &quot;Debug&quot;, "Python.PDFtranslater (2).executor": "Run",
&quot;Python.agent_utils.executor&quot;: &quot;Run&quot;, "Python.agent.executor": "Debug",
&quot;Python.app (1).executor&quot;: &quot;Run&quot;, "Python.agent_utils.executor": "Run",
&quot;Python.app.executor&quot;: &quot;Run&quot;, "Python.app (1).executor": "Run",
&quot;Python.app2.executor&quot;: &quot;Run&quot;, "Python.app.executor": "Run",
&quot;Python.app_test (1).executor&quot;: &quot;Run&quot;, "Python.app2.executor": "Run",
&quot;Python.convert.executor&quot;: &quot;Run&quot;, "Python.app_test (1).executor": "Run",
&quot;Python.converter_docling.executor&quot;: &quot;Run&quot;, "Python.convert.executor": "Run",
&quot;Python.converter_mineru.executor&quot;: &quot;Run&quot;, "Python.converter_docling.executor": "Run",
&quot;Python.markdown_splitter.executor&quot;: &quot;Debug&quot;, "Python.converter_mineru.executor": "Run",
&quot;Python.markdown_utils.executor&quot;: &quot;Run&quot;, "Python.markdown_splitter.executor": "Debug",
&quot;Python.test.executor&quot;: &quot;Run&quot;, "Python.markdown_utils.executor": "Run",
&quot;Python.test1.executor&quot;: &quot;Run&quot;, "Python.test.executor": "Run",
&quot;Python.test2.executor&quot;: &quot;Run&quot;, "Python.test1.executor": "Run",
&quot;Python.test3.executor&quot;: &quot;Run&quot;, "Python.test2.executor": "Run",
&quot;Python.test4.executor&quot;: &quot;Run&quot;, "Python.test3.executor": "Run",
&quot;Python.testhtml.executor&quot;: &quot;Run&quot;, "Python.test4.executor": "Run",
&quot;Python.translater.executor&quot;: &quot;Run&quot;, "Python.testhtml.executor": "Run",
&quot;Python.切分测试.executor&quot;: &quot;Run&quot;, "Python.translater.executor": "Run",
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;, "Python.切分测试.executor": "Run",
&quot;RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager&quot;: &quot;true&quot;, "RunOnceActivity.ShowReadmeOnStart": "true",
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;, "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager": "true",
&quot;git-widget-placeholder&quot;: &quot;main&quot;, "RunOnceActivity.git.unshallow": "true",
&quot;last_opened_file_path&quot;: &quot;C:/Users/jxgm/Desktop/translate/docutranslate&quot;, "git-widget-placeholder": "dev",
&quot;list.type.of.created.stylesheet&quot;: &quot;CSS&quot;, "last_opened_file_path": "C:/Users/jxgm/Desktop/translate/docutranslate",
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;, "list.type.of.created.stylesheet": "CSS",
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;, "node.js.detected.package.eslint": "true",
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;, "node.js.detected.package.tslint": "true",
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;, "node.js.selected.package.eslint": "(autodetect)",
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;, "node.js.selected.package.tslint": "(autodetect)",
&quot;settings.editor.selected.configurable&quot;: &quot;preferences.pluginManager&quot;, "nodejs_package_manager_path": "npm",
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot; "settings.editor.selected.configurable": "preferences.pluginManager",
"vue.rearranger.settings.migration": "true"
} }
}</component> }]]></component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\jxgm\Desktop\translate\docutranslate" /> <recent name="C:\Users\jxgm\Desktop\translate\docutranslate" />
@@ -110,7 +118,7 @@
<recent name="C:\Users\jxgm\Desktop\FileTranslate\dist\app" /> <recent name="C:\Users\jxgm\Desktop\FileTranslate\dist\app" />
</key> </key>
</component> </component>
<component name="RunManager" selected="Python.2test2 (1)"> <component name="RunManager" selected="Python.app_test (1)">
<configuration default="true" type="DjangoTestsConfigurationType"> <configuration default="true" type="DjangoTestsConfigurationType">
<module name="filetranslate" /> <module name="filetranslate" />
<option name="ENV_FILES" value="" /> <option name="ENV_FILES" value="" />
@@ -273,27 +281,7 @@
<option name="OPTIONS" value="" /> <option name="OPTIONS" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="1test" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="test2.html" type="JavascriptDebugType" temporary="true" nameIsGenerated="true" uri="http://localhost:63342/filetranslate/tests/test2.html" useBuiltInWebServerPort="true">
<module name="docutranslate" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tests/1test.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="2test2 (1)" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="2test2 (1)" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
@@ -319,6 +307,29 @@
<option name="INPUT_FILE" value="" /> <option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="3testhtml" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="docutranslate" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tests/3testhtml.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration default="true" type="PythonConfigurationType" factoryName="Python"> <configuration default="true" type="PythonConfigurationType" factoryName="Python">
<module name="filetranslate" /> <module name="filetranslate" />
<option name="ENV_FILES" value="" /> <option name="ENV_FILES" value="" />
@@ -365,7 +376,7 @@
<option name="INPUT_FILE" value="" /> <option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="converter_docling" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="translater" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="docutranslate" /> <module name="docutranslate" />
<option name="ENV_FILES" value="" /> <option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" /> <option name="INTERPRETER_OPTIONS" value="" />
@@ -374,35 +385,12 @@
<env name="PYTHONUNBUFFERED" value="1" /> <env name="PYTHONUNBUFFERED" value="1" />
</envs> </envs>
<option name="SDK_HOME" value="" /> <option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/docutranslate/converter" /> <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/docutranslate" />
<option name="IS_MODULE_SDK" value="true" /> <option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" /> <option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" /> <option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/docutranslate/converter/converter_docling.py" /> <option name="SCRIPT_NAME" value="$PROJECT_DIR$/docutranslate/translater.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="converter_mineru" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="docutranslate" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/docutranslate/converter" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/docutranslate/converter/converter_mineru.py" />
<option name="PARAMETERS" value="" /> <option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" /> <option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" /> <option name="EMULATE_TERMINAL" value="false" />
@@ -510,11 +498,11 @@
</configuration> </configuration>
<recent_temporary> <recent_temporary>
<list> <list>
<item itemvalue="Python.2test2 (1)" />
<item itemvalue="Python.app_test (1)" /> <item itemvalue="Python.app_test (1)" />
<item itemvalue="Python.1test" /> <item itemvalue="JavaScript 调试.test2.html" />
<item itemvalue="Python.converter_docling" /> <item itemvalue="Python.3testhtml" />
<item itemvalue="Python.converter_mineru" /> <item itemvalue="Python.translater" />
<item itemvalue="Python.2test2 (1)" />
</list> </list>
</recent_temporary> </recent_temporary>
</component> </component>
@@ -641,13 +629,14 @@
</breakpoint-manager> </breakpoint-manager>
</component> </component>
<component name="com.intellij.coverage.CoverageDataManagerImpl"> <component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/filetranslate$app_test__1_.coverage" NAME="app_test (1) 覆盖结果" MODIFIED="1748235160651" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" /> <SUITE FILE_PATH="coverage/filetranslate$app_test__1_.coverage" NAME="app_test (1) 覆盖结果" MODIFIED="1748268183700" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/filetranslate$test.coverage" NAME="test 覆盖结果" MODIFIED="1747472297913" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" /> <SUITE FILE_PATH="coverage/filetranslate$test.coverage" NAME="test 覆盖结果" MODIFIED="1747472297913" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/filetranslate$convert.coverage" NAME="convert 覆盖结果" MODIFIED="1746963490689" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate/utils" /> <SUITE FILE_PATH="coverage/filetranslate$convert.coverage" NAME="convert 覆盖结果" MODIFIED="1746963490689" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate/utils" />
<SUITE FILE_PATH="coverage/PDFtranslate$PDFtranslater__1_.coverage" NAME="PDFtranslater (1) 覆盖结果" MODIFIED="1746633258205" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/pdftranslate_packages" /> <SUITE FILE_PATH="coverage/PDFtranslate$PDFtranslater__1_.coverage" NAME="PDFtranslater (1) 覆盖结果" MODIFIED="1746633258205" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/pdftranslate_packages" />
<SUITE FILE_PATH="coverage/filetranslate$pytest__test_html_py__.coverage" NAME="pytest (test_html.py 内) 覆盖结果" MODIFIED="1747554037236" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" /> <SUITE FILE_PATH="coverage/filetranslate$pytest__test_html_py__.coverage" NAME="pytest (test_html.py 内) 覆盖结果" MODIFIED="1747554037236" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/PDFtranslate$agent_utils.coverage" NAME="agent_utils 覆盖结果" MODIFIED="1746617703678" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/pdftranslate_packages/utils" /> <SUITE FILE_PATH="coverage/PDFtranslate$agent_utils.coverage" NAME="agent_utils 覆盖结果" MODIFIED="1746617703678" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/pdftranslate_packages/utils" />
<SUITE FILE_PATH="coverage/filetranslate$app2.coverage" NAME="app2 覆盖结果" MODIFIED="1747108180309" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate" /> <SUITE FILE_PATH="coverage/filetranslate$app2.coverage" NAME="app2 覆盖结果" MODIFIED="1747108180309" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate" />
<SUITE FILE_PATH="coverage/filetranslate$3testhtml.coverage" NAME="3testhtml 覆盖结果" MODIFIED="1748261775567" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/filetranslate$app.coverage" NAME="app 覆盖结果" MODIFIED="1747448464521" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate" /> <SUITE FILE_PATH="coverage/filetranslate$app.coverage" NAME="app 覆盖结果" MODIFIED="1747448464521" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate" />
<SUITE FILE_PATH="coverage/PDFtranslate$markdown_splitter.coverage" NAME="markdown_splitter 覆盖结果" MODIFIED="1746599883603" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/pdftranslate_packages/utils" /> <SUITE FILE_PATH="coverage/PDFtranslate$markdown_splitter.coverage" NAME="markdown_splitter 覆盖结果" MODIFIED="1746599883603" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/pdftranslate_packages/utils" />
<SUITE FILE_PATH="coverage/filetranslate$converter_mineru.coverage" NAME="converter_mineru 覆盖结果" MODIFIED="1747726229881" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate/converter" /> <SUITE FILE_PATH="coverage/filetranslate$converter_mineru.coverage" NAME="converter_mineru 覆盖结果" MODIFIED="1747726229881" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate/converter" />
@@ -674,7 +663,7 @@
<SUITE FILE_PATH="coverage/PDFtranslate$markdown_utils.coverage" NAME="markdown_utils 覆盖结果" MODIFIED="1746598797872" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/pdftranslate_packages/utils" /> <SUITE FILE_PATH="coverage/PDFtranslate$markdown_utils.coverage" NAME="markdown_utils 覆盖结果" MODIFIED="1746598797872" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/pdftranslate_packages/utils" />
<SUITE FILE_PATH="coverage/filetranslate$test2.coverage" NAME="test2 覆盖结果" MODIFIED="1747553897731" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" /> <SUITE FILE_PATH="coverage/filetranslate$test2.coverage" NAME="test2 覆盖结果" MODIFIED="1747553897731" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/filetranslate$converter_paddle.coverage" NAME="converter_paddle 覆盖结果" MODIFIED="1747880336763" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate/converter" /> <SUITE FILE_PATH="coverage/filetranslate$converter_paddle.coverage" NAME="converter_paddle 覆盖结果" MODIFIED="1747880336763" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate/converter" />
<SUITE FILE_PATH="coverage/filetranslate$translater.coverage" NAME="translater 覆盖结果" MODIFIED="1746843159560" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate" /> <SUITE FILE_PATH="coverage/filetranslate$translater.coverage" NAME="translater 覆盖结果" MODIFIED="1748261247946" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate" />
<SUITE FILE_PATH="coverage/filetranslate$docling_utils.coverage" NAME="docling_utils 覆盖结果" MODIFIED="1747710836730" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate/utils" /> <SUITE FILE_PATH="coverage/filetranslate$docling_utils.coverage" NAME="docling_utils 覆盖结果" MODIFIED="1747710836730" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate/utils" />
<SUITE FILE_PATH="coverage/docutranslate$app_test__1_.coverage" NAME="app_test (1) 覆盖结果" MODIFIED="1747743522496" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" /> <SUITE FILE_PATH="coverage/docutranslate$app_test__1_.coverage" NAME="app_test (1) 覆盖结果" MODIFIED="1747743522496" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/PDFtranslate$.coverage" NAME=" 覆盖结果" MODIFIED="1746588350286" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/decorator" /> <SUITE FILE_PATH="coverage/PDFtranslate$.coverage" NAME=" 覆盖结果" MODIFIED="1746588350286" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/decorator" />

View File

@@ -1,4 +1,4 @@
__version__="0.2.27" __version__="0.2.28"

View File

@@ -8,6 +8,7 @@ from pathlib import Path
from typing import List, Dict, Any, Optional from typing import List, Dict, Any, Optional
from urllib.parse import quote from urllib.parse import quote
import httpx
import uvicorn import uvicorn
from fastapi import FastAPI, File, Form, UploadFile, Request, HTTPException from fastapi import FastAPI, File, Form, UploadFile, Request, HTTPException
from fastapi.responses import HTMLResponse, JSONResponse, StreamingResponse, FileResponse from fastapi.responses import HTMLResponse, JSONResponse, StreamingResponse, FileResponse
@@ -131,7 +132,12 @@ async def _perform_translation(params: Dict[str, Any], file_contents: bytes, ori
) )
md_content = ft.export_to_markdown() md_content = ft.export_to_markdown()
html_content = ft.export_to_html(title=current_state["original_filename_stem"]) try:
httpx.head("https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/contrib/auto-render.min.js",timeout=1)
html_content = ft.export_to_html(title=current_state["original_filename_stem"], cdn=True)
except TimeoutError:
translater_logger.info("无法连接cdn使用本地js进行pdf渲染")
html_content = ft.export_to_html(title=current_state["original_filename_stem"], cdn=False)
end_time = time.time() end_time = time.time()
duration = end_time - current_state["task_start_time"] duration = end_time - current_state["task_start_time"]

View File

@@ -0,0 +1,120 @@
!function (e, t) {
"object" == typeof exports && "object" == typeof module ? module.exports = t(require("katex")) : "function" == typeof define && define.amd ? define(["katex"], t) : "object" == typeof exports ? exports.renderMathInElement = t(require("katex")) : e.renderMathInElement = t(e.katex)
}("undefined" != typeof self ? self : this, (function (e) {
return function () {
"use strict";
var t = {
757: function (t) {
t.exports = e
}
}, n = {};
function r(e) {
var o = n[e];
if (void 0 !== o) return o.exports;
var i = n[e] = {exports: {}};
return t[e](i, i.exports, r), i.exports
}
r.n = function (e) {
var t = e && e.__esModule ? function () {
return e.default
} : function () {
return e
};
return r.d(t, {a: t}), t
}, r.d = function (e, t) {
for (var n in t) r.o(t, n) && !r.o(e, n) && Object.defineProperty(e, n, {enumerable: !0, get: t[n]})
}, r.o = function (e, t) {
return Object.prototype.hasOwnProperty.call(e, t)
};
var o = {};
r.d(o, {
default: function () {
return p
}
});
var i = r(757), a = r.n(i);
const l = function (e, t, n) {
let r = n, o = 0;
const i = e.length;
for (; r < t.length;) {
const n = t[r];
if (o <= 0 && t.slice(r, r + i) === e) return r;
"\\" === n ? r++ : "{" === n ? o++ : "}" === n && o--, r++
}
return -1
}, s = /^\\begin{/;
var d = function (e, t) {
let n;
const r = [],
o = new RegExp("(" + t.map((e => e.left.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"))).join("|") + ")");
for (; n = e.search(o), -1 !== n;) {
n > 0 && (r.push({type: "text", data: e.slice(0, n)}), e = e.slice(n));
const o = t.findIndex((t => e.startsWith(t.left)));
if (n = l(t[o].right, e, t[o].left.length), -1 === n) break;
const i = e.slice(0, n + t[o].right.length), a = s.test(i) ? i : e.slice(t[o].left.length, n);
r.push({type: "math", data: a, rawData: i, display: t[o].display}), e = e.slice(n + t[o].right.length)
}
return "" !== e && r.push({type: "text", data: e}), r
};
const c = function (e, t) {
const n = d(e, t.delimiters);
if (1 === n.length && "text" === n[0].type) return null;
const r = document.createDocumentFragment();
for (let e = 0; e < n.length; e++) if ("text" === n[e].type) r.appendChild(document.createTextNode(n[e].data)); else {
const o = document.createElement("span");
let i = n[e].data;
t.displayMode = n[e].display;
try {
t.preProcess && (i = t.preProcess(i)), a().render(i, o, t)
} catch (o) {
if (!(o instanceof a().ParseError)) throw o;
t.errorCallback("KaTeX auto-render: Failed to parse `" + n[e].data + "` with ", o), r.appendChild(document.createTextNode(n[e].rawData));
continue
}
r.appendChild(o)
}
return r
}, f = function (e, t) {
for (let n = 0; n < e.childNodes.length; n++) {
const r = e.childNodes[n];
if (3 === r.nodeType) {
let o = r.textContent, i = r.nextSibling, a = 0;
for (; i && i.nodeType === Node.TEXT_NODE;) o += i.textContent, i = i.nextSibling, a++;
const l = c(o, t);
if (l) {
for (let e = 0; e < a; e++) r.nextSibling.remove();
n += l.childNodes.length - 1, e.replaceChild(l, r)
} else n += a
} else if (1 === r.nodeType) {
const e = " " + r.className + " ";
-1 === t.ignoredTags.indexOf(r.nodeName.toLowerCase()) && t.ignoredClasses.every((t => -1 === e.indexOf(" " + t + " "))) && f(r, t)
}
}
};
var p = function (e, t) {
if (!e) throw new Error("No element provided to render");
const n = {};
for (const e in t) t.hasOwnProperty(e) && (n[e] = t[e]);
n.delimiters = n.delimiters || [{left: "$$", right: "$$", display: !0}, {
left: "\\(",
right: "\\)",
display: !1
}, {left: "\\begin{equation}", right: "\\end{equation}", display: !0}, {
left: "\\begin{align}",
right: "\\end{align}",
display: !0
}, {left: "\\begin{alignat}", right: "\\end{alignat}", display: !0}, {
left: "\\begin{gather}",
right: "\\end{gather}",
display: !0
}, {left: "\\begin{CD}", right: "\\end{CD}", display: !0}, {
left: "\\[",
right: "\\]",
display: !0
}], n.ignoredTags = n.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code", "option"], n.ignoredClasses = n.ignoredClasses || [], n.errorCallback = n.errorCallback || console.error, n.macros = n.macros || {}, f(e, n)
};
return o = o.default
}()
}));

View File

@@ -699,7 +699,7 @@
try { try {
const response = await fetch("/meta") const response = await fetch("/meta")
let meta = await response.json(); let meta = await response.json();
versionDisplay.textContent = `版本号${meta.version}`; versionDisplay.textContent = `版本号${meta.version}`;
} catch (error) { } catch (error) {
console.warn("获取版本号失败", error); console.warn("获取版本号失败", error);
} }
@@ -840,11 +840,7 @@
return resp.text(); return resp.text();
}) })
.then(html => { .then(html => {
let finalHtml = html; const blob = new Blob([html], {type: 'text/html'});
if (!html.toLowerCase().includes('/static/pico.css')) {
finalHtml = `<link rel="stylesheet" href="/static/pico.css">\n<style>body{padding:1em;}</style>\n${html}`;
}
const blob = new Blob([finalHtml], {type: 'text/html'});
const blobUrl = URL.createObjectURL(blob); const blobUrl = URL.createObjectURL(blob);
translatedPreviewFrame.src = blobUrl; translatedPreviewFrame.src = blobUrl;
translatedPreviewFrame.onload = function () { translatedPreviewFrame.onload = function () {
@@ -882,9 +878,6 @@
}) })
.then(htmlContent => { .then(htmlContent => {
let finalHtml = htmlContent; let finalHtml = htmlContent;
if (!htmlContent.toLowerCase().includes('/static/pico.css')) {
finalHtml = `<link rel="stylesheet" href="/static/pico.css">\n<style>body{padding:1em; break-inside: avoid;}</style>\n${htmlContent}`;
}
iframe.onload = () => { iframe.onload = () => {
iframe.onload = null; iframe.onload = null;
setTimeout(() => { setTimeout(() => {

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -4,36 +4,37 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>{{title}}</title> <title>{{title}}</title>
{{pico}} {{pico}}
{{katexCss}}
{{katexJs}}
{{autoRender}}
<style> <style>
html { html {
padding: 2vh 10vw; padding: 2vh 10vw;
font-size: 15px; font-size: 15px;
} }
mjx-merror { display: none !important; }
</style> </style>
<script>
MathJax = {
loader: {load: ['[tex]/ams']},
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$', '$$'], ['\\[', '\\]']],
processEscapes: true,
packages: {'[+]': ['ams']}, // 启用AMS宏包
autoload: {color: [], colorv2: ['color']} // 颜色支持
},
options: {
renderActions: {
addMenu: [0, '', ''],
}
},
};
</script>
{{MathJax}}
</head> </head>
<body> <body>
{{markdown}} {{markdown}}
</body> </body>
<script>
document.addEventListener("DOMContentLoaded", function () {
renderMathInElement(document.body, {
delimiters: [
{left: '$$', right: '$$', display: true}, // 块级公式
{left: '\\[', right: '\\]', display: true}, // 块级公式
{left: '$', right: '$', display: false}, // 行内公式
{left: '\\(', right: '\\)', display: false} // 行内公式 (常用)
],
// • rendering keys, e.g.:
throwOnError: false
});
});
</script>
{{mermaid}} {{mermaid}}
<script> <script>
mermaid.initialize({ mermaid.initialize({
securityLevel: 'loose', securityLevel: 'loose',

View File

@@ -294,22 +294,24 @@ class FileTranslater:
translater_logger.info(f"文件已写入{full_name.resolve()}") translater_logger.info(f"文件已写入{full_name.resolve()}")
return self return self
def export_to_html(self, title="title") -> str: def export_to_html(self, title="title", cdn=True) -> str:
markdowner = markdown2.Markdown(extras=['tables', 'fenced-code-blocks', 'mermaid', "code-friendly"]) markdowner = markdown2.Markdown(extras=['tables', 'fenced-code-blocks', 'mermaid', "code-friendly"])
# language=html # language=html
pico=resource_path("static/pico.css") pico = f"<style>{resource_path("static/pico.css").read_text(encoding='utf-8')}</style>"
html = resource_path("template/markdown.html") html = resource_path("template/markdown.html").read_text(encoding='utf-8')
MathJax=resource_path( "static/MathJax.js") katex_css = f"<style>{resource_path("static/katex.css").read_text(encoding='utf-8')}</style>" if not cdn else r"""<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/katex.min.css" integrity="sha384-5TcZemv2l/9On385z///+d7MSYlvIEw9FuZTIdZ14vJLqWphw7e7ZPuOiCHJcFCP" crossorigin="anonymous">"""
mermaid=resource_path( "static/mermaid.js") katex_js = f"<script>{resource_path("static/katex.js").read_text(encoding='utf-8')}</script>" if not cdn else r"""<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/katex.min.js" integrity="sha384-cMkvdD8LoxVzGF/RPUKAcvmm49FQ0oxwDF3BGKtDXcEc+T1b2N+teh/OJfpU0jr6" crossorigin="anonymous"></script>"""
auto_render = f'<script>{resource_path("static/autoRender.js").read_text(encoding='utf-8')}</script>' if not cdn else r"""<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/contrib/auto-render.min.js" integrity="sha384-hCXGrW6PitJEwbkoStFjeJxv+fSOOQKOPbJxSfM6G5sWZjAyWhXiTIIAmQqnlLlh" crossorigin="anonymous"></script>"""
mermaid = f'<script>{resource_path("static/mermaid.js").read_text(encoding='utf-8')}</script>'
# TODO:实现MathJax本地化 # TODO:实现MathJax本地化
render = jinja2.Template(html.read_text()).render( render = jinja2.Template(html).render(
title=title, title=title,
pico=f"<style>\n{pico.read_text()}\n</style>", pico=pico,
# markdown=markdowner.convert(self.markdown), katexCss=katex_css,
katexJs=katex_js,
autoRender=auto_render,
markdown=markdowner.convert(self.markdown.replace("\\", "\\\\")), markdown=markdowner.convert(self.markdown.replace("\\", "\\\\")),
MathJax=r'<script src=" https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-mml-chtml.min.js "></script>', mermaid=mermaid,
# MathJax=f'<script>\n{MathJax.read_text()}\n</script>',
mermaid=f"<script>\n{mermaid.read_text()}\n</script>",
) )
return render return render

View File

@@ -1,369 +0,0 @@
# This file was autogenerated by uv via the following command:
# uv pip compile pyproject.toml -o requirements.txt
altgraph==0.17.4
# via pyinstaller
annotated-types==0.7.0
# via pydantic
anyio==4.9.0
# via
# httpx
# starlette
# watchfiles
attrs==25.3.0
# via
# jsonlines
# jsonschema
# referencing
beautifulsoup4==4.13.4
# via docling
certifi==2025.4.26
# via
# docling
# httpcore
# httpx
# requests
charset-normalizer==3.4.2
# via requests
click==8.1.8
# via
# docling
# rich-toolkit
# typer
# uvicorn
colorama==0.4.6
# via
# click
# tqdm
# uvicorn
dill==0.4.0
# via multiprocess
dnspython==2.7.0
# via email-validator
docling==2.33.0
# via docutranslate (pyproject.toml)
docling-core==2.31.1
# via
# docling
# docling-ibm-models
# docling-parse
docling-ibm-models==3.4.3
# via docling
docling-parse==4.0.1
# via docling
easyocr==1.7.2
# via docling
email-validator==2.2.0
# via fastapi
et-xmlfile==2.0.0
# via openpyxl
fastapi==0.115.12
# via docutranslate (pyproject.toml)
fastapi-cli==0.0.7
# via fastapi
filelock==3.18.0
# via
# huggingface-hub
# torch
# transformers
filetype==1.2.0
# via docling
fsspec==2025.5.0
# via
# huggingface-hub
# torch
h11==0.16.0
# via
# httpcore
# uvicorn
httpcore==1.0.9
# via httpx
httptools==0.6.4
# via uvicorn
httpx==0.28.1
# via
# docutranslate (pyproject.toml)
# fastapi
huggingface-hub==0.31.4
# via
# docling
# docling-ibm-models
# tokenizers
# transformers
idna==3.10
# via
# anyio
# email-validator
# httpx
# requests
imageio==2.37.0
# via scikit-image
jinja2==3.1.6
# via
# fastapi
# torch
jsonlines==3.1.0
# via docling-ibm-models
jsonref==1.1.0
# via docling-core
jsonschema==4.23.0
# via docling-core
jsonschema-specifications==2025.4.1
# via jsonschema
latex2mathml==3.78.0
# via docling-core
lazy-loader==0.4
# via scikit-image
lxml==5.4.0
# via
# docling
# python-docx
# python-pptx
markdown-it-py==3.0.0
# via rich
markdown2==2.5.3
# via docutranslate (pyproject.toml)
marko==2.1.3
# via docling
markupsafe==3.0.2
# via jinja2
mdurl==0.1.2
# via markdown-it-py
mpire==2.10.2
# via semchunk
mpmath==1.3.0
# via sympy
multiprocess==0.70.18
# via mpire
networkx==3.4.2
# via
# scikit-image
# torch
ninja==1.11.1.4
# via easyocr
numpy==2.2.6
# via
# docling-ibm-models
# easyocr
# imageio
# opencv-python-headless
# pandas
# safetensors
# scikit-image
# scipy
# shapely
# tifffile
# torchvision
# transformers
opencv-python-headless==4.11.0.86
# via
# docling-ibm-models
# easyocr
openpyxl==3.1.5
# via docling
packaging==25.0
# via
# huggingface-hub
# lazy-loader
# pyinstaller
# pyinstaller-hooks-contrib
# scikit-image
# transformers
pandas==2.2.3
# via
# docling
# docling-core
pefile==2023.2.7
# via pyinstaller
pillow==11.2.1
# via
# docling
# docling-core
# docling-ibm-models
# docling-parse
# easyocr
# imageio
# python-pptx
# scikit-image
# torchvision
pluggy==1.6.0
# via docling
pyclipper==1.3.0.post6
# via easyocr
pydantic==2.11.4
# via
# docling
# docling-core
# docling-ibm-models
# docling-parse
# fastapi
# pydantic-settings
pydantic-core==2.33.2
# via pydantic
pydantic-settings==2.9.1
# via docling
pygments==2.19.1
# via
# mpire
# rich
pyinstaller==6.13.0
# via docutranslate (pyproject.toml)
pyinstaller-hooks-contrib==2025.4
# via pyinstaller
pylatexenc==2.10
# via docling
pypdfium2==4.30.1
# via docling
python-bidi==0.6.6
# via easyocr
python-dateutil==2.9.0.post0
# via pandas
python-docx==1.1.2
# via docling
python-dotenv==1.1.0
# via
# pydantic-settings
# uvicorn
python-multipart==0.0.20
# via fastapi
python-pptx==1.0.2
# via docling
pytz==2025.2
# via pandas
pywin32==310
# via
# docling-parse
# mpire
pywin32-ctypes==0.2.3
# via pyinstaller
pyyaml==6.0.2
# via
# docling-core
# easyocr
# huggingface-hub
# transformers
# uvicorn
referencing==0.36.2
# via
# jsonschema
# jsonschema-specifications
regex==2024.11.6
# via transformers
requests==2.32.3
# via
# docling
# huggingface-hub
# transformers
rich==14.0.0
# via
# rich-toolkit
# typer
rich-toolkit==0.14.6
# via fastapi-cli
rpds-py==0.25.0
# via
# jsonschema
# referencing
rtree==1.4.0
# via docling
safetensors==0.5.3
# via
# docling-ibm-models
# transformers
scikit-image==0.25.2
# via easyocr
scipy==1.15.3
# via
# docling
# easyocr
# scikit-image
semchunk==2.2.2
# via docling-core
setuptools==80.8.0
# via
# pyinstaller
# pyinstaller-hooks-contrib
# torch
shapely==2.1.1
# via easyocr
shellingham==1.5.4
# via typer
six==1.17.0
# via python-dateutil
sniffio==1.3.1
# via anyio
soupsieve==2.7
# via beautifulsoup4
starlette==0.46.2
# via fastapi
sympy==1.14.0
# via torch
tabulate==0.9.0
# via
# docling-core
# docling-parse
tifffile==2025.5.10
# via scikit-image
tokenizers==0.21.1
# via transformers
torch==2.7.0
# via
# docling-ibm-models
# easyocr
# safetensors
# torchvision
torchvision==0.22.0
# via
# docling-ibm-models
# easyocr
tqdm==4.67.1
# via
# docling
# docling-ibm-models
# huggingface-hub
# mpire
# semchunk
# transformers
transformers==4.51.3
# via
# docutranslate (pyproject.toml)
# docling-core
# docling-ibm-models
typer==0.15.4
# via
# docling
# docling-core
# fastapi-cli
typing-extensions==4.13.2
# via
# anyio
# beautifulsoup4
# docling-core
# fastapi
# huggingface-hub
# pydantic
# pydantic-core
# python-docx
# python-pptx
# referencing
# rich-toolkit
# torch
# typer
# typing-inspection
typing-inspection==0.4.0
# via
# pydantic
# pydantic-settings
tzdata==2025.2
# via pandas
urllib3==2.4.0
# via requests
uvicorn==0.34.2
# via
# fastapi
# fastapi-cli
watchfiles==1.0.5
# via uvicorn
websockets==15.0.1
# via uvicorn
xlsxwriter==3.2.3
# via python-pptx