update at 2025-10-10 17:00:09
This commit is contained in:
@@ -19,6 +19,17 @@ export interface PlatformChooserOptions {
|
||||
onPlatformChange?: (platform: PlatformType) => Promise<void>;
|
||||
}
|
||||
|
||||
export interface PlatformActionLabels {
|
||||
refresh: string;
|
||||
publish: string;
|
||||
}
|
||||
|
||||
export interface PlatformChooserActions {
|
||||
onRefresh?: () => void | Promise<void>;
|
||||
onPublish?: () => void | Promise<void>;
|
||||
getLabels?: (platform: PlatformType) => PlatformActionLabels;
|
||||
}
|
||||
|
||||
/**
|
||||
* 平台信息接口
|
||||
*/
|
||||
@@ -48,8 +59,11 @@ const SUPPORTED_PLATFORMS: PlatformInfo[] = [
|
||||
export class PlatformChooser {
|
||||
private container: HTMLElement;
|
||||
private selectElement: HTMLSelectElement | null = null;
|
||||
private refreshButton: HTMLButtonElement | null = null;
|
||||
private publishButton: HTMLButtonElement | null = null;
|
||||
private currentPlatform: PlatformType;
|
||||
private onChange?: (platform: PlatformType) => void;
|
||||
private actions: PlatformChooserActions | null = null;
|
||||
|
||||
constructor(container: HTMLElement, options: PlatformChooserOptions = {}) {
|
||||
this.container = container;
|
||||
@@ -101,6 +115,16 @@ export class PlatformChooser {
|
||||
const newPlatform = platformSelect.value as PlatformType;
|
||||
this.switchPlatformInternal(newPlatform);
|
||||
};
|
||||
|
||||
// 刷新按钮
|
||||
this.refreshButton = this.container.createEl('button', { cls: 'toolbar-button purple-gradient' });
|
||||
this.refreshButton.onclick = () => this.handleRefreshClick();
|
||||
|
||||
// 发布按钮
|
||||
this.publishButton = this.container.createEl('button', { cls: 'toolbar-button' });
|
||||
this.publishButton.onclick = () => this.handlePublishClick();
|
||||
|
||||
this.updateActionLabels();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -123,6 +147,8 @@ export class PlatformChooser {
|
||||
console.error('[PlatformChooser] 平台切换失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
this.updateActionLabels();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -133,6 +159,7 @@ export class PlatformChooser {
|
||||
if (this.selectElement) {
|
||||
this.selectElement.value = platform;
|
||||
}
|
||||
this.updateActionLabels();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -160,5 +187,45 @@ export class PlatformChooser {
|
||||
this.selectElement.onchange = null;
|
||||
this.selectElement = null;
|
||||
}
|
||||
if (this.refreshButton) {
|
||||
this.refreshButton.onclick = null;
|
||||
this.refreshButton = null;
|
||||
}
|
||||
if (this.publishButton) {
|
||||
this.publishButton.onclick = null;
|
||||
this.publishButton = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置通用操作按钮
|
||||
*/
|
||||
setActions(actions: PlatformChooserActions): void {
|
||||
this.actions = actions;
|
||||
this.updateActionLabels();
|
||||
}
|
||||
|
||||
private handleRefreshClick(): void {
|
||||
if (!this.actions?.onRefresh) return;
|
||||
Promise.resolve(this.actions.onRefresh()).catch((error) => {
|
||||
console.error('[PlatformChooser] 刷新操作失败:', error);
|
||||
});
|
||||
}
|
||||
|
||||
private handlePublishClick(): void {
|
||||
if (!this.actions?.onPublish) return;
|
||||
Promise.resolve(this.actions.onPublish()).catch((error) => {
|
||||
console.error('[PlatformChooser] 发布操作失败:', error);
|
||||
});
|
||||
}
|
||||
|
||||
private updateActionLabels(): void {
|
||||
if (!this.refreshButton || !this.publishButton) return;
|
||||
const labels = this.actions?.getLabels?.(this.currentPlatform) ?? {
|
||||
refresh: '🔄 刷新',
|
||||
publish: '📤 发布',
|
||||
};
|
||||
this.refreshButton.innerText = labels.refresh;
|
||||
this.publishButton.innerText = labels.publish;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,6 +93,18 @@ export class PreviewManager {
|
||||
|
||||
// 构建 UI
|
||||
this.platformChooser.render();
|
||||
|
||||
// 共享操作按钮
|
||||
this.platformChooser.setActions({
|
||||
onRefresh: () => this.refresh(),
|
||||
onPublish: () => this.publishCurrentPlatform(),
|
||||
getLabels: (platform) => {
|
||||
if (platform === 'wechat') {
|
||||
return { refresh: '🔄 刷新', publish: '📝 发布' };
|
||||
}
|
||||
return { refresh: '🔄 刷新', publish: '📤 发布' };
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,6 +137,22 @@ export class PreviewManager {
|
||||
this.wechatPreview.build();
|
||||
}
|
||||
|
||||
private async publishCurrentPlatform(): Promise<void> {
|
||||
if (this.currentPlatform === 'wechat') {
|
||||
if (!this.wechatPreview) {
|
||||
new Notice('微信预览未初始化');
|
||||
return;
|
||||
}
|
||||
await this.wechatPreview.publish();
|
||||
} else if (this.currentPlatform === 'xiaohongshu') {
|
||||
if (!this.xhsPreview) {
|
||||
new Notice('小红书预览未初始化');
|
||||
return;
|
||||
}
|
||||
await this.xhsPreview.publish();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建小红书预览组件
|
||||
*/
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* 作用:通用工具函数集合(事件、版本、字符串处理等)。
|
||||
*/
|
||||
|
||||
import { App, sanitizeHTMLToDom, requestUrl, Platform } from "obsidian";
|
||||
import { App, sanitizeHTMLToDom, Platform } from "obsidian";
|
||||
import * as postcss from "./postcss/postcss"; // 内置 PostCSS runtime,解析主题 CSS 用于内联样式
|
||||
|
||||
let PluginVersion = "0.0.0";
|
||||
@@ -185,10 +185,7 @@ export function applyCSS(html: string, css: string) {
|
||||
}
|
||||
|
||||
export function uevent(name: string) {
|
||||
const url = `https://u.sunboshi.tech/event?name=${name}&platform=${PlugPlatform}&v=${PluginVersion}`;
|
||||
requestUrl(url).then().catch(error => {
|
||||
console.error("Failed to send event: " + url, error);
|
||||
});
|
||||
console.debug(`[uevent] ${name} @${PlugPlatform} v${PluginVersion}`);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -134,19 +134,13 @@ export class WechatPreview {
|
||||
}
|
||||
|
||||
// 操作按钮(直接平铺在 Grid 中)
|
||||
const refreshBtn = parent.createEl('button', { text: '🔄 刷新', cls: 'toolbar-button purple-gradient' });
|
||||
refreshBtn.onclick = async () => { if (this.onRefreshCallback) await this.onRefreshCallback(); };
|
||||
|
||||
const postBtn = parent.createEl('button', { text: '📝 发布', cls: 'toolbar-button' });
|
||||
postBtn.onclick = async () => await this.postArticle();
|
||||
|
||||
if (Platform.isDesktop && this.settings.isAuthKeyVaild()) {
|
||||
const htmlBtn = parent.createEl('button', { text: '💾 导出HTML', cls: 'toolbar-button' });
|
||||
htmlBtn.onclick = async () => await this.exportHTML();
|
||||
}
|
||||
|
||||
// 封面选择
|
||||
this.buildCoverSelector(parent);
|
||||
//this.buildCoverSelector(parent);
|
||||
|
||||
// 样式选择(如果启用)
|
||||
if (this.settings.showStyleUI) {
|
||||
@@ -387,6 +381,16 @@ export class WechatPreview {
|
||||
/** 对外:发布草稿(供外层菜单调用) */
|
||||
async postDraft() { await this.postArticle(); }
|
||||
|
||||
async publish(): Promise<void> {
|
||||
await this.postDraft();
|
||||
}
|
||||
|
||||
async refresh(): Promise<void> {
|
||||
if (this.onRefreshCallback) {
|
||||
await this.onRefreshCallback();
|
||||
}
|
||||
}
|
||||
|
||||
/** 由上层在切换/渲染时注入当前文件 */
|
||||
setFile(file: TFile | null) { this.currentFile = file; }
|
||||
}
|
||||
|
||||
@@ -88,16 +88,8 @@ export class XiaohongshuPreview {
|
||||
option.text = name;
|
||||
});
|
||||
|
||||
const refreshCard = this.createGridCard(board, 'xhs-area-refresh');
|
||||
const refreshBtn = refreshCard.createEl('button', { text: '🔄 刷新', cls: 'toolbar-button purple-gradient' });
|
||||
refreshBtn.onclick = () => this.onRefresh();
|
||||
|
||||
const publishCard = this.createGridCard(board, 'xhs-area-publish');
|
||||
const publishBtn = publishCard.createEl('button', { text: '📤 发布', cls: 'toolbar-button' });
|
||||
publishBtn.onclick = () => this.onPublish();
|
||||
|
||||
const previewCard = this.createGridCard(board, 'xhs-area-preview');
|
||||
const previewLabel = previewCard.createDiv({ cls: 'xhs-label', text: '预览宽度' });
|
||||
const previewLabel = previewCard.createDiv({ cls: 'xhs-label', text: '宽度' });
|
||||
this.previewWidthSelect = previewCard.createEl('select', { cls: 'xhs-select' });
|
||||
const currentPreviewWidth = this.settings.xhsPreviewWidth || XHS_PREVIEW_DEFAULT_WIDTH;
|
||||
XHS_PREVIEW_WIDTH_OPTIONS.forEach(value => {
|
||||
@@ -121,9 +113,8 @@ export class XiaohongshuPreview {
|
||||
};
|
||||
|
||||
const fontCard = this.createGridCard(board, 'xhs-area-font');
|
||||
fontCard.createDiv({ cls: 'xhs-label', text: '字号' });
|
||||
//fontCard.createDiv({ cls: 'xhs-label', text: '字号' });
|
||||
const fontSizeGroup = fontCard.createDiv({ cls: 'font-size-group' });
|
||||
|
||||
const decreaseBtn = fontSizeGroup.createEl('button', { text: '−', cls: 'font-size-btn' });
|
||||
decreaseBtn.onclick = () => this.changeFontSize(-1);
|
||||
|
||||
@@ -174,10 +165,10 @@ export class XiaohongshuPreview {
|
||||
nextBtn.onclick = () => this.nextPage();
|
||||
|
||||
const sliceCard = this.createGridCard(board, 'xhs-area-slice');
|
||||
const sliceCurrentBtn = sliceCard.createEl('button', { text: '⬇ 当前页切图', cls: 'xhs-slice-btn' });
|
||||
const sliceCurrentBtn = sliceCard.createEl('button', { text: '当前页切图', cls: 'xhs-slice-btn' });
|
||||
sliceCurrentBtn.onclick = () => this.sliceCurrentPage();
|
||||
|
||||
const sliceAllBtn = sliceCard.createEl('button', { text: '⇓ 全部页切图', cls: 'xhs-slice-btn secondary' });
|
||||
const sliceAllBtn = sliceCard.createEl('button', { text: '全部页切图', cls: 'xhs-slice-btn secondary' });
|
||||
sliceAllBtn.onclick = () => this.sliceAllPages();
|
||||
}
|
||||
|
||||
@@ -423,6 +414,14 @@ export class XiaohongshuPreview {
|
||||
await this.onPublishCallback();
|
||||
}
|
||||
}
|
||||
|
||||
async refresh(): Promise<void> {
|
||||
await this.onRefresh();
|
||||
}
|
||||
|
||||
async publish(): Promise<void> {
|
||||
await this.onPublish();
|
||||
}
|
||||
|
||||
/**
|
||||
* 全部页切图
|
||||
|
||||
Reference in New Issue
Block a user