yx_icon_fonts_flutter/scripts/utils.dart

49 lines
1.8 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}