multiavatar function
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);
}