108 lines
2.7 KiB
TypeScript
108 lines
2.7 KiB
TypeScript
import { keymap } from 'prosemirror-keymap'
|
|
import type { ProseMirrorExtension } from './state'
|
|
import { Schema } from 'prosemirror-model'
|
|
import base from './extension/base'
|
|
import markdown from './extension/markdown'
|
|
import link from './extension/link'
|
|
// import scroll from './prosemirror/extension/scroll'
|
|
import todoList from './extension/todo-list'
|
|
import code from './extension/code'
|
|
import strikethrough from './extension/strikethrough'
|
|
import placeholder from './extension/placeholder'
|
|
// import menu from './extension/menu'
|
|
// import image from './extension/image'
|
|
import dragHandle from './extension/drag-handle'
|
|
import pasteMarkdown from './extension/paste-markdown'
|
|
import table from './extension/table'
|
|
import collab from './extension/collab'
|
|
import type { Config, PeerData } from './context'
|
|
import selectionMenu from './extension/selection'
|
|
import type { Command } from 'prosemirror-state'
|
|
|
|
export interface InitOpts {
|
|
data?: unknown
|
|
keymap?: { [key: string]: Command }
|
|
config: Config
|
|
markdown: boolean
|
|
path?: string
|
|
y?: PeerData
|
|
schema?: Schema
|
|
}
|
|
|
|
const customKeymap = (opts: InitOpts): ProseMirrorExtension => ({
|
|
plugins: (prev) => (opts.keymap ? [...prev, keymap(opts.keymap)] : prev)
|
|
})
|
|
|
|
/*
|
|
const codeMirrorKeymap = (props: Props) => {
|
|
const keys = []
|
|
for (const key in props.keymap) {
|
|
keys.push({key: key, run: props.keymap[key]})
|
|
}
|
|
|
|
return cmKeymap.of(keys)
|
|
}
|
|
*/
|
|
|
|
export const createExtensions = (opts: InitOpts): ProseMirrorExtension[] => {
|
|
return opts.markdown
|
|
? [
|
|
placeholder('Просто начните...'),
|
|
customKeymap(opts),
|
|
base(opts.markdown),
|
|
// scroll(props.config.typewriterMode),
|
|
collab(opts.y),
|
|
dragHandle()
|
|
]
|
|
: [
|
|
selectionMenu(),
|
|
customKeymap(opts),
|
|
base(opts.markdown),
|
|
collab(opts.y),
|
|
markdown(),
|
|
todoList(),
|
|
dragHandle(),
|
|
code(),
|
|
strikethrough(),
|
|
link(),
|
|
table(),
|
|
// image(props.path), // TODO: image extension
|
|
pasteMarkdown()
|
|
/*
|
|
codeBlock({
|
|
theme: codeTheme(props.config),
|
|
typewriterMode: props.config.typewriterMode,
|
|
fontSize: props.config.fontSize,
|
|
prettier: props.config.prettier,
|
|
extensions: () => [codeMirrorKeymap(props)],
|
|
}),
|
|
*/
|
|
]
|
|
}
|
|
|
|
export const createEmptyText = () => ({
|
|
doc: {
|
|
type: 'doc',
|
|
content: [{ type: 'paragraph' }]
|
|
},
|
|
selection: {
|
|
type: 'text',
|
|
anchor: 1,
|
|
head: 1
|
|
}
|
|
})
|
|
|
|
export const createSchema = (opts: InitOpts) => {
|
|
const extensions = createExtensions(opts)
|
|
|
|
let schemaSpec = { nodes: {} }
|
|
|
|
for (const extension of extensions) {
|
|
if (extension.schema) {
|
|
schemaSpec = extension.schema(schemaSpec)
|
|
}
|
|
}
|
|
|
|
return new Schema(schemaSpec)
|
|
}
|