|
|
|
|
|
|
|
|
|
|
|
|
|
const core = [ |
|
"#txt2img_prompt > label > textarea", |
|
"#img2img_prompt > label > textarea", |
|
"#txt2img_neg_prompt > label > textarea", |
|
"#img2img_neg_prompt > label > textarea" |
|
]; |
|
|
|
|
|
const thirdParty = { |
|
"dataset-tag-editor": { |
|
"base": "#tab_dataset_tag_editor_interface", |
|
"hasIds": false, |
|
"selectors": [ |
|
"Caption of Selected Image", |
|
"Interrogate Result", |
|
"Edit Caption", |
|
"Edit Tags" |
|
] |
|
}, |
|
"image browser": { |
|
"base": "#tab_image_browser", |
|
"hasIds": false, |
|
"selectors": [ |
|
"Filename keyword search", |
|
"EXIF keyword search" |
|
] |
|
}, |
|
"tab_tagger": { |
|
"base": "#tab_tagger", |
|
"hasIds": false, |
|
"selectors": [ |
|
"Additional tags (split by comma)", |
|
"Exclude tags (split by comma)" |
|
] |
|
}, |
|
"tiled-diffusion-t2i": { |
|
"base": "#txt2img_script_container", |
|
"hasIds": true, |
|
"onDemand": true, |
|
"selectors": [ |
|
"[id^=MD-t2i][id$=prompt] textarea", |
|
"[id^=MD-t2i][id$=prompt] input[type='text']" |
|
] |
|
}, |
|
"tiled-diffusion-i2i": { |
|
"base": "#img2img_script_container", |
|
"hasIds": true, |
|
"onDemand": true, |
|
"selectors": [ |
|
"[id^=MD-i2i][id$=prompt] textarea", |
|
"[id^=MD-i2i][id$=prompt] input[type='text']" |
|
] |
|
} |
|
} |
|
|
|
function getTextAreas() { |
|
|
|
let textAreas = [...gradioApp().querySelectorAll(core.join(", "))]; |
|
|
|
for (const [key, entry] of Object.entries(thirdParty)) { |
|
if (entry.hasIds) { |
|
textAreas = textAreas.concat([...gradioApp().querySelectorAll(entry.selectors.join(", "))]); |
|
} else { |
|
let base = gradioApp().querySelector(entry.base); |
|
|
|
|
|
if (!base) continue; |
|
|
|
let allTextAreas = [...base.querySelectorAll("textarea, input[type='text']")]; |
|
|
|
|
|
let matchingTextAreas = allTextAreas.filter(ta => [...ta.parentElement.childNodes].some(x => entry.selectors.includes(x.innerText))); |
|
textAreas = textAreas.concat(matchingTextAreas); |
|
} |
|
}; |
|
|
|
return textAreas; |
|
} |
|
|
|
function addOnDemandObservers(setupFunction) { |
|
for (const [key, entry] of Object.entries(thirdParty)) { |
|
if (!entry.onDemand) continue; |
|
|
|
let base = gradioApp().querySelector(entry.base); |
|
if (!base) continue; |
|
|
|
let accordions = [...base?.querySelectorAll(".gradio-accordion")]; |
|
if (!accordions) continue; |
|
|
|
accordions.forEach(acc => { |
|
let accObserver = new MutationObserver((mutationList, observer) => { |
|
for (const mutation of mutationList) { |
|
if (mutation.type === "childList") { |
|
let newChildren = mutation.addedNodes; |
|
if (!newChildren) { |
|
accObserver.disconnect(); |
|
continue; |
|
} |
|
|
|
newChildren.forEach(child => { |
|
if (child.classList.contains("gradio-accordion") || child.querySelector(".gradio-accordion")) { |
|
let newAccordions = [...child.querySelectorAll(".gradio-accordion")]; |
|
newAccordions.forEach(nAcc => accObserver.observe(nAcc, { childList: true })); |
|
} |
|
}); |
|
|
|
if (entry.hasIds) { |
|
[...gradioApp().querySelectorAll(entry.selectors.join(", "))].forEach(x => setupFunction(x)); |
|
} else { |
|
let base = gradioApp().querySelector(entry.base); |
|
|
|
|
|
if (!base) continue; |
|
|
|
let allTextAreas = [...base.querySelectorAll("textarea, input[type='text']")]; |
|
|
|
|
|
let matchingTextAreas = allTextAreas.filter(ta => [...ta.parentElement.childNodes].some(x => entry.selectors.includes(x.innerText))); |
|
matchingTextAreas.forEach(x => setupFunction(x)); |
|
} |
|
} |
|
} |
|
}); |
|
accObserver.observe(acc, { childList: true }); |
|
}); |
|
}; |
|
} |
|
|
|
const thirdPartyIdSet = new Set(); |
|
|
|
function getTextAreaIdentifier(textArea) { |
|
let txt2img_p = gradioApp().querySelector('#txt2img_prompt > label > textarea'); |
|
let txt2img_n = gradioApp().querySelector('#txt2img_neg_prompt > label > textarea'); |
|
let img2img_p = gradioApp().querySelector('#img2img_prompt > label > textarea'); |
|
let img2img_n = gradioApp().querySelector('#img2img_neg_prompt > label > textarea'); |
|
|
|
let modifier = ""; |
|
switch (textArea) { |
|
case txt2img_p: |
|
modifier = ".txt2img.p"; |
|
break; |
|
case txt2img_n: |
|
modifier = ".txt2img.n"; |
|
break; |
|
case img2img_p: |
|
modifier = ".img2img.p"; |
|
break; |
|
case img2img_n: |
|
modifier = ".img2img.n"; |
|
break; |
|
default: |
|
|
|
|
|
if (!thirdPartyIdSet.has(textArea)) |
|
thirdPartyIdSet.add(textArea); |
|
|
|
modifier = `.thirdParty.ta${[...thirdPartyIdSet].indexOf(textArea)}`; |
|
break; |
|
} |
|
return modifier; |
|
} |