miuixParsePath function
从 SVG 风格的路径数据字符串解析出 Path。
用于扩展图标(miuix-icons,156×5 个变体):Kotlin 端的 PathNode 列表在生成时
被压成紧凑字符串,运行时由本函数还原,避免每个图标产出大量 Dart 代码。
支持的命令(仅绝对坐标,与 miuix 扩展图标一致):
M x y 移动、L x y 直线、Q x1 y1 x y 二次贝塞尔、
C x1 y1 x2 y2 x y 三次贝塞尔、Z 闭合。数字以空白分隔,命令字母单独成 token。
注意:Compose 的 HorizontalTo/VerticalTo 在生成阶段已被展开为完整的 L x y
(生成器跟踪当前点),因此这里无需处理 H/V。fillType 默认非零环绕(NonZero)。
Implementation
Path miuixParsePath(String data, {PathFillType fillType = PathFillType.nonZero}) {
final path = Path()..fillType = fillType;
final tokens = data.split(RegExp(r'\s+')).where((t) => t.isNotEmpty).toList();
int i = 0;
double num() => double.parse(tokens[i++]);
while (i < tokens.length) {
final cmd = tokens[i++];
switch (cmd) {
case 'M':
path.moveTo(num(), num());
case 'L':
path.lineTo(num(), num());
case 'Q':
path.quadraticBezierTo(num(), num(), num(), num());
case 'C':
path.cubicTo(num(), num(), num(), num(), num(), num());
case 'Z':
path.close();
default:
throw FormatException('miuixParsePath: 未知命令 "$cmd"', data);
}
}
return path;
}