Esempio n. 1
0
        private static MarkdownPipeline CreatePipeline(string pipelineOptions, string allExtensionOptionsJson, bool classicRendering)
        {
            var builder = new MarkdownPipelineBuilder();

            // Vanilla extensions only
            if (pipelineOptions.Equals("CommonMark", StringComparison.OrdinalIgnoreCase))
            {
                return(builder.Build());
            }

            JObject allExtensionOptionsJObject = allExtensionOptionsJson == null ? null : JObject.Parse(allExtensionOptionsJson);

            foreach (string extension in pipelineOptions.Equals("all", StringComparison.OrdinalIgnoreCase) ? _extensionNames : pipelineOptions.Split('_'))
            {
                if (!_useExtensionMethods.TryGetValue(extension, out MethodInfo useExtensionMethod))
                {
                    throw new InvalidOperationException($"The extension {extension} does not exist.");
                }

                object[] args = null;
                JToken   extensionOptionsJToken;
                if (!_extensionOptionsTypes.TryGetValue(extension, out Type extensionOptionsType)) // Extension extension method has no options parameter
                {
                    args = new object[] { builder };
                }
                else if ((extensionOptionsJToken = allExtensionOptionsJObject?.GetValue(extension, StringComparison.OrdinalIgnoreCase)) == null && // Extension extension method has options parameter but no value was provided
                         !classicRendering)
                {
                    args = new object[] { builder, null };
                }
                else
                {
                    // If we're running CommonMark specs, we want classic rendering output
                    if (classicRendering)
                    {
                        if (extensionOptionsJToken == null)
                        {
                            extensionOptionsJToken = JToken.Parse("{defaultBlockOptions: { \"renderingMode\": \"classic\"}}");
                        }
                        else
                        {
                            extensionOptionsJToken["defaultBlockOptions"]["renderingMode"] = "classic";
                        }
                    }

                    object extensionOptions = Activator.CreateInstance(extensionOptionsType);
                    _jsonSerializer.Populate(extensionOptionsJToken.CreateReader(), extensionOptions);
                    args = new object[] { builder, extensionOptions };
                }

                useExtensionMethod.Invoke(null, args);
            }

            return(builder.Build());
        }
Esempio n. 2
0
        /// <summary>
        /// Prepare pure markdownData containing parsed html and additional metadata
        /// </summary>
        /// <param name="mdFileContent"></param>
        /// <returns>Json structure class</returns>
        public MarkdownData PrepareMarkdownData(string mdFileContent)
        {
            MarkdownDocument document;
            string           htmlString;

            using (var writer = new StringWriter())
            {
                var builder = new MarkdownPipelineBuilder();
                builder.UseAutoIdentifiers();
                builder.UsePipeTables();
                builder.UseFigures();
                builder.UseYamlFrontMatter();
                builder.UseCustomCodeBlockExtension();
                document   = Markdown.ToHtml(mdFileContent, writer, builder.Build());
                htmlString = writer.ToString();
            }
            var head = new HeaderData {
                Level = 0
            };

            CreateTree(document.Descendants <HeadingBlock>().ToList(), head);
            var metadata = ValidateMetaData(CreateMetaData(document.Descendants <YamlFrontMatterBlock>()));

            return(new MarkdownData
            {
                HtmlString = htmlString,
                HeaderData = Compress(head.Children),
                MetaData = metadata
            });
        }
Esempio n. 3
0
        void RenderMarkdown()
        {
            stack = new StackLayout()
            {
                Spacing = Theme.VerticalSpacing,
            };

            Padding = Theme.Margin;

            BackgroundColor = Theme.BackgroundColor;

            if (!string.IsNullOrEmpty(Markdown))
            {
                var pipeline = new MarkdownPipelineBuilder();

                if (Theme.Link.UseAutolinksExtension)
                {
                    pipeline = pipeline.UseAutoLinks();
                }

                if (Theme.UseEmojiAndSmileyExtension)
                {
                    pipeline = pipeline.UseEmojiAndSmiley();
                }

                var parsed = Markdig.Markdown.Parse(Markdown, pipeline.Build());
                Render(parsed.AsEnumerable());
            }

            Content = stack;
        }
Esempio n. 4
0
        private static MarkdownPipeline CreateMarkdownPipeline()
        {
            var builder = new MarkdownPipelineBuilder()
                          .UseYamlFrontMatter()
                          .UseCustomContainers()
                          .UseEmphasisExtras()
                          .UseGridTables()
                          .UseMediaLinks()
                          .UsePipeTables()
                          .UseGenericAttributes(); // Must be last as it is one parser that is modifying other parsers

            builder.DocumentProcessed += document => {
                foreach (var node in document.Descendants())
                {
                    if (node is Markdig.Syntax.Block)
                    {
                        if (node is Markdig.Extensions.Tables.Table)
                        {
                            node.GetAttributes().AddClass("md-table");
                        }
                    }
                }
            };
            return(builder.Build());
        }
Esempio n. 5
0
        /// <summary>
        /// Render all the sections contained in the document
        /// into HTML format
        /// </summary>
        /// <param name="mdString">The string in MD format to transform in HTML</param>
        /// <returns>A string with the whole HTML document</returns>
        public string RenderToHtml(string mdString)
        {
            var pipeline = new MarkdownPipelineBuilder();

            if (extraEmphasis)
            {
                pipeline = pipeline.UseEmphasisExtras();
            }
            if (extraList)
            {
                pipeline = pipeline.UseListExtras();
            }
            if (taskList)
            {
                pipeline = pipeline.UseTaskLists();
            }
            if (tables)
            {
                pipeline = pipeline.UsePipeTables();
            }
            if (math)
            {
                pipeline = pipeline.UseMathematics();
            }

            return(Markdown.ToHtml(mdString, pipeline.Build()));
        }
Esempio n. 6
0
        private string Markup(string content, IMarkdownObjectRewriter rewriter, TestLoggerListener listener = null)
        {
            var pipelineBuilder  = new MarkdownPipelineBuilder();
            var documentRewriter = new MarkdownDocumentVisitor(rewriter);

            pipelineBuilder.DocumentProcessed += document =>
            {
                ValidationExtension.SetSchemaName(document);
                documentRewriter.Visit(document);
            };
            var pipeline = pipelineBuilder.Build();

            if (listener != null)
            {
                Logger.RegisterListener(listener);
            }

            var html = Markdown.ToHtml(content, pipeline);

            if (listener != null)
            {
                Logger.UnregisterListener(listener);
            }

            return(html);
        }
        public void SetUp()
        {
            var pipelineBuilder = new MarkdownPipelineBuilder();

            pipelineBuilder = MarkdownExtensions.Use <BadHeadersExtension>(pipelineBuilder);
            _pipeline       = pipelineBuilder.Build();
        }
Esempio n. 8
0
        private MarkdownPipeline CreatePipeline(string path)
        {
            string basePath       = _parameters.BasePath;
            string mediaDirectory = Path.Combine(basePath, "src/resources");

            var includeBlocksExtensionOptions      = new FlexiIncludeBlocksExtensionOptions(baseUri: Path.Combine(basePath, path));
            var flexiPictureBlocksExtensionOptions = new FlexiPictureBlocksExtensionOptions(localMediaDirectory: mediaDirectory);
            var flexiVideoBlocksExtensionOptions   = new FlexiVideoBlocksExtensionOptions(localMediaDirectory: mediaDirectory);

            var builder = new MarkdownPipelineBuilder().
                          UseEmphasisExtras().
                          UseDefinitionLists().
                          UseFootnotes().
                          UseAutoLinks().
                          UseTaskLists().
                          UseListExtras().
                          UseMediaLinks().
                          UseAbbreviations().
                          UseFooters().
                          UseFigures().
                          UseCitations().
                          UseCustomContainers().
                          UseGenericAttributes().
                          UseMathematics().
                          UseSmartyPants().
                          UseDiagrams().
                          UseFlexiBlocks(includeBlocksExtensionOptions,
                                         flexiPictureBlocksExtensionOptions: flexiPictureBlocksExtensionOptions,
                                         flexiVideoBlocksExtensionOptions: flexiVideoBlocksExtensionOptions);

            builder.Extensions.Add(new CustomYamlHeaderExtension(new MarkdownContext()));

            return(builder.Build());
        }
Esempio n. 9
0
        /// <summary>
        /// Renders a source Markdown string to HTML
        /// </summary>
        /// <param name="srcMarkdown">The markdown to convert to HTML</param>
        /// <param name="useEmoji">Wwther to transform or not :emoji: into UTF-8 emojis</param>
        /// <returns>The resulting HTML</returns>
        public static string ConvertMarkdown2Html(string srcMarkdown, bool useEmoji, string extensions = "")
        {
            //Configure markdown conversion
            MarkdownPipelineBuilder mdPipe = new MarkdownPipelineBuilder().UseAdvancedExtensions();

            //Add more extensions
            if (!string.IsNullOrWhiteSpace(extensions))
            {
                mdPipe.Configure(extensions);
            }

            //Remove the indented code block parser (code blocks must always be fenced)
            //This is needed if you want to mix contents from MD and MDH files injected from FPFs and insertfile tags
            //and prevent problems when mixing HTML inside a Markdown file contents
            mdPipe.BlockParsers.Remove(mdPipe.BlockParsers.Find <Markdig.Parsers.IndentedCodeBlockParser>());

            //Add support for non-ASCII characters in the Autolinks for headers
            //Remove the previous AutoIdentifierExtension
            mdPipe.Extensions.Remove(mdPipe.Extensions.Find <AutoIdentifierExtension>());
            //Add AutoIdentifier extension with only AutoLink option
            mdPipe.UseAutoIdentifiers(AutoIdentifierOptions.AutoLink);

            //Check if we must generate emojis
            if (useEmoji)
            {
                mdPipe = mdPipe.UseEmojiAndSmiley();
            }

            var pipeline = mdPipe.Build();

            //Convert markdown to HTML
            return(Markdig.Markdown.ToHtml(srcMarkdown, pipeline)); //Convert to HTML
        }
Esempio n. 10
0
        private static MarkdownPipeline CreateTrustedPipeline()
        {
            var pb = new MarkdownPipelineBuilder();

            pb.Extensions.Add(new OnlyPublishedLinksMarkdownExtension());
            return(pb.Build());
        }
Esempio n. 11
0
        public MdxToTsx()
        {
            var builder = new MarkdownPipelineBuilder()
                          .UseYamlFrontMatter()
                          .UseAbbreviations()
                          .UseAutoIdentifiers()
                          .UseCitations()
                          .UseDefinitionLists()
                          .UseEmphasisExtras()
                          .UseFigures()
                          .UseFooters()
                          //.UseFootnotes() too complex for small usefulness
                          .UseGridTables()
                          //.UseMathematics()
                          //.UseMediaLinks() could be probably solved in component
                          .UsePipeTables()
                          .UseListExtras()
                          .UseTaskLists()
                          .UseDiagrams()
                          .DisableHtml()
                          .UseAutoLinks();

            builder.Extensions.AddIfNotAlready <ImportExtension>();
            builder.BlockParsers.AddIfNotAlready <MdxBlockParser>();
            builder.InlineParsers.AddIfNotAlready <MdxCodeInlineParser>();
            builder.InlineParsers.TryRemove <AutolinkInlineParser>();
            builder.InlineParsers.AddIfNotAlready <AutolinkAndJsxInlineParser>();
            _pipeline = builder.Build();
        }
Esempio n. 12
0
        public static void Convert(TextReader input, TextWriter output, MarkdownToHtmlConverterOptions options)
        {
            var markdownText = input.ReadToEnd();

            var pipelineBulder = new MarkdownPipelineBuilder()
                                 .UseAdvancedExtensions();

            if (options.EmbedImage)
            {
                pipelineBulder.Use(new EmbeddedImageExtension(options.BaseDirectory));
            }

            var pipeline     = pipelineBulder.Build();
            var htmlBodyText = Markdown.ToHtml(markdownText, pipeline);

            var styleText = GetDefaultStyleText();

            output.WriteLine("<!DOCTYPE html>");
            output.WriteLine("<html>");
            output.WriteLine("<head>");
            output.WriteLine("<style>");
            output.WriteLine(styleText);
            output.WriteLine("</style>");
            output.WriteLine("</head>");
            output.WriteLine("<body class=\"markdown-body\">");

            output.WriteLine(htmlBodyText);

            output.WriteLine("</body>");
            output.WriteLine("</html>");
            output.Flush();
        }
Esempio n. 13
0
        /// <summary>
        /// 解析Markdown源代码,并且返回HTML字符串。
        /// </summary>
        /// <param name="source">Markdown源代码。</param>
        /// <param name="extensions">Markdown配置实例。</param>
        /// <returns>返回解析后的HTML字符串。</returns>
        public static string ToHtml(string source, MarkdownPipelineBuilder pipeline)
        {
            pipeline.Use <QuoteSectionNoteExtension>();
            var build = pipeline.Build();

            return(Markdig.Markdown.ToHtml(source, build));
        }
Esempio n. 14
0
        /// <summary>
        /// Static constructor, called once, to initialise a 'standard' markdown pipeline
        /// which will be used to parse all markdown documents.
        /// </summary>
        static ParagraphTagRenderer()
        {
            MarkdownPipelineBuilder builder = new MarkdownPipelineBuilder().UsePipeTables().UseEmphasisExtras();

            builder.InlineParsers.Add(new ReferenceInlineParser());
            pipeline = builder.Build();
        }
            static MarkdownPipeline Pipeline()
            {
                var builder = new MarkdownPipelineBuilder();

                builder.UseAdvancedExtensions();
                return(builder.Build());
            }
Esempio n. 16
0
        private MarkdownPipeline CreatePipeline()
        {
            var builder = new MarkdownPipelineBuilder().
                          // UsePipeTables(). - create custom responsive pipe tables
                          // UseGridTables(). - create custom responsive, free width grid tables
                          UseEmphasisExtras().
                          UseDefinitionLists().
                          UseFootnotes().
                          UseAutoIdentifiers(AutoIdentifierOptions.GitHub | AutoIdentifierOptions.AutoLink).
                          UseAutoLinks().
                          UseTaskLists().
                          UseListExtras().
                          UseMediaLinks().
                          UseAbbreviations().
                          UseFooters().
                          UseFigures().
                          UseCitations().
                          UseCustomContainers().
                          UseGenericAttributes().
                          UseMathematics().
                          UseSmartyPants().
                          UseDiagrams().
                          UseYamlFrontMatter();

            return(builder.Build());
        }
Esempio n. 17
0
        private static string RenderForFeed(string data)
        {
            var pipeline = new MarkdownPipelineBuilder()
                           .UseAdvancedExtensions();

            return(Regex.Replace(Markdown.ToHtml(data, pipeline.Build()), @"<(.|\n)*?>", string.Empty));
        }
Esempio n. 18
0
        public void ContextObjectsExtension_ContextObjectsAddedToMarkdownParserContextPropertiesTakePrecedenceOver()
        {
            // Arrange
            var             dummyValue   = new object();
            Mock <Verifier> mockVerifier = _mockRepository.Create <Verifier>();

            mockVerifier.Setup(v => v.Verify(dummyValue)); // Verifies that correct value is returned by ContextObjectsService in DummyParser.TryOpen
            var dummyServices = new ServiceCollection();

            dummyServices.
            AddContextObjects().
            AddSingleton <DummyExtension>().
            AddSingleton <DummyParser>().
            AddSingleton(mockVerifier.Object);
            ServiceProvider         serviceProvider = dummyServices.BuildServiceProvider();
            ContextObjectsExtension testSubject     = serviceProvider.GetRequiredService <ContextObjectsExtension>();

            testSubject.ContextObjectsStore.Add(_dummyKey, new object()); // Add context object to ContextObjectsStore
            var markdownPipelineBuilder = new MarkdownPipelineBuilder();

            markdownPipelineBuilder.Extensions.Add(testSubject);
            markdownPipelineBuilder.Extensions.Add(serviceProvider.GetRequiredService <DummyExtension>());
            MarkdownPipeline markdownPipeline = markdownPipelineBuilder.Build();
            var markdownParserContext         = new MarkdownParserContext();

            markdownParserContext.Properties.Add(_dummyKey, dummyValue); // Add context object to MarkdownParserContext, this object should take precedence
            var dummyStringWriter = new StringWriter();

            // Act
            Markdown.ToHtml("dummyMarkdown", dummyStringWriter, markdownPipeline, markdownParserContext);

            // Assert
            _mockRepository.VerifyAll();
        }
Esempio n. 19
0
        private MarkdownPipeline CreateMarkdownPipeline(bool isInline, bool enableValidation)
        {
            object enableSourceInfoObj = null;

            _parameters?.Extensions?.TryGetValue("EnableSourceInfo", out enableSourceInfoObj);

            var enableSourceInfo = !(enableSourceInfoObj is bool enabled) || enabled;

            var builder = new MarkdownPipelineBuilder();

            builder.UseDocfxExtensions(_context);
            builder.Extensions.Insert(0, new YamlHeaderExtension(_context));
            builder.Extensions.Add(new ResolveLinkExtension());

            if (enableSourceInfo)
            {
                builder.UseLineNumber(file => ((RelativePath)file).RemoveWorkingFolder());
            }

            if (enableValidation)
            {
                builder.Extensions.Add(new ValidationExtension(_mvb, _context));
            }

            if (isInline)
            {
                builder.UseInlineOnly();
            }

            return(builder.Build());
        }
Esempio n. 20
0
        /// <summary>
        /// Creates a pipeline automatically configured from an input markdown based on the presence of the configuration tag.
        /// </summary>
        /// <param name="inputText">The input text.</param>
        /// <returns>The pipeline configured from the input</returns>
        /// <exception cref="ArgumentNullException"></exception>
        public MarkdownPipeline CreatePipelineFromInput(string inputText)
        {
            if (inputText == null)
            {
                ThrowHelper.ArgumentNullException(nameof(inputText));
            }

            var    builder             = new MarkdownPipelineBuilder();
            string defaultConfig       = DefaultExtensions;
            var    indexOfSelfPipeline = inputText.IndexOf(SelfPipelineHintTagStart, StringComparison.OrdinalIgnoreCase);

            if (indexOfSelfPipeline >= 0)
            {
                var optionStart = indexOfSelfPipeline + SelfPipelineHintTagStart.Length;
                var endOfTag    = inputText.IndexOf("-->", optionStart, StringComparison.OrdinalIgnoreCase);
                if (endOfTag >= 0)
                {
                    defaultConfig = inputText.Substring(optionStart, endOfTag - optionStart).Trim();
                }
            }

            if (!string.IsNullOrEmpty(defaultConfig))
            {
                builder.Configure(defaultConfig);
            }
            return(builder.Build());
        }
        private MarkdownPipeline BuidPipeline(IMarkdownExtension extension)
        {
            MarkdownPipelineBuilder pipelineBuilder = new MarkdownPipelineBuilder().UseAdvancedExtensions();

            pipelineBuilder.Extensions.Add(extension);
            return(pipelineBuilder.Build());
        }
Esempio n. 22
0
        //------------------------------------------------------------------------------

        Layout ParseDocument()
        {
            var context  = new Context(mSkin, mHandlerImages, mHandlerNavigate);
            var builder  = new LayoutBuilder(context);
            var renderer = new RendererMarkdown(builder);

            var pipelineBuilder = new MarkdownPipelineBuilder()
                                  .UseAutoLinks()
            ;

            if (!string.IsNullOrEmpty(Preferences.JIRA))
            {
                pipelineBuilder.UseJiraLinks(new JiraLinkOptions(Preferences.JIRA));
            }

            var pipeline = pipelineBuilder.Build();

            pipeline.Setup(renderer);

            var doc = Markdown.Parse(mText, pipeline);

            renderer.Render(doc);

            return(builder.GetLayout());
        }
Esempio n. 23
0
        /// <summary>
        /// Converts the <see cref="Message.Contents"/> of <paramref name="message"/> to HTML.
        /// </summary>
        public static string GetHtmlContents(this Message message)
        {
            var pipelineBuilder = new MarkdownPipelineBuilder();

            pipelineBuilder.DisableHtml();
            return(Markdown.ToHtml(message.Contents, pipelineBuilder.Build()));
        }
Esempio n. 24
0
        public void FlexiTableBlocks_ExceptionsForBlocksInCellsHaveCorrectLineNumbers()
        {
            // Arrange
            var services = new ServiceCollection();

            services.AddFlexiTableBlocks();
            services.AddFlexiSectionBlocks();
            services.AddFlexiOptionsBlocks();
            using (ServiceProvider serviceProvider = services.BuildServiceProvider())
            {
                var dummyMarkdownPipelineBuilder = new MarkdownPipelineBuilder();
                dummyMarkdownPipelineBuilder.Extensions.Add(serviceProvider.GetRequiredService <IBlockExtension <FlexiTableBlock> >());
                dummyMarkdownPipelineBuilder.Extensions.Add(serviceProvider.GetRequiredService <IBlockExtension <FlexiSectionBlock> >());
                dummyMarkdownPipelineBuilder.Extensions.Add(serviceProvider.GetRequiredService <IBlockExtension <FlexiOptionsBlock> >());
                MarkdownPipeline dummyMarkdownPipeline = dummyMarkdownPipelineBuilder.Build();
                // Note: "" counts as 1 character
                const string dummyMarkdown = @"
+--------------+---------------------+--------------+
| header 1     | header 2            | header 3     |
+==============+=====================+==============+
| - cell 1     | ```                 | > cell 3     |
| - cell 2     | cell 2              | > cell 3     |
| - cell 3     | ```                 | > cell 3     |
|              |                     |              |
|              | o{""element"": 100}   |              |
|              | # Section           |              |
+--------------+---------------------+--------------+";

                // Act and assert
                BlockException result = Assert.Throws <BlockException>(() => MarkdownParser.Parse(dummyMarkdown, dummyMarkdownPipeline));
                Assert.Equal(10, result.LineNumber);
            }
        }
Esempio n. 25
0
    private string ParseMarkdown(string markdown)
    {
        var builder = new MarkdownPipelineBuilder()
                      .UseEmphasisExtras()
                      .UsePipeTables()
                      .UseGridTables()
                      .UseFooters()
                      .UseFootnotes()
                      .UseCitations()
                      .UseAutoLinks() // URLs are parsed into anchors
                                      //.UseAutoIdentifiers(AutoIdentifierOptions.GitHub) // Headers get id="name"
                      .UseAbbreviations()
                      .UseYamlFrontMatter()
                      .UseEmojiAndSmiley(true)
                      .UseMediaLinks()
                      .UseListExtras()
                      .UseFigures()
                      .UseTaskLists()
                      .UseCustomContainers()
                      .UseGenericAttributes();
        MarkdownPipeline Pipeline = builder.Build();
        var htmlWriter            = new StringWriter();
        var renderer = new HtmlRenderer(htmlWriter);

        Markdown.Convert(markdown, renderer, Pipeline);

        var html = htmlWriter.ToString();

        return(html);
    }
Esempio n. 26
0
        public static string DataRenderAndTruncate(string data, int length = 75)
        {
            var pipeline = new MarkdownPipelineBuilder()
                           .UseAdvancedExtensions();

            return(DataTruncate(Regex.Replace(Markdown.ToHtml(data, pipeline.Build()), @"<(.|\n)*?>", string.Empty), length));
        }
Esempio n. 27
0
        public override void Transform(ExtensionHtmlRenderer extensionHtmlRenderer, ObjectTextBlock block, ObjectText astNode)
        {
            var pb = new MarkdownPipelineBuilder()
                     .UseSoftlineBreakAsHardlineBreak()
                     .UseAdvancedExtensions();
            var pipeline = pb.Build();

            var path         = new Path(astNode.PackageName);
            var elements     = _provider.GetElements(path, recursive: false);
            var sb           = new StringBuilder();
            var headingLevel = block.GetHeadingLevel();

            void transform(MarkdownDocument md)
            {
                md.IncreaseHeadingLevel(1);
            }

            foreach (var element in elements)
            {
                sb.AppendLine($@"# {element.Name}");
                var notes = Helper.Converter(element.Notes, transform, pipeline);
                sb.AppendLine(element.Notes);
            }
            var document = Markdown.Parse(sb.ToString(), pipeline);

            document.IncreaseHeadingLevel(headingLevel);
            Replace(block, document);
        }
Esempio n. 28
0
        public SlideRenderer()
        {
            var pipelineBuilder = new MarkdownPipelineBuilder();

            pipelineBuilder.Use <HtmlSanitizerExtension>();
            _pipeline = pipelineBuilder.Build();
        }
Esempio n. 29
0
        public MarkdownParserMarkdig(bool usePragmaLines = false, bool force = false)
        {
            if (force || Pipeline == null)
            {
                var builder = new MarkdownPipelineBuilder()
                              .UseEmphasisExtras()
                              .UsePipeTables()
                              .UseGridTables()
                              .UseFooters()
                              .UseFootnotes()
                              .UseCitations();


                var options = mmApp.Configuration.MarkdownOptions;
                if (options.AutoLinks)
                {
                    builder = builder.UseAutoLinks();
                }
                if (options.AutoHeaderIdentifiers)
                {
                    builder = builder.UseAutoIdentifiers();
                }
                if (options.StripYamlFrontMatter)
                {
                    builder = builder.UseYamlFrontMatter();
                }
                if (options.EmojiAndSmiley)
                {
                    builder = builder.UseEmojiAndSmiley();
                }
                if (options.MediaLinks)
                {
                    builder = builder.UseMediaLinks();
                }
                if (options.ListExtras)
                {
                    builder = builder.UseListExtras();
                }
                if (options.Figures)
                {
                    builder = builder.UseFigures();
                }
                if (options.GithubTaskLists)
                {
                    builder = builder.UseTaskLists();
                }
                if (options.SmartyPants)
                {
                    builder = builder.UseSmartyPants();
                }

                if (usePragmaLines)
                {
                    builder = builder.UsePragmaLines();
                }

                Pipeline = builder.Build();
            }
        }
        public void FlexiIncludeBlocks_ThrowsBlockExceptionIfAnIncludedContentHasAnInvalidBlock()
        {
            // Arrange
            const int    dummyRenderingMode = 12;
            const string dummyRootContent   = @"
i{
    ""type"": ""markdown"",
    ""source"": ""./dummyContent1.md""
}";
            string       dummyContent1      = $@"This is valid markdown.

o{{
    ""renderingMode"": ""{dummyRenderingMode}""
}}
```
This is a FlexiCodeBlock with an invalid option.
```
";
            // Need to dispose of services after each test so that the in-memory cache doesn't affect results
            var services = new ServiceCollection();

            services.
            AddFlexiOptionsBlocks().
            AddFlexiIncludeBlocks().
            AddFlexiCodeBlocks();

            // Write to file
            var dummySource1Uri = new Uri($"{_fixture.TempDirectory}/{nameof(dummyContent1)}.md");

            File.WriteAllText(dummySource1Uri.AbsolutePath, dummyContent1);

            using (ServiceProvider serviceProvider = services.BuildServiceProvider())
            {
                var dummyMarkdownPipelineBuilder = new MarkdownPipelineBuilder();
                dummyMarkdownPipelineBuilder.Extensions.Add(serviceProvider.GetRequiredService <IBlockExtension <FlexiIncludeBlock> >());
                dummyMarkdownPipelineBuilder.Extensions.Add(serviceProvider.GetRequiredService <IBlockExtension <FlexiOptionsBlock> >());
                dummyMarkdownPipelineBuilder.Extensions.Add(serviceProvider.GetRequiredService <IBlockExtension <FlexiCodeBlock> >());
                MarkdownPipeline dummyMarkdownPipeline = dummyMarkdownPipelineBuilder.Build();
                var dummyMarkdownParserContext         = new MarkdownParserContext();
                dummyMarkdownParserContext.Properties[typeof(IFlexiIncludeBlocksExtensionOptions)] = new FlexiIncludeBlocksExtensionOptions(baseUri: _fixture.TempDirectory + "/");

                // Act and assert
                BlockException result = Assert.Throws <BlockException>(() => MarkdownParser.Parse(dummyRootContent, dummyMarkdownPipeline, dummyMarkdownParserContext));
                // From bottom to top, this is the exception chain:
                // OptionsException > BlockException for invalid FlexiCodeBlock > BlockException for invalid FlexiIncludeBlock
                Assert.Equal(string.Format(Strings.BlockException_BlockException_InvalidBlock, nameof(FlexiIncludeBlock), 2, 0,
                                           string.Format(Strings.BlockException_FlexiIncludeBlockFactory_ExceptionOccurredWhileProcessingContent, dummySource1Uri.AbsoluteUri)),
                             result.Message);
                Assert.IsType <BlockException>(result.InnerException);
                Assert.Equal(string.Format(Strings.BlockException_BlockException_InvalidBlock, nameof(FlexiCodeBlock), 6, 0,
                                           Strings.BlockException_BlockException_ExceptionOccurredWhileProcessingBlock),
                             result.InnerException.Message);
                Assert.IsType <OptionsException>(result.InnerException.InnerException);
                Assert.Equal(string.Format(Strings.OptionsException_OptionsException_InvalidOption,
                                           nameof(IFlexiCodeBlockOptions.RenderingMode),
                                           string.Format(Strings.OptionsException_Shared_ValueMustBeAValidEnumValue, dummyRenderingMode, nameof(FlexiCodeBlockRenderingMode))),
                             result.InnerException.InnerException.Message);
            }
        }
Esempio n. 31
0
        public Browser(string file)
        {
            var builder = new MarkdownPipelineBuilder()
                .UsePragmaLines()
                .UseAdvancedExtensions();

            _pipeline = builder.Build();
            _zoomFactor = GetZoomFactor();
            _file = file;
            _htmlTemplate = GetHtmlTemplate();
            _currentViewLine = -1;

            InitBrowser();
        }
        public override MarkdownPipeline GetPipeline()
        {
            var pipelineBuilder = new MarkdownPipelineBuilder();

            if (PipeTables) pipelineBuilder = pipelineBuilder.UsePipeTables();
            if (GridTables) pipelineBuilder = pipelineBuilder.UseGridTables();
            if (ExtraEmphasis) pipelineBuilder = pipelineBuilder.UseEmphasisExtras();
            if (DefinitionLists) pipelineBuilder = pipelineBuilder.UseDefinitionLists();
            if (Footnotes) pipelineBuilder = pipelineBuilder.UseFootnotes();
            if (TaskLists) pipelineBuilder = pipelineBuilder.UseTaskLists();
            if (ExtraBulletLists) pipelineBuilder = pipelineBuilder.UseListExtras();
            if (Abbreviations) pipelineBuilder = pipelineBuilder.UseAbbreviations();
            if (Emoji) pipelineBuilder = pipelineBuilder.UseEmojiAndSmiley();

            return pipelineBuilder.Build();
        }