private TokenMd GetWordToken(string text, int index, out int finalIndex) { var startTokenIndex = 0; Mark mark = new EmptyMark(); var isMarkToken = false; var helper = new ParseHelper(); var innerTokens = new List <TokenMd>(); finalIndex = index; var builder = new StringBuilder(); while (finalIndex < text.Length && !char.IsWhiteSpace(text[finalIndex])) { if (text[finalIndex] == '_' && IsUnderlineWithDigits(text, finalIndex)) { builder = helper.AppendSymbol(builder, text, finalIndex, out finalIndex); } if (TryFindMark(text, finalIndex, out var newMark) && newMark != mark) { mark = newMark; } if (!(mark is EmptyMark) && helper.IsSymbols(finalIndex, text, mark.AllSymbols.Last()) && isMarkToken) { builder = new StringBuilder(); innerTokens.Add(marks[mark].GetToken(text, startTokenIndex, out finalIndex)); } if (!(mark is EmptyMark) && helper.IsSymbols(finalIndex, text, mark.DefiningSymbol) && !isMarkToken) { innerTokens.Add(new TokenMd(builder.ToString(), new EmptyMark())); builder = new StringBuilder(); startTokenIndex = finalIndex; isMarkToken = true; } if (finalIndex == text.Length) { continue; } builder = helper.AppendSymbol(builder, text, finalIndex, out finalIndex); } return(innerTokens.Count > 0 ? GetTokenWithInners(innerTokens, builder) : new TokenMd(builder.ToString(), new EmptyMark())); }
public TokenMd GetToken(string text, int index, out int finalIndex) { var isEnd = false; helper = new ParseHelper(); mark = new ItalicMark(); var builder = new StringBuilder(); finalIndex = index; builder = helper.AppendMarkSymbols(builder, text, finalIndex, out finalIndex, mark.DefiningSymbol); while (finalIndex < text.Length && !helper.IsSymbols(finalIndex, text, Environment.NewLine) && !isEnd) { isEnd = text[finalIndex] == '_' && text[finalIndex - 1] != '_' && (finalIndex + 1 >= text.Length || finalIndex + 1 < text.Length && text[finalIndex + 1] != '_' && !char.IsWhiteSpace(text[finalIndex - 1])); builder = helper.AppendSymbol(builder, text, finalIndex, out finalIndex); } return(GetResultToken(builder.ToString(), isEnd)); }