public static void ApplyFont(this Windows.UI.Xaml.Documents.TextElement self, Font font) { self.FontSize = font.UseNamedSize ? font.NamedSize.GetFontSize() : font.FontSize; self.FontFamily = !string.IsNullOrEmpty(font.FontFamily) ? new FontFamily(font.FontFamily) : (FontFamily)WApplication.Current.Resources["ContentControlThemeFontFamily"]; self.FontStyle = font.FontAttributes.HasFlag(FontAttributes.Italic) ? FontStyle.Italic : FontStyle.Normal; self.FontWeight = font.FontAttributes.HasFlag(FontAttributes.Bold) ? FontWeights.Bold : FontWeights.Normal; }
protected static void ApplyTextStyles(TextElement textElement, TextStyle style) { if (style != null) { SetBinding(style, TextStyle.FontSizeProperty, () => { var fontSize = style.FontSize * style.FontSizeRatioValue(); if (fontSize > 0) { textElement.FontSize = fontSize; } }); SetBinding(style, TextStyle.FontSizeRatioProperty, () => { var fontSize = style.FontSize * style.FontSizeRatioValue(); if (fontSize > 0) { textElement.FontSize = fontSize; } }); BindingOperations.SetBinding(textElement, TextElement.FontFamilyProperty, CreateBinding(style, "FontFamily")); BindingOperations.SetBinding(textElement, TextElement.FontStyleProperty, CreateBinding(style, "FontStyle")); BindingOperations.SetBinding(textElement, TextElement.FontWeightProperty, CreateBinding(style, "FontWeight")); BindingOperations.SetBinding(textElement, TextElement.ForegroundProperty, CreateBinding(style, "Foreground")); } }
/// <summary> /// Renders all of the children for the given element. /// </summary> /// <param name="inlineCollection"> The list to add to. </param> /// <param name="inlineElements"> The parsed inline elements to render. </param> /// <param name="parent"> The container element. </param> /// <param name="context"> Persistent state. </param> private void RenderInlineChildren(InlineCollection inlineCollection, IList<MarkdownInline> inlineElements, TextElement parent, RenderContext context) { foreach (MarkdownInline element in inlineElements) { RenderInline(inlineCollection, element, parent, context); } }
/// <summary> /// Renders a raw 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 RenderHyperlink(InlineCollection inlineCollection, HyperlinkInline element, TextElement parent, RenderContext context) { var link = new Hyperlink(); // Register the link this.linkRegister.RegisterNewHyperLink(link, element.Url); // Make a text block for the link Run linkText = new Run(); linkText.Text = CollapseWhitespace(context, element.Text); link.Inlines.Add(linkText); // Add it to the current inlines inlineCollection.Add(link); }
/// <summary> /// Called to render an inline 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 RenderInline(InlineCollection inlineCollection, MarkdownInline element, TextElement parent, RenderContext context) { switch (element.Type) { case MarkdownInlineType.TextRun: RenderTextRun(inlineCollection, (TextRunInline)element, parent, context); break; case MarkdownInlineType.Italic: RenderItalicRun(inlineCollection, (ItalicTextInline)element, parent, context); break; case MarkdownInlineType.Bold: RenderBoldRun(inlineCollection, (BoldTextInline)element, parent, context); break; case MarkdownInlineType.MarkdownLink: RenderMarkdownLink(inlineCollection, (MarkdownLinkInline)element, parent, context); break; case MarkdownInlineType.RawHyperlink: RenderHyperlink(inlineCollection, (HyperlinkInline)element, parent, context); break; case MarkdownInlineType.Strikethrough: RenderStrikethroughRun(inlineCollection, (StrikethroughTextInline)element, parent, context); break; case MarkdownInlineType.Superscript: RenderSuperscriptRun(inlineCollection, (SuperscriptTextInline)element, parent, context); break; case MarkdownInlineType.Code: RenderCodeRun(inlineCollection, (CodeInline)element, parent, context); break; } }
/// <summary> /// Renders a bold run 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 RenderBoldRun(InlineCollection inlineCollection, BoldTextInline element, TextElement parent, RenderContext context) { // Create the text run Span boldSpan = new Span(); boldSpan.FontWeight = FontWeights.Bold; // Render the children into the bold inline. RenderInlineChildren(boldSpan.Inlines, element.Inlines, boldSpan, context); // Add it to the current inlines inlineCollection.Add(boldSpan); }
/// <summary> /// Renders a code 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 RenderCodeRun(InlineCollection inlineCollection, CodeInline element, TextElement parent, RenderContext context) { var run = new Run(); run.FontFamily = CodeFontFamily ?? FontFamily; run.Text = CollapseWhitespace(context, element.Text); // Add it to the current inlines inlineCollection.Add(run); }
/// <summary> /// Renders a text run 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 RenderTextRun(InlineCollection inlineCollection, TextRunInline element, TextElement parent, RenderContext context) { // Create the text run Run textRun = new Run(); textRun.Text = CollapseWhitespace(context, element.Text); // Add it inlineCollection.Add(textRun); }
/// <summary> /// Renders a superscript 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 RenderSuperscriptRun(InlineCollection inlineCollection, SuperscriptTextInline element, TextElement parent, RenderContext context) { // Le <sigh>, InlineUIContainers are not allowed within hyperlinks. if (context.WithinHyperlink) { RenderInlineChildren(inlineCollection, element.Inlines, parent, context); return; } var paragraph = new Paragraph(); paragraph.FontSize = parent.FontSize * 0.8; paragraph.FontFamily = parent.FontFamily; paragraph.FontStyle = parent.FontStyle; paragraph.FontWeight = parent.FontWeight; RenderInlineChildren(paragraph.Inlines, element.Inlines, paragraph, context); var richTextBlock = CreateOrReuseRichTextBlock(null, context); richTextBlock.Blocks.Add(paragraph); var border = new Border(); border.Padding = new Thickness(0, 0, 0, paragraph.FontSize * 0.2); border.Child = richTextBlock; var inlineUIContainer = new InlineUIContainer(); inlineUIContainer.Child = border; // Add it to the current inlines inlineCollection.Add(inlineUIContainer); }
/// <summary> /// Renders a strikethrough 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 RenderStrikethroughRun(InlineCollection inlineCollection, StrikethroughTextInline element, TextElement parent, RenderContext context) { Span span = new Span(); span.FontFamily = new FontFamily("Consolas"); // Render the children into the inline. RenderInlineChildren(span.Inlines, element.Inlines, span, context); AlterChildRuns(span, (parentSpan, run) => { var text = run.Text; var builder = new StringBuilder(text.Length * 2); foreach (var c in text) { builder.Append((char)0x0336); builder.Append(c); } run.Text = builder.ToString(); }); // Add it to the current inlines inlineCollection.Add(span); }
/// <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(this.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 this.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(); fakeSuperscript.Inlines = new List<MarkdownInline> { element }; // Remove superscripts. RemoveSuperscriptRuns(element, insertCaret: false); // Now render it. RenderSuperscriptRun(inlineCollection, fakeSuperscript, parent, context); } }
/// <summary> /// Renders a text run 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 RenderItalicRun(InlineCollection inlineCollection, ItalicTextInline element, TextElement parent, RenderContext context) { // Create the text run Span italicSpan = new Span(); italicSpan.FontStyle = FontStyle.Italic; // Render the children into the italic inline. RenderInlineChildren(italicSpan.Inlines, element.Inlines, italicSpan, context); // Add it to the current inlines inlineCollection.Add(italicSpan); }