public static IEnumerable Tokenize()

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