NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name FA Search URL
// @namespace Artex
// @description adds search parameters to the url
// @include http://www.furaffinity.net/search*
// @include https://www.furaffinity.net/search*
// @version 2
// @homepage https://www.furaffinity.net/user/artex./
// @run-at document-end
// @license GPL-3.0
// @grant none
// ==/UserScript==
//parameters that can be exlcuded from the search if they are the default value. Helps shorten the url.
var defaults = {
"order-by":"relevancy",
"order-direction":"desc",
"perpage":"48",
"range":"all",
"mode":"extended"
};
var types = { //if all enabled can be excluded from url.
"type-art": ["on", "1"], //"on" when explicitly set, blank when off, 1 when parameter was not provided to search
"type-music": ["on", "1"],
"type-flash": ["on", "1"],
"type-story": ["on", "1"],
"type-photo": ["on", "1"],
"type-poetry": ["on", "1"]
};
var ratings = {
"rating-general": "on",
"rating-mature": "on",
"rating-adult": "on"
};
function isDefault(key, val) {
if (defaults[key] && defaults[key] == val) {
return true;
} else {
return false;
}
}
function removeDefaults(formData) {
//could still remove rating params if the value is "1" or all on "on"
var searchParams = new Map();
var typeBlock = new Map(); //wait to append types until all are accounted for.
var ratingBlock = new Map();
var defaultTypes = true;
var defaultRatings = false; //if any rating is 1 search uses content rating defaults
var allRatings = true; //if all are on user defaults would suffice as well.
for (var pair of formData.entries()) {
var [key, val] = pair;
if (isDefault(key,val) == false) {//ignore default values
if (types[key]) { //is type value
typeBlock.set(key, val);
if (types[key].includes(val) == false) { //not default value
defaultTypes = false;
}
} else if (ratings[key]) {
ratingBlock.set(key, val);
if (ratings[key] != val) { //not default value
allRatings = false;
}
if (val == "1") {
defaultRatings = true;
}
} else {
searchParams.set(key, val);
}
}
}
if (defaultTypes == false) {
for (var pair of typeBlock.entries()) {
var [key, val] = pair;
searchParams.set(key, val);
}
}
if (defaultRatings ? allRatings : !allRatings) {
for (var pair of ratingBlock.entries()) {
var [key, val] = pair;
searchParams.set(key, val);
}
}
return searchParams;
}
function qStringFromForm(form) { //make query string from form data
var formData = new FormData(form);
var searchParams = removeDefaults(formData);
var stringedParams = [];
for (var pair of searchParams.entries()) {
var [key, val] = pair;
console.log(key, val);
stringedParams.push(key + "=" + val.replace(/ /g,"+"));
}
return stringedParams.join("&");
}
function addQString(str) {
window.history.replaceState("", "Search", "/search?"+str);
}
addQString(qStringFromForm(document.querySelector("#search-form")));