// ==UserScript==
// @name Danbooru Tags Select to Export (EDITED)
// @version 0.2.12
// @description Select specified tags and copy to clipboard, for Stable Diffusion WebUI or NovelAI to use.
// @author FSpark/ScriptAnon
// @require https://code.jquery.com/jquery-3.6.1.min.js
// @match https://gelbooru.com/index.php?page=post&s=view&id=*
// @match https://danbooru.donmai.us/posts/*
// @match https://e621.net/posts/*
// @match https://rule34.xxx/index.php?page=post&s=view&id=*
// @match https://rule34.paheal.net/post/view/*
// @match https://furry.booru.org/index.php?page=post&s=view&id=*
// @match https://e926.net/posts/*
// @match https://booru.allthefallen.moe/posts/*
// @match https://tbib.org/index.php?page=post&s=view&id=*
// @match https://aibooru.online/posts/*
// @match https://lolibooru.moe/post/show/*
// @grant GM_setClipboard
// @grant GM_notification
// @license AGPL-3.0/MIT
// @namespace https://greasyfork.org/users/972837
// ==/UserScript==
(function () {
'use strict';
let Container = document.createElement('div');
Container.id = "tags-exporter-container";
Container.innerHTML =`<button id="select_all">Select All</button>
<button id="select_none">Select None</button>
<button id="invert_select">Invert Select</button>
<button id="export">Export</button>
`;
function insertAfter(newNode, referenceNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
let hot_key = "`"; // edit to change hotkey
let remove_commas = false; // set to false to include commas
let remove_underscores = true; // set to false to include underscore
let remove_parentheses = true; // set to false to include parentheses
if (window.location.href.includes("/danbooru.donmai.us") || window.location.href.includes("/aibooru.online") || window.location.href.includes("/booru.allthefallen.moe"))
{
get_dan_tags();
}
if (window.location.href.includes("/gelbooru.com"))
{
get_gel_tags();
}
if (window.location.href.includes("/e621.net"))
{
get_e621_tags();
}
if (window.location.href.includes("/e926.net"))
{
get_e926_tags();
}
if (window.location.href.includes("/rule34.paheal.net"))
{
get_rule34paheal_tags();
}
if (window.location.href.includes("/rule34.xxx")||(window.location.href.includes("/lolibooru.moe")))
{
get_rule34xxx_tags();
};
if (window.location.href.includes("/furry.booru.org")||(window.location.href.includes("/tbib.org")))
{
get_furrybooru_tags();
}
function get_gel_tags() {
insertAfter( Container, document.querySelector("#container > section"));
let elms = ["tag-type-general", "tag-type-character", "tag-type-metadata", "tag-type-artist", "tag-type-copyright"];
elms.forEach(tag => {
Array.from(document.getElementsByClassName(tag)).forEach(e => {
let chk = document.createElement('input');
chk.type="checkbox";
chk.name="general-tags";
chk.value=e.children[1].textContent.replaceAll("_"," ");
e.insertBefore(chk,e.children[0]);
})
});
}
function get_dan_tags() {
insertAfter( Container, document.querySelector("#tag-list"));
let elms = ["general-tag-list", "character-tag-list", "meta-tag-list", "artist-tag-list", "copyright-tag-list"];
elms.forEach(tag => {
Array.from(document.getElementsByClassName(tag)).forEach(e => {
if (e.tagName == "UL") {
Array.from(e.getElementsByClassName("search-tag")).forEach(s => {
let chk = document.createElement('input');
chk.type="checkbox";
chk.name="general-tags";
console.log(s.parentNode);
console.log(s.parentNode.dataset);
chk.value=s.parentNode.dataset.tagName.replaceAll("_"," ");
s.parentNode.insertBefore(chk,s.parentNode.firstChild);
})
}
})
});
}
function get_e621_tags() {
insertAfter( Container, document.querySelector("#tag-list"));
let elms = ["artist-tag-list", "species-tag-list", "general-tag-list"];
let iprompt = [];
elms.forEach(tag => {
Array.from(document.getElementsByClassName(tag)).forEach(e => {
if (e.tagName == "UL") {
Array.from(e.getElementsByClassName("search-tag")).forEach(s => {
let chk = document.createElement('input');
chk.type="checkbox";
chk.name="general-tags";
chk.value=s.textContent.replaceAll("_"," ");
s.parentNode.insertBefore(chk,s.parentNode.firstChild);
})
}
})
});
}
function get_e926_tags() {
insertAfter( Container, document.querySelector("#tag-list"));
let elms = ["artist-tag-list", "copyright-tag-list", "character-tag-list", "species-tag-list", "general-tag-list","lore-tag-list"];
let iprompt = [];
elms.forEach(tag => {
Array.from(document.getElementsByClassName(tag)).forEach(e => {
if (e.tagName == "UL") {
Array.from(e.getElementsByClassName("search-tag")).forEach(s => {
let chk = document.createElement('input');
chk.type="checkbox";
chk.name="general-tags";
chk.value=s.textContent.replaceAll("_"," ");
s.parentNode.insertBefore(chk,s.parentNode.firstChild);
})
}
})
});
}
function get_rule34paheal_tags() {
insertAfter( Container, document.querySelector("#Post_Controlsleft > h3"));
let elms = ["tag_name_cell"];
elms.forEach(tag => {
Array.from(document.getElementsByClassName(tag)).forEach(e => {
Array.from(e.getElementsByClassName("tag_name")).forEach(s => {
let elm = s.parentNode.parentNode.firstChild;
let chk = document.createElement('input');
chk.type="checkbox";
chk.name="general-tags";
chk.value=s.textContent.replaceAll("_"," ");
s.parentNode.parentNode.insertBefore(chk,elm);
})
})
});
}
function get_furrybooru_tags() {
insertAfter( Container, document.querySelector("#tag-sidebar"));
let elms = ["tag-type-general", "tag-type-character", "tag-type-metadata", "tag-type-artist", "tag-type-copyright"];
elms.forEach(tag => {
Array.from(document.getElementsByClassName(tag)).forEach(e => {
//console.log(e);
let chk = document.createElement('input');
chk.type="checkbox";
chk.name="general-tags";
console.log(e.children[0].textContent);
chk.value=e.children[0].textContent.replaceAll("_"," ");
e.insertBefore(chk,e.children[0]);
})
});
}
function get_rule34xxx_tags() {
let elm = document.getElementById("tag-sidebar");
let pattern = /(^\d)|(\s)|([[A-Za-z])/g;
let iprompt = [];
insertAfter( Container, elm);
let children = elm.children;
Array.from(children).forEach(li => {
console.log(li);
if (li.innerText == "Character" || li.innerText == "Artist" || li.innerText == "General")
{
} else
{
var tag = li.innerText.replace("?", "").trim();
var tagarray = tag.match(pattern).toString().replaceAll(",", "").trim();
let chk = document.createElement('input');
chk.type="checkbox";
chk.name="general-tags";
chk.value=tagarray.replaceAll("_"," ");
li.insertBefore(chk,li.firstChild)
}
});
}
document.getElementById("select_all").onclick=function(){
var items=document.getElementsByName("general-tags");
for(var i=0;i<items.length;i++){
items[i].checked=true;
}
};
document.getElementById("select_none").onclick=function(){
var items=document.getElementsByName("general-tags");
for(var i=0;i<items.length;i++){
items[i].checked=false;
}
};
document.getElementById("invert_select").onclick=function(){
var items=document.getElementsByName("general-tags");
for(var i=0;i<items.length;i++){
items[i].checked==true?items[i].checked=false:items[i].checked=true;
}
};
document.getElementById("export").onclick=function(){
let tags=[]
document.querySelectorAll("[name='general-tags']:checked").forEach((e)=>{tags.push(e.value)})
let res=tags.join(", ")
GM_setClipboard(res)
GM_notification(`${tags.length} tag(s) were copied.`,"Danbooru Tags Exporter")
};
})();