🚧 Refactor markdown preview extension

This commit is contained in:
2025-11-29 19:24:20 +08:00
parent 8d9bcdad7e
commit 3521e5787b
20 changed files with 1463 additions and 1149 deletions

View File

@@ -1,25 +1,40 @@
import {EditorView} from '@codemirror/view';
import type {Extension} from '@codemirror/state';
import {createDebounce} from '@/common/utils/debounce';
type FontAdjuster = () => Promise<void> | void;
type FontAdjuster = () => void;
type SaveCallback = () => Promise<void> | void;
const runAdjuster = (adjuster: FontAdjuster) => {
try {
const result = adjuster();
if (result && typeof (result as Promise<void>).then === 'function') {
(result as Promise<void>).catch((error) => {
console.error('Failed to adjust font size:', error);
});
}
} catch (error) {
console.error('Failed to adjust font size:', error);
}
};
export interface WheelZoomOptions {
/** 增加字体大小的回调(立即执行) */
increaseFontSize: FontAdjuster;
/** 减少字体大小的回调(立即执行) */
decreaseFontSize: FontAdjuster;
/** 保存回调(防抖执行),在滚动结束后调用 */
onSave?: SaveCallback;
/** 保存防抖延迟(毫秒),默认 300ms */
saveDelay?: number;
}
export const createWheelZoomExtension = (options: WheelZoomOptions): Extension => {
const {increaseFontSize, decreaseFontSize, onSave, saveDelay = 300} = options;
// 如果有 onSave 回调,创建防抖版本
const {debouncedFn: debouncedSave} = onSave
? createDebounce(() => {
try {
const result = onSave();
if (result && typeof (result as Promise<void>).then === 'function') {
(result as Promise<void>).catch((error) => {
console.error('Failed to save font size:', error);
});
}
} catch (error) {
console.error('Failed to save font size:', error);
}
}, {delay: saveDelay})
: {debouncedFn: null};
export const createWheelZoomExtension = (
increaseFontSize: FontAdjuster,
decreaseFontSize: FontAdjuster
): Extension => {
return EditorView.domEventHandlers({
wheel(event) {
if (!event.ctrlKey) {
@@ -28,10 +43,16 @@ export const createWheelZoomExtension = (
event.preventDefault();
// 立即更新字体大小
if (event.deltaY < 0) {
runAdjuster(increaseFontSize);
increaseFontSize();
} else if (event.deltaY > 0) {
runAdjuster(decreaseFontSize);
decreaseFontSize();
}
// 防抖保存
if (debouncedSave) {
debouncedSave();
}
return true;