前端更多错误显示
This commit is contained in:
7
.idea/workspace.xml
generated
7
.idea/workspace.xml
generated
@@ -6,8 +6,9 @@
|
|||||||
<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$/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/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/utils/markdown_splitter.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/utils/markdown_splitter.py" 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" />
|
||||||
@@ -595,7 +596,7 @@
|
|||||||
<workItem from="1748236163786" duration="323000" />
|
<workItem from="1748236163786" duration="323000" />
|
||||||
<workItem from="1748353819402" duration="2973000" />
|
<workItem from="1748353819402" duration="2973000" />
|
||||||
<workItem from="1748360287873" duration="6961000" />
|
<workItem from="1748360287873" duration="6961000" />
|
||||||
<workItem from="1748422260212" duration="2678000" />
|
<workItem from="1748422260212" duration="8132000" />
|
||||||
</task>
|
</task>
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
@@ -614,7 +615,7 @@
|
|||||||
</option>
|
</option>
|
||||||
</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="1748424550709" 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="1748431071016" 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" />
|
||||||
|
|||||||
@@ -223,17 +223,19 @@ async def handle_translate(
|
|||||||
content={"task_started": False, "message": "另一个翻译任务正在进行中,请稍后再试。"}
|
content={"task_started": False, "message": "另一个翻译任务正在进行中,请稍后再试。"}
|
||||||
)
|
)
|
||||||
|
|
||||||
if not file or not file.filename:
|
#可选的格式认证,这部分交给前端来写了
|
||||||
return JSONResponse(
|
# if not file or not file.filename:
|
||||||
status_code=400,
|
# return JSONResponse(
|
||||||
content={"task_started": False, "message": "没有选择文件或文件无效。"}
|
# status_code=400,
|
||||||
)
|
# content={"task_started": False, "message": "没有选择文件或文件无效。"}
|
||||||
|
# )
|
||||||
if convert_engin == "mineru" and (not mineru_token or not mineru_token.strip()):
|
# if not file.filename.split(".")[-1] in ["md","txt"]:
|
||||||
return JSONResponse(
|
# #需要填写 Mineru 引擎
|
||||||
status_code=400,
|
# if convert_engin == "mineru" and (not mineru_token or not mineru_token.strip()) :
|
||||||
content={"task_started": False, "message": "使用 Mineru 引擎时必须提供有效的 Mineru Token。"}
|
# return JSONResponse(
|
||||||
)
|
# status_code=400,
|
||||||
|
# content={"task_started": False, "message": "使用 Mineru 引擎时必须提供有效的 Mineru Token。"}
|
||||||
|
# )
|
||||||
|
|
||||||
current_state["is_processing"] = True
|
current_state["is_processing"] = True
|
||||||
original_filename_for_init = file.filename or "uploaded_file"
|
original_filename_for_init = file.filename or "uploaded_file"
|
||||||
|
|||||||
@@ -411,7 +411,7 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="custom_prompt_translate"></label>
|
<label for="custom_prompt_translate"></label>
|
||||||
<textarea class="prompt-area" type="text" id="custom_prompt_translate"
|
<textarea class="prompt-area" type="text" id="custom_prompt_translate"
|
||||||
name="custom_prompt_translate" placeholder="翻译提示"></textarea>
|
name="custom_prompt_translate" placeholder="翻译提示"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
<button type="submit" id="submitButton" class="primary">开始翻译</button>
|
<button type="submit" id="submitButton" class="primary">开始翻译</button>
|
||||||
@@ -990,9 +990,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
form.addEventListener('submit', async function (event) {
|
submitButton.addEventListener('click', async function (event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
console.log(fileInput)
|
||||||
if (isTranslating) {
|
if (isTranslating) {
|
||||||
await cancelTranslation();
|
await cancelTranslation();
|
||||||
return;
|
return;
|
||||||
@@ -1000,52 +1000,41 @@
|
|||||||
|
|
||||||
[fileDropArea, mineruTokenInput, apikeyInput, modelInput, baseUrlInput].forEach(el => el.classList.remove('input-error'));
|
[fileDropArea, mineruTokenInput, apikeyInput, modelInput, baseUrlInput].forEach(el => el.classList.remove('input-error'));
|
||||||
fileNameDisplay.classList.remove('input-error-text');
|
fileNameDisplay.classList.remove('input-error-text');
|
||||||
let firstErrorElement = null;
|
|
||||||
let currentStatusMsg = '';
|
|
||||||
|
|
||||||
if (fileInput.files.length === 0) {
|
if (fileInput.files.length !== 1) {
|
||||||
currentStatusMsg += '请选择一个文件进行翻译。';
|
statusMsg.textContent = '请选择一个文件进行翻译。';
|
||||||
|
statusMsg.className = 'error-message';
|
||||||
fileNameDisplay.textContent = '请选择文件!';
|
fileNameDisplay.textContent = '请选择文件!';
|
||||||
fileNameDisplay.classList.add('input-error-text');
|
fileNameDisplay.classList.add('input-error-text');
|
||||||
fileDropArea.classList.add('input-error');
|
fileDropArea.classList.add('input-error');
|
||||||
fileDropPrompt.classList.remove('hidden');
|
fileDropPrompt.classList.remove('hidden');
|
||||||
if (!firstErrorElement) firstErrorElement = fileDropArea;
|
return
|
||||||
|
}
|
||||||
|
console.log(convertEnginSelect.value === 'mineru' && (!mineruTokenInput.value.trim()) && (!["md", "txt"].includes(fileInput.files[0].name.split('.').pop())))
|
||||||
|
if (convertEnginSelect.value === 'mineru' && !mineruTokenInput.value.trim() && (!["md", "txt"].includes(fileInput.files[0].name.split('.').pop()))) {
|
||||||
|
statusMsg.textContent = '使用 Mineru 引擎时,必须填写 Mineru Token。';
|
||||||
|
statusMsg.className = 'error-message';
|
||||||
|
mineruTokenInput.classList.add('input-error');
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (convertEnginSelect.value === 'mineru' && !mineruTokenInput.value.trim()) {
|
|
||||||
currentStatusMsg += (currentStatusMsg ? ' ' : '') + '使用 Mineru 引擎时,必须填写 Mineru Token。';
|
|
||||||
mineruTokenInput.classList.add('input-error');
|
|
||||||
if (!firstErrorElement) firstErrorElement = mineruTokenInput;
|
|
||||||
}
|
|
||||||
if (!apikeyInput.value.trim()) {
|
if (!apikeyInput.value.trim()) {
|
||||||
currentStatusMsg += (currentStatusMsg ? ' ' : '') + 'API 密钥不能为空。';
|
statusMsg.textContent = 'API 密钥不能为空。';
|
||||||
|
statusMsg.className = 'error-message';
|
||||||
apikeyInput.classList.add('input-error');
|
apikeyInput.classList.add('input-error');
|
||||||
if (!firstErrorElement) firstErrorElement = apikeyInput;
|
return
|
||||||
}
|
}
|
||||||
if (!modelInput.value.trim()) {
|
if (!modelInput.value.trim()) {
|
||||||
currentStatusMsg += (currentStatusMsg ? ' ' : '') + '模型 ID 不能为空。';
|
statusMsg.textContent = '模型 ID 不能为空。';
|
||||||
|
statusMsg.className = 'error-message';
|
||||||
modelInput.classList.add('input-error');
|
modelInput.classList.add('input-error');
|
||||||
if (!firstErrorElement) firstErrorElement = modelInput;
|
return
|
||||||
}
|
}
|
||||||
if (platformSelect.value === 'custom' && !baseUrlInput.value.trim()) {
|
if (platformSelect.value === 'custom' && !baseUrlInput.value.trim()) {
|
||||||
currentStatusMsg += (currentStatusMsg ? ' ' : '') + '自定义接口时,API 地址不能为空。';
|
statusMsg.textContent = '自定义接口时,API 地址不能为空。';
|
||||||
baseUrlInput.classList.add('input-error');
|
|
||||||
if (!firstErrorElement) firstErrorElement = baseUrlInput;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (firstErrorElement) {
|
|
||||||
statusMsg.textContent = currentStatusMsg;
|
|
||||||
statusMsg.className = 'error-message';
|
statusMsg.className = 'error-message';
|
||||||
firstErrorElement.focus();
|
baseUrlInput.classList.add('input-error');
|
||||||
setTimeout(() => {
|
return
|
||||||
[fileDropArea, mineruTokenInput, apikeyInput, modelInput, baseUrlInput].forEach(el => el.classList.remove('input-error'));
|
|
||||||
fileNameDisplay.classList.remove('input-error-text');
|
|
||||||
if (fileNameDisplay.textContent === '请选择文件!' && fileInput.files.length === 0) {
|
|
||||||
fileNameDisplay.textContent = '未选择文件';
|
|
||||||
fileDropPrompt.classList.remove('hidden');
|
|
||||||
}
|
|
||||||
}, 3000);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stopPolling();
|
stopPolling();
|
||||||
|
|||||||
@@ -239,9 +239,10 @@ def split_markdown_text(markdown_text, max_block_size=5000):
|
|||||||
|
|
||||||
|
|
||||||
def join_markdown_texts(markdown_texts: list[str]) -> str:
|
def join_markdown_texts(markdown_texts: list[str]) -> str:
|
||||||
result = ""
|
if len(markdown_texts) == 0: return ""
|
||||||
pre = ""
|
result = markdown_texts[0]
|
||||||
for text in markdown_texts:
|
pre = markdown_texts[0]
|
||||||
|
for text in markdown_texts[1:]:
|
||||||
# 只有表格会收到多余空行的影响
|
# 只有表格会收到多余空行的影响
|
||||||
if text.lstrip().startswith("|") and pre.rstrip().endswith("|"):
|
if text.lstrip().startswith("|") and pre.rstrip().endswith("|"):
|
||||||
result = result + "\n" + text
|
result = result + "\n" + text
|
||||||
|
|||||||
Reference in New Issue
Block a user