parseStyle method
Implementation
Map<String, dynamic> parseStyle(XmlElement node, Map<String,dynamic> style) {
// style = Object.assign( {}, style );
// clone style
Map<String, dynamic> style2 = <String, dynamic>{};
style2.addAll(style);
final stylesheetStyles = {};
final ngac = node.getAttribute('class');
if (ngac != null) {
final reg = RegExp(r"\s");
final classSelectors = ngac.split(reg)
// .filter( Boolean )
.map((i) => i.trim())
.toList();
for (int i = 0; i < classSelectors.length; i++) {
// stylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '.' + classSelectors[ i ] ] );
stylesheetStyles.addAll(stylesheets['.${classSelectors[i]}'] ?? {});
}
}
final ngaid = node.getAttribute('id');
if (ngaid != null) {
// stylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '#' + node.getAttribute( 'id' ) ] );
stylesheetStyles.addAll(stylesheets['#${ngaid}'] ?? {});
}
void addStyle(String svgName, String jsName, [adjustFunction]) {
adjustFunction ??= (v) {
if (v.startsWith('url')) {
console.info('SVGLoader: url access in attributes is not implemented.');
}
return v;
};
final ngasvgName = node.getAttribute(svgName);
if (ngasvgName != null) {
style2[jsName] = adjustFunction(ngasvgName);
}
if (stylesheetStyles[svgName] != null) {
style2[jsName] = adjustFunction(stylesheetStyles[svgName]);
}
// 1. Get the current style attribute value
String? currentStyle = node.getAttribute('style');
if (currentStyle != null) {
// 2. Parse and modify the CSS string manually
// This is a simplified example; for complex CSS, you might need a dedicated CSS parsing library
final List<String> styleProperties = currentStyle.split(';').map((s) => s.trim()).toList();
for (final prop in styleProperties) {
if (prop.isNotEmpty) {
final parts = prop.split(':').map((s) => s.trim()).toList();
if (parts.length == 2 && parts[1] != 'none') {
style2[parts[0]] = adjustFunction(parts[1]);
break;
}
}
}
}
}
num clamp(String? v) {
return math.max<num>(0, math.min(1, parseFloatWithUnits(v)));
}
num positive(String? v) {
return math.max<num>(0, parseFloatWithUnits(v));
}
addStyle('fill', 'fill');
addStyle('fill-opacity', 'fillOpacity', clamp);
addStyle('fill-rule', 'fillRule');
addStyle('opacity', 'opacity', clamp);
addStyle('stroke', 'stroke');
addStyle('stroke-opacity', 'strokeOpacity', clamp);
addStyle('stroke-width', 'strokeWidth', positive);
addStyle('stroke-linejoin', 'strokeLineJoin');
addStyle('stroke-linecap', 'strokeLineCap');
addStyle('stroke-miterlimit', 'strokeMiterLimit', positive);
addStyle('visibility', 'visibility');
return style2;
}