@milkdown/preset-commonmark
Version:
The commonmark preset of [milkdown](https://milkdown.dev/).
88 lines (72 loc) • 2.16 kB
text/typescript
import { InputRule } from '@milkdown/prose/inputrules'
import { Selection } from '@milkdown/prose/state'
import { $command, $inputRule, $nodeAttr, $nodeSchema } from '@milkdown/utils'
import { withMeta } from '../__internal__'
import { paragraphSchema } from './paragraph'
/// HTML attributes for the hr node.
export const hrAttr = $nodeAttr('hr')
withMeta(hrAttr, {
displayName: 'Attr<hr>',
group: 'Hr',
})
/// Hr node schema.
export const hrSchema = $nodeSchema('hr', (ctx) => ({
group: 'block',
parseDOM: [{ tag: 'hr' }],
toDOM: (node) => ['hr', ctx.get(hrAttr.key)(node)],
parseMarkdown: {
match: ({ type }) => type === 'thematicBreak',
runner: (state, _, type) => {
state.addNode(type)
},
},
toMarkdown: {
match: (node) => node.type.name === 'hr',
runner: (state) => {
state.addNode('thematicBreak')
},
},
}))
withMeta(hrSchema.node, {
displayName: 'NodeSchema<hr>',
group: 'Hr',
})
withMeta(hrSchema.ctx, {
displayName: 'NodeSchemaCtx<hr>',
group: 'Hr',
})
/// Input rule to insert a hr.
/// For example, `---` will be converted to a hr.
export const insertHrInputRule = $inputRule(
(ctx) =>
new InputRule(/^(?:---|___\s|\*\*\*\s)$/, (state, match, start, end) => {
const { tr } = state
if (match[0]) tr.replaceWith(start - 1, end, hrSchema.type(ctx).create())
return tr
})
)
withMeta(insertHrInputRule, {
displayName: 'InputRule<insertHrInputRule>',
group: 'Hr',
})
/// Command to insert a hr.
export const insertHrCommand = $command(
'InsertHr',
(ctx) => () => (state, dispatch) => {
if (!dispatch) return true
const paragraph = paragraphSchema.node.type(ctx).create()
const { tr, selection } = state
const { from } = selection
const node = hrSchema.type(ctx).create()
if (!node) return true
const _tr = tr.replaceSelectionWith(node).insert(from, paragraph)
const sel = Selection.findFrom(_tr.doc.resolve(from), 1, true)
if (!sel) return true
dispatch(_tr.setSelection(sel).scrollIntoView())
return true
}
)
withMeta(insertHrCommand, {
displayName: 'Command<insertHrCommand>',
group: 'Hr',
})