Exemple #1
0
        private static string ParseLine(string markdown)
        {
            var isInsideEmTags  = false;
            var strongTagsPairs = new Stack <(Marker, Marker)>();
            var line            = markdown;

            var tagStack = new Stack <Marker>();

            for (var i = 0; i < line.Length; i++)
            {
                if (line[i] == '\\')
                {
                    line = line.Remove(i, 1);
                    i++;
                }

                var tag = Marker.CreateTag(line, i);

                if (tag == null)
                {
                    continue;
                }
                i += tag.Length - 1;

                if (Marker.IsClosingTag(line, tag.Pos) &&
                    tagStack.Any(openTag => openTag.Type == tag.Type))
                {
                    var tags = Marker.GetTagsPair(line, tag, tagStack);
                    if (tags.openingTag.Type == MarkerType.Em)
                    {
                        isInsideEmTags = false;
                        strongTagsPairs.Clear();
                    }
                    else if (tags.openingTag.Type == MarkerType.Strong && isInsideEmTags)
                    {
                        strongTagsPairs.Push(tags);
                        continue;
                    }

                    line = Marker.ConvertToHtmlTag(line, tags.openingTag, tags.closingTag);
                }

                else if (Marker.IsOpeningTag(line, tag.Pos))
                {
                    if (tag.Type == MarkerType.Em)
                    {
                        isInsideEmTags = true;
                        line           = ConvertStrongTagFromStack(strongTagsPairs, line);
                    }

                    tagStack.Push(tag);
                }
            }

            line = ConvertStrongTagFromStack(strongTagsPairs, line);
            return(line);
        }
        public static string Parse(string markdown)
        {
            var line = markdown;

            var stackTag = new Stack <Marker>();

            for (var i = 0; i < line.Length; i++)
            {
                if (line[i] == '\\')
                {
                    line = line.Remove(i, 1);
                    continue;
                }
                if (!Marker.TryCreateTag(line, i,
                                         stackTag.Count > 0 ? stackTag.Peek() : null,
                                         out var tag))
                {
                    continue;
                }

                i += tag.Length - 1;

                if (Marker.IsClosingTag(line, tag.Pos) && stackTag.Any(openTag => openTag.Type == tag.Type) && !IsRepeatTag(tag, stackTag.Peek()))
                {
                    var tags = Marker.GetTagsPair(tag, stackTag);
                    line = Marker.ConvertToHtmlTag(line, tags.openingTag, tags.closingTag);
                }

                else if (Marker.IsOpeningTag(line, tag.Pos))
                {
                    stackTag.Push(tag);
                    if (tag.Type == MarkerType.Code)
                    {
                        i = SkipCode(line, i);
                    }
                }
            }
            return(line);
        }
Exemple #3
0
 public bool IsClosingTag_Tests(string line, int pos)
 {
     return(Marker.IsClosingTag(line, pos));
 }