From 5a2f030c1840a5cda514819340ac4252dadef354 Mon Sep 17 00:00:00 2001 From: hejl Date: Fri, 27 Jun 2025 15:54:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=86=85=E5=AE=B9=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E7=89=88=E6=9C=AC=E5=B8=83=E5=B1=80=EF=BC=8C=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E5=8C=B9=E9=85=8D=EF=BC=8C=E4=BA=8C=E8=BF=9B=E5=88=B6?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/framework/widgets/app_scaffold.dart | 66 +++++- .../framework/widgets/file_explorer_pane.dart | 15 +- .../content_search/models/search_result.dart | 3 + .../services/base_search_service.dart | 106 ++++++++- .../widgets/search_settings.dart | 24 +- .../lib/shared/base/my_sf_data_source.dart | 24 +- win_text_editor/pubspec.lock | 212 +++++++++++------- win_text_editor/pubspec.yaml | 2 + 8 files changed, 347 insertions(+), 105 deletions(-) diff --git a/win_text_editor/lib/framework/widgets/app_scaffold.dart b/win_text_editor/lib/framework/widgets/app_scaffold.dart index 872be02..468b895 100644 --- a/win_text_editor/lib/framework/widgets/app_scaffold.dart +++ b/win_text_editor/lib/framework/widgets/app_scaffold.dart @@ -9,16 +9,23 @@ import 'package:win_text_editor/framework/widgets/console_panel.dart'; import 'package:win_text_editor/modules/outline/controllers/outline_provider.dart'; import 'package:win_text_editor/modules/outline/widgets/outline_explorer.dart'; -class AppScaffold extends StatelessWidget { +class AppScaffold extends StatefulWidget { const AppScaffold({super.key}); + @override + State createState() => _AppScaffoldState(); +} + +class _AppScaffoldState extends State { + bool _isFileExplorerCollapsed = false; // 控制文件树是否折叠 + @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => FileProvider()), ChangeNotifierProvider(create: (_) => TabItemsController()), - ChangeNotifierProvider(create: (_) => OutlineProvider()), // Add OutlineProvider + ChangeNotifierProvider(create: (_) => OutlineProvider()), ], child: Scaffold( backgroundColor: Colors.grey[100], @@ -28,14 +35,52 @@ class AppScaffold extends StatelessWidget { Expanded( child: Row( children: [ - // 左侧文件树 - 传递双击事件回调 - Consumer( - builder: (context, tabManager, child) { - return FileExplorerPane( - onFileDoubleTap: (path) => tabManager.handleFileDoubleTap(path, null), - onFolderDoubleTap: (path) => tabManager.handleFolderDoubleTap(path), - ); - }, + // 文件树视图(可折叠) + AnimatedContainer( + duration: const Duration(milliseconds: 200), + width: _isFileExplorerCollapsed ? 48 : 200, + child: Material( + elevation: 2, + child: Column( + children: [ + // 折叠状态:显示展开按钮 + if (_isFileExplorerCollapsed) + InkWell( + onTap: () { + setState(() { + _isFileExplorerCollapsed = false; + }); + }, + child: Container( + height: 40, + alignment: Alignment.center, + child: const Icon(Icons.chevron_right, size: 20), + ), + ), + // 展开状态:显示文件树 + if (!_isFileExplorerCollapsed) + Expanded( + child: Consumer( + builder: (context, tabManager, child) { + return FileExplorerPane( + onFileDoubleTap: + (path) => tabManager.handleFileDoubleTap(path, null), + onFolderDoubleTap: (path) { + if (path == 'toggle_collapse') { + setState(() { + _isFileExplorerCollapsed = true; + }); + } else { + tabManager.handleFolderDoubleTap(path); + } + }, + ); + }, + ), + ), + ], + ), + ), ), // 主内容区 Expanded( @@ -56,7 +101,6 @@ class AppScaffold extends StatelessWidget { tabManager.handleFileDoubleTap(path, appendArg); }, onFolderDoubleTap: (path) { - // Handle folder double tap if needed tabManager.handleFolderDoubleTap(path); }, ); diff --git a/win_text_editor/lib/framework/widgets/file_explorer_pane.dart b/win_text_editor/lib/framework/widgets/file_explorer_pane.dart index 73af2a7..75b7a2e 100644 --- a/win_text_editor/lib/framework/widgets/file_explorer_pane.dart +++ b/win_text_editor/lib/framework/widgets/file_explorer_pane.dart @@ -49,11 +49,22 @@ class FileExplorerPane extends StatelessWidget { ), child: Row( children: [ - const Text('文件资源管理器', style: TextStyle(fontWeight: FontWeight.bold)), + // 新增:折叠按钮 + IconButton( + icon: const Icon(Icons.chevron_left, size: 20), + tooltip: '折叠', + onPressed: () { + // 通过回调通知父组件折叠状态变化 + if (onFolderDoubleTap != null) { + onFolderDoubleTap!('toggle_collapse'); + } + }, + ), + const Text('项目资源管理器', style: TextStyle(fontWeight: FontWeight.bold)), const Spacer(), IconButton( icon: const Icon(Icons.folder_open, size: 20), - tooltip: '打开文件夹', + tooltip: '打开项目文件夹', onPressed: () => _openDirectory(context), ), ], diff --git a/win_text_editor/lib/modules/content_search/models/search_result.dart b/win_text_editor/lib/modules/content_search/models/search_result.dart index ac8a7fd..1cc714b 100644 --- a/win_text_editor/lib/modules/content_search/models/search_result.dart +++ b/win_text_editor/lib/modules/content_search/models/search_result.dart @@ -18,4 +18,7 @@ class SearchResult implements SelectableItem { required this.queryTerm, this.isSelected = false, }); + + @override + String toString() => lineContent; } diff --git a/win_text_editor/lib/modules/content_search/services/base_search_service.dart b/win_text_editor/lib/modules/content_search/services/base_search_service.dart index bcfb806..4d6313d 100644 --- a/win_text_editor/lib/modules/content_search/services/base_search_service.dart +++ b/win_text_editor/lib/modules/content_search/services/base_search_service.dart @@ -1,6 +1,11 @@ // lib/app/modules/content_search/services/base_search_service.dart import 'dart:io'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; import 'package:win_text_editor/shared/utils/file_utils.dart'; +import 'package:docx_to_text/docx_to_text.dart'; +import 'dart:convert'; +import 'package:flutter_charset_detector/flutter_charset_detector.dart'; typedef ProgressCallback = void Function(double progress); typedef FileProcessor = Future Function(File file, String content); @@ -27,6 +32,9 @@ abstract class BaseSearchService { if (shouldStop?.call() == true) return; if (entity is! File || !FileUtils.matchesFileType(entity.path, fileType)) continue; + // 1. 过滤二进制文件(通过文件头或扩展名) + if (fileType != 'docx' && await _isBinaryFile(entity)) continue; + processedFiles++; final progress = (processedFiles / totalFiles) * 99 + 1; if (progress - oldProgress >= 1) { @@ -34,13 +42,107 @@ abstract class BaseSearchService { onProgress?.call(progress); } - final content = await entity.readAsString(); - await onFile(entity, content); + try { + // 2. 自动识别文本编码 + final content = await _readFileWithEncoding(entity); + await onFile(entity, content); + } catch (e) { + // 3. 尝试解析docx等文档 + if (fileType == 'docx') { + final docxContent = await _extractTextFromDocx(entity); + if (docxContent != null) { + await onFile(entity, docxContent); + } + } + continue; // 跳过无法解析的文件 + } } onProgress?.call(100); } + static Future _readFileWithEncoding(File file) async { + try { + final bytes = await file.readAsBytes(); + + // 检测文件编码(返回编码名称,如 'UTF-8') + DecodingResult result = await CharsetDetector.autoDecode(bytes); + final encodingName = result.charset.toLowerCase(); + + // 转换为 Dart 的 Encoding 对象 + final encoding = _getEncodingFromName(encodingName); + return encoding.decode(bytes); + } catch (e) { + // 回退到UTF-8解码(兼容性处理) + return utf8.decode(await file.readAsBytes(), allowMalformed: true); + } + } + + /// 将编码名称映射为 Dart 的 Encoding 对象 + static Encoding _getEncodingFromName(String name) { + return Encoding.getByName(name) ?? latin1; + } + + static Future _extractTextFromDocx(File file) async { + try { + final bytes = await file.readAsBytes(); + return docxToText(bytes); + } catch (e) { + return null; + } + } + + static Future _isBinaryFile(File file, {int sampleSize = 512}) async { + if (isBinaryFileByExtension(file.path)) return true; + + final bytes = await file.openRead().take(sampleSize).expand((chunk) => chunk).toList(); + + if (await isBinaryFileByHeader(bytes)) return true; + + // 再检查内容 + return await isLikelyBinary(bytes); + } + + static bool isBinaryFileByExtension(String filePath) { + final binaryExtensions = [ + '.png', '.jpg', '.jpeg', '.gif', '.bmp', // 图片 + '.mp4', '.avi', '.mov', '.mkv', // 视频 + '.zip', '.rar', '.7z', '.tar', '.gz', // 压缩包 + '.exe', '.dll', '.so', '.a', // 可执行文件 + ]; + return binaryExtensions.any((ext) => filePath.toLowerCase().endsWith(ext)); + } + + static Future isBinaryFileByHeader(List bytes) async { + // 常见二进制文件头 + final magicNumbers = { + 'PNG': [0x89, 0x50, 0x4E, 0x47], + 'JPEG': [0xFF, 0xD8, 0xFF], + 'GIF': [0x47, 0x49, 0x46], + 'ZIP': [0x50, 0x4B, 0x03, 0x04], + 'MP4': [0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70], + }; + + return magicNumbers.values.any( + (header) => + bytes.length >= header.length && + const ListEquality().equals(bytes.sublist(0, header.length), header), + ); + } + + static Future isLikelyBinary(List bytes) async { + int controlChars = 0; + for (final byte in bytes) { + // 统计不可打印ASCII控制字符(排除换行/制表符) + if (byte < 32 && byte != 9 && byte != 10 && byte != 13) { + controlChars++; + // 发现少量控制字符即可判定为二进制 + if (controlChars > 5) return true; // 阈值可根据需求调整 + } + } + return false; + } + /// 以下为静态工具方法(被所有服务共享) static List splitQuery(String query) { return query diff --git a/win_text_editor/lib/modules/content_search/widgets/search_settings.dart b/win_text_editor/lib/modules/content_search/widgets/search_settings.dart index 23a6891..bf8a30b 100644 --- a/win_text_editor/lib/modules/content_search/widgets/search_settings.dart +++ b/win_text_editor/lib/modules/content_search/widgets/search_settings.dart @@ -75,21 +75,23 @@ class _SearchSettingsState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ // 搜索内容框 (保持原样) - SizedBox( - width: MediaQuery.of(context).size.width * 0.5, - height: 360, - child: TextEditor( - tabId: 'search_content_${controller.hashCode}', - title: '搜索内容[列表以换行或半角逗号分隔]', - initialContent: controller.searchQuery, // 绑定到控制器的状态 - onContentChanged: (content) { - controller.searchQuery = content; // 实时同步内容到控制器 - }, + Expanded( + child: SizedBox( + height: 360, + child: TextEditor( + tabId: 'search_content_${controller.hashCode}', + title: '搜索内容[列表以换行或半角逗号分隔]', + initialContent: controller.searchQuery, // 绑定到控制器的状态 + onContentChanged: (content) { + controller.searchQuery = content; // 实时同步内容到控制器 + }, + ), ), ), const SizedBox(width: 8), // 设置按钮区域 - Expanded( + SizedBox( + width: 310, child: Container( height: 360, decoration: BoxDecoration( diff --git a/win_text_editor/lib/shared/base/my_sf_data_source.dart b/win_text_editor/lib/shared/base/my_sf_data_source.dart index 56900d6..ce00c96 100644 --- a/win_text_editor/lib/shared/base/my_sf_data_source.dart +++ b/win_text_editor/lib/shared/base/my_sf_data_source.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:win_text_editor/shared/base/selectable_data_source.dart'; @@ -23,7 +24,28 @@ abstract class MySfDataSource extends SelectableDataSo (cell) => cell.columnName == columnName, orElse: () => throw Exception('Column not found'), ); - await Clipboard.setData(ClipboardData(text: cell.value.toString())); + + String displayText; + if (cell.value is Widget) { + // 情况1:单元格是Widget(需手动提取文本,例如从Text widget) + final widget = cell.value as Widget; + displayText = _extractTextFromWidget(widget); // 自定义方法 + } else { + // 情况2:普通单元格 + displayText = cell.value?.toString() ?? ''; + } + + await Clipboard.setData(ClipboardData(text: displayText)); + } + + /// 从Widget中提取文本(示例) + String _extractTextFromWidget(Widget widget) { + if (widget is Text) { + return widget.data ?? ''; + } else if (widget is RichText) { + return widget.text.toPlainText(); + } + return widget.toString(); // 兜底 } Future copyRowValues(DataGridRow row) async { diff --git a/win_text_editor/pubspec.lock b/win_text_editor/pubspec.lock index b2c8a0b..dafab35 100644 --- a/win_text_editor/pubspec.lock +++ b/win_text_editor/pubspec.lock @@ -1,12 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" async: dependency: transitive description: name: async sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.12.0" bitsdojo_window: @@ -14,7 +22,7 @@ packages: description: name: bitsdojo_window sha256: "88ef7765dafe52d97d7a3684960fb5d003e3151e662c18645c1641c22b873195" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.6" bitsdojo_window_linux: @@ -22,7 +30,7 @@ packages: description: name: bitsdojo_window_linux sha256: "9519c0614f98be733e0b1b7cb15b827007886f6fe36a4fb62cf3d35b9dd578ab" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.4" bitsdojo_window_macos: @@ -30,7 +38,7 @@ packages: description: name: bitsdojo_window_macos sha256: f7c5be82e74568c68c5b8449e2c5d8fd12ec195ecd70745a7b9c0f802bb0268f - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.4" bitsdojo_window_platform_interface: @@ -38,7 +46,7 @@ packages: description: name: bitsdojo_window_platform_interface sha256: "65daa015a0c6dba749bdd35a0f092e7a8ba8b0766aa0480eb3ef808086f6e27c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.2" bitsdojo_window_windows: @@ -46,7 +54,7 @@ packages: description: name: bitsdojo_window_windows sha256: fa982cf61ede53f483e50b257344a1c250af231a3cdc93a7064dd6dc0d720b68 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.6" boolean_selector: @@ -54,7 +62,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" characters: @@ -62,7 +70,7 @@ packages: description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" clock: @@ -70,7 +78,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.2" collection: @@ -78,7 +86,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.19.1" cross_file: @@ -86,7 +94,7 @@ packages: description: name: cross_file sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.3.4+2" crypto: @@ -94,7 +102,7 @@ packages: description: name: crypto sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.6" csv: @@ -102,15 +110,23 @@ packages: description: name: csv sha256: c6aa2679b2a18cb57652920f674488d89712efaf4d3fdf2e537215b35fc19d6c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.0.0" + docx_to_text: + dependency: "direct main" + description: + name: docx_to_text + sha256: d94e199bf9f36321cbd7701f82ce4874d7b94fd362a007fd4923ba9d57794664 + url: "https://pub.dev" + source: hosted + version: "1.0.1" expandable: dependency: "direct main" description: name: expandable sha256: "9604d612d4d1146dafa96c6d8eec9c2ff0994658d6d09fed720ab788c7f5afc2" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.0.1" fake_async: @@ -118,7 +134,7 @@ packages: description: name: fake_async sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.2" ffi: @@ -126,7 +142,7 @@ packages: description: name: ffi sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" file: @@ -134,7 +150,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.1" file_picker: @@ -142,7 +158,7 @@ packages: description: name: file_picker sha256: ef9908739bdd9c476353d6adff72e88fd00c625f5b959ae23f7567bd5137db0a - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "10.2.0" flutter: @@ -150,12 +166,52 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_charset_detector: + dependency: "direct main" + description: + name: flutter_charset_detector + sha256: "21f6fe8172fbfe3ba9d2fe0dba3702ba07f682315e829a68d49185a0c80d5ad0" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_charset_detector_android: + dependency: transitive + description: + name: flutter_charset_detector_android + sha256: "443145e8fc8515b3b32aee375691e40dd59197a86a2ae153166bc88c8200d83b" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + flutter_charset_detector_darwin: + dependency: transitive + description: + name: flutter_charset_detector_darwin + sha256: daac20390275efb92fbb14350fe11286c5e29c7b80d6b0867f52d760f0d69763 + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter_charset_detector_platform_interface: + dependency: transitive + description: + name: flutter_charset_detector_platform_interface + sha256: "1c09ed7b314a5a9dde76057b98b7d35458ba881eed03d5e5b6f7f74b4869d18c" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter_charset_detector_web: + dependency: transitive + description: + name: flutter_charset_detector_web + sha256: e3ac65f94b12f4887937b21a19365d7927db816840cb93274e3861241cb0e9f2 + url: "https://pub.dev" + source: hosted + version: "2.0.0" flutter_js: dependency: "direct main" description: name: flutter_js sha256: "0d22d73a474b5b80c3ab5508e7c3eab6fb20beea9dec45bbd21088cfd27a5e61" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.3" flutter_lints: @@ -163,7 +219,7 @@ packages: description: name: flutter_lints sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.3" flutter_plugin_android_lifecycle: @@ -171,7 +227,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.28" flutter_syntax_view: @@ -179,7 +235,7 @@ packages: description: name: flutter_syntax_view sha256: c5017bbedfdcf538daba765e16541fcb26434071655ca00cea7cbc205a70246a - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.7" flutter_test: @@ -192,7 +248,7 @@ packages: description: name: flutter_treeview sha256: ce7a66452e02877700890cb674773ea0af28d914192acfb5bf55a50ce35b5819 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.7+1" flutter_web_plugins: @@ -205,7 +261,7 @@ packages: description: name: hive sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.3" hive_flutter: @@ -213,7 +269,7 @@ packages: description: name: hive_flutter sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" http: @@ -221,7 +277,7 @@ packages: description: name: http sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" http_parser: @@ -229,7 +285,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.2" intl: @@ -237,7 +293,7 @@ packages: description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.19.0" jieba_flutter: @@ -245,7 +301,7 @@ packages: description: name: jieba_flutter sha256: "01d645633a05c67e526d165b3d17343b99acf77afd2230f699cc587705247fd6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.0" leak_tracker: @@ -253,7 +309,7 @@ packages: description: name: leak_tracker sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "10.0.8" leak_tracker_flutter_testing: @@ -261,7 +317,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.9" leak_tracker_testing: @@ -269,7 +325,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.1" lints: @@ -277,7 +333,7 @@ packages: description: name: lints sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" matcher: @@ -285,7 +341,7 @@ packages: description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.12.17" material_color_utilities: @@ -293,7 +349,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.11.1" meta: @@ -301,7 +357,7 @@ packages: description: name: meta sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.16.0" mustache_template: @@ -309,7 +365,7 @@ packages: description: name: mustache_template sha256: a46e26f91445bfb0b60519be280555b06792460b27b19e2b19ad5b9740df5d1c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.0" nested: @@ -317,7 +373,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.0" path: @@ -325,7 +381,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.9.1" path_provider: @@ -333,7 +389,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.5" path_provider_android: @@ -341,7 +397,7 @@ packages: description: name: path_provider_android sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.17" path_provider_foundation: @@ -349,7 +405,7 @@ packages: description: name: path_provider_foundation sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" path_provider_linux: @@ -357,7 +413,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -365,7 +421,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" path_provider_windows: @@ -373,7 +429,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.0" petitparser: @@ -381,7 +437,7 @@ packages: description: name: petitparser sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.1.0" platform: @@ -389,7 +445,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.6" plugin_platform_interface: @@ -397,7 +453,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.8" pluto_grid: @@ -405,7 +461,7 @@ packages: description: name: pluto_grid sha256: "1d4cd9d2652742b556aa9b3230cc64672a3f63c34a9acc80fef794ab36ad903b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.0.0" provider: @@ -413,7 +469,7 @@ packages: description: name: provider sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.1.5" quiver: @@ -421,7 +477,7 @@ packages: description: name: quiver sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.2" rxdart: @@ -429,7 +485,7 @@ packages: description: name: rxdart sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.27.7" screen_retriever: @@ -437,7 +493,7 @@ packages: description: name: screen_retriever sha256: "6ee02c8a1158e6dae7ca430da79436e3b1c9563c8cf02f524af997c201ac2b90" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.9" shared_preferences: @@ -445,7 +501,7 @@ packages: description: name: shared_preferences sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.3" shared_preferences_android: @@ -453,7 +509,7 @@ packages: description: name: shared_preferences_android sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.10" shared_preferences_foundation: @@ -461,7 +517,7 @@ packages: description: name: shared_preferences_foundation sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.4" shared_preferences_linux: @@ -469,7 +525,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -477,7 +533,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" shared_preferences_web: @@ -485,7 +541,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.3" shared_preferences_windows: @@ -493,7 +549,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" sky_engine: @@ -506,7 +562,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.10.1" stack_trace: @@ -514,7 +570,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.12.1" stream_channel: @@ -522,7 +578,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" string_scanner: @@ -530,7 +586,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.1" sync_http: @@ -538,7 +594,7 @@ packages: description: name: sync_http sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.3.1" syncfusion_flutter_core: @@ -546,7 +602,7 @@ packages: description: name: syncfusion_flutter_core sha256: a2427697bfad5b611db78ea4c4daef82d3350b83c729a8dc37959662a31547f9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "23.2.7" syncfusion_flutter_datagrid: @@ -554,7 +610,7 @@ packages: description: name: syncfusion_flutter_datagrid sha256: "9f621f6344d2ed7ea3a8d0ff5c145c174f1e227d6d8851290591ceb718e44600" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "23.2.7" term_glyph: @@ -562,7 +618,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.2" test_api: @@ -570,7 +626,7 @@ packages: description: name: test_api sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.7.4" typed_data: @@ -578,7 +634,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" vector_math: @@ -586,7 +642,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" vm_service: @@ -594,7 +650,7 @@ packages: description: name: vm_service sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "14.3.1" web: @@ -602,7 +658,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" win32: @@ -610,7 +666,7 @@ packages: description: name: win32 sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.13.0" window_manager: @@ -618,7 +674,7 @@ packages: description: name: window_manager sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.3.9" xdg_directories: @@ -626,7 +682,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" xml: @@ -634,7 +690,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.5.0" yaml: @@ -642,7 +698,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.3" sdks: diff --git a/win_text_editor/pubspec.yaml b/win_text_editor/pubspec.yaml index 5d9cd99..c6d3115 100644 --- a/win_text_editor/pubspec.yaml +++ b/win_text_editor/pubspec.yaml @@ -31,6 +31,8 @@ dependencies: jieba_flutter: ^0.2.0 flutter_treeview: ^1.0.7+1 quiver: ^3.2.2 + flutter_charset_detector: ^5.0.0 + docx_to_text: ^1.0.1 dev_dependencies: flutter_test: