multiavatar function

String multiavatar(
  1. String string, {
  2. bool transparentBackground = false,
})

Returns the SVG markup for the avatar derived from string.

The same string always produces the same avatar. Returns an empty string when string is empty. Set transparentBackground to true to omit the circular background.

Implementation

String multiavatar(String string, {bool transparentBackground = false}) {
  string += '';

  String hash = '';
  if (string.length == 0) return hash;

  List<int> bytes1 = utf8.encode(string);
  Digest sha256Hash = sha256.convert(bytes1);
  String sha256Numbers =
      sha256Hash.toString().replaceAll(RegExp(r'[^0-9]'), '');

  hash = sha256Numbers.substring(0, 12);

  Map<dynamic, dynamic> p = {};

  p['env'] = hash[0] + '' + hash[1];
  p['env'] = ((47 / 100) * int.parse(p['env'])).round().toString() + '';

  p['clo'] = hash[2] + '' + hash[3];
  p['clo'] = ((47 / 100) * int.parse(p['clo'])).round().toString() + '';

  p['head'] = hash[4] + '' + hash[5];
  p['head'] = ((47 / 100) * int.parse(p['head'])).round().toString() + '';

  p['mouth'] = hash[6] + '' + hash[7];
  p['mouth'] = ((47 / 100) * int.parse(p['mouth'])).round().toString() + '';

  p['eyes'] = hash[8] + '' + hash[9];
  p['eyes'] = ((47 / 100) * int.parse(p['eyes'])).round().toString() + '';

  p['top'] = hash[10] + '' + hash[11];
  p['top'] = ((47 / 100) * int.parse(p['top'])).round().toString() + '';

  for (var part in p.keys) {
    var nr = p[part];

    if (int.parse(nr) > 31) {
      nr = (int.parse(nr) - 32).toString() + '';
      if (nr.length == 1) nr = '0' + nr;
      p[part] = nr + 'C';
    } else if (int.parse(nr) > 15) {
      nr = (int.parse(nr) - 16).toString() + '';
      if (nr.length == 1) nr = '0' + nr;
      p[part] = nr + 'B';
    } else {
      if ((nr + '').length == 1)
        p[part] = '0' + nr + 'A';
      else
        p[part] = nr + 'A';
    }
  }

  String getFinal(part, partV, theme) {
    List<String?>? colors = _themes[partV]?[theme]?[part];
    String? svgString = _sP[partV]?[part];

    String regex = r"(#.*?;)";
    String resultFinal = svgString ?? "";

    final List<String?>? result = RegExp(regex)
        .allMatches(svgString ?? "")
        .toList()
        .map((e) => e.group(1))
        .toList();
    // print(result);

    for (var i = 0; i < (result?.length ?? 0);  i++) {
      // print("change: ${result[i]} ===> with: ${colors[i]}");
      resultFinal =
          resultFinal.replaceFirst(result?[i] ?? "", (colors?[i] ?? "") + ';');
    }

    return resultFinal;
  }

  Map<dynamic, dynamic> _final = {};

  for (var part in p.keys) {
    var partV = p[part].substring(0, 2);
    var theme = p[part].substring(2, 3);

    _final[part] = getFinal(part, partV, theme);
  }

  if (transparentBackground) _final['env'] = '';

  return (_svgStart +
      _final['env'] +
      _final['head'] +
      _final['clo'] +
      _final['top'] +
      _final['eyes'] +
      _final['mouth'] +
      _svgEnd);
}