private string ScanTagUri(string head, Mark start)
{
var tag = new StringBuilder();
if (head != null && head.Length > 1)
{
tag.Append(head.Substring(1));
}
// Scan the tag.
// The set of characters that may appear in URI is as follows:
// '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
// '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
// '%'.
while (analyzer.IsAlphaNumericDashOrUnderscore() || analyzer.Check(";/?:@&=+$,.!~*'()[]%"))
{
// Check if it is a URI-escape sequence.
if (analyzer.Check('%'))
{
tag.Append(ScanUriEscapes(start));
}
else if (analyzer.Check('+'))
{
tag.Append(' ');
Skip();
}
else
{
tag.Append(ReadCurrentCharacter());
}
}
// Check if the tag is non-empty.
if (tag.Length == 0)
{
throw new SyntaxErrorException(start, cursor.Mark(), "While parsing a tag, did not find expected tag URI.");
}
return tag.ToString();
}