Vditor: простой в использовании редактор Markdown, созданный для адаптации к различным сценариям применения
Vditor — это браузерный редактор Markdown с открытым исходным кодом. Он поддерживает WYSIWYG (что видишь, то и получаешь), мгновенный рендеринг (похожий на Typora) и режим разделения экрана для предварительного просмотра. Vditor написан на TypeScript и поддерживает JavaScript, а также фреймворки Vue, React, Angular и Svelte.
Введение
Vditor — это редактор Markdown для браузера, который предлагает WYSIWYG-редактор, мгновенный рендеринг и разделение экрана для предварительного просмотра документа. Редактор написан на TypeScript, поддерживает JavaScript и такие фреймворки, как Vue, React, Angular и Svelte.
Приглашаем вас посетить официальный форум Vditor по адресу https://ld246.com/tag/vditor. Также рекомендуем подписаться на B3log Open Source Community в WeChat — общедоступный аккаунт B3log开源.
История создания
С ростом популярности Markdown всё больше приложений интегрируют редакторы Markdown. В настоящее время существует три основных типа редакторов Markdown:
Эти три типа соответствуют трём сценариям использования:
Поэтому редактор, способный адаптироваться к различным сценариям использования, крайне важен. Такой редактор должен учитывать следующие аспекты:
Vditor стремится удовлетворить эти потребности и внести свой вклад в современную область универсальных редакторов Markdown.
Особенности
Режимы редактирования
Режим WYSIWYG подходит для пользователей, не знакомых с Markdown, или для опытных пользователей, которым удобно работать в этом режиме.
Режим мгновенного рендеринга похож на Typora и обеспечивает наиболее элегантный способ редактирования Markdown. | enable | 是否启用评论模式 | false | | --- | --- | --- | | add(id: string, text: string, commentsData: ICommentsData[]) | 添加评论回调 | - | | remove(ids: string[]) | 删除评论回调 | - | | scroll(top: number) | 滚动回调 | - | | adjustTop(commentsData: ICommentsData[])| 文档修改时,适配评论高度 | - |
说明 | 默认值 | |
---|---|---|
delay | 预览 debounce 毫秒间隔 | 1000 |
maxWidth | 预览区域最大宽度 | 800 |
mode | 显示模式:both, editor | 'both' |
url | md 解析请求 | - |
parse(element: HTMLElement) | 预览回调 | - |
transform(html: string): string | 渲染之前回调 | - |
说明 | 默认值 | |
---|---|---|
defaultLang | 未指定语言时默认使用该语言 | '' |
enable | 是否启用代码高亮 | true |
style | 可选值参见Chroma | github |
lineNumber | 是否启用行号 | false |
langs | 自定义指定语言 | CODE_LANGUAGES |
renderMenu(code: HTMLElement, copy: HTMLElement) | 渲染菜单按钮 | - |
说明 | 默认值 | |
---|---|---|
autoSpace | 自动空格 | false |
gfmAutoLink | 自动链接 | true |
fixTermTypo | 自动矫正术语 | false |
toc | 插入目录 | false |
footnotes | 脚注 | true |
codeBlockPreview | wysiwyg 和 ir 模式下是否对代码块进行渲染 | true |
mathBlockPreview | wysiwyg 和 ir 模式下是否对数学公式进行渲染 | true |
paragraphBeginningSpace | 段落开头空两个 | false |
sanitize | 是否启用过滤 XSS | true |
listStyle | 为列表添加 data-style 属性 | false |
linkBase | 链接相对路径前缀 | '' |
linkPrefix | 链接强制前缀 | '' |
mark | 启用 mark 标记 | false |
说明 | 默认值 | |
---|---|---|
current | 当前主题 | "light" |
list | 可选主题列表 | { "ant-design": "Ant Design", dark: "Dark", light: "Light", wechat: "WeChat" } |
path | 主题样式地址 | https://unpkg.com/vditor@${VDITOR_VERSION}/dist/css/content-theme |
说明 | 默认值 | |
---|---|---|
inlineDigit | 内联数学公式起始 $ 后是否允许数字 | false |
macros | 使用 MathJax 渲染时传入的宏定义 | {} |
engine | 数学公式渲染引擎:KaTeX, MathJax | 'KaTeX' |
mathJaxOptions | 数学公式渲染引擎为 MathJax 时的参数 | - |
默认值为 ["desktop", "tablet", "mobile", "mp-wechat", "zhihu"]。 可从默认值中挑选进行配置,也可使用以下字段进行自定制开发。
说明 | 默认值 | |
---|---|---|
key | 按钮唯一标识,不能为空 | - |
text | 按钮文字 | - |
tooltip | 提示 | - |
className | 按钮类名 | - |
click(key: string) | 按钮点击回调事件 | - |
说明 | 默认值 | |
---|---|---|
enable | 是否启用多媒体渲染 | true |
说明 | 默认值 | |
---|---|---|
isPreview | 是否预览图片 | true |
preview(bom: Element) => void | 图片预览处理 | - |
说明 | 默认值 | |
---|---|---|
isOpen | 是否打开链接地址 | true |
click(bom: Element) => void | 点击链接事件 | - |
说明 | 默认值 | |
---|---|---|
parse | 是否进行 md 解析 | true |
delay | 提示 debounce 毫秒间隔 | 200 |
emoji | 默认表情,可从lute/emoji_map 中选取,也可自定义 | { '+1': '👍', '-1': '👎', 'heart': '❤️', 'cold_sweat': '😰' } |
emojiTail | 常用表情提示 | - |
emojiPath | 表情图片地址 | https://unpkg.com/vditor@${VDITOR_VERSION}/dist/images/emoji |
extend: IHintExtend[] | 对 @/话题等关键字自动补全的扩展 | [] |
interface IHintData {
html: string;
value: string;
}
interface IHintExtend {
key: string;
hint?(value: string): IHintData[] | Promise<IHintData[]>;
}
format
进行转换。// POST data
xhr.send(formData); // formData = FormData.append("file[]", File)
// return data
{
"msg": "",
"code": 0,
"data": {
"errFiles": ['filename', 'filename2'],
"succMap": {
"filename3": "filepath3",
"filename3": "filepath3"
}
}
}
linkToImgUrl
可将剪贴板中的站外图片地址传到服务器端进行保存处理,其数据结构如下:// POST data
xhr.send(JSON.stringify({url: src})); // src 为站外图片地址
// return data
{
msg: '',
code: 0,
data : {
originalURL: '',
url: ''
}
}
success
,format
,error
不会同时触发,具体调用情况如下:if (xhr.status === 200) {
if (vditor.options.upload.success) {
vditor.options.upload.success(editorElement, **Объект options**
* string — путь к изображению эмодзи;
* hljs?: IHljs — см. options.preview.hljs;
* speech?: {enable?: boolean} — параметры чтения выбранного содержимого;
* math?: IMath — конфигурация рендеринга математических формул;
* cdn?: string — адрес собственного CDN;
* transform?(html: string): string — метод обратного вызова перед рендерингом;
* after?() — метод обратного вызова после рендеринга;
* lazyLoadImage?: string — если установлено значение адреса изображения Loading, то включается отложенная загрузка изображений;
* markdown?: options.preview.markdown — параметры Markdown;
* theme?: options.preview.theme — тема;
* render?: options.preview.render — рендеринг;
* renderers?: ILuteRender — пользовательский рендеринг (https://ld246.com/article/1588412297062).
⚠️ Нельзя одновременно импортировать method.min.js и index.min.js.
| | Описание |
| --- | --- |
| previewImage(oldImgElement: HTMLImageElement, lang: keyof II18n = «zh_CN», theme = «classic») | Просмотр изображения по клику |
| mermaidRender(element: HTMLElement, cdn = options.cdn, theme = options.theme) | Рендеринг диаграмм последовательности, блок-схем и диаграмм Ганта |
| flowchartRender(element: HTMLElement, cdn = options.cdn) | Рендеринг flowchart |
| codeRender(element: HTMLElement, option?: IHljs) | Добавление кнопки копирования к блоку кода в element |
| chartRender(element: (HTMLElement \| Document) = document, cdn = options.cdn, theme = options.theme) | Рендеринг графиков |
| mindmapRender(element: (HTMLElement \| Document) = document, cdn = options.cdn, theme = options.theme) | Рендеринг ментальных карт |
| plantumlRender(element: (HTMLElement \| Document) = document, cdn = options.cdn) | Рендеринг plantuml |
| abcRender(element: (HTMLElement \| Document) = document, cdn = options.cdn) | Рендеринг нотных партитур |
| md2html(mdText: string, options?: IPreviewOptions): Promise<string> | Преобразование текста Markdown в HTML. Требуется использовать асинхронное программирование (https://ld246.com/article/1546828434083?r=Vanessa#toc_h3_1) |
| preview(previewElement: HTMLDivElement, markdown: string, options?: IPreviewOptions) | Рендеринг страницы с Markdown-статьёй |
| highlightRender(hljsOption?: IHljs, element?: HTMLElement \| Document, cdn = options.cdn) | Выделение блоков кода в element с помощью подсветки |
| mediaRender(element: HTMLElement) | Рендеринг определённых ссылок как видео, аудио или встроенного iframe |
| mathRender(element: HTMLElement, options?: {cdn?: string, math?: IMath}) | Рендеринг математических формул |
| speechRender(element: HTMLElement, lang?: (keyof II18nLang)) | Чтение выделенного текста |
| graphvizRender(element: HTMLElement, cdn?: string) | Рендеринг graphviz |
| outlineRender(contentElement: HTMLElement, targetElement: Element) | Рендеринг оглавления |
| lazyLoadImageRender(element: (HTMLElement \| Document) = document) | Рендеринг изображений с отложенной загрузкой |
| setCodeTheme(codeTheme: string, cdn = options.cdn) | Установка темы кода. codeTheme см. в options.preview.hljs.style |
| setContentTheme(contentTheme: string, path: string) | Установка темы контента. contentTheme см. в options.preview.theme.list |
## 🏗 Разработка документации
### Принцип работы
* Обсуждение [Markdown-редактора «что видишь, то и получаешь»](https://ld246.com/article/1579414663700)
* Реализация Vditor для Markdown «что видишь, то и получаешь» (https://ld246.com/article/1577370404903)
* Lute — оптимизированный для китайского языка движок Markdown, поддерживающий Go и JavaScript (https://ld246.com/article/1567047822949)
### Среда
1. Установите LTS-версию [node](https://nodejs.org/).
2. Скачайте (https://github.com/Vanessa219/vditor/archive/master.zip) последнюю версию кода и распакуйте её.
3. В корневом каталоге выполните команду npm install.
4. Выполните команду npm run start для запуска локального сервера и откройте http://localhost:9000.
5. Внесите изменения в код.
6. Выполните команду npm run build для упаковки кода в каталог dist.
### Переключение на CDN
Поскольку используется механизм отложенной загрузки, по умолчанию CDN — это [https://unpkg.com/vditor](https://unpkg.com/vditor)@версия.
Если необходимо внести изменения в код или использовать собственный CDN, выполните следующие действия:
* При инициализации настройте параметры `options` и `IPreviewOptions`, включая `cdn`, `emojiPath` и `themes`.
* В методах `highlightRender`, `mathRender`, `abcRender`, `chartRender`, `mermaidRender`, `flowchartRender`, `mindmapRender`, `graphvizRender`, `setCodeTheme` и `setContentTheme` добавьте параметр cdn.
* Скопируйте каталог dist после успешной сборки в нужное место или в каталог dist на [jsDelivr](https://www.jsdelivr.com/package/npm/vditor?path=dist).
### Обновление
При обновлении версии внимательно прочитайте раздел «Обновление» в [CHANGELOG](https://github.com/Vanessa219/vditor/blob/master/CHANGELOG.md).
## Ⓜ️ Руководство по использованию Markdown
* Основы синтаксиса (https://ld246.com/article/1583129520165)
* Расширенный синтаксис (https://ld246.com/article/1583305480675)
* Справочник по быстрому доступу (https://ld246.com/article/1583308420519)
## 🏘️ Сообщество
* Официальный сайт (https://b3log.org/vditor).
* Дискуссионная площадка (https://ld246.com/tag/vditor).
* Сообщить о проблеме (https://github.com/Vanessa219/vditor/issues/new).
## 📄 Лицензия
Vditor использует открытый исходный код MIT.
## 🙏 Благодарность
* Lute (https://github.com/88250/lute) — музыкальный движок для структурированного Markdown, поддерживает Go и JavaScript. **📽️ История**
На ранних этапах разработки Sym мы использовали WYSIWYG-редакторы с форматированным текстом. В то время HTML-редакторы были очень популярны, и их было удобно использовать в проекте, а также они соответствовали привычкам пользователей того времени.
Позже появление Markdown постепенно изменило способ вёрстки у всех. Кроме того, поскольку другие наши проекты ориентированы на программистов, переход на использование md был логичным шагом. Мы выбрали CodeMirror — отличный редактор, который предоставляет разработчикам богатый программный интерфейс и хорошо совместим с различными браузерами.
Однако позже, по мере развития наших бизнес-требований, использование CodeMirror иногда казалось довольно «громоздким». Например, для реализации автоматического завершения списка имён пользователей, вставки эмодзи, загрузки файлов и т. д. требовалась глубокая вторичная разработка, хотя эти бизнес-потребности часто являются общими и необходимыми для многих сценариев проекта.
Наконец, мы решили начать создавать собственный редактор в Sym. После нескольких версий итераций редактор Sym становился всё более зрелым. На нашем сообществе «Цех» (https://ld246.com) люди начали спрашивать, можем ли мы выделить редактор и предоставить его всем для использования. В это же время наш фронтенд-разработчик V чувствовала, что ей тяжело поддерживать редакторы, разбросанные по разным проектам, и она была увлечена TypeScript, поэтому решила использовать ts для создания совершенно нового редактора md для браузера.
Так появился Vditor.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )