feat(editor): add markdown presets, heading folding and external file refresh
This commit is contained in:
@@ -15,6 +15,8 @@ import { EditorView as CodeMirror } from '@codemirror/view'
|
||||
import { renderMarkdown } from '@/utils/markdown'
|
||||
import { useEditorStore } from '@/stores/editor'
|
||||
import { executeEditorCommand } from '@/services/editorCommandService'
|
||||
import { headingFoldKey } from './headingFolding'
|
||||
import { useMarkdownPreferencesStore } from '@/stores/markdownPreferences'
|
||||
|
||||
type EditorComponent = { getEditor: () => Editor | undefined }
|
||||
|
||||
@@ -53,6 +55,47 @@ afterEach(() => {
|
||||
})
|
||||
|
||||
describe('VisualMarkdownEditor formatting toolbars', () => {
|
||||
it('applies syntax and renderer preferences when opening the visual editor', async () => {
|
||||
const preferences = useMarkdownPreferencesStore()
|
||||
preferences.preferences.heading = 'setext'
|
||||
preferences.preferences.bullet = '+'
|
||||
preferences.preferences.fence = '~'
|
||||
preferences.preferences.callouts = false
|
||||
preferences.preferences.math = false
|
||||
preferences.preferences.autoLinks = false
|
||||
const wrapper = mount(VisualMarkdownEditor, { props: { initialContent: '# Heading\n\n- first\n- second\n\n> [!NOTE]\n> text\n\nhttps://example.com\n\n```text\ncode\n```' }, attachTo: document.body })
|
||||
mounted.push(wrapper)
|
||||
const editor = await waitForEditor(wrapper)
|
||||
const result = editor.action(getMarkdown())
|
||||
expect(result).toContain('Heading\n===')
|
||||
expect(result).toContain('+ first')
|
||||
expect(result).toContain('~~~text')
|
||||
expect(wrapper.find('.markdown-callout').exists()).toBe(false)
|
||||
expect(wrapper.find('.ProseMirror a').exists()).toBe(false)
|
||||
})
|
||||
it('folds heading sections, retains nested state and opens hidden outline targets', async () => {
|
||||
const source = '# A\n\nbody\n\n## B\n\nchild\n\n# C\n\nvisible'
|
||||
const wrapper = mount(VisualMarkdownEditor, { props: { initialContent: source }, attachTo: document.body })
|
||||
mounted.push(wrapper)
|
||||
const editor = await waitForEditor(wrapper)
|
||||
await wrapper.get('.heading-fold-toggle[aria-label="折叠 H2 B"]').trigger('click')
|
||||
await wrapper.get('.heading-fold-toggle[aria-label="折叠 H1 A"]').trigger('click')
|
||||
expect(wrapper.findAll('.heading-fold-hidden').length).toBeGreaterThan(1)
|
||||
await wrapper.get('.heading-fold-toggle[aria-label="展开 H1 A"]').trigger('click')
|
||||
expect(wrapper.get('.heading-fold-toggle[aria-label="展开 H2 B"]').attributes('aria-expanded')).toBe('false')
|
||||
editor.action(ctx => {
|
||||
const view = ctx.get(editorViewCtx)
|
||||
let position = 0
|
||||
view.state.doc.descendants((node, pos) => { if (node.isText && node.text === 'child') position = pos })
|
||||
view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, position)))
|
||||
expect(headingFoldKey.getState(view.state)?.size).toBe(0)
|
||||
})
|
||||
expect(wrapper.find('.heading-fold-hidden').exists()).toBe(false)
|
||||
expect(editor.action(getMarkdown()).trim()).toBe(source)
|
||||
await wrapper.get('button[aria-label="折叠所有章节"]').trigger('click')
|
||||
await wrapper.get('button[aria-label="展开所有章节"]').trigger('click')
|
||||
expect(wrapper.find('.heading-fold-hidden').exists()).toBe(false)
|
||||
})
|
||||
it('renders and folds callouts without losing portable Markdown on serialization', async () => {
|
||||
const source = '> [!WARNING]- 注意\n>\n> **正文**\n>\n> > [!TIP] 内层\n> > 内容'
|
||||
const wrapper = mount(VisualMarkdownEditor, { props: { initialContent: source }, attachTo: document.body })
|
||||
|
||||
Reference in New Issue
Block a user