Browse Source

文件名称翻译完成。

master
hejl 2 months ago
parent
commit
6ab4a2786e
  1. 74
      win_text_editor/lib/framework/services/fast_xml_parser.dart
  2. 65
      win_text_editor/lib/framework/services/file_service.dart

74
win_text_editor/lib/framework/services/fast_xml_parser.dart

@ -0,0 +1,74 @@ @@ -0,0 +1,74 @@
import 'dart:convert';
import 'dart:io';
import 'package:xml/xml.dart';
class FastXmlParser {
/// XML文件根节点属性
static Future<List<Map<String, String>>> batchParse(
List<String> filePaths, {
int maxFastParseBytes = 1024,
}) async {
return await Future.wait(filePaths.map((path) => _parseWithFallback(path, maxFastParseBytes)));
}
static Future<Map<String, String>> parse(String filePath, {int maxFastParseBytes = 512}) async {
return _parseWithFallback(filePath, maxFastParseBytes);
}
///
static Future<Map<String, String>> _parseWithFallback(String path, int maxBytes) async {
try {
//
return await _fastParseRootAttributes(path, maxBytes);
} catch (e) {
// DOM解析
return await _domParseRootAttributes(path);
}
}
///
static Future<Map<String, String>> _fastParseRootAttributes(String path, int maxBytes) async {
final file = File(path);
final raf = await file.open();
try {
//
final buffer = await raf.read(maxBytes);
final content = utf8.decode(buffer);
// 使
final startTag = RegExp(
r'(?:<\?xml[^?>]*\?>[\s\r\n]*)?<([^\s>]+)([^>]*)>',
caseSensitive: false,
).firstMatch(content);
if (startTag == null) throw Exception('No start tag found');
final attrs = _parseAttributes(startTag.group(2)!);
return _extractRequiredAttributes(attrs);
} finally {
await raf.close();
}
}
/// DOM解析降级方案
static Future<Map<String, String>> _domParseRootAttributes(String path) async {
final content = await File(path).readAsString();
final document = XmlDocument.parse(content);
final attrs = document.rootElement.attributes.fold<Map<String, String>>(
{},
(map, attr) => map..[attr.name.qualified] = attr.value,
);
return _extractRequiredAttributes(attrs);
}
///
static Map<String, String> _parseAttributes(String attrStr) {
return RegExp(r'(\w+)="([^"]*)"')
.allMatches(attrStr)
.fold<Map<String, String>>({}, (map, match) => map..[match.group(1)!] = match.group(2)!);
}
///
static Map<String, String> _extractRequiredAttributes(Map<String, String> attrs) {
return {'chineseName': attrs['chineseName'] ?? '', 'objectId': attrs['objectId'] ?? ''};
}
}

65
win_text_editor/lib/framework/services/file_service.dart

@ -1,32 +1,63 @@ @@ -1,32 +1,63 @@
import 'dart:io';
import 'package:win_text_editor/framework/controllers/logger.dart';
import 'package:win_text_editor/framework/models/file_node.dart';
import 'package:win_text_editor/framework/services/fast_xml_parser.dart';
import 'package:xml/xml.dart';
class FileService {
static const _specialExtensions = [
'.uftfunction',
'.uftservice',
'.uftatomfunction',
'.uftatomservice',
'.uftfactorfunction',
'.uftfactorservice',
'.uftstructure',
];
static Future<String?> getSpecialFileName(String filePath) async {
final extension = filePath.substring(filePath.lastIndexOf('.'));
if (!_specialExtensions.contains(extension)) {
return null;
}
try {
final result = await FastXmlParser.parse(filePath);
return ('[${result['objectId']}]${result['chineseName']}');
} catch (e) {
Logger().debug('Error reading special file: $e');
}
return null;
}
///
static Future<List<FileNode>> listDirectory(String path, {int parentDepth = 0}) async {
final dir = Directory(path);
final List<FileSystemEntity> entities = await dir.list().toList();
final dir = Directory(path);
final List<FileSystemEntity> entities = await dir.list().toList();
final List<FileNode> nodes = [];
// final stopwatch = Stopwatch()..start();
for (final entity in entities) {
final isDirectory = await FileSystemEntity.isDirectory(entity.path);
final displayName = isDirectory
? await getModuleDisplayName(entity.path)
: null;
nodes.add(FileNode(
name: displayName ?? entity.path.split(Platform.pathSeparator).last,
path: entity.path,
isDirectory: isDirectory,
depth: parentDepth + 1,
));
}
for (final entity in entities) {
final isDirectory = await FileSystemEntity.isDirectory(entity.path);
final displayName =
isDirectory
? await getModuleDisplayName(entity.path)
: await getSpecialFileName(entity.path);
return nodes;
}
nodes.add(
FileNode(
name: displayName ?? entity.path.split(Platform.pathSeparator).last,
path: entity.path,
isDirectory: isDirectory,
depth: parentDepth + 1,
),
);
}
// stopwatch.stop();
// Logger().debug('执行耗时: ${stopwatch.elapsedMilliseconds} 毫秒 (ms)');
return nodes;
}
static Future<String?> getModuleDisplayName(String dirPath) async {
try {

Loading…
Cancel
Save