49 lines
1.8 KiB
Dart
49 lines
1.8 KiB
Dart
import 'dart:convert';
|
||
import 'dart:io';
|
||
|
||
/// 读取 iconfont.json 文件,返回解析后的 Map
|
||
Map<String, dynamic> readIconFontJson([String path = 'iconfont.json']) {
|
||
final file = File(path);
|
||
if (!file.existsSync()) {
|
||
throw Exception('未找到 $path 文件');
|
||
}
|
||
final content = file.readAsStringSync();
|
||
return json.decode(content) as Map<String, dynamic>;
|
||
}
|
||
|
||
/// 获取 glyphs 列表
|
||
List<dynamic> getGlyphs(Map<String, dynamic> iconData) {
|
||
return iconData['glyphs'] as List<dynamic>;
|
||
}
|
||
|
||
/// 下划线转驼峰命名,并处理常见特殊字符,保证 Dart 标识符合法
|
||
String toCamelCase(String input) {
|
||
String processedInput = input.replaceAll('-', '_').replaceAll('+', 'plus').replaceAll('(', '').replaceAll(')', '').replaceAll(' ', '');
|
||
final List<String> parts = processedInput.split('_');
|
||
if (parts.isEmpty) return input;
|
||
final String firstPart = parts[0];
|
||
final String remainingParts = parts.skip(1).map((part) => part.isNotEmpty ? part[0].toUpperCase() + part.substring(1) : '').join();
|
||
return firstPart + remainingParts;
|
||
}
|
||
|
||
/// Dart 标识符合法化(首字符不能为数字,不能有特殊符号)
|
||
String toLegalDartName(String input) {
|
||
String name = toCamelCase(input);
|
||
// 首字符为数字,前面加下划线
|
||
if (name.isNotEmpty && RegExp(r'^[0-9]').hasMatch(name[0])) {
|
||
name = '_$name';
|
||
}
|
||
// 只保留字母、数字和下划线
|
||
name = name.replaceAll(RegExp(r'[^a-zA-Z0-9_]'), '');
|
||
return name;
|
||
}
|
||
|
||
/// 读取 Dart 文件中已定义的静态常量名(如 static const IconData xxx = ...)
|
||
Set<String> getDefinedIconNames([String path = 'lib/src/yx_icon_fonts_data.dart']) {
|
||
final file = File(path);
|
||
if (!file.existsSync()) return {};
|
||
final content = file.readAsStringSync();
|
||
final reg = RegExp(r'static const IconData (\w+) =');
|
||
return reg.allMatches(content).map((m) => m.group(1)!).toSet();
|
||
}
|