static int GetMarkupLength (string str)
{
int result = 0;
bool inTag = false, inAbbrev = false;
foreach (var ch in str) {
switch (ch) {
case '&':
inAbbrev = true;
break;
case ';':
if (!inAbbrev)
goto default;
inAbbrev = false;
break;
case '<':
inTag = true;
break;
case '>':
inTag = false;
break;
default:
if (!inTag)
result++;
break;
}
}
return result;
}