示例#1
0
        public static TextNode ParseEmphasisText(Deque <Token> tokens)
        {
            var underscore = tokens.PopFirst();

            if (tokens.Count == 0)
            {
                return(ParseText(new Deque <Token> {
                    new Token(TokenType.Text, underscore.Value)
                }));
            }

            if (tokens.PeekFirst().Type == TokenType.Space)
            {
                tokens.Insert(0, new Token(TokenType.Text, underscore.Value));
                return(ParseText(tokens));
            }

            var emphasisText = new TextNode(TextType.Emphasis);

            while (true)
            {
                if (tokens.Count == 0)
                {
                    emphasisText.Words.Insert(0, new WordNode(WordType.SimpleWord, underscore.Value));
                    return(new TextNode(TextType.Text, emphasisText.Words));
                }

                var currentToken = tokens.PeekFirst();

                switch (currentToken.Type)
                {
                case TokenType.Underscore:
                    tokens.PopFirst();
                    if (emphasisText.Words.Last().Type == WordType.Space)
                    {
                        emphasisText.Words.Insert(0, new WordNode(WordType.SimpleWord, underscore.Value));
                        return(new TextNode(TextType.Text, emphasisText.Words));
                    }

                    return(emphasisText);

                case TokenType.DoubleUnderscore:
                    tokens.PopFirst();
                    var doubleUnderscore = new WordNode(WordType.SimpleWord, underscore.Value + underscore.Value);
                    emphasisText.Add(doubleUnderscore);
                    break;

                default:
                    var innerText  = ParseText(tokens);
                    var innerWords = innerText.Words;

                    emphasisText.AddRange(innerWords);
                    break;
                }
            }
        }
示例#2
0
        public static TextNode ParseBoldText(Deque <Token> tokens)
        {
            var doubleUnderscore = tokens.PopFirst();

            if (tokens.Count == 0)
            {
                return(ParseText(new Deque <Token> {
                    new Token(TokenType.Text, doubleUnderscore.Value)
                }));
            }

            if (tokens.PeekFirst().Type == TokenType.Space)
            {
                tokens.Insert(0, new Token(TokenType.Text, doubleUnderscore.Value));
                return(ParseText(tokens));
            }

            var boldText = new TextNode(TextType.Bold);

            while (true)
            {
                if (tokens.Count == 0)
                {
                    boldText.Words.Insert(0, new WordNode(WordType.SimpleWord, doubleUnderscore.Value));
                    return(new TextNode(TextType.Text, boldText.Words));
                }

                var currentToken = tokens.PeekFirst();

                switch (currentToken.Type)
                {
                case TokenType.DoubleUnderscore:
                    tokens.PopFirst();
                    if (boldText.Words.Last().Type == WordType.Space)
                    {
                        boldText.Words.Insert(0, new WordNode(WordType.SimpleWord, doubleUnderscore.Value));
                        return(new TextNode(TextType.Text, boldText.Words));
                    }

                    return(boldText);

                case TokenType.Underscore:
                    var innerEmphasisText = ParseEmphasisText(tokens);
                    if (innerEmphasisText.Type == TextType.Text)
                    {
                        boldText.AddRange(innerEmphasisText.Words);
                        continue;
                    }

                    var openEmTag  = new WordNode(WordType.SimpleWord, "<em>");
                    var closeEmTag = new WordNode(WordType.SimpleWord, "</em>");

                    boldText.Add(openEmTag);
                    boldText.AddRange(innerEmphasisText.Words);
                    boldText.Add(closeEmTag);
                    break;

                default:
                    var innerText  = ParseText(tokens);
                    var innerWords = innerText.Words;

                    boldText.AddRange(innerWords);
                    break;
                }
            }
        }