flutter_string_get_config.dart 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import 'package:yaml/yaml.dart';
  2. import 'dart:io';
  3. import 'package:path/path.dart' as path;
  4. class FlutterStringGetConfig {
  5. String inputDir;
  6. String outputFile;
  7. String language;
  8. FlutterStringGetConfig({
  9. required this.inputDir,
  10. required this.outputFile,
  11. this.language = 'zh_CN',
  12. });
  13. factory FlutterStringGetConfig.defaults() {
  14. return FlutterStringGetConfig(
  15. inputDir: 'assets/string/base/*.xml',
  16. outputFile: 'lib/resource/string.gen.dart',
  17. language: 'zh_CN',
  18. );
  19. }
  20. factory FlutterStringGetConfig.fromProject() {
  21. try {
  22. final getConfig = FlutterStringGetConfig.defaults();
  23. final file = File('pubspec.yaml');
  24. if (!file.existsSync()) return getConfig;
  25. final yamlContent = file.readAsStringSync();
  26. final yaml = loadYaml(yamlContent);
  27. final config = yaml['flutter_string_get'];
  28. if (config == null) return getConfig;
  29. String input = _normalizePath(config['input']?.toString());
  30. String output = _normalizePath(config['output']?.toString());
  31. String language = _normalizePath(config['language']?.toString());
  32. if (input.isNotEmpty) {
  33. getConfig.inputDir = input;
  34. }
  35. if (output.isNotEmpty) {
  36. getConfig.outputFile = output;
  37. }
  38. if (language.isNotEmpty) {
  39. getConfig.language = language;
  40. }
  41. return getConfig;
  42. } catch (e) {
  43. print('Error parsing flutter_string_get config: $e');
  44. return FlutterStringGetConfig.defaults();
  45. }
  46. }
  47. static String _normalizePath(String? rawPath, {bool isDirectory = false}) {
  48. if (rawPath == null || rawPath.isEmpty) return '';
  49. // 强制替换所有反斜杠为正斜杠(跨平台兼容)
  50. final unifiedPath = rawPath.replaceAll(r'\', '/');
  51. // 保留目录末尾的斜杠
  52. bool hasTrailingSlash = unifiedPath.endsWith('/');
  53. String normalized = unifiedPath;
  54. // 仅处理路径中的 `.` 和 `..`
  55. normalized = path.posix.normalize(normalized); // 使用 posix 风格的 normalize
  56. if (isDirectory && !hasTrailingSlash) {
  57. normalized += '/';
  58. }
  59. return normalized;
  60. }
  61. }