增加日志
This commit is contained in:
40
.idea/workspace.xml
generated
40
.idea/workspace.xml
generated
@@ -6,8 +6,11 @@
|
|||||||
<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 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$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/docutranslate/Agents/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/agents/__init__.py" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/docutranslate/Agents/agent.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/agents/agent.py" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/docutranslate/Agents/markdown_agent.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/agents/markdown_agent.py" 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$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="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" />
|
||||||
@@ -89,7 +92,7 @@
|
|||||||
<recent name="C:\Users\jxgm\Desktop\PDFtranslate\pdf" />
|
<recent name="C:\Users\jxgm\Desktop\PDFtranslate\pdf" />
|
||||||
</key>
|
</key>
|
||||||
</component>
|
</component>
|
||||||
<component name="RunManager" selected="Python.test4">
|
<component name="RunManager" selected="JavaScript 调试.test2_英文.html">
|
||||||
<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="" />
|
||||||
@@ -114,6 +117,9 @@
|
|||||||
<configuration name="output.html" type="JavascriptDebugType" temporary="true" nameIsGenerated="true" uri="http://localhost:63342/filetranslate/tests/output.html" useBuiltInWebServerPort="true">
|
<configuration name="output.html" type="JavascriptDebugType" temporary="true" nameIsGenerated="true" uri="http://localhost:63342/filetranslate/tests/output.html" useBuiltInWebServerPort="true">
|
||||||
<method v="2" />
|
<method v="2" />
|
||||||
</configuration>
|
</configuration>
|
||||||
|
<configuration name="test2_英文.html" type="JavascriptDebugType" temporary="true" nameIsGenerated="true" uri="http://localhost:63342/filetranslate/tests/output/test2_英文.html" useBuiltInWebServerPort="true">
|
||||||
|
<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="" />
|
||||||
@@ -160,29 +166,6 @@
|
|||||||
<option name="INPUT_FILE" value="" />
|
<option name="INPUT_FILE" value="" />
|
||||||
<method v="2" />
|
<method v="2" />
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration name="test2" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
|
||||||
<module name="FileTranslate" />
|
|
||||||
<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/test2.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="test3" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
<configuration name="test3" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
||||||
<module name="FileTranslate" />
|
<module name="FileTranslate" />
|
||||||
<option name="ENV_FILES" value="" />
|
<option name="ENV_FILES" value="" />
|
||||||
@@ -328,11 +311,11 @@
|
|||||||
</configuration>
|
</configuration>
|
||||||
<recent_temporary>
|
<recent_temporary>
|
||||||
<list>
|
<list>
|
||||||
|
<item itemvalue="JavaScript 调试.test2_英文.html" />
|
||||||
|
<item itemvalue="Python.test1" />
|
||||||
<item itemvalue="Python.test4" />
|
<item itemvalue="Python.test4" />
|
||||||
<item itemvalue="JavaScript 调试.output.html" />
|
<item itemvalue="JavaScript 调试.output.html" />
|
||||||
<item itemvalue="Python.test1" />
|
|
||||||
<item itemvalue="Python.test3" />
|
<item itemvalue="Python.test3" />
|
||||||
<item itemvalue="Python.test2" />
|
|
||||||
</list>
|
</list>
|
||||||
</recent_temporary>
|
</recent_temporary>
|
||||||
</component>
|
</component>
|
||||||
@@ -388,6 +371,7 @@
|
|||||||
<workItem from="1746887311759" duration="14000" />
|
<workItem from="1746887311759" duration="14000" />
|
||||||
<workItem from="1746894355924" duration="651000" />
|
<workItem from="1746894355924" duration="651000" />
|
||||||
<workItem from="1746923054682" duration="383000" />
|
<workItem from="1746923054682" duration="383000" />
|
||||||
|
<workItem from="1746928498783" duration="4163000" />
|
||||||
</task>
|
</task>
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
@@ -398,7 +382,7 @@
|
|||||||
<SUITE FILE_PATH="coverage/filetranslate$test.coverage" NAME="test 覆盖结果" MODIFIED="1746677277745" 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="1746677277745" 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$agent_utils.coverage" NAME="agent_utils 覆盖结果" MODIFIED="1746708534311" 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$agent_utils.coverage" NAME="agent_utils 覆盖结果" MODIFIED="1746708534311" 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="1746780691113" 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="1746780691113" 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$test1.coverage" NAME="test1 覆盖结果" MODIFIED="1746884868249" 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$test1.coverage" NAME="test1 覆盖结果" MODIFIED="1746935919416" 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$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/PDFtranslate$convert.coverage" NAME="convert 覆盖结果" MODIFIED="1746596984213" 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$convert.coverage" NAME="convert 覆盖结果" MODIFIED="1746596984213" 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/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" />
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ translater.translate_file("<文件路径>", to_lang="中文",refine=True)
|
|||||||
|
|
||||||
```python
|
```python
|
||||||
from docutranslate import FileTranslater
|
from docutranslate import FileTranslater
|
||||||
from docutranslate.Agents import MDRefineAgent, MDTranslateAgent
|
from docutranslate.agents import MDRefineAgent, MDTranslateAgent
|
||||||
|
|
||||||
translater = FileTranslater()
|
translater = FileTranslater()
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ from typing import TypedDict
|
|||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
|
|
||||||
|
from docutranslate.logger import translater_logger
|
||||||
|
|
||||||
|
|
||||||
class AgentArgs(TypedDict, total=False):
|
class AgentArgs(TypedDict, total=False):
|
||||||
baseurl: str
|
baseurl: str
|
||||||
@@ -97,7 +99,7 @@ class Agent:
|
|||||||
)
|
)
|
||||||
nonlocal count
|
nonlocal count
|
||||||
count += 1
|
count += 1
|
||||||
print(f"进行到{count}/{total}")
|
translater_logger.info(f"进行到{count}/{total}")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
for p_text in prompts:
|
for p_text in prompts:
|
||||||
@@ -5,12 +5,12 @@ from typing import Literal
|
|||||||
import markdown2
|
import markdown2
|
||||||
from docling.datamodel.document import DocumentStream
|
from docling.datamodel.document import DocumentStream
|
||||||
|
|
||||||
from docutranslate.Agents import Agent, AgentArgs
|
from docutranslate.agents import Agent, AgentArgs
|
||||||
from docutranslate.Agents import MDRefineAgent, MDTranslateAgent
|
from docutranslate.agents import MDRefineAgent, MDTranslateAgent
|
||||||
from docutranslate.utils.convert import file2markdown_embed_images
|
from docutranslate.utils.convert import file2markdown_embed_images
|
||||||
from docutranslate.utils.markdown_splitter import split_markdown_text
|
from docutranslate.utils.markdown_splitter import split_markdown_text
|
||||||
from docutranslate.utils.markdown_utils import uris2placeholder, placeholder2_uris, MaskDict
|
from docutranslate.utils.markdown_utils import uris2placeholder, placeholder2_uris, MaskDict
|
||||||
|
from docutranslate.logger import translater_logger
|
||||||
|
|
||||||
# import mdformat
|
# import mdformat
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ class FileTranslater:
|
|||||||
|
|
||||||
def _split_markdown_into_chunks(self) -> list[str]:
|
def _split_markdown_into_chunks(self) -> list[str]:
|
||||||
chunks: list[str] = split_markdown_text(self.markdown, self.chunksize)
|
chunks: list[str] = split_markdown_text(self.markdown, self.chunksize)
|
||||||
print(f"markdown分为{len(chunks)}块")
|
translater_logger.info(f"markdown分为{len(chunks)}块")
|
||||||
return chunks
|
return chunks
|
||||||
|
|
||||||
def default_agent_params(self) -> AgentArgs:
|
def default_agent_params(self) -> AgentArgs:
|
||||||
@@ -81,9 +81,9 @@ class FileTranslater:
|
|||||||
if file_path.suffix == ".md":
|
if file_path.suffix == ".md":
|
||||||
self.markdown = file.decode()
|
self.markdown = file.decode()
|
||||||
else:
|
else:
|
||||||
print(f"正在将{file_path.resolve().name}转换为markdown")
|
translater_logger.info(f"正在将{file_path.resolve().name}转换为markdown")
|
||||||
self.markdown = file2markdown_embed_images(ds, formula, code, artifacts_path=self.docling_artifact)
|
self.markdown = file2markdown_embed_images(ds, formula, code, artifacts_path=self.docling_artifact)
|
||||||
print("已转换为markdown")
|
translater_logger.info(f"已转换为markdown")
|
||||||
if refine:
|
if refine:
|
||||||
self.refine_markdown_by_agent(refine_agent)
|
self.refine_markdown_by_agent(refine_agent)
|
||||||
if save:
|
if save:
|
||||||
@@ -98,19 +98,20 @@ class FileTranslater:
|
|||||||
refine_agent: Agent | None = None):
|
refine_agent: Agent | None = None):
|
||||||
if file_path is None:
|
if file_path is None:
|
||||||
if self.file_path is None:
|
if self.file_path is None:
|
||||||
|
translater_logger.debug("未设置文件路径")
|
||||||
raise Exception("未设置文件路径")
|
raise Exception("未设置文件路径")
|
||||||
file_path = self.file_path
|
file_path = self.file_path
|
||||||
if isinstance(file_path, str):
|
if isinstance(file_path, str):
|
||||||
file_path = Path(file_path)
|
file_path = Path(file_path)
|
||||||
print(f"读取文件:{file_path.name}")
|
translater_logger.info(f"读取文件:{file_path.name}")
|
||||||
# 如果是markdown,直接读取
|
# 如果是markdown,直接读取
|
||||||
if file_path.suffix == ".md":
|
if file_path.suffix == ".md":
|
||||||
with open(file_path, "r") as f:
|
with open(file_path, "r") as f:
|
||||||
self.markdown = f.read()
|
self.markdown = f.read()
|
||||||
else:
|
else:
|
||||||
print(f"正在将{file_path.resolve().name}转换为markdown")
|
translater_logger.info(f"正在将{file_path.resolve().name}转换为markdown")
|
||||||
self.markdown = file2markdown_embed_images(file_path, formula, code, artifacts_path=self.docling_artifact)
|
self.markdown = file2markdown_embed_images(file_path, formula, code, artifacts_path=self.docling_artifact)
|
||||||
print("已转换为markdown")
|
translater_logger.info("已转换为markdown")
|
||||||
if refine:
|
if refine:
|
||||||
self.refine_markdown_by_agent(refine_agent)
|
self.refine_markdown_by_agent(refine_agent)
|
||||||
if save:
|
if save:
|
||||||
@@ -121,7 +122,7 @@ class FileTranslater:
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
def refine_markdown_by_agent(self, refine_agent: Agent | None = None) -> str:
|
def refine_markdown_by_agent(self, refine_agent: Agent | None = None) -> str:
|
||||||
print("正在修正markdown")
|
translater_logger.info("正在修正markdown")
|
||||||
self._mask_uris_in_markdown()
|
self._mask_uris_in_markdown()
|
||||||
chuncks = self._split_markdown_into_chunks()
|
chuncks = self._split_markdown_into_chunks()
|
||||||
if refine_agent is None:
|
if refine_agent is None:
|
||||||
@@ -129,11 +130,11 @@ class FileTranslater:
|
|||||||
result: list[str] = refine_agent.send_prompts(chuncks)
|
result: list[str] = refine_agent.send_prompts(chuncks)
|
||||||
self.markdown = "\n".join(result)
|
self.markdown = "\n".join(result)
|
||||||
self._unmask_uris_in_markdown()
|
self._unmask_uris_in_markdown()
|
||||||
print("markdown已修正")
|
translater_logger.info("markdown已修正")
|
||||||
return self.markdown
|
return self.markdown
|
||||||
|
|
||||||
def translate_markdown_by_agent(self, translate_agent: Agent | None = None, to_lang="中文"):
|
def translate_markdown_by_agent(self, translate_agent: Agent | None = None, to_lang="中文"):
|
||||||
print("正在翻译markdown")
|
translater_logger.info("正在翻译markdown")
|
||||||
self._mask_uris_in_markdown()
|
self._mask_uris_in_markdown()
|
||||||
chuncks = self._split_markdown_into_chunks()
|
chuncks = self._split_markdown_into_chunks()
|
||||||
if translate_agent is None:
|
if translate_agent is None:
|
||||||
@@ -141,7 +142,7 @@ class FileTranslater:
|
|||||||
result: list[str] = translate_agent.send_prompts(chuncks)
|
result: list[str] = translate_agent.send_prompts(chuncks)
|
||||||
self.markdown = "\n".join(result)
|
self.markdown = "\n".join(result)
|
||||||
self._unmask_uris_in_markdown()
|
self._unmask_uris_in_markdown()
|
||||||
print("翻译完成")
|
translater_logger.info("翻译完成")
|
||||||
return self.markdown
|
return self.markdown
|
||||||
|
|
||||||
def save_as_markdown(self, filename: str | Path | None = None, output_dir: str | Path = "./output"):
|
def save_as_markdown(self, filename: str | Path | None = None, output_dir: str | Path = "./output"):
|
||||||
@@ -161,7 +162,7 @@ class FileTranslater:
|
|||||||
self._markdown_format()
|
self._markdown_format()
|
||||||
with open(full_name, "w") as file:
|
with open(full_name, "w") as file:
|
||||||
file.write(self.markdown)
|
file.write(self.markdown)
|
||||||
print(f"文件已写入{full_name.resolve()}")
|
translater_logger.info(f"文件已写入{full_name.resolve()}")
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def export_to_markdown(self):
|
def export_to_markdown(self):
|
||||||
@@ -185,7 +186,7 @@ class FileTranslater:
|
|||||||
html = self.export_to_html(str(filename.resolve().stem))
|
html = self.export_to_html(str(filename.resolve().stem))
|
||||||
with open(full_name, "w") as file:
|
with open(full_name, "w") as file:
|
||||||
file.write(html)
|
file.write(html)
|
||||||
print(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") -> str:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "docutranslate"
|
name = "docutranslate"
|
||||||
version = "0.1.7.dev"
|
version = "0.1.7"
|
||||||
description = "文件翻译工具"
|
description = "文件翻译工具"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.10"
|
requires-python = ">=3.10"
|
||||||
|
|||||||
Reference in New Issue
Block a user