diff --git a/Helpers/HelperMarkdown.cs b/Helpers/HelperMarkdown.cs index 8814840..2780016 100644 --- a/Helpers/HelperMarkdown.cs +++ b/Helpers/HelperMarkdown.cs @@ -11,40 +11,6 @@ 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); - - private record Record(string Directory, - string File, - string[] Lines); - - 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)] - [JsonSerializable(typeof(Dictionary))] - internal partial class DictionaryStringAndJsonElementSourceGenerationContext : JsonSerializerContext - { - } - - [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) @@ -182,6 +148,9 @@ internal static partial class HelperMarkdown return result; } + [GeneratedRegex("(~~)?(#)([a-zA-Z0-9]{6})(~~)?( )")] + private static partial Regex HtmlColor(); + private static List GetMarkdownFileAndLines(string file, List markdownFiles) { List results = new(); @@ -240,7 +209,7 @@ internal static partial class HelperMarkdown line = lines[i]; if (line.Length < 3) continue; - if (line[..3] == "---") + if (h1LineNumber is null && line[..3] == "---") { frontMatterYamlEndLineNumber = i; continue; @@ -280,6 +249,90 @@ internal static partial class HelperMarkdown return (lines.ToList(), lineNumber); } + private static MarkdownExtra GetMarkdownExtra(MarkdownFileAndLines markdownFileAndLines) + { + MarkdownExtra result; + int skip; + Match match; + string line; + int completed; + int notCompleted; + List lines; + string? effort = null; + 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 > 8 && line[..8] == "effort: ") + { + effort = line[7..].Trim().Trim('"'); + continue; + } + if (line.Length > 10 && line[..10] == "assigned: ") + { + foreach (string item in line[10..].Split(',', StringSplitOptions.RemoveEmptyEntries)) + 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), effort, new(h2HexColors), new(h2NoCheckboxes), new(h2WithCheckboxes), requestedDateTime); + return result; + } + private static List Distinct(IEnumerable? markdownFileAndLinesCollection) { List results = new(); @@ -521,20 +574,15 @@ internal static partial class HelperMarkdown File.WriteAllLines(file, new string[] { "---", $"type: \"{type}\"", "---", string.Empty, $"# {h1}" }); lines = File.ReadAllLines(file).ToList(); } - markdownFile = new(null, - fileInfo.CreationTime, + markdownFile = new(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())); @@ -544,6 +592,115 @@ internal static partial class HelperMarkdown return new(results); } + private static ReadOnlyDictionary> GetColumnsToCards(Input input, ReadOnlyDictionary relativeToCollection) + { + Dictionary> results = new(); + Card card; + string key; + string[] lines; + string[] segmentsA; + string? column = null; + List cards = new(); + MarkdownFile markdownFile; + MarkdownExtra markdownExtra; + List allKeys = new(); + MarkdownFileAndLines? markdownFileAndLines; + foreach (KeyValuePair relativeTo in relativeToCollection) + allKeys.Add(relativeTo.Key); + 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.Type != "Kanban") + 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 (cards.Count > 1) + { + if (column is null) + throw new NullReferenceException(nameof(column)); + results.Add(column, cards); + cards = 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(markdownFile.Directory, segmentsA[1][..^1])); + if (!allKeys.Remove(key)) + throw new NotSupportedException(); + if (!relativeToCollection.TryGetValue(key, out markdownFileAndLines)) + continue; + markdownExtra = GetMarkdownExtra(markdownFileAndLines); + card = new(markdownExtra.Assignees, + markdownFileAndLines.MarkdownFile.CreationDateTime, + markdownFileAndLines.MarkdownFile.Directory, + markdownExtra.Effort, + 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); + cards.Add(card); + } + } + foreach (string notLinkedKey in allKeys) + { + key = notLinkedKey; + if (!relativeToCollection.TryGetValue(key, out markdownFileAndLines)) + continue; + if (markdownFileAndLines.MarkdownFile.LineNumber.FrontMatterYamlEnd is null) + continue; + markdownExtra = GetMarkdownExtra(markdownFileAndLines); + card = new(markdownExtra.Assignees, + markdownFileAndLines.MarkdownFile.CreationDateTime, + markdownFileAndLines.MarkdownFile.Directory, + markdownExtra.Effort, + 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); + cards.Add(card); + } + if (cards.Count > 1) + { + column = "Not Linked"; + results.Add(column, cards); + cards = new(); + } + } + return new(results); + } + private static MarkdownFileAndLines? GetMarkdownFile(ReadOnlyDictionary> keyValuePairs, MarkdownFile markdownFile, string file) { MarkdownFileAndLines? result; @@ -976,6 +1133,18 @@ internal static partial class HelperMarkdown } } + private static void SaveColumnToCards(Input input, ReadOnlyDictionary relativeToCollection) + { + if (string.IsNullOrEmpty(input.StartAt) || string.IsNullOrEmpty(input.Destination)) + throw new NotSupportedException(); + ReadOnlyDictionary> columnsToCards = GetColumnsToCards(input, relativeToCollection); + if (columnsToCards.Count > 0) + { + string json = JsonSerializer.Serialize(columnsToCards, ColumnsAndCardsSourceGenerationContext.Default.ReadOnlyDictionaryStringListCard); + File.WriteAllText(Path.Combine(input.Destination, $"{nameof(columnsToCards)}.json"), json); + } + } + private static List GetWithLinksForHugo(AppSettings appSettings, Input input) { List results = new(); @@ -1056,6 +1225,43 @@ internal static partial class HelperMarkdown } } + private record Input(string Source, + string? StartAt, + string? Destination); + + private record Record(string Directory, + string File, + string[] Lines); + + private record MarkdownFile(DateTime CreationDateTime, + string Directory, + string Extension, + string File, + string FileName, + string FileNameWithoutExtension, + string H1, + DateTime LastWriteDateTime, + LineNumber LineNumber, + string Type); + + private record MarkdownFileAndLines(MarkdownFile MarkdownFile, + string[] Lines); + + private record MarkdownExtra(ReadOnlyCollection? Assignees, + string? Effort, + 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)] + [JsonSerializable(typeof(Dictionary))] + internal partial class DictionaryStringAndJsonElementSourceGenerationContext : JsonSerializerContext + { + } + 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][5..].Trim().Trim('"'); @@ -1192,179 +1398,7 @@ internal static partial class HelperMarkdown 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)) - { - string json; - MarkdownFile markdownFile = relativeToCollection.ElementAt(0).Value.MarkdownFile; - json = JsonSerializer.Serialize(markdownFile, MarkdownFileSourceGenerationContext.Default.MarkdownFile); - if (json != "{}") - { - json = JsonSerializer.Serialize(relativeToCollection.Select(l => l.Value.MarkdownFile).ToArray(), MarkdownFileCollectionSourceGenerationContext.Default.MarkdownFileArray); - File.WriteAllText($"{DateTime.Now.Ticks}.json", json); - } - } - } - - 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; + SaveColumnToCards(input, relativeToCollection); } internal static void MarkdownConvertLinksForHugo(AppSettings appSettings, ILogger logger, List args) diff --git a/Helpers/HelperPdfStripperWrapper.cs b/Helpers/HelperPdfStripperWrapper.cs index 553f154..df6c352 100644 --- a/Helpers/HelperPdfStripperWrapper.cs +++ b/Helpers/HelperPdfStripperWrapper.cs @@ -10,31 +10,22 @@ internal static class HelperPdfStripperWrapper string? Key, char? Parser); - private static Input GetInput(List args) + private static string GetTextFromPDF(string pdfTextStripperFileName, string sourceFileNamePdf, string destinationFileName) { - string? d = null; - string? k = null; - string? p = null; - for (int i = 1; i < args.Count; i++) + string result; + ProcessStartInfo processStartInfo = new(pdfTextStripperFileName, $"s \"{sourceFileNamePdf}\"") { - if (args[i].Length == 2 && i + 1 < args.Count) - { - if (args[i][1] == 'd') - d = Path.GetFullPath(args[i + 1]); - else if (args[i][1] == 'k') - k = args[i + 1].Trim(); - else if (args[i][1] == 'p') - p = args[i + 1]; - i++; - } - } - string directoryName = Path.GetFileName(args[0]); - if (!string.IsNullOrEmpty(d) && !d.EndsWith(directoryName)) - d = Path.Combine(d, directoryName); - if (!string.IsNullOrEmpty(d) && !Directory.Exists(d)) - _ = Directory.CreateDirectory(d); - char? parser = p is null ? null : p == "S" ? 'S' : p == "G" ? 'G' : p == "K" ? 'K' : null; - return new(d, k, parser); + UseShellExecute = false, + RedirectStandardError = true, + RedirectStandardOutput = true, + }; + Process? process = Process.Start(processStartInfo); + _ = process?.WaitForExit(30000); + if (!File.Exists(destinationFileName)) + result = string.Empty; + else + result = File.ReadAllText(destinationFileName); + return result; } private static string GetGhostTextFromPDF(string ghostPCLFileName, string sourceFileNamePdf, string destinationFileName) @@ -69,22 +60,31 @@ internal static class HelperPdfStripperWrapper return result; } - private static string GetTextFromPDF(string pdfTextStripperFileName, string sourceFileNamePdf, string destinationFileName) + private static Input GetInput(List args) { - string result; - ProcessStartInfo processStartInfo = new(pdfTextStripperFileName, $"s \"{sourceFileNamePdf}\"") + string? d = null; + string? k = null; + string? p = null; + for (int i = 1; i < args.Count; i++) { - UseShellExecute = false, - RedirectStandardError = true, - RedirectStandardOutput = true, - }; - Process? process = Process.Start(processStartInfo); - _ = process?.WaitForExit(30000); - if (!File.Exists(destinationFileName)) - result = string.Empty; - else - result = File.ReadAllText(destinationFileName); - return result; + if (args[i].Length == 2 && i + 1 < args.Count) + { + if (args[i][1] == 'd') + d = Path.GetFullPath(args[i + 1]); + else if (args[i][1] == 'k') + k = args[i + 1].Trim(); + else if (args[i][1] == 'p') + p = args[i + 1]; + i++; + } + } + string directoryName = Path.GetFileName(args[0]); + if (!string.IsNullOrEmpty(d) && !d.EndsWith(directoryName)) + d = Path.Combine(d, directoryName); + if (!string.IsNullOrEmpty(d) && !Directory.Exists(d)) + _ = Directory.CreateDirectory(d); + char? parser = p is null ? null : p == "S" ? 'S' : p == "G" ? 'G' : p == "K" ? 'K' : null; + return new(d, k, parser); } private static void ParseSave(ILogger log, string pdfTextStripperFileName, string ghostPCLFileName, string kofaxFileName, string destinationDirectory, char parser, string[] files) @@ -108,6 +108,31 @@ internal static class HelperPdfStripperWrapper } } + private static void ParseStrip(ILogger log, string destinationDirectory, string key, string[] files) + { + string[] lines; + string fileName; + string[] segments; + List collection = new(); + foreach (string file in files) + { + lines = File.ReadAllLines(file); + fileName = Path.GetFileName(file); + foreach (string line in lines) + { + segments = line.Split(':'); + if (segments.Length < 2) + continue; + if (segments[0].Trim() != key) + continue; + collection.Add($"{fileName}\t{line}"); + } + log.LogInformation("<{fileName}>", fileName); + } + if (collection.Count > 0) + File.WriteAllLines(Path.Combine(destinationDirectory, $"{key}.txt"), collection); + } + internal static void ParseSave(ILogger log, List args) { string pdfTextStripperFileName = Path.Combine(AppContext.BaseDirectory, "PDF-Text-Stripper.exe"); @@ -146,31 +171,6 @@ internal static class HelperPdfStripperWrapper } } - private static void ParseStrip(ILogger log, string destinationDirectory, string key, string[] files) - { - string[] lines; - string fileName; - string[] segments; - List collection = new(); - foreach (string file in files) - { - lines = File.ReadAllLines(file); - fileName = Path.GetFileName(file); - foreach (string line in lines) - { - segments = line.Split(':'); - if (segments.Length < 2) - continue; - if (segments[0].Trim() != key) - continue; - collection.Add($"{fileName}\t{line}"); - } - log.LogInformation("<{fileName}>", fileName); - } - if (collection.Count > 0) - File.WriteAllLines(Path.Combine(destinationDirectory, $"{key}.txt"), collection); - } - internal static void ParseStrip(ILogger log, List args) { if (DateTime.Now > new DateTime(2023, 9, 15)) diff --git a/Helpers/HelperTooLong.cs b/Helpers/HelperTooLong.cs index 520d3f6..676fc6f 100644 --- a/Helpers/HelperTooLong.cs +++ b/Helpers/HelperTooLong.cs @@ -3,6 +3,32 @@ namespace File_Folder_Helper.Helpers; internal static class HelperTooLong { + internal static void TooLong(string workingDirectory, bool delete) + { + string[] files; + string destination; + string? parentDirectory; + string[] directories = Directory.GetDirectories(workingDirectory, "*", SearchOption.TopDirectoryOnly); + for (int i = 0; i < directories.Length; i++) + { + if (delete) + { + Directory.Delete(directories[i], recursive: true); + break; + } + files = Directory.GetFiles(directories[i], "*", SearchOption.TopDirectoryOnly); + for (int f = 0; f < files.Length; f++) + File.Delete(files[f]); + parentDirectory = Path.GetDirectoryName(directories[i]); + if (string.IsNullOrEmpty(parentDirectory)) + continue; + destination = Path.Combine(parentDirectory, i.ToString()); + if (Path.GetFileName(directories[i]).Length > 3) + Directory.Move(directories[i], destination); + TooLong(destination, delete); + } + } + private static void MoveFiles(string yearName, string personKeyFormattedDirectory, string personNameDirectory, string personNameDirectoryName) { string? checkFile; @@ -85,30 +111,4 @@ internal static class HelperTooLong _ = HelperDeleteEmptyDirectories.DeleteEmptyDirectories(directory); } - internal static void TooLong(string workingDirectory, bool delete) - { - string[] files; - string destination; - string? parentDirectory; - string[] directories = Directory.GetDirectories(workingDirectory, "*", SearchOption.TopDirectoryOnly); - for (int i = 0; i < directories.Length; i++) - { - if (delete) - { - Directory.Delete(directories[i], recursive: true); - break; - } - files = Directory.GetFiles(directories[i], "*", SearchOption.TopDirectoryOnly); - for (int f = 0; f < files.Length; f++) - File.Delete(files[f]); - parentDirectory = Path.GetDirectoryName(directories[i]); - if (string.IsNullOrEmpty(parentDirectory)) - continue; - destination = Path.Combine(parentDirectory, i.ToString()); - if (Path.GetFileName(directories[i]).Length > 3) - Directory.Move(directories[i], destination); - TooLong(destination, delete); - } - } - } \ No newline at end of file diff --git a/Models/Card.cs b/Models/Card.cs new file mode 100644 index 0000000..e96230c --- /dev/null +++ b/Models/Card.cs @@ -0,0 +1,33 @@ +using System.Collections.ObjectModel; +using System.Text.Json.Serialization; + +namespace File_Folder_Helper.Models; + +internal record Card(ReadOnlyCollection? Assignees, + DateTime CreationDateTime, + string Directory, + string? Effort, + 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(Card))] +internal partial class CardSourceGenerationContext : JsonSerializerContext +{ +} + +[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] +[JsonSerializable(typeof(ReadOnlyDictionary>))] +internal partial class ColumnsAndCardsSourceGenerationContext : JsonSerializerContext +{ +} \ No newline at end of file diff --git a/Models/MarkdownFile.cs b/Models/MarkdownFile.cs deleted file mode 100644 index 6f76fc5..0000000 --- a/Models/MarkdownFile.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.ObjectModel; -using System.Text.Json.Serialization; - -namespace File_Folder_Helper.Models; - -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))] -internal partial class MarkdownFileSourceGenerationContext : JsonSerializerContext -{ -} - -[JsonSourceGenerationOptions(WriteIndented = true)] -[JsonSerializable(typeof(MarkdownFile[]))] -internal partial class MarkdownFileCollectionSourceGenerationContext : JsonSerializerContext -{ -} \ No newline at end of file