Example #1
0
 public MarkdigMarkdownService(
     MarkdownServiceParameters parameters,
     ICompositionContainer container = null)
 {
     _parameters = parameters;
     _mvb        = MarkdownValidatorBuilder.Create(parameters, container);
     _context    = new MarkdownContext(
         key => _parameters.Tokens.TryGetValue(key, out var value) ? value : null,
         (code, message, origin, line) => Logger.LogWarning(message, null, InclusionContext.File.ToString(), (line ?? 0).ToString(), code),
         (code, message, origin, line) => Logger.LogError(message, null, InclusionContext.File.ToString(), (line ?? 0).ToString(), code),
         ReadFile);
 }
Example #2
0
        public static MarkdigMarkdownService CreateMarkdownService()
        {
            var parameter = new MarkdownServiceParameters
            {
                BasePath   = ".",
                Extensions = new Dictionary <string, object>
                {
                    { LineNumberExtension.EnableSourceInfo, false }
                }
            };

            return(new MarkdigMarkdownService(parameter));
        }
Example #3
0
 public MarkdigMarkdownService(
     MarkdownServiceParameters parameters,
     ICompositionContainer container = null)
 {
     _parameters = parameters;
     _mvb        = MarkdownValidatorBuilder.Create(parameters, container);
     _context    = new MarkdownContext(
         _parameters.Tokens,
         (code, message, file, line) => Logger.LogWarning(message, null, file, line.ToString(), code),
         (code, message, file, line) => Logger.LogError(message, null, file, line.ToString(), code),
         ReadFile,
         GetLink);
 }
Example #4
0
        static MarkdigForDocfx()
        {
            var parameter = new MarkdownServiceParameters
            {
                BasePath   = ".",
                Extensions = new Dictionary <string, object>
                {
                    { "EnableSourceInfo", false }
                }
            };

            _service = new MarkdigMarkdownService(parameter);
        }
Example #5
0
        private static MarkupResult SimpleMarkup(string source)
        {
            var parameter = new MarkdownServiceParameters
            {
                BasePath   = ".",
                Extensions = new Dictionary <string, object>
                {
                    { LineNumberExtension.EnableSourceInfo, true }
                }
            };
            var service = new MarkdigMarkdownService(parameter);

            return(service.Markup(source, "Topic.md"));
        }
Example #6
0
        public static MarkupResult MarkupWithoutSourceInfo(string content, string filePath = null)
        {
            var parameter = new MarkdownServiceParameters
            {
                BasePath   = ".",
                Extensions = new Dictionary <string, object>
                {
                    { LineNumberExtension.EnableSourceInfo, false }
                }
            };
            var service = new MarkdigMarkdownService(parameter);

            return(service.Markup(content, filePath ?? string.Empty));
        }
        private static string Markup(string markdown, string filePath, string basePath = ".")
        {
            EnvironmentContext.FileAbstractLayerImpl = FileAbstractLayerBuilder.Default.ReadFromRealFileSystem(basePath).WriteToRealFileSystem(basePath).Create();
            var parameter = new MarkdownServiceParameters
            {
                BasePath   = basePath,
                Extensions = new Dictionary <string, object>
                {
                    { "EnableSourceInfo", true }
                }
            };
            var markupService = new MarkdigMarkdownService(parameter);

            return(markupService.Markup(markdown, filePath ?? "topic.md").Html);
        }
Example #8
0
        public MarkdownDocument Parse(MarkdownContext context, MarkdownServiceParameters parameters)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            var pipeline = CreatePipeline(context, parameters);

            return(Markdown.Parse(context.Content, pipeline));
        }
        public static MarkdownValidatorBuilder Create(
            MarkdownServiceParameters parameters,
            ICompositionContainer container)
        {
            var builder = new MarkdownValidatorBuilder(container);

            if (parameters != null)
            {
                LoadValidatorConfig(parameters.BasePath, parameters.TemplateDir, builder);
            }

            if (container != null)
            {
                builder.LoadEnabledRulesProvider();
            }

            return(builder);
        }
Example #10
0
        public string Render(MarkdownDocument document, MarkdownContext context, MarkdownServiceParameters parameters)
        {
            if (document == null)
            {
                throw new ArgumentNullException(nameof(document));
            }

            var pipeline = CreatePipeline(context, parameters);

            using (var writer = new StringWriter())
            {
                var renderer = new HtmlRenderer(writer);
                pipeline.Setup(renderer);
                renderer.Render(document);
                writer.Flush();

                return(writer.ToString());
            }
        }
Example #11
0
        private MarkdownPipeline CreatePipeline(MarkdownContext context, MarkdownServiceParameters parameters)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            var builder = new MarkdownPipelineBuilder()
                          .UseMarkdigAdvancedExtensions()
                          .UseDfmExtensions(this, context, parameters)
                          .RemoveUnusedExtensions();

            return(builder.Build());
        }
Example #12
0
 public static MarkdownPipelineBuilder UseDfmExtensions(
     this MarkdownPipelineBuilder pipeline,
     MarkdigCompositor compositor,
     MarkdownContext context,
     MarkdownServiceParameters parameters)
 {
     return(pipeline
            .UseHeadingIdRewriter()
            .UseIncludeFile(compositor, context, parameters)
            .UseCodeSnippet(compositor, context)
            .UseYamlHeader()
            .UseDFMCodeInfoPrefix()
            .UseQuoteSectionNote(parameters)
            .UseXref()
            //.UseEmojiAndSmiley(false)
            .UseTabGroup()
            .UseInineParserOnly(context)
            .UseLineNumber(context, parameters)
            .UseMonikerRange()
            .UseValidators(context, parameters));
 }
        public void TestDfmNote_NoteWithLocalization()
        {
            var source    = @"# Note not in one line
> [!NOTE]
> hello
> world
> [!WARNING]
> Hello world
this is also warning";
            var expected  = @"<h1 id=""note-not-in-one-line"">Note not in one line</h1>
<div class=""NOTE"">
<h5>注意</h5>
<p>hello
world</p>
</div>
<div class=""WARNING"">
<h5>警告</h5>
<p>Hello world
this is also warning</p>
</div>
";
            var parameter = new MarkdownServiceParameters
            {
                BasePath = ".",
                Tokens   = new Dictionary <string, string>
                {
                    { "note", "<h5>注意</h5>" },
                    { "warning", "<h5>警告</h5>" }
                }.ToImmutableDictionary(),
                Extensions = new Dictionary <string, object>
                {
                    { LineNumberExtension.EnableSourceInfo, false }
                }
            };
            var service = new MarkdigMarkdownService(parameter);
            var marked  = service.Markup(source, "Topic.md");

            Assert.Equal(expected.Replace("\r\n", "\n"), marked.Html);
        }
Example #14
0
        public IMarkdownService CreateMarkdownService(MarkdownServiceParameters parameters)
        {
            IReadOnlyList <string> fallbackFolders = null;

            if (parameters.Extensions != null && parameters.Extensions.TryGetValue("fallbackFolders", out object obj))
            {
                try
                {
                    fallbackFolders = ((IEnumerable)obj).Cast <string>().ToList();
                }
                catch
                {
                    // Swallow cast exception.
                }
            }

            return(new DfmService(
                       parameters.BasePath,
                       parameters.TemplateDir,
                       parameters.Tokens,
                       TokenTreeValidator,
                       fallbackFolders));
        }
        public void TestSectionBlockLevel(string source)
        {
            var parameter = new MarkdownServiceParameters
            {
                BasePath = "."
            };
            var service = new MarkdigMarkdownService(parameter);
            var content = service.Markup(source, "Topic.md");

            // assert
            XmlDocument xdoc = new XmlDocument();

            xdoc.LoadXml(content.Html);
            var tabbedCodeNode = xdoc.SelectSingleNode("//div[@class='tabbedCodeSnippets' and @data-resources='OutlookServices.Calendar']");

            Assert.True(tabbedCodeNode != null);
            var csNode = tabbedCodeNode.SelectSingleNode("./pre/code[@class='lang-cs-i']");

            Assert.True(csNode != null);
            var jsNode = tabbedCodeNode.SelectSingleNode("./pre/code[@class='lang-javascript-i']");

            Assert.True(jsNode != null);
        }
        public MarkdigMarkdownRenderer(Stack <IMarkdownToken> processedBlockTokens, string basePath, bool useLegacyMode = true, MigrationRule rule = MigrationRule.All)
        {
            var option = DocfxFlavoredMarked.CreateDefaultOptions();

            option.LegacyMode = useLegacyMode;
            var builder = new DfmEngineBuilder(option);
            var render  = new DfmRenderer();

            _dfmEngine     = builder.CreateDfmEngine(render);
            _dfmHtmlRender = new DfmHtmlRender(useLegacyMode);
            _rule          = rule;

            var parameter = new MarkdownServiceParameters
            {
                BasePath   = basePath,
                Extensions = new Dictionary <string, object>
                {
                    { "EnableSourceInfo", false }
                }
            };

            _service = new MarkdigMarkdownService(parameter);
            _processedBlockTokens = processedBlockTokens;
        }
Example #17
0
 public static MarkdownPipelineBuilder UseIncludeFile(this MarkdownPipelineBuilder pipeline, MarkdownEngine compositor, MarkdownContext context, MarkdownServiceParameters parameters)
 {
     pipeline.Extensions.Insert(0, new InclusionExtension(compositor, context, parameters));
     if (context.InclusionSet != null && !context.InclusionSet.IsEmpty)
     {
         pipeline.DocumentProcessed += InclusionExtension.GetProcessDocumentDelegate(context);
     }
     return(pipeline);
 }
Example #18
0
        public void TestFallback_InclusionWithCodeFences()
        {
            // -root_folder (this is also docset folder)
            //  |- root.md
            //  |- a_folder
            //     |- a.md
            //  |- code_folder
            //     |- sample1.cs
            // -fallback_folder
            //  |- a_folder
            //     |- code_in_a.cs
            //  |- code_folder
            //     |- sample2.cs

            // 1. Prepare data
            var root = @"markdown root.md main content start.

mardown a content in root.md content start

[!include[a](a_folder/a.md ""This is a.md"")]

mardown a content in root.md content end

sample 1 code in root.md content start

[!CODE-cs[this is sample 1 code](code_folder/sample1.cs)]

sample 1 code in root.md content end

sample 2 code in root.md content start

[!CODE-cs[this is sample 2 code](code_folder/sample2.cs)]

sample 2 code in root.md content end

markdown root.md main content end.";

            var a = @"markdown a.md main content start.

code_in_a code in a.md content start

[!CODE-cs[this is code_in_a code](code_in_a.cs)]

code_in_a in a.md content end

markdown a.md a.md content end.";

            var code_in_a = @"namespace code_in_a{}";

            var sample1 = @"namespace sample1{}";

            var sample2 = @"namespace sample2{}";

            var uniqueFolderName = Path.GetRandomFileName();

            TestUtility.WriteToFile($"{uniqueFolderName}/root_folder/root.md", root);
            TestUtility.WriteToFile($"{uniqueFolderName}/root_folder/a_folder/a.md", a);
            TestUtility.WriteToFile($"{uniqueFolderName}/root_folder/code_folder/sample1.cs", sample1);
            TestUtility.WriteToFile($"{uniqueFolderName}/fallback_folder/a_folder/code_in_a.cs", code_in_a);
            TestUtility.WriteToFile($"{uniqueFolderName}/fallback_folder/code_folder/sample2.cs", sample2);

            var fallbackFolders = new List <string> {
                { Path.Combine(Directory.GetCurrentDirectory(), $"{uniqueFolderName}/fallback_folder") }
            };

            // Verify root.md markup result
            var parameter = new MarkdownServiceParameters
            {
                BasePath = "."
            };
            var service = new MarkdigMarkdownService(parameter);
            //var rootMarked = service.Markup(Path.Combine(Directory.GetCurrentDirectory(), $"{uniqueFolderName}/root_folder"), root, fallbackFolders, "root.md");
            var rootMarked     = service.Markup("place", "holder");
            var rootDependency = rootMarked.Dependency;

            Assert.Equal(@"<p>markdown root.md main content start.</p>
<p>mardown a content in root.md content start</p>
<p>markdown a.md main content start.</p>
<p>code_in_a code in a.md content start</p>
<pre><code class=""lang-cs"" name=""this is code_in_a code"">namespace code_in_a{}
</code></pre><p>code_in_a in a.md content end</p>
<p>markdown a.md a.md content end.</p>
<p>mardown a content in root.md content end</p>
<p>sample 1 code in root.md content start</p>
<pre><code class=""lang-cs"" name=""this is sample 1 code"">namespace sample1{}
</code></pre><p>sample 1 code in root.md content end</p>
<p>sample 2 code in root.md content start</p>
<pre><code class=""lang-cs"" name=""this is sample 2 code"">namespace sample2{}
</code></pre><p>sample 2 code in root.md content end</p>
<p>markdown root.md main content end.</p>
".Replace("\r\n", "\n"), rootMarked.Html);
            Assert.Equal(
                new[] { "../fallback_folder/a_folder/code_in_a.cs", "../fallback_folder/code_folder/sample2.cs", "a_folder/a.md", "a_folder/code_in_a.cs", "code_folder/sample1.cs", "code_folder/sample2.cs" },
                rootDependency.OrderBy(x => x).ToArray());

            // Verify a.md markup result
            //var aMarked = service.Markup(Path.Combine(Directory.GetCurrentDirectory(), $"{uniqueFolderName}/root_folder"), a, fallbackFolders, "a_folder/a.md");
            var aMarked     = service.Markup("place", "holder");
            var aDependency = aMarked.Dependency;

            Assert.Equal(@"<p>markdown a.md main content start.</p>
<p>code_in_a code in a.md content start</p>
<pre><code class=""lang-cs"" name=""this is code_in_a code"">namespace code_in_a{}
</code></pre><p>code_in_a in a.md content end</p>
<p>markdown a.md a.md content end.</p>
".Replace("\r\n", "\n"), aMarked.Html);
            Assert.Equal(
                new[] { "../../fallback_folder/a_folder/code_in_a.cs", "code_in_a.cs" },
                aDependency.OrderBy(x => x).ToArray());
        }
Example #19
0
        public void TestFallback_Inclusion_random_name()
        {
            // -root_folder (this is also docset folder)
            //  |- root.md
            //  |- a_folder
            //  |  |- a.md
            //  |- token_folder
            //  |  |- token1.md
            // -fallback_folder
            //  |- token_folder
            //     |- token2.md

            // 1. Prepare data
            var uniqueFolderName = Path.GetRandomFileName();
            var root             = $@"1markdown root.md main content start.

[!include[a](a_folder_{uniqueFolderName}/a_{uniqueFolderName}.md ""This is a.md"")]

markdown root.md main content end.";

            var a = $@"1markdown a.md main content start.

[!include[token1](../token_folder_{uniqueFolderName}/token1_{uniqueFolderName}.md ""This is token1.md"")]
[!include[token1](../token_folder_{uniqueFolderName}/token2_{uniqueFolderName}.md ""This is token2.md"")]

markdown a.md main content end.";

            var token1 = $@"1markdown token1.md content start.

[!include[token2](token2_{uniqueFolderName}.md ""This is token2.md"")]

markdown token1.md content end.";

            var token2 = @"**1markdown token2.md main content**";

            TestUtility.WriteToFile($"{uniqueFolderName}/root_folder_{uniqueFolderName}/root_{uniqueFolderName}.md", root);
            TestUtility.WriteToFile($"{uniqueFolderName}/root_folder_{uniqueFolderName}/a_folder_{uniqueFolderName}/a_{uniqueFolderName}.md", a);
            TestUtility.WriteToFile($"{uniqueFolderName}/root_folder_{uniqueFolderName}/token_folder_{uniqueFolderName}/token1_{uniqueFolderName}.md", token1);
            TestUtility.WriteToFile($"{uniqueFolderName}/fallback_folder_{uniqueFolderName}/token_folder_{uniqueFolderName}/token2_{uniqueFolderName}.md", token2);

            var fallbackFolders = new List <string> {
                { Path.Combine(Directory.GetCurrentDirectory(), $"{uniqueFolderName}/fallback_folder_{uniqueFolderName}") }
            };
            var parameter = new MarkdownServiceParameters
            {
                BasePath = "."
            };
            var service = new MarkdigMarkdownService(parameter);
            //var marked = service.Markup(Path.Combine(Directory.GetCurrentDirectory(), $"{uniqueFolderName}/root_folder_{uniqueFolderName}"), root, fallbackFolders, $"root_{uniqueFolderName}.md");
            var marked     = service.Markup("place", "holder");
            var dependency = marked.Dependency;

            Assert.Equal(@"<p>1markdown root.md main content start.</p>
<p>1markdown a.md main content start.</p>
<p>1markdown token1.md content start.</p>
<p><strong>1markdown token2.md main content</strong></p>
<p>markdown token1.md content end.</p>
<p><strong>1markdown token2.md main content</strong></p>
<p>markdown a.md main content end.</p>
<p>markdown root.md main content end.</p>
".Replace("\r\n", "\n"), marked.Html);
            Assert.Equal(
                new[] { $"../fallback_folder_{uniqueFolderName}/token_folder_{uniqueFolderName}/token2_{uniqueFolderName}.md", $"a_folder_{uniqueFolderName}/a_{uniqueFolderName}.md", $"token_folder_{uniqueFolderName}/token1_{uniqueFolderName}.md", $"token_folder_{uniqueFolderName}/token2_{uniqueFolderName}.md" },
                dependency.OrderBy(x => x).ToArray());
        }
 public IMarkdownService CreateMarkdownService(MarkdownServiceParameters parameters)
 {
     return(new JsonTokenTreeService());
 }
Example #21
0
 public IMarkdownService CreateMarkdownService(MarkdownServiceParameters parameters)
 {
     return(new GfmService());
 }
 public InclusionExtension(IMarkdigCompositor compositor, MarkdownContext context, MarkdownServiceParameters parameters)
 {
     _compositor = compositor;
     _context    = context;
     _parameters = parameters;
 }
Example #23
0
 public InclusionExtension(IMarkdownEngine engine, MarkdownContext context, MarkdownServiceParameters parameters)
 {
     _engine     = engine;
     _context    = context;
     _parameters = parameters;
 }
Example #24
0
        public static MarkdownPipelineBuilder UseValidators(this MarkdownPipelineBuilder pipeline, MarkdownContext context, MarkdownServiceParameters parameters)
        {
            var tokenRewriter = context.Mvb.CreateRewriter();
            var visitor       = new MarkdownDocumentVisitor(tokenRewriter);

            pipeline.DocumentProcessed += document =>
            {
                visitor.Visit(document);
            };

            return(pipeline);
        }
Example #25
0
        public static MarkdownPipelineBuilder UseLineNumber(this MarkdownPipelineBuilder pipeline, MarkdownContext context, MarkdownServiceParameters parameters)
        {
            object enableSourceInfo = null;

            parameters?.Extensions?.TryGetValue(LineNumberExtension.EnableSourceInfo, out enableSourceInfo);

            var enabled = enableSourceInfo as bool?;

            if (enabled != null && enabled == false)
            {
                return(pipeline);
            }

            var absoluteFilePath  = Path.Combine(context.BasePath, context.FilePath);
            var lineNumberContext = LineNumberExtensionContext.Create(context.Content, absoluteFilePath, context.FilePath);

            pipeline.PreciseSourceLocation = true;
            pipeline.DocumentProcessed    += LineNumberExtension.GetProcessDocumentDelegate(lineNumberContext);

            return(pipeline);
        }
 public HtmlInclusionBlockRenderer(IMarkdownEngine engine, MarkdownContext context, MarkdownServiceParameters parameters)
 {
     _engine     = engine;
     _context    = context;
     _parameters = parameters;
 }
Example #27
0
 public IMarkdownService CreateMarkdownService(MarkdownServiceParameters parameters)
 {
     return(new DfmService(parameters.BasePath, parameters.Tokens));
 }
Example #28
0
 public IMarkdownService CreateMarkdownService(MarkdownServiceParameters parameters)
 {
     return(new DfmJsonTokenTreeService(
                parameters.BasePath,
                MarkdownTokenTreeValidatorFactory.Combine(TokenTreeValidator)));
 }
 public IMarkdownService CreateMarkdownService(MarkdownServiceParameters parameters)
 {
     return(new MarkdigMarkdownService(parameters, Container));
 }
Example #30
0
 public static MarkdownPipelineBuilder UseQuoteSectionNote(this MarkdownPipelineBuilder pipeline, MarkdownServiceParameters parameters)
 {
     pipeline.Extensions.Insert(0, new QuoteSectionNoteExtension(parameters));
     return(pipeline);
 }