diff options
author | Will Hunt <will@half-shot.uk> | 2024-03-14 15:18:51 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-14 15:18:51 +0000 |
commit | 1198f649ea91bcc21ae5b596ad50bf1851de2589 (patch) | |
tree | 3054802f721977d6178cb6fb16d46d6d52a5be58 | |
parent | upgrade.md: fix grammatical errors (#16965) (diff) | |
download | synapse-1198f649ea91bcc21ae5b596ad50bf1851de2589.tar.xz |
Sort versions in the documentation version picker appropriately. (#16966)
Fixes #16964 This adds a proper sorter for versions which takes into account semantic versions, rather than just relying on localeCompare.
-rw-r--r-- | changelog.d/16966.doc | 1 | ||||
-rw-r--r-- | docs/website_files/version-picker.js | 26 |
2 files changed, 24 insertions, 3 deletions
diff --git a/changelog.d/16966.doc b/changelog.d/16966.doc new file mode 100644 index 0000000000..06f4093aee --- /dev/null +++ b/changelog.d/16966.doc @@ -0,0 +1 @@ +Fix the sort order for the documentation version picker, so that newer releases appear above older ones. diff --git a/docs/website_files/version-picker.js b/docs/website_files/version-picker.js index b6f35f29c7..3174b5d0bc 100644 --- a/docs/website_files/version-picker.js +++ b/docs/website_files/version-picker.js @@ -100,10 +100,30 @@ function sortVersions(a, b) { if (a === 'develop' || a === 'latest') return -1; if (b === 'develop' || b === 'latest') return 1; - const versionA = (a.match(/v\d+(\.\d+)+/) || [])[0]; - const versionB = (b.match(/v\d+(\.\d+)+/) || [])[0]; + // If any of the versions do not confrom to a semantic version string, they + // will be sorted behind a valid version. + const versionA = (a.match(/v(\d+(\.\d+)+)/) || [])[1]?.split('.') ?? ''; + const versionB = (b.match(/v(\d+(\.\d+)+)/) || [])[1]?.split('.') ?? ''; - return versionB.localeCompare(versionA); + for (let i = 0; i < Math.max(versionA.length, versionB.length); i++) { + if (versionB[i] === undefined) { + return -1; + } + if (versionA[i] === undefined) { + return 1; + } + + const partA = parseInt(versionA[i], 10); + const partB = parseInt(versionB[i], 10); + + if (partA > partB) { + return -1; + } else if (partB > partA) { + return 1; + } + } + + return 0; } /** |