/// <summary> /// Verifies if the link is valid, before processing into a link, or plain text. /// </summary> /// <param name="element"> The parsed inline element to render. </param> /// <param name="context"> Persistent state. </param> protected void CheckRenderMarkdownLink(MarkdownLinkInline element, IRenderContext context) { // Avoid processing when link text is empty. if (element.Inlines.Count == 0) { return; } // Attempt to resolve references. element.ResolveReference(Document); if (element.Url == null) { // The element couldn't be resolved, just render it as text. RenderInlineChildren(element.Inlines, context); return; } foreach (MarkdownInline inline in element.Inlines) { if (inline is ImageInline imageInline) { // this is an image, create Image. if (!string.IsNullOrEmpty(imageInline.ReferenceId)) { imageInline.ResolveReference(Document); } imageInline.Url = element.Url; RenderImage(imageInline, context); return; } } RenderMarkdownLink(element, context); }
/// <summary> /// Renders a link element /// </summary> /// <param name="inlineCollection"> The list to add to. </param> /// <param name="element"> The parsed inline element to render. </param> /// <param name="parent"> The container element. </param> /// <param name="context"> Persistent state. </param> private void RenderMarkdownLink(InlineCollection inlineCollection, MarkdownLinkInline element, TextElement parent, RenderContext context) { // Avoid crash when link text is empty. if (element.Inlines.Count == 0) { return; } // Attempt to resolve references. element.ResolveReference(_document); if (element.Url == null) { // The element couldn't be resolved, just render it as text. RenderInlineChildren(inlineCollection, element.Inlines, parent, context); return; } // HACK: Superscript is not allowed within a hyperlink. But if we switch it around, so // that the superscript is outside the hyperlink, then it will render correctly. // This assumes that the entire hyperlink is to be rendered as superscript. if (AllTextIsSuperscript(element) == false) { // Regular ol' hyperlink. var link = new Hyperlink(); // Register the link _linkRegister.RegisterNewHyperLink(link, element.Url); // Remove superscripts. RemoveSuperscriptRuns(element, insertCaret: true); // Render the children into the link inline. var childContext = context.Clone(); childContext.WithinHyperlink = true; RenderInlineChildren(link.Inlines, element.Inlines, link, childContext); context.TrimLeadingWhitespace = childContext.TrimLeadingWhitespace; // Add it to the current inlines inlineCollection.Add(link); } else { // THE HACK IS ON! // Create a fake superscript element. var fakeSuperscript = new SuperscriptTextInline { Inlines = new List <MarkdownInline> { element } }; // Remove superscripts. RemoveSuperscriptRuns(element, insertCaret: false); // Now render it. RenderSuperscriptRun(inlineCollection, fakeSuperscript, parent, context); } }
/// <summary> /// Verifies if the link is valid, before processing into a link, or plain text. /// </summary> /// <param name="element"> The parsed inline element to render. </param> /// <param name="context"> Persistent state. </param> protected void CheckRenderMarkdownLink(MarkdownLinkInline element, IRenderContext context) { // Avoid processing when link text is empty. if (element.Inlines.Count == 0) { return; } // Attempt to resolve references. element.ResolveReference(Document); if (element.Url == null) { // The element couldn't be resolved, just render it as text. RenderInlineChildren(element.Inlines, context); } else { // Url is valid, create Link. RenderMarkdownLink(element, context); } }
/// <summary> /// Renders a link element. /// </summary> /// <param name="inlineCollection"> The list to add to. </param> /// <param name="element"> The parsed inline element to render. </param> /// <param name="parent"> The container element. </param> /// <param name="context"> Persistent state. </param> private void RenderMarkdownLink(InlineCollection inlineCollection, MarkdownLinkInline element, TextElement parent, RenderContext context) { // Avoid crash when link text is empty. if (element.Inlines.Count == 0) { return; } // Attempt to resolve references. element.ResolveReference(_document); if (element.Url == null || _document.EnableHiddenLinks == false) { // The element couldn't be resolved, just render it as text. RenderInlineChildren(inlineCollection, element.Inlines, parent, context); return; } // Regular ol' hyperlink. var link = new Hyperlink(); // Register the link _linkRegister.RegisterNewHyperLink(link, element.Url); // Render the children into the link inline. var childContext = context.Clone(); childContext.WithinHyperlink = true; if (LinkForeground != null) { link.Foreground = LinkForeground; } RenderInlineChildren(link.Inlines, element.Inlines, link, childContext); context.TrimLeadingWhitespace = childContext.TrimLeadingWhitespace; // Add it to the current inlines inlineCollection.Add(link); }