release: v0.1.2 — readOnly, new syntax, plugins, optimizations
Features: - feat(core): readOnly mode with config option and setReadOnly() API - feat(parser): superscript ^text^ and subscript ~text~ support - feat(parser): highlight/mark ==text== syntax - feat(parser): table column alignment with colons (:---, :---:, ---:) - feat(parser): emoji shortcodes 😄 → 😊 (80+ common emojis) - feat(plugins): imagePaste preset — paste clipboard images as base64 - feat(core): instance-level beforeRender/afterRender events - feat(styles): print stylesheet (@media print) - feat(styles): mark element CSS styling - feat(styles): readOnly mode CSS (.me-readonly) Optimizations: - perf(core): history debounce now configurable via historyDebounce option - perf(core): skip _render() in edit-only mode (already guarded) - fix(core): divider drag division-by-zero guard - fix(core): config.style deep merge with DEFAULTS - fix(core): scroll position preserved across mode switches Tests: - 9 new test cases: readOnly (3), parser syntax (6) - Total: 418 tests passing (+9 from v0.1.1) Chores: - version bump 0.1.1 → 0.1.2 - TypeScript definitions updated for new APIs
This commit is contained in:
@@ -1241,3 +1241,41 @@ describe('MarkdownEditor - 零散分支补全', () => {
|
||||
ed.destroy();
|
||||
});
|
||||
});
|
||||
|
||||
describe('MarkdownEditor - v0.1.2 readOnly 模式', () => {
|
||||
test('config.readOnly 设置 textarea readonly', () => {
|
||||
document.body.innerHTML = '';
|
||||
const c = document.createElement('div');
|
||||
document.body.appendChild(c);
|
||||
const ed = new MarkdownEditor(c, { readOnly: true, value: 'locked' });
|
||||
expect(ed.textarea.readOnly).toBe(true);
|
||||
expect(ed.el.classList.contains('me-readonly')).toBe(true);
|
||||
ed.destroy();
|
||||
});
|
||||
|
||||
test('setReadOnly 动态切换', () => {
|
||||
document.body.innerHTML = '';
|
||||
const c = document.createElement('div');
|
||||
document.body.appendChild(c);
|
||||
const ed = new MarkdownEditor(c, {});
|
||||
expect(ed.isReadOnly()).toBe(false);
|
||||
ed.setReadOnly(true);
|
||||
expect(ed.isReadOnly()).toBe(true);
|
||||
expect(ed.textarea.readOnly).toBe(true);
|
||||
expect(ed.el.classList.contains('me-readonly')).toBe(true);
|
||||
ed.setReadOnly(false);
|
||||
expect(ed.isReadOnly()).toBe(false);
|
||||
expect(ed.textarea.readOnly).toBe(false);
|
||||
expect(ed.el.classList.contains('me-readonly')).toBe(false);
|
||||
ed.destroy();
|
||||
});
|
||||
|
||||
test('readOnly 模式下内容仍可读取', () => {
|
||||
document.body.innerHTML = '';
|
||||
const c = document.createElement('div');
|
||||
document.body.appendChild(c);
|
||||
const ed = new MarkdownEditor(c, { readOnly: true, value: '# hello' });
|
||||
expect(ed.getValue()).toBe('# hello');
|
||||
ed.destroy();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user