person-key-to-immich-import birthday json (Day-Helper-2024-05-18)
csharp_prefer_braces = true
This commit is contained in:
@ -16,37 +16,6 @@ internal static partial class Helper20250204 {
|
||||
[GeneratedRegex("[\\s!?.,@:;|\\\\/\"'`£$%\\^&*{}[\\]()<>~#+\\-=_¬]+")]
|
||||
private static partial Regex InvalidCharacter();
|
||||
|
||||
private record H1ParamCaseAndState(string H1, string ParamCase, string State) {
|
||||
|
||||
private static string GetParamCase(string value) {
|
||||
string result;
|
||||
StringBuilder stringBuilder = new(value);
|
||||
Match[] matches = UpperCase().Matches(value).ToArray();
|
||||
for (int i = matches.Length - 1; i > -1; i--)
|
||||
_ = stringBuilder.Insert(matches[i].Index, '-');
|
||||
string[] segments = InvalidCharacter().Split(stringBuilder.ToString().ToLower());
|
||||
result = string.Join('-', segments).Trim('-');
|
||||
return result;
|
||||
}
|
||||
|
||||
private static string GetState(string value) =>
|
||||
value switch {
|
||||
"New" => "ToDo",
|
||||
"Active" => "In Progress",
|
||||
"Closed" => "Done",
|
||||
_ => "Backlog",
|
||||
};
|
||||
|
||||
internal static H1ParamCaseAndState Get(WorkItem workItem) {
|
||||
H1ParamCaseAndState result;
|
||||
string paramCase = GetParamCase(workItem.Title);
|
||||
string state = GetState(workItem.State);
|
||||
result = new(workItem.Title, paramCase, state);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private record Attribute([property: JsonPropertyName("isLocked")] bool IsLocked,
|
||||
[property: JsonPropertyName("name")] string Name,
|
||||
[property: JsonPropertyName("parameterTitle")] string? ParameterTitle,
|
||||
@ -148,16 +117,6 @@ internal static partial class Helper20250204 {
|
||||
private static string GetTaskText(string directory, string rootDirectory) =>
|
||||
string.Join(Environment.NewLine, GetTaskLines(directory, rootDirectory));
|
||||
|
||||
private static void WriteTaskFile(string sourceDirectory, string rootDirectory) {
|
||||
string tasksFile = Path.Combine(sourceDirectory, ".vscode", "tasks.json");
|
||||
string oldText = File.ReadAllText(tasksFile);
|
||||
string jsonSafeDirectory = sourceDirectory.Replace('\\', '/');
|
||||
if (!oldText.Contains(jsonSafeDirectory)) {
|
||||
string text = GetTaskText(jsonSafeDirectory, rootDirectory);
|
||||
File.WriteAllText(tasksFile, text);
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetFilter(ReadOnlyCollection<H1ParamCaseAndState> collection, string filter) =>
|
||||
string.Join(Environment.NewLine, from l in collection where l.State == filter select $"- [{l.ParamCase}](tasks/{l.ParamCase}.md)");
|
||||
|
||||
@ -192,6 +151,103 @@ internal static partial class Helper20250204 {
|
||||
private static string GetIndexText(WorkItem workItem, H1ParamCaseAndState h1ParamCaseAndState, ReadOnlyCollection<H1ParamCaseAndState> collection) =>
|
||||
string.Join(Environment.NewLine, GetIndexLines(workItem, h1ParamCaseAndState, collection));
|
||||
|
||||
internal static void ExtractKanban(ILogger<Worker> logger, List<string> args) {
|
||||
string searchPattern = "*.json";
|
||||
string fullPath = Path.GetFullPath(args[0]);
|
||||
string sourceDirectory = GetSourceDirectory(fullPath);
|
||||
string rootDirectory = args.Count < 3 || args[2].Length < 16 ? "D:/5-Other-Small/Kanban-mestsa003/{}" : args[2];
|
||||
WriteTaskFile(sourceDirectory, rootDirectory);
|
||||
string sourceDirectoryName = Path.GetFileName(sourceDirectory);
|
||||
DirectoryInfo directoryInfo = new(Path.Combine(sourceDirectory, ".kanbn"));
|
||||
FileInfo? fileInfo = !directoryInfo.Exists ? null : new(Path.Combine(directoryInfo.FullName, $"{sourceDirectoryName}.json"));
|
||||
if (directoryInfo.Exists && fileInfo is not null && fileInfo.Exists) {
|
||||
ExtractKanban(searchPattern, rootDirectory, directoryInfo, fileInfo);
|
||||
} else {
|
||||
logger.LogWarning("<{directoryInfo}> doesn't exist", directoryInfo.FullName);
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetSourceDirectory(string directory) {
|
||||
string? result = null;
|
||||
DirectoryInfo directoryInfo;
|
||||
string? checkDirectory = directory;
|
||||
string? pathRoot = Path.GetPathRoot(directory);
|
||||
for (int i = 0; i < int.MaxValue; i++) {
|
||||
checkDirectory = Path.GetDirectoryName(checkDirectory);
|
||||
if (string.IsNullOrEmpty(checkDirectory) || checkDirectory == pathRoot) {
|
||||
break;
|
||||
}
|
||||
directoryInfo = new(checkDirectory);
|
||||
if (string.IsNullOrEmpty(directoryInfo.LinkTarget)) {
|
||||
continue;
|
||||
}
|
||||
result = directory.Replace(checkDirectory, directoryInfo.LinkTarget);
|
||||
break;
|
||||
}
|
||||
result ??= directory;
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void WriteTaskFile(string sourceDirectory, string rootDirectory) {
|
||||
string tasksFile = Path.Combine(sourceDirectory, ".vscode", "tasks.json");
|
||||
string oldText = File.ReadAllText(tasksFile);
|
||||
string jsonSafeDirectory = sourceDirectory.Replace('\\', '/');
|
||||
if (!oldText.Contains(jsonSafeDirectory)) {
|
||||
string text = GetTaskText(jsonSafeDirectory, rootDirectory);
|
||||
File.WriteAllText(tasksFile, text);
|
||||
}
|
||||
}
|
||||
|
||||
private static void ExtractKanban(string searchPattern, string rootDirectory, DirectoryInfo kanbanDirectory, FileInfo fileInfo) {
|
||||
string checkFile;
|
||||
string weekOfYear;
|
||||
string workItemDirectory;
|
||||
string line = Environment.NewLine;
|
||||
H1ParamCaseAndState h1ParamCaseAndState;
|
||||
Calendar calendar = new CultureInfo("en-US").Calendar;
|
||||
string tasksDirectory = Path.Combine(kanbanDirectory.FullName, "tasks");
|
||||
if (!Directory.Exists(tasksDirectory)) {
|
||||
_ = Directory.CreateDirectory(tasksDirectory);
|
||||
}
|
||||
string[] files = Directory.GetFiles(tasksDirectory, searchPattern, SearchOption.TopDirectoryOnly);
|
||||
ReadOnlyCollection<WorkItem> workItems = GetWorkItems(files);
|
||||
string markdown = GetIndexMarkdown(fileInfo, workItems);
|
||||
string indexFile = Path.Combine(kanbanDirectory.FullName, "index.md");
|
||||
string markdownOld = File.Exists(indexFile) ? File.ReadAllText(indexFile) : string.Empty;
|
||||
if (markdown != markdownOld) {
|
||||
File.WriteAllText(indexFile, markdown);
|
||||
}
|
||||
foreach (WorkItem workItem in workItems) {
|
||||
h1ParamCaseAndState = H1ParamCaseAndState.Get(workItem);
|
||||
checkFile = Path.Combine(tasksDirectory, $"{h1ParamCaseAndState.ParamCase}.md");
|
||||
markdownOld = File.Exists(checkFile) ? File.ReadAllText(checkFile) : string.Empty;
|
||||
if (markdownOld.Contains("](")) {
|
||||
continue;
|
||||
}
|
||||
weekOfYear = calendar.GetWeekOfYear(workItem.CreatedDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
|
||||
workItemDirectory = Path.GetFullPath(Path.Combine(rootDirectory, $"{workItem.CreatedDate:yyyy}", $"{workItem.CreatedDate:yyyy}_Week_{weekOfYear}", $"{workItem.Id}"));
|
||||
markdown = $"# {h1ParamCaseAndState.H1}{line}{line}## Id {workItem.Id}{line}{line}## Code Insiders{line}{line}- [code-insiders]({workItemDirectory}){line}";
|
||||
if (markdown != markdownOld) {
|
||||
File.WriteAllText(checkFile, markdown);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> GetWorkItems(string[] files) {
|
||||
List<WorkItem> results = [];
|
||||
string json;
|
||||
WorkItem? workItem;
|
||||
foreach (string file in files) {
|
||||
json = File.ReadAllText(file);
|
||||
workItem = JsonSerializer.Deserialize(json, WorkItemSourceGenerationContext.Default.WorkItem);
|
||||
if (workItem is null) {
|
||||
continue;
|
||||
}
|
||||
results.Add(workItem);
|
||||
}
|
||||
return results.AsReadOnly();
|
||||
}
|
||||
|
||||
private static string GetIndexMarkdown(FileInfo fileInfo, ReadOnlyCollection<WorkItem> workItems) {
|
||||
string result;
|
||||
H1ParamCaseAndState h1ParamCaseAndState;
|
||||
@ -210,83 +266,36 @@ internal static partial class Helper20250204 {
|
||||
return result;
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> GetWorkItems(string[] files) {
|
||||
List<WorkItem> results = [];
|
||||
string json;
|
||||
WorkItem? workItem;
|
||||
foreach (string file in files) {
|
||||
json = File.ReadAllText(file);
|
||||
workItem = JsonSerializer.Deserialize(json, WorkItemSourceGenerationContext.Default.WorkItem);
|
||||
if (workItem is null)
|
||||
continue;
|
||||
results.Add(workItem);
|
||||
}
|
||||
return results.AsReadOnly();
|
||||
}
|
||||
private record H1ParamCaseAndState(string H1, string ParamCase, string State) {
|
||||
|
||||
private static void ExtractKanban(string searchPattern, string rootDirectory, DirectoryInfo kanbanDirectory, FileInfo fileInfo) {
|
||||
string checkFile;
|
||||
string weekOfYear;
|
||||
string workItemDirectory;
|
||||
string line = Environment.NewLine;
|
||||
H1ParamCaseAndState h1ParamCaseAndState;
|
||||
Calendar calendar = new CultureInfo("en-US").Calendar;
|
||||
string tasksDirectory = Path.Combine(kanbanDirectory.FullName, "tasks");
|
||||
if (!Directory.Exists(tasksDirectory))
|
||||
_ = Directory.CreateDirectory(tasksDirectory);
|
||||
string[] files = Directory.GetFiles(tasksDirectory, searchPattern, SearchOption.TopDirectoryOnly);
|
||||
ReadOnlyCollection<WorkItem> workItems = GetWorkItems(files);
|
||||
string markdown = GetIndexMarkdown(fileInfo, workItems);
|
||||
string indexFile = Path.Combine(kanbanDirectory.FullName, "index.md");
|
||||
string markdownOld = File.Exists(indexFile) ? File.ReadAllText(indexFile) : string.Empty;
|
||||
if (markdown != markdownOld)
|
||||
File.WriteAllText(indexFile, markdown);
|
||||
foreach (WorkItem workItem in workItems) {
|
||||
h1ParamCaseAndState = H1ParamCaseAndState.Get(workItem);
|
||||
checkFile = Path.Combine(tasksDirectory, $"{h1ParamCaseAndState.ParamCase}.md");
|
||||
markdownOld = File.Exists(checkFile) ? File.ReadAllText(checkFile) : string.Empty;
|
||||
if (markdownOld.Contains("]("))
|
||||
continue;
|
||||
weekOfYear = calendar.GetWeekOfYear(workItem.CreatedDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
|
||||
workItemDirectory = Path.GetFullPath(Path.Combine(rootDirectory, $"{workItem.CreatedDate:yyyy}", $"{workItem.CreatedDate:yyyy}_Week_{weekOfYear}", $"{workItem.Id}"));
|
||||
markdown = $"# {h1ParamCaseAndState.H1}{line}{line}## Id {workItem.Id}{line}{line}## Code Insiders{line}{line}- [code-insiders]({workItemDirectory}){line}";
|
||||
if (markdown != markdownOld)
|
||||
File.WriteAllText(checkFile, markdown);
|
||||
private static string GetParamCase(string value) {
|
||||
string result;
|
||||
StringBuilder stringBuilder = new(value);
|
||||
Match[] matches = UpperCase().Matches(value).ToArray();
|
||||
for (int i = matches.Length - 1; i > -1; i--) {
|
||||
_ = stringBuilder.Insert(matches[i].Index, '-');
|
||||
}
|
||||
string[] segments = InvalidCharacter().Split(stringBuilder.ToString().ToLower());
|
||||
result = string.Join('-', segments).Trim('-');
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetSourceDirectory(string directory) {
|
||||
string? result = null;
|
||||
DirectoryInfo directoryInfo;
|
||||
string? checkDirectory = directory;
|
||||
string? pathRoot = Path.GetPathRoot(directory);
|
||||
for (int i = 0; i < int.MaxValue; i++) {
|
||||
checkDirectory = Path.GetDirectoryName(checkDirectory);
|
||||
if (string.IsNullOrEmpty(checkDirectory) || checkDirectory == pathRoot)
|
||||
break;
|
||||
directoryInfo = new(checkDirectory);
|
||||
if (string.IsNullOrEmpty(directoryInfo.LinkTarget))
|
||||
continue;
|
||||
result = directory.Replace(checkDirectory, directoryInfo.LinkTarget);
|
||||
break;
|
||||
private static string GetState(string value) =>
|
||||
value switch {
|
||||
"New" => "ToDo",
|
||||
"Active" => "In Progress",
|
||||
"Closed" => "Done",
|
||||
_ => "Backlog",
|
||||
};
|
||||
|
||||
internal static H1ParamCaseAndState Get(WorkItem workItem) {
|
||||
H1ParamCaseAndState result;
|
||||
string paramCase = GetParamCase(workItem.Title);
|
||||
string state = GetState(workItem.State);
|
||||
result = new(workItem.Title, paramCase, state);
|
||||
return result;
|
||||
}
|
||||
result ??= directory;
|
||||
return result;
|
||||
}
|
||||
|
||||
internal static void ExtractKanban(ILogger<Worker> logger, List<string> args) {
|
||||
string searchPattern = "*.json";
|
||||
string fullPath = Path.GetFullPath(args[0]);
|
||||
string sourceDirectory = GetSourceDirectory(fullPath);
|
||||
string rootDirectory = args.Count < 3 || args[2].Length < 16 ? "D:/5-Other-Small/Kanban-mestsa003/{}" : args[2];
|
||||
WriteTaskFile(sourceDirectory, rootDirectory);
|
||||
string sourceDirectoryName = Path.GetFileName(sourceDirectory);
|
||||
DirectoryInfo directoryInfo = new(Path.Combine(sourceDirectory, ".kanbn"));
|
||||
FileInfo? fileInfo = !directoryInfo.Exists ? null : new(Path.Combine(directoryInfo.FullName, $"{sourceDirectoryName}.json"));
|
||||
if (directoryInfo.Exists && fileInfo is not null && fileInfo.Exists)
|
||||
ExtractKanban(searchPattern, rootDirectory, directoryInfo, fileInfo);
|
||||
else
|
||||
logger.LogWarning("<{directoryInfo}> doesn't exist", directoryInfo.FullName);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user