✨ A Markdown Editor

分支30Tags115
文件最后提交记录最后更新时间
feat(client): 优化客户端功能,增加图表、公式、拼音等功能的支持 (#1548) * feat: 优化客户端功能,增加图表、公式、拼音等功能的支持 * feat: 客户端增加左侧目录管理功能,去掉顶部菜单,增加编辑内容实时保存的机制 * fix: 删掉draw.io相关逻辑,等组件化后在构建中动态加入,从而减少开发环境的文件冗余 * fix: 打开一个新目录后,无脑把这个目录添加到目录管理列表中 * fix: 调整悬浮目录的定位,调整一些公共资源的位置 * style: 优化按钮布局 * feat: 重构文件系统权限配置,优化目录访问权限 * style: 优化代码格式,移除冗余空行和多余导入 * feat: 更新文件管理和目录管理功能,优化路径处理和状态保存 * Fix integrity hash formatting in yarn.lock * refactor: 修复代码格式错误 * feat: add global shortcut plugin and implement save shortcut * chore: update dependencies in yarn.lock * Create kind-eagles-beam.md --------- Co-authored-by: RSS1102 <jimmyrss1102@gmail.com>5 个月前
chore: release (#1749) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>1 天前
chore(cnb): 开发环境 (#1544) * 开发环境 * 编辑文件 Dockerfile * 编辑文件 Dockerfile * chore: update vite config * chore: 增加 prettier 扩展 * chore: 增加vitest 插件 * chore: update dockerfile * chore: update cnb.yml * chore: update cnb.yml * chore: 兼容cnb访问5 个月前
chore: 更新开发环境配置及依赖版本 `node>=18` (#1159) * chore: 更新开发环境配置及依赖版本 `node>=18` * chore: 更新 .nvmrc 文件1 年前
ci(release): 添加 npm 构建产物上传步骤 (#1721)1 天前
chore: update `husky` hook config and add `commitlint` support (#1035) chore: remove unnecessary hooks and deps1 年前
For cherry-markdown, support Cloud Studio to run examples (#533) * add a development runtime for cheery-markdown * add web socket connection for cloud studio env2 年前
fix: #1722 优化装饰器的相关逻辑,优化异步粘贴回调的逻辑 (#1727) * fix: 修复echarts5+不再支持的写法 * fix: 修复echarts5+不再支持的写法 * fix: 修复echarts5+不再支持的写法 * fix: #1722 优化装饰器的相关逻辑,优化异步粘贴回调的逻辑 * fix: 为了编辑体验更流畅,先绕过限频逻辑 * fix: 为了编辑体验更流畅,先绕过限频逻辑--回滚 * fix: 优化原子装饰器检测性能并修复空格解析问题 * fix(editor): 修复装饰移除时零宽字符未完全处理及代码块缓存哈希问题 * fix(editor): 修复移除装饰时文档越界及属性缺失问题 --------- Co-authored-by: 阿菜 Cai <jimmyrss1102@gmail.com>12 天前
feat: 添加 CNB 同步配置和工作流 (#1542) * feat: 添加 CNB 同步配置和工作流 * feat: 更新 README 文件以添加 CNB 云原生开发徽章 * fix: 修正 .cnb.yml 中的 secret.yml 链接格式5 个月前
chore: release (#1749) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>1 天前
chore(cnb): 开发环境 (#1544) * 开发环境 * 编辑文件 Dockerfile * 编辑文件 Dockerfile * chore: update vite config * chore: 增加 prettier 扩展 * chore: 增加vitest 插件 * chore: update dockerfile * chore: update cnb.yml * chore: update cnb.yml * chore: 兼容cnb访问5 个月前
✨ init repo 4 年前
✨ init repo 4 年前
refactor: 优化 rollup 构建并增强 stream 模式预览区交互功能 (#1653) * refactor: 优化 rollup 构建配置并增强 stream 模式预览区交互功能 (#1642) * fix(formula): 修复多余的闭括号 * chore: change changeset2 个月前
chore: use `vite` for dev and `rollup` upgrade `v4` (#1452) * chore: vite dev * fix: 更新开发脚本以使用vite构建,修复样式导入方式 * feat: 添加 postinstall 脚本以运行图标字体生成,更新 index.html 和 vite.config.ts 配置 * fix: 移除不必要的字体链接脚本 * chore: refactor code structure for improved readability and maintainability * feat: 更新 Babel 配置以支持 ESM 和 CommonJS,添加 ESLint 插件配置 * feat: 更新 index.html 和 vitest.config.ts,优化结构和样式 * feat: 更新 index.html,优化结构和样式,添加必要的脚本导入 * feat: 更新构建配置,添加 UMD 格式输出和清理插件以优化样式打包 * feat: 提取 SCSS 配置为 baseScssOptions,简化样式配置 * feat: 优化样式配置,移除未使用的 baseScssOptions,更新 index.scss 使用方式 * feat: 修复导入方式,使用命名空间导入 dartSass * feat: 更新示例和库的 HTML 文件,优化 markdown 文件导入方式 * feat: 更新示例中的基本配置导入路径,使用 index-demo.js 替代 basicConfig.js * feat: 更新 markdown 文件的导入路径,修正为相对路径 './assets/markdown/basic.md' * Create dirty-roses-camp.md7 个月前
chore: 移除对 dist 目录的 LFS 过滤配置 (#1519) 5 个月前
chore: 移除 VSCode 插件预发布(pre-release)流程 (#1718) * chore(vscodePlugin): release v0.2.1 * chore: 更新 .gitignore 忽略所有 .vsix 文件 * chore: 更新 .gitignore 忽略所有 .vsix 文件 * docs(vscodePlugin): 更新 changelog * chore: 移除 CHANGELOG 中的依赖更新记录 * ci: 移除 vscode 预发布模式,优化包构建 PR 评论 * feat(vscodePlugin): 更新依赖包名称和版本 * chore: 修正changeset中的引号格式 * ci: 优化 VSCode 插件版本号生成逻辑 * fix(vscodePlugin): 修复 VSCode 插件白屏问题 * chore: 移除 VSCode 插件预发布流程29 天前
docs(examples): fetch markdown files directly instead of load with object 4 年前
chore(workflows): node 升级为 24,使用 OIDC 替换 npm token 认证 (#1704) * chore(workflows): node 升级为 24,使用 OIDC 替换 npm token 认证 * ci: 更新 CI 工作流配置优化构建与发布流程1 个月前
fix(types): fix type check & security issues (#538) * fix(types): fix type check issues * chore(*): fix yarnrc registry configuration * chore(*): fix type check errors * chore(glob-watcher): force glob-watcher@6.0.0 in resolution2 年前
build(deps): 升级 `@rollup/plugin-eslint@9` (#1705) * fix: 优化版本号获取方式 * build(deps): 升级 `@rollup/plugin-eslint@9` * ci: 更新 CI Node 版本至 LTS/* 与 24.x * ci: 锁定 Node.js 版本为 24.x * ci(pr): 配置 Node.js 和缓存依赖1 个月前
chore: upgrade `eslint@8.x` and `prettier@3.x` (#1274) * chore: upgrade `eslint@8.x` and `prettier@3.x` * chore: add changeset * fix: 更新 .eslintignore 和 .prettierignore 文件,移除冗余路径 * chore: 取消 `mermaid` 的依赖升级 * chore: 移除工作流中的 lint 步骤,简化依赖安装和构建过程 * fix: 格式化代码 * chore: 格式代码10 个月前
chore(*): lint fix 3 年前
✨ init repo 4 年前
fix(types): fix type check & security issues (#538) * fix(types): fix type check issues * chore(*): fix yarnrc registry configuration * chore(*): fix type check errors * chore(glob-watcher): force glob-watcher@6.0.0 in resolution2 年前
docs: update license (#1244) 10 个月前
feat(mermaid): mermaid diagram size editing and alignment (#1641) * feat(mermaid): mermaid diagram size editing and alignment * feat(mermaid): mermaid diagram size editing and alignment * feat(mermaid): mermaid diagram size editing and alignment * fix(codeblock): 修复代码块语言解析和转义问题 * chore: add changeset --------- Co-authored-by: femeng <femeng@tencent.com> Co-authored-by: 阿菜 Cai <jimmyrss1102@gmail.com> Co-authored-by: sunsonliu <sunsonliu@tencent.com>2 个月前
feat(mermaid): mermaid diagram size editing and alignment (#1641) * feat(mermaid): mermaid diagram size editing and alignment * feat(mermaid): mermaid diagram size editing and alignment * feat(mermaid): mermaid diagram size editing and alignment * fix(codeblock): 修复代码块语言解析和转义问题 * chore: add changeset --------- Co-authored-by: femeng <femeng@tencent.com> Co-authored-by: 阿菜 Cai <jimmyrss1102@gmail.com> Co-authored-by: sunsonliu <sunsonliu@tencent.com>2 个月前
chore(eslint): `no-unused-vars` is error, and fix related errors (#1384) * chore(eslint): `no-unused-vars` is error, and fix related errors chore: remove scope-enum commit restriction * chore: 修改 commit 规则8 个月前
chore: cleanup unused dependencies and fix dependency locations (#1737)12 天前
fix(math): fix math externals config not working (#1437) * fix(math): fix math externals config not working * add changeset --------- Co-authored-by: 阿菜 Cai <jimmyrss1102@gmail.com>8 个月前
chore: 升级 `typeScript` 至 v6.0.2,升级 `mermaid` 可选依赖至 ^11.14.0 (#1671) * chore(mermaid): 升级 mermaid 到 v11.14.0 并兼容 v10+ API 变更 * chore: 升级 typescript 到 v6.0.2 并更新 tsconfig 配置 * chore: 升级 TypeScript 至 v6.0.2 并更新 Mermaid 可选依赖至 ^11.14.0 * chore: update changeset * chore: 更新 mermaid 依赖版本和 tsconfig 配置1 个月前
refactor(styles): migrate`Sass` to `@use` and `rollup-plugin-sass` modern API (#1745) Co-authored-by: Cursor <cursoragent@cursor.com>1 天前

cherry logo

Cherry Markdown Writer

cnb 云原生开发 Cloud Studio Template

简体中文 | English

介绍

Cherry Markdown Writer 是一款 Javascript Markdown 编辑器,具有开箱即用、轻量简洁、易于扩展等特点。它可以运行在浏览器或服务端(NodeJs)。

文档

演示


开箱即用

开发者可以用非常简单的方式调用并实例化 Cherry Markdown 编辑器,实例化的编辑器默认支持绝大多数常用的 markdown 语法(例如标题、目录、流程图、公式等)。

易于扩展

当 Cherry Markdown 编辑器默认支持的语法无法满足需求时,可以进行二次开发或功能扩展。Cherry 基于纯 JavaScript 实现,不依赖 Angular、Vue、React 等框架(框架仅作为容器环境)。

流式渲染

开启流式渲染后,cherry会对以下语法进行自动补全,避免出现Markdown源码,以达到在流式输出过程中稳定输出的效果(demo):

  • 标题
  • 加粗、斜体
  • 超链接
  • 图片、音视频
  • 行内代码块
  • 段落代码块
  • 行内公式
  • 段落公式
  • 无序列表
  • 表格
  • mermaid画图
  • 脚注

功能

语法功能

  1. 图片缩放、对齐与引用
  2. 根据表格内容生成图表
  3. 字体颜色与字号调整
  4. 字体背景色、上标与下标
  5. 插入清单(checklist)
  6. 插入音视频
  7. 流程图(mermaid)、公式(数学)
  8. 信息面板

功能特性

  1. 从富文本复制并粘贴为 Markdown
  2. 经典换行与常规换行支持
  3. 多光标编辑
  4. 图片尺寸编辑
  5. Mermaid 图表尺寸编辑与对齐布局(拖拽缩放、支持居中/左/右/浮动对齐)
  6. 表格编辑
  7. 根据表格内容生成图表(表格 -> 图表)
  8. 导出为图片或 PDF
  9. 浮动工具栏:在新行行首出现
  10. 气泡工具栏:选中文本时出现
  11. 设置快捷键
  12. 悬浮目录
  13. 主题切换
  14. 输入联想
  15. AI Chat场景流式输出场景特别支持

性能特性

  1. 局部渲染
  2. 局部更新

安全

Cherry Markdown 内置安全钩子,通过白名单过滤和 DomPurify 进行扫描过滤。

样式主题

提供多种主题样式可选。

功能示例

点击查看功能演示 Features demo

安装

通过 yarn

yarn add cherry-markdown

通过 npm

npm install cherry-markdown --save

如果需要启用 mermaid 绘图和表格转图表功能,需要同时安装 mermaidecharts

Cherry Markdown 内置了 mermaid,如果希望使用指定版本的 mermaid,可以参考 wiki

快速开始

浏览器

UMD

<link href="cherry-editor.min.css" />
<div id="markdown-container"></div>
<script src="cherry-editor.min.js"></script>
<script>
  new Cherry({
    id: 'markdown-container',
    value: '# welcome to cherry editor!',
  });
</script>

ESM

import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown';
const cherryInstance = new Cherry({
  id: 'markdown-container',
  value: '# welcome to cherry editor!',
});

Node

const { default: CherryEngine } = require('cherry-markdown/dist/cherry-markdown.engine.core.common');
const cherryEngineInstance = new CherryEngine();
const htmlContent = cherryEngineInstance.makeHtml('# welcome to cherry editor!');

轻量版本

由于 mermaid 库体积较大,cherry 提供了不内置 mermaid 的核心构建包,可按需引入。

完整模式 (图形界面)

import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown/dist/cherry-markdown.core';
const cherryInstance = new Cherry({
  id: 'markdown-container',
  value: '# welcome to cherry editor!',
});

引擎模式(语法编译)

// 导入 Cherry 引擎核心构建包
// 引擎的配置项与 Cherry 相同,以下内容仅介绍 Cherry 核心包的用法
import CherryEngine from 'cherry-markdown/dist/cherry-markdown.engine.core';
const cherryEngineInstance = new CherryEngine();
const htmlContent = cherryEngineInstance.makeHtml('# welcome to cherry editor!');

// --> <h1>welcome to cherry editor!</h1>

关于 mermaid ⚠️

核心构建包不包含 mermaid 依赖,需要手动引入相关插件。

import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown/dist/cherry-markdown.core';
import CherryMermaidPlugin from 'cherry-markdown/dist/addons/cherry-code-block-mermaid-plugin';
import mermaid from 'mermaid';

// 插件注册必须在 Cherry 实例化之前完成
Cherry.usePlugin(CherryMermaidPlugin, {
  mermaid, // 传入 mermaid 对象
  // mermaidAPI: mermaid.mermaidAPI, // 也可以传入 mermaid API
  // 同时可以在这里配置 mermaid 的行为,参考 mermaid 官方文档
  // theme: 'neutral',
  // sequence: { useMaxWidth: false, showSequenceNumbers: true }
});

const cherryInstance = new Cherry({
  id: 'markdown-container',
  value: '# welcome to cherry editor!',
});

从 mermaid v10.0.0 开始,渲染逻辑由同步改为异步,afterChangeafterInit 事件后,mermaid 代码块先渲染为占位符,再异步渲染替换。

如果需要在异步渲染完成后获取渲染结果,可以参考如下示例:

const cherryInstance = new Cherry({
  id: 'markdown-container',
  // 使用模板字符串,内部直接包含 mermaid 的代码块
  value: `
    ```mermaid
    graph LR
        A[公司] -->| 下 班 | B(菜市场)
        B --> C{看见<br>卖西瓜的}
        C -->|Yes| D[买一个包子]
        C -->|No| E[买一斤包子]
    ```
  `,
  callback: {
    afterAsyncRender: (md, html) => {
      // md 是 markdown 源码,html 是渲染结果
    }
  }
});

流式输出包(Stream Build)

Cherry 提供了专为流式输出场景优化的构建包,该包不包含 mermaid、CodeMirror 等大型依赖,可实现按需懒加载,非常适合 AI Chat 等场景。

import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown/dist/cherry-markdown.stream';

// 流式输出包默认不包含以下依赖,可按需加载:
// - mermaid(流程图)
// - CodeMirror(代码编辑器)

const cherryInstance = new Cherry({
  id: 'markdown-container',
});

cherryInstance.setMarkdown('# welcome to cherry editor!');

为流式输出包加载 Mermaid 插件

import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown/dist/cherry-markdown.stream';
import CherryMermaidPlugin from 'cherry-markdown/dist/addons/cherry-code-block-mermaid-plugin';
import mermaid from 'mermaid';

// 插件注册必须在 Cherry 实例化之前完成
Cherry.usePlugin(CherryMermaidPlugin, {
  mermaid,
  mermaidAPI: mermaid,
});

const cherryInstance = new Cherry({
  id: 'markdown-container',
});

流式输出包与核心包的区别

构建包 文件 包含 Mermaid 包含 CodeMirror 适用场景
完整包 cherry-markdown.js 通用场景
核心包 cherry-markdown.core.js 不需要 Mermaid
流式输出包 cherry-markdown.stream.js AI Chat 流式输出

注意:MathJax/KaTeX 为外部依赖,通过 CDN 动态加载,不包含在任何构建包中。

异步加载

强烈推荐使用动态引入(Dynamic import),下面给出 webpack 动态引入的示例。

import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown/dist/cherry-markdown.core';

const registerPlugin = async () => {
  const [{ default: CherryMermaidPlugin }, mermaid] = await Promise.all([
    import('cherry-markdown/src/addons/cherry-code-block-mermaid-plugin'),
    import('mermaid'),
  ]);
  Cherry.usePlugin(CherryMermaidPlugin, {
    mermaid, // 传入mermaid引用
  });
};

registerPlugin().then(() => {
  // 插件注册必须在 Cherry 实例化之前完成
  const cherryInstance = new Cherry({
    id: 'markdown-container',
    value: '# welcome to cherry editor!',
  });
});

配置

所有配置项基本都在 /src/Cherry.config.js 中进行了标注,详见:配置项全解

示例

点击查看 Wiki 示例

客户端

正在开发中,可查看 packages/client/ 目录。

扩展

自定义语法

详见 自定义语法文档

自定义工具栏

cherry 支持五种工具栏位置,每个位置都可以扩展自定义工具按钮,详情见: 自定义工具栏按钮

单元测试

已经添加了基础的 Vitest 配置,但是相关测试用例还未完善,欢迎大家提交提供丰富的测试用例。

贡献指南

欢迎加入我们,一起打造强大的 Markdown 编辑器。在实现新功能或提交特性前,请先阅读:

Contribution Leaderboard

License

Apache-2.0