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: