Skip to content

Commit 018ba91

Browse files
Improve Version Filter (#65)
1 parent b849e31 commit 018ba91

File tree

2 files changed

+114
-72
lines changed

2 files changed

+114
-72
lines changed

Diff for: docs/js/main.js

+57-36
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const siteVersion = "2.2.0"; // site version is different from skript version
1+
const siteVersion = "2.3.0"; // site version is different from skript version
22
const ghAPI = "https://api.github.com/repos/SkriptLang/Skript";
33

44
// ID Scroll
@@ -88,25 +88,38 @@ document.querySelectorAll(".new-element").forEach((e) => {
8888
})
8989

9090
// <> Search Bar
91-
const versionComparePattern = /.*?(\d\.\d(?:\.\d|))(\+|-|).*/gi;
92-
const versionPattern = / ?v(?:ersion|):(\d\.\d(?:\.\d|-(?:beta|alpha|dev)\d*|))(\+|-|)/gi;
91+
const versionComparePattern = /.*?(\d+).(\d+)(?:.(\d+))?.*/i;
92+
const versionPattern = / ?v(?:ersion|):(\d+.\d+(?:.\d+)?)(?:-[^\s+-]+)?([+-])?/gi;
9393
const typePattern = / ?t(?:ype|):(\w+)/gi;
9494
const newPattern = / ?is:(new)/gi;
9595
const resultsFoundText = "result(s) found";
9696

97-
function versionCompare(base, target) { // Return -1, 0, 1
98-
base = base.replaceAll(versionComparePattern, "$1").replaceAll(/[^0-9]/gi, "");
99-
target = target.replaceAll(versionComparePattern, "$1").replaceAll(/[^0-9]/gi, "");
97+
function versionParse(version) {
98+
const matches = versionComparePattern.exec(version);
99+
if (matches == null)
100+
return null;
101+
return [
102+
parseInt(matches[1]), // major
103+
parseInt(matches[2]), // minor
104+
matches[3] !== undefined ? parseInt(matches[3]) : 0 // patch
105+
]
106+
}
100107

101-
base = parseInt(base) < 100 ? parseInt(base) * 10 : parseInt(base); // convert ten's to hundred's to fix (2.5.1+ not triggering 2.6 by converting 26 -> 260)
102-
target = parseInt(target) < 100 ? parseInt(target) * 10 : parseInt(target);
108+
function versionCompare(baseArr, targetArr) { // Return -1, 0, 1
109+
// compare in order of major.minor.patch
110+
for (let i = 0; i <= 2; i++) {
111+
let baseVer = baseArr[i];
112+
let targetVer = targetArr[i];
113+
// compare versions (target in relation to base)
114+
if (targetVer > baseVer)
115+
return 1;
116+
if (targetVer < baseVer)
117+
return -1;
118+
// equal, try next parts
119+
}
103120

104-
if (target > base)
105-
return 1
106-
if (target == base)
107-
return 0
108-
if (target < base)
109-
return -1
121+
// they must be equal
122+
return 0;
110123
}
111124

112125
var searchBar;
@@ -141,7 +154,7 @@ if (content) {
141154
let options = "<select id='search-version' name='versions' id='versions' onchange='checkVersionFilter()'></select>"
142155
content.insertAdjacentHTML('afterbegin', `<span>${options}</span>`);
143156
options = document.getElementById("search-version");
144-
157+
145158
getApiValue(null, "skript-versions", "tags?per_page=83&page=2", (data, isCached) => { // 83 and page 2 matters to filter dev branches (temporary solution)
146159
if (isCached)
147160
data = data.split(",");
@@ -153,7 +166,7 @@ if (content) {
153166
} else {
154167
tag = data[i]["name"];
155168
}
156-
tags.push(tag.replaceAll(/(.*)-(dev|beta|alpha).*/gi, "$1"));
169+
tags.push(tag.replaceAll(/(.*?)-.*/gi, "$1"));
157170
}
158171

159172
tags = [...new Set(tags)] // remove duplicates
@@ -195,7 +208,7 @@ function checkVersionFilter() {
195208
}
196209

197210
function searchNow(value = "") {
198-
if (value != "") // Update searchBar value
211+
if (value !== "") // Update searchBar value
199212
searchBar.value = value;
200213

201214
let allElements = document.querySelectorAll(".item-wrapper");
@@ -211,11 +224,14 @@ function searchNow(value = "") {
211224
let verExec = versionPattern.exec(searchValue);
212225
version = verExec[1];
213226
if (verExec.length > 2) {
214-
versionAndUp = verExec[2] == "+" == true;
215-
versionAndDown = verExec[2] == "-" == true;
227+
versionAndUp = verExec[2] === "+";
228+
versionAndDown = verExec[2] === "-";
216229
}
217230
searchValue = searchValue.replaceAll(versionPattern, "") // Don't include filters in the search
218231
}
232+
let versionArr = null;
233+
if (version !== "")
234+
versionArr = versionParse(version);
219235

220236
// Type
221237
let filterType;
@@ -227,7 +243,7 @@ function searchNow(value = "") {
227243
// News
228244
let filterNew;
229245
if (searchValue.match(newPattern)) {
230-
filterNew = newPattern.exec(searchValue)[1] == "new";
246+
filterNew = newPattern.exec(searchValue)[1] === "new";
231247
searchValue = searchValue.replaceAll(newPattern, "")
232248
}
233249

@@ -247,22 +263,27 @@ function searchNow(value = "") {
247263

248264
// Version check
249265
let versionFound;
250-
if (version != "") {
251-
versionFound = versionCompare(version, document.querySelectorAll(`#${e.id} .item-details:nth-child(2) td:nth-child(2)`)[0].textContent) == 0;
252-
253-
if (versionAndUp || versionAndDown) {
254-
let versions = document.querySelectorAll(`#${e.id} .item-details:nth-child(2) td:nth-child(2)`)[0].textContent.split(",");
255-
for (const v in versions) { // split on ',' without space in case some version didn't have space and versionCompare will handle it
256-
if (versionAndUp) {
257-
if (versionCompare(version, versions[v]) == 1) {
258-
versionFound = true;
259-
break; // Performance
260-
}
261-
} else if (versionAndDown) {
262-
if (versionCompare(version, versions[v]) == -1) {
263-
versionFound = true;
264-
break; // Performance
265-
}
266+
if (versionArr !== null) { // if we parsed a version
267+
const versions = document.querySelectorAll(`#${e.id} .item-details:nth-child(2) td:nth-child(2)`)[0].innerHTML.split(/,|<br\/?>/i);
268+
for (const v of versions) {
269+
const targetArr = versionParse(v);
270+
if (targetArr === null) // treat as version not matching
271+
continue;
272+
let result = versionCompare(versionArr, targetArr);
273+
if (versionAndUp) {
274+
if (result >= 0) {
275+
versionFound = true;
276+
break;
277+
}
278+
} else if (versionAndDown) {
279+
if (result < 0) { // exclude current version
280+
versionFound = true;
281+
break;
282+
}
283+
} else {
284+
if (result === 0) {
285+
versionFound = true;
286+
break;
266287
}
267288
}
268289
}

Diff for: docs/templates/js/main.js

+57-36
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const siteVersion = "2.2.0"; // site version is different from skript version
1+
const siteVersion = "2.3.0"; // site version is different from skript version
22
const ghAPI = "https://api.github.com/repos/SkriptLang/Skript";
33

44
// ID Scroll
@@ -88,25 +88,38 @@ document.querySelectorAll(".new-element").forEach((e) => {
8888
})
8989

9090
// <> Search Bar
91-
const versionComparePattern = /.*?(\d\.\d(?:\.\d|))(\+|-|).*/gi;
92-
const versionPattern = / ?v(?:ersion|):(\d\.\d(?:\.\d|-(?:beta|alpha|dev)\d*|))(\+|-|)/gi;
91+
const versionComparePattern = /.*?(\d+).(\d+)(?:.(\d+))?.*/i;
92+
const versionPattern = / ?v(?:ersion|):(\d+.\d+(?:.\d+)?)(?:-[^\s+-]+)?([+-])?/gi;
9393
const typePattern = / ?t(?:ype|):(\w+)/gi;
9494
const newPattern = / ?is:(new)/gi;
9595
const resultsFoundText = "result(s) found";
9696

97-
function versionCompare(base, target) { // Return -1, 0, 1
98-
base = base.replaceAll(versionComparePattern, "$1").replaceAll(/[^0-9]/gi, "");
99-
target = target.replaceAll(versionComparePattern, "$1").replaceAll(/[^0-9]/gi, "");
97+
function versionParse(version) {
98+
const matches = versionComparePattern.exec(version);
99+
if (matches == null)
100+
return null;
101+
return [
102+
parseInt(matches[1]), // major
103+
parseInt(matches[2]), // minor
104+
matches[3] !== undefined ? parseInt(matches[3]) : 0 // patch
105+
]
106+
}
100107

101-
base = parseInt(base) < 100 ? parseInt(base) * 10 : parseInt(base); // convert ten's to hundred's to fix (2.5.1+ not triggering 2.6 by converting 26 -> 260)
102-
target = parseInt(target) < 100 ? parseInt(target) * 10 : parseInt(target);
108+
function versionCompare(baseArr, targetArr) { // Return -1, 0, 1
109+
// compare in order of major.minor.patch
110+
for (let i = 0; i <= 2; i++) {
111+
let baseVer = baseArr[i];
112+
let targetVer = targetArr[i];
113+
// compare versions (target in relation to base)
114+
if (targetVer > baseVer)
115+
return 1;
116+
if (targetVer < baseVer)
117+
return -1;
118+
// equal, try next parts
119+
}
103120

104-
if (target > base)
105-
return 1
106-
if (target == base)
107-
return 0
108-
if (target < base)
109-
return -1
121+
// they must be equal
122+
return 0;
110123
}
111124

112125
var searchBar;
@@ -141,7 +154,7 @@ if (content) {
141154
let options = "<select id='search-version' name='versions' id='versions' onchange='checkVersionFilter()'></select>"
142155
content.insertAdjacentHTML('afterbegin', `<span>${options}</span>`);
143156
options = document.getElementById("search-version");
144-
157+
145158
getApiValue(null, "skript-versions", "tags?per_page=83&page=2", (data, isCached) => { // 83 and page 2 matters to filter dev branches (temporary solution)
146159
if (isCached)
147160
data = data.split(",");
@@ -153,7 +166,7 @@ if (content) {
153166
} else {
154167
tag = data[i]["name"];
155168
}
156-
tags.push(tag.replaceAll(/(.*)-(dev|beta|alpha).*/gi, "$1"));
169+
tags.push(tag.replaceAll(/(.*?)-.*/gi, "$1"));
157170
}
158171

159172
tags = [...new Set(tags)] // remove duplicates
@@ -195,7 +208,7 @@ function checkVersionFilter() {
195208
}
196209

197210
function searchNow(value = "") {
198-
if (value != "") // Update searchBar value
211+
if (value !== "") // Update searchBar value
199212
searchBar.value = value;
200213

201214
let allElements = document.querySelectorAll(".item-wrapper");
@@ -211,11 +224,14 @@ function searchNow(value = "") {
211224
let verExec = versionPattern.exec(searchValue);
212225
version = verExec[1];
213226
if (verExec.length > 2) {
214-
versionAndUp = verExec[2] == "+" == true;
215-
versionAndDown = verExec[2] == "-" == true;
227+
versionAndUp = verExec[2] === "+";
228+
versionAndDown = verExec[2] === "-";
216229
}
217230
searchValue = searchValue.replaceAll(versionPattern, "") // Don't include filters in the search
218231
}
232+
let versionArr = null;
233+
if (version !== "")
234+
versionArr = versionParse(version);
219235

220236
// Type
221237
let filterType;
@@ -227,7 +243,7 @@ function searchNow(value = "") {
227243
// News
228244
let filterNew;
229245
if (searchValue.match(newPattern)) {
230-
filterNew = newPattern.exec(searchValue)[1] == "new";
246+
filterNew = newPattern.exec(searchValue)[1] === "new";
231247
searchValue = searchValue.replaceAll(newPattern, "")
232248
}
233249

@@ -247,22 +263,27 @@ function searchNow(value = "") {
247263

248264
// Version check
249265
let versionFound;
250-
if (version != "") {
251-
versionFound = versionCompare(version, document.querySelectorAll(`#${e.id} .item-details:nth-child(2) td:nth-child(2)`)[0].textContent) == 0;
252-
253-
if (versionAndUp || versionAndDown) {
254-
let versions = document.querySelectorAll(`#${e.id} .item-details:nth-child(2) td:nth-child(2)`)[0].textContent.split(",");
255-
for (const v in versions) { // split on ',' without space in case some version didn't have space and versionCompare will handle it
256-
if (versionAndUp) {
257-
if (versionCompare(version, versions[v]) == 1) {
258-
versionFound = true;
259-
break; // Performance
260-
}
261-
} else if (versionAndDown) {
262-
if (versionCompare(version, versions[v]) == -1) {
263-
versionFound = true;
264-
break; // Performance
265-
}
266+
if (versionArr !== null) { // if we parsed a version
267+
const versions = document.querySelectorAll(`#${e.id} .item-details:nth-child(2) td:nth-child(2)`)[0].innerHTML.split(/,|<br\/?>/i);
268+
for (const v of versions) {
269+
const targetArr = versionParse(v);
270+
if (targetArr === null) // treat as version not matching
271+
continue;
272+
let result = versionCompare(versionArr, targetArr);
273+
if (versionAndUp) {
274+
if (result >= 0) {
275+
versionFound = true;
276+
break;
277+
}
278+
} else if (versionAndDown) {
279+
if (result < 0) { // exclude current version
280+
versionFound = true;
281+
break;
282+
}
283+
} else {
284+
if (result === 0) {
285+
versionFound = true;
286+
break;
266287
}
267288
}
268289
}

0 commit comments

Comments
 (0)