コード例 #1
0
        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()));
        }
コード例 #2
0
        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));
        }