Ver Fonte

[new]1.支持根据文件夹名称生成对应语言类型并解析对应的数据 2.支持watch 随时更改自动生成

zk há 6 meses atrás
pai
commit
dac9e5181a

+ 2 - 2
build.yaml

@@ -6,9 +6,9 @@ targets:
 
 
 builders:
 builders:
   string_get_runner:
   string_get_runner:
-    import: 'package:string_get_runner/string_get_runner.dart'
+    import: 'package:string_get_runner/string_xml_watcher_builder.dart'
     builder_factories: ['stringXmlWatcherBuilder']
     builder_factories: ['stringXmlWatcherBuilder']
     build_extensions:
     build_extensions:
-      "assets/string/base/*.xml": ["lib/resource/string.gen.dart"]
+      "assets/string/*/*.xml": [ "lib/resource/string.gen.dart" ]
     auto_apply: dependents
     auto_apply: dependents
     build_to: source
     build_to: source

+ 1 - 1
lib/flutter_string_get_config.dart

@@ -15,7 +15,7 @@ class FlutterStringGetConfig {
 
 
   factory FlutterStringGetConfig.defaults() {
   factory FlutterStringGetConfig.defaults() {
     return FlutterStringGetConfig(
     return FlutterStringGetConfig(
-      inputDir: 'assets/string/base/*.xml',
+      inputDir: 'assets/string/*/*.xml',
       outputFile: 'lib/resource/string.gen.dart',
       outputFile: 'lib/resource/string.gen.dart',
       language: 'zh_CN',
       language: 'zh_CN',
     );
     );

+ 0 - 111
lib/string_get_runner.dart

@@ -1,112 +1 @@
-import 'package:build/build.dart';
-import 'package:xml/xml.dart';
-import 'package:glob/glob.dart';
-import 'package:path/path.dart' as path;
 
 
-// 新增配置导入
-import 'flutter_string_get_config.dart';
-
-Builder stringXmlWatcherBuilder(BuilderOptions options) {
-  return StringXmlWatcherBuilder();
-}
-
-class StringXmlWatcherBuilder implements Builder {
-  // 从配置读取参数
-  late final FlutterStringGetConfig _config;
-  late final Glob _targetXmlGlob;
-
-  StringXmlWatcherBuilder() {
-    // 初始化时加载用户配置
-    _config = FlutterStringGetConfig.fromProject();
-
-    print('string_get_runner inputDir ${_config.inputDir}');
-    print('string_get_runner outputFile ${_config.outputFile}');
-    print('string_get_runner language ${_config.language}');
-    // 动态生成Glob监听模式
-    _targetXmlGlob = Glob(_config.inputDir);
-  }
-
-  @override
-  Future<void> build(BuildStep buildStep) async {
-    print('string_get_runner build');
-    final xmlFiles = await buildStep.findAssets(_targetXmlGlob).toList();
-    final (buffer, multiBuffer) = await _processXmlFiles(buildStep, xmlFiles);
-
-    // 使用配置中的输出路径
-    final outputId = AssetId(
-      buildStep.inputId.package,
-      _config.outputFile,
-    );
-    await buildStep.writeAsString(
-        outputId, buffer.toString() + multiBuffer.toString());
-  }
-
-  Future<(StringBuffer, StringBuffer)> _processXmlFiles(BuildStep buildStep,
-      List<AssetId> xmlFiles,) async {
-    final buffer = StringBuffer();
-    final multiBuffer = StringBuffer();
-
-    buffer.writeln('import \'package:get/get.dart\';');
-    buffer.writeln();
-    buffer.writeln('class StringName {');
-    buffer.writeln('  StringName._();');
-
-    multiBuffer.writeln('class StringMultiSource {');
-    multiBuffer.writeln('  StringMultiSource._();');
-    multiBuffer.writeln(
-        '  static const Map<String, Map<String, String>> translations = {');
-    multiBuffer.writeln('    \'${_config.language}\': {'); // 默认基准语言
-
-    // 遍历所有 XML 文件
-    for (final file in xmlFiles) {
-      try {
-        final content = await buildStep.readAsString(file);
-        final document = XmlDocument.parse(content);
-        // 遍历所有 <string> 元素
-        for (final element in document.findAllElements('string')) {
-          final name = element.getAttribute('name');
-          final value = processXmlText(element.text);
-
-          if (name != null) {
-            final camelCaseName = _toCamelCase(name);
-            buffer.writeln(
-                '  static String get $camelCaseName => \'$name\'.tr; // $value');
-            multiBuffer.writeln('      \'$name\': \'$value\',');
-          }
-        }
-      } catch (e) {
-        print('❌ (string_get_runner)Error processing file ${file.path}: $e');
-      }
-    }
-
-    multiBuffer.writeln('    },');
-    buffer.writeln('}');
-    multiBuffer.writeln('  };');
-    multiBuffer.writeln('}');
-
-    print('string_get_runner file generated successfully!');
-    return (buffer, multiBuffer);
-  }
-
-  String processXmlText(String original) {
-    return original
-        .replaceAll('\r\n', ' ')
-        .replaceAll('\n', ' ')
-        .replaceAll(RegExp(r'\s+'), ' ')
-        .trim()
-        .replaceAll("'", "\\'");
-  }
-
-  String _toCamelCase(String snakeCase) {
-    return snakeCase.split('_').map((word) {
-      if (word == snakeCase.split('_').first) return word;
-      return word[0].toUpperCase() + word.substring(1);
-    }).join('');
-  }
-
-  @override
-  Map<String, List<String>> get buildExtensions => {
-        // 动态生成扩展映射
-        r'$package$': [path.normalize(_config.outputFile)],
-      };
-}

+ 133 - 0
lib/string_xml_watcher_builder.dart

@@ -0,0 +1,133 @@
+import 'package:build/build.dart';
+import 'package:xml/xml.dart';
+import 'package:glob/glob.dart';
+import 'package:path/path.dart' as path;
+import 'flutter_string_get_config.dart';
+
+Builder stringXmlWatcherBuilder(BuilderOptions options) {
+  return StringXmlWatcherBuilder();
+}
+
+class StringXmlWatcherBuilder implements Builder {
+  late final FlutterStringGetConfig _config;
+  late final Glob _targetXmlGlob;
+
+  StringXmlWatcherBuilder() {
+    _config = FlutterStringGetConfig.fromProject();
+
+    print('string_get_runner inputDir ${_config.inputDir}');
+    print('string_get_runner outputFile ${_config.outputFile}');
+    print('string_get_runner language ${_config.language}');
+
+    _targetXmlGlob = Glob(_config.inputDir);
+  }
+
+  @override
+  Future<void> build(BuildStep buildStep) async {
+    print('string_get_runner build');
+    final xmlFiles = await buildStep.findAssets(_targetXmlGlob).toList();
+    final (buffer, multiBuffer) = await _processXmlFiles(buildStep, xmlFiles);
+
+    final outputId = AssetId(buildStep.inputId.package, _config.outputFile);
+    await buildStep.writeAsString(
+        outputId, buffer.toString() + multiBuffer.toString());
+  }
+
+  Future<(StringBuffer, StringBuffer)> _processXmlFiles(
+    BuildStep buildStep,
+    List<AssetId> xmlFiles,
+  ) async {
+    final buffer = StringBuffer();
+    final multiBuffer = StringBuffer();
+
+    buffer.writeln('import \'package:get/get.dart\';');
+    buffer.writeln();
+    buffer.writeln('class StringName {');
+    buffer.writeln('  StringName._();');
+
+    final Map<String, Map<String, String>> multiLangMap = {};
+
+    for (final file in xmlFiles) {
+      try {
+        final content = await buildStep.readAsString(file);
+        final document = XmlDocument.parse(content);
+        final languageCode = _extractLanguageCode(file.path);
+        print('languageCode :$languageCode');
+
+        multiLangMap.putIfAbsent(languageCode, () => {});
+
+        for (final element in document.findAllElements('string')) {
+          final name = element.getAttribute('name');
+          final value = processXmlText(element.text);
+
+          if (name != null) {
+            multiLangMap[languageCode]![name] = value;
+
+            if (languageCode == _config.language) {
+              final camelCaseName = _toCamelCase(name);
+              buffer.writeln(
+                '  static String get $camelCaseName => \'$name\'.tr; // $value',
+              );
+            }
+          }
+        }
+      } catch (e) {
+        print('❌(string_get_runner)Error processing file ${file.path}: $e');
+      }
+    }
+
+    buffer.writeln('}');
+
+    multiBuffer.writeln('class StringMultiSource {');
+    multiBuffer.writeln('  StringMultiSource._();');
+    multiBuffer.writeln(
+        '  static const Map<String, Map<String, String>> translations = {');
+
+    for (final entry in multiLangMap.entries) {
+      multiBuffer.writeln('    \'${entry.key}\': {');
+      for (final item in entry.value.entries) {
+        multiBuffer.writeln('      \'${item.key}\': \'${item.value}\',');
+      }
+      multiBuffer.writeln('    },');
+    }
+
+    multiBuffer.writeln('  };');
+    multiBuffer.writeln('}');
+
+    print('✅ string_get_runner file generated successfully!');
+    return (buffer, multiBuffer);
+  }
+
+  String processXmlText(String original) {
+    return original
+        .replaceAll('\r\n', ' ')
+        .replaceAll('\n', ' ')
+        .replaceAll(RegExp(r'\s+'), ' ')
+        .trim()
+        .replaceAll("'", "\\'");
+  }
+
+  String _toCamelCase(String snakeCase) {
+    return snakeCase.split('_').map((word) {
+      if (word == snakeCase.split('_').first) return word;
+      return word[0].toUpperCase() + word.substring(1);
+    }).join('');
+  }
+
+  String _extractLanguageCode(String filePath) {
+    final segments = path.split(filePath);
+    final stringIndex = segments.indexOf('string');
+
+    if (stringIndex >= 0 && stringIndex + 1 < segments.length) {
+      final langDir = segments[stringIndex + 1];
+      return langDir == 'base' ? _config.language : langDir;
+    }
+
+    return _config.language;
+  }
+
+  @override
+  Map<String, List<String>> get buildExtensions => {
+        r'$package$': [path.normalize(_config.outputFile)],
+      };
+}