static string FormatElement(IMarkupElement elem)
        {
            var text = elem as Text;
            if (text != null)
                return SecurityElement.Escape(text.Content.ToString());

            if (elem is Whitespace)
                return " ";

            var tag = elem as Tag;
            if (tag != null)
            {
                switch (tag.Type)
                {
                    case TagType.Opening:
                        return $"<{tag.Name}>";
                    case TagType.Closing:
                        return $"</{tag.Name}>";
                    default:
                        throw new ArgumentException($"Can't format tag with type {tag.Type}");
                }
            }

            throw new ArgumentException($"Unknown markup element {elem}");
        }
示例#2
0
        public string Render(IMarkupElement markupElement)
        {
            var content = (markupElement ?? throw new ArgumentNullException(nameof(markupElement))).Aggregate(
                new StringBuilder(),
                (result, next) => result.Append(
                    next is IMarkupElement e
                            ? Render(e)
                            : _sanitizer.Sanitize(next, _formatProvider)))
                          .ToString();

            var indent = markupElement.Parent != null;
            var placeOpeningTagOnNewLine = GetFormatting(markupElement.Name).HasFlag(MarkupFormattingOptions.PlaceOpeningTagOnNewLine) && markupElement.Parent.IsNotNull();
            var placeClosingTagOnNewLine = GetFormatting(markupElement.Name).HasFlag(MarkupFormattingOptions.PlaceClosingTagOnNewLine);
            var hasClosingTag            = GetFormatting(markupElement.Name).HasFlag(MarkupFormattingOptions.IsVoid) == false;
            var indentString             = IndentString(_formatting.IndentWidth, markupElement.Depth);

            var html =
                new StringBuilder()
                .Append(IndentTag(placeOpeningTagOnNewLine, indent, indentString))
                .Append(RenderOpeningTag(markupElement.Name, markupElement.Attributes))
                .AppendWhen(() => hasClosingTag, sb => sb
                            .Append(content)
                            .Append(IndentTag(placeClosingTagOnNewLine, indent, indentString))
                            .Append(RenderClosingTag(markupElement.Name)));

            return(html.ToString());
        }
 static bool IsThereWordBreak(IMarkupElement elem, bool atTheEnd)
 {
     if (elem is Whitespace)
         return true;
     var text = elem as Text;
     if (text != null && text.Content.Length >= 1)
     {
         var adjacentChar = text.Content[atTheEnd ? text.Content.Length - 1 : 0];
         return !char.IsLetterOrDigit(adjacentChar);
     }
     return false;
 }