obsidian-douban/src/org/wanxp/douban/setting/DoubanSettingTab.ts
callmer00t d35dcfe513 feat: 支持自定义数组字段长度限制
为豆瓣拉取内容中数组类型的字段(actor、director、author、translator、aliases、menu 等)
新增按内容类型可配置的最大数量限制, 解决电影演员等列表过长导致笔记冗余的问题。

- 新增设置项 arrayLengthLimits, 支持按 type(电影/电视剧/书籍/音乐/游戏/笔记/戏剧/全部)
  + field + limit 三元组进行配置
- 在 VariableUtil.replaceSubject 中央渲染入口集中截断, 自动覆盖所有类型的所有数组字段
- 在设置面板新增 "数组限制" 页签, 提供添加/删除/编辑 UI
- 同字段同时存在 type=all 和具体类型时取较小限制值
- 新增对应中英文文案
2026-05-19 20:21:20 +08:00

85 lines
3.4 KiB
TypeScript

import {App, PluginSettingTab, Setting} from "obsidian";
import DoubanPlugin from "../../main";
import SettingsManager from "./SettingsManager";
import { constructOutUI } from "./OutputSettingsHelper";
import { constructTemplateUI } from "./TemplateSettingHelper";
import { constructBasicUI } from "./BasicSettingsHelper";
import { constructTemplateVariablesUI } from "./TemplateVariableSettingsHelper";
import {constructCustomPropertySettingsUI } from "./CustomPropertySettingsHelper";
import { constructAdvancedUI } from "./AdvancedSettingsHelper";
import {arraySettingDisplay, arraySettingDisplayUI} from "./ArrayDisplayTypeSettingsHelper";
import {i18nHelper} from "../../lang/helper";
import {constructLoginUI} from "./LoginSettingsHelper";
import {constructArrayLengthLimitSettingsUI} from "./ArrayLengthLimitSettingsHelper";
/**
* 部分逻辑参考以下项目
* obsidian-kanban
*/
export class DoubanSettingTab extends PluginSettingTab {
plugin: DoubanPlugin;
settingsManager: SettingsManager;
constructor(app: App, plugin: DoubanPlugin) {
super(app, plugin);
this.plugin = plugin;
this.settingsManager = plugin.settingsManager;
}
display(): void {
const {containerEl} = this;
containerEl.empty();
containerEl.createEl("h2", {text: 'Obsidian Douban'});
// Create tab container
const tabContainer = containerEl.createEl("div", {cls: "obsidian_douban_settings_tab_container"});
const tabHeaders = containerEl.createEl("div", {cls: "obsidian_douban_settings_tab_headers"});
const tabContents = containerEl.createEl("div", {cls: "obsidian_douban_settings_tab_contents"});
// Create tabs
const tabs = [
{name: i18nHelper.getMessage('1210'), construct: constructBasicUI},
{name: i18nHelper.getMessage('1203'), construct: constructTemplateUI},
{name: i18nHelper.getMessage('1260'), construct: constructLoginUI},
{name: i18nHelper.getMessage('1220'), construct: constructOutUI},
{name: i18nHelper.getMessage('120601'), construct: arraySettingDisplayUI},
{name: i18nHelper.getMessage('1270'), construct: constructArrayLengthLimitSettingsUI},
{name: i18nHelper.getMessage('1240'), construct: constructCustomPropertySettingsUI},
{name: i18nHelper.getMessage('1230'), construct: constructTemplateVariablesUI},
{name: i18nHelper.getMessage('1250'), construct: constructAdvancedUI}
];
tabs.forEach((tab, index) => {
const tabHeader = tabHeaders.createEl("div", {cls: "obsidian_douban_settings_tab_header", text: tab.name});
const tabContent = tabContents.createEl("div", {cls: "obsidian_douban_settings_tab_content"});
tab.construct(tabContent, this.settingsManager);
// Show the first tab by default
if (index === 0) {
tabHeader.addClass("active");
tabContent.addClass("active");
}
tabHeader.addEventListener("click", () => {
// Remove active class from all headers and contents
tabHeaders.querySelectorAll(".obsidian_douban_settings_tab_header").forEach(header => header.removeClass("active"));
tabContents.querySelectorAll(".obsidian_douban_settings_tab_content").forEach(content => content.removeClass("active"));
// Add active class to the clicked header and corresponding content
tabHeader.addClass("active");
tabContent.addClass("active");
});
});
tabContainer.appendChild(tabHeaders);
tabContainer.appendChild(tabContents);
}
hide(): void {
}
}