diff --git a/site/_includes/filterjs.html b/site/_includes/filterjs.html index 1218b0c..9d315ec 100644 --- a/site/_includes/filterjs.html +++ b/site/_includes/filterjs.html @@ -39,6 +39,7 @@ let card = cards[i]; let name = card.getAttribute('data-name').toUpperCase(); let version = card.getAttribute('data-version'); + let maxVersion = card.getAttribute('data-max-version'); if (!isCompatible(version, targetVersion)) continue; @@ -57,9 +58,10 @@ let card = cards[i]; let name = card.getAttribute('data-name').toUpperCase(); let version = card.getAttribute('data-version'); + let maxVersion = card.getAttribute('data-max-version'); let searchMatches = name.indexOf(searchFilter) >= 0; - let versionMatches = targetVersion == '' || isCompatible(version, targetVersion); + let versionMatches = targetVersion == '' || isCompatible(version, targetVersion, maxVersion); let isNewest = true; if (name in versions) { isNewest = versions[name] == version; @@ -69,7 +71,7 @@ } } - function isCompatible(pluginVersion, driverVersion) { + function isCompatible(pluginVersion, driverVersion, maxPluginVersion) { // support truth table: // plugin / driver // 0.5.3.3 and 0.6.0.0: false @@ -77,18 +79,40 @@ // 0.5.2.0 and 0.5.3.3: true // 0.5.3.3 and 0.5.2.0: false - let pluginSplit = pluginVersion.split('.'); - let driverSplit = driverVersion.split('.'); + let pluginSplit = getIntSplit(pluginVersion); + let maxPluginSplit = getIntSplit(maxPluginVersion); + let driverSplit = getIntSplit(driverVersion); - if (pluginSplit[0] != driverSplit[0]) - return false; + try { + if (pluginSplit[0] != driverSplit[0] || (maxPluginSplit != null && maxPluginSplit[0] != driverSplit[0])) { + return false; + } - if (pluginSplit[1] != driverSplit[1]) - return false; + if (pluginSplit[1] != driverSplit[1] || (maxPluginSplit != null && maxPluginSplit[1] != driverSplit[1])) { + return false; + } + + if (pluginSplit[2] > driverSplit[2] || (maxPluginSplit != null && maxPluginSplit[2] < driverSplit[2])) { + return false; + } - if (pluginSplit[2] > driverSplit[2]) + // The final version number on a plugin's base version number is allowed through no matter what, this filtering is intentionally not applied: + // pluginSplit[2] == driverSplit[2] && pluginSplit[3] > driverSplit[3] + // Only the MaxSupportedPluginVersion is checked for the final version number + if (maxPluginSplit != null && maxPluginSplit[2] == driverSplit[2] && maxPluginSplit[3] < driverSplit[3]) + return false; + } catch (e) { + console.error(`Failed to determine plugin version compatibility. Plugin version: ${pluginVersion}. Driver version: ${driverVersion}.\nError: ${e}`); return false; + } return true; } + + function getIntSplit(inputString) { + if (inputString) + return inputString.split('.').map((x) => Number(x)); + + return null; + } diff --git a/site/_layouts/plugins.html b/site/_layouts/plugins.html index 0df3377..7260010 100644 --- a/site/_layouts/plugins.html +++ b/site/_layouts/plugins.html @@ -73,7 +73,7 @@ {% endif %} {%- endcapture -%}