@milkdown/core
Version:
The core module of [milkdown](https://milkdown.dev/).
78 lines (68 loc) • 2.07 kB
text/typescript
import type { MilkdownPlugin } from '@milkdown/ctx'
import { createTimer } from '@milkdown/ctx'
import remarkParse from 'remark-parse'
import remarkStringify from 'remark-stringify'
import { unified } from 'unified'
import type { Editor } from '../editor'
import { remarkHandlers, withMeta } from '../__internal__'
import {
editorCtx,
initTimerCtx,
inputRulesCtx,
markViewCtx,
nodeViewCtx,
prosePluginsCtx,
remarkCtx,
remarkPluginsCtx,
remarkStringifyOptionsCtx,
} from './atoms'
import { ConfigReady } from './config'
/// The timer which will be resolved when the init plugin is ready.
export const InitReady = createTimer('InitReady')
/// The init plugin.
/// This plugin prepare slices that needed by other plugins. And create a remark instance.
///
/// This plugin will wait for the config plugin.
export function init(editor: Editor): MilkdownPlugin {
const plugin: MilkdownPlugin = (ctx) => {
ctx
.inject(editorCtx, editor)
.inject(prosePluginsCtx, [])
.inject(remarkPluginsCtx, [])
.inject(inputRulesCtx, [])
.inject(nodeViewCtx, [])
.inject(markViewCtx, [])
.inject(remarkStringifyOptionsCtx, {
handlers: remarkHandlers,
})
.inject(remarkCtx, unified().use(remarkParse).use(remarkStringify))
.inject(initTimerCtx, [ConfigReady])
.record(InitReady)
return async () => {
await ctx.waitTimers(initTimerCtx)
const options = ctx.get(remarkStringifyOptionsCtx)
ctx.set(
remarkCtx,
unified().use(remarkParse).use(remarkStringify, options)
)
ctx.done(InitReady)
return () => {
ctx
.remove(editorCtx)
.remove(prosePluginsCtx)
.remove(remarkPluginsCtx)
.remove(inputRulesCtx)
.remove(nodeViewCtx)
.remove(markViewCtx)
.remove(remarkStringifyOptionsCtx)
.remove(remarkCtx)
.remove(initTimerCtx)
.clearTimer(InitReady)
}
}
}
withMeta(plugin, {
displayName: 'Init',
})
return plugin
}