normalizeFileEditInput function
Implementation
NormalizedEditInput normalizeFileEditInput(
String filePath,
List<FileEdit> edits,
) {
if (edits.isEmpty) {
return NormalizedEditInput(filePath: filePath, edits: edits);
}
// Markdown uses two trailing spaces as a hard line break
final isMarkdown = RegExp(
r'\.(md|mdx)$',
caseSensitive: false,
).hasMatch(filePath);
try {
final file = File(filePath);
if (!file.existsSync()) {
return NormalizedEditInput(filePath: filePath, edits: edits);
}
final fileContent = file.readAsStringSync();
final normalizedEdits = edits.map((edit) {
final normalizedNewString = isMarkdown
? edit.newString
: stripTrailingWhitespace(edit.newString);
// If exact string match works, keep it as is
if (fileContent.contains(edit.oldString)) {
return FileEdit(
oldString: edit.oldString,
newString: normalizedNewString,
replaceAll: edit.replaceAll,
);
}
// Try de-sanitize string if exact match fails
final desanitized = desanitizeMatchString(edit.oldString);
if (fileContent.contains(desanitized.result)) {
var desanitizedNewString = normalizedNewString;
for (final replacement in desanitized.appliedReplacements) {
desanitizedNewString = desanitizedNewString.replaceAll(
replacement.key,
replacement.value,
);
}
return FileEdit(
oldString: desanitized.result,
newString: desanitizedNewString,
replaceAll: edit.replaceAll,
);
}
return FileEdit(
oldString: edit.oldString,
newString: normalizedNewString,
replaceAll: edit.replaceAll,
);
}).toList();
return NormalizedEditInput(filePath: filePath, edits: normalizedEdits);
} catch (_) {
return NormalizedEditInput(filePath: filePath, edits: edits);
}
}