import 'package:yaml/yaml.dart'; import 'dart:io'; import 'package:path/path.dart' as path; class FlutterStringGetConfig { String inputDir; String outputFile; String language; FlutterStringGetConfig({ required this.inputDir, required this.outputFile, this.language = 'zh_CN', }); factory FlutterStringGetConfig.defaults() { return FlutterStringGetConfig( inputDir: 'assets/string/base/*.xml', outputFile: 'lib/resource/string.gen.dart', language: 'zh_CN', ); } factory FlutterStringGetConfig.fromProject() { try { final getConfig = FlutterStringGetConfig.defaults(); final file = File('pubspec.yaml'); if (!file.existsSync()) return getConfig; final yamlContent = file.readAsStringSync(); final yaml = loadYaml(yamlContent); final config = yaml['flutter_string_get']; if (config == null) return getConfig; String input = _normalizePath(config['input']?.toString()); String output = _normalizePath(config['output']?.toString()); String language = _normalizePath(config['language']?.toString()); if (input.isNotEmpty) { getConfig.inputDir = input; } if (output.isNotEmpty) { getConfig.outputFile = output; } if (language.isNotEmpty) { getConfig.language = language; } return getConfig; } catch (e) { print('Error parsing flutter_string_get config: $e'); return FlutterStringGetConfig.defaults(); } } static String _normalizePath(String? rawPath, {bool isDirectory = false}) { if (rawPath == null || rawPath.isEmpty) return ''; // 强制替换所有反斜杠为正斜杠(跨平台兼容) final unifiedPath = rawPath.replaceAll(r'\', '/'); // 保留目录末尾的斜杠 bool hasTrailingSlash = unifiedPath.endsWith('/'); String normalized = unifiedPath; // 仅处理路径中的 `.` 和 `..` normalized = path.posix.normalize(normalized); // 使用 posix 风格的 normalize if (isDirectory && !hasTrailingSlash) { normalized += '/'; } return normalized; } }