in src/authoring/Elastic.Documentation.Refactor/Move.cs [46:102]
private async Task SetupChanges(ChangeSet changeSet, Cancel ctx)
{
var sourcePath = changeSet.From.FullName;
var targetPath = changeSet.To.FullName;
var sourceContent = await readFileSystem.File.ReadAllTextAsync(sourcePath, ctx);
var markdownLinkRegex = MarkdownLinkRegex();
var change = Regex.Replace(sourceContent, markdownLinkRegex.ToString(), match =>
{
var originalPath = match.Value.Substring(match.Value.IndexOf('(') + 1, match.Value.LastIndexOf(')') - match.Value.IndexOf('(') - 1);
var newPath = originalPath;
var isAbsoluteStylePath = originalPath.StartsWith('/');
if (!isAbsoluteStylePath)
{
var targetDirectory = Path.GetDirectoryName(targetPath)!;
var sourceDirectory = Path.GetDirectoryName(sourcePath)!;
var fullPath = Path.GetFullPath(Path.Combine(sourceDirectory, originalPath));
var relativePath = Path.GetRelativePath(targetDirectory, fullPath);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
relativePath = relativePath.Replace('\\', '/');
newPath = originalPath.StartsWith("./", OrdinalIgnoreCase) && !relativePath.StartsWith("./", OrdinalIgnoreCase)
? "./" + relativePath
: relativePath;
}
var newLink = $"[{match.Groups[1].Value}]({newPath})";
var lineNumber = sourceContent[..match.Index].Count(c => c == '\n') + 1;
var columnNumber = match.Index - sourceContent.LastIndexOf('\n', match.Index);
if (!_linkModifications.ContainsKey(changeSet))
_linkModifications[changeSet] = [];
_linkModifications[changeSet].Add(new LinkModification(
match.Value,
newLink,
sourcePath,
lineNumber,
columnNumber
));
return newLink;
});
_changes[changeSet] = [new Change(changeSet.From, sourceContent, change)];
foreach (var (_, markdownFile) in documentationSet.MarkdownFiles)
{
await ProcessMarkdownFile(
changeSet,
markdownFile,
ctx
);
}
}