convert method
Converts from HTML-escaped data
to unescaped string.
Implementation
@override
String convert(String data) {
// Return early if possible.
if (!data.contains('&')) return data;
final buf = StringBuffer();
var offset = 0;
while (true) {
final nextAmp = data.indexOf('&', offset);
if (nextAmp == -1) {
// Rest of string.
buf.write(data.substring(offset));
break;
}
buf.write(data.substring(offset, nextAmp));
offset = nextAmp;
final chunk =
data.substring(offset, min(data.length, offset + _chunkLength));
// Try { and ÿ
if (chunk.length > _minDecimalEscapeLength &&
chunk.codeUnitAt(1) == _hashCodeUnit) {
final nextSemicolon = chunk.indexOf(';');
if (nextSemicolon != -1) {
final hex = chunk.codeUnitAt(2) == _xCodeUnit;
final str = chunk.substring(hex ? 3 : 2, nextSemicolon);
final ord = int.tryParse(str, radix: hex ? 16 : 10) ?? -1;
if (ord != -1) {
buf.write(String.fromCharCode(ord));
offset += nextSemicolon + 1;
continue;
}
}
}
// Try
var replaced = false;
for (var i = 0; i < keys.length; i++) {
final key = keys[i];
if (chunk.startsWith(key)) {
final replacement = values[i];
buf.write(replacement);
offset += key.length;
replaced = true;
break;
}
}
if (!replaced) {
buf.write('&');
offset += 1;
}
}
return buf.toString();
}