| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- 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>> values = {');
- 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 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<String, List<String>> get buildExtensions => {
- // 动态生成扩展映射
- r'$package$': [path.normalize(_config.outputFile)],
- };
- }
|