ataname
// ==UserScript==
// @name cytube-soundemote-complement
// @namespace
// @version 0.2
// @description ataname
// @author nemota
// @match https://cytube.xyz/r/*
// @grant none
// ==/UserScript==
//Synchtube Premiumに依存します
setTimeout(soundComp, 3000);
function soundComp() {
var $chatline=document.getElementById("chatline");
//補完対象の文字列
var wordsArray=Object.keys(SoundFiltersArray);
//二分探索のためにソート
wordsArray.sort();
$chatline.addEventListener("keydown",function (event) {
if (event.code!="Tab") {return;}
//ここ以下Tabキーが押されたときのみ実行
var oldchat=$chatline.value;
var newchat=oldchat;
for(var i=0;i<oldchat.length;i++){
var searchResult=wordSearch(oldchat.substring(i));
if (searchResult.foundString) {//ただ一つ見つかったものがあれば
newchat+=searchResult.foundString.substring(oldchat.length-i);
}
if (!searchResult.keepSearch) {
break;
}
}
$chatline.value=newchat.substring(0,240);
});
function wordSearch(key){
var index=Math.floor(wordsArray.length/2);//配列内の今見ている位置
var diff=Math.floor(wordsArray.length/2);//大小によって移動する幅
while (true){//二分探索
diff= diff/2<1 ? 1 : Math.floor(diff/2);
if(wordsArray[index-1]>=key){
index-=diff;
}else if(wordsArray[index]<key){
index+=diff;
}else{
//indexが、key以上の最小の文字列を示すようになったら
break;
}
if(index>=wordsArray.length){
//どの単語よりもkeyが大きかったら
return {keepSearch:true,foundString:""};
}
}
if(wordsArray[index].indexOf(key)==0){
if(index==wordsArray.length-1||wordsArray[index+1].indexOf(key)!=0){
//ただ一つ合致するものが見つかったら
return {keepSearch:false,foundString:wordsArray[index]};
}else{
//ニつ以上合致するものが見つかったら
return {keepSearch:false,foundString:""};
}
}else{
return {keepSearch:true,foundString:""};
}
}
}