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 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 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> values = {'); multiBuffer.writeln(' \'${_config.language}\': {'); // 默认基准语言 // 遍历所有 XML 文件 for (final file in xmlFiles) { try { final content = await buildStep.readAsString(file); final document = XmlDocument.parse(content); // 遍历所有 元素 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 final String $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> get buildExtensions => { // 动态生成扩展映射 r'$package$': [path.normalize(_config.outputFile)], }; }