Fix up case insensitive modders

This commit is contained in:
2025-03-15 22:46:48 +01:00
parent 2fa32d3713
commit b80959e58e

View File

@@ -6,6 +6,19 @@ const modsRoot = '$root/294100';
const configRoot = '$root/AppData/RimWorld by Ludeon Studios/Config';
const configPath = '$configRoot/ModsConfig.xml';
XmlElement findCaseInsensitive(XmlElement element, String name) {
return element.childElements.firstWhere(
(e) => e.name.local.toLowerCase() == name,
);
}
XmlElement findCaseInsensitiveDoc(XmlDocument document, String name) {
name = name.toLowerCase();
return document.childElements.firstWhere(
(e) => e.name.local.toLowerCase() == name,
);
}
class Mod {
final String name; // ModMetaData.name
final String id; // ModMetaData.packageId
@@ -35,18 +48,59 @@ class Mod {
static Mod fromDirectory(String path) {
final aboutFile = File('$path/About/About.xml');
if (!aboutFile.existsSync()) {
throw Exception('About.xml file does not exist in $aboutFile');
}
final aboutXml = XmlDocument.parse(aboutFile.readAsStringSync());
final metadata = aboutXml.findElements('ModMetaData').first;
final name = metadata.findElements('name').first.innerText;
final id = metadata.findElements('packageId').first.innerText.toLowerCase();
final versions =
metadata
.findElements('supportedVersions')
.first
.findElements('li')
.map((e) => e.innerText)
.toList();
final description = metadata.findElements('description').first.innerText;
late final XmlElement metadata;
try {
metadata = findCaseInsensitiveDoc(aboutXml, 'ModMetaData');
} catch (e) {
throw Exception(
'Error: ModMetaData element is missing in About.xml ($aboutFile). Original error: $e',
);
}
late final String name;
try {
name = metadata.findElements('name').first.innerText;
} catch (e) {
throw Exception(
'Error: name element is missing in ModMetaData ($aboutFile). Original error: $e',
);
}
late final String id;
try {
id = metadata.findElements('packageId').first.innerText.toLowerCase();
} catch (e) {
throw Exception(
'Error: packageId element is missing in ModMetaData ($aboutFile). Original error: $e',
);
}
late final List<String> versions;
try {
versions =
metadata
.findElements('supportedVersions')
.first
.findElements('li')
.map((e) => e.innerText)
.toList();
} catch (e) {
throw Exception(
'Error: supportedVersions or li elements are missing in ModMetaData ($aboutFile). Original error: $e',
);
}
String description = '';
try {
description = metadata.findElements('description').first.innerText;
} catch (e) {
print('$name has no description');
}
List<String> hardDependencies = [];
try {