-
Notifications
You must be signed in to change notification settings - Fork 0
/
derpibooru-search-reverse.user.js
121 lines (112 loc) · 7.81 KB
/
derpibooru-search-reverse.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// ==UserScript==
// @name Derpibooru Search Order Reverse Button
// @author undead_wanderer
// @homepageURL https://github.com/undeadwanderer/undead-userscripts
// @description Adds a button to show the current image list in an opposite order.
// @version 1.0.1
// @license Creative Commons BY-NC-SA 4.0
// @namespace https://derpibooru.org/profiles/Pink%2BAmena
// @include /https?://(www\.)?((derpi|trixie)booru\.org|ronxgr5zb4dkwdpt\.onion)/((?!.)|search?.*q=(?!&|\&)|activity|images(?!(/new|/\d))|galleries\/\d)|tags(?=\/.+)/
// @grant none
// ==/UserScript==
if (document.querySelector("div#imagelist-container") !== null) { // failsafe to prevent execution on unsupported pages
var showHidden = 0;
var url = document.baseURI; // get page url
var x = document.getElementsByClassName("pagination"); // get pagination blocks
if (x[0] !== undefined) { // failsafe to prevent errors on supported pages with only one page
var y = x[0].querySelectorAll("a"); // get the list of page links from the pagination block
var z = "";
y.forEach(function(item, index){ // check that the "Last" link actually exists
if (item.innerHTML.includes("Last")){
z = item.getAttribute("href"); // get the link to the last page
return;
}
});
if (z === "") {
z = url; // get the link to the last page
}
}
function1();
} else {
console.log("Derpibooru search reverse button debug: unsupported page."); // debug message
}
function function1() { // main part of the script that makes a new url
z = Number(z.match(/(?<=[?&])page=\d+/i)[0].replace('page=','')); // trim search parameters from the last page link
if (url.includes("hidden=1&")) { // workaround to get ?hidden=1 out of the url until the end of the function
showHidden = 1;
url = url.replace("hidden=1&", "");
} else if (url.includes("?hidden=1")) {
showHidden = 2;
url = url.replace("?hidden=1", "");
} else if (url.includes("hidden=0&")) {
showHidden = 0;
url = url.replace("hidden=0&", "");
} else if (url.includes("?hidden=0")) {
showHidden = 0;
url = url.replace("?hidden=0", "");
}
if (url.includes("/search")) { // when the current location is a search page
if (x[0] !== undefined) { // failsafe to prevent execution on pages without pagination
if (url.includes("page=")) { // check if there's information about the current page. if there isn't, consider it to be the first page
let a = Number(url.match(/page=\d+/i)[0].replace('page=','')); // get the current page number
if (a !== 1) { // if this is not the first page of the search, replace its index
url = url.replace("page=" + a, "page=" + String(z - a + 1)); // set the current page number for the reverse order
} else {
url = url.replace("?page=1", "?page=" + z + "&");
}
} else {
url = url.replace("?", "?page=" + z + "&");
}
} else {
}
if (url.includes("&sd=asc") || url.includes("?sd=asc")) { // if sorting by ascending is detected, change it to descending
url = url.replace("sd=asc", "sd=desc");
} else if (url.includes("&sd=desc") || url.includes("?sd=desc")) { // if sorting by descending is detected, change it to ascending
url = url.replace("sd=desc", "sd=asc");
} else { // if no sorting is found, add sorting by date by ascending
url = url += "&sf=first_seen_at&sd=asc";
}
} else if (url.includes("/galleries/")) { // gallery page support
let galleryId = Number(url.match(/galleries\/\d+/i)[0].replace("galleries/","")); // get the gallery id
if (galleryId !== null) { // failsafe
if (url.match(/\/page=\/\d+\/?/,'') === null) { // first page of the gallery check
url = "https://" + window.location.hostname + "/search?page=" + z + "&sd=asc&sf=gallery_id:" + galleryId + "&q=gallery_id:" + galleryId; // make a search for everything ordered by ascending and with page number swapped for a corresponding one for the reverse irder
} else {
let a = Number(url.match(/page=\d+/i)[0].replace('page=',''));
a = z - a + 1; // get the last page numberl; get the page number for the reverse order
url = "https://" + window.location.hostname + "/search?page=" + a + "&sd=asc&sf=gallery_id:" + galleryId + "&q=gallery_id:" + galleryId; // make a search for everything ordered by ascending and with page number swapped for a corresponding one for the reverse irder
}
}
} else if (url.includes("/tags/")) {
let tagId = url.match(/tags\/[^?&]+/i)[0].replace("tags/","");
let tagSlug = document.querySelector("span[class='tag dropdown']").dataset.tagSlug;
if (tagId !== null) { // failsafe
if (url.match(/page=\d+?/) === null || Number(url.match(/page=\d+?/)[0].replace('page=','')) === 1) { // first page of the gallery check
url = "https://" + window.location.hostname + "/search?q=" + tagSlug + "&page=" + z + "&sf=first_seen_at&sd=asc"; // make a search for everything ordered by ascending and with page number swapped for a corresponding one for the reverse irder
} else {
let a = Number(url.match(/page=\d+/i)[0].replace('page=',''));
a = z - a + 1; // get the last page numberl; get the page number for the reverse order
url = "https://" + window.location.hostname + "/search?page=" + a + "&q=" + tagSlug + "&sf=first_seen_at&sd=asc"; // make a search for everything ordered by ascending and with page number swapped for a corresponding one for the reverse irder
}
}
} else if (url.includes("images") || window.location.pathname === "/" || window.location.pathname === "/activity") { // when the current location is a page in the image list or the main page or the acrivity page
if (url.includes("page=")) {
var a = Number(url.match(/page=\d+/i)[0].replace('page=',''));
} else {
var a = 1;
}
if (a === 1) { // if this is the first page of the image list, just make a search for everything ordered by ascending date
url = "https://" + window.location.hostname + "/search?page=" + z + "&sf=first_seen_at&sd=asc&q=*";
} else {
a = z - a + 1; // get the last page numberl; get the page number for the reverse order
url = "https://" + window.location.hostname + "/search?page=" + a + "&sf=irst_seen_at&sd=asc&q=*"; // make a search for everything ordered by ascending and with page number swapped for a corresponding one for the reverse irder
}
} else {
console.log("Derpibooru search reverse button debug: This was not supposed to happen.");
}
if (showHidden !== 0) { // if "hidden=1" was found and removed, reinsert it into the url
url = url.replace("?", "?hidden=1&");
}
// create the link
document.querySelector("div.flex__right").innerHTML = '<a href="' + url +'" title="Reverse Sorting"><i class="fa-solid fa-arrows-rotate"></i> <span class="hide-mobile hide-limited-desktop">Reverse Sorting</span></a>' + document.querySelector("div.flex__right").innerHTML;
}