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(); }
public MarkdigMarkdownService( MarkdownServiceParameters parameters, ICompositionContainer container = null) { _parameters = parameters; _mvb = MarkdownValidatorBuilder.Create(parameters, container); }
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); }
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); }
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); }
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); }
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>()); } }
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); }
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); } } }
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); }
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); }
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); }
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); }