string_resource_builder.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import 'dart:async';
  2. import 'dart:io';
  3. import 'package:build/build.dart';
  4. import 'package:xml/xml.dart';
  5. const baseType = 'zh_CN';
  6. Builder builds(BuilderOptions options) => StringResourceBuilder();
  7. class StringResourceBuilder implements Builder {
  8. @override
  9. Future<void> build(BuildStep buildStep) async {
  10. generateStringResources();
  11. }
  12. @override
  13. Map<String, List<String>> get buildExtensions => {
  14. '.xml': ['.s.dart'],
  15. };
  16. }
  17. void main() {
  18. generateStringResources();
  19. }
  20. void generateStringResources() {
  21. print('generateStringResources...start');
  22. final directory = Directory('assets/string/');
  23. final buffer = StringBuffer();
  24. final multiBuffer = StringBuffer();
  25. buffer.writeln('import \'package:get/get.dart\';');
  26. buffer.writeln();
  27. buffer.writeln('class StringName {');
  28. buffer.writeln('StringName._();');
  29. multiBuffer.writeln('class StringMultiSource {');
  30. multiBuffer.writeln('StringMultiSource._();');
  31. multiBuffer
  32. .writeln(' static const Map<String, Map<String, String>> values = {');
  33. directory.listSync(recursive: true).forEach((element) {
  34. if (element is Directory) {
  35. final files =
  36. element.listSync().where((file) => file.path.endsWith('.xml'));
  37. bool isBase = element.path.endsWith('base');
  38. String node = isBase ? baseType : element.path.split('/').last;
  39. for (var file in files) {
  40. final content = File(file.path).readAsStringSync();
  41. final document = XmlDocument.parse(content);
  42. final strings = document.findAllElements('string');
  43. multiBuffer.writeln(' \'$node\': {');
  44. for (var string in strings) {
  45. final name = string.getAttribute('name');
  46. String value = string.text;
  47. if (string.text.contains('\r\n')) {
  48. value = string.text.replaceAll('\r\n', '').trim();
  49. }
  50. if (isBase) {
  51. final camelCaseName = toCamelCase(name);
  52. buffer.writeln(
  53. ' static final String $camelCaseName = \'$name\'.tr;// $value');
  54. }
  55. multiBuffer.writeln(' \'$name\': \'$value\',');
  56. }
  57. multiBuffer.writeln(' },');
  58. }
  59. }
  60. });
  61. multiBuffer.writeln(' };');
  62. multiBuffer.writeln('}');
  63. buffer.writeln('}');
  64. buffer.writeln();
  65. buffer.writeln(multiBuffer.toString());
  66. createDirectory('lib/resource');
  67. final outputFile = File('lib/resource/string.gen.dart');
  68. outputFile.writeAsStringSync(buffer.toString());
  69. print('Strings file generated successfully!');
  70. }
  71. void createDirectory(String path) {
  72. final directory = Directory(path);
  73. if (!directory.existsSync()) {
  74. directory.createSync(recursive: true);
  75. print('Directory created: $path');
  76. }
  77. }
  78. String toCamelCase(String? snakeCase) {
  79. if (snakeCase == null) {
  80. return '';
  81. }
  82. return snakeCase.split('_').map((word) {
  83. if (word == snakeCase.split('_').first) {
  84. return word;
  85. } else {
  86. return word[0].toUpperCase() + word.substring(1);
  87. }
  88. }).join('');
  89. }