string_get_runner.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import 'package:build/build.dart';
  2. import 'package:xml/xml.dart';
  3. import 'package:glob/glob.dart';
  4. Builder stringXmlWatcherBuilder(BuilderOptions options) {
  5. return StringXmlWatcherBuilder();
  6. }
  7. class StringXmlWatcherBuilder implements Builder {
  8. static const _baseType = 'zh_CN';
  9. static final _targetXmlGlob = Glob('assets/string/base/*.xml');
  10. @override
  11. Future<void> build(BuildStep buildStep) async {
  12. final xmlFiles = await buildStep.findAssets(_targetXmlGlob).toList();
  13. final (buffer, multiBuffer) = await _processXmlFiles(buildStep, xmlFiles);
  14. final outputId = AssetId(
  15. buildStep.inputId.package,
  16. 'lib/resource/string.gen.dart',
  17. );
  18. await buildStep.writeAsString(outputId, buffer.toString() + multiBuffer.toString());
  19. }
  20. Future<(StringBuffer, StringBuffer)> _processXmlFiles(
  21. BuildStep buildStep,
  22. List<AssetId> xmlFiles,
  23. ) async {
  24. final buffer = StringBuffer();
  25. final multiBuffer = StringBuffer();
  26. buffer.writeln('import \'package:get/get.dart\';');
  27. buffer.writeln();
  28. buffer.writeln('class StringName {');
  29. buffer.writeln(' StringName._();');
  30. multiBuffer.writeln('class StringMultiSource {');
  31. multiBuffer.writeln(' StringMultiSource._();');
  32. multiBuffer.writeln(' static const Map<String, Map<String, String>> values = {');
  33. multiBuffer.writeln(' \'${_baseType}\': {');
  34. for (final file in xmlFiles) {
  35. final content = await buildStep.readAsString(file);
  36. final document = XmlDocument.parse(content);
  37. for (final element in document.findAllElements('string')) {
  38. final name = element.getAttribute('name');
  39. final value = _sanitizeValue(element.text);
  40. if (name != null) {
  41. final camelCaseName = _toCamelCase(name);
  42. buffer.writeln(
  43. ' static final String $camelCaseName = \'$name\'.tr;// $value');
  44. multiBuffer.writeln(' \'$name\': \'$value\',');
  45. }
  46. }
  47. }
  48. multiBuffer.writeln(' },');
  49. buffer.writeln('}');
  50. multiBuffer.writeln(' };');
  51. multiBuffer.writeln('}');
  52. return (buffer, multiBuffer);
  53. }
  54. String _sanitizeValue(String value) => value.replaceAll('\r\n', '').trim();
  55. String _toCamelCase(String snakeCase) {
  56. return snakeCase.split('_').map((word) {
  57. if (word == snakeCase.split('_').first) return word;
  58. return word[0].toUpperCase() + word.substring(1);
  59. }).join('');
  60. }
  61. @override
  62. Map<String, List<String>> get buildExtensions => {
  63. r'$package$': ['lib/resource/string.gen.dart'],
  64. };
  65. }