diff --git a/.vscode/settings.json b/.vscode/settings.json
index 9591f0d2..97455dc7 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -2,5 +2,6 @@
{
"files.exclude": {
"out/**": true
- }
+ },
+ "sarif-viewer.connectToGithubCodeScanning": "off"
}
\ No newline at end of file
diff --git a/src/GetMarkdownMetadataCommand.cs b/src/GetMarkdownMetadataCommand.cs
index 30a9bccc..5d5ec946 100644
--- a/src/GetMarkdownMetadataCommand.cs
+++ b/src/GetMarkdownMetadataCommand.cs
@@ -44,7 +44,7 @@ protected override void ProcessRecord()
{
if (Markdown is not null)
{
- DeserializeAndWrite(GetMarkdownMetadataHeaderReader(Markdown));
+ DeserializeAndWrite(MarkdownUtilities.GetMarkdownMetadataHeaderReader(Markdown));
}
}
else if (string.Equals(this.ParameterSetName, "FromPath", StringComparison.OrdinalIgnoreCase))
@@ -55,7 +55,7 @@ protected override void ProcessRecord()
foreach (var resolvedPath in resolvedPaths)
{
- DeserializeAndWrite(GetMarkdownMetadataHeaderReader(File.ReadAllText(resolvedPath.Path)));
+ DeserializeAndWrite(MarkdownUtilities.GetMarkdownMetadataHeaderReader(File.ReadAllText(resolvedPath.Path)));
}
}
}
@@ -68,33 +68,5 @@ private void DeserializeAndWrite(string headerContent)
var deserializer = new YamlDotNet.Serialization.DeserializerBuilder().Build();
WriteObject(deserializer.Deserialize(stringReader));
}
-
- private string GetMarkdownMetadataHeaderReader(string content)
- {
- if (string.IsNullOrEmpty(content))
- {
- return string.Empty;
- }
-
- var mdAst = Markdig.Markdown.Parse(content);
-
- if (mdAst.Count < 2)
- {
- return string.Empty;
- }
-
- if (mdAst[0] is Markdig.Syntax.ThematicBreakBlock)
- {
- if (mdAst[1] is Markdig.Syntax.HeadingBlock metadata)
- {
- if (metadata.Inline?.FirstChild is Markdig.Syntax.Inlines.LiteralInline metadataText)
- {
- return metadataText.Content.Text;
- }
- }
- }
-
- return string.Empty;
- }
}
}
diff --git a/src/MarkdownUtilities.cs b/src/MarkdownUtilities.cs
new file mode 100644
index 00000000..97e37ad7
--- /dev/null
+++ b/src/MarkdownUtilities.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Microsoft.PowerShell.PlatyPS
+{
+ internal class MarkdownUtilities
+ {
+ internal static string GetMarkdownMetadataHeaderReader(string content)
+ {
+ if (string.IsNullOrEmpty(content))
+ {
+ return string.Empty;
+ }
+
+ var mdAst = Markdig.Markdown.Parse(content);
+
+ if (mdAst.Count < 2)
+ {
+ return string.Empty;
+ }
+
+ if (mdAst[0] is Markdig.Syntax.ThematicBreakBlock)
+ {
+ if (mdAst[1] is Markdig.Syntax.HeadingBlock metadata)
+ {
+ if (metadata.Inline?.FirstChild is Markdig.Syntax.Inlines.LiteralInline metadataText)
+ {
+ return metadataText.Content.Text;
+ }
+ }
+ }
+
+ return string.Empty;
+ }
+ }
+}
diff --git a/src/Microsoft.PowerShell.PlatyPS.csproj b/src/Microsoft.PowerShell.PlatyPS.csproj
index f48a26db..4cc32bbe 100644
--- a/src/Microsoft.PowerShell.PlatyPS.csproj
+++ b/src/Microsoft.PowerShell.PlatyPS.csproj
@@ -11,11 +11,13 @@
latest
true
enable
+ false
+ false
true
-
+
diff --git a/src/Model/Constants.cs b/src/Model/Constants.cs
index 68d8a7fb..4cd70883 100644
--- a/src/Model/Constants.cs
+++ b/src/Model/Constants.cs
@@ -110,6 +110,8 @@ internal static class Constants
internal const string ModuleGuidHeaderTemplate = "Module Guid: {0}";
internal const string FillInGuid = "XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
internal const string LocaleEnUs = "en-US";
+ internal const char Comma = ',';
+ internal const string CommonParametersHeader = "CommonParameters";
internal static readonly List EmptyStringList = new();
internal static readonly char DirectorySeparator = System.IO.Path.DirectorySeparatorChar;
diff --git a/src/NewMarkownHelpCommand.cs b/src/NewMarkownHelpCommand.cs
index 128cd630..9b8bccd4 100644
--- a/src/NewMarkownHelpCommand.cs
+++ b/src/NewMarkownHelpCommand.cs
@@ -92,6 +92,7 @@ public sealed class NewMarkdownHelpCommand : PSCmdlet
[Parameter(ParameterSetName = "FromMaml")]
public string? ModulePagePath { get; set; }
+ [Parameter()]
public SwitchParameter ExcludeDontShow { get; set; }
#endregion
diff --git a/src/UpdateMarkdownHelpCommand.cs b/src/UpdateMarkdownHelpCommand.cs
new file mode 100644
index 00000000..dca5db47
--- /dev/null
+++ b/src/UpdateMarkdownHelpCommand.cs
@@ -0,0 +1,537 @@
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+
+using Markdig.Extensions.CustomContainers;
+using Markdig.Syntax;
+using Markdig.Syntax.Inlines;
+using Microsoft.PowerShell.PlatyPS.Model;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.Drawing.Design;
+using System.IO;
+using System.Linq;
+using System.Management.Automation;
+using System.Management.Automation.Language;
+using System.Management.Automation.Runspaces;
+using System.Security.Cryptography;
+using System.Text;
+
+namespace Microsoft.PowerShell.PlatyPS
+{
+ ///
+ /// Cmdlet to generate the markdown help for commands, all commands in a module or from a MAML file.
+ ///
+ [Cmdlet(VerbsData.Update, "MarkdownHelp", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=2096483")]
+ [OutputType(typeof(FileInfo[]))]
+ public sealed class UpdateMarkdownHelpCommand : PSCmdlet
+ {
+ #region Cmdlet Parameters
+
+ [Parameter(Mandatory = true, ValueFromPipeline = true)]
+ [SupportsWildcards()]
+ public string[] Path { get; set; } = Array.Empty();
+
+ [Parameter()]
+ public System.Text.Encoding Encoding { get; set; } = new System.Text.UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
+
+ [Parameter()]
+ public PSSession? Session { get; set; }
+
+ [Parameter()]
+ public SwitchParameter AlphabeticParamsOrder { get; set; } = true;
+
+ [Parameter()]
+ public SwitchParameter UseFullTypeName { get; set; }
+
+ [Parameter()]
+ public SwitchParameter UpdateInputOutput { get; set; }
+
+ [Parameter()]
+ public SwitchParameter Force { get; set; }
+
+ [Parameter()]
+ public SwitchParameter ExcludeDontShow { get; set; }
+
+ #endregion
+
+ private class YamlMetadataHeader
+ {
+ public string ExternalHelp { get; private set; }
+
+ public string ModuleName { get; private set; }
+
+ public string OnlineVersion { get; private set; }
+
+ public string Schema { get; private set; }
+
+ public YamlMetadataHeader(string externalHelp, string moduleName, string onlineVersion, string schema)
+ {
+ ExternalHelp = externalHelp;
+ ModuleName = moduleName;
+ OnlineVersion = onlineVersion;
+ Schema = schema;
+ }
+ }
+
+ protected override void EndProcessing()
+ {
+ TransformSettings settings = new TransformSettings
+ {
+ AlphabeticParamsOrder = AlphabeticParamsOrder,
+ ExcludeDontShow = ExcludeDontShow
+ };
+
+ foreach (string filePath in Path)
+ {
+ Collection resolvedPaths = this.SessionState.Path.GetResolvedPSPathFromPSPath(filePath);
+
+ foreach (var resolvedPath in resolvedPaths)
+ {
+ string commandName = System.IO.Path.GetFileNameWithoutExtension(resolvedPath.Path);
+
+ Collection currentCommand = new TransformCommand(settings).Transform(new string[] { commandName });
+
+ if (currentCommand is not null && currentCommand.Count != 1) {
+ throw new CommandNotFoundException($"Command not found: {commandName}");
+ }
+
+ string fileContent = File.ReadAllText(resolvedPath.Path);
+
+ CommandHelp mdHelp = GetCommandHelpFromMarkdown(fileContent);
+ }
+ }
+ }
+
+ private static YamlMetadataHeader GetYamlHeader(string fileContent)
+ {
+ string yamlHeader = MarkdownUtilities.GetMarkdownMetadataHeaderReader(fileContent);
+
+ StringReader stringReader = new StringReader(yamlHeader);
+ var deserializer = new YamlDotNet.Serialization.DeserializerBuilder().Build();
+ var yamlObject = deserializer.Deserialize(stringReader);
+
+ if (yamlObject is Dictionary