parseStyle method

Map<String, dynamic> parseStyle(
  1. XmlElement node,
  2. Map<String, dynamic> style
)

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