Directory.Packages.props
+2
-0
diff --git a/Directory.Packages.props b/Directory.Packages.props
index ea0e061..259fc3c 100644
@@ -10,6 +10,8 @@
</GlobalPackageReference>
</ItemGroup>
<ItemGroup>
<PackageVersion Include="Markdig" Version="1.3.2" />
<PackageVersion Include="System.Management.Automation" Version="7.6.3" />
<PackageVersion Include="YamlDotNet" Version="18.1.0" />
</ItemGroup>
</Project>
\ No newline at end of file
src/NewNote.cs
+51
-1
diff --git a/src/NewNote.cs b/src/NewNote.cs
index 6bcf2ef..d271e77 100644
@@ -1,25 +1,75 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Management.Automation;
using Markdig;
using Markdig.Extensions.Yaml;
using Markdig.Syntax;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.Converters;
namespace NotesCli;
[Cmdlet(VerbsCommon.New, "Note")]
public sealed class NewNote : PSCmdlet
{
private static readonly MarkdownPipeline markdownPipeline = new MarkdownPipelineBuilder()
.UseYamlFrontMatter()
.Build();
private static readonly IDeserializer yamlDeserializer = new DeserializerBuilder().Build();
private static readonly ISerializer yamlSerializer = new SerializerBuilder()
.WithTypeConverter(new DateOnlyConverter(formats: "yyyy-MM-dd"))
.Build();
protected override void BeginProcessing()
{
var now = DateTimeOffset.Now;
var frontmatter = GetPreviousFrontmatter() ?? [];
frontmatter["date"] = DateOnly.FromDateTime(now.DateTime);
InvokeProvider.Item.New(
path: ".",
name: $"{now:yyyy-MM-ddTHHmmss}.md",
itemTypeName: "file",
content: $"""
---
date: {now:yyyy-MM-dd}
{yamlSerializer.Serialize(frontmatter).TrimEnd()}
---
"""
);
}
private Dictionary<string, object>? GetPreviousFrontmatter()
{
var previousNote = InvokeProvider
.ChildItem.Get("*.md", recurse: false)
.Select(i => i.BaseObject)
.OfType<FileInfo>()
.MaxBy(f => f.Name);
if (previousNote is null)
{
return null;
}
string previousText;
using (var reader = new StreamReader(previousNote.OpenRead()))
{
previousText = reader.ReadToEnd();
}
var markdown = Markdown.Parse(previousText, markdownPipeline);
var yamlBlock = markdown.Descendants<YamlFrontMatterBlock>().FirstOrDefault();
if (yamlBlock?.Lines.ToString() is not string yaml)
{
return null;
}
return yamlDeserializer.Deserialize<Dictionary<string, object>>(yaml);
}
}
src/NotesCli.csproj
+2
-0
diff --git a/src/NotesCli.csproj b/src/NotesCli.csproj
index 463c24c..89bc4e4 100644
@@ -4,6 +4,8 @@
<AssemblyName>NotesCli</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Markdig" />
<PackageReference Include="System.Management.Automation" PrivateAssets="all" />
<PackageReference Include="YamlDotNet" />
</ItemGroup>
</Project>
src/packages.lock.json
+12
-0
diff --git a/src/packages.lock.json b/src/packages.lock.json
index 4238fd3..8be5ad4 100644
@@ -8,6 +8,12 @@
"resolved": "1.3.0",
"contentHash": "jzzLpmz7F6LyBh5FTZy8/4dEYVcAG9VjBPKryZ82LIoUuupcBkCSXzaeS/4oYcp/rBC8yVLcDstJ8CIv9n2IFw=="
},
"Markdig": {
"type": "Direct",
"requested": "[1.3.2, )",
"resolved": "1.3.2",
"contentHash": "fZgOC/3CswUrndjDTac70aQpYdtxbW5+5bRumR7vzvI2HJbkmgKisB1c9oT+GA6v0jB/JDR9BLa9FiPzQmaK6A=="
},
"System.Management.Automation": {
"type": "Direct",
"requested": "[7.6.3, )",
@@ -32,6 +38,12 @@
"System.Windows.Extensions": "10.0.5"
}
},
"YamlDotNet": {
"type": "Direct",
"requested": "[18.1.0, )",
"resolved": "18.1.0",
"contentHash": "5K+9KFg2TdTl7VXv88Qzi/0lqK6JFoNP3lRuImPYGRV7K/QYklDyTrj4+A+KAki1JsQi6qKY+hDyY7d6WRqjrw=="
},
"Microsoft.ApplicationInsights": {
"type": "Transitive",
"resolved": "2.23.0",