Ejemplo n.º 1
0
 public void ConfigureServices(IServiceCollection services)
 {
     services.AddMvc();
     var builder = new GfmEngineBuilder(new Options());
     var engine = builder.CreateEngine(new HtmlRenderer());
     services.AddSingleton<IMarkdownEngine>(engine);
 }
Ejemplo n.º 2
0
        public void TestGfmWithSequenceRewrite()
        {
            const string source   = @"
# A
## B
### C";
            const string expected = @"<h2 id=""a"">A</h2>
<h4 id=""b"">B</h4>
<h4 id=""c"">C</h4>
";

            var builder = new GfmEngineBuilder(new Options());

            builder.Rewriter =
                MarkdownTokenRewriterFactory.Sequence(
                    MarkdownTokenRewriterFactory.FromLambda(
                        (IMarkdownRewriteEngine e, MarkdownHeadingBlockToken t) =>
                        t.Depth <= 2 ? new MarkdownHeadingBlockToken(t.Rule, t.Context, t.Content, t.Id, t.Depth + 1, t.SourceInfo) : null),
                    MarkdownTokenRewriterFactory.FromLambda(
                        (IMarkdownRewriteEngine e, MarkdownHeadingBlockToken t) =>
                        t.Depth == 3 ? new MarkdownHeadingBlockToken(t.Rule, t.Context, t.Content, t.Id, t.Depth + 1, t.SourceInfo) : null)
                    );
            var engine = builder.CreateEngine(new HtmlRenderer());
            var result = engine.Markup(source);

            Assert.Equal(expected.Replace("\r\n", "\n"), result);
        }
Ejemplo n.º 3
0
        public void TestGfmWithValidator()
        {
            const string source          = "#Hello World";
            const string expected        = "<h1 id=\"hello-world\">Hello World</h1>\n";
            const string expectedMessage = "a space is expected after '#'";
            string       message         = null;
            var          builder         = new GfmEngineBuilder(new Options
            {
                LegacyMode = true,
            });

            builder.Rewriter =
                MarkdownTokenRewriterFactory.FromValidators(
                    MarkdownTokenValidatorFactory.FromLambda(
                        (MarkdownHeadingBlockToken token) =>
            {
                if (!token.SourceInfo.Markdown.StartsWith("# "))
                {
                    message = expectedMessage;
                }
            }));
            var engine = builder.CreateEngine(new HtmlRenderer());
            var result = engine.Markup(source);

            Assert.Equal(expected.Replace("\r\n", "\n"), result);
            Assert.Equal(expectedMessage, message);
        }
Ejemplo n.º 4
0
        public void TestGfmInGeneral(string source, string expected)
        {
            var builder = new GfmEngineBuilder(new Options());
            var engine  = builder.CreateEngine(new HtmlRenderer());
            var result  = engine.Markup(source);

            Assert.Equal(expected.Replace("\r\n", "\n"), result);
        }
Ejemplo n.º 5
0
        public void TestAggregateHead1_Hr_To_Head2(string source, string expected)
        {
            var builder = new GfmEngineBuilder(new Options())
            {
                TokenAggregators = ImmutableList.Create <IMarkdownTokenAggregator>(new Head1HrAggregateToHead2()),
            };
            var engine = builder.CreateEngine(new HtmlRenderer());
            var result = engine.Markup(source);

            Assert.Equal(expected.Replace("\r\n", "\n"), result);
        }
Ejemplo n.º 6
0
        public void TestAggregatePara_Para_To_Para(string source, string expected)
        {
            var builder = new GfmEngineBuilder(new Options())
            {
                TokenAggregator = new ParaParaAggregateToPara(),
            };
            var engine = builder.CreateEngine(new HtmlRenderer());
            var result = engine.Markup(source);

            Assert.Equal(expected.Replace("\r\n", "\n"), result);
        }
Ejemplo n.º 7
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(
            IServiceCollection services)
        {
            services.AddControllers();

            var builder = new GfmEngineBuilder(
                options: new Options());
            var engine = builder.CreateEngine(
                renderer: new HtmlRenderer());

            services.AddSingleton <IMarkdownEngine>(
                implementationInstance: engine);
        }
Ejemplo n.º 8
0
        public void TestPerf()
        {
            const int RepeatCount = 1000;
            string    source      = GetSource(RepeatCount);
            var       builder     = new GfmEngineBuilder(new Options());
            var       engine      = builder.CreateEngine(new HtmlRenderer());

            for (int i = 0; i < 2; i++)
            {
                var result = engine.Markup(source);
                Assert.True(Enumerable.SequenceEqual(GetExpectedLines(RepeatCount), GetLines(result)));
            }
            GC.Collect();
        }
Ejemplo n.º 9
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            var builder = new GfmEngineBuilder(new Options());
            var engine  = builder.CreateEngine(new HtmlRenderer());

            services.AddSingleton <IMarkdownEngine>(engine);

            var configBuilder = new ConfigurationBuilder();

            configBuilder.AddJsonFile("config.json", false); // false == this file is not optional, throw if not found

            services.AddSingleton <IConfigurationRoot>(configBuilder.Build());
        }
Ejemplo n.º 10
0
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            var builder = new GfmEngineBuilder(new Options());
            var engine  = builder.CreateEngine(new HtmlRenderer());

            services.AddSingleton <IMarkdownEngine>(engine);

            var configBuilder = new ConfigurationBuilder();

            configBuilder.AddJsonFile("config.json", true);
            var configRoot = configBuilder.Build();

            services.AddSingleton <IConfigurationRoot>(configRoot);
        }
Ejemplo n.º 11
0
        public void TestCompositeAggregate(string source, string expected)
        {
            var builder = new GfmEngineBuilder(new Options())
            {
                TokenAggregator = new CompositeMarkdownTokenAggregator(
                    new IMarkdownTokenAggregator[]
                {
                    new ParaParaAggregateToPara(),
                    new Head1HrAggregateToHead2(),
                }),
            };
            var engine = builder.CreateEngine(new HtmlRenderer());
            var result = engine.Markup(source);

            Assert.Equal(expected.Replace("\r\n", "\n"), result);
        }
Ejemplo n.º 12
0
        public static void Main()
        {
            string source  = @"
Building Your First .NET Core Applications
=======
In this chapter, we will learn how to setup our development environment,
create an application, and
";
            var    builder = new GfmEngineBuilder(
                new Options());
            var engine = builder.CreateEngine(
                new HtmlRenderer());
            var result = engine.Markup(
                source);

            Console.WriteLine(
                result);
        }
Ejemplo n.º 13
0
        public void TestGfmWithValidatorWithQuery()
        {
            const string source     = @"abc (not match)

- abc (match)
- a*b*c (match)
- xyz
- x

> a**b**c (not match)";
            const string expected   = @"<p>abc (not match)</p>
<ul>
<li>abc (match)</li>
<li>a<em>b</em>c (match)</li>
<li>xyz</li>
<li>x</li>
</ul>
<blockquote>
<p>a<strong>b</strong>c (not match)</p>
</blockquote>
";
            int          matchCount = 0;
            var          builder    = new GfmEngineBuilder(new Options());

            builder.Rewriter =
                MarkdownTokenRewriterFactory.FromValidators(
                    MarkdownTokenValidatorFactory.FromLambda(
                        (MarkdownListItemBlockToken token) =>
            {
                var text = string.Concat(from t in token.Descendants <MarkdownTextToken>() select t.Content);
                if (text.Contains("abc"))
                {
                    matchCount++;
                }
            }));
            var engine = builder.CreateEngine(new HtmlRenderer());
            var result = engine.Markup(source);

            Assert.Equal(expected.Replace("\r\n", "\n"), result);
            Assert.Equal(2, matchCount);
        }
Ejemplo n.º 14
0
        public void TestGfmWithValidatorWithContext()
        {
            const string source          = @"# Title-1
# Title-2";
            const string expected        = @"<h1 id=""title-1"">Title-1</h1>
<h1 id=""title-2"">Title-2</h1>
";
            const string expectedMessage = "expected one title in one document.";
            string       message         = null;
            var          builder         = new GfmEngineBuilder(new Options());

            builder.Rewriter =
                MarkdownTokenRewriterFactory.FromValidators(
                    MarkdownTokenValidatorFactory.FromLambda(
                        (MarkdownHeadingBlockToken token) =>
            {
                var re = MarkdownTokenValidatorContext.CurrentRewriteEngine;
                if (token.Depth == 1)
                {
                    re.SetVariable("count", (int)re.GetVariable("count") + 1);
                }
            },
                        re =>
            {
                re.SetVariable("count", 0);
                re.SetPostProcess("h1 count", re1 =>
                {
                    if ((int)re.GetVariable("count") != 1)
                    {
                        message = expectedMessage;
                    }
                });
            }));
            var engine = builder.CreateEngine(new HtmlRenderer());
            var result = engine.Markup(source);

            Assert.Equal(expected.Replace("\r\n", "\n"), result);
            Assert.Equal(expectedMessage, message);
        }
Ejemplo n.º 15
0
        public void ParseWithBadRewrite()
        {
            const string source = @"
# Heading
";

            var builder = new GfmEngineBuilder(new Options());

            builder.Rewriter =
                MarkdownTokenRewriterFactory.Loop(
                    MarkdownTokenRewriterFactory.Composite(
                        MarkdownTokenRewriterFactory.FromLambda(
                            (IMarkdownRewriteEngine e, MarkdownHeadingBlockToken t) => new MarkdownTextToken(t.Rule, t.Context, t.RawMarkdown, t.RawMarkdown)
                            ),
                        MarkdownTokenRewriterFactory.FromLambda(
                            (IMarkdownRewriteEngine e, MarkdownTextToken t) => new MarkdownHeadingBlockToken(t.Rule, t.Context, new InlineContent(ImmutableArray <IMarkdownToken> .Empty), "aaaa", 1, t.RawMarkdown)
                            )
                        ),
                    10);
            var engine = builder.CreateEngine(new HtmlRenderer());

            Assert.Throws <InvalidOperationException>(() => engine.Markup(source));
        }
Ejemplo n.º 16
0
        public void ParseWithBadRewrite()
        {
            const string source = @"
# Heading
";

            var builder = new GfmEngineBuilder(new Options());

            builder.Rewriter =
                MarkdownRewriterFactory.Loop(
                    MarkdownRewriterFactory.Composite(
                        MarkdownRewriterFactory.FromLambda(
                            (MarkdownEngine e, MarkdownHeadingBlockToken t) => new MarkdownTextToken(t.Rule, t.Content)
                            ),
                        MarkdownRewriterFactory.FromLambda(
                            (MarkdownEngine e, MarkdownTextToken t) => new MarkdownHeadingBlockToken(t.Rule, t.Content, 1)
                            )
                        ),
                    10);
            var engine = builder.CreateEngine(new MarkdownRenderer());

            Assert.Throws <InvalidOperationException>(() => engine.Markup(source));
        }
Ejemplo n.º 17
0
        public void TestPerf()
        {
            const string source           = @"
Heading
=======
 
Sub-heading
-----------
  
### Another deeper heading
  
Paragraphs are separated
by a blank line.
 
Leave 2 spaces at the end of a line to do a  
line break
 
Text attributes *italic*, **bold**, 
`monospace`, ~~strikethrough~~ .
 
A [link](http://example.com).

Shopping list:
 
* apples
* oranges
* pears
 
Numbered list:
 
1. apples
2. oranges
3. pears
";
            const string expectedTemplate = @"<h1 id=""heading{0}"">Heading</h1>
<h2 id=""sub-heading{0}"">Sub-heading</h2>
<h3 id=""another-deeper-heading{0}"">Another deeper heading</h3>
<p>Paragraphs are separated
by a blank line.</p>
<p>Leave 2 spaces at the end of a line to do a<br>line break</p>
<p>Text attributes <em>italic</em>, <strong>bold</strong>, 
<code>monospace</code>, <del>strikethrough</del> .</p>
<p>A <a href=""http://example.com"">link</a>.</p>
<p>Shopping list:</p>
<ul>
<li>apples</li>
<li>oranges</li>
<li>pears</li>
</ul>
<p>Numbered list:</p>
<ol>
<li>apples</li>
<li>oranges</li>
<li>pears</li>
</ol>
";

            var builder      = new GfmEngineBuilder(new Options());
            var source1000   = string.Concat(Enumerable.Repeat(source, 1000));
            var template     = Regex.Replace(expectedTemplate, "\r?\n", "\n");
            var first        = string.Format(template, "");
            var expectedList = new List <string> {
                first
            };

            for (var i = 1; i < 1000; i++)
            {
                var content = string.Concat("-", i - 1);
                expectedList.Add(string.Format(template, content));
            }
            var expected1000 = string.Concat(expectedList);
            var engine       = builder.CreateEngine(new HtmlRenderer());

            for (int i = 0; i < 2; i++)
            {
                var result = engine.Markup(source1000);
                Assert.Equal(expected1000, result);
            }
            GC.Collect();
        }
Ejemplo n.º 18
0
        public void TestGfmWithRewrite()
        {
            const string source   = @"
Heading
=======
 
Sub-heading
-----------
  
### Another deeper heading
  
Paragraphs are separated
by a blank line.
 
Leave 2 spaces at the end of a line to do a  
line break
 
Text attributes *italic*, **bold**, 
`monospace`, ~~strikethrough~~ .
 
A [link](http://example.com).

Shopping list:
 
* apples
* oranges
* pears
 
Numbered list:
 
1. apples
2. oranges
3. pears
";
            const string expected = @"<p>Paragraphs are separated
by a blank line.</p>
<p>Leave 2 spaces at the end of a line to do a<br>line break</p>
<p>Text attributes <em>italic</em>, <strong>bold</strong>, 
<code>monospace</code>, <del>strikethrough</del> .</p>
<p>A <a href=""http://example.com"">link</a>.</p>
<p>Shopping list:</p>
<ul>
<li>apples</li>
<li>oranges</li>
<li>pears</li>
</ul>
<p>Numbered list:</p>
<ol>
<li>apples</li>
<li>oranges</li>
<li>pears</li>
</ol>
";

            var builder = new GfmEngineBuilder(new Options());

            builder.Rewriter =
                MarkdownTokenRewriterFactory.FromLambda(
                    (IMarkdownRewriteEngine e, MarkdownHeadingBlockToken t) => new MarkdownIgnoreToken(t.Rule, t.Context, t.RawMarkdown) // ignore all heading
                    );
            var engine = builder.CreateEngine(new HtmlRenderer());
            var result = engine.Markup(source);

            Assert.Equal(expected.Replace("\r\n", "\n"), result);
        }
Ejemplo n.º 19
0
        public void TestGfmWithValidatorWithParents()
        {
            const string source              = @"# abc
> *abc*

- abc

abc
";
            const string expected            = @"<h1 id=""abc"">abc</h1>
<blockquote>
<p><em>abc</em></p>
</blockquote>
<ul>
<li>abc</li>
</ul>
<p>abc</p>
";
            int          headingTextCount    = 0;
            int          blockquoteTextCount = 0;
            int          listTextCount       = 0;
            int          paraTextCount       = 0;
            var          builder             = new GfmEngineBuilder(new Options());

            builder.Rewriter =
                MarkdownTokenRewriterFactory.FromValidators(
                    MarkdownTokenValidatorFactory.FromLambda(
                        (MarkdownTextToken token) =>
            {
                if (token.Content == "abc")
                {
                    var re = MarkdownTokenValidatorContext.CurrentRewriteEngine;
                    foreach (var parent in re.GetParents())
                    {
                        if (parent is MarkdownHeadingBlockToken)
                        {
                            headingTextCount++;
                        }
                        else if (parent is MarkdownBlockquoteBlockToken)
                        {
                            blockquoteTextCount++;
                        }
                        else if (parent is MarkdownListItemBlockToken)
                        {
                            listTextCount++;
                        }
                        else if (parent is MarkdownParagraphBlockToken)
                        {
                            paraTextCount++;
                        }
                    }
                }
            }));
            var engine = builder.CreateEngine(new HtmlRenderer());
            var result = engine.Markup(source);

            Assert.Equal(expected.Replace("\r\n", "\n"), result);
            Assert.Equal(1, headingTextCount);
            Assert.Equal(1, blockquoteTextCount);
            Assert.Equal(1, listTextCount);
            Assert.Equal(2, paraTextCount);
        }