sd-webui-oldsix-prompt/javascript/old_six_prompt.js

856 lines
22 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

let Elements;
const selectPrompts={}
function loadNodes() {
let Elements = {
prompt: getEle('#oldsix-prompt1'),
prompt2: getEle('#oldsix-prompt2'),
txt2img: getEle("#txt2img_prompt_container"),
img2img: getEle("#img2img_prompt_container"),
txtpromt: getEle('#txt2img_prompt textarea'),
txtnpromt: getEle('#txt2img_neg_prompt textarea'),
imgpromt: getEle('#img2img_prompt textarea'),
imgnpromt: getEle('#img2img_neg_prompt textarea'),
RdtxtAreasEn:getEleAll('#randomTextEn textarea'),
RdtxtAreasZh:getEleAll('#randomTextZh textarea'),
btnSends:getEleAll('.oldsix-btnSend'),
txtStart:getEleAll('.oldsix-txt-start textarea'),
txtEnd:getEleAll('.oldsix-txt-end textarea'),
trans:getEleAll('.old-six-traninput'),
tabtxt:getEle("#tab_txt2img"),
tabimg:getEle("#tab_img2img"),
autoComs:[],
btnReload:[],
btnClearP:[],
btnClearNP:[],
pClasses:[],
txtLeftLayout:getEle('#txt2img_results'),
imgLeftLayout:getEle('#img2img_results'),
txtul:null,
imgul:null
}
return Elements
}
let dicClass={
0:{},
1:{}
}
let tabButtonCss="svelte-1g805jl svelte-kqij2n"
let subClassBtnTitleCss="svelte-1ipelgc svelte-cmf5ev"
const loadTime=3000
function getEle(key) {
return gradioApp().querySelector(key)
}
function getEleAll(key) {
return gradioApp().querySelectorAll(key)
}
function CreateEle(type,parentDom,css,html){
let dom= document.createElement(type)
setCss(dom, css)
dom.innerHTML=html
parentDom.appendChild(dom)
return dom
}
function addPrompt(e) {
let dom=e.target;
let str= e.target.dataset.sixoldtit
let elementprompt =e.target.dataset.pageindex==1 ? Elements.imgpromt : Elements.txtpromt
dom.classList.toggle("active")
toggleNavCss(dom)
ishas=false;
for (const item of dom.classList) {
if(item=='active'){
ishas=true
}
}
if(!ishas){
//删除带权重
if(elementprompt.value.includes(str+':')){
const teststr=`${str},|\\(${str}:\\d+\\.\\d+\\),`
const regex =new RegExp(teststr);
console.log(regex.test(elementprompt.value));
elementprompt.value= elementprompt.value.replace(regex,'');
}
//删除
else{
elementprompt.value= elementprompt.value.replace(str+',','');
}
let selet=selectPrompts[dom.textContent]
if(selet){
selet.li.parentNode.removeChild(selet.li)
delete selectPrompts[dom.textContent]
}
return //
}
//添加
let ul =e.target.dataset.pageindex==1 ? Elements.imgul : Elements.txtul
let cn=dom.innerHTML
let en=str
addLi(ul,cn,en,dom)
updatatextToTextArea(elementprompt,en)
}
function addNPrompt(e) {
let elementprompt = e.target.dataset.pageindex==1 ? Elements.imgnpromt : Elements.txtnpromt
elementprompt.focus();
document.execCommand('insertText', false, e.target.dataset.sixoldtit + ',')
closeAotuCom()
}
function updatatextToTextArea(inputelem,val){
inputelem.value+=val+','
updateInput(inputelem)
closeAotuCom()
}
function closeAotuCom(){
if(Elements.autoComs.length<2){
Elements.autoComs=getEleAll(".autocompleteParent.p")
}
setTimeout(() => {
Elements.autoComs.forEach(element => {
element.style.display = "none";
})
}, 50)
}
function getParentBycss(obj,css) {
let parent=obj
for (let i = 0; i < 10; i++) {
parent=parent.parentNode
if(parent.classList.contains(css)){
return parent
}
}
return null
}
function toggleNavCss(dom){
let tabrow = getParentBycss(dom, 'tab-item')
let tabnav = tabrow.parentNode.previousSibling;
let activebtns = tabrow.querySelectorAll(".oldsix-btn.active")
let target = tabnav.children[tabrow.dataset.tabitem]
if (activebtns.length) {
target.classList.add("active")
}
else {
target.classList.remove("active")
}
}
async function getJsonStr() {
await new Promise(resolve => setTimeout(resolve, 1500));
let val1 = document.querySelector("#oldsix-area1 textarea").value
let val2 = document.querySelector("#oldsix-area2 textarea").value
return val1||val2
}
function clearTextarea(){
let elarea1= document.querySelector("#oldsix-area1 textarea")
let elarea2= document.querySelector("#oldsix-area2 textarea")
elarea1.value=''
elarea2.value=''
updateInput(elarea1)
updateInput(elarea2)
}
function createBtnTitle(name,val,parent,pageindex){
let div=document.createElement('div')
let btn=document.createElement('button')
setCss(div,'oldsix-row ')
setCss(btn,`oldsix-btn-tit sm primary gradio-button ${subClassBtnTitleCss}`)
btn.innerHTML=name
div.appendChild(btn)
parent.appendChild(div)
for (const key in val) {
if (typeof val[key] != 'object' ){
btn.addEventListener('click', function () {
addDicClasses(name, val, pageindex)
});
btn.addEventListener('contextmenu', function (e) {
e.preventDefault();
addDynamicToTextArea(btn, pageindex)
})
}
return div
}
return div
}
function addDynamicToTextArea(btnele,pageindex){
let btns= btnele.parentNode.querySelectorAll('.oldsix-btn')
if(btns.length){
let text='#['+btnele.textContent
text+=']';
let elementprompt =pageindex==1 ? Elements.imgpromt : Elements.txtpromt
elementprompt.focus();
document.execCommand('insertText', false, text + ',')
closeAotuCom()
}
}
function addDicClasses(key,val,pageindex)
{
if(dicClass[pageindex][key]){
return
}
let list=[]
for (const key in val) {
list.push({'key':key,'val':val[key]})
}
dicClass[pageindex][key]=list
CreateClassesBtn(key,pageindex)
}
function CreateClassesBtn(btnName,pageindex)
{
let btn=document.createElement('button')
setCss(btn,`sm secondary gradio-button ${subClassBtnTitleCss}`)
btn.innerHTML=btnName
Elements.pClasses[pageindex].appendChild(btn);
btn.addEventListener('click',function(){
btn.parentElement.removeChild(btn)
Reflect.deleteProperty(dicClass[pageindex], btnName);
})
}
function createBtnPrompt(key,val,parent,pageindex){
let btn=document.createElement('button')
setCss(btn,`sm secondary gradio-button oldsix-btn ${subClassBtnTitleCss}`)
btn.innerHTML=key
btn.dataset.sixoldtit=val
btn.dataset.pageindex=pageindex
parent.appendChild(btn)
btn.addEventListener('click',function(e){
addPrompt(e)
})
btn.addEventListener('contextmenu', function (e) {
e.preventDefault();
addNPrompt(e)
})
return btn
}
function traverse(obj,parent,pageindex) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
let resdom= createBtnTitle(key, obj[key],parent,pageindex)
traverse(obj[key],resdom,pageindex);
} else {
createBtnPrompt(key,obj[key],parent,pageindex)
}
}
}
}
function setCss(dom, css) {
dom.setAttribute("class", css)
}
function tabClick(self){
let selfdivs=self.parentNode.children
let contents=self.parentNode.nextSibling.children
let index=self.dataset.tabitem
for (let i = 0; i < selfdivs.length; i++) {
if(i==index){
contents[i].classList.remove('six-hide')
selfdivs[i].classList.add('selected')
}
else{
contents[i].classList.add('six-hide')
selfdivs[i].classList.remove('selected')
}
}
}
function reloadNodes(jsonstring, btnreloadDom) {
let jsonObj = JSON.parse(jsonstring)
let tabs = document.createElement('div')
let tabnav = document.createElement('div')
let contentContainer=document.createElement('div')
let count=0
Object.keys(jsonObj).forEach(function (key) {
let tabbtn=CreateEle('button',tabnav,tabButtonCss,key)
tabbtn.dataset.tabitem=count
tabbtn.addEventListener('click',()=>{
tabClick(tabbtn)
})
let tabitem=CreateEle('div',contentContainer,'tab-item six-hide','')
tabitem.dataset.tabitem=count
let content=CreateEle('div',tabitem,'oldsix-content','')
if(count==0){
tabbtn.classList.add('selected')
tabitem.classList.remove('six-hide')
}
traverse(jsonObj[key],content,btnreloadDom.dataset.page)
count++
});
setCss(tabs, `oldsix-tabs gradio-tabs ${tabButtonCss}`)
setCss(tabnav, `oldsix-tab-nav scroll-hide ${tabButtonCss}`)
setCss(contentContainer, 'tab-container')
tabs.appendChild(tabnav)
tabs.appendChild(contentContainer)
btnreloadDom.parentNode.parentNode.appendChild(tabs)
}
async function loadCustomUI(callback){
let jsonstr= await getJsonStr()
if (jsonstr) {
reloadNodes(jsonstr, Elements.btnReload[0])
reloadNodes(jsonstr, Elements.btnReload[1])
clearTextarea()
}
callback&&callback()
}
function reloadUI(){
divs= document.querySelectorAll('.oldsix-tabs')
divs.forEach(item=>{
item.remove()
})
loadCustomUI()
}
function move(){
Elements = loadNodes()
Elements.txt2img.appendChild(Elements.prompt)
Elements.img2img.appendChild(Elements.prompt2)
let checkboxParents= getEleAll('.oldsix-checklock')
checkboxParents.forEach(item=>{
item.parentElement.classList.add('oldsix-inline')
})
Elements.trans.forEach((item,index)=>{
item.classList.remove('block')
let ul=CreateEle('ul',item,'oldsix-ul','')
if(!index){
Elements.txtul=ul
}
else{
Elements.imgul=ul
}
item.onmousedown = function(event) {
let istriggel=event.target.classList.contains("old-six-traninput");
if(!istriggel)return
// 获取div当前的x和y坐标
var x = event.clientX - item.offsetLeft;
var y = event.clientY - item.offsetTop;
item.style.cursor = 'grabbing';
document.onmousemove = function(event) {
// 获取鼠标当前的位置
var newX = event.clientX - x;
var newY = event.clientY - y;
// 设置div的新位置
item.style.left = newX + 'px';
item.style.top = newY + 'px';
};
document.onmouseup = function() {
// 当鼠标松开时移除mousemove和mouseup事件以防止继续拖动
item.style.cursor = 'grab';
document.onmousemove = null;
document.onmouseup = null;
};
};
})
getEle("#tab_txt2img").appendChild(Elements.trans[0])
getEle("#tab_img2img").appendChild(Elements.trans[1])
}
function clearPrompt(pageindex){
let textarea, container,ul
if(pageindex==0){
textarea=Elements.txtpromt;
container=Elements.prompt
ul=Elements.txtul
}else{
textarea=Elements.imgpromt;
container=Elements.prompt2
ul=Elements.imgul
}
textarea.value='';
let tabs=container.querySelector(".oldsix-tab-nav").children
let btns=container.querySelectorAll(".oldsix-btn.active")
for (const item of tabs) {
item.classList.remove('active')
}
btns.forEach(btn=>{
btn.classList.remove('active')
})
ul.innerHTML=''
}
function clearNPrompt(pageindex){
let textarea=pageindex=='1'?Elements.imgnpromt:Elements.txtnpromt;
textarea.value='';
}
function loadClearbtn(){
let btns1= Elements.prompt.querySelectorAll('.oldsix-clear')
let btns2= Elements.prompt2.querySelectorAll('.oldsix-clear')
btns1.forEach(item=>item.dataset.page='0')
btns2.forEach(item=>item.dataset.page='1')
Elements.btnClearP.push(btns1[0])
Elements.btnClearP.push(btns2[0])
Elements.btnClearNP.push(btns1[1])
Elements.btnClearNP.push(btns2[1])
Elements.btnClearP.forEach(item=>{
item.addEventListener('click',function(e){
clearPrompt(item.dataset.page)
})
});
Elements.btnClearNP.forEach(item=>{
item.addEventListener('click',function(e){
clearNPrompt(item.dataset.page)
})
})
}
function ranDomPropt(pageindex){
let texten=''
let textzh=''
for (const key in dicClass[pageindex]) {
let listcount=dicClass[pageindex][key].length
let rdindex=GetRandomNum(listcount)
let rdtarget=dicClass[pageindex][key][rdindex]
texten+=rdtarget.val+','
textzh+=rdtarget.key+','
}
Elements.RdtxtAreasZh[pageindex].value=textzh
Elements.RdtxtAreasEn[pageindex].value=texten
}
function GetRandomNum(Max) {
return Math.floor(Math.random() * Max);
}
function initBtnsEvent(){
Elements.pClasses=document.querySelectorAll('.oldsix-classes-shop')
Elements.btnReload= document.querySelectorAll('.oldsix-reload');
Elements.btnRandoms= document.querySelectorAll('.btn-crandom');
Elements.btnRandoms.forEach((item,index) => {
item.addEventListener('click', () => {
ranDomPropt(index)
})
})
Elements.btnReload.forEach((item,index) => {
item.dataset.page=index
item.addEventListener('click', () => {
reloadUI()
})
})
Elements.pClasses=document.querySelectorAll('.oldsix-classes-shop')
Elements.btnReload= document.querySelectorAll('.oldsix-reload');
Elements.btnRandoms= document.querySelectorAll('.btn-crandom');
Elements.btnRandoms.forEach((item,index) => {
item.addEventListener('click', () => {
ranDomPropt(index)
})
})
Elements.btnReload.forEach((item,index) => {
item.dataset.page=index
item.addEventListener('click', () => {
reloadUI()
})
})
Elements.btnSends.forEach((item,index) => {
item.addEventListener('click', () => {
let elementprompt=index==1 ? Elements.imgpromt : Elements.txtpromt
elementprompt.value=''
elementprompt.focus();
let str=Elements.RdtxtAreasEn[index].value
str=Elements.txtStart[index].value+str+Elements.txtEnd[index].value
document.execCommand('insertText', false,str);
closeAotuCom()
})
})
}
function getChineseIndex(str) {
let matches = str.match(/[\u4e00-\u9fa5]/g);
return matches ? matches.length : 0;
}
function translateText(text){
debugger
text=JSON.parse(text)
let ul=isTxtPage()? Elements.txtul : Elements.imgul;
let elementprompt=getCurrentPromptsEle()
if(text.origintext.includes("#[")||text.origintext.includes("<lora")) {
addLi(ul,text.origintext,text.origintext)
updatatextToTextArea(elementprompt,text.origintext)
return
}
if(!text||!text.translate) return
let cn,en
let translate=text.translate.replaceAll('',',')
let origintext=text.origintext.replaceAll('',',')
if(getChineseIndex(translate)>getChineseIndex(origintext)){
cn=translate
en=origintext
}
else{
cn=origintext
en=translate
}
if(cn){
let arrcn=cn.split(',').filter(Boolean);
let arren=en.split(',').filter(Boolean);
for (let i = 0; i < arrcn.length; i++) {
addLi(ul,arrcn[i].trim(),arren[i].trim().toLowerCase())
}
updatatextToTextArea(elementprompt,en.toLowerCase())
}
}
function addLi(parent,cn,en,btn=null){
let li=CreateEle('li',parent,'','')
li.setAttribute("draggable",'true')
let data={
en,
w:1.0,
btn,
li,
}
if(!btn){
if(~en.indexOf(':')){
let splitstartIndex=en.lastIndexOf(':')
data.w=en.substring(splitstartIndex+1, en.length-1);
}
}
li.dataset.en=en
selectPrompts[cn]={...data}
let calculate =CreateEle('span',li,'alculate','')
let addw =CreateEle('span',calculate,'add','+')
let subw =CreateEle('span',calculate,'sub','-')
let content =CreateEle('span',li,'content',cn)
let close =CreateEle('span',li,'close','x')
close.onclick=function(e){
e.stopPropagation();
delLi(li,cn)
}
addw.onclick = function (e) {
e.stopPropagation();
ModifyWeidht(li,cn)
}
subw.onclick = function (e) {
e.stopPropagation();
ModifyWeidht(li,cn,false)
}
li.onmouseover=function(){
hoverLi(li.dataset.en)
}
li.onmouseout=function(){
let textarea =getCurrentPromptsEle()
textarea.selectionStart = 0;
textarea.selectionEnd = 0;
}
li.addEventListener('dragstart', handleDragStart, false);
li.addEventListener('dragleave', handleDragLeave, false);
li.addEventListener('dragend', handleDragEnd, false);
}
var dragSrcEl = null;
var initialX;
var dragTarget;
function handleDragStart(e) {
dragSrcEl = this;
initialX=e.clientX;
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('text/html', this.outerHTML);
}
function handleDragLeave(e) {
let target = this;
if (target !== dragSrcEl && target.tagName === 'LI') {
const currentX = e.clientX;
const deltaX = currentX - initialX;
if (deltaX > 0) {
// 向右拖动
target.after(dragSrcEl)
} else if (deltaX < 0) {
target.before(dragSrcEl)
}
dragTarget=target
}
}
function getguid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0,
v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
function handleDragEnd(e) {
let targetTex=dragTarget.dataset.en;
let originText=dragSrcEl.dataset.en;
let guid=getguid()
let textarea =getCurrentPromptsEle()
let temptext=textarea.value;
console.log(temptext);
temptext=temptext.replace(targetTex,guid)
temptext=temptext.replace(originText,targetTex)
temptext=temptext.replace(guid,originText)
textarea.value=temptext
updateInput(textarea)
}
function preciseAddOrSub(a, b,isadd=true) {
let scale = 1e12; // 选取一个适当的缩放因子
if(isadd){
return (a * scale + b * scale) / scale;
}
return (a * scale - b * scale) / scale;
}
//isAdd 加权重
function ModifyWeidht(domli,cnkey,isAdd=true){
let selectObj = selectPrompts[cnkey]
let oldw = selectObj.w
if (isAdd&&oldw >= 2 ) return
if (!isAdd&&oldw <=0.1) return
let domcontent=domli.querySelector('.content')
selectObj.w=preciseAddOrSub(selectObj.w,0.1,isAdd)
let newen=selectObj.en
let newcn=domcontent.textContent
if(~selectObj.en.indexOf('<lora')) {
newen=selectObj.en.replace(':'+oldw,':'+selectObj.w)
newcn=newcn.replace(':'+oldw,':'+selectObj.w)
}
else if(oldw!=1){
if(selectObj.w==1){
newen = selectObj.en.replace("(", "").replace(")", "").replace(":" + oldw, "")
newcn = cnkey.replace("(", "").replace(")", "").replace(":" + oldw, "")
}
else{
newen=selectObj.en.replace(oldw,selectObj.w)
newcn=newcn.replace(oldw,selectObj.w)
}
}
else if(oldw==1) {
newen=`(${newen}:${selectObj.w})`
newcn=`(${newcn}:${selectObj.w})`
}
domcontent.textContent=newcn
let elepormpt=getCurrentPromptsEle()
elepormpt.value=elepormpt.value.replace(selectObj.en,newen)
selectObj.en=newen
domli.dataset.en=newen
}
function delLi(domli,cnkey){
let btn=selectPrompts[cnkey].btn
if(btn){
btn.classList.toggle("active")
toggleNavCss(btn)
}
let elementprompt =getCurrentPromptsEle()
elementprompt.value= elementprompt.value.replace(selectPrompts[cnkey].en+',','');
domli.parentNode.removeChild(domli)
delete selectPrompts[cnkey]
}
function hoverLi(searchText) {
let textarea =getCurrentPromptsEle()
const text = textarea.value;
// 寻找 searchText 在文本中的位置
const startIndex = text.indexOf(searchText);
if (startIndex !== -1) {
const endIndex = startIndex + searchText.length;
// 设置选择范围
textarea.selectionStart = startIndex;
textarea.selectionEnd = endIndex;
// 让文本框获取焦点
textarea.focus();
return[startIndex,endIndex]
}
return null
}
function isTxtPage(){
return window.getComputedStyle(Elements.tabtxt).display=='block'
}
function getCurrentPromptsEle(){
let res=isTxtPage();
let el=res?Elements.txtpromt:Elements.imgpromt
return el
}
function initTrans(){
document.addEventListener('keydown', function (event) {
if (event.key === 'Alt') {
event.preventDefault()
let txtdisplay = window.getComputedStyle(Elements.tabtxt).display;
let imgdisplay = window.getComputedStyle(Elements.tabimg).display;
if (txtdisplay === 'block') {
Elements.trans[0].classList.toggle('six-hide')
Elements.trans[0].querySelector('textarea').focus()
}
if (imgdisplay === 'block') {
Elements.trans[1].classList.toggle('six-hide')
Elements.trans[1].querySelector('textarea').focus()
}
}
});
}
onUiLoaded(()=> {
initData()
})
function initData(){
move()
loadClearbtn()
initBtnsEvent()
loadCustomUI()
initTrans()
}