From bdc003bb326fabc155bfca483fc46c5e991b8c12 Mon Sep 17 00:00:00 2001 From: Ken Taguma Date: Mon, 4 Oct 2021 20:48:38 +0900 Subject: [PATCH] add selected text count. --- src/extension.ts | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 47f9eb5..609547e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,5 +1,5 @@ "use strict"; -import { window, Disposable, ExtensionContext, StatusBarAlignment, StatusBarItem, TextDocument } from 'vscode'; +import { window, Disposable, ExtensionContext, StatusBarAlignment, StatusBarItem, TextDocument, TextEditor, Range } from 'vscode'; export function activate(context: ExtensionContext) { let characterCounter = new CharacterCounter(); let controller = new CharacterCounterController(characterCounter); @@ -24,20 +24,33 @@ export class CharacterCounter { // Markdownとプレーンテキストの時だけカウント if (doc.languageId === "markdown" || doc.languageId === "plaintext") { let characterCount = this._getCharacterCount(doc); - this._statusBarItem.text = `$(pencil) ${characterCount} 文字`; + // 選択されているテキスト分を追加 + let selectedCharacterCount = this._getSelectedCharacterCount(editor); + this._statusBarItem.text = `$(pencil) ${characterCount} 文字 ${selectedCharacterCount} 選択`; this._statusBarItem.show(); } else { this._statusBarItem.hide(); } } - public _getCharacterCount(doc: TextDocument): number { - let docContent = doc.getText(); + public _filterUncountedCharacters(docContent: string): string{ // カウントに含めない文字を削除する docContent = docContent .replace(/\s/g, '') // すべての空白文字 .replace(/《(.+?)》/g, '') // ルビ範囲指定記号とその中の文字 .replace(/[\||]/g, ''); // ルビ開始記号 + return docContent + } + + public _getCharacterCount(doc: TextDocument): number { + let docContent = doc.getText(); + // // カウントに含めない文字を削除する + // docContent = docContent + // .replace(/\s/g, '') // すべての空白文字 + // .replace(/《(.+?)》/g, '') // ルビ範囲指定記号とその中の文字 + // .replace(/[\||]/g, ''); // ルビ開始記号 + // ↑ をメソッド化した + docContent = this._filterUncountedCharacters(docContent); let characterCount = 0; if (docContent !== "") { characterCount = docContent.length; @@ -45,6 +58,19 @@ export class CharacterCounter { return characterCount; } + public _getSelectedCharacterCount(editor: TextEditor): number { + // 選択されているテキストをカウントする + let doc = editor.document; + let characterCount = 0; + for (let i = 0; i < editor.selections.length; i++){ + let selectedRange = new Range(editor.selections[i].start, editor.selections[i].end); + let docContent = doc.getText(selectedRange); + docContent = this._filterUncountedCharacters(docContent); + characterCount += docContent.length; + } + return characterCount; + } + public dispose() { this._statusBarItem.dispose(); }