svgToRegionList method

Future<List<Region>> svgToRegionList(
  1. String svg,
  2. String? pathTitle(
    1. int partId,
    2. String? defaultTitle
    )?,
  3. Color? pathColor(
    1. int partId,
    2. Color? defaultColor
    )?
)

Implementation

Future<List<Region>> svgToRegionList(
  String svg,
  String? Function(int partId, String? defaultTitle)? pathTitle,
  Color? Function(int partId, Color? defaultColor)? pathColor,
) async {
  List<Region> regionList = [];

  XmlDocument document = XmlDocument.parse(svg);
  var paths = document.findAllElements('path');

  double width = 0;
  double height = 0;
  String viewBox = '';

  if (width == 0 || height == 0) {
    var svgs = document.findAllElements('svg');
    for (var element in svgs) {
      width = double.tryParse(element.getAttribute('width').toString()) ?? 0;
      height = double.tryParse(element.getAttribute('height').toString()) ?? 0;
      viewBox = element.getAttribute('viewBox').toString();
    }
  }

  for (var element in paths) {
    String? partId = element.getAttribute('id')?.toString();
    String partPath = element.getAttribute('d').toString();
    String? title = element.getAttribute('title')?.toString();
    String? style = element.getAttribute('style')?.toString();
    var color = element.getAttribute('fill')?.toString().toColor(style);
    var strokeColor = element.getAttribute('stroke').toColor(null);
    var strokeWidth = int.tryParse(element.getAttribute('stroke-width') ?? '');

    final integerPartId = int.tryParse(partId ?? '') ?? -1;
    if (integerPartId != -1 && pathColor != null) {
      color = pathColor(integerPartId, color) ?? color;
    }
    if (integerPartId != -1 && pathTitle != null) {
      title = pathTitle(integerPartId, title) ?? title;
    }

    var region = Region(
      id: partId ?? 'nullId',
      path: parseSvgPath(partPath),
      color: color ?? Colors.transparent,
      pathString: partPath,
      title: title,
      strokeColor: strokeColor,
      strokeWidth: strokeWidth,
    );
    sizeController.addBounds(region.path.getBounds());
    regionList.add(region);
  }

  if (viewBox.isNotEmpty && viewBox.split(' ').isNotEmpty) {
    height = double.tryParse(viewBox.split(' ')[3]) ?? 0;
    width = double.tryParse(viewBox.split(' ')[2]) ?? 0;
  }
  sizeController.mapSize = Size(width, height);
  return regionList;
}