main重复定义修复

This commit is contained in:
2025-12-06 11:48:21 +08:00
parent 83032d3f6b
commit 9df5794383
+52 -99
View File
@@ -236,7 +236,7 @@ function applyTextReplacement(
} }
const ok = (document as any).execCommand && (document as any).execCommand('insertText', false, text); const ok = (document as any).execCommand && (document as any).execCommand('insertText', false, text);
if (ok) return; if (ok) return;
} catch {} } catch { }
try { try {
el.setRangeText(text, start, end, 'end'); el.setRangeText(text, start, end, 'end');
try { try {
@@ -293,28 +293,28 @@ function handleAddTag(tag: string) {
if (start > 0) { if (start > 0) {
const prevText = textVal.slice(0, start); const prevText = textVal.slice(0, start);
if (/[^,\s]$/.test(prevText)) { if (/[^,\s]$/.test(prevText)) {
prefix = ', '; prefix = ', ';
} else if (/[,]$/.test(prevText)) { } else if (/[,]$/.test(prevText)) {
prefix = ' '; prefix = ' ';
} else if (/[,]\s+$/.test(prevText)) { } else if (/[,]\s+$/.test(prevText)) {
prefix = ''; prefix = '';
} else if (/\s+$/.test(prevText)) { } else if (/\s+$/.test(prevText)) {
const trimmedPrev = prevText.trimEnd(); const trimmedPrev = prevText.trimEnd();
if (trimmedPrev.length > 0 && !/[,]$/.test(trimmedPrev)) { if (trimmedPrev.length > 0 && !/[,]$/.test(trimmedPrev)) {
if (!/[,]\s*$/.test(prevText)) { if (!/[,]\s*$/.test(prevText)) {
prefix = ', '; prefix = ', ';
}
} }
}
} }
} }
if (start < len) { if (start < len) {
const nextText = textVal.slice(start); const nextText = textVal.slice(start);
if (/^[^,\s]/.test(nextText)) { if (/^[^,\s]/.test(nextText)) {
suffix = ', '; suffix = ', ';
} else if (/^\s+[^,]/.test(nextText)) { } else if (/^\s+[^,]/.test(nextText)) {
suffix = ', '; suffix = ', ';
} }
} }
const toInsert = prefix + tag + suffix; const toInsert = prefix + tag + suffix;
@@ -344,12 +344,12 @@ function unifyPriorityStyle() {
let currentWrappers = [...wrappers]; let currentWrappers = [...wrappers];
if (weight !== undefined && weight !== 1) { if (weight !== undefined && weight !== 1) {
const lastWrapper = currentWrappers[currentWrappers.length - 1]; const lastWrapper = currentWrappers[currentWrappers.length - 1];
if (lastWrapper === '()') { if (lastWrapper === '()') {
currentWrappers.pop(); currentWrappers.pop();
} }
const wStr = Number.isInteger(weight) ? weight.toString() : weight.toFixed(2).replace(/\.?0+$/, ''); const wStr = Number.isInteger(weight) ? weight.toString() : weight.toFixed(2).replace(/\.?0+$/, '');
result = `(${result}:${wStr})`; result = `(${result}:${wStr})`;
} }
return store.wrapToken(result, currentWrappers); return store.wrapToken(result, currentWrappers);
@@ -396,12 +396,12 @@ function toggleUnderscoreSpace() {
let currentWrappers = [...wrappers]; let currentWrappers = [...wrappers];
if (weight !== undefined && weight !== 1) { if (weight !== undefined && weight !== 1) {
const lastWrapper = currentWrappers[currentWrappers.length - 1]; const lastWrapper = currentWrappers[currentWrappers.length - 1];
if (lastWrapper === '()') { if (lastWrapper === '()') {
currentWrappers.pop(); currentWrappers.pop();
} }
const wStr = Number.isInteger(weight) ? weight.toString() : weight.toFixed(2).replace(/\.?0+$/, ''); const wStr = Number.isInteger(weight) ? weight.toString() : weight.toFixed(2).replace(/\.?0+$/, '');
result = `(${result}:${wStr})`; result = `(${result}:${wStr})`;
} }
return store.wrapToken(result, currentWrappers); return store.wrapToken(result, currentWrappers);
@@ -576,7 +576,7 @@ function createPointerPreview(index: number) {
preview.style.left = '0'; preview.style.left = '0';
preview.style.zIndex = '1000'; preview.style.zIndex = '1000';
preview.style.pointerEvents = 'none'; preview.style.pointerEvents = 'none';
;(preview.style as any).contain = 'layout style paint'; ; (preview.style as any).contain = 'layout style paint';
preview.style.willChange = 'transform, opacity'; preview.style.willChange = 'transform, opacity';
document.body.appendChild(preview); document.body.appendChild(preview);
dragPreview.value = preview; dragPreview.value = preview;
@@ -728,84 +728,38 @@ function isRemoveDisabled(token: string): boolean {
<template> <template>
<div class="pe-root"> <div class="pe-root">
<EditorToolbar <EditorToolbar :languages="store.languages as LangCode[]" v-model:selected-lang="selectedLang"
:languages="store.languages as LangCode[]" v-model:preset-name="presetName" v-model:selected-folder-id="selectedFolderId"
v-model:selected-lang="selectedLang" v-model:show-preset-dropdown="showPresetDropdown" :folder-tree="folderTree" :flattened-folders="flattenedFolders"
v-model:preset-name="presetName" @copy="copyLeft" @save-preset="savePreset" @preset-load="handlePresetLoad" @preset-save="handlePresetSave"
v-model:selected-folder-id="selectedFolderId" @preset-delete="handlePresetDelete" @preset-rename="handlePresetRename" />
v-model:show-preset-dropdown="showPresetDropdown"
:folder-tree="folderTree"
:flattened-folders="flattenedFolders"
@copy="copyLeft"
@save-preset="savePreset"
@preset-load="handlePresetLoad"
@preset-save="handlePresetSave"
@preset-delete="handlePresetDelete"
@preset-rename="handlePresetRename"
/>
<main class="pe-main"> <div class="pe-main">
<EditorInput <EditorInput ref="editorInputRef" v-model:text="text" v-model:priority-style="priorityStyle"
ref="editorInputRef" v-model:priority-step="priorityStep" :suggestions="suggestions"
v-model:text="text"
v-model:priority-style="priorityStyle"
v-model:priority-step="priorityStep"
:suggestions="suggestions"
:get-suggestions="(prefix, limit) => store.getSuggestions(prefix, limit)" :get-suggestions="(prefix, limit) => store.getSuggestions(prefix, limit)"
@update-suggestions="updateSuggestionsFromText" @update-suggestions="updateSuggestionsFromText" @copy="copyLeft" @replace-cn-comma="replaceCnComma"
@copy="copyLeft" @format-prompt="formatPrompt" @unify-priority="unifyPriorityStyle" @toggle-underscore="toggleUnderscoreSpace"
@replace-cn-comma="replaceCnComma" @add-tag="handleAddTag" />
@format-prompt="formatPrompt"
@unify-priority="unifyPriorityStyle"
@toggle-underscore="toggleUnderscoreSpace"
@add-tag="handleAddTag"
/>
<TokenMappingPanel <TokenMappingPanel ref="tokenMappingRef" :tokens="tokens" :selected-lang="selectedLang"
ref="tokenMappingRef" v-model:view-mode="viewMode" :dragging-index="draggingIndex" :over-index="overIndex" :insert-side="insertSide"
:tokens="tokens" :is-dragging="isDragging" :edit-suggestions="editSuggestions" :priority-style="priorityStyle"
:selected-lang="selectedLang" :display-trans="displayTrans" :is-unmapped="isUnmapped" :get-token-wrapper-info="getTokenWrapperInfo"
v-model:view-mode="viewMode" :has-weight-suffix="hasWeightSuffix" :get-suggestions="(prefix, limit) => store.getSuggestions(prefix, limit)"
:dragging-index="draggingIndex" @pointer-down="onPointerDown" @begin-edit="(i) => editingIndex = i" @commit-edit="commitEdit"
:over-index="overIndex" @cancel-edit="() => editingIndex = null" @show-add-map="showAddMap" @add-wrapper="addWrapperToToken"
:insert-side="insertSide" @remove-wrapper="removeWrapperFromToken" @remove-token="removeToken" @add-token-after="addTokenAfter"
:is-dragging="isDragging"
:edit-suggestions="editSuggestions"
:priority-style="priorityStyle"
:display-trans="displayTrans"
:is-unmapped="isUnmapped"
:get-token-wrapper-info="getTokenWrapperInfo"
:has-weight-suffix="hasWeightSuffix"
:get-suggestions="(prefix, limit) => store.getSuggestions(prefix, limit)"
@pointer-down="onPointerDown"
@begin-edit="(i) => editingIndex = i"
@commit-edit="commitEdit"
@cancel-edit="() => editingIndex = null"
@show-add-map="showAddMap"
@add-wrapper="addWrapperToToken"
@remove-wrapper="removeWrapperFromToken"
@remove-token="removeToken"
@add-token-after="addTokenAfter"
@show-translation-popup="() => { translationTargetToken = null; showTranslationPopup = true; }" @show-translation-popup="() => { translationTargetToken = null; showTranslationPopup = true; }"
@update-edit-value="updateEditSuggestionsFromValue" @update-edit-value="updateEditSuggestionsFromValue" />
/> </div>
</main>
<!-- 翻译弹窗 --> <!-- 翻译弹窗 -->
<TranslationPopup <TranslationPopup :visible="showTranslationPopup" :tokens="translationTokens" :target-lang="selectedLang"
:visible="showTranslationPopup" @close="() => { showTranslationPopup = false; translationTargetToken = null; }" @apply="handleApplyTranslation" />
:tokens="translationTokens"
:target-lang="selectedLang"
@close="() => { showTranslationPopup = false; translationTargetToken = null; }"
@apply="handleApplyTranslation"
/>
<!-- 通知组件 --> <!-- 通知组件 -->
<NotificationToast <NotificationToast :message="notification.message" :type="notification.type" :show="notification.show" />
:message="notification.message"
:type="notification.type"
:show="notification.show"
/>
</div> </div>
</template> </template>
@@ -840,5 +794,4 @@ function isRemoveDisabled(token: string): boolean {
border-bottom: 1px solid var(--color-border); border-bottom: 1px solid var(--color-border);
} }
} }
</style> </style>