in sources/Google.Solutions.Mvvm/Format/MarkdownDocument.cs [467:534]
public static IEnumerable<Token> Tokenize(string text)
{
var textStart = -1;
for (var i = 0; i < text.Length; i++)
{
switch (text[i])
{
case '*':
{
if (textStart >= 0 && i - textStart > 0)
{
//
// Flush previous text token, if non-empty.
//
yield return new Token(TokenType.Text, text.Substring(textStart, i - textStart));
textStart = -1;
}
if (i + 1 < text.Length && text[i + 1] == '*')
{
i++;
yield return new Token(TokenType.Delimiter, "**");
}
else
{
yield return new Token(TokenType.Delimiter, "*");
}
break;
}
case '_':
case '`':
case '[':
case ']':
case '(':
case ')':
//
// Delimiter.
//
if (textStart >= 0 && i - textStart > 0)
{
//
// Flush previous text token, if non-empty.
//
yield return new Token(TokenType.Text, text.Substring(textStart, i - textStart));
textStart = -1;
}
yield return new Token(TokenType.Delimiter, text[i].ToString());
break;
default:
//
// Text.
//
if (textStart == -1)
{
textStart = i;
}
break;
}
}
if (textStart >= 0)
{
yield return new Token(TokenType.Text, text.Substring(textStart));
}
}