Relative Path to relative to content

This commit is contained in:
2023-07-18 21:46:56 -07:00
parent ec3afd2f96
commit 40b12d17f9
17 changed files with 716 additions and 172 deletions

View File

@ -1,12 +1,15 @@
using Humanizer;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
namespace File_Folder_Helper.Helpers;
internal static class HelperCreateNoteFiles
internal static partial class HelperCreateNoteFiles
{
[GeneratedRegex("[^a-z0-9-]")]
private static partial Regex AlphaNumOnly();
private static void CleanExistingFiles(string directory, long ticks)
{
string check;
@ -97,31 +100,102 @@ internal static class HelperCreateNoteFiles
}
}
private static string? GetTags(string tagsText)
{
string? result;
StringBuilder stringBuilder = new();
if (string.IsNullOrEmpty(tagsText))
result = null;
else
{
string[] segments;
_ = stringBuilder.AppendLine("tags:");
string[] tags = tagsText.Split(';', StringSplitOptions.RemoveEmptyEntries);
foreach (string tag in tags)
{
segments = tag.Split(':');
_ = stringBuilder.AppendLine($"- '{segments.First()}'");
}
result = stringBuilder.ToString().Trim();
}
return result;
}
private static string? GetLinks(string type, string linksText)
{
string? result;
StringBuilder stringBuilder = new();
if (!string.IsNullOrEmpty(linksText))
result = null;
else
{
string linkLower;
string[] segments;
string[] links = linksText.Split(';', StringSplitOptions.RemoveEmptyEntries);
foreach (string link in links)
{
segments = link.Split(':');
linkLower = AlphaNumOnly().Replace(segments.First().Trim().ToLower(), "-").Replace("--", "-");
if (segments.Length == 1)
_ = stringBuilder.AppendLine($"- [[{type}/{linkLower}]]");
else if (segments.Length == 2)
_ = stringBuilder.AppendLine($"- [{type}/{linkLower}]({segments.Last()})");
else
continue;
}
result = stringBuilder.ToString().Trim();
}
return result;
}
private static string? GetAttributes(string[] columns, string[]? headerColumns, int expectedCount)
{
string? result;
if (headerColumns is null || columns.Length <= expectedCount)
result = null;
else
{
StringBuilder stringBuilder = new();
for (int j = expectedCount; j < columns.Length; j++)
{
if (headerColumns.Length <= j)
continue;
_ = stringBuilder.AppendLine($"{headerColumns[j].Trim()}: '{columns[j].Trim()}'");
}
result = stringBuilder.ToString().Trim();
}
return result;
}
private static void CreateImportFiles(long ticks, List<string> importFiles)
{
bool csv;
bool tsv;
string file;
string text;
string type;
string title;
string? tags;
string? links;
string[] lines;
string[] links;
int bodyKey = 4;
int bodyKey = 5;
int tagsKey = 3;
int typeKey = 0;
string linkText;
int linksKey = 3;
string fileName;
string tagsText;
int linksKey = 4;
int titleKey = 1;
string linksText;
string[] columns;
string? directory;
string[] segments;
string? attributes;
int descriptionKey = 2;
string[]? headerColumns;
string destinationDirectory;
List<string> allLines = new();
DateTime dateTime = new(ticks);
StringBuilder attributes = new();
StringBuilder keyValuePairLinks = new();
string csvHeader = "type,title,description,links,body";
string tsvHeader = "type\ttitle\tdescription\tlinks\tbody";
string csvHeader = "type,title,description,tags,links,body";
string tsvHeader = "type\ttitle\tdescription\ttags\tlinks\tbody";
int expectedCount = csvHeader.Length - csvHeader.Replace(",", string.Empty).Length + 1;
foreach (string importFile in importFiles)
{
@ -158,58 +232,42 @@ internal static class HelperCreateNoteFiles
continue;
if (columns.Length < expectedCount)
continue;
_ = attributes.Clear();
_ = keyValuePairLinks.Clear();
title = columns[titleKey].Trim();
linkText = columns[linksKey].Trim();
type = columns[typeKey].Trim().ToLower().Replace(' ', '-');
if (string.IsNullOrEmpty(linkText))
links = Array.Empty<string>();
else
links = linkText.Split(';', StringSplitOptions.RemoveEmptyEntries);
if (headerColumns is not null && columns.Length > expectedCount)
{
for (int j = expectedCount; j < columns.Length; j++)
{
if (headerColumns.Length <= j)
continue;
_ = attributes.AppendLine($"{headerColumns[j].Trim().Camelize()}: '{columns[j].Trim()}'");
}
}
foreach (string link in links)
{
segments = link.Split(':');
if (segments.Length == 1)
_ = keyValuePairLinks.AppendLine($"- [[{segments.First()}]]");
else if (segments.Length == 2)
_ = keyValuePairLinks.AppendLine($"- [{segments.First()}]({segments.Last()})");
else
continue;
}
tagsText = columns[tagsKey].Trim();
linksText = columns[linksKey].Trim();
fileName = AlphaNumOnly().Replace(title.ToLower(), "-").Replace("--", "-");
type = AlphaNumOnly().Replace(columns[typeKey].Trim().ToLower(), "-").Replace("--", "-");
tags = GetTags(tagsText);
links = GetLinks(type, linksText);
attributes = GetAttributes(columns, headerColumns, expectedCount);
destinationDirectory = Path.Combine(directory, type);
if (!Directory.Exists(destinationDirectory))
_ = Directory.CreateDirectory(destinationDirectory);
file = Path.Combine(destinationDirectory, $"{title.ToLower().Replace(' ', '-')}.md");
File.WriteAllLines(file, new string[]
{
"---",
$"type: '{type}'",
$"title: '{title}'",
$"description: '{columns[descriptionKey].Trim()}'",
$"created: {dateTime:yyyy-MM-ddTHH:mm:ss.fffZ}",
$"updated: {dateTime:yyyy-MM-ddTHH:mm:ss.fffZ}",
attributes.ToString(),
"---",
string.Empty,
$"# {title}",
string.Empty,
keyValuePairLinks.ToString(),
string.Empty,
$"## Comment {dateTime:yyyy-MM-dd}",
string.Empty,
columns[bodyKey].Trim(),
string.Empty,
});
file = Path.Combine(destinationDirectory, $"{fileName}.md");
allLines.Clear();
allLines.Add("---");
allLines.Add($"type: '{type}'");
allLines.Add($"title: '{title}'");
allLines.Add($"description: '{columns[descriptionKey].Trim()}'");
allLines.Add($"created: {dateTime:yyyy-MM-ddTHH:mm:ss.fffZ}");
allLines.Add($"updated: {dateTime:yyyy-MM-ddTHH:mm:ss.fffZ}");
if (!string.IsNullOrEmpty(tags))
allLines.Add(tags);
if (!string.IsNullOrEmpty(attributes))
allLines.Add(attributes);
allLines.Add("---");
allLines.Add(string.Empty);
allLines.Add($"# {title}");
allLines.Add(string.Empty);
if (!string.IsNullOrEmpty(links))
allLines.Add(links);
allLines.Add(string.Empty);
allLines.Add($"## Comment {dateTime:yyyy-MM-dd}");
allLines.Add(string.Empty);
allLines.Add(columns[bodyKey].Trim());
allLines.Add(string.Empty);
text = string.Join(Environment.NewLine, allLines);
File.WriteAllText(file, text);
}
}
}

View File

@ -1,4 +1,5 @@
using Humanizer;
using File_Folder_Helper.Models;
using Microsoft.Extensions.Logging;
using System.Text;
using System.Text.Json;
@ -7,8 +8,12 @@ namespace File_Folder_Helper.Helpers;
internal static partial class HelperMarkdown
{
private record Record(string Source,
string? StartAt,
string? Destination);
/// <summary>
/// Determines a text file's encoding by analyzing its byte order mark (BOM).
/// Determines files text file's encoding by analyzing its byte order mark (BOM).
/// Defaults to ASCII when detection of the text file's endianness fails.
/// </summary>
/// <param name="filename">The text file to analyze.</param>
@ -38,14 +43,20 @@ internal static partial class HelperMarkdown
return result;
}
internal static string[] GetFiles(Models.AppSettings appSettings, string directory)
internal static string[] GetFiles(AppSettings appSettings, string directory)
{
string[] files = Directory.GetFiles(directory, "*.md", SearchOption.AllDirectories).
string[] results = Directory.GetFiles(directory, "*.md", SearchOption.AllDirectories).
Where(l => !appSettings.Exclude.Any(m => l.Contains(m))).ToArray();
return files;
return results;
}
private static (string type, string h1) GetTypeAndH1(Models.AppSettings appSettings, string h1, List<string> lines, LineNumber lineNumber)
private static string[] GetFiles(AppSettings appSettings, Record record)
{
string[] results = record.StartAt is null ? GetFiles(appSettings, record.Source) : GetFiles(appSettings, record.StartAt);
return results;
}
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 h1FromFile = lineNumber.H1 is null ? h1 : lines[lineNumber.H1.Value][2..];
@ -108,7 +119,7 @@ internal static partial class HelperMarkdown
return (lines.ToList(), lineNumber);
}
internal static List<(MarkdownFile, string[])> GetCollection(Models.AppSettings appSettings, string[] files)
internal static List<(MarkdownFile, string[])> GetCollection(AppSettings appSettings, string[] files)
{
List<(MarkdownFile, string[])> results = new();
string h1;
@ -125,7 +136,7 @@ internal static partial class HelperMarkdown
continue;
(lines, lineNumber) = GetStatusAndMetaEndLineNumbers(fileInfo);
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName);
h1 = fileNameWithoutExtension.ToLower().Hyphenate();
h1 = fileNameWithoutExtension.ToLower().Replace("%20", "-").Replace(' ', '-');
if (lines.Any())
(type, h1) = GetTypeAndH1(appSettings, h1, lines, lineNumber);
else
@ -140,9 +151,9 @@ internal static partial class HelperMarkdown
return results;
}
internal static bool SetFrontMatterAndH1(Models.AppSettings appSettings, List<(MarkdownFile, string[])> collection)
private static int SetFrontMatterAndH1(AppSettings appSettings, List<(MarkdownFile, string[])> collection)
{
bool result = false;
int result = 0;
string h1Line;
string typeLine;
string createdLine;
@ -203,17 +214,16 @@ internal static partial class HelperMarkdown
else if (results[markdownFile.LineNumber.Created.Value][..createdLineCompare.Length] != createdLineCompare)
results[markdownFile.LineNumber.Created.Value] = createdLine;
}
if (!result)
result = true;
File.WriteAllLines(markdownFile.File, results);
File.SetLastWriteTime(markdownFile.File, markdownFile.LastWriteDateTime);
result += 1;
}
return result;
}
internal static bool CircularReference(List<(MarkdownFile, string[])> collection)
private static int CircularReference(ILogger<Worker> logger, List<(MarkdownFile, string[])> collection)
{
bool result = false;
int result = 0;
string line;
string check;
bool circularReference;
@ -255,22 +265,22 @@ internal static partial class HelperMarkdown
if (lines[i] == line)
continue;
lines[i] = line;
logger.LogInformation("circular reference for <{file}>", markdownFile.FileName);
if (!circularReference)
circularReference = true;
}
if (circularReference)
{
if (!result)
result = true;
File.WriteAllLines(markdownFile.File, lines);
result += 1;
}
}
return result;
}
internal static bool FindReplace(List<(MarkdownFile, string[])> collection)
private static int FindReplace(List<(MarkdownFile, string[])> collection)
{
bool result = false;
int result = 0;
bool found;
string line;
string check;
@ -305,9 +315,8 @@ internal static partial class HelperMarkdown
}
if (found)
{
if (!result)
result = true;
File.WriteAllLines(markdownFile.File, lines);
result += 1;
}
}
return result;
@ -330,31 +339,65 @@ internal static partial class HelperMarkdown
return results;
}
private static Dictionary<string, List<MarkdownFile>> GetKeyValuePairs(AppSettings appSettings, Record record)
{
Dictionary<string, List<MarkdownFile>> results;
string[] files = GetFiles(appSettings, record.Source);
List<(MarkdownFile MarkdownFile, string[] Lines)> collection = GetCollection(appSettings, files);
results = GetKeyValuePairs(collection);
return results;
}
private static (string?, string?) GetMatchAndTitle(string? directory, List<MarkdownFile> markdownFiles)
{
int check = 0;
string? match = null;
string? title = null;
string? directoryName = Path.GetFileName(directory);
foreach (MarkdownFile markdownFile in markdownFiles)
{
if (directory is null || directoryName is null)
continue;
if (markdownFiles.Count == 1)
{
check++;
match = markdownFile.File;
title = markdownFile.H1;
}
else
{
if (Path.GetFileName(markdownFile.Directory) == directoryName)
{
check++;
match = markdownFile.File;
title = markdownFile.H1;
}
}
}
if (check != 1)
{
match = null;
title = null;
}
return (match, title);
}
private static (string?, string?) GetRelativePath(Dictionary<string, List<MarkdownFile>> keyValuePairs, MarkdownFile markdownFile, string file)
{
string? result;
string? match;
string? title;
List<MarkdownFile>? markdownFiles;
string? directory = Path.GetDirectoryName(file);
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
if (keyValuePairs.TryGetValue(fileNameWithoutExtension, out markdownFiles))
{
if (markdownFiles.Count != 1)
(match, title) = (null, null);
else
(match, title) = (markdownFiles.First().File, markdownFiles.First().H1);
}
(match, title) = GetMatchAndTitle(directory, markdownFiles);
else
{
if (!keyValuePairs.TryGetValue(fileNameWithoutExtension.ToLower(), out markdownFiles))
(match, title) = (null, null);
if (keyValuePairs.TryGetValue(fileNameWithoutExtension.ToLower(), out markdownFiles))
(match, title) = GetMatchAndTitle(directory, markdownFiles);
else
{
if (markdownFiles.Count != 1)
(match, title) = (null, null);
else
(match, title) = (markdownFiles.First().File, markdownFiles.First().H1);
}
(match, title) = (null, null);
}
if (match is null)
{
@ -411,19 +454,17 @@ internal static partial class HelperMarkdown
return (result, title);
}
internal static bool ConvertToRelativePath(List<(MarkdownFile MarkdownFile, string[] Lines)> collection)
private static int ConvertToRelativePath(AppSettings appSettings, ILogger<Worker> logger, Record record, List<(MarkdownFile MarkdownFile, string[] Lines)> collection)
{
bool result = false;
int result = 0;
bool write;
string line;
string after;
string before;
string? title;
string[] segmentsA;
string[] segmentsB;
string[] segmentsC;
string? relativePath;
Dictionary<string, List<MarkdownFile>> keyValuePairs = GetKeyValuePairs(collection);
Dictionary<string, List<MarkdownFile>> keyValuePairs = record.StartAt is null ? GetKeyValuePairs(collection) : GetKeyValuePairs(appSettings, record);
foreach ((MarkdownFile markdownFile, string[] lines) in collection)
{
if (lines.Length < 1)
@ -437,19 +478,20 @@ internal static partial class HelperMarkdown
segmentsB = segmentsA.First().Split("[[");
if (segmentsB.Length is not 2 or 3)
continue;
after = segmentsA.Last();
before = segmentsB.First();
segmentsC = segmentsB.Last().Split('|');
(relativePath, title) = GetRelativePath(keyValuePairs, markdownFile, segmentsC.First());
if (relativePath is null)
{
logger.LogInformation("Didn't find {line} in <{file}>", lines[i], markdownFile.FileNameWithoutExtension);
continue;
}
if (title is null)
{
title = segmentsC.Last().Humanize(LetterCasing.Title);
title = segmentsC.Last();
if (title.Length != segmentsC.Last().Length)
title = segmentsC.Last();
}
line = $"{before}[{title}]({relativePath.Replace('\\', '/')}){after}";
line = $"{segmentsB.First()}[{title}]({relativePath.Replace('\\', '/')}){segmentsA.Last()}";
if (lines[i] == line)
continue;
lines[i] = line;
@ -458,19 +500,18 @@ internal static partial class HelperMarkdown
}
if (write)
{
if (!result)
result = true;
File.WriteAllLines(markdownFile.File, lines);
result += 1;
}
}
return result;
}
internal static bool ConvertFileToSlugName(List<(MarkdownFile MarkdownFile, string[] Lines)> collection)
private static int ConvertFileToSlugName(AppSettings appSettings, ILogger<Worker> logger, Record record, List<(MarkdownFile MarkdownFile, string[] Lines)> collection)
{
bool result = false;
bool write;
int result = 0;
string h1;
bool write;
string file;
string line;
string? title;
@ -483,10 +524,9 @@ internal static partial class HelperMarkdown
string[] segmentsC;
string checkFileName;
string segmentsALast;
string? relativePath;
string segmentsBFirst;
string relativeDirectory;
string formattedRelativeDirectory;
Dictionary<string, List<MarkdownFile>> keyValuePairs = GetKeyValuePairs(collection);
Dictionary<string, List<MarkdownFile>> keyValuePairs = record.StartAt is null ? GetKeyValuePairs(collection) : GetKeyValuePairs(appSettings, record);
foreach ((MarkdownFile markdownFile, string[] lines) in collection)
{
if (markdownFile.FileNameWithoutExtension == "index")
@ -511,25 +551,31 @@ internal static partial class HelperMarkdown
directory = Path.GetDirectoryName(file);
if (string.IsNullOrEmpty(directory))
continue;
relativeDirectory = segmentsBFirst[..^fileName.Length];
formattedRelativeDirectory = relativeDirectory.Replace(" ", "%20");
checkFileName = fileName.ToLower().Replace("%20", "-").Replace(' ', '-');
checkName = Path.Combine(directory, checkFileName);
segmentsC = segmentsA.First().Split('[');
(_, title) = GetRelativePath(keyValuePairs, markdownFile, file);
(relativePath, title) = GetRelativePath(keyValuePairs, markdownFile, file);
if (relativePath is null)
{
logger.LogInformation("Didn't find {line} in <{file}>", lines[i], markdownFile.FileNameWithoutExtension);
continue;
}
if (title is null)
{
title = segmentsC.Last().Humanize(LetterCasing.Title);
title = segmentsC.Last();
if (title.Length != segmentsC.Last().Length)
title = segmentsC.Last();
}
line = $"{segmentsC.First()}[{title}]({Path.Combine(formattedRelativeDirectory, checkFileName)}){segmentsB.Last()}";
line = $"{segmentsC.First()}[{title}]({relativePath.Replace('\\', '/')}){segmentsB.Last()}";
if (lines[i] == line)
continue;
if (fileName.Contains(' ') || fileName.Contains("%20"))
{
if (!File.Exists(file))
{
logger.LogInformation("Didn't find <{file}>", file);
continue;
}
if (File.Exists(checkName))
continue;
File.Move(file, checkName);
@ -539,7 +585,10 @@ internal static partial class HelperMarkdown
if (file != checkName)
{
if (!File.Exists(file))
{
logger.LogInformation("Didn't find <{file}>", file);
continue;
}
File.Move(file, checkName);
}
}
@ -549,12 +598,11 @@ internal static partial class HelperMarkdown
}
if (write)
{
if (!result)
result = true;
File.WriteAllLines(markdownFile.File, lines);
result += 1;
}
}
if (!result)
if (result == 0)
{
foreach ((MarkdownFile markdownFile, string[] lines) in collection)
{
@ -563,13 +611,12 @@ internal static partial class HelperMarkdown
h1 = lines[markdownFile.LineNumber.H1.Value];
if (h1.Length > 2)
{
h1Check = $"# {h1[2..].Humanize(LetterCasing.Title)}";
h1Check = $"# {h1[2..]}";
if (h1Check.Length == h1.Length && h1Check != h1)
{
lines[markdownFile.LineNumber.H1.Value] = h1Check;
if (!result)
result = true;
File.WriteAllLines(markdownFile.File, lines);
result += 1;
}
}
}
@ -581,29 +628,79 @@ internal static partial class HelperMarkdown
checkName = Path.Combine(markdownFile.Directory, checkFileName);
if (checkName == markdownFile.File)
continue;
if (!result)
result = true;
File.Move(markdownFile.File, checkName);
result += 1;
}
}
return result;
}
internal static void MarkdownWikiLinkVerification(Models.AppSettings appSettings, string argsZero)
private static Record GetRecord(List<string> args)
{
string fullPath = Path.GetFullPath(argsZero);
Record result;
string? startAt = null;
string? destination = null;
for (int i = 1; i < args.Count; i++)
{
if (args[i].Length == 2 && i + 1 < args.Count)
{
if (args[i][1] == 's')
startAt = Path.GetFullPath(args[i + 1]);
else if (args[i][1] == 'd')
destination = Path.GetFullPath(args[i + 1]);
i++;
}
}
if (startAt is not null && !Directory.Exists(startAt))
throw new Exception($"Start at directory <{startAt}> doesn't exist!");
if (destination is not null)
{
string? root = Path.GetPathRoot(destination);
if (root is null || !Directory.Exists(root))
throw new NotSupportedException($"This method requires a valid -d path <{root}>!");
if (!Directory.Exists(destination))
_ = Directory.CreateDirectory(destination);
}
result = new(Path.GetFullPath(args.First()), startAt, destination);
return result;
}
internal static void MarkdownWikiLinkVerification(AppSettings appSettings, ILogger<Worker> logger, List<string> args)
{
int updated;
Record record = GetRecord(args);
List<(MarkdownFile MarkdownFile, string[] Lines)> collection;
collection = GetCollection(appSettings, GetFiles(appSettings, fullPath));
if (SetFrontMatterAndH1(appSettings, collection))
collection = GetCollection(appSettings, GetFiles(appSettings, fullPath));
if (CircularReference(collection))
collection = GetCollection(appSettings, GetFiles(appSettings, fullPath));
if (FindReplace(collection))
collection = GetCollection(appSettings, GetFiles(appSettings, fullPath));
if (ConvertToRelativePath(collection))
collection = GetCollection(appSettings, GetFiles(appSettings, fullPath));
if (ConvertFileToSlugName(collection))
collection = GetCollection(appSettings, GetFiles(appSettings, fullPath));
collection = GetCollection(appSettings, GetFiles(appSettings, record));
updated = SetFrontMatterAndH1(appSettings, collection);
if (updated != 0)
{
collection = GetCollection(appSettings, GetFiles(appSettings, record));
logger.LogInformation("{updated} Markdown file(s) were updated", updated);
}
updated = CircularReference(logger, collection);
if (updated != 0)
{
collection = GetCollection(appSettings, GetFiles(appSettings, record));
logger.LogInformation("{updated} Markdown file(s) were updated", updated);
}
updated = FindReplace(collection);
if (updated != 0)
{
collection = GetCollection(appSettings, GetFiles(appSettings, record));
logger.LogInformation("{updated} Markdown file(s) were updated", updated);
}
updated = ConvertToRelativePath(appSettings, logger, record, collection);
if (updated != 0)
{
collection = GetCollection(appSettings, GetFiles(appSettings, record));
logger.LogInformation("{updated} Markdown file(s) were updated", updated);
}
updated = ConvertFileToSlugName(appSettings, logger, record, collection);
if (updated != 0)
{
collection = GetCollection(appSettings, GetFiles(appSettings, record));
logger.LogInformation("{updated} Markdown file(s) were updated", updated);
}
string directory = Path.Combine(Environment.CurrentDirectory, ".vscode");
if (!Directory.Exists(directory))
{
@ -618,4 +715,91 @@ internal static partial class HelperMarkdown
}
}
private static List<(string, string, string[])> GetWithLinksForHugo(AppSettings appSettings, Record record)
{
List<(string, string, string[])> results = new();
string file;
string line;
string fileName;
string? directory;
string[] segmentsA;
string[] segmentsB;
string[] segmentsC;
string relativeFile;
string segmentsALast;
string segmentsBFirst;
int sourceDirectoryLength = record.Source.Length;
List<(MarkdownFile MarkdownFile, string[] Lines)> collection = GetCollection(appSettings, GetFiles(appSettings, record));
foreach ((MarkdownFile markdownFile, string[] lines) in collection)
{
if (record.Destination is null)
continue;
if (markdownFile.File.Length < sourceDirectoryLength)
continue;
if (!File.Exists(markdownFile.File))
continue;
fileName = $"{record.Destination}{markdownFile.File[sourceDirectoryLength..]}";
directory = Path.GetDirectoryName(fileName);
if (string.IsNullOrEmpty(directory))
continue;
for (int i = 0; i < lines.Length; i++)
{
segmentsA = lines[i].Split("](");
if (segmentsA.Length != 2)
continue;
segmentsALast = segmentsA.Last();
if (segmentsALast.StartsWith("http:") || segmentsALast.StartsWith("https:") || segmentsALast.StartsWith("rdp:") || segmentsALast.StartsWith("onenote:"))
continue;
segmentsB = segmentsALast.Split(")");
if (segmentsB.Length != 2)
continue;
segmentsBFirst = segmentsB.First();
segmentsC = segmentsA.First().Split('[');
file = Path.GetFullPath(Path.Combine(markdownFile.Directory, segmentsBFirst));
relativeFile = Path.GetRelativePath(record.Source, file).Replace('\\', '/');
line = $"{segmentsC.First()}[[{relativeFile}]]{segmentsB.Last()}";
if (lines[i] == line)
throw new NotSupportedException($"Line {i} shouldn't match with {line}");
lines[i] = line;
}
results.Add((directory, fileName, lines));
}
return results;
}
private static List<string> GetDistinct(List<(string, string, string[])> collection)
{
List<string> results = new();
foreach ((string directory, _, _) in collection)
{
if (results.Contains(directory))
continue;
results.Add(directory);
}
return results;
}
private static void CreateMissingDirectories(List<string> directories)
{
foreach (string directory in directories)
{
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
}
}
internal static void MarkdownConvertLinksForHugo(AppSettings appSettings, ILogger<Worker> logger, List<string> args)
{
Record record = GetRecord(args);
if (string.IsNullOrEmpty(record.Destination))
throw new NotSupportedException("This method requires a -d path!");
List<(string, string, string[])> collection = GetWithLinksForHugo(appSettings, record);
if (!collection.Any())
logger.LogInformation("No files?");
List<string> distinct = GetDistinct(collection);
CreateMissingDirectories(distinct);
foreach ((_, string file, string[] lines) in collection)
File.WriteAllLines(file, lines);
}
}

View File

@ -17,4 +17,4 @@ internal partial class PackageJsonSourceGenerationContext : JsonSerializerContex
[JsonSerializable(typeof(PackageJson[]))]
internal partial class PackageJsonCollectionSourceGenerationContext : JsonSerializerContext
{
}
}