From 47efcf56f5f4300a355ccba154eba8e8ac6970f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E5=B0=8F=E5=A2=A8?= <2291200076@qq.com> Date: Tue, 9 Apr 2024 14:09:56 +0800 Subject: [PATCH] =?UTF-8?q?QuickPick=20=E5=BC=B9=E7=AA=97=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E9=80=89=E5=8C=BA=E5=88=86=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../editor-submenu-handler.ts | 5 ++ src/extension-handler/quick-pick-handler.ts | 54 +++++++++++-------- src/main-code/transform.ts | 27 ++++++++-- src/type-definition/QuickPickItemExType.ts | 2 +- 5 files changed, 61 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index a13c57c..7a36e74 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Or right-click on the selected text -> Convert string to... | 功能 Feature | 快捷键 shortcut key | | ------------------------------------------------ | ------------------- | -| 变量转换 快速选择 QuickPick | | +| 变量转换 快速选择 QuickPick | Shift + Alt + T | | 循环转换→上一个 Cyclic conversion → Previous one | Ctrl + Alt + [ | | 循环转换→下一个 Cyclic conversion → Next one | Ctrl + Alt + ] | diff --git a/src/extension-handler/editor-submenu-handler.ts b/src/extension-handler/editor-submenu-handler.ts index b4df17f..2c599ae 100644 --- a/src/extension-handler/editor-submenu-handler.ts +++ b/src/extension-handler/editor-submenu-handler.ts @@ -24,6 +24,11 @@ const handleEditorReplace = (targetCase: SupportCase) => { // 获取选中的文本 const textList = selections.map(selection => document.getText(selection)); + if (textList.filter(text => text.length > 0).length === 0) { + vscode.window.showInformationMessage('请选择需要转换的变量后重试\nPlease select the variable you want to convert and try again.'); + return; + } + // 转换文本 const convertedList = textList.map(text => caseConversion(targetCase, text, eol)); console.log('convertedList', convertedList); diff --git a/src/extension-handler/quick-pick-handler.ts b/src/extension-handler/quick-pick-handler.ts index b0b9855..693cf67 100644 --- a/src/extension-handler/quick-pick-handler.ts +++ b/src/extension-handler/quick-pick-handler.ts @@ -2,14 +2,15 @@ import * as vscode from 'vscode'; import QuickPickItemEx from "../type-definition/QuickPickItemExType"; import { quickPickSupportCases } from '../type-definition/SupportCaseType'; import { TransformTextResult } from '../type-definition/TransformTextResultType'; -import { transformMutliLineText } from '../main-code/transform'; +import { transformMutliLineText, transformMutliSelectionText } from '../main-code/transform'; import { EOL } from '../type-definition/EOLType'; import { caseConversion } from '../main-code/conversion'; +import { isStringArrayEqual } from '../main-code/utils'; const QuickPickLabelMaxLength = 60; interface RecommendItem { - conversionText: string + conversionText: Array transforTo: string[] keyword: string[] } @@ -17,18 +18,24 @@ interface RecommendItem { /** * 弹出的提示 */ -function generateOptionsBasedOnText(text: string, eol: EOL): Array { +function generateOptionsBasedOnText(textList: string[], eol: EOL): Array { // Cut text 切割文本 - const results: Array = transformMutliLineText(text); + const resultsList: Array = transformMutliSelectionText(textList); const mergeResultList: Array = []; for (const quickPick of quickPickSupportCases) { - const conversionResult: string = caseConversion(quickPick.type, text, eol, results); - const recommendItem: RecommendItem | undefined = mergeResultList.find(item => item.conversionText === conversionResult); + const conversionResults: Array = []; + for (let i = 0; i < textList.length; i++) { + const text = textList[i]; + const results = resultsList[i]; + const conversionResult: string = caseConversion(quickPick.type, text, eol, results); + conversionResults.push(conversionResult); + } + const recommendItem: RecommendItem | undefined = mergeResultList.find(item => isStringArrayEqual(item.conversionText, conversionResults)); if (recommendItem === undefined) { let item: RecommendItem = { - conversionText: conversionResult, + conversionText: conversionResults, transforTo: [quickPick.shortName], // quickPick.name keyword: quickPick.keyword, }; @@ -52,10 +59,10 @@ function generateOptionsBasedOnText(text: string, eol: EOL): Array= QuickPickLabelMaxLength ? (conversionTextForDisplay.substring(0, QuickPickLabelMaxLength - 3) + '...') @@ -76,20 +83,20 @@ export function handleQuickPick() { return; } - let document = editor.document; - let selection = editor.selection; - let eol: EOL = document.eol === vscode.EndOfLine.CRLF ? '\r\n' : '\n'; + const document = editor.document; + const selections = editor.selections; + const eol: EOL = document.eol === vscode.EndOfLine.CRLF ? '\r\n' : '\n'; // 获取选中的文本 - let text = document.getText(selection); + const textList = selections.map(selection => document.getText(selection)); - if (text.length === 0) { + if (textList.filter(text => text.length > 0).length === 0) { vscode.window.showInformationMessage('请选择需要转换的变量后重试\nPlease select the variable you want to convert and try again.'); return; } // 基于选中的文本生成选项 - const options = generateOptionsBasedOnText(text, eol); + const options = generateOptionsBasedOnText(textList, eol); // 显示推荐项列表 vscode.window.showQuickPick(options, { matchOnDetail: true, @@ -100,21 +107,22 @@ export function handleQuickPick() { return; } - // 处理用户的选择 - // vscode.window.showInformationMessage(`你选择了: ${JSON.stringify(selection)}`); - - const converted = pickItem.value; + const convertedList = pickItem.value; // 当转换后文本与转换前相同时,跳过转换,避免形成 Ctrl + Z 撤销历史记录 - if (converted === text) { + if (isStringArrayEqual(convertedList, textList)) { console.log('selection text is same to converted text, skip replace contents.'); return; } // 替换文本 - console.log('replace selection text', text, 'to', converted); + console.log('replace selection text', textList, 'to', convertedList); editor.edit(editBuilder => { - editBuilder.replace(selection, converted); + for (let i = 0; i < selections.length; i++) { + const selection = selections[i]; + const converted = convertedList[i]; + editBuilder.replace(selection, converted); + } }); }); -} \ No newline at end of file +} diff --git a/src/main-code/transform.ts b/src/main-code/transform.ts index 9eaa0dc..0026bc9 100644 --- a/src/main-code/transform.ts +++ b/src/main-code/transform.ts @@ -2,17 +2,36 @@ import { TransformTextResult } from "../type-definition/TransformTextResultType" const logDebugInfo = false; -export function transformMutliLineText(multilineInput: string): Array { - const results: Array = []; - const lines = multilineInput.split(/\r?\n/); +/** + * 多选区分词 + * + * @param multiSelectionInputs + * @returns + * @since 2024-04-03 + */ +export function transformMutliSelectionText(selectionInputs: string[]): Array { + return selectionInputs.map(selectionInput => transformMutliLineText(selectionInput)); +} + +/** + * 多行内容分词(单一选区) + * + * @param multiLineInput + * @returns + * @since 2024-04-03 + */ +export function transformMutliLineText(multiLineInput: string): TransformTextResult[] { + const results: TransformTextResult[] = []; + const lines = multiLineInput.split(/\r?\n/); for (const line of lines) { // console.log('line', '->' + line + '<-'); results.push(transformText(line)); } return results; } + /** - * 分词 + * 独立段落单元分词 (不包含换行) * * @param str * @since 2024-04-02 diff --git a/src/type-definition/QuickPickItemExType.ts b/src/type-definition/QuickPickItemExType.ts index 115e130..38d442a 100644 --- a/src/type-definition/QuickPickItemExType.ts +++ b/src/type-definition/QuickPickItemExType.ts @@ -1,7 +1,7 @@ import * as vscode from 'vscode'; interface ExtendedQuickPickItem extends vscode.QuickPickItem { - value: string; + value: string[]; } // type QuickPickItemEx = ExtendedQuickPickItem | vscode.QuickPickItem;