Bilibili-Evolved/utils/gui-settings/settings-search.js
2019-05-10 23:20:03 +08:00

68 lines
2.2 KiB
JavaScript

export class SettingsSearch
{
constructor()
{
this.input = document.querySelector(".gui-settings-search");
const items = [...document.querySelectorAll(".gui-settings-content>ul>li")];
const ifCategory = condition => item => item.classList.contains("category") === condition;
this.categories = items.filter(ifCategory(true));
this.items = items.filter(ifCategory(false));
this.importToolTips().then(() => this.input.addEventListener("input", () => this.keywordChange()));
}
async importToolTips()
{
if (typeof getI18nKey === "undefined")
{
console.error("请更新脚本后再使用设置搜索功能.");
return;
}
const { toolTips } = await import(`settings-tooltip.${getI18nKey()}`);
this.toolTips = toolTips;
}
keywordChange()
{
const value = this.input.value.trim();
if (!value)
{
this.categories.concat(this.items).forEach(it => it.classList.add("folded"));
return;
}
this.items.forEach(item =>
{
const key = item.querySelector("input").getAttribute("key");
const texts = Resource.displayNames[key] + this.toolTips.get(key).replace(/<.*>|<\/.*>/g, "");
if (texts.includes(value))
{
item.classList.remove("folded");
}
else
{
item.classList.add("folded");
}
});
this.foldCategories();
}
foldCategories()
{
for (const category of this.categories)
{
function fold()
{
let item = category.nextElementSibling;
while (item !== null && !item.classList.contains("category"))
{
if (!item.classList.contains("folded"))
{
return "remove";
}
item = item.nextElementSibling;
}
return "add";
}
category.classList[fold()]("folded");
}
}
}
export default {
export: { SettingsSearch },
};