// ==UserScript==
// @name WebUI 태그 자동완성
// @namespace https://greasyfork.org/users/815641
// @version 1.3.1
// @author 우흐
// @description WebUI 태그 자동완성 추가
// @license MIT
// @match *://127.0.0.1:*/*
// @match *://*.gradio.app/*
// @match *://localhost:*/*
// @match *://*.ngrok.io/*
// @require https://greasyfork.org/scripts/421384-gm-fetch/code/GM_fetch.js
// @require https://cdn.jsdelivr.net/npm/sweetalert2@11
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function() {
"use strict";
var autoComplete_min = { exports: {} };
(function(module, exports) {
var t;
t = function() {
function e(e2, t3) {
var n2 = Object.keys(e2);
if (Object.getOwnPropertySymbols) {
var r2 = Object.getOwnPropertySymbols(e2);
t3 && (r2 = r2.filter(function(t4) {
return Object.getOwnPropertyDescriptor(e2, t4).enumerable;
})), n2.push.apply(n2, r2);
}
return n2;
}
function t2(t3) {
for (var n2 = 1; n2 < arguments.length; n2++) {
var i2 = null != arguments[n2] ? arguments[n2] : {};
n2 % 2 ? e(Object(i2), true).forEach(function(e2) {
r(t3, e2, i2[e2]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t3, Object.getOwnPropertyDescriptors(i2)) : e(Object(i2)).forEach(function(e2) {
Object.defineProperty(t3, e2, Object.getOwnPropertyDescriptor(i2, e2));
});
}
return t3;
}
function n(e2) {
return n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e3) {
return typeof e3;
} : function(e3) {
return e3 && "function" == typeof Symbol && e3.constructor === Symbol && e3 !== Symbol.prototype ? "symbol" : typeof e3;
}, n(e2);
}
function r(e2, t3, n2) {
return t3 in e2 ? Object.defineProperty(e2, t3, { value: n2, enumerable: true, configurable: true, writable: true }) : e2[t3] = n2, e2;
}
function i(e2) {
return function(e3) {
if (Array.isArray(e3))
return s(e3);
}(e2) || function(e3) {
if ("undefined" != typeof Symbol && null != e3[Symbol.iterator] || null != e3["@@iterator"])
return Array.from(e3);
}(e2) || o(e2) || function() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}();
}
function o(e2, t3) {
if (e2) {
if ("string" == typeof e2)
return s(e2, t3);
var n2 = Object.prototype.toString.call(e2).slice(8, -1);
return "Object" === n2 && e2.constructor && (n2 = e2.constructor.name), "Map" === n2 || "Set" === n2 ? Array.from(e2) : "Arguments" === n2 || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2) ? s(e2, t3) : void 0;
}
}
function s(e2, t3) {
(null == t3 || t3 > e2.length) && (t3 = e2.length);
for (var n2 = 0, r2 = new Array(t3); n2 < t3; n2++)
r2[n2] = e2[n2];
return r2;
}
var u = function(e2) {
return "string" == typeof e2 ? document.querySelector(e2) : e2();
}, a = function(e2, t3) {
var n2 = "string" == typeof e2 ? document.createElement(e2) : e2;
for (var r2 in t3) {
var i2 = t3[r2];
if ("inside" === r2)
i2.append(n2);
else if ("dest" === r2)
u(i2[0]).insertAdjacentElement(i2[1], n2);
else if ("around" === r2) {
var o2 = i2;
o2.parentNode.insertBefore(n2, o2), n2.append(o2), null != o2.getAttribute("autofocus") && o2.focus();
} else
r2 in n2 ? n2[r2] = i2 : n2.setAttribute(r2, i2);
}
return n2;
}, c = function(e2, t3) {
return e2 = String(e2).toLowerCase(), t3 ? e2.normalize("NFD").replace(/[\u0300-\u036f]/g, "").normalize("NFC") : e2;
}, l = function(e2, n2) {
return a("mark", t2({ innerHTML: e2 }, "string" == typeof n2 && { class: n2 })).outerHTML;
}, f = function(e2, t3) {
t3.input.dispatchEvent(new CustomEvent(e2, { bubbles: true, detail: t3.feedback, cancelable: true }));
}, p = function(e2, t3, n2) {
var r2 = n2 || {}, i2 = r2.mode, o2 = r2.diacritics, s2 = r2.highlight, u2 = c(t3, o2);
if (t3 = String(t3), e2 = c(e2, o2), "loose" === i2) {
var a2 = (e2 = e2.replace(/ /g, "")).length, f2 = 0, p2 = Array.from(t3).map(function(t4, n3) {
return f2 < a2 && u2[n3] === e2[f2] && (t4 = s2 ? l(t4, s2) : t4, f2++), t4;
}).join("");
if (f2 === a2)
return p2;
} else {
var d2 = u2.indexOf(e2);
if (~d2)
return e2 = t3.substring(d2, d2 + e2.length), d2 = s2 ? t3.replace(e2, l(e2, s2)) : t3;
}
}, d = function(e2, t3) {
return new Promise(function(n2, r2) {
var i2;
return (i2 = e2.data).cache && i2.store ? n2() : new Promise(function(e3, n3) {
return "function" == typeof i2.src ? i2.src(t3).then(e3, n3) : e3(i2.src);
}).then(function(t4) {
try {
return e2.feedback = i2.store = t4, f("response", e2), n2();
} catch (e3) {
return r2(e3);
}
}, r2);
});
}, h = function(e2, t3) {
var n2 = t3.data, r2 = t3.searchEngine, i2 = [];
n2.store.forEach(function(s3, u2) {
var a2 = function(n3) {
var o2 = n3 ? s3[n3] : s3, u3 = "function" == typeof r2 ? r2(e2, o2) : p(e2, o2, { mode: r2, diacritics: t3.diacritics, highlight: t3.resultItem.highlight });
if (u3) {
var a3 = { match: u3, value: s3 };
n3 && (a3.key = n3), i2.push(a3);
}
};
if (n2.keys) {
var c2, l2 = function(e3, t4) {
var n3 = "undefined" != typeof Symbol && e3[Symbol.iterator] || e3["@@iterator"];
if (!n3) {
if (Array.isArray(e3) || (n3 = o(e3)) || t4 && e3 && "number" == typeof e3.length) {
n3 && (e3 = n3);
var r3 = 0, i3 = function() {
};
return { s: i3, n: function() {
return r3 >= e3.length ? { done: true } : { done: false, value: e3[r3++] };
}, e: function(e4) {
throw e4;
}, f: i3 };
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var s4, u3 = true, a3 = false;
return { s: function() {
n3 = n3.call(e3);
}, n: function() {
var e4 = n3.next();
return u3 = e4.done, e4;
}, e: function(e4) {
a3 = true, s4 = e4;
}, f: function() {
try {
u3 || null == n3.return || n3.return();
} finally {
if (a3)
throw s4;
}
} };
}(n2.keys);
try {
for (l2.s(); !(c2 = l2.n()).done; )
a2(c2.value);
} catch (e3) {
l2.e(e3);
} finally {
l2.f();
}
} else
a2();
}), n2.filter && (i2 = n2.filter(i2));
var s2 = i2.slice(0, t3.resultsList.maxResults);
t3.feedback = { query: e2, matches: i2, results: s2 }, f("results", t3);
}, m = "aria-expanded", b = "aria-activedescendant", y = "aria-selected", v = function(e2, n2) {
e2.feedback.selection = t2({ index: n2 }, e2.feedback.results[n2]);
}, g = function(e2) {
e2.isOpen || ((e2.wrapper || e2.input).setAttribute(m, true), e2.list.removeAttribute("hidden"), e2.isOpen = true, f("open", e2));
}, w = function(e2) {
e2.isOpen && ((e2.wrapper || e2.input).setAttribute(m, false), e2.input.setAttribute(b, ""), e2.list.setAttribute("hidden", ""), e2.isOpen = false, f("close", e2));
}, O = function(e2, t3) {
var n2 = t3.resultItem, r2 = t3.list.getElementsByTagName(n2.tag), o2 = !!n2.selected && n2.selected.split(" ");
if (t3.isOpen && r2.length) {
var s2, u2, a2 = t3.cursor;
e2 >= r2.length && (e2 = 0), e2 < 0 && (e2 = r2.length - 1), t3.cursor = e2, a2 > -1 && (r2[a2].removeAttribute(y), o2 && (u2 = r2[a2].classList).remove.apply(u2, i(o2))), r2[e2].setAttribute(y, true), o2 && (s2 = r2[e2].classList).add.apply(s2, i(o2)), t3.input.setAttribute(b, r2[t3.cursor].id), t3.list.scrollTop = r2[e2].offsetTop - t3.list.clientHeight + r2[e2].clientHeight + 5, t3.feedback.cursor = t3.cursor, v(t3, e2), f("navigate", t3);
}
}, A = function(e2) {
O(e2.cursor + 1, e2);
}, k = function(e2) {
O(e2.cursor - 1, e2);
}, L = function(e2, t3, n2) {
(n2 = n2 >= 0 ? n2 : e2.cursor) < 0 || (e2.feedback.event = t3, v(e2, n2), f("selection", e2), w(e2));
};
function j(e2, n2) {
var r2 = this;
return new Promise(function(i2, o2) {
var s2, u2;
return s2 = n2 || ((u2 = e2.input) instanceof HTMLInputElement || u2 instanceof HTMLTextAreaElement ? u2.value : u2.innerHTML), function(e3, t3, n3) {
return t3 ? t3(e3) : e3.length >= n3;
}(s2 = e2.query ? e2.query(s2) : s2, e2.trigger, e2.threshold) ? d(e2, s2).then(function(n3) {
try {
return e2.feedback instanceof Error ? i2() : (h(s2, e2), e2.resultsList && function(e3) {
var n4 = e3.resultsList, r3 = e3.list, i3 = e3.resultItem, o3 = e3.feedback, s3 = o3.matches, u3 = o3.results;
if (e3.cursor = -1, r3.innerHTML = "", s3.length || n4.noResults) {
var c3 = new DocumentFragment();
u3.forEach(function(e4, n5) {
var r4 = a(i3.tag, t2({ id: "".concat(i3.id, "_").concat(n5), role: "option", innerHTML: e4.match, inside: c3 }, i3.class && { class: i3.class }));
i3.element && i3.element(r4, e4);
}), r3.append(c3), n4.element && n4.element(r3, o3), g(e3);
} else
w(e3);
}(e2), c2.call(r2));
} catch (e3) {
return o2(e3);
}
}, o2) : (w(e2), c2.call(r2));
function c2() {
return i2();
}
});
}
var S = function(e2, t3) {
for (var n2 in e2)
for (var r2 in e2[n2])
t3(n2, r2);
}, T = function(e2) {
var n2, r2, i2, o2 = e2.events, s2 = (n2 = function() {
return j(e2);
}, r2 = e2.debounce, function() {
clearTimeout(i2), i2 = setTimeout(function() {
return n2();
}, r2);
}), u2 = e2.events = t2({ input: t2({}, o2 && o2.input) }, e2.resultsList && { list: o2 ? t2({}, o2.list) : {} }), a2 = { input: { input: function() {
s2();
}, keydown: function(t3) {
!function(e3, t4) {
switch (e3.keyCode) {
case 40:
case 38:
e3.preventDefault(), 40 === e3.keyCode ? A(t4) : k(t4);
break;
case 13:
t4.submit || e3.preventDefault(), t4.cursor >= 0 && L(t4, e3);
break;
case 9:
t4.resultsList.tabSelect && t4.cursor >= 0 && L(t4, e3);
break;
case 27:
t4.input.value = "", w(t4);
}
}(t3, e2);
}, blur: function() {
w(e2);
} }, list: { mousedown: function(e3) {
e3.preventDefault();
}, click: function(t3) {
!function(e3, t4) {
var n3 = t4.resultItem.tag.toUpperCase(), r3 = Array.from(t4.list.querySelectorAll(n3)), i3 = e3.target.closest(n3);
i3 && i3.nodeName === n3 && L(t4, e3, r3.indexOf(i3));
}(t3, e2);
} } };
S(a2, function(t3, n3) {
(e2.resultsList || "input" === n3) && (u2[t3][n3] || (u2[t3][n3] = a2[t3][n3]));
}), S(u2, function(t3, n3) {
e2[t3].addEventListener(n3, u2[t3][n3]);
});
};
function E(e2) {
var n2 = this;
return new Promise(function(r2, i2) {
var o2, s2, u2;
if (o2 = e2.placeHolder, u2 = { role: "combobox", "aria-owns": (s2 = e2.resultsList).id, "aria-haspopup": true, "aria-expanded": false }, a(e2.input, t2(t2({ "aria-controls": s2.id, "aria-autocomplete": "both" }, o2 && { placeholder: o2 }), !e2.wrapper && t2({}, u2))), e2.wrapper && (e2.wrapper = a("div", t2({ around: e2.input, class: e2.name + "_wrapper" }, u2))), s2 && (e2.list = a(s2.tag, t2({ dest: [s2.destination, s2.position], id: s2.id, role: "listbox", hidden: "hidden" }, s2.class && { class: s2.class }))), T(e2), e2.data.cache)
return d(e2).then(function(e3) {
try {
return c2.call(n2);
} catch (e4) {
return i2(e4);
}
}, i2);
function c2() {
return f("init", e2), r2();
}
return c2.call(n2);
});
}
function x(e2) {
var t3 = e2.prototype;
t3.init = function() {
E(this);
}, t3.start = function(e3) {
j(this, e3);
}, t3.unInit = function() {
if (this.wrapper) {
var e3 = this.wrapper.parentNode;
e3.insertBefore(this.input, this.wrapper), e3.removeChild(this.wrapper);
}
var t4;
S((t4 = this).events, function(e4, n2) {
t4[e4].removeEventListener(n2, t4.events[e4][n2]);
});
}, t3.open = function() {
g(this);
}, t3.close = function() {
w(this);
}, t3.goTo = function(e3) {
O(e3, this);
}, t3.next = function() {
A(this);
}, t3.previous = function() {
k(this);
}, t3.select = function(e3) {
L(this, null, e3);
}, t3.search = function(e3, t4, n2) {
return p(e3, t4, n2);
};
}
return function e2(t3) {
this.options = t3, this.id = e2.instances = (e2.instances || 0) + 1, this.name = "autoComplete", this.wrapper = 1, this.threshold = 1, this.debounce = 0, this.resultsList = { position: "afterend", tag: "ul", maxResults: 5 }, this.resultItem = { tag: "li" }, function(e3) {
var t4 = e3.name, r2 = e3.options, i2 = e3.resultsList, o2 = e3.resultItem;
for (var s2 in r2)
if ("object" === n(r2[s2]))
for (var a2 in e3[s2] || (e3[s2] = {}), r2[s2])
e3[s2][a2] = r2[s2][a2];
else
e3[s2] = r2[s2];
e3.selector = e3.selector || "#" + t4, i2.destination = i2.destination || e3.selector, i2.id = i2.id || t4 + "_list_" + e3.id, o2.id = o2.id || t4 + "_result", e3.input = u(e3.selector);
}(this), x.call(this, e2), E(this);
};
}, module.exports = t();
})(autoComplete_min);
const autoComplete = autoComplete_min.exports;
(async function() {
const style = document.createElement("style");
style.innerHTML = ".autoComplete_wrapper{position:relative}.autoComplete_wrapper>input{height:3rem;width:370px;margin:0;padding:0 2rem 0 3.2rem;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;font-size:1rem;text-overflow:ellipsis;color:rgba(255,122,122,.3);outline:0;border-radius:10rem;border:.05rem solid rgba(255,122,122,.5);background-image:url(images/search.svg);background-size:1.4rem;background-position:left 1.05rem top .8rem;background-repeat:no-repeat;background-origin:border-box;background-color:#fff;transition:all .4s ease;-webkit-transition:all -webkit-transform .4s ease}.autoComplete_wrapper>input::placeholder{color:rgba(255,122,122,.5);transition:all .3s ease;-webkit-transition:all -webkit-transform .3s ease}.autoComplete_wrapper>input:hover::placeholder{color:rgba(255,122,122,.6);transition:all .3s ease;-webkit-transition:all -webkit-transform .3s ease}.autoComplete_wrapper>input:focus::placeholder{padding:.1rem .6rem;font-size:.95rem;color:rgba(255,122,122,.4)}.autoComplete_wrapper>input:focus::selection{background-color:rgba(255,122,122,.15)}.autoComplete_wrapper>input::selection{background-color:rgba(255,122,122,.15)}.autoComplete_wrapper>input:hover{color:rgba(255,122,122,.8);transition:all .3s ease;-webkit-transition:all -webkit-transform .3s ease}.autoComplete_wrapper>input:focus{color:rgba(255,122,122,1);border:.06rem solid rgba(255,122,122,.8)}.autoComplete_wrapper>ul{overflow-y:scroll;position:absolute;max-height:400px;box-sizing:border-box;left:0;margin:.5rem 0 0 0;padding:0;z-index:1000;list-style:none;border-radius:.6rem;background-color:#fff;border:1px solid rgba(33,33,33,.07);box-shadow:0 3px 6px rgba(149,157,165,.15);outline:0;transition:opacity .15s ease-in-out;-moz-transition:opacity .15s ease-in-out;-webkit-transition:opacity .15s ease-in-out}.autoComplete_wrapper>ul::-webkit-scrollbar{width:10px;height:10px;transition:1s}.autoComplete_wrapper>ul::-webkit-scrollbar-thumb{background-color:rgba(127,127,127,.6);background-clip:padding-box;border:2px solid transparent;border-radius:.6rem;transition:1s}.autoComplete_wrapper>ul::-webkit-scrollbar-thumb:horizontal:hover,.autoComplete_wrapper>ul::-webkit-scrollbar-thumb:vertical:hover{background-color:#6e6e6e;transition:.3s}.autoComplete_wrapper>ul:empty,.autoComplete_wrapper>ul[hidden]{display:block;opacity:0;transform:scale(0)}.autoComplete_wrapper>ul>li{margin:.3rem;padding:.3rem .5rem;text-align:left;font-size:1rem;color:#212121;border-radius:.35rem;background-color:rgba(255,255,255,1);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:all .2s ease}.autoComplete_wrapper>ul>li mark{background-color:transparent;color:#ff1e00;font-weight:700}.autoComplete_wrapper>ul>li:hover{cursor:pointer;background-color:rgba(255,122,122,.15)}.autoComplete_wrapper>ul>li[aria-selected=true]{background-color:rgba(255,122,122,.15)}@media only screen and (max-width:600px){.autoComplete_wrapper>input{width:18rem}}";
console.time("startup time");
let useUesrscript = false;
let debounce = 250;
let availableSite;
let korTags = [];
let danbooruTags = [];
if (typeof GM_fetch === "function") {
let serverCheck = function(site) {
return GM_fetch(site).then((res) => {
if (site.includes("danbooru"))
serverStatus += 1;
if (site.includes("hijiribe"))
serverStatus += 2;
if (site.includes("sonohara"))
serverStatus += 4;
}).catch((err) => console.log(`${site} \uC2E4\uD328`));
};
console.log("\uC720\uC800\uC2A4\uD06C\uB9BD\uD2B8 \uC0AC\uC6A9");
useUesrscript = true;
debounce = 100;
const siteList = {
danbooru: "https://danbooru.donmai.us/autocomplete.json",
hijiribe: "https://hijiribe.donmai.us/autocomplete.json",
sonohara: "https://sonohara.donmai.us/autocomplete.json"
};
let serverStatus = 0;
const promises = Object.values(siteList).map((site) => {
return serverCheck(site);
});
await Promise.allSettled(promises).then(() => {
console.log(`\uC11C\uBC84 \uD655\uC778 \uC644\uB8CC: ${serverStatus}`);
}).catch((err) => {
console.log(err);
});
switch (serverStatus) {
case 7:
case 5:
case 3:
case 1:
availableSite = siteList.danbooru;
console.log("\uB2E8\uBD80\uB8E8 \uC120\uD0DD");
break;
case 6:
case 2:
availableSite = siteList.hijiribe;
console.log("\uD788\uC9C0\uB9AC\uBCA0 \uC120\uD0DD");
break;
case 4:
availableSite = siteList.sonohara;
console.log("\uC18C\uB178\uD558\uB77C \uC120\uD0DD");
break;
case 0:
Swal.fire({
width: "40rem",
title: "\uC790\uB3D9\uC644\uC131 API \uC5F0\uACB0 \uC624\uB958",
html: `
<p>\uC544\uB798 3\uAC1C\uC758 \uC0AC\uC774\uD2B8\uC5D0 \uC811\uC18D\uD558\uC5EC </br>\uBD07 \uAC80\uC0AC\uB97C \uD1B5\uACFC\uD55C \uD6C4 \uC0AC\uC774\uD2B8\uAC00 \uD45C\uC2DC\uB418\uB294\uC9C0 \uD655\uC778 \uBC14\uB78D\uB2C8\uB2E4.</p>
<p><b>\uD55C \uAC1C\uC758 \uC0AC\uC774\uD2B8</b>\uB77C\uB3C4 \uC815\uC0C1\uC801\uC73C\uB85C \uD45C\uC2DC\uB41C\uB2E4\uBA74 \uC0C8\uB85C\uACE0\uCE68\uC744 \uD55C\uBC88 \uD558\uC138\uC694.</p>
<p>\uC0AC\uC774\uD2B8\uAC00 \uC815\uC0C1\uC801\uC73C\uB85C \uD45C\uC2DC\uB418\uB294\uB370 \uC774 \uCC3D\uC774 \uBCF4\uC774\uBA74 \uB313\uAE00\uB85C \uC54C\uB824\uC8FC\uC138\uC694.</p>
<a href="//danbooru.donmai.us" target='_blank'>danbooru</a></></br>
<a href="//hijiribe.donmai.us" target='_blank'>hijiribe</a></br>
<a href="//sonohara.donmai.us" target='_blank'>sonohara</a></br>
`
});
}
} else {
console.log("WebUI\uC5D0 \uC124\uCE58\uB428");
fetch(
"https://raw.githubusercontent.com/DominikDoom/a1111-sd-webui-tagcomplete/main/tags/danbooru.csv"
).then((res) => res.text()).then((result) => {
danbooruTags = csvToArray(result);
}).catch((err) => console.log(err));
}
fetch(
"https://gist.githubusercontent.com/Soochaehwa/1951b95690e810085b920e39ef73354a/raw/tags.txt"
).then((res) => res.json()).then((result) => korTags = result).catch((err) => console.log(err));
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
enumerableOnly && (symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
})), keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(target) {
for (var i = 1; i < arguments.length; i++) {
var source = null != arguments[i] ? arguments[i] : {};
i % 2 ? ownKeys(Object(source), true).forEach(function(key) {
_defineProperty(target, key, source[key]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(
target,
Object.getOwnPropertyDescriptors(source)
) : ownKeys(Object(source)).forEach(function(key) {
Object.defineProperty(
target,
key,
Object.getOwnPropertyDescriptor(source, key)
);
});
}
return target;
}
function create(tag, options) {
var el = typeof tag === "string" ? document.createElement(tag) : tag;
for (var key in options) {
var val = options[key];
if (key === "inside") {
val.append(el);
} else if (key === "dest") {
select$1(val[0]).insertAdjacentElement(val[1], el);
} else if (key === "around") {
var ref = val;
ref.parentNode.insertBefore(el, ref);
el.append(ref);
if (ref.getAttribute("autofocus") != null)
ref.focus();
} else if (key in el) {
el[key] = val;
} else {
el.setAttribute(key, val);
}
}
return el;
}
function mark(value, cls) {
return create(
"mark",
_objectSpread2(
{
innerHTML: value
},
typeof cls === "string" && {
class: cls
}
)
).outerHTML;
}
function csvToArray(csv) {
const rows = csv.split("\n");
return rows.map(function(row) {
return row.replaceAll("_", " ").split(",").shift();
});
}
function intToString(count) {
return Intl.NumberFormat("en-US", {
notation: "compact",
maximumFractionDigits: 1
}).format(count);
}
function attach(el) {
const autoCompleteJS = new autoComplete({
selector: () => {
return el;
},
searchEngine: (query, record) => {
record = String(record);
if (query.startsWith("#")) {
query = query.replace(/ /g, "");
var qLength = query.length;
var cursor = 0;
var match = Array.from(record).map(function(character, index) {
if (cursor < qLength && record[index] === query[cursor]) {
character = mark(character, true);
cursor++;
}
return character;
}).join("");
if (cursor === qLength)
return match;
} else {
var _match = record.indexOf(query);
if (~_match) {
query = record.substring(_match, _match + query.length);
_match = record.replace(query, mark(query, true));
return _match;
}
}
},
debounce,
data: {
src: async (query) => {
try {
let data = [];
let source;
if (!query.startsWith("#")) {
if (useUesrscript) {
source = await GM_fetch(
`${availableSite}?search%5Bquery%5D=${query}&search%5Btype%5D=tag_query&version=1&limit=10`
);
} else {
return danbooruTags;
}
const tagsObj = await source.json();
data = tagsObj.map((el2) => {
if (el2.antecedent)
return `${el2.antecedent.replaceAll("_", " ")} \u2192 ${el2.label} [${intToString(el2.post_count)}]`;
return `${el2.label} [${intToString(el2.post_count)}]`;
});
return data;
} else {
return korTags;
}
} catch (error) {
return error;
}
}
},
resultsList: {
maxResults: 15
},
query: (query) => {
const querySplit = query.split(",");
const lastQuery = querySplit.length - 1;
const newQuery = querySplit[lastQuery].trim();
return newQuery;
},
events: {
input: {
selection(event) {
if (!autoCompleteJS.isOpen)
return;
const feedback = event.detail;
const input = autoCompleteJS.input;
const selection = feedback.selection.value.trim().replace(/\s*\[\d*.?\d*K?M?\]/gm, "").replace(/.*→\s*/gm, "").replaceAll("(", "\\(").replaceAll(")", "\\)");
const query = input.value.split(",").map((item) => item.replace(/(^ *| *$)/gm, ""));
let newline = "";
const lastQuery = query[query.length - 1];
if (query.length > 1 && lastQuery.includes("\n")) {
const temp = lastQuery.replace(/\n/gm, "");
newline = lastQuery.replace(temp, "");
}
query.pop();
query.push(`${newline}${selection}`);
input.value = query.join(", ") + ", ";
},
keydown: (event) => {
switch (event.keyCode) {
case 40:
case 38:
if (!autoCompleteJS.isOpen)
return;
event.preventDefault();
event.keyCode === 40 ? autoCompleteJS.next() : autoCompleteJS.previous();
break;
case 13:
if (!autoCompleteJS.isOpen)
return;
if (!autoCompleteJS.submit)
event.preventDefault();
if (autoCompleteJS.cursor >= 0)
autoCompleteJS.select(event);
break;
case 27:
autoCompleteJS.close();
break;
}
}
}
}
});
}
onUiUpdate(function() {
const t2i = gradioApp().querySelector("#txt2img_prompt > label > textarea");
if (!t2i)
return;
const i2i = gradioApp().querySelector("#img2img_prompt > label > textarea");
if (!i2i)
return;
const negative = gradioApp().querySelectorAll(
"#negative_prompt > label > textarea"
);
if (!negative)
return;
gradioApp().appendChild(style);
attach(t2i);
attach(i2i);
negative.forEach((el) => {
attach(el);
});
console.log("end");
console.timeEnd("startup time");
});
})();
})();