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