diff --git a/src/renderer/src/editor/elements/list.tsx b/src/renderer/src/editor/elements/list.tsx index 972ec3a5..49a66b19 100644 --- a/src/renderer/src/editor/elements/list.tsx +++ b/src/renderer/src/editor/elements/list.tsx @@ -37,7 +37,7 @@ export const List = observer(({element, attributes, children}: ElementProps } - {createElement(tag, {className: 'm-list'}, children)} + {createElement(tag, {className: 'm-list', start: element.start}, children)} ) }, [element, element.children, configStore.config.dragToSort]) diff --git a/src/renderer/src/editor/output/worker.ts b/src/renderer/src/editor/output/worker.ts index b86e07ef..5cd59f9b 100644 --- a/src/renderer/src/editor/output/worker.ts +++ b/src/renderer/src/editor/output/worker.ts @@ -186,7 +186,8 @@ export const toMarkdown = (tree: any[], preString = '', parent: any[] = [{root: if (p.type === 'list-item') { const list = parent[parent.length - 2] let pre = preString + (list.order ? (space + ' ') : space) - const index = list.children.findIndex(c => c === p) + let index = list.children.findIndex(c => c === p) + if (list.start) index += (list.start - 1) if (i === 0) { str += preString str += list.order ? `${index + 1}. ` : '- ' diff --git a/src/renderer/src/editor/parser/worker/index.ts b/src/renderer/src/editor/parser/worker/index.ts index 954f9958..afbcb59d 100644 --- a/src/renderer/src/editor/parser/worker/index.ts +++ b/src/renderer/src/editor/parser/worker/index.ts @@ -138,7 +138,7 @@ const parserBlock = (nodes: Content[], top = false, parent?: Content) => { el = {type: 'inline-katex', children: [{text: n.value}]} as InlineKatexNode break case 'list': - el = {type: 'list', order: n.ordered, children: parserBlock(n.children, false, n)} + el = {type: 'list', order: n.ordered, start: n.start, children: parserBlock(n.children, false, n)} break case 'footnoteReference': if (share) { diff --git a/src/renderer/src/editor/plugins/elements.ts b/src/renderer/src/editor/plugins/elements.ts index 77c857ea..2781e7a5 100644 --- a/src/renderer/src/editor/plugins/elements.ts +++ b/src/renderer/src/editor/plugins/elements.ts @@ -190,9 +190,11 @@ export const MdElements: Record = { Transforms.delete(editor, { at: path }) + const start = match[1].match(/^\s*(\d+)\./) Transforms.insertNodes(editor, { type: 'list', - order: /^\s*\d+\./.test(match[1]), + order: !!start, + start: start ? +start[1] : undefined, children: [ { type: 'list-item', diff --git a/src/renderer/src/el.d.ts b/src/renderer/src/el.d.ts index 3ec1958d..9298698c 100644 --- a/src/renderer/src/el.d.ts +++ b/src/renderer/src/el.d.ts @@ -11,7 +11,7 @@ export type TableNode = {type: 'table', children: TableRowNode[]} export type TableRowNode = {type: 'table-row', children: TableCellNode[]} export type TableCellNode = {type: 'table-cell', title?: boolean, align?: Align, children: BaseElement['children']} export type BlockQuoteNode = {type: 'blockquote', children: (BlockQuoteNode | ParagraphNode)[]} -export type ListNode = {type: 'list', children: ListItemNode[], order?: boolean} +export type ListNode = {type: 'list', children: ListItemNode[], order?: boolean, start?: number} export type ListItemNode = {type: 'list-item', children: BaseElement['children'], checked?: boolean} export type HeadNode = {type: 'head', children: BaseElement['children'], level: number} export type HrNode = {type: 'hr'} diff --git a/src/renderer/src/utils/keyboard.ts b/src/renderer/src/utils/keyboard.ts index 20399f27..7a1222e0 100644 --- a/src/renderer/src/utils/keyboard.ts +++ b/src/renderer/src/utils/keyboard.ts @@ -35,7 +35,7 @@ const formatList = (editor: Editor, node: NodeEntry, type: string) => { reverse: true, mode: 'lowest' })) - + Transforms.setNodes(editor, {start: undefined}, {at: Path.parent(parent[1])}) for (let l of listItems) { Transforms.setNodes(editor, {checked: task ? l[0].checked || false : undefined}, {at: l[1]}) }