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