diff --git a/docs/reference/docfx-json-reference.md b/docs/reference/docfx-json-reference.md index 4f9bc8b9a67..7418cd2b013 100644 --- a/docs/reference/docfx-json-reference.md +++ b/docs/reference/docfx-json-reference.md @@ -10,6 +10,20 @@ The `docfx.json` file indicates that the directory is the root of a docfx projec } ``` +## Global properties + +### `rules` + +Overrides default log message severity level: + +```json +{ + "rules": { + "InvalidHref": "Info" + } +} +``` + ## `build` Configuration options that are applied for `docfx build` command: diff --git a/src/Docfx.App/Config/DocfxConfig.cs b/src/Docfx.App/Config/DocfxConfig.cs index d11fc95709c..29c7c87a6b8 100644 --- a/src/Docfx.App/Config/DocfxConfig.cs +++ b/src/Docfx.App/Config/DocfxConfig.cs @@ -3,6 +3,8 @@ #nullable enable +using Docfx.Common; + namespace Docfx; class DocfxConfig @@ -14,4 +16,6 @@ class DocfxConfig public BuildJsonConfig? build { get; init; } public PdfJsonConfig? pdf { get; init; } + + public Dictionary? rules { get; init; } } diff --git a/src/Docfx.App/Docset.cs b/src/Docfx.App/Docset.cs index eefed0cca1b..9b539046986 100644 --- a/src/Docfx.App/Docset.cs +++ b/src/Docfx.App/Docset.cs @@ -71,7 +71,11 @@ internal static (DocfxConfig, string configDirectory) GetConfig(string configFil if (!File.Exists(configFile)) throw new FileNotFoundException($"Cannot find config file {configFile}"); - return (JsonUtility.Deserialize(configFile), Path.GetDirectoryName(configFile)); + var config = JsonUtility.Deserialize(configFile); + + Logger.Rules = config.rules; + + return (config, Path.GetDirectoryName(configFile)); } diff --git a/src/Docfx.Common/Loggers/ConsoleLogListener.cs b/src/Docfx.Common/Loggers/ConsoleLogListener.cs index e9eb8fd28fc..639fe856e88 100644 --- a/src/Docfx.Common/Loggers/ConsoleLogListener.cs +++ b/src/Docfx.Common/Loggers/ConsoleLogListener.cs @@ -48,6 +48,8 @@ public void WriteLine(ILogItem item) { if (level >= LogLevel.Warning) message.Append($"{level.ToString().ToLowerInvariant()}: "); + if (!string.IsNullOrEmpty(item.Code)) + message.Append($"{item.Code}: "); } message.Append(item.Message); diff --git a/src/Docfx.Common/Loggers/Logger.cs b/src/Docfx.Common/Loggers/Logger.cs index 2d000c8a98a..4306a69a809 100644 --- a/src/Docfx.Common/Loggers/Logger.cs +++ b/src/Docfx.Common/Loggers/Logger.cs @@ -18,6 +18,7 @@ public static class Logger private static int _errorCount = 0; public static volatile LogLevel LogLevelThreshold = LogLevel.Info; public static volatile bool WarningsAsErrors = false; + public static volatile Dictionary Rules; public static void RegisterListener(ILoggerListener listener) { @@ -45,8 +46,13 @@ public static void UnregisterAllListeners() _syncListener.RemoveAllListeners(); } - public static void Log(ILogItem item) + private static void Log(LogItem item) { + if (Rules is not null && !string.IsNullOrEmpty(item.Code) && Rules.TryGetValue(item.Code, out var level)) + { + item.LogLevel = level; + } + if (item.LogLevel < LogLevelThreshold) { return; diff --git a/src/Docfx.Dotnet/CompilationHelper.cs b/src/Docfx.Dotnet/CompilationHelper.cs index f688a6344e1..37a282d932b 100644 --- a/src/Docfx.Dotnet/CompilationHelper.cs +++ b/src/Docfx.Dotnet/CompilationHelper.cs @@ -155,7 +155,7 @@ void GetReferenceAssembliesCore(PEFile assembly) var file = assemblyResolver.FindAssemblyFile(reference); if (file is null) { - Logger.LogWarning($"Unable to resolve assembly reference {reference}"); + Logger.LogWarning($"Unable to resolve assembly reference {reference}", code: "InvalidAssemblyReference"); continue; } diff --git a/src/Docfx.Dotnet/DotnetApiCatalog.cs b/src/Docfx.Dotnet/DotnetApiCatalog.cs index 05a2a726633..87e52c1a775 100644 --- a/src/Docfx.Dotnet/DotnetApiCatalog.cs +++ b/src/Docfx.Dotnet/DotnetApiCatalog.cs @@ -40,10 +40,12 @@ public static async Task GenerateManagedReferenceYamlFiles(string configPath, Do try { var configDirectory = Path.GetDirectoryName(Path.GetFullPath(configPath)); - var config = JObject.Parse(File.ReadAllText(configPath)); if (config.TryGetValue("metadata", out var value)) + { + Logger.Rules = config["rules"]?.ToObject>(); await Exec(value.ToObject(JsonUtility.DefaultSerializer.Value), options, configDirectory); + } } finally { diff --git a/src/Docfx.MarkdigEngine.Extensions/Constants.cs b/src/Docfx.MarkdigEngine.Extensions/Constants.cs index f2965aaa2ee..66c103a574c 100644 --- a/src/Docfx.MarkdigEngine.Extensions/Constants.cs +++ b/src/Docfx.MarkdigEngine.Extensions/Constants.cs @@ -6,9 +6,4 @@ namespace Docfx.MarkdigEngine.Extensions; internal static class Constants { public static readonly string FencedCodePrefix = "lang-"; - - public static class WarningCodes - { - public const string InvalidTabGroup = "InvalidTabGroup"; - } }