Example #1
0
        protected override void Write(WpfRenderer renderer, CodeBlock obj)
        {
            if (renderer == null)
            {
                throw new ArgumentNullException(nameof(renderer));
            }

            var paragraph = new Paragraph();

            paragraph.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.CodeBlockStyleKey);
            renderer.Push(paragraph);
            renderer.WriteLeafRawLines(obj);
            renderer.Pop();
        }
Example #2
0
        /// <inheritdoc/>
        protected override void Write(WpfRenderer renderer, QuoteBlock obj)
        {
            if (renderer == null)
            {
                throw new ArgumentNullException(nameof(renderer));
            }
            if (obj == null)
            {
                throw new ArgumentNullException(nameof(obj));
            }

            var section = new Section();

            renderer.Push(section);
            renderer.WriteChildren(obj);
            section.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.QuoteBlockStyleKey);
            renderer.Pop();
        }
        protected override void Write([NotNull] WpfRenderer renderer, [NotNull] EmphasisInline obj)
        {
            Span span = null;

            switch (obj.DelimiterChar)
            {
            case '*':
            case '_':
                span = obj.DelimiterCount == 2 ? (Span) new Bold() : new Italic();
                break;

            case '~':
                span = new Span();
                span.SetResourceReference(FrameworkContentElement.StyleProperty, obj.DelimiterCount == 2 ? Styles.StrikeThroughStyleKey: Styles.SubscriptStyleKey);
                break;

            case '^':
                span = new Span();
                span.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.SuperscriptStyleKey);
                break;

            case '+':
                span = new Span();
                span.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.InsertedStyleKey);
                break;

            case '=':
                span = new Span();
                span.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.MarkedStyleKey);
                break;
            }

            if (span != null)
            {
                renderer.Push(span);
                renderer.WriteChildren(obj);
                renderer.Pop();
            }
            else
            {
                renderer.WriteChildren(obj);
            }
        }
Example #4
0
        /// <inheritdoc/>
        protected override void Write([NotNull] WpfRenderer renderer, [NotNull] LinkInline link)
        {
            var url = link.GetDynamicUrl != null?link.GetDynamicUrl() ?? link.Url : link.Url;

            if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute))
            {
                url = "#";
            }

            if (link.IsImage)
            {
                var template = new ControlTemplate();
                var image    = new FrameworkElementFactory(typeof(Image));
                image.SetValue(Image.SourceProperty, new BitmapImage(new Uri(url, UriKind.RelativeOrAbsolute)));
                image.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.ImageStyleKey);
                template.VisualTree = image;

                var btn = new Button()
                {
                    Template         = template,
                    Command          = Commands.Image,
                    CommandParameter = url
                };

                renderer.WriteInline(new InlineUIContainer(btn));
            }
            else
            {
                var hyperlink = new Hyperlink
                {
                    Command          = Commands.Hyperlink,
                    CommandParameter = url,
                    NavigateUri      = new Uri(url, UriKind.RelativeOrAbsolute),
                    ToolTip          = !string.IsNullOrEmpty(link.Title) ? link.Title : null,
                };

                hyperlink.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.HyperlinkStyleKey);

                renderer.Push(hyperlink);
                renderer.WriteChildren(link);
                renderer.Pop();
            }
        }
Example #5
0
        protected override void Write([NotNull] WpfRenderer renderer, [NotNull] EmphasisInline obj)
        {
            Span span = null;

            if (obj.DelimiterChar == '*' || obj.DelimiterChar == '_')
            {
                span = obj.IsDouble ? (Span) new Bold() : new Italic();
            }

            if (span != null)
            {
                renderer.Push(span);
                renderer.WriteChildren(obj);
                renderer.Pop();
            }
            else
            {
                renderer.WriteChildren(obj);
            }
        }
        protected override void Write(WpfRenderer renderer, HeadingBlock obj)
        {
            if (renderer == null)
            {
                throw new ArgumentNullException(nameof(renderer));
            }
            if (obj == null)
            {
                throw new ArgumentNullException(nameof(obj));
            }

            var paragraph = new Paragraph();
            ComponentResourceKey?styleKey = null;

            switch (obj.Level)
            {
            case 1: styleKey = Styles.Heading1StyleKey; break;

            case 2: styleKey = Styles.Heading2StyleKey; break;

            case 3: styleKey = Styles.Heading3StyleKey; break;

            case 4: styleKey = Styles.Heading4StyleKey; break;

            case 5: styleKey = Styles.Heading5StyleKey; break;

            case 6: styleKey = Styles.Heading6StyleKey; break;
            }

            if (styleKey != null)
            {
                paragraph.SetResourceReference(FrameworkContentElement.StyleProperty, styleKey);
            }

            renderer.Push(paragraph);
            renderer.WriteLeafInline(obj);
            renderer.Pop();
        }
Example #7
0
        /// <inheritdoc/>
        protected override void Write(WpfRenderer renderer, AutolinkInline link)
        {
            if (renderer == null)
            {
                throw new ArgumentNullException(nameof(renderer));
            }
            if (link == null)
            {
                throw new ArgumentNullException(nameof(link));
            }

            var url = link.Url;

            if (link.IsEmail)
            {
                url = "mailto:" + url;
            }

            if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute))
            {
                url = "#";
            }

            var hyperlink = new Hyperlink
            {
                Command          = Commands.Hyperlink,
                CommandParameter = url,
                NavigateUri      = new Uri(url, UriKind.RelativeOrAbsolute),
                ToolTip          = link.Url,
            };

            hyperlink.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.HyperlinkStyleKey);

            renderer.Push(hyperlink);
            renderer.WriteText(link.Url);
            renderer.Pop();
        }
        /// <inheritdoc/>
        protected override void Write([NotNull] WpfRenderer renderer, [NotNull] LinkInline link)
        {
            var url = link.GetDynamicUrl != null?link.GetDynamicUrl() ?? link.Url : link.Url;

            if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute))
            {
                url = "#";
            }

            if (link.IsImage)
            {
                var image = new Image
                {
                    Source = new BitmapImage(new Uri(url, UriKind.RelativeOrAbsolute))
                };

                image.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.ImageStyleKey);

                renderer.WriteInline(new InlineUIContainer(image));
            }
            else
            {
                var hyperlink = new Hyperlink
                {
                    Command          = Commands.Hyperlink,
                    CommandParameter = url,
                    NavigateUri      = new Uri(url, UriKind.RelativeOrAbsolute),
                    ToolTip          = link.Title != string.Empty ? link.Title : null,
                };

                hyperlink.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.HyperlinkStyleKey);

                renderer.Push(hyperlink);
                renderer.WriteChildren(link);
                renderer.Pop();
            }
        }
Example #9
0
        protected override void Write([NotNull] WpfRenderer renderer, [NotNull] Table table)
        {
            var wpfTable = new WpfTable();

            wpfTable.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.TableStyleKey);

            foreach (var tableColumnDefinition in table.ColumnDefinitions)
            {
                wpfTable.Columns.Add(new WpfTableColumn
                {
                    Width = (tableColumnDefinition?.Width ?? 0) != 0 ?
                            new GridLength(tableColumnDefinition.Width, GridUnitType.Star) :
                            GridLength.Auto,
                });
            }

            var wpfRowGroup = new WpfTableRowGroup();

            renderer.Push(wpfTable);
            renderer.Push(wpfRowGroup);

            foreach (var rowObj in table)
            {
                var row    = (TableRow)rowObj;
                var wpfRow = new WpfTableRow();

                renderer.Push(wpfRow);

                if (row.IsHeader)
                {
                    wpfRow.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.TableHeaderStyleKey);
                }

                for (var i = 0; i < row.Count; i++)
                {
                    var cellObj = row[i];
                    var cell    = (TableCell)cellObj;
                    var wpfCell = new WpfTableCell
                    {
                        ColumnSpan = cell.ColumnSpan,
                        RowSpan    = cell.RowSpan,
                    };

                    wpfCell.SetResourceReference(FrameworkContentElement.StyleProperty, Styles.TableCellStyleKey);

                    renderer.Push(wpfCell);
                    renderer.Write(cell);
                    renderer.Pop();

                    if (table.ColumnDefinitions.Count > 0)
                    {
                        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:
                                wpfCell.TextAlignment = TextAlignment.Center;
                                break;

                            case TableColumnAlign.Right:
                                wpfCell.TextAlignment = TextAlignment.Right;
                                break;

                            case TableColumnAlign.Left:
                                wpfCell.TextAlignment = TextAlignment.Left;
                                break;
                            }
                        }
                    }
                }

                renderer.Pop();
            }

            renderer.Pop();
            renderer.Pop();
        }
Example #10
0
        protected override void Write([NotNull] WpfRenderer renderer, [NotNull] MathBlock obj)
        {
            string text = string.Empty; // obj.Content.Text.Substring(obj.Content.Start, obj.Content.Length);

            for (int i = 0; i < obj.Lines.Count; ++i)
            {
                var l = obj.Lines.Lines[i];
                text += l.Slice.Text.Substring(l.Slice.Start, l.Slice.Length);
            }

            if (string.IsNullOrEmpty(text))
            {
                return;
            }

            TexFormula formula = null;

            try
            {
                formula = formulaParser.Parse(text);
            }
            catch (Exception)
            {
                var paragraph = new Paragraph()
                {
                    Tag = obj
                };
                renderer.Push(paragraph);
                renderer.WriteInline(new Run("[!!FORMULA PARSE ERROR!!]")
                {
                    Tag = obj
                });
                renderer.Pop();
                return;
            }

            var fontSize = renderer.CurrentFontSize();

            if (fontSize <= 0)
            {
                throw new InvalidProgramException();
            }

            var formulaRenderer = formula.GetRenderer(TexStyle.Display, fontSize, "Arial");
            var geo             = formulaRenderer.RenderToGeometry(0, 0);
            var geoD            = new System.Windows.Media.GeometryDrawing(Brushes.Black, null, geo);
            var di      = new DrawingImage(geoD);
            var uiImage = new System.Windows.Controls.Image()
            {
                Source = di
            };

            uiImage.Height = formulaRenderer.RenderSize.Height; // size image to match rendersize -> get a zoom of 100%
            // uiImage.Margin = new System.Windows.Thickness(0, 0, 0, -formulaRenderer.RenderSize.Height * formulaRenderer.RelativeDepth); // Move image so that baseline matches that of text
            var uiBlock = new System.Windows.Documents.BlockUIContainer()
            {
                Child = uiImage,
                Tag   = obj,
            };

            renderer.WriteBlock(uiBlock);
        }
Example #11
0
        /// <inheritdoc/>
        protected override void Write([NotNull] WpfRenderer renderer, [NotNull] LinkInline link)
        {
            var url = link.GetDynamicUrl != null?link.GetDynamicUrl() ?? link.Url : link.Url;

            if (link.IsImage)
            {
                var inline = renderer.ImageProvider.GetInlineItem(url, out var inlineItemIsErrorMessage);

                double?width = null, height = null;

                if (link.ContainsData(typeof(Markdig.Renderers.Html.HtmlAttributes)))
                {
                    var htmlAttributes = (Markdig.Renderers.Html.HtmlAttributes)link.GetData(typeof(Markdig.Renderers.Html.HtmlAttributes));
                    if (null != htmlAttributes.Properties)
                    {
                        foreach (var entry in htmlAttributes.Properties)
                        {
                            switch (entry.Key.ToLowerInvariant())
                            {
                            case "width":
                                width = GetLength(entry.Value);
                                break;

                            case "height":
                                height = GetLength(entry.Value);
                                break;
                            }
                        }
                    }
                }

                if (null != inline)
                {
                    inline.Tag = link;

                    if (inline is InlineUIContainer container && container.Child is Image image)
                    {
                        renderer.Styles.ApplyImageStyle(image);

                        var bitmapSource = image.Source as BitmapSource;

                        if (width.HasValue && height.HasValue)
                        {
                            // then we do a non-uniform stretching
                            if (null != bitmapSource && (bitmapSource.PixelWidth < width.Value || bitmapSource.PixelHeight < height.Value))
                            {
                                // we have to use scale to up-scale the image
                                image.LayoutTransform = new System.Windows.Media.ScaleTransform(width.Value / image.Source.Width, height.Value / image.Source.Height);
                                image.Width           = width.Value;
                                image.Height          = height.Value;
                                image.Stretch         = System.Windows.Media.Stretch.Fill;
                            }
                            else
                            {
                                image.Width   = width.Value;
                                image.Height  = height.Value;
                                image.Stretch = System.Windows.Media.Stretch.Fill;
                            }
                        }
                        else if (width.HasValue)
                        {
                            if (null != bitmapSource && bitmapSource.PixelWidth < width.Value)
                            {
                                // we have to use scale to up-scale the image
                                double scale = width.Value / bitmapSource.PixelWidth;
                                image.LayoutTransform = new System.Windows.Media.ScaleTransform(scale, scale);
                            }
                            else
                            {
                                image.Width   = width.Value;
                                image.Stretch = System.Windows.Media.Stretch.Uniform;
                            }
                        }
                        else if (height.HasValue)
                        {
                            if (null != bitmapSource && bitmapSource.PixelHeight < height.Value)
                            {
                                // we have to use scale to up-scale the image
                                double scale = height.Value / bitmapSource.PixelHeight;
                                image.LayoutTransform = new System.Windows.Media.ScaleTransform(scale, scale);
                            }
                            else
                            {
                                image.Height  = height.Value;
                                image.Stretch = System.Windows.Media.Stretch.Uniform;
                            }
                        }
                        else // neither width nor height provided
                        {
                            // it seems like a bug (or a feature?) in Wpf that to determine the size of the image,
                            // _not_ the width and height property of the image source is used.
                            // Instead it seems here that the PixelWidth and the PixelHeight is used and interpreted
                            // as 1/96th inch.
                            // We correct for that by assigning the image the width and height of the imageSource

                            // TODO: if the above theory is correct, then the next lines will work only if the Dpi of the bitmapSource is >=96
                            image.Width   = image.Source.Width;
                            image.Height  = image.Source.Height;
                            image.Stretch = System.Windows.Media.Stretch.Uniform;
                        }
                    }

                    renderer.WriteInline(inline);
                }
            }
            else
            {
                Hyperlink hyperlink = null;
                if (Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute))
                {
                    hyperlink = new Hyperlink
                    {
                        Command          = Commands.Hyperlink,
                        CommandParameter = url,
                        NavigateUri      = new Uri(url, UriKind.RelativeOrAbsolute),
                        ToolTip          = link.Title != string.Empty ? link.Title : null,
                        Tag = link
                    };
                }
                else // not a well formed Uri String - then it is probably a fragment reference
                {
                    hyperlink = new Hyperlink
                    {
                        Command          = Commands.FragmentLink,
                        CommandParameter = url,
                        NavigateUri      = new Uri(url, UriKind.RelativeOrAbsolute),
                        ToolTip          = link.Title != string.Empty ? link.Title : null,
                        Tag = link
                    };
                }

                renderer.Styles.ApplyHyperlinkStyle(hyperlink);
                renderer.Push(hyperlink);
                renderer.WriteChildren(link);
                renderer.Pop();
            }
        }