mattercontrol/Utilities/MarkdigAgg/MarkdownPage.cs
John Lewin 9fa0c470cc Markdig prototype
- Issue MatterHackers/MCCentral#3660
Add Markdown implementation for help guides
2018-06-19 13:03:40 -07:00

107 lines
2.4 KiB
C#

// Copyright (c) 2016-2017 Nicolas Musset. All rights reserved.
// This file is licensed under the MIT license.
// See the LICENSE.md file in the project root for more information.
using System;
using System.IO;
using System.Net;
using Markdig.Renderers;
using MatterHackers.Agg.UI;
using MatterHackers.MatterControl;
namespace Markdig.Wpf
{
public class MarkdownPage : DialogPage
{
private static readonly MarkdownPipeline DefaultPipeline = new MarkdownPipelineBuilder().UseSupportedExtensions().Build();
public MarkdownPipeline MarkdownPipeline { get; set; } = new MarkdownPipelineBuilder().UseSupportedExtensions().Build();
private string _markDownText = null;
private MarkdownPipeline _pipeLine = null;
private Uri uri;
private FlowLayoutWidget contentPanel;
public MarkdownPage()
{
this.WindowTitle = this.HeaderText = "Markdown Tests";
uri = new Uri("https://raw.githubusercontent.com/lunet-io/markdig/master/readme.md");
var webClient = new WebClient();
var scrollableWidget = new ScrollableWidget(true)
{
HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Stretch
};
scrollableWidget.ScrollArea.HAnchor = HAnchor.Stretch;
scrollableWidget.ScrollArea.VAnchor = VAnchor.Fit;
contentRow.AddChild(scrollableWidget);
contentPanel = new FlowLayoutWidget(FlowDirection.TopToBottom)
{
HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Fit
};
scrollableWidget.AddChild(contentPanel);
this.Markdown = webClient.DownloadString(uri);
}
/// <summary>
/// Gets or sets the markdown to display.
/// </summary>
public string Markdown
{
get => _markDownText;
set
{
if (_markDownText != value)
{
_markDownText = value;
this.RefreshDocument();
}
}
}
/// <summary>
/// Gets or sets the markdown pipeline to use.
/// </summary>
public MarkdownPipeline Pipeline
{
get => _pipeLine ?? DefaultPipeline;
set
{
if (_pipeLine != value)
{
_pipeLine = value;
}
}
}
private void RefreshDocument()
{
if (!string.IsNullOrEmpty(this.Markdown))
{
var pipeline = Pipeline ?? DefaultPipeline;
contentPanel.CloseAllChildren();
pipeline = pipeline ?? new MarkdownPipelineBuilder().Build();
var renderer = new AggRenderer(contentPanel)
{
BaseUri = uri
};
pipeline.Setup(renderer);
var document = Markdig.Markdown.Parse(this.Markdown, pipeline);
renderer.Render(document);
}
}
}
}