fix: super lax compare

Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
This commit is contained in:
Rachel Powers 2023-05-04 13:30:39 -07:00
parent 5ec4cbf1cb
commit e0635955df

View File

@ -195,7 +195,7 @@ void BlockedModsDialog::watchPath(QString path, bool watch_recursive)
auto to_watch = QFileInfo(path); auto to_watch = QFileInfo(path);
auto to_watch_path = to_watch.canonicalFilePath(); auto to_watch_path = to_watch.canonicalFilePath();
if (m_watcher.directories().contains(to_watch_path)) if (m_watcher.directories().contains(to_watch_path))
return; // don't watch the same path twice (no loops!) return; // don't watch the same path twice (no loops!)
qDebug() << "[Blocked Mods Dialog] Adding Watch Path:" << path; qDebug() << "[Blocked Mods Dialog] Adding Watch Path:" << path;
m_watcher.addPath(to_watch_path); m_watcher.addPath(to_watch_path);
@ -203,10 +203,9 @@ void BlockedModsDialog::watchPath(QString path, bool watch_recursive)
if (!to_watch.isDir() || !watch_recursive) if (!to_watch.isDir() || !watch_recursive)
return; return;
QDirIterator it(to_watch_path, QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot, QDirIterator::NoIteratorFlags); QDirIterator it(to_watch_path, QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot, QDirIterator::NoIteratorFlags);
while (it.hasNext()) { while (it.hasNext()) {
QString watch_dir = QDir(it.next()).canonicalPath(); // resolve symlinks and relative paths QString watch_dir = QDir(it.next()).canonicalPath(); // resolve symlinks and relative paths
watchPath(watch_dir, watch_recursive); watchPath(watch_dir, watch_recursive);
} }
} }
@ -302,14 +301,35 @@ bool BlockedModsDialog::checkValidPath(QString path)
{ {
const QFileInfo file = QFileInfo(path); const QFileInfo file = QFileInfo(path);
const QString filename = file.fileName(); const QString filename = file.fileName();
QString laxFilename(filename);
laxFilename.replace('+', ' ');
QString laxFilename2(filename); auto compare = [](QString fsFilename, QString metadataFilename) {
laxFilename.replace(' ', '+'); return metadataFilename.compare(fsFilename, Qt::CaseInsensitive) == 0;
};
auto compare = [](QString fsfilename, QString metadataFilename) { // super lax compare (but not fuzzy)
return metadataFilename.compare(fsfilename, Qt::CaseInsensitive) == 0; // convert to lowercase
// convert all speratores to whitespace
// simplify sequence of internal whitespace to a single space
// efectivly compare two strings ignoring all separators and case
auto laxCompare = [](QString fsfilename, QString metadataFilename) {
// allowed character seperators
QList<QChar> allowedSeperators = { '-', '+', '.' , '_'};
// copy in lowercase
auto fsName = fsfilename.toLower();
auto metaName = metadataFilename.toLower();
// replace all potential allowed seperatores with whitespace
for (auto sep : allowedSeperators) {
fsName = fsName.replace(sep, ' ');
metaName = metaName.replace(sep, ' ');
}
// remove extraneous whitespace
fsName = fsName.simplified();
metaName = metaName.simplified();
return fsName.compare(metaName) == 0;
}; };
for (auto& mod : m_mods) { for (auto& mod : m_mods) {
@ -317,7 +337,7 @@ bool BlockedModsDialog::checkValidPath(QString path)
qDebug() << "[Blocked Mods Dialog] Name match found:" << mod.name << "| From path:" << path; qDebug() << "[Blocked Mods Dialog] Name match found:" << mod.name << "| From path:" << path;
return true; return true;
} }
if (compare(laxFilename, mod.name) || compare(laxFilename2, mod.name)) { if (laxCompare(filename, mod.name)) {
qDebug() << "[Blocked Mods Dialog] Lax name match found:" << mod.name << "| From path:" << path; qDebug() << "[Blocked Mods Dialog] Lax name match found:" << mod.name << "| From path:" << path;
return true; return true;
} }