protected override void Write(XamlMarkdownWriter renderer, LinkInline link) { var url = link.GetDynamicUrl != null?link.GetDynamicUrl() ?? link.Url : link.Url; if (link.IsImage) { if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute)) { url = "#"; } renderer.WriteStartObject(typeof(Image)); renderer.WriteResourceMember(null, MarkdownXamlStyle.Image); if (!String.IsNullOrEmpty(link.Title)) { renderer.WriteMember(ToolTipService.ToolTipProperty, link.Title); } renderer.WriteMember(Image.SourceProperty, new Uri(url, UriKind.RelativeOrAbsolute)); renderer.WriteEndObject(); } else { WriteStartHyperlink(renderer, url, link.Title); renderer.WriteItems(link); WriteEndHyperlink(renderer); } } // proc Write
protected override void Write(XamlMarkdownWriter renderer, CodeInline code) { renderer.WriteStartObject(typeof(Span)); renderer.WriteResourceMember(null, MarkdownXamlStyle.Code); renderer.WriteStartItems(nameof(Span.Inlines), true); renderer.WriteText(code.Content); renderer.WriteEndItems(); renderer.WriteEndObject(); } // proc Write
protected override void Write(XamlMarkdownWriter renderer, HtmlEntityInline obj) { var txt = obj.Transcoded.Text.Substring(obj.Transcoded.Start, obj.Transcoded.Length); using (var xaml = new XamlXmlReader(new StringReader(txt), new XamlXmlReaderSettings() { })) { while (xaml.Read()) { switch (xaml.NodeType) { case XamlNodeType.NamespaceDeclaration: renderer.WriteNamespace(xaml.Namespace); break; case XamlNodeType.StartObject: renderer.WriteStartObject(xaml.Type); break; case XamlNodeType.GetObject: renderer.WriteGetObject(); break; case XamlNodeType.EndObject: renderer.WriteEndObject(); break; case XamlNodeType.StartMember: renderer.WriteStartMember(xaml.Member); break; case XamlNodeType.EndMember: renderer.WriteEndMember(); break; case XamlNodeType.Value: if (xaml.Value is string text) { renderer.WriteValue(text); } else { renderer.WriteValue(xaml.Value.ToString()); // todo: use xaml to text converter } break; default: throw new InvalidOperationException(); } } } } // proc Write
} // proc WriteSpan protected override void Write(XamlMarkdownWriter renderer, EmphasisInline span) { if (WriteSpan(renderer, span)) { renderer.WriteItems(span); renderer.WriteEndObject(); } else { renderer.WriteChildren(span); } } // proc Write
protected override void Write(XamlMarkdownWriter renderer, LinkInline link) { var url = link.GetDynamicUrl != null?link.GetDynamicUrl() ?? link.Url : link.Url; if (link.IsImage) { if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute)) { url = "#"; } renderer.WriteStartObject(typeof(Image)); renderer.WriteResourceMember(null, MarkdownXamlStyle.Image); if (!String.IsNullOrEmpty(link.Title)) { renderer.WriteMember(ToolTipService.ToolTipProperty, link.Title); } renderer.WriteMember(Image.SourceProperty, renderer.GetUri(new Uri(url, UriKind.RelativeOrAbsolute), false)); var attr = link.TryGetAttributes(); if (attr.TryGetPropertyInt32("width", out var width)) { renderer.WriteMember(FrameworkElement.WidthProperty, width); } if (attr.TryGetPropertyInt32("height", out var height)) { renderer.WriteMember(FrameworkElement.HeightProperty, height); } renderer.WriteEndObject(); } else { WriteStartHyperlink(renderer, url, link.Title); renderer.WriteItems(link); WriteEndHyperlink(renderer); } } // proc Write
internal static void WriteEndHyperlink(XamlMarkdownWriter renderer) => renderer.WriteEndObject();
protected override void Write(XamlMarkdownWriter renderer, MdTable table) { renderer.WriteStartObject(typeof(WpfTable)); renderer.WriteResourceMember(null, MarkdownXamlStyle.Table); var t = new WpfTable(); renderer.WriteStartItems(nameof(WpfTable.Columns)); foreach (var col in table.ColumnDefinitions) { renderer.WriteStartObject(typeof(WpfTableColumn)); renderer.WriteMember(nameof(WpfTableColumn.Width), (col?.Width ?? 0) != 0 ? new GridLength(col.Width, GridUnitType.Star) : GridLength.Auto ); renderer.WriteEndObject(); } renderer.WriteEndItems(); renderer.WriteStartItems(nameof(WpfTable.RowGroups)); renderer.WriteStartObject(typeof(WpfTableRowGroup)); renderer.WriteStartItems(nameof(WpfTableRowGroup.Rows)); foreach (var c in table) { var row = (MdTableRow)c; renderer.WriteStartObject(typeof(WpfTableRow)); if (row.IsHeader) { renderer.WriteResourceMember(null, MarkdownXamlStyle.TableHeader); } renderer.WriteStartItems(nameof(WpfTableRow.Cells)); for (var i = 0; i < row.Count; i++) { var cell = (MdTableCell)row[i]; renderer.WriteStartObject(typeof(WpfTableCell)); renderer.WriteResourceMember(null, MarkdownXamlStyle.TableCell); if (cell.ColumnSpan > 1) { renderer.WriteMember(nameof(WpfTableCell.ColumnSpan), cell.ColumnSpan); } if (cell.RowSpan > 1) { renderer.WriteMember(nameof(WpfTableCell.RowSpan), cell.RowSpan); } var columnIndex = cell.ColumnIndex < 0 || cell.ColumnIndex >= table.ColumnDefinitions.Count ? i : cell.ColumnIndex; columnIndex = columnIndex >= table.ColumnDefinitions.Count ? table.ColumnDefinitions.Count - 1 : columnIndex; var alignment = table.ColumnDefinitions[columnIndex].Alignment; if (alignment.HasValue) { switch (alignment) { case TableColumnAlign.Center: renderer.WriteMember(nameof(WpfTableCell.TextAlignment), TextAlignment.Center); break; case TableColumnAlign.Right: renderer.WriteMember(nameof(WpfTableCell.TextAlignment), TextAlignment.Right); break; case TableColumnAlign.Left: renderer.WriteMember(nameof(WpfTableCell.TextAlignment), TextAlignment.Left); break; } } renderer.WriteItems(cell); renderer.WriteEndObject(); } renderer.WriteEndItems(); renderer.WriteEndObject(); } renderer.WriteEndItems(); renderer.WriteEndObject(); renderer.WriteEndItems(); renderer.WriteEndObject(); } // proc Write