diff --git a/File-Folder-Helper.csproj b/File-Folder-Helper.csproj
index e56bde0..02a3136 100644
--- a/File-Folder-Helper.csproj
+++ b/File-Folder-Helper.csproj
@@ -9,7 +9,7 @@
eb9e8f58-fcb5-45bb-9d4d-54f064c485b1
-
+
diff --git a/Helpers/HelperCreateNoteFiles.cs b/Helpers/HelperCreateNoteFiles.cs
index 540e370..5ae4168 100644
--- a/Helpers/HelperCreateNoteFiles.cs
+++ b/Helpers/HelperCreateNoteFiles.cs
@@ -279,7 +279,7 @@ internal static partial class HelperCreateNoteFiles
CleanExistingFiles(argsZero, ticks);
importFiles.AddRange(Directory.GetFiles(argsZero, "*.csv", SearchOption.TopDirectoryOnly));
importFiles.AddRange(Directory.GetFiles(argsZero, "*.tsv", SearchOption.TopDirectoryOnly));
- if (!importFiles.Any())
+ if (importFiles.Count == 0)
CreateDailyNotes(argsZero, ticks);
else
CreateImportFiles(ticks, importFiles);
diff --git a/Helpers/HelperKanbanMetadata.cs b/Helpers/HelperKanbanMetadata.cs
index e764de8..98e5eba 100644
--- a/Helpers/HelperKanbanMetadata.cs
+++ b/Helpers/HelperKanbanMetadata.cs
@@ -96,7 +96,7 @@ internal static partial class HelperKanbanMetadata
return results;
}
- internal static void SetMetadata(ILogger log, AppSettings appSettings, string sourceDirectory)
+ internal static void SetMetadata(ILogger log, AppSettings appSettings, string sourceDirectory, bool addTicks)
{
bool? match;
string? paramCase;
@@ -119,11 +119,12 @@ internal static partial class HelperKanbanMetadata
if (itemLineNumber == 0)
throw new NotSupportedException();
(lines, lineNumber) = HelperMarkdown.GetStatusAndFrontMatterYamlEndLineNumbers(fileInfo);
- if (!lines.Any())
+ if (lines.Count == 0)
continue;
statusLine = $"status: \"{groupCount}-{group}\"";
paramCase = lineNumber.H1 is null ? null : GetParamCase(lines[lineNumber.H1.Value]);
- indexFileLines[itemLineNumber] = $"{fileInfo.LastWriteTime.Ticks}~~~{indexFileLines[itemLineNumber]}";
+ if (addTicks)
+ indexFileLines[itemLineNumber] = $"{fileInfo.LastWriteTime.Ticks}~~~{indexFileLines[itemLineNumber]}";
match = lineNumber.H1 is null || paramCase is null ? null : Path.GetFileNameWithoutExtension(fileInfo.Name) == paramCase;
if (lineNumber.FrontMatterYamlEnd is null)
throw new NotSupportedException($"{nameof(SetMetadata)} must be executed first!");
@@ -139,7 +140,8 @@ internal static partial class HelperKanbanMetadata
}
File.WriteAllLines(fileInfo.FullName, lines);
}
- File.WriteAllLines(indexFile, indexFileLines);
+ if (addTicks)
+ File.WriteAllLines(indexFile, indexFileLines);
}
}
diff --git a/Helpers/HelperMarkdown.cs b/Helpers/HelperMarkdown.cs
index cc25abe..8814840 100644
--- a/Helpers/HelperMarkdown.cs
+++ b/Helpers/HelperMarkdown.cs
@@ -4,12 +4,16 @@ using System.Collections.ObjectModel;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
+using System.Text.RegularExpressions;
namespace File_Folder_Helper.Helpers;
internal static partial class HelperMarkdown
{
+ [GeneratedRegex("(~~)?(#)([a-zA-Z0-9]{6})(~~)?( )")]
+ private static partial Regex HtmlColor();
+
private record Input(string Source,
string? StartAt,
string? Destination);
@@ -21,6 +25,12 @@ internal static partial class HelperMarkdown
private record MarkdownFileAndLines(MarkdownFile MarkdownFile,
string[] Lines);
+ private record MarkdownExtra(ReadOnlyCollection? Assignees,
+ ReadOnlyCollection? H2HexColorCollection,
+ ReadOnlyCollection? H2NoCheckboxesCollection,
+ ReadOnlyCollection? H2WithCheckboxesCollection,
+ string? RequestedDateTime);
+
private record MarkdownFileH1AndRelativePath(MarkdownFile? MarkdownFile, string[]? Lines, string? H1, string? RelativePath);
[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
@@ -29,6 +39,12 @@ internal static partial class HelperMarkdown
{
}
+ [JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
+ [JsonSerializable(typeof(ReadOnlyDictionary>))]
+ internal partial class ColumnAndLinksSourceGenerationContext : JsonSerializerContext
+ {
+ }
+
private static void SetRecursiveLines(AppSettings appSettings, ILogger logger, ReadOnlyDictionary> keyValuePairs, string linkTitle, MarkdownFile markdownFile, string[] lines, List indentations, List recursiveLines)
{
if (recursiveLines is null)
@@ -200,7 +216,7 @@ internal static partial class HelperMarkdown
result = JsonSerializer.Serialize(keyValuePairs, DictionaryStringAndJsonElementSourceGenerationContext.Default.DictionaryStringJsonElement);
string[] parsedLines = result.Split(Environment.NewLine).ToArray();
results = GetFrontMatterLines(parsedLines);
- if (!results.Any())
+ if (results.Count == 0)
{
result = null;
keyValuePairs = null;
@@ -249,7 +265,7 @@ internal static partial class HelperMarkdown
updatedLineNumber = i;
continue;
}
- if (h1LineNumber is null && line.Length > 2 && line[..2] == "# ")
+ if (h1LineNumber is null && line.Length > 2 && line[0] == '#' && line[1] == ' ')
{
h1LineNumber = i;
continue;
@@ -358,7 +374,7 @@ internal static partial class HelperMarkdown
break;
}
}
- if (jsonLines.Any())
+ if (jsonLines.Count > 0)
(result, keyValuePairs, results) = Get(jsonLines);
else
(result, keyValuePairs, results) = (null, null, new());
@@ -438,7 +454,7 @@ internal static partial class HelperMarkdown
MarkdownFile markdownFile;
foreach (KeyValuePair relativeTo in relativeToCollection)
{
- if (!relativeTo.Value.Lines.Any())
+ if (relativeTo.Value.Lines.Length == 0)
continue;
lines = relativeTo.Value.Lines;
markdownFile = relativeTo.Value.MarkdownFile;
@@ -497,7 +513,7 @@ internal static partial class HelperMarkdown
(lines, lineNumber) = GetStatusAndFrontMatterYamlEndLineNumbers(fileInfo);
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName);
h1 = fileNameWithoutExtension.ToLower().Replace("%20", "-").Replace(' ', '-');
- if (lines.Any())
+ if (lines.Count > 0)
(type, h1) = GetTypeAndH1(appSettings, h1, lines, lineNumber);
else
{
@@ -505,7 +521,21 @@ internal static partial class HelperMarkdown
File.WriteAllLines(file, new string[] { "---", $"type: \"{type}\"", "---", string.Empty, $"# {h1}" });
lines = File.ReadAllLines(file).ToList();
}
- markdownFile = new(file, fileInfo.DirectoryName, fileInfo.Name, fileNameWithoutExtension, fileInfo.Extension, fileInfo.CreationTime, fileInfo.LastWriteTime, lineNumber, type, h1);
+ markdownFile = new(null,
+ fileInfo.CreationTime,
+ fileInfo.DirectoryName,
+ fileInfo.Extension,
+ file,
+ fileInfo.Name,
+ fileNameWithoutExtension,
+ h1,
+ null,
+ null,
+ null,
+ fileInfo.LastWriteTime,
+ lineNumber,
+ null,
+ type);
if (force || input.StartAt is null || file.StartsWith(input.StartAt))
results.Add(key, new(markdownFile, lines.ToArray()));
else
@@ -613,7 +643,7 @@ internal static partial class HelperMarkdown
string[] frontMatterYamlLines;
foreach (KeyValuePair relativeTo in relativeToCollection)
{
- if (!relativeTo.Value.Lines.Any())
+ if (relativeTo.Value.Lines.Length == 0)
continue;
results.Clear();
lines = relativeTo.Value.Lines;
@@ -621,7 +651,7 @@ internal static partial class HelperMarkdown
if (markdownFile.LineNumber.FrontMatterYamlEnd is null)
continue;
(_, _, frontMatterYamlLines) = Get(markdownFile.LineNumber.FrontMatterYamlEnd.Value, lines);
- if (!frontMatterYamlLines.Any())
+ if (frontMatterYamlLines.Length == 0)
continue;
results.Add("---");
results.AddRange(frontMatterYamlLines);
@@ -658,7 +688,7 @@ internal static partial class HelperMarkdown
MarkdownFile markdownFile;
foreach (KeyValuePair relativeTo in relativeToCollection)
{
- if (!relativeTo.Value.Lines.Any())
+ if (relativeTo.Value.Lines.Length == 0)
continue;
circularReference = false;
lines = relativeTo.Value.Lines;
@@ -719,7 +749,7 @@ internal static partial class HelperMarkdown
MarkdownFile markdownFile;
foreach (KeyValuePair relativeTo in relativeToCollection)
{
- if (!relativeTo.Value.Lines.Any())
+ if (relativeTo.Value.Lines.Length == 0)
continue;
found = false;
lines = relativeTo.Value.Lines;
@@ -771,7 +801,7 @@ internal static partial class HelperMarkdown
ReadOnlyDictionary> keyValuePairs = GetKeyValuePairs(relativeToCollection);
foreach (KeyValuePair relativeTo in relativeToCollection)
{
- if (!relativeTo.Value.Lines.Any())
+ if (relativeTo.Value.Lines.Length == 0)
continue;
write = false;
lines = relativeTo.Value.Lines;
@@ -828,7 +858,7 @@ internal static partial class HelperMarkdown
ReadOnlyDictionary> keyValuePairs = GetKeyValuePairs(relativeToCollection);
foreach (KeyValuePair relativeTo in relativeToCollection)
{
- if (!relativeTo.Value.Lines.Any())
+ if (relativeTo.Value.Lines.Length == 0)
continue;
lines = relativeTo.Value.Lines;
markdownFile = relativeTo.Value.MarkdownFile;
@@ -922,7 +952,7 @@ internal static partial class HelperMarkdown
ReadOnlyDictionary> keyValuePairs = GetKeyValuePairs(relativeToCollection);
foreach (KeyValuePair relativeTo in relativeToCollection)
{
- if (!relativeTo.Value.Lines.Any())
+ if (relativeTo.Value.Lines.Length == 0)
continue;
if (input.StartAt is null || !relativeTo.Value.MarkdownFile.File.StartsWith(input.StartAt) || Path.GetFileName(relativeTo.Value.MarkdownFile.Directory) != Path.GetFileName(input.StartAt))
continue;
@@ -964,7 +994,7 @@ internal static partial class HelperMarkdown
ReadOnlyDictionary relativeToCollection = GetRelativeToCollection(appSettings, input);
foreach (KeyValuePair relativeTo in relativeToCollection)
{
- if (!relativeTo.Value.Lines.Any())
+ if (relativeTo.Value.Lines.Length == 0)
continue;
lines = relativeTo.Value.Lines;
markdownFile = relativeTo.Value.MarkdownFile;
@@ -1028,7 +1058,7 @@ internal static partial class HelperMarkdown
private static (string type, string h1) GetTypeAndH1(AppSettings appSettings, string h1, List lines, LineNumber lineNumber)
{
- string type = lineNumber.Type is null ? appSettings.DefaultNoteType : lines[lineNumber.Type.Value].Replace("type: ", string.Empty);
+ string type = lineNumber.Type is null ? appSettings.DefaultNoteType : lines[lineNumber.Type.Value][5..].Trim().Trim('"');
string h1FromFile = lineNumber.H1 is null ? h1 : lines[lineNumber.H1.Value][2..];
return (type, h1FromFile);
}
@@ -1048,7 +1078,7 @@ internal static partial class HelperMarkdown
string updatedLineCompare;
foreach (KeyValuePair relativeTo in relativeToCollection)
{
- if (!relativeTo.Value.Lines.Any())
+ if (relativeTo.Value.Lines.Length == 0)
continue;
results.Clear();
lines = relativeTo.Value.Lines;
@@ -1161,6 +1191,8 @@ internal static partial class HelperMarkdown
List markdownFileAndLinesCollection = GetRecursiveLines(appSettings, input, logger, relativeToCollection);
Write(input, markdownFileAndLinesCollection);
}
+ if (!string.IsNullOrEmpty(input.StartAt) && !string.IsNullOrEmpty(input.Destination))
+ Save(input, relativeToCollection);
string directory = Path.Combine(Environment.CurrentDirectory, ".vscode");
if (!Directory.Exists(directory))
{
@@ -1175,13 +1207,173 @@ internal static partial class HelperMarkdown
}
}
+ private static void Save(Input input, ReadOnlyDictionary relativeToCollection)
+ {
+ if (string.IsNullOrEmpty(input.StartAt) || string.IsNullOrEmpty(input.Destination))
+ throw new NotSupportedException();
+ ReadOnlyDictionary> columnsToLinks = GetColumnsToLinks(input, relativeToCollection);
+ if (columnsToLinks.Count > 0)
+ {
+ string json = JsonSerializer.Serialize(columnsToLinks, ColumnAndLinksSourceGenerationContext.Default.ReadOnlyDictionaryStringListMarkdownFile);
+ File.WriteAllText(Path.Combine(input.Destination, $"{nameof(columnsToLinks)}.json"), json);
+ }
+ }
+
+ private static ReadOnlyDictionary> GetColumnsToLinks(Input input, ReadOnlyDictionary relativeToCollection)
+ {
+ Dictionary> results = new();
+ string key;
+ string[] lines;
+ string[] segmentsA;
+ string? column = null;
+ MarkdownFile markdownFile;
+ MarkdownExtra markdownExtra;
+ List links = new();
+ MarkdownFileAndLines? markdownFileAndLines;
+ foreach (KeyValuePair relativeTo in relativeToCollection)
+ {
+ if (relativeTo.Value.Lines.Length == 0)
+ continue;
+ lines = relativeTo.Value.Lines;
+ markdownFile = relativeTo.Value.MarkdownFile;
+ if (markdownFile.FileNameWithoutExtension != "index" && markdownFile.Directory.EndsWith(".kanbn"))
+ continue;
+ if (!File.Exists(markdownFile.File))
+ continue;
+ for (int i = 0; i < lines.Length; i++)
+ {
+ if (lines[i].Length < 4 || lines[i][0] != '#' || lines[i][1] != '#' || lines[i][2] != ' ')
+ continue;
+ if (links.Count > 1)
+ {
+ if (column is null)
+ throw new NullReferenceException(nameof(column));
+ results.Add(column, links);
+ links = new();
+ }
+ column = lines[i][3..].TrimEnd();
+ if (lines.Length == i + 1)
+ continue;
+ for (int j = i + 1; j < lines.Length; j++)
+ {
+ if (lines[j].Length < 5)
+ continue;
+ if (lines[j].Length >= 4 && lines[j][0] == '#' && lines[j][1] == '#' && lines[j][2] == ' ')
+ break;
+ segmentsA = lines[j].Split("](");
+ if (segmentsA.Length != 2 || segmentsA[1][^1] != ')')
+ continue;
+ key = Path.GetRelativePath(input.Source, Path.Combine(input.Source, segmentsA[1][..^1]));
+ if (!relativeToCollection.TryGetValue(key, out markdownFileAndLines))
+ continue;
+ markdownExtra = GetMarkdownExtra(markdownFileAndLines);
+ markdownFile = new(markdownExtra.Assignees,
+ markdownFileAndLines.MarkdownFile.CreationDateTime,
+ markdownFileAndLines.MarkdownFile.Directory,
+ markdownFileAndLines.MarkdownFile.Extension,
+ markdownFileAndLines.MarkdownFile.File,
+ markdownFileAndLines.MarkdownFile.FileName,
+ markdownFileAndLines.MarkdownFile.FileNameWithoutExtension,
+ markdownFileAndLines.MarkdownFile.H1,
+ markdownExtra.H2HexColorCollection,
+ markdownExtra.H2NoCheckboxesCollection,
+ markdownExtra.H2WithCheckboxesCollection,
+ markdownFileAndLines.MarkdownFile.LastWriteDateTime,
+ markdownFileAndLines.MarkdownFile.LineNumber,
+ markdownExtra.RequestedDateTime,
+ markdownFileAndLines.MarkdownFile.Type);
+ links.Add(markdownFile);
+ }
+ }
+ }
+ return new(results);
+ }
+
+ private static MarkdownExtra GetMarkdownExtra(MarkdownFileAndLines markdownFileAndLines)
+ {
+ MarkdownExtra result;
+ int skip;
+ Match match;
+ string line;
+ int completed;
+ int notCompleted;
+ List lines;
+ List assignees = new();
+ string? requestedDateTime = null;
+ ReadOnlyCollection groups;
+ List h2HexColors = new();
+ List h2NoCheckboxes = new();
+ List h2WithCheckboxes = new();
+ if (markdownFileAndLines.MarkdownFile.LineNumber.FrontMatterYamlEnd is not null)
+ {
+ for (int i = 1; i < markdownFileAndLines.Lines.Length; i++)
+ {
+ line = markdownFileAndLines.Lines[i];
+ if (line.Length < 3)
+ continue;
+ if (line.Length > 10 && line[..10] == "assigned: ")
+ {
+ foreach (string item in line[10..].Split(','))
+ assignees.Add(item.Trim().Trim('"'));
+ continue;
+ }
+ if (line.Length > 11 && line[..11] == "requested: ")
+ {
+ requestedDateTime = line[10..].Trim().Trim('"');
+ continue;
+ }
+ if (line.Length > 3 && line[0] == '#' && line[1] == '#' && line[2] == ' ')
+ {
+ completed = 0;
+ notCompleted = 0;
+ match = HtmlColor().Match(line[3..]);
+ if (line.Length > 3 && match.Success)
+ {
+ groups = match.Groups.AsReadOnly();
+ skip = 3 + groups.Skip(1).Sum(l => l.Length);
+ h2HexColors.Add(new(line[skip..], $"#{groups.First(l => l.Value.Length == 6)}"));
+ continue;
+ }
+ lines = new();
+ if (i + 1 == markdownFileAndLines.Lines.Length)
+ continue;
+ for (int j = i + 1; j < markdownFileAndLines.Lines.Length; j++)
+ {
+ line = markdownFileAndLines.Lines[j];
+ if (line.Length == 0)
+ continue;
+ if (line.Length > 2 && line[0] == '#')
+ break;
+ lines.Add(line);
+ if (line.Length < 5 || line[0] != '-' || line[1] != ' ' || line[2] != '[')
+ continue;
+ if (line[3] == ' ' && line[4] == ']')
+ notCompleted++;
+ else if (line[3] is 'x' or 'X' && line[4] == ']')
+ completed++;
+ }
+ if (completed != 0 || notCompleted != 0)
+ h2WithCheckboxes.Add(new(completed,
+ markdownFileAndLines.Lines[i][3..],
+ notCompleted,
+ notCompleted + completed));
+ else if (lines.Count > 0)
+ h2NoCheckboxes.Add(new(markdownFileAndLines.Lines[i][3..], new(lines)));
+ continue;
+ }
+ }
+ }
+ result = new(new(assignees), new(h2HexColors), new(h2NoCheckboxes), new(h2WithCheckboxes), requestedDateTime);
+ return result;
+ }
+
internal static void MarkdownConvertLinksForHugo(AppSettings appSettings, ILogger logger, List args)
{
Input input = GetInput(args);
if (string.IsNullOrEmpty(input.Destination))
throw new NotSupportedException("This method requires frontMatterYamlLines -d path!");
List collection = GetWithLinksForHugo(appSettings, input);
- if (!collection.Any())
+ if (collection.Count == 0)
logger.LogInformation("No files?");
List distinct = GetDistinct(collection);
CreateMissingDirectories(distinct);
diff --git a/Helpers/HelperPackageFilesByDate.cs b/Helpers/HelperPackageFilesByDate.cs
index 9f3ffb4..55c4094 100644
--- a/Helpers/HelperPackageFilesByDate.cs
+++ b/Helpers/HelperPackageFilesByDate.cs
@@ -34,7 +34,7 @@ internal static class HelperPackageFilesByDate
continue;
json = File.ReadAllText(packageJsonFile);
packageJson = JsonSerializer.Deserialize(json, PackageJsonSourceGenerationContext.Default.PackageJson);
- if (packageJson is null || !packageJson.Times.Any())
+ if (packageJson is null || packageJson.Times.Count == 0)
continue;
packageJsonDirectoryName = Path.GetFileName(packageJsonDirectory);
tgzFiles = Directory.GetFiles(packageJsonDirectory, "*.tgz", SearchOption.TopDirectoryOnly);
@@ -52,7 +52,7 @@ internal static class HelperPackageFilesByDate
if (fileInfo.LastWriteTime != dateTime)
File.SetLastWriteTime(fileInfo.FullName, dateTime);
}
- if (!dateTimes.Any())
+ if (dateTimes.Count == 0)
{
if (fileNameWithoutExtension.Length + 1 < packageJsonDirectoryName.Length)
continue;
@@ -64,7 +64,7 @@ internal static class HelperPackageFilesByDate
File.SetLastWriteTime(fileInfo.FullName, dateTime);
}
}
- if (!dateTimes.Any())
+ if (dateTimes.Count == 0)
continue;
dateTime = dateTimes.Max();
fileInfo = new(packageJsonFile);
diff --git a/Models/Binder/.editorconfig b/Models/Binder/.editorconfig
new file mode 100644
index 0000000..1c444cd
--- /dev/null
+++ b/Models/Binder/.editorconfig
@@ -0,0 +1,2 @@
+[*.cs]
+csharp_preserve_single_line_statements = true
\ No newline at end of file
diff --git a/Models/Binder/AppSettings.cs b/Models/Binder/AppSettings.cs
index 0824845..e4b9901 100644
--- a/Models/Binder/AppSettings.cs
+++ b/Models/Binder/AppSettings.cs
@@ -25,22 +25,14 @@ public class AppSettings
private static Models.AppSettings Get(AppSettings? appSettings)
{
Models.AppSettings result;
- if (appSettings?.Company is null)
- throw new NullReferenceException(nameof(appSettings.Company));
- if (appSettings?.DefaultNoteType is null)
- throw new NullReferenceException(nameof(appSettings.DefaultNoteType));
- if (appSettings?.ExcludeDirectoryNames is null)
- throw new NullReferenceException(nameof(appSettings.ExcludeDirectoryNames));
- if (appSettings?.ExcludeSchemes is null)
- throw new NullReferenceException(nameof(appSettings.ExcludeSchemes));
- if (appSettings?.PersonBirthdayFormat is null)
- throw new NullReferenceException(nameof(appSettings.PersonBirthdayFormat));
- if (appSettings?.PersonCharacters is null)
- throw new NullReferenceException(nameof(appSettings.PersonCharacters));
- if (appSettings?.PersonTitleFilters is null)
- throw new NullReferenceException(nameof(appSettings.PersonTitleFilters));
- if (appSettings?.WorkingDirectoryName is null)
- throw new NullReferenceException(nameof(appSettings.WorkingDirectoryName));
+ if (appSettings?.Company is null) throw new NullReferenceException(nameof(appSettings.Company));
+ if (appSettings?.DefaultNoteType is null) throw new NullReferenceException(nameof(appSettings.DefaultNoteType));
+ if (appSettings?.ExcludeDirectoryNames is null) throw new NullReferenceException(nameof(appSettings.ExcludeDirectoryNames));
+ if (appSettings?.ExcludeSchemes is null) throw new NullReferenceException(nameof(appSettings.ExcludeSchemes));
+ if (appSettings?.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(appSettings.PersonBirthdayFormat));
+ if (appSettings?.PersonCharacters is null) throw new NullReferenceException(nameof(appSettings.PersonCharacters));
+ if (appSettings?.PersonTitleFilters is null) throw new NullReferenceException(nameof(appSettings.PersonTitleFilters));
+ if (appSettings?.WorkingDirectoryName is null) throw new NullReferenceException(nameof(appSettings.WorkingDirectoryName));
result = new(
appSettings.Company,
appSettings.DefaultNoteType,
@@ -60,6 +52,19 @@ public class AppSettings
#pragma warning disable IL3050, IL2026
AppSettings? appSettings = configurationRoot.Get();
#pragma warning restore IL3050, IL2026
+ if (appSettings?.Company is null)
+ {
+ foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers)
+ {
+ if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider)
+ continue;
+ if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider)
+ continue;
+ if (!physicalFileProvider.Root.Contains("UserSecrets"))
+ continue;
+ throw new NotSupportedException(physicalFileProvider.Root);
+ }
+ }
result = Get(appSettings);
return result;
}
diff --git a/Models/H2HexColor.cs b/Models/H2HexColor.cs
new file mode 100644
index 0000000..deac3e6
--- /dev/null
+++ b/Models/H2HexColor.cs
@@ -0,0 +1,12 @@
+using System.Text.Json.Serialization;
+
+namespace File_Folder_Helper.Models;
+
+internal record H2HexColor(string H2,
+ string HexColor);
+
+[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
+[JsonSerializable(typeof(H2HexColor))]
+internal partial class H2PatternMatchesSourceGenerationContext : JsonSerializerContext
+{
+}
\ No newline at end of file
diff --git a/Models/H2NoCheckboxes.cs b/Models/H2NoCheckboxes.cs
new file mode 100644
index 0000000..3a5a90c
--- /dev/null
+++ b/Models/H2NoCheckboxes.cs
@@ -0,0 +1,13 @@
+using System.Collections.ObjectModel;
+using System.Text.Json.Serialization;
+
+namespace File_Folder_Helper.Models;
+
+internal record H2NoCheckboxes(string H2,
+ ReadOnlyCollection Lines);
+
+[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
+[JsonSerializable(typeof(H2NoCheckboxes))]
+internal partial class H2NoCheckboxesSourceGenerationContext : JsonSerializerContext
+{
+}
\ No newline at end of file
diff --git a/Models/H2WithCheckboxes.cs b/Models/H2WithCheckboxes.cs
new file mode 100644
index 0000000..f6ad2ac
--- /dev/null
+++ b/Models/H2WithCheckboxes.cs
@@ -0,0 +1,14 @@
+using System.Text.Json.Serialization;
+
+namespace File_Folder_Helper.Models;
+
+internal record H2WithCheckboxes(int Completed,
+ string H2,
+ int NotCompleted,
+ int Total);
+
+[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
+[JsonSerializable(typeof(H2WithCheckboxes))]
+internal partial class H2WithCheckboxesSourceGenerationContext : JsonSerializerContext
+{
+}
\ No newline at end of file
diff --git a/Models/LineNumber.cs b/Models/LineNumber.cs
index 1012637..e617d9c 100644
--- a/Models/LineNumber.cs
+++ b/Models/LineNumber.cs
@@ -2,12 +2,12 @@ using System.Text.Json.Serialization;
namespace File_Folder_Helper.Models;
-public record LineNumber(int? Created,
- int? H1,
- int? FrontMatterYamlEnd,
- int? Status,
- int? Type,
- int? Updated);
+internal record LineNumber(int? Created,
+ int? H1,
+ int? FrontMatterYamlEnd,
+ int? Status,
+ int? Type,
+ int? Updated);
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(LineNumber))]
diff --git a/Models/MarkdownFile.cs b/Models/MarkdownFile.cs
index df943df..6f76fc5 100644
--- a/Models/MarkdownFile.cs
+++ b/Models/MarkdownFile.cs
@@ -1,17 +1,23 @@
+using System.Collections.ObjectModel;
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Models;
-public record MarkdownFile(string File,
- string Directory,
- string FileName,
- string FileNameWithoutExtension,
- string Extension,
- DateTime CreationDateTime,
- DateTime LastWriteDateTime,
- LineNumber LineNumber,
- string Type,
- string H1);
+internal record MarkdownFile(ReadOnlyCollection? Assignees,
+ DateTime CreationDateTime,
+ string Directory,
+ string Extension,
+ string File,
+ string FileName,
+ string FileNameWithoutExtension,
+ string H1,
+ ReadOnlyCollection? H2HexColorCollection,
+ ReadOnlyCollection? H2NoCheckboxesCollection,
+ ReadOnlyCollection? H2WithCheckboxesCollection,
+ DateTime LastWriteDateTime,
+ LineNumber LineNumber,
+ string? RequestedDateTime,
+ string Type);
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(MarkdownFile))]
diff --git a/Worker.cs b/Worker.cs
index 20dfd2f..dded848 100644
--- a/Worker.cs
+++ b/Worker.cs
@@ -81,7 +81,7 @@ public class Worker : BackgroundService
consoleKey = ConsoleKey.End;
if (singleCharIndex is not null)
_Args.RemoveAt(singleCharIndex.Value);
- if (!_Args.Any())
+ if (_Args.Count == 0)
_Logger.LogInformation("Must pass a argument!");
else if (Directory.Exists(_Args[0]) && File.Exists(Path.Combine(_Args[0], string.Concat(Path.GetFileName(_Args[0]), ".dll"))))
Helpers.HelperILMerge.ILMerge(_Args[0]);
@@ -142,7 +142,7 @@ public class Worker : BackgroundService
Helpers.HelperPackageFilesByDate.SetDateFromJsonEntry(_Logger, _Args[0]);
break;
case ConsoleKey.K:
- Helpers.HelperKanbanMetadata.SetMetadata(_Logger, _AppSettings, _Args[0]);
+ Helpers.HelperKanbanMetadata.SetMetadata(_Logger, _AppSettings, _Args[0], addTicks: true);
break;
case ConsoleKey.L:
Helpers.HelperLogMerge.LogMerge(_Args[0]);
@@ -152,7 +152,7 @@ public class Worker : BackgroundService
break;
case ConsoleKey.M:
if (_Args[0].EndsWith(".kanbn") && Directory.Exists(_Args[0]))
- Helpers.HelperKanbanMetadata.SetMetadata(_Logger, _AppSettings, _Args[0]);
+ Helpers.HelperKanbanMetadata.SetMetadata(_Logger, _AppSettings, _Args[0], addTicks: false);
Helpers.HelperMarkdown.MarkdownWikiLinkVerification(_AppSettings, _Logger, _Args);
break;
case ConsoleKey.O: