yx_icon_fonts_flutter/scripts/generate_example.dart

97 lines
3.4 KiB
Dart

import 'dart:io';
import 'utils.dart';
/// 自动生成示例内容的脚本
///
/// 使用方法:
/// dart scripts/generate_example.dart
void main() {
final iconData = readIconFontJson();
final glyphs = getGlyphs(iconData);
// 读取已定义的 YXIconFonts 静态常量
final definedIcons = getDefinedIconNames();
// 生成 icons.dart
_generateIconsFile(glyphs, definedIcons);
print('✅ 成功生成示例应用文件');
print('📁 生成的文件:');
print(' - example/lib/icons.dart');
}
/// 生成 icons.dart 文件
void _generateIconsFile(List<dynamic> glyphs, Set<String> definedIcons) {
final buffer = StringBuffer();
buffer.writeln("import 'package:yx_icon_fonts/yx_icon_fonts.dart';");
buffer.writeln("import 'package:yx_icon_fonts_example/example_icon.dart';");
buffer.writeln();
buffer.writeln("// 此文件由脚本自动生成!");
buffer.writeln();
buffer.writeln("final icons = <ExampleIcon>[");
// 按类别分组图标
final categories = <String, List<Map<String, dynamic>>>{};
for (final glyph in glyphs) {
final name = glyph['font_class'] as String;
final unicodeDecimal = glyph['unicode_decimal'] as int;
String category = '其他图标';
if (name.contains('msg')) {
category = '消息相关图标';
} else if (name.contains('arrow')) {
category = '箭头相关图标';
} else if (name.contains('edit')) {
category = '编辑相关图标';
} else if (name.contains('me_')) {
category = '个人中心相关图标';
} else if (name.contains('team') || name.contains('student')) {
category = '团队和用户相关图标';
} else if (name.contains('filter') || name.contains('question') || name.contains('onlysee') || name.contains('hint') || name.contains('switch')) {
category = '功能图标';
} else if (name.contains('delete')) {
category = '删除相关图标';
} else if (name.contains('more')) {
category = '更多和菜单相关图标';
} else if (name.contains('quit')) {
category = '退出相关图标';
} else if (name.contains('copy')) {
category = '复制相关图标';
} else if (name.contains('calendar')) {
category = '日历相关图标';
} else if (name.contains('share')) {
category = '分享相关图标';
} else if (name.contains('add') || name.contains('+')) {
category = '添加相关图标';
} else if (name.contains('keyboard')) {
category = '键盘相关图标';
} else if (name.contains('-')) {
category = '特殊字符图标';
}
categories.putIfAbsent(category, () => []);
categories[category]!.add({
'name': name,
'unicodeDecimal': unicodeDecimal,
});
}
// 生成图标列表
for (final category in categories.keys) {
buffer.writeln(" // $category");
for (final icon in categories[category]!) {
final name = icon['name'] as String;
final camelCaseName = toLegalDartName(name);
if (!definedIcons.contains(camelCaseName)) continue; // 跳过未定义的
final displayName = _getDisplayName(name);
buffer.writeln(" ExampleIcon(YXIconFonts.$camelCaseName, '$displayName'),");
}
buffer.writeln();
}
buffer.writeln("];");
final file = File('example/lib/icons.dart');
file.writeAsStringSync(buffer.toString());
}
/// 获取展示用名称
String _getDisplayName(String name) {
return name.replaceAll('_', ' ');
}