Remove .Any

H2 Records
This commit is contained in:
Mike Phares 2023-09-27 23:05:40 -07:00
parent 4ba2a42ed1
commit f810af3ebe
13 changed files with 307 additions and 61 deletions

View File

@ -9,7 +9,7 @@
<UserSecretsId>eb9e8f58-fcb5-45bb-9d4d-54f064c485b1</UserSecretsId> <UserSecretsId>eb9e8f58-fcb5-45bb-9d4d-54f064c485b1</UserSecretsId>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="7.0.10" /> <PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="7.0.11" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="7.0.0" />
<PackageReference Include="System.Text.Json" Version="7.0.3" /> <PackageReference Include="System.Text.Json" Version="7.0.3" />

View File

@ -279,7 +279,7 @@ internal static partial class HelperCreateNoteFiles
CleanExistingFiles(argsZero, ticks); CleanExistingFiles(argsZero, ticks);
importFiles.AddRange(Directory.GetFiles(argsZero, "*.csv", SearchOption.TopDirectoryOnly)); importFiles.AddRange(Directory.GetFiles(argsZero, "*.csv", SearchOption.TopDirectoryOnly));
importFiles.AddRange(Directory.GetFiles(argsZero, "*.tsv", SearchOption.TopDirectoryOnly)); importFiles.AddRange(Directory.GetFiles(argsZero, "*.tsv", SearchOption.TopDirectoryOnly));
if (!importFiles.Any()) if (importFiles.Count == 0)
CreateDailyNotes(argsZero, ticks); CreateDailyNotes(argsZero, ticks);
else else
CreateImportFiles(ticks, importFiles); CreateImportFiles(ticks, importFiles);

View File

@ -96,7 +96,7 @@ internal static partial class HelperKanbanMetadata
return results; 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; bool? match;
string? paramCase; string? paramCase;
@ -119,11 +119,12 @@ internal static partial class HelperKanbanMetadata
if (itemLineNumber == 0) if (itemLineNumber == 0)
throw new NotSupportedException(); throw new NotSupportedException();
(lines, lineNumber) = HelperMarkdown.GetStatusAndFrontMatterYamlEndLineNumbers(fileInfo); (lines, lineNumber) = HelperMarkdown.GetStatusAndFrontMatterYamlEndLineNumbers(fileInfo);
if (!lines.Any()) if (lines.Count == 0)
continue; continue;
statusLine = $"status: \"{groupCount}-{group}\""; statusLine = $"status: \"{groupCount}-{group}\"";
paramCase = lineNumber.H1 is null ? null : GetParamCase(lines[lineNumber.H1.Value]); 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; match = lineNumber.H1 is null || paramCase is null ? null : Path.GetFileNameWithoutExtension(fileInfo.Name) == paramCase;
if (lineNumber.FrontMatterYamlEnd is null) if (lineNumber.FrontMatterYamlEnd is null)
throw new NotSupportedException($"{nameof(SetMetadata)} must be executed first!"); 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(fileInfo.FullName, lines);
} }
File.WriteAllLines(indexFile, indexFileLines); if (addTicks)
File.WriteAllLines(indexFile, indexFileLines);
} }
} }

View File

@ -4,12 +4,16 @@ using System.Collections.ObjectModel;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
namespace File_Folder_Helper.Helpers; namespace File_Folder_Helper.Helpers;
internal static partial class HelperMarkdown internal static partial class HelperMarkdown
{ {
[GeneratedRegex("(~~)?(#)([a-zA-Z0-9]{6})(~~)?( )")]
private static partial Regex HtmlColor();
private record Input(string Source, private record Input(string Source,
string? StartAt, string? StartAt,
string? Destination); string? Destination);
@ -21,6 +25,12 @@ internal static partial class HelperMarkdown
private record MarkdownFileAndLines(MarkdownFile MarkdownFile, private record MarkdownFileAndLines(MarkdownFile MarkdownFile,
string[] Lines); string[] Lines);
private record MarkdownExtra(ReadOnlyCollection<string>? Assignees,
ReadOnlyCollection<H2HexColor>? H2HexColorCollection,
ReadOnlyCollection<H2NoCheckboxes>? H2NoCheckboxesCollection,
ReadOnlyCollection<H2WithCheckboxes>? H2WithCheckboxesCollection,
string? RequestedDateTime);
private record MarkdownFileH1AndRelativePath(MarkdownFile? MarkdownFile, string[]? Lines, string? H1, string? RelativePath); private record MarkdownFileH1AndRelativePath(MarkdownFile? MarkdownFile, string[]? Lines, string? H1, string? RelativePath);
[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] [JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
@ -29,6 +39,12 @@ internal static partial class HelperMarkdown
{ {
} }
[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
[JsonSerializable(typeof(ReadOnlyDictionary<string, List<MarkdownFile>>))]
internal partial class ColumnAndLinksSourceGenerationContext : JsonSerializerContext
{
}
private static void SetRecursiveLines(AppSettings appSettings, ILogger<Worker> logger, ReadOnlyDictionary<string, List<MarkdownFileAndLines>> keyValuePairs, string linkTitle, MarkdownFile markdownFile, string[] lines, List<char> indentations, List<string> recursiveLines) private static void SetRecursiveLines(AppSettings appSettings, ILogger<Worker> logger, ReadOnlyDictionary<string, List<MarkdownFileAndLines>> keyValuePairs, string linkTitle, MarkdownFile markdownFile, string[] lines, List<char> indentations, List<string> recursiveLines)
{ {
if (recursiveLines is null) if (recursiveLines is null)
@ -200,7 +216,7 @@ internal static partial class HelperMarkdown
result = JsonSerializer.Serialize(keyValuePairs, DictionaryStringAndJsonElementSourceGenerationContext.Default.DictionaryStringJsonElement); result = JsonSerializer.Serialize(keyValuePairs, DictionaryStringAndJsonElementSourceGenerationContext.Default.DictionaryStringJsonElement);
string[] parsedLines = result.Split(Environment.NewLine).ToArray(); string[] parsedLines = result.Split(Environment.NewLine).ToArray();
results = GetFrontMatterLines(parsedLines); results = GetFrontMatterLines(parsedLines);
if (!results.Any()) if (results.Count == 0)
{ {
result = null; result = null;
keyValuePairs = null; keyValuePairs = null;
@ -249,7 +265,7 @@ internal static partial class HelperMarkdown
updatedLineNumber = i; updatedLineNumber = i;
continue; continue;
} }
if (h1LineNumber is null && line.Length > 2 && line[..2] == "# ") if (h1LineNumber is null && line.Length > 2 && line[0] == '#' && line[1] == ' ')
{ {
h1LineNumber = i; h1LineNumber = i;
continue; continue;
@ -358,7 +374,7 @@ internal static partial class HelperMarkdown
break; break;
} }
} }
if (jsonLines.Any()) if (jsonLines.Count > 0)
(result, keyValuePairs, results) = Get(jsonLines); (result, keyValuePairs, results) = Get(jsonLines);
else else
(result, keyValuePairs, results) = (null, null, new()); (result, keyValuePairs, results) = (null, null, new());
@ -438,7 +454,7 @@ internal static partial class HelperMarkdown
MarkdownFile markdownFile; MarkdownFile markdownFile;
foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection) foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection)
{ {
if (!relativeTo.Value.Lines.Any()) if (relativeTo.Value.Lines.Length == 0)
continue; continue;
lines = relativeTo.Value.Lines; lines = relativeTo.Value.Lines;
markdownFile = relativeTo.Value.MarkdownFile; markdownFile = relativeTo.Value.MarkdownFile;
@ -497,7 +513,7 @@ internal static partial class HelperMarkdown
(lines, lineNumber) = GetStatusAndFrontMatterYamlEndLineNumbers(fileInfo); (lines, lineNumber) = GetStatusAndFrontMatterYamlEndLineNumbers(fileInfo);
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName); fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName);
h1 = fileNameWithoutExtension.ToLower().Replace("%20", "-").Replace(' ', '-'); h1 = fileNameWithoutExtension.ToLower().Replace("%20", "-").Replace(' ', '-');
if (lines.Any()) if (lines.Count > 0)
(type, h1) = GetTypeAndH1(appSettings, h1, lines, lineNumber); (type, h1) = GetTypeAndH1(appSettings, h1, lines, lineNumber);
else else
{ {
@ -505,7 +521,21 @@ internal static partial class HelperMarkdown
File.WriteAllLines(file, new string[] { "---", $"type: \"{type}\"", "---", string.Empty, $"# {h1}" }); File.WriteAllLines(file, new string[] { "---", $"type: \"{type}\"", "---", string.Empty, $"# {h1}" });
lines = File.ReadAllLines(file).ToList(); 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)) if (force || input.StartAt is null || file.StartsWith(input.StartAt))
results.Add(key, new(markdownFile, lines.ToArray())); results.Add(key, new(markdownFile, lines.ToArray()));
else else
@ -613,7 +643,7 @@ internal static partial class HelperMarkdown
string[] frontMatterYamlLines; string[] frontMatterYamlLines;
foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection) foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection)
{ {
if (!relativeTo.Value.Lines.Any()) if (relativeTo.Value.Lines.Length == 0)
continue; continue;
results.Clear(); results.Clear();
lines = relativeTo.Value.Lines; lines = relativeTo.Value.Lines;
@ -621,7 +651,7 @@ internal static partial class HelperMarkdown
if (markdownFile.LineNumber.FrontMatterYamlEnd is null) if (markdownFile.LineNumber.FrontMatterYamlEnd is null)
continue; continue;
(_, _, frontMatterYamlLines) = Get(markdownFile.LineNumber.FrontMatterYamlEnd.Value, lines); (_, _, frontMatterYamlLines) = Get(markdownFile.LineNumber.FrontMatterYamlEnd.Value, lines);
if (!frontMatterYamlLines.Any()) if (frontMatterYamlLines.Length == 0)
continue; continue;
results.Add("---"); results.Add("---");
results.AddRange(frontMatterYamlLines); results.AddRange(frontMatterYamlLines);
@ -658,7 +688,7 @@ internal static partial class HelperMarkdown
MarkdownFile markdownFile; MarkdownFile markdownFile;
foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection) foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection)
{ {
if (!relativeTo.Value.Lines.Any()) if (relativeTo.Value.Lines.Length == 0)
continue; continue;
circularReference = false; circularReference = false;
lines = relativeTo.Value.Lines; lines = relativeTo.Value.Lines;
@ -719,7 +749,7 @@ internal static partial class HelperMarkdown
MarkdownFile markdownFile; MarkdownFile markdownFile;
foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection) foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection)
{ {
if (!relativeTo.Value.Lines.Any()) if (relativeTo.Value.Lines.Length == 0)
continue; continue;
found = false; found = false;
lines = relativeTo.Value.Lines; lines = relativeTo.Value.Lines;
@ -771,7 +801,7 @@ internal static partial class HelperMarkdown
ReadOnlyDictionary<string, List<MarkdownFileAndLines>> keyValuePairs = GetKeyValuePairs(relativeToCollection); ReadOnlyDictionary<string, List<MarkdownFileAndLines>> keyValuePairs = GetKeyValuePairs(relativeToCollection);
foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection) foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection)
{ {
if (!relativeTo.Value.Lines.Any()) if (relativeTo.Value.Lines.Length == 0)
continue; continue;
write = false; write = false;
lines = relativeTo.Value.Lines; lines = relativeTo.Value.Lines;
@ -828,7 +858,7 @@ internal static partial class HelperMarkdown
ReadOnlyDictionary<string, List<MarkdownFileAndLines>> keyValuePairs = GetKeyValuePairs(relativeToCollection); ReadOnlyDictionary<string, List<MarkdownFileAndLines>> keyValuePairs = GetKeyValuePairs(relativeToCollection);
foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection) foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection)
{ {
if (!relativeTo.Value.Lines.Any()) if (relativeTo.Value.Lines.Length == 0)
continue; continue;
lines = relativeTo.Value.Lines; lines = relativeTo.Value.Lines;
markdownFile = relativeTo.Value.MarkdownFile; markdownFile = relativeTo.Value.MarkdownFile;
@ -922,7 +952,7 @@ internal static partial class HelperMarkdown
ReadOnlyDictionary<string, List<MarkdownFileAndLines>> keyValuePairs = GetKeyValuePairs(relativeToCollection); ReadOnlyDictionary<string, List<MarkdownFileAndLines>> keyValuePairs = GetKeyValuePairs(relativeToCollection);
foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection) foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection)
{ {
if (!relativeTo.Value.Lines.Any()) if (relativeTo.Value.Lines.Length == 0)
continue; continue;
if (input.StartAt is null || !relativeTo.Value.MarkdownFile.File.StartsWith(input.StartAt) || Path.GetFileName(relativeTo.Value.MarkdownFile.Directory) != Path.GetFileName(input.StartAt)) if (input.StartAt is null || !relativeTo.Value.MarkdownFile.File.StartsWith(input.StartAt) || Path.GetFileName(relativeTo.Value.MarkdownFile.Directory) != Path.GetFileName(input.StartAt))
continue; continue;
@ -964,7 +994,7 @@ internal static partial class HelperMarkdown
ReadOnlyDictionary<string, MarkdownFileAndLines> relativeToCollection = GetRelativeToCollection(appSettings, input); ReadOnlyDictionary<string, MarkdownFileAndLines> relativeToCollection = GetRelativeToCollection(appSettings, input);
foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection) foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection)
{ {
if (!relativeTo.Value.Lines.Any()) if (relativeTo.Value.Lines.Length == 0)
continue; continue;
lines = relativeTo.Value.Lines; lines = relativeTo.Value.Lines;
markdownFile = relativeTo.Value.MarkdownFile; 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<string> lines, LineNumber lineNumber) private static (string type, string h1) GetTypeAndH1(AppSettings appSettings, string h1, List<string> 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..]; string h1FromFile = lineNumber.H1 is null ? h1 : lines[lineNumber.H1.Value][2..];
return (type, h1FromFile); return (type, h1FromFile);
} }
@ -1048,7 +1078,7 @@ internal static partial class HelperMarkdown
string updatedLineCompare; string updatedLineCompare;
foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection) foreach (KeyValuePair<string, MarkdownFileAndLines> relativeTo in relativeToCollection)
{ {
if (!relativeTo.Value.Lines.Any()) if (relativeTo.Value.Lines.Length == 0)
continue; continue;
results.Clear(); results.Clear();
lines = relativeTo.Value.Lines; lines = relativeTo.Value.Lines;
@ -1161,6 +1191,8 @@ internal static partial class HelperMarkdown
List<MarkdownFileAndLines> markdownFileAndLinesCollection = GetRecursiveLines(appSettings, input, logger, relativeToCollection); List<MarkdownFileAndLines> markdownFileAndLinesCollection = GetRecursiveLines(appSettings, input, logger, relativeToCollection);
Write(input, markdownFileAndLinesCollection); Write(input, markdownFileAndLinesCollection);
} }
if (!string.IsNullOrEmpty(input.StartAt) && !string.IsNullOrEmpty(input.Destination))
Save(input, relativeToCollection);
string directory = Path.Combine(Environment.CurrentDirectory, ".vscode"); string directory = Path.Combine(Environment.CurrentDirectory, ".vscode");
if (!Directory.Exists(directory)) if (!Directory.Exists(directory))
{ {
@ -1175,13 +1207,173 @@ internal static partial class HelperMarkdown
} }
} }
private static void Save(Input input, ReadOnlyDictionary<string, MarkdownFileAndLines> relativeToCollection)
{
if (string.IsNullOrEmpty(input.StartAt) || string.IsNullOrEmpty(input.Destination))
throw new NotSupportedException();
ReadOnlyDictionary<string, List<MarkdownFile>> 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<string, List<MarkdownFile>> GetColumnsToLinks(Input input, ReadOnlyDictionary<string, MarkdownFileAndLines> relativeToCollection)
{
Dictionary<string, List<MarkdownFile>> results = new();
string key;
string[] lines;
string[] segmentsA;
string? column = null;
MarkdownFile markdownFile;
MarkdownExtra markdownExtra;
List<MarkdownFile> links = new();
MarkdownFileAndLines? markdownFileAndLines;
foreach (KeyValuePair<string, MarkdownFileAndLines> 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<string> lines;
List<string> assignees = new();
string? requestedDateTime = null;
ReadOnlyCollection<Group> groups;
List<H2HexColor> h2HexColors = new();
List<H2NoCheckboxes> h2NoCheckboxes = new();
List<H2WithCheckboxes> 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<Worker> logger, List<string> args) internal static void MarkdownConvertLinksForHugo(AppSettings appSettings, ILogger<Worker> logger, List<string> args)
{ {
Input input = GetInput(args); Input input = GetInput(args);
if (string.IsNullOrEmpty(input.Destination)) if (string.IsNullOrEmpty(input.Destination))
throw new NotSupportedException("This method requires frontMatterYamlLines -d path!"); throw new NotSupportedException("This method requires frontMatterYamlLines -d path!");
List<Record> collection = GetWithLinksForHugo(appSettings, input); List<Record> collection = GetWithLinksForHugo(appSettings, input);
if (!collection.Any()) if (collection.Count == 0)
logger.LogInformation("No files?"); logger.LogInformation("No files?");
List<string> distinct = GetDistinct(collection); List<string> distinct = GetDistinct(collection);
CreateMissingDirectories(distinct); CreateMissingDirectories(distinct);

View File

@ -34,7 +34,7 @@ internal static class HelperPackageFilesByDate
continue; continue;
json = File.ReadAllText(packageJsonFile); json = File.ReadAllText(packageJsonFile);
packageJson = JsonSerializer.Deserialize(json, PackageJsonSourceGenerationContext.Default.PackageJson); packageJson = JsonSerializer.Deserialize(json, PackageJsonSourceGenerationContext.Default.PackageJson);
if (packageJson is null || !packageJson.Times.Any()) if (packageJson is null || packageJson.Times.Count == 0)
continue; continue;
packageJsonDirectoryName = Path.GetFileName(packageJsonDirectory); packageJsonDirectoryName = Path.GetFileName(packageJsonDirectory);
tgzFiles = Directory.GetFiles(packageJsonDirectory, "*.tgz", SearchOption.TopDirectoryOnly); tgzFiles = Directory.GetFiles(packageJsonDirectory, "*.tgz", SearchOption.TopDirectoryOnly);
@ -52,7 +52,7 @@ internal static class HelperPackageFilesByDate
if (fileInfo.LastWriteTime != dateTime) if (fileInfo.LastWriteTime != dateTime)
File.SetLastWriteTime(fileInfo.FullName, dateTime); File.SetLastWriteTime(fileInfo.FullName, dateTime);
} }
if (!dateTimes.Any()) if (dateTimes.Count == 0)
{ {
if (fileNameWithoutExtension.Length + 1 < packageJsonDirectoryName.Length) if (fileNameWithoutExtension.Length + 1 < packageJsonDirectoryName.Length)
continue; continue;
@ -64,7 +64,7 @@ internal static class HelperPackageFilesByDate
File.SetLastWriteTime(fileInfo.FullName, dateTime); File.SetLastWriteTime(fileInfo.FullName, dateTime);
} }
} }
if (!dateTimes.Any()) if (dateTimes.Count == 0)
continue; continue;
dateTime = dateTimes.Max(); dateTime = dateTimes.Max();
fileInfo = new(packageJsonFile); fileInfo = new(packageJsonFile);

View File

@ -0,0 +1,2 @@
[*.cs]
csharp_preserve_single_line_statements = true

View File

@ -25,22 +25,14 @@ public class AppSettings
private static Models.AppSettings Get(AppSettings? appSettings) private static Models.AppSettings Get(AppSettings? appSettings)
{ {
Models.AppSettings result; Models.AppSettings result;
if (appSettings?.Company is null) if (appSettings?.Company is null) throw new NullReferenceException(nameof(appSettings.Company));
throw new NullReferenceException(nameof(appSettings.Company)); if (appSettings?.DefaultNoteType is null) throw new NullReferenceException(nameof(appSettings.DefaultNoteType));
if (appSettings?.DefaultNoteType is null) if (appSettings?.ExcludeDirectoryNames is null) throw new NullReferenceException(nameof(appSettings.ExcludeDirectoryNames));
throw new NullReferenceException(nameof(appSettings.DefaultNoteType)); if (appSettings?.ExcludeSchemes is null) throw new NullReferenceException(nameof(appSettings.ExcludeSchemes));
if (appSettings?.ExcludeDirectoryNames is null) if (appSettings?.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(appSettings.PersonBirthdayFormat));
throw new NullReferenceException(nameof(appSettings.ExcludeDirectoryNames)); if (appSettings?.PersonCharacters is null) throw new NullReferenceException(nameof(appSettings.PersonCharacters));
if (appSettings?.ExcludeSchemes is null) if (appSettings?.PersonTitleFilters is null) throw new NullReferenceException(nameof(appSettings.PersonTitleFilters));
throw new NullReferenceException(nameof(appSettings.ExcludeSchemes)); if (appSettings?.WorkingDirectoryName is null) throw new NullReferenceException(nameof(appSettings.WorkingDirectoryName));
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( result = new(
appSettings.Company, appSettings.Company,
appSettings.DefaultNoteType, appSettings.DefaultNoteType,
@ -60,6 +52,19 @@ public class AppSettings
#pragma warning disable IL3050, IL2026 #pragma warning disable IL3050, IL2026
AppSettings? appSettings = configurationRoot.Get<AppSettings>(); AppSettings? appSettings = configurationRoot.Get<AppSettings>();
#pragma warning restore IL3050, IL2026 #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); result = Get(appSettings);
return result; return result;
} }

12
Models/H2HexColor.cs Normal file
View File

@ -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
{
}

13
Models/H2NoCheckboxes.cs Normal file
View File

@ -0,0 +1,13 @@
using System.Collections.ObjectModel;
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Models;
internal record H2NoCheckboxes(string H2,
ReadOnlyCollection<string> Lines);
[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
[JsonSerializable(typeof(H2NoCheckboxes))]
internal partial class H2NoCheckboxesSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -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
{
}

View File

@ -2,12 +2,12 @@ using System.Text.Json.Serialization;
namespace File_Folder_Helper.Models; namespace File_Folder_Helper.Models;
public record LineNumber(int? Created, internal record LineNumber(int? Created,
int? H1, int? H1,
int? FrontMatterYamlEnd, int? FrontMatterYamlEnd,
int? Status, int? Status,
int? Type, int? Type,
int? Updated); int? Updated);
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(LineNumber))] [JsonSerializable(typeof(LineNumber))]

View File

@ -1,17 +1,23 @@
using System.Collections.ObjectModel;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace File_Folder_Helper.Models; namespace File_Folder_Helper.Models;
public record MarkdownFile(string File, internal record MarkdownFile(ReadOnlyCollection<string>? Assignees,
string Directory, DateTime CreationDateTime,
string FileName, string Directory,
string FileNameWithoutExtension, string Extension,
string Extension, string File,
DateTime CreationDateTime, string FileName,
DateTime LastWriteDateTime, string FileNameWithoutExtension,
LineNumber LineNumber, string H1,
string Type, ReadOnlyCollection<H2HexColor>? H2HexColorCollection,
string H1); ReadOnlyCollection<H2NoCheckboxes>? H2NoCheckboxesCollection,
ReadOnlyCollection<H2WithCheckboxes>? H2WithCheckboxesCollection,
DateTime LastWriteDateTime,
LineNumber LineNumber,
string? RequestedDateTime,
string Type);
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(MarkdownFile))] [JsonSerializable(typeof(MarkdownFile))]

View File

@ -81,7 +81,7 @@ public class Worker : BackgroundService
consoleKey = ConsoleKey.End; consoleKey = ConsoleKey.End;
if (singleCharIndex is not null) if (singleCharIndex is not null)
_Args.RemoveAt(singleCharIndex.Value); _Args.RemoveAt(singleCharIndex.Value);
if (!_Args.Any()) if (_Args.Count == 0)
_Logger.LogInformation("Must pass a argument!"); _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")))) else if (Directory.Exists(_Args[0]) && File.Exists(Path.Combine(_Args[0], string.Concat(Path.GetFileName(_Args[0]), ".dll"))))
Helpers.HelperILMerge.ILMerge(_Args[0]); Helpers.HelperILMerge.ILMerge(_Args[0]);
@ -142,7 +142,7 @@ public class Worker : BackgroundService
Helpers.HelperPackageFilesByDate.SetDateFromJsonEntry(_Logger, _Args[0]); Helpers.HelperPackageFilesByDate.SetDateFromJsonEntry(_Logger, _Args[0]);
break; break;
case ConsoleKey.K: case ConsoleKey.K:
Helpers.HelperKanbanMetadata.SetMetadata(_Logger, _AppSettings, _Args[0]); Helpers.HelperKanbanMetadata.SetMetadata(_Logger, _AppSettings, _Args[0], addTicks: true);
break; break;
case ConsoleKey.L: case ConsoleKey.L:
Helpers.HelperLogMerge.LogMerge(_Args[0]); Helpers.HelperLogMerge.LogMerge(_Args[0]);
@ -152,7 +152,7 @@ public class Worker : BackgroundService
break; break;
case ConsoleKey.M: case ConsoleKey.M:
if (_Args[0].EndsWith(".kanbn") && Directory.Exists(_Args[0])) 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); Helpers.HelperMarkdown.MarkdownWikiLinkVerification(_AppSettings, _Logger, _Args);
break; break;
case ConsoleKey.O: case ConsoleKey.O: