Tätä skriptiä ei tulisi asentaa suoraan. Se on kirjasto muita skriptejä varten sisällytettäväksi metadirektiivillä // @require https://update.sleazyfork.org/scripts/476583/1413026/common_libs_of_array.js
.
// ==UserScript==
// @name common_libs_of_array
// @namespace websiteEnhancement
// @author jimmly
// @version 2024.7.18
// @description 增加页面顶部底部按钮和一键下种按钮
// @create 2023-9-21
// @include *
// @grant GM_getValue
// @grant GM_setValue
// @grant GM.getValue
// @grant GM.setValue
// @license MIT
// @run-at document-idle
// ==/UserScript==
async function withJQuery(callback, safe, unsafeWindow) {
if (typeof jQuery == "undefined") {
let script = document.createElement("script")
script.type = "text/javascript"
script.src = "https://code.jquery.com/jquery-3.7.1.js"
if (safe) {
let cb = document.createElement("script")
cb.type = "text/javascript"
cb.textContent = `jQuery.noConflict();(${callback.toString()})(jQuery, window);`
script.addEventListener("load", function () {
document.head.appendChild(cb)
})
}
else {
let dollar
if (typeof $ != "undefined")
dollar = $
script.addEventListener("load", function () {
jQuery.noConflict()
$ = dollar
callback(jQuery, window)
})
}
document.head.appendChild(script)
}
else {
setTimeout(function () {
// Firefox supports
callback(jQuery, typeof unsafeWindow === "undefined" ? window : unsafeWindow)
}, 30)
}
}
// addStyle
function addStyle(css) {
let s = document.createElement('style')
s.appendChild(document.createTextNode(css))
document.getElementsByTagName('head')[0].appendChild(s)
}
function getFilePathFromUrl(url) {
let parsedUrl = new URL(url)
return parsedUrl.pathname.split('/').pop() // 或使用 url.pathname.split('/').pop() 如果url已经是一个URL对象
}
function getUrlWithoutHost(urlString) {
let url = new URL(urlString)
return url.href.substring(url.origin.length)
}
class LRUCache {
saveMapToLocalStorage(map, key) {
// 将Map转换为普通对象
const obj = Object.fromEntries(map);
// 将对象转换为JSON字符串
const jsonString = JSON.stringify(obj);
// 存储到localStorage
localStorage.setItem(key, jsonString);
}
loadMapFromLocalStorage(key) {
// 从localStorage获取JSON字符串
const jsonString = localStorage.getItem(key);
if (!jsonString) {
return new Map(); // 如果没有数据,返回空Map
}
// 将JSON字符串转换为普通对象
const obj = JSON.parse(jsonString);
// 将对象转换回Map
const map = new Map(Object.entries(obj));
return map;
}
constructor(key = "default_key", capacity = 500) {
this.capacity = capacity;
this.cache = this.loadMapFromLocalStorage(key);
window.addEventListener('beforeunload', function (event) {
saveMapToLocalStorage(cache, key)
});
}
get(key) {
if (this.cache.has(key)) {
// 如果存在,则先删除再添加,以更新Map中的顺序(模拟最近最少使用)
const value = this.cache.get(key);
this.cache.delete(key);
this.cache.set(key, value);
return value;
}
return null;
}
put(key, value) {
if (this.cache.has(key)) {
// 如果键已经存在,先删除旧值
this.cache.delete(key);
} else if (this.cache.size >= this.capacity) {
// 如果达到容量限制,删除最老的项
this.cache.delete(this.cache.keys().next().value);
}
// 添加新值
this.cache.set(key, value);
}
}
const obj = new LRUCache("javdb_configurable_options_script", 1000)
// createSuperLabel 创建超链接,不会被拦截
async function createSuperLabel(url, id, downloadName, win) {
win = win ?? window
if (downloadName) {
if (win.closeTimer) {
win.clearTimeout(win.closeTimer)
}
win.closeTimer = setTimeout(function () {
win.open("about:blank", "_self").close()
}, 500)
}
if (!id || id.length > 5)
id = getUrlWithoutHost(url)
// 防止反复添加
if (!document.getElementById(id) && !obj.get(id)) {
let tmpLink = document.createElement("a")
obj.put(id, true)
if (downloadName)
tmpLink.download = downloadName
tmpLink.setAttribute("href", url)
tmpLink.setAttribute("target", "_blank")
tmpLink.setAttribute("id", id)
document.body.appendChild(tmpLink)
tmpLink.click()
return true
}
return false
}
function unique(arr) {
let obj = {}
return arr.filter(function (item, index, arr) {
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
/// ignore \r \t \n space and caseinsitive
function a_Contains_b(a, b) {
a = a.replace(/(\r\n|[\n\r\t ])/g, "").toLowerCase()
b = b.replace(/(\r\n|[\n\r\t ])/g, "").toLowerCase()
if (!!a && !!b && a.includes(b)) {
return true
}
return false
}
async function autoFind(funcIsRun, cmgId, selector, funcText, $, elBindOpen, unsafeWindow) {
new Promise(resovle => resovle(new GM_config({
id: `GM_config_${cmgId}`,
title: 'javdb Configurable Options Script',
fields: {
asdf: {
label: 'Search keys',
type: 'textarea',
rows: 30,
cols: 50,
default: '调J; 阴环;18岁;19岁;20岁;gvh;sm;tki;一字马;一线天;乳环;固定;圈养;奴隶;奴隶;实录;性奴;拘;拘束;拷问;捆绑;捆绑;挛;无毛;束;束缚;束缚;母G;母狗;无毛;痉;白虎;紧缚;萝莉;调教;调教;软派;软体;软体;缚;身动;绑;;肛塞;尾巴;极品;奴宠; 淫媚;极品;尤物;凌辱;屈辱;少女;天然;素人;清纯;耻;'
+ '調J; 陰環;18歲;19歲;20歲;18歳;20歳;21歳;gvh;sm;tki;一字馬;一綫天;乳環;固定;圈養;奴隸;奴隸;實錄;性奴;拘;拘束;拷問;捆綁;捆綁;攣;無毛;束;束縛;束縛;母G;母狗;無毛;痙;白虎;緊縛;蘿莉;調教;調教;軟派;軟體;軟體;縛;身動;綁;;肛塞;尾巴;極品;奴寵; 淫媚;極品;尤物;凌辱;屈辱;少女;天然;素人;清純;恥',
},
isRunInNewTabs: {
options: ['Auto Run In New Tab', 'Not Run In New Tab'],
label: 'Auto Run In New Tab?',
type: 'radio',
default: 'Auto Run In New Tab',
},
},
events:
{
open() {
let vals = unique(this.get('asdf').split(/[;;,,]/g)).join(';')
this.set('asdf', vals)
},
save() {
let vals = unique(this.get('asdf').split(/[;;,,]/g)).join(';')
this.set('asdf', vals)
},
},
})))
.then((gmc) => {
setTimeout(() => $(elBindOpen).click(() => gmc.open()), 500)
return gmc
})
.then((gmc) => {
(unsafeWindow || window).gmc = gmc
if (!funcIsRun(gmc))
throw new Error(`no run due to contion failed`)
return gmc
})
.then((gmc) => {
return { gmc, conf: gmc.get('asdf') }
},
)
.then(({ gmc, conf }) => {
console.log('config value of keys', conf)
return ({ gmc, keys: conf.split(/[;;,,]/) })
})
.then(({ gmc, keys }) => {
$(selector).each((i, element) => {
let el = $(element)
$.each(keys, (inex, key) => {
if (a_Contains_b(funcText(el), key)) {
createSuperLabel(el.prop('href'), el.prop('href')).then(res => console.log(key, res, el.prop('href')))
return false
}
})
})
return { gmc, keys }
})
.catch(e => console.log('error', e))
};