예제 #1
0
        /// <summary>
        /// Convert from Markdown string to VT100 encoded string or HTML. Returns MarkdownInfo object.
        /// </summary>
        /// <param name="markdownString">String with Markdown content to be converted.</param>
        /// <param name="conversionType">Specifies type of conversion, either VT100 or HTML.</param>
        /// <param name="optionInfo">Specifies the rendering options for VT100 rendering.</param>
        /// <returns>MarkdownInfo object with the converted output.</returns>
        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);
        }
예제 #2
0
        protected string GetMarkdownRendererFromMarkdownDocument(MarkdownDocument document)
        {
            var pipeline = new MarkdownPipelineBuilder().Build();

            var writer   = new StringWriter();
            var renderer = new Markdig.Renderers.HtmlRenderer(writer);

            pipeline.Setup(renderer);

            renderer.Render(document);

            writer.Flush();
            return(writer.ToString());
        }
        public string RenderHtml(string markdown)
        {
            if (markdown == null)
            {
                throw new ArgumentNullException("markdown");
            }

            var writer   = new StringWriter();
            var renderer = new Markdig.Renderers.HtmlRenderer(writer);

            renderer.ObjectWriteBefore += Renderer_ObjectWriteBefore;
            pipelineUnsafe.Setup(renderer);

            var document = Markdig.Markdown.Parse(markdown, pipelineUnsafe);

            renderer.Render(document);
            writer.Flush();
            return(writer.ToString());
        }
        public string RenderHtmlSafe(string markdown, bool keepLineBreaks = false)
        {
            if (markdown == null)
            {
                throw new ArgumentNullException("markdown");
            }

            if (keepLineBreaks)
            {
                markdown = newlinePreserverRegex.Replace(markdown, NEWLINE_PRESERVER_PATTERN);
            }

            var writer   = new StringWriter();
            var renderer = new Markdig.Renderers.HtmlRenderer(writer);

            renderer.ObjectWriteBefore += Renderer_ObjectWriteBefore;
            pipelineSafe.Setup(renderer);

            var document = Markdig.Markdown.Parse(markdown, pipelineSafe);

            renderer.Render(document);
            writer.Flush();
            return(writer.ToString());
        }
예제 #5
0
        private async Task <NewsItem> LoadNewsItem(string file)
        {
            if (!System.IO.File.Exists(file))
            {
                return(null);
            }

            var mdPipeline = new MarkdownPipelineBuilder().UseYamlFrontMatter().Build();

            var fileContent = await System.IO.File.ReadAllTextAsync(file);

            var mdFile = Markdown.Parse(fileContent, mdPipeline);

            var frontMatter    = (YamlFrontMatterBlock)mdFile.FirstOrDefault(b => b.Parser is YamlFrontMatterParser);
            var itemTitleBlock = (HeadingBlock)mdFile.FirstOrDefault(b => b.Parser is HeadingBlockParser);
            var itemTitle      = itemTitleBlock?.Inline.FirstOrDefault();

            var data = frontMatter.Lines.Lines.Select(l => l.Slice.ToString().Split(':', 2).Select(s => s.Trim()).ToList()).Where(s => s.Count > 1).ToDictionary(s => s[0], s => s[1]);

            var clearText = Markdown.ToPlainText(fileContent, pipeline: mdPipeline);
            var htmlText  = Markdown.ToHtml(fileContent, pipeline: mdPipeline);

            var fileName = new FileInfo(file).Name;

            mdFile.Remove(frontMatter);
            mdFile.Remove(itemTitleBlock);

            var cleanedOutput = string.Empty;

            using (var tw = new StringWriter())
            {
                var x = new Markdig.Renderers.HtmlRenderer(tw);
                x.Write(mdFile);

                tw.Flush();
                cleanedOutput = tw.ToString();
            }

            var newsItem = new NewsItem
            {
                Title       = itemTitle.ToString(),
                Description = cleanedOutput,
                Link        = Url.Page("/News", null, null, HttpContext.Request.Scheme, HttpContext.Request.Host.ToString()) + "/" + fileName.Replace(".md", ""),
                CleanText   = clearText
            };

            if (data.ContainsKey("pubdate"))
            {
                if (DateTimeOffset.TryParse(data["pubdate"], out var articleTime))
                {
                    newsItem.PubDate = articleTime;
                }
            }

            if (data.ContainsKey("category"))
            {
                newsItem.Category = data["category"];
            }

            return(newsItem);
        }