// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; using System.IO; using Markdig; namespace Microsoft.PowerShell.MarkdownRender { /// /// Type of conversion from Markdown. /// [Flags] public enum MarkdownConversionType { /// /// Convert to HTML. /// HTML = 1, /// /// Convert to VT100 encoded string. /// VT100 = 2 } /// /// Object representing the conversion from Markdown. /// public class MarkdownInfo { /// /// Gets the Html content after conversion. /// public string Html { get; internal set; } /// /// Gets the VT100 encoded string after conversion. /// public string VT100EncodedString { get; internal set; } /// /// Gets the AST of the Markdown string. /// public Markdig.Syntax.MarkdownDocument Tokens { get; internal set; } } /// /// Class to convert a Markdown string to VT100, HTML or AST. /// public sealed class MarkdownConverter { /// /// Convert from Markdown string to VT100 encoded string or HTML. Returns MarkdownInfo object. /// /// String with Markdown content to be converted. /// Specifies type of conversion, either VT100 or HTML. /// Specifies the rendering options for VT100 rendering. /// MarkdownInfo object with the converted output. public static MarkdownInfo Convert(string markdownString, MarkdownConversionType conversionType, PSMarkdownOptionInfo optionInfo) { var renderInfo = new MarkdownInfo(); var writer = new StringWriter(); MarkdownPipeline pipeline = null; if (conversionType.HasFlag(MarkdownConversionType.HTML)) { pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build(); var renderer = new Markdig.Renderers.HtmlRenderer(writer); renderInfo.Html = Markdig.Markdown.Convert(markdownString, renderer, pipeline).ToString(); } if (conversionType.HasFlag(MarkdownConversionType.VT100)) { pipeline = new MarkdownPipelineBuilder().Build(); // Use the VT100 renderer. var renderer = new VT100Renderer(writer, optionInfo); renderInfo.VT100EncodedString = Markdig.Markdown.Convert(markdownString, renderer, pipeline).ToString(); } // Always have AST available. var parsed = Markdig.Markdown.Parse(markdownString, pipeline); renderInfo.Tokens = parsed; return renderInfo; } } }