mirror of
https://github.com/Wanxp/obsidian-douban.git
synced 2026-05-30 06:28:23 +08:00
为豆瓣拉取内容中数组类型的字段(actor、director、author、translator、aliases、menu 等) 新增按内容类型可配置的最大数量限制, 解决电影演员等列表过长导致笔记冗余的问题。 - 新增设置项 arrayLengthLimits, 支持按 type(电影/电视剧/书籍/音乐/游戏/笔记/戏剧/全部) + field + limit 三元组进行配置 - 在 VariableUtil.replaceSubject 中央渲染入口集中截断, 自动覆盖所有类型的所有数组字段 - 在设置面板新增 "数组限制" 页签, 提供添加/删除/编辑 UI - 同字段同时存在 type=all 和具体类型时取较小限制值 - 新增对应中英文文案
85 lines
3.4 KiB
TypeScript
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 {
|
|
|
|
}
|
|
}
|