From 5e609e9619a56229b311e193cc2687aa12684488 Mon Sep 17 00:00:00 2001 From: hejl Date: Wed, 14 May 2025 13:55:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E4=BB=B6=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/app/providers/editor_provider.dart | 2 +- .../lib/app/providers/tab_provider.dart | 2 +- .../lib/app/services/search_in_filies.dart | 93 +++++++++++++++++++ .../lib/app/widgets/file_explorer.dart | 2 - win_text_editor/pubspec.lock | 20 +++- win_text_editor/pubspec.yaml | 1 + win_text_editor/windows/CMakeLists.txt | 9 ++ 7 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 win_text_editor/lib/app/services/search_in_filies.dart diff --git a/win_text_editor/lib/app/providers/editor_provider.dart b/win_text_editor/lib/app/providers/editor_provider.dart index 7d84b06..014855e 100644 --- a/win_text_editor/lib/app/providers/editor_provider.dart +++ b/win_text_editor/lib/app/providers/editor_provider.dart @@ -104,7 +104,7 @@ class EditorProvider with ChangeNotifier { if (!_tabLoadingStates[tabId]!) break; // 检查是否取消 final chunkLines = lines.sublist(i, min(i + linesPerChunk, lines.length)); - _tabs[index].chunks!.addAll(chunkLines); + _tabs[index].chunks.addAll(chunkLines); notifyListeners(); await Future.delayed(Duration.zero); // 让UI更新 diff --git a/win_text_editor/lib/app/providers/tab_provider.dart b/win_text_editor/lib/app/providers/tab_provider.dart index 170c000..0dca06a 100644 --- a/win_text_editor/lib/app/providers/tab_provider.dart +++ b/win_text_editor/lib/app/providers/tab_provider.dart @@ -53,7 +53,7 @@ class TabProvider with ChangeNotifier { try { return _tabs.firstWhere((tab) => tab.id == tabId); } catch (e) { - Logger().error("找不到选项卡: ${tabId}", source: 'EditorProvider'); + Logger().error("找不到选项卡: $tabId", source: 'EditorProvider'); return null; } } diff --git a/win_text_editor/lib/app/services/search_in_filies.dart b/win_text_editor/lib/app/services/search_in_filies.dart new file mode 100644 index 0000000..d27cdc5 --- /dev/null +++ b/win_text_editor/lib/app/services/search_in_filies.dart @@ -0,0 +1,93 @@ +import 'dart:io'; +import 'dart:collection'; + +Future> searchInFiles({ + required String folderPath, + required String filePattern, + required List searchTerms, + required bool caseSensitive, + required bool wholeWord, +}) async { + // 初始化结果映射,默认所有搜索词出现0次 + final result = HashMap( + equals: caseSensitive ? null : (a, b) => a.toLowerCase() == b.toLowerCase(), + hashCode: caseSensitive ? null : (s) => s.toLowerCase().hashCode, + ); + + for (final term in searchTerms) { + result[term] = 0; + } + + // 获取文件夹下所有匹配的文件 + final dir = Directory(folderPath); + if (!await dir.exists()) { + throw ArgumentError('Directory does not exist: $folderPath'); + } + + final files = await dir.list() + .where((entity) => entity is File) + .cast() + .where((file) => _matchesPattern(file.path, filePattern)) + .toList(); + + // 为每个搜索词构建正则表达式 + final regexMap = {}; + for (final term in searchTerms) { + final pattern = wholeWord + ? r'(? count == 0); + + return result; +} + +bool _matchesPattern(String fileName, String pattern) { + // 简单的通配符匹配实现(支持 *.txt 这样的简单模式) + if (pattern == '*') return true; + if (pattern.startsWith('*.')) { + final ext = pattern.substring(1); + return fileName.toLowerCase().endsWith(ext.toLowerCase()); + } + // 更复杂的模式可以在这里扩展 + return RegExp(pattern.replaceAll('.', r'\.').replaceAll('*', '.*'), + caseSensitive: false).hasMatch(fileName); +} + +// 使用示例 +void main() async { + final result = await searchInFiles( + folderPath: '/path/to/your/folder', + filePattern: '*.txt', // 或者 '*.dart' 等 + searchTerms: ['Flutter', 'Dart', 'widget', 'main'], + caseSensitive: false, + wholeWord: true, + ); + + print('Search results:'); + result.forEach((term, count) { + print('$term: $count'); + }); +} \ No newline at end of file diff --git a/win_text_editor/lib/app/widgets/file_explorer.dart b/win_text_editor/lib/app/widgets/file_explorer.dart index c742659..e5e2b85 100644 --- a/win_text_editor/lib/app/widgets/file_explorer.dart +++ b/win_text_editor/lib/app/widgets/file_explorer.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; @@ -8,7 +7,6 @@ import 'package:win_text_editor/app/providers/tab_provider.dart'; import '../models/file_node.dart'; import '../providers/file_provider.dart'; -import '../providers/editor_provider.dart'; import 'dart:math'; diff --git a/win_text_editor/pubspec.lock b/win_text_editor/pubspec.lock index 472d483..52de851 100644 --- a/win_text_editor/pubspec.lock +++ b/win_text_editor/pubspec.lock @@ -117,10 +117,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: a222f231db4f822fc49e3b753674bda630e981873c84bf8604bceeb77fce0b24 + sha256: dd51fd20fdc45e073529c102376d54deba3e120603fe711c848ce44575b838e6 url: "https://pub.flutter-io.cn" source: hosted - version: "10.1.7" + version: "10.1.8" flutter: dependency: "direct main" description: flutter @@ -280,6 +280,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.1.0" platform: dependency: transitive description: @@ -413,6 +421,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" + xml: + dependency: "direct main" + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.5.0" sdks: dart: ">=3.7.0 <4.0.0" flutter: ">=3.27.0" diff --git a/win_text_editor/pubspec.yaml b/win_text_editor/pubspec.yaml index 9f92ed6..9c7b411 100644 --- a/win_text_editor/pubspec.yaml +++ b/win_text_editor/pubspec.yaml @@ -17,6 +17,7 @@ dependencies: flutter_syntax_view: ^4.1.7 expandable: ^5.0.1 collection: ^1.17.0 + xml: ^6.4.0 dev_dependencies: flutter_test: diff --git a/win_text_editor/windows/CMakeLists.txt b/win_text_editor/windows/CMakeLists.txt index fbd1f3c..99dbf6d 100644 --- a/win_text_editor/windows/CMakeLists.txt +++ b/win_text_editor/windows/CMakeLists.txt @@ -2,6 +2,15 @@ cmake_minimum_required(VERSION 3.14) project(win_text_editor LANGUAGES CXX) +if(MSVC) + # 设置静态链接 CRT(避免依赖 MSVCRT.dll) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + add_compile_options( + $<$:/MT$<$:d>> + $<$:/MT$<$:d>> + ) +endif() + # The name of the executable created for the application. Change this to change # the on-disk name of your application. set(BINARY_NAME "win_text_editor")