1.0.3 • Published 2 years ago

@pingfan.ts/markdown-editor v1.0.3

Weekly downloads
-
License
ISC
Repository
github
Last release
2 years ago

React Markdown Editor

基于 codemirror6 的 markdown 编辑器

特性

  • 支持编辑预览同步滚动(滚动时顶部绝对对齐预览内容),支持光标改变时滚动到光标位置(行对齐)
  • 支持粘贴和拖拽上传图片,可显示上传进度
  • 支持 emoji 表情
  • 插入链接和图片支持快速修改urlalttitle等变量属性(tab 键可跳到下一变量,esc 退出修改)
  • 预览采用 react-markdown 解析,支持语法高亮
  • 支持自定义预览渲染
  • 支持codemirror 扩展

截图

使用文档

安装

npm install -S @pingfan.ts/markdown-editor

使用

import React, { useMemo, useRef, useState } from 'react';
import { EditorView, basicSetup } from '@codemirror/basic-setup';
import Editor, { EditorInstance } from '@pingfan.ts/markdown-editor';
import upload from '@pingfan.ts/markdown-editor/es/plugins/upload';
import scrollSync from '@pingfan.ts/markdown-editor/es/plugins/scroll-sync';
import markdown from './markdown.txt';

export default () => {
  const editorRef = useRef<EditorInstance | null>(null);
  const [value, setValue] = useState<string>(markdown);

  const extensions = useMemo(
    () => [
      basicSetup,
      EditorView.lineWrapping,
      upload({
        url: 'api/attachments/upload',
        allowedTypes: 'image/*',
        transform(res: any) {
          return { url: res.data.url };
        },
      }),
      scrollSync(editorRef),
    ],
    [],
  );

  return (
    <Editor
      ref={editorRef}
      height={300}
      value={value}
      onChange={setValue}
      extensions={extensions}
      storageKey="articles-create"
    />
  );
};

API

Editor

属性名描述类型默认值
toolbar工具条false | { buttons: ToolbarButton[]; }--
editorPreviewEnableFullScreen编辑预览启用全屏,一般和 height 搭配使用booleantrue
previewOptions预览选项PreviewOptions--
storageKey自动保存,下次初始化时可恢复上一次保存的内容string--
value编辑器内容string--
height高度number | string--
minHeight最小高度number | string--
maxHeight最大高度number | string--
extensionscodemirror 扩展Extension[]--
onChange内容变化时的回调(value: string) => void--
ref--Ref<EditorInstance>--

PreviewOptions

属性名描述类型默认值
render自定义渲染(markdown: string) => ReactNode--
interval刷新间隔number1000
remarkPluginsremark 插件PluggableList--
rehypePluginsrehype 插件PluggableList--
markdownOptionsreact-markdown 选项Partial<ReactMarkdownOptions>--

EditorInstance

名称说明类型
getContainer获取编辑器容器DOM() => HTMLDivElement | null
getEditorView获取 codemirror 实例() => EditorView | null
getToolbar获取 Toolbar 实例() => ToolbarInstance | null
getPreview获取 Preview 实例() => PreviewInstance | null
getDisplayMode获取显示模式() => { fullScreen: boolean; preview: boolean; editorPreview: boolean; }
toggleFullScreen全屏切换() => void
togglePreview预览切换() => void
toggleEditorPreview编辑预览切换() => void

PreviewInstance

名称说明类型
getMarkdown获取 markdown 内容() => string
setMarkdown设置 markdown 内容(markdown: string) => void
debounceSetMarkdown消抖设置 markdown 内容(markdown: string) => void
setMarkdownOptions设置 react-markdown 选项(markdownOptions: Partial<ReactMarkdownOptions>) => void
getContainer获取预览容器DOM() => HTMLDivElement | null
getHast获取hast() => Hast