示例#1
0
        private static void LoadValidatorConfig(string baseDir, string templateDir, MarkdownValidatorBuilder builder)
        {
            if (string.IsNullOrEmpty(baseDir))
            {
                return;
            }
            if (templateDir != null)
            {
                var configFolder = Path.Combine(templateDir, MarkdownSytleDefinition.MarkdownStyleDefinitionFolderName);
                if (Directory.Exists(configFolder))
                {
                    LoadValidatorDefinition(configFolder, builder);
                }
            }
            var configFile = Path.Combine(baseDir, MarkdownSytleConfig.MarkdownStyleFileName);

            if (File.Exists(configFile))
            {
                var config = JsonUtility.Deserialize <MarkdownSytleConfig>(configFile);
                builder.AddValidators(config.Rules);
                builder.AddTagValidators(config.TagRules);
                builder.AddSettings(config.Settings);
            }
            builder.EnsureDefaultValidator();
        }
示例#2
0
 public MarkdigMarkdownService(
     MarkdownServiceParameters parameters,
     ICompositionContainer container = null)
 {
     _parameters = parameters;
     _mvb        = MarkdownValidatorBuilder.Create(parameters, container);
 }
示例#3
0
        private static bool TryLoadValidatorConfig(string baseDir, MarkdownValidatorBuilder builder)
        {
            if (string.IsNullOrEmpty(baseDir))
            {
                return(false);
            }
            var configFile = Path.Combine(baseDir, MarkdownSytleConfig.MarkdownStyleFileName);

            if (!File.Exists(configFile))
            {
                return(false);
            }
            var config = JsonUtility.Deserialize <MarkdownSytleConfig>(configFile);

            if (config.Rules != null &&
                !config.Rules.Any(r => r.RuleName == DefaultValidatorName))
            {
                builder.AddValidators(DefaultValidatorName);
            }
            builder.AddValidators(
                from r in config.Rules ?? new MarkdownValidationRule[0]
                where !r.Disable
                select r.RuleName);
            builder.AddTagValidators(config.TagRules ?? new MarkdownTagValidationRule[0]);
            return(true);
        }
示例#4
0
        public void TestHtmlBlockTagNotInRelationValidation()
        {
            var content = @"
<div class='a'>
    <i>x</i>
    <EM>y</EM>
    <h1>
        z
        <pre><code>
            a*b*c
        </code></pre>
    </h1>
</div>
<script>alert(1);</script>";

            var builder = MarkdownValidatorBuilder.Create(null, null);

            builder.AddTagValidators(new[]
            {
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "h1", "code", "pre", "div"
                    },
                    MessageFormatter = "Invalid tag({0})!",
                    Behavior         = TagValidationBehavior.Error,
                    OpeningTagOnly   = true,
                    Relation         = TagRelation.NotIn
                }
            });

            var listener = TestLoggerListener.CreateLoggerListenerWithPhaseEqualFilter(MarkdownValidatePhaseName);

            using (new LoggerPhaseScope(MarkdownValidatePhaseName))
            {
                var html = Markup(content, builder.CreateRewriter(DefaultContext), listener);

                Assert.Equal(@"<div class='a'>
    <i>x</i>
    <EM>y</EM>
    <h1>
        z
        <pre><code>
            a*b*c
        </code></pre>
    </h1>
</div>
<script>alert(1);</script>
".Replace("\r\n", "\n"), html);
            }
            Assert.Equal(3, listener.Items.Count);
            Assert.Equal(new[]
            {
                "Invalid tag(i)!",
                "Invalid tag(EM)!",
                "Invalid tag(script)!"
            }, from item in listener.Items select item.Message);
        }
示例#5
0
        public void TestDfmTagValidate()
        {
            var builder = new DfmEngineBuilder(new Options()
            {
                Mangle = false
            });
            var mrb = new MarkdownValidatorBuilder(
                new ContainerConfiguration()
                .WithAssembly(typeof(DocfxFlavoredMarkdownTest).Assembly)
                .CreateContainer());

            mrb.AddTagValidators(new[]
            {
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "em", "div"
                    },
                    MessageFormatter = "Invalid tag({0})!",
                    Behavior         = TagValidationBehavior.Error,
                    OpeningTagOnly   = true,
                },
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "h1"
                    },
                    MessageFormatter = "Warning tag({0})!",
                    Behavior         = TagValidationBehavior.Warning,
                },
            });
            mrb.AddValidators(new[]
            {
                new MarkdownValidationRule
                {
                    ContractName = HtmlMarkdownTokenValidatorProvider.ContractName,
                }
            });
            builder.Rewriter = mrb.CreateRewriter();

            var engine   = builder.CreateDfmEngine(new DfmRenderer());
            var listener = new TestLoggerListener("test!!!!" + "." + MarkdownValidatorBuilder.MarkdownValidatePhaseName);

            Logger.RegisterListener(listener);
            string result;

            using (new LoggerPhaseScope("test!!!!"))
            {
                result = engine.Markup(@"<div><i>x</i><EM>y</EM><h1>z</h1></div>", "test");
            }
            Logger.UnregisterListener(listener);
            Assert.Equal("<div><i>x</i><EM>y</EM><h1>z</h1></div>", result);
            Assert.Equal(5, listener.Items.Count);
            Assert.Equal(new[] { HtmlMarkdownTokenValidatorProvider.WarningMessage, "Invalid tag(div)!", "Invalid tag(EM)!", "Warning tag(h1)!", "Warning tag(h1)!" }, from item in listener.Items select item.Message);
        }
示例#6
0
 private static IMarkdownTokenRewriter InitMarkdownStyle(CompositionHost host, string baseDir, string templateDir)
 {
     try
     {
         return(MarkdownValidatorBuilder.Create(host, baseDir, templateDir).CreateRewriter());
     }
     catch (Exception ex)
     {
         Logger.LogWarning($"Fail to init markdown style, details:{Environment.NewLine}{ex.ToString()}");
     }
     return(null);
 }
 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?.ToString(), code),
         (code, message, origin, line) => Logger.LogError(message, null, InclusionContext.File.ToString(), line?.ToString(), code),
         ReadFile);
 }
示例#8
0
 private IEnumerable <IInputMetadataValidator> GetMetadataRules(DocumentBuildParameters parameter)
 {
     try
     {
         var mvb = MarkdownValidatorBuilder.Create(_container, parameter.Files.DefaultBaseDir, parameter.TemplateDir);
         return(mvb.GetEnabledMetadataRules().ToList());
     }
     catch (Exception ex)
     {
         Logger.LogWarning($"Fail to init markdown style, details:{Environment.NewLine}{ex.ToString()}");
         return(Enumerable.Empty <IInputMetadataValidator>());
     }
 }
示例#9
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);
 }
示例#10
0
 private static void LoadValidatorDefinition(string mdStyleDefPath, MarkdownValidatorBuilder builder)
 {
     if (Directory.Exists(mdStyleDefPath))
     {
         foreach (var configFile in Directory.GetFiles(mdStyleDefPath, "*" + MarkdownSytleDefinition.MarkdownStyleDefinitionFilePostfix))
         {
             var fileName = Path.GetFileName(configFile);
             var category = fileName.Remove(fileName.Length - MarkdownSytleDefinition.MarkdownStyleDefinitionFilePostfix.Length);
             var config   = JsonUtility.Deserialize <MarkdownSytleDefinition>(configFile);
             builder.AddTagValidators(category, config.TagRules);
             builder.AddValidators(category, config.Rules);
         }
     }
 }
示例#11
0
 private static IMarkdownTokenRewriter InitMarkdownStyle(CompositionHost host, string baseDir)
 {
     try
     {
         var builder = new MarkdownValidatorBuilder(host);
         if (!TryLoadValidatorConfig(baseDir, builder))
         {
             builder.AddValidators(DefaultValidatorName);
         }
         return(builder.Create());
     }
     catch (Exception ex)
     {
         Logger.LogWarning($"Fail to init markdown style, details:{Environment.NewLine}{ex.ToString()}");
     }
     return(null);
 }
示例#12
0
 private static IMarkdownTokenRewriter InitMarkdownStyle(CompositionHost host)
 {
     try
     {
         if (File.Exists(MarkdownSytleConfig.MarkdownStyleFileName))
         {
             var config  = JsonUtility.Deserialize <MarkdownSytleConfig>(MarkdownSytleConfig.MarkdownStyleFileName);
             var builder = new MarkdownValidatorBuilder(host);
             builder.AddValidators(from r in config.Rules where !r.Disable select r.RuleName);
             builder.AddTagValidators(config.TagRules);
             return(builder.Create());
         }
     }
     catch (Exception ex)
     {
         Logger.LogWarning($"Fail to init markdown style, details:{Environment.NewLine}{ex.ToString()}");
     }
     return(null);
 }
示例#13
0
        public void TestHtmlBlockTagValidation()
        {
            var content = @"
<div class='a'>
    <i>x</i>
    <EM>y</EM>
    <h1>
        z
        <pre><code>
            a*b*c
        </code></pre>
    </h1>
</div>
<script>alert(1);</script>";

            var builder = MarkdownValidatorBuilder.Create(
                null,
                new CompositionContainer(
                    new ContainerConfiguration()
                    .WithAssembly(typeof(ValidationTest).Assembly)
                    .CreateContainer()));

            builder.AddTagValidators(new[]
            {
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "em", "div"
                    },
                    MessageFormatter = "Invalid tag({0})!",
                    Behavior         = TagValidationBehavior.Error,
                    OpeningTagOnly   = true,
                },
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "h1"
                    },
                    MessageFormatter = "Warning tag({0})!",
                    Behavior         = TagValidationBehavior.Warning,
                },
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "script"
                    },
                    MessageFormatter = "Warning tag({0})!",
                    Behavior         = TagValidationBehavior.Warning,
                    OpeningTagOnly   = true
                },
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "pre"
                    },
                    MessageFormatter = "Warning tag({0})!",
                    Behavior         = TagValidationBehavior.Warning,
                }
            });

            builder.AddValidators(new[]
            {
                new MarkdownValidationRule
                {
                    ContractName = HtmlMarkdownObjectValidatorProvider.ContractName,
                }
            });

            builder.LoadEnabledRulesProvider();
            var listener = TestLoggerListener.CreateLoggerListenerWithPhaseEqualFilter(MarkdownValidatePhaseName);

            using (new LoggerPhaseScope(MarkdownValidatePhaseName))
            {
                var html = Markup(content, builder.CreateRewriter(DefaultContext), listener);

                Assert.Equal(@"<div class='a'>
    <i>x</i>
    <EM>y</EM>
    <h1>
        z
        <pre><code>
            a*b*c
        </code></pre>
    </h1>
</div>
<script>alert(1);</script>
".Replace("\r\n", "\n"), html);
            }
            Assert.Equal(8, listener.Items.Count);
            Assert.Equal(new[]
            {
                "Html Tag!",
                "Invalid tag(div)!",
                "Invalid tag(EM)!",
                "Warning tag(h1)!",
                "Warning tag(pre)!",
                "Warning tag(pre)!",
                "Warning tag(h1)!",
                "Warning tag(script)!"
            }, from item in listener.Items select item.Message);
        }
示例#14
0
        public void TestHtmlInlineTagValidation()
        {
            var content = @"This is inline html: <div class='a'><i>x</i><EM>y</EM><h1>z<pre><code>a*b*c</code></pre></h1></div>

<script>alert(1);</script> end.";

            var builder = MarkdownValidatorBuilder.Create(
                null,
                new CompositionContainer(
                    new ContainerConfiguration()
                    .WithAssembly(typeof(ValidationTest).Assembly)
                    .CreateContainer()));

            builder.AddTagValidators(new[]
            {
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "em", "div"
                    },
                    MessageFormatter = "Invalid tag({0})!",
                    Behavior         = TagValidationBehavior.Error,
                    OpeningTagOnly   = true,
                },
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "h1"
                    },
                    MessageFormatter = "Warning tag({0})!",
                    Behavior         = TagValidationBehavior.Warning,
                },
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "script"
                    },
                    MessageFormatter = "Warning tag({0})!",
                    Behavior         = TagValidationBehavior.Warning,
                    OpeningTagOnly   = true
                },
                new MarkdownTagValidationRule
                {
                    TagNames = new List <string> {
                        "pre"
                    },
                    MessageFormatter = "Warning tag({0})!",
                    Behavior         = TagValidationBehavior.Warning,
                },
            });

            var listener = TestLoggerListener.CreateLoggerListenerWithPhaseEqualFilter(MarkdownValidatePhaseName);
            var html     = Markup(content, builder.CreateRewriter(), listener);

            Assert.Equal(@"<p>This is inline html: <div class='a'><i>x</i><EM>y</EM><h1>z<pre><code>a<em>b</em>c</code></pre></h1></div></p>
<script>alert(1);</script> end.
".Replace("\r\n", "\n"), html);
            Assert.Equal(7, listener.Items.Count);
            Assert.Equal(new[]
            {
                "Invalid tag(div)!",
                "Invalid tag(EM)!",
                "Warning tag(h1)!",
                "Warning tag(pre)!",
                "Warning tag(pre)!",
                "Warning tag(h1)!",
                "Warning tag(script)!"
            }, from item in listener.Items select item.Message);
        }