diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityClient.cs b/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityClient.cs
index be03a120..a68a0b4e 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityClient.cs
+++ b/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityClient.cs
@@ -91,19 +91,25 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki
}
// parse other fields
+ string name = node.Descendants("td").FirstOrDefault()?.InnerText?.Trim();
+ string[] ids = this.GetAttribute(node, "data-id")?.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(p => p.Trim()).ToArray() ?? new string[0];
int? nexusID = this.GetNullableIntAttribute(node, "data-nexus-id");
int? chucklefishID = this.GetNullableIntAttribute(node, "data-chucklefish-id");
- string githubRepo = node.GetAttributeValue("data-github", null);
- string customSourceUrl = node.GetAttributeValue("data-custom-source", null);
+ string githubRepo = this.GetAttribute(node, "data-github");
+ string customSourceUrl = this.GetAttribute(node, "data-custom-source");
+ string customUrl = this.GetAttribute(node, "data-custom-url");
// yield model
yield return new WikiCompatibilityEntry
{
+ ID = ids,
+ Name = name,
Status = status,
NexusID = nexusID,
ChucklefishID = chucklefishID,
GitHubRepo = githubRepo,
CustomSourceUrl = customSourceUrl,
+ CustomUrl = customUrl,
UnofficialVersion = unofficialVersion
};
}
@@ -114,12 +120,23 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki
/// The attribute name.
private int? GetNullableIntAttribute(HtmlNode node, string attributeName)
{
- string raw = node.GetAttributeValue(attributeName, null);
+ string raw = this.GetAttribute(node, attributeName);
if (raw != null && int.TryParse(raw, out int value))
return value;
return null;
}
+ /// Get a strings attribute value.
+ /// The HTML node.
+ /// The attribute name.
+ private string GetAttribute(HtmlNode node, string attributeName)
+ {
+ string raw = node.GetAttributeValue(attributeName, null);
+ if (raw != null)
+ raw = HtmlEntity.DeEntitize(raw);
+ return raw;
+ }
+
/// The response model for the MediaWiki parse API.
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Local")]
[SuppressMessage("ReSharper", "UnusedAutoPropertyAccessor.Local")]
diff --git a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityEntry.cs b/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityEntry.cs
index ceeb2de5..9aabdcba 100644
--- a/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityEntry.cs
+++ b/src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityEntry.cs
@@ -3,6 +3,12 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki
/// An entry in the mod compatibility list.
public class WikiCompatibilityEntry
{
+ /// The mod's unique ID. A mod may have multiple current IDs in rare cases (e.g. due to parallel releases or unofficial updates).
+ public string[] ID { get; set; }
+
+ /// The mod's display name.
+ public string Name { get; set; }
+
/// The mod ID on Nexus.
public int? NexusID { get; set; }
@@ -15,6 +21,9 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki
/// The URL to a non-GitHub source repo.
public string CustomSourceUrl { get; set; }
+ /// The custom mod page URL (if applicable).
+ public string CustomUrl { get; set; }
+
/// The version of the latest unofficial update, if applicable.
public ISemanticVersion UnofficialVersion { get; set; }