EasyMDE: A simple, beautiful, and embeddable JavaScript Markdown editor. Delightful editing for beginners and experts alike. Features built-in autosaving and spell checking.
EasyMDE - Markdown 编辑器
本仓库是 SimpleMDE 的分支,由 Sparksuite 开发。 更多信息请参见专门章节。
一款可直接嵌入的 JavaScript 文本区域替代品,用于编写美观且易读的 Markdown。 EasyMDE 让可能不太熟悉 Markdown 的用户能够使用熟悉的工具栏按钮和快捷键。
此外,编辑时会实时渲染语法,清晰展示预期效果。标题更大,强调的词语变为斜体,链接带有下划线等等。
EasyMDE 还具备内置自动保存和拼写检查功能。 编辑器完全可定制,从主题到工具栏按钮以及 JavaScript 钩子均可调整。
快速访问
安装 EasyMDE
通过 npm:
npm install easymde
通过 UNPKG CDN:
<link rel="stylesheet" href="https://unpkg.com/easymde/dist/easymde.min.css">
<script src="https://unpkg.com/easymde/dist/easymde.min.js"></script>
或者 jsDelivr:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.css">
<script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
如何使用
加载编辑器
安装和/或导入模块后,您可以将 EasyMDE 加载到网页上的第一个 textarea 元素中:
<textarea></textarea>
<script>
const easyMDE = new EasyMDE();
</script>
或者,您可以通过 JavaScript 选择特定的 textarea:
<textarea id="my-text-area"></textarea>
<script>
const easyMDE = new EasyMDE({element: document.getElementById('my-text-area')});
</script>
编辑器功能
使用 easyMDE.value() 获取编辑器内容:
<script>
easyMDE.value();
</script>
使用 easyMDE.value(val) 来设置编辑器内容:
<script>
easyMDE.value('New input for **EasyMDE**');
</script>
配置
选项列表
- autoDownloadFontAwesome:若设为
true,则强制下载 Font Awesome(用于图标)。若设为false,则阻止下载。默认为undefined,此时会智能检查是否已引入 Font Awesome,再决定是否下载。 - autofocus:若设为
true,编辑器会自动获得焦点。默认为false。 - autosave:保存正在输入的文本,并在未来重新加载。当包含编辑器的表单提交后,会清除保存的文本。
- enabled:若设为
true,将自动保存文本。默认为false。 - delay:保存间隔时间,以毫秒为单位。默认为
10000(10 秒)。 - submit_delay:在假设表单提交失败并保存文本之前的延迟时间,以毫秒为单位。默认为
autosave.delay或10000(10 秒)。 - uniqueId:必须设置一个唯一的字符串标识符,以便 EasyMDE 进行自动保存。该标识符应能将此编辑器实例与网站上其他 EasyMDE 实例区分开来。
- timeFormat:设置 DateTimeFormat。更多信息请参见 DateTimeFormat 实例。默认
locale: en-US, format: hour:minute。 - text:设置自动保存的文本。
- enabled:若设为
- autoRefresh:当初始化隐藏在 DOM 节点中的编辑器时非常有用。若设为
{ delay: 300 },则会每 300 毫秒检查一次编辑器是否可见,若可见,则调用 CodeMirror 的refresh()方法。 - blockStyles:自定义某些用于设置文本块样式的按钮行为。
- bold:可设为
**或__。默认为**。 - code:可设为
```或~~~。默认为 ```` �KE_PH_9�`。 - italic:可设为
*或_。默认为*。
- bold:可设为
- unorderedListStyle:可以是
*、-或+。默认为*。 - scrollbarStyle:选择滚动条实现方式。默认值为 "native",显示原生滚动条。核心库还提供 "null" 样式,可完全隐藏滚动条。插件可以实现其他滚动条模式。
- element:要使用的
textarea元素对应的 DOM 元素。默认为页面上的第一个textarea元素。 - forceSync:若设为
true,则强制将 EasyMDE 中所做的文本更改立即存储到原始文本区域中。默认为false。 - hideIcons:要隐藏的图标名称数组。可用于隐藏默认显示的特定图标,而无需完全自定义工具栏。
- indentWithTabs:若设为
false,则使用空格而非制表符进行缩进。默认为true。 - initialValue:若设置此选项,将自定义编辑器的初始值。
- previewImagesInEditor:- EasyMDE 会显示图片预览,默认为
false,仅当图片位于单独行时才会显示预览。 - imagesPreviewHandler:- 用于处理图片预览的自定义函数。接收图片 Markdown 语法
括号之间解析出的字符串作为参数,并返回一个字符串,该字符串将作为预览中<img>标签的src属性。支持在前端动态预览图片,无需将其上传到服务器,允许将图片复制粘贴到编辑器中并进行预览。 - insertTexts:自定义某些用于插入文本的按钮行为。接收一个包含两个元素的数组。第一个元素是插入到光标或选中内容之前的文本,第二个元素是插入到之后的文本。例如,链接的默认值为:
["[", "](http://)"]。- horizontalRule(水平线)
- image(图片)
- link(链接)
- table(表格)
- lineNumbers:若设为
true,则在编辑器中启用行号。 - lineWrapping:若设为
false,则禁用自动换行。默认为true。 - minHeight:设置编辑区域开始自动增长前的最小高度。应为包含有效 CSS 值的字符串,例如
"500px"。默认为"300px"。 - maxHeight:设置编辑区域的固定高度。此时
minHeight选项将被忽略。应为包含有效 CSS 值的字符串,例如"500px"。默认为undefined。 - onToggleFullScreen:编辑器切换全屏模式时调用的函数。该函数将接收一个布尔值作为参数,
true表示编辑器即将进入全屏模式,false则相反。 - parsingConfig:调整编辑期间(非预览期间)解析 Markdown 的设置。
- allowAtxHeaderWithoutSpace:若设为
true,将渲染#后没有空格的标题。默认为false。 - strikethrough:若设为
false,将不处理 GFM 删除线语法。默认为true。 - underscoresBreakWords:若设为
true,允许下划线作为分隔单词的定界符。默认为false。
- allowAtxHeaderWithoutSpace:若设为
- overlayMode:传递自定义的 codemirror 覆盖模式,用于在编辑期间解析和设置 Markdown 的样式。
- mode:一个 codemirror 模式对象。
- combine:若设为
false,将替换默认 Markdown 模式返回的 CSS 类。否则,自定义模式返回的类将与默认模式返回的类组合。默认为true。
- placeholder:若设置此选项,将显示自定义的占位符消息。
- previewClass:激活预览屏幕时应用于该屏幕的字符串或字符串数组。默认为
"editor-preview"。 - previewRender:用于解析纯文本 Markdown 并返回 HTML 的自定义函数。在用户预览时使用。
- promptURLs:若设为
true,将弹出 JS 警告窗口,询问链接或图片的 URL。默认为false。 - promptTexts:自定义用于提示输入 URL 的文本。
- image:提示输入图片 URL 时使用的文本。默认为
URL of the image:。 - link:提示输入链接 URL 时使用的文本。默认为
URL for the link:。
- image:提示输入图片 URL 时使用的文本。默认为
- iconClassMap:用于指定各种工具栏按钮的图标类名。
- uploadImage:若设为
true,启用图片上传功能,可通过拖放、复制粘贴以及浏览文件窗口(当用户点击 upload-image 图标时打开)触发。默认为false。 - imageMaxSize:上传前检查的最大图片大小(以字节为单位)(注意:永远不要信任客户端,务必在服务器端检查图片大小)。默认为
1024 * 1024 * 2(2 MB)。 - imageAccept:用于在上传前检查图片类型的逗号分隔的 MIME 类型列表(注意:永远不要信任客户端,务必在服务器端检查文件类型)。默认为
image/png, image/jpeg。 - imageUploadFunction:用于处理图片上传的自定义函数。使用此函数将使
imageMaxSize、imageAccept、imageUploadEndpoint和imageCSRFToken选项失效。- 该函数接收一个文件以及
onSuccess和onError回调函数作为参数。onSuccess(imageUrl: string)和onError(errorMessage: string)
- 该函数接收一个文件以及
- imageUploadEndpoint:通过异步 POST 请求发送图片数据的端点。服务器应保存此图片并返回 JSON 响应。
- 如果请求处理成功(HTTP 200 OK):
{"data": {"filePath": "<filePath>"}},其中 filePath 是图片的路径(如果imagePathAbsolute设为 true,则为绝对路径,否则为相对路径); - 否则:
{"error": "<errorCode>"},其中 errorCode 可以是noFileGiven(HTTP 400 Bad Request)、typeNotAllowed(HTTP 415 Unsupported Media Type)、fileTooLarge(HTTP 413 Payload Too Large)或importError(见下面的 errorMessages)。如果 errorCode 不是 errorMessages 中的某一个,则会将其原封不动地提示给用户。这允许使用服务器端的错误消息。无默认值。
- 如果请求处理成功(HTTP 200 OK):
- imagePathAbsolute:若设为
true,将把imageUploadFunction返回的imageUrl和imageUploadEndpoint返回的 filePath 视为绝对路径而非相对路径,即不会在其前面添加window.location.origin。 - imageCSRFToken:包含在上传图片的 AJAX 请求中的 CSRF 令牌。适用于 Django、Spring 和 Laravel 等各种情况。
- imageCSRFName:包含在上传图片的 AJAX 请求中的 CSRF 令牌字段名,当
imageCSRFToken有值时应用,默认为csrfmiddlewaretoken。 - imageCSRFHeader:若设为
true,则通过请求头传递 CSRF 令牌。默认为false,此时通过请求体传递 CSRF。 - imageTexts:向用户显示的文本(主要在状态栏上),用于图片导入功能,其中
#image_name#、#image_size#和#image_max_size#将被其各自的值替换,可用于自定义或国际化:- sbInit:当
uploadImage设为true时初始显示的状态消息。默认为Attach files by drag and dropping or pasting from clipboard.。 - sbOnDragEnter:当用户将文件拖到文本区域时显示的状态消息。默认为
Drop image to upload it.。 - sbOnDrop:当用户将文件拖放到文本区域时显示的状态消息。默认为
Uploading images #images_names#。 - sbProgress:显示上传进度的状态消息。默认为
Uploading #file_name#: #progress#%。 - sbOnUploaded:图片上传完成时显示的状态消息。默认为
Uploaded #image_name#。 - sizeUnits:用于显示具有人类可读文件大小的消息的单位列表,以逗号分隔。默认为
B, KB, MB(例如:218 KB)。如果您不喜欢带空格的格式,可以使用B,KB,MB(例如:218KB)。
- sbInit:当
- errorMessages:使用
errorCallback选项向用户显示的错误信息,其中#image_name#、#image_size#和#image_max_size#将被其各自的值替换,可用于自定义或国际化:- noFileGiven:服务器未从用户处接收到任何文件。默认为
You must select a file.。 - typeNotAllowed:用户发送的文件类型与
imageAccept列表不匹配,或服务器返回此错误代码。默认为This image type is not allowed.。 - fileTooLarge:正在导入的图片大小大于
imageMaxSize,或服务器返回此错误代码。默认为Image #image_name# is too big (#image_size#).\nMaximum file size is #image_max_size#.。 - importError:上传图片时发生意外错误。默认为
Something went wrong when uploading the image #image_name#.。
- noFileGiven:服务器未从用户处接收到任何文件。默认为
- errorCallback:用于定义如何显示错误消息的回调函数。默认为
(errorMessage) => alert(errorMessage)。 - renderingConfig:调整预览期间(非编辑期间)解析 Markdown 的设置。
- codeSyntaxHighlighting:若设为
true,将使用 highlight.js 进行语法高亮。默认为false。要使用此功能,必须在页面上引入 highlight.js 或通过hljs选项传入。例如,引入脚本和 CSS 文件如下:<script src="https://cdn.jsdelivr.net/highlight.js/latest/highlight.min.js"></script><link rel="stylesheet" href="https://cdn.jsdelivr.net/highlight.js/latest/styles/github.min.css"> - hljs:highlight.js 的可注入实例。如果不想依赖全局命名空间(
window.hljs),可以在此处提供一个实例。默认为undefined。 - markedOptions:设置内部 Markdown 渲染器的 选项。其他
renderingConfig选项将优先于此。 - singleLineBreaks:若设为
false,禁用解析 GitHub 风格 Markdown (GFM) 的单行换行。默认为true。 - sanitizerFunction:用于清理 Markdown 渲染器 HTML 输出的自定义函数。
- codeSyntaxHighlighting:若设为
- shortcuts:与此实例关联的键盘快捷键。默认为 快捷键数组。
- showIcons:要显示的图标名称数组。可用于显示默认隐藏的特定图标,而无需完全自定义工具栏。
- spellChecker:若设为
false,禁用拼写检查器。默认为true。也可选择传递一个符合 CodeMirrorSpellChecker 规范的函数。 - inputStyle:
textarea或contenteditable。桌面端默认为textarea,移动端默认为contenteditable。contenteditable选项是启用 nativeSpellcheck 所必需的。 - nativeSpellcheck:若设为
false,禁用原生拼写检查器。默认为true。 - sideBySideFullscreen:若设为
false,允许在不全屏的情况下进行并排编辑。默认为true。 - status:若设为
false,隐藏状态栏。默认为内置状态栏项目数组。- 此外,您可以设置一个要包含的状态栏项目数组,并指定其顺序。您甚至可以定义自己的自定义状态栏项目。
- styleSelectedText:若设为
false,从选中的行中移除CodeMirror-selectedtext类。默认为true。 - syncSideBySidePreviewScroll:若设为
false,禁用并排模式下的滚动同步。默认为true。 - tabSize:若设置此选项,自定义制表符大小。默认为
2。 - theme:覆盖主题。默认为
easymde。 - toolbar:若设为
false,隐藏工具栏。默认为 图标数组。 - toolbarTips:若设为
false,禁用工具栏按钮提示。默认为true。 - toolbarButtonClassPrefix:设置时,为工具栏按钮类添加前缀。例如,值为
"mde"时,粗体按钮的类将变为"mde-bold"。 - direction:
rtl或ltr。更改文本方向以支持从右到左的语言。默认为ltr。
选项示例
大多数选项展示了非默认行为:
const editor = new EasyMDE({
autofocus: true,
autosave: {
enabled: true,
uniqueId: "MyUniqueID",
delay: 1000,
submit_delay: 5000,
timeFormat: {
locale: 'en-US',
format: {
year: 'numeric',
month: 'long',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
},
},
text: "Autosaved: "
},
blockStyles: {
bold: "__",
italic: "_",
},
unorderedListStyle: "-",
element: document.getElementById("MyID"),
forceSync: true,
hideIcons: ["guide", "heading"],
indentWithTabs: false,
initialValue: "Hello world!",
insertTexts: {
horizontalRule: ["", "\n\n-----\n\n"],
image: [""],
link: ["[", "](https://)"],
table: ["", "\n\n| Column 1 | Column 2 | Column 3 |\n| -------- | -------- | -------- |\n| Text | Text | Text |\n\n"],
},
lineWrapping: false,
minHeight: "500px",
parsingConfig: {
allowAtxHeaderWithoutSpace: true,
strikethrough: false,
underscoresBreakWords: true,
},
placeholder: "Type here...",
previewClass: "my-custom-styling",
previewClass: ["my-custom-styling", "more-custom-styling"],
previewRender: (plainText) => customMarkdownParser(plainText), // Returns HTML from a custom parser
previewRender: (plainText, preview) => { // Async method
setTimeout(() => {
preview.innerHTML = customMarkdownParser(plainText);
}, 250);
// If you return null, the innerHTML of the preview will not
// be overwritten. Useful if you control the preview node's content via
// vdom diffing.
// return null;
return "Loading...";
},
promptURLs: true,
promptTexts: {
image: "Custom prompt for URL:",
link: "Custom prompt for URL:",
},
renderingConfig: {
singleLineBreaks: false,
codeSyntaxHighlighting: true,
sanitizerFunction: (renderedHTML) => {
// Using DOMPurify and only allowing <b> tags
return DOMPurify.sanitize(renderedHTML, {ALLOWED_TAGS: ['b']})
},
},
shortcuts: {
drawTable: "Cmd-Alt-T"
},
showIcons: ["code", "table"],
spellChecker: false,
status: false,
status: ["autosave", "lines", "words", "cursor"], // Optional usage
status: ["autosave", "lines", "words", "cursor", {
className: "keystrokes",
defaultValue: (el) => {
el.setAttribute('data-keystrokes', 0);
},
onUpdate: (el) => {
const keystrokes = Number(el.getAttribute('data-keystrokes')) + 1;
el.innerHTML = `${keystrokes} Keystrokes`;
el.setAttribute('data-keystrokes', keystrokes);
},
}], // Another optional usage, with a custom status bar item that counts keystrokes
styleSelectedText: false,
sideBySideFullscreen: false,
syncSideBySidePreviewScroll: false,
tabSize: 4,
toolbar: false,
toolbarTips: false,
toolbarButtonClassPrefix: "mde",
});
工具栏图标
以下是内置的工具栏图标(默认情况下仅启用部分图标),您可以根据需要重新组织它们。“名称”是图标的名称,在 JavaScript 中引用。“操作”可以是一个函数或要打开的 URL。“类”是赋予图标的类。“提示文本”是通过 title="" 属性显示的小型提示。请注意,快捷键提示会自动添加,并反映指定的操作(如果已为其分配了键绑定)(例如,当 action 的值设置为 bold 且 tooltip 的值设置为 Bold 时,用户最终看到的文本将是“加粗 (Ctrl-B)”)。
此外,您可以通过在工具栏数组中添加 "|" 在任何图标之间添加分隔符。
| 名称 | 操作 | 提示文本 类 |
|---|---|---|
| bold | toggleBold | 加粗 fa fa-bold |
| italic | toggleItalic | 斜体 fa fa-italic |
| strikethrough | toggleStrikethrough | 删除线 fa fa-strikethrough |
| heading | toggleHeadingSmaller | 标题 fa fa-header |
| heading-smaller | toggleHeadingSmaller | 小一号标题 fa fa-header |
| heading-bigger | toggleHeadingBigger | 大一号标题 fa fa-lg fa-header |
| heading-1 | toggleHeading1 | 一级标题 fa fa-header header-1 |
| heading-2 | toggleHeading2 | 二级标题 fa fa-header header-2 |
| heading-3 | toggleHeading3 | 三级标题 fa fa-header header-3 |
| code | toggleCodeBlock | 代码块 fa fa-code |
| quote | toggleBlockquote | 引用 fa fa-quote-left |
| unordered-list | toggleUnorderedList | 无序列表 fa fa-list-ul |
| ordered-list | toggleOrderedList | 有序列表 fa fa-list-ol |
| check-list | toggleCheckList | 待办列表 fa fa-check-square-o |
| clean-block | cleanBlock | 清除格式 fa fa-eraser |
| link | drawLink | 创建链接 fa fa-link |
| image | drawImage | 插入图片 fa fa-picture-o |
| upload-image | drawUploadedImage | 打开文件浏览窗口 fa fa-image |
| table | drawTable | 插入表格 fa fa-table |
| horizontal-rule | drawHorizontalRule | 插入水平线 fa fa-minus |
| preview | togglePreview | 切换预览 fa fa-eye no-disable |
| side-by-side | toggleSideBySide | 切换分屏预览 fa fa-columns no-disable no-mobile |
| fullscreen | toggleFullScreen | 切换全屏 fa fa-arrows-alt no-disable no-mobile |
| guide | This link | Markdown 指南 fa fa-question-circle |
| undo | undo | 撤销 fa fa-undo |
| redo | redo | 重做 fa fa-redo |
工具栏自定义
使用 toolbar 选项来自定义工具栏。
仅调整现有按钮的顺序:
const easyMDE = new EasyMDE({
toolbar: ["bold", "italic", "heading", "|", "quote"]
});
所有信息和/或添加您自己的图标或文本
const easyMDE = new EasyMDE({
toolbar: [
{
name: "bold",
action: EasyMDE.toggleBold,
className: "fa fa-bold",
title: "Bold",
},
"italic", // shortcut to pre-made button
{
name: "custom",
action: (editor) => {
// Add your own code
},
className: "fa fa-star",
text: "Starred",
title: "Custom Button",
attributes: { // for custom attributes
id: "custom-id",
"data-value": "custom value" // HTML5 data-* attributes need to be enclosed in quotation marks ("") because of the dash (-) in its name.
}
},
"|" // Separator
// [, ...]
]
});
在下拉菜单上放置一些按钮
const easyMDE = new EasyMDE({
toolbar: [{
name: "heading",
action: EasyMDE.toggleHeadingSmaller,
className: "fa fa-header",
title: "Headers",
},
"|",
{
name: "others",
className: "fa fa-blind",
title: "others buttons",
children: [
{
name: "image",
action: EasyMDE.drawImage,
className: "fa fa-picture-o",
title: "Image",
},
{
name: "quote",
action: EasyMDE.toggleBlockquote,
className: "fa fa-percent",
title: "Quote",
},
{
name: "link",
action: EasyMDE.drawLink,
className: "fa fa-link",
title: "Link",
}
]
},
// [, ...]
]
});
键盘快捷键
EasyMDE 内置了一系列预设的键盘快捷键,但您可以通过配置选项对其进行修改。以下是默认快捷键列表:
| 快捷键(Windows / Linux) | 快捷键(macOS) | 操作 |
|---|---|---|
| Ctrl-' | Cmd-' | "toggleBlockquote" |
| Ctrl-B | Cmd-B | "toggleBold" |
| Ctrl-E | Cmd-E | "cleanBlock" |
| Ctrl-H | Cmd-H | "toggleHeadingSmaller" |
| Ctrl-I | Cmd-I | "toggleItalic" |
| Ctrl-K | Cmd-K | "drawLink" |
| Ctrl-L | Cmd-L | "toggleUnorderedList" |
| Ctrl-P | Cmd-P | "togglePreview" |
| Ctrl-Alt-C | Cmd-Alt-C | "toggleCodeBlock" |
| Ctrl-Alt-I | Cmd-Alt-I | "drawImage" |
| Ctrl-Alt-L | Cmd-Alt-L | "toggleOrderedList" |
| Shift-Ctrl-L | Shift-Cmd-L | "toggleCheckList" |
| Shift-Ctrl-H | Shift-Cmd-H | "toggleHeadingBigger" |
| F9 | F9 | "toggleSideBySide" |
| F11 | F11 | "toggleFullScreen" |
| Ctrl-Alt-1 | Cmd-Alt-1 | "toggleHeading1" |
| Ctrl-Alt-2 | Cmd-Alt-2 | "toggleHeading2" |
| Ctrl-Alt-3 | Cmd-Alt-3 | "toggleHeading3" |
| Ctrl-Alt-4 | Cmd-Alt-4 | "toggleHeading4" |
| Ctrl-Alt-5 | Cmd-Alt-5 | "toggleHeading5" |
| Ctrl-Alt-6 | Cmd-Alt-6 | "toggleHeading6" |
以下是如何修改部分快捷键,同时保持其他快捷键不变的方法:
const editor = new EasyMDE({
shortcuts: {
"toggleOrderedList": "Ctrl-Alt-K", // alter the shortcut for toggleOrderedList
"toggleCodeBlock": null, // unbind Ctrl-Alt-C
"drawTable": "Cmd-Alt-T", // bind Cmd-Alt-T to drawTable action, which doesn't come with a default shortcut
}
});
快捷键会在不同平台间自动转换。如果您将快捷键定义为“Cmd-B”,在个人电脑上该快捷键会变为“Ctrl-B”。反之,定义为“Ctrl-B”的快捷键在 Mac 用户使用时会变为“Cmd-B”。
可绑定的操作列表与 工具栏按钮 的内置操作列表相同。
高级用法
事件处理
您可以捕获以下事件列表:https://codemirror.net/doc/manual.html#events
const easyMDE = new EasyMDE();
easyMDE.codemirror.on("change", () => {
console.log(easyMDE.value());
});
从文本区域移除 EasyMDE
您可以通过调用 toTextArea 方法恢复到初始文本区域。请注意,这会清除与其关联的自动保存(如果已启用)。文本区域将保留已销毁的 EasyMDE 实例中的所有文本。
const easyMDE = new EasyMDE();
// ...
easyMDE.toTextArea();
easyMDE = null;
如果您需要移除已注册的事件监听器(当编辑器不再需要时),请调用 easyMDE.cleanup()。
实用方法
以下方法名称直观易懂,在使用 EasyMDE 进行开发时可能会派上用场。
const easyMDE = new EasyMDE();
easyMDE.isPreviewActive(); // returns boolean
easyMDE.isSideBySideActive(); // returns boolean
easyMDE.isFullscreenActive(); // returns boolean
easyMDE.clearAutosavedValue(); // no returned value
工作原理
EasyMDE 是 SimpleMDE 的延续项目。
SimpleMDE 最初是对 lepture's Editor project 的改进,如今已发展出独立的特性。它内置了 CodeMirror,并依赖于 Font Awesome。
CodeMirror 是本项目的核心,能在用户输入时解析大部分 Markdown 语法,从而为正在编辑的 Markdown 添加样式。此外,编辑器顶部和底部分别添加了工具栏和状态栏。预览功能由 Marked 基于 GitHub 风格 Markdown(GFM)渲染。
SimpleMDE 分支
我最初创建此分支是为了在 SimpleMDE 中实现对 FontAwesome 5 的兼容性。完成后,我提交了一个 pull request,但尚未被接受。加之该项目自 2017 年 5 月起便处于非活跃状态,这促使我进行更多修改,试图为项目注入新的活力。
主要变更包括:
- 支持 FontAwesome 5
- 编辑器处于预览模式时,指南按钮可正常使用
- 链接默认使用
https://协议 - 细微的样式调整
- 支持 Node 8 及更高版本
- 大量代码重构
- 预览中的链接默认在新标签页打开
- TypeScript 支持
我的目标是继续开发此项目,不断改进并保持其活力。
开发 EasyMDE
您可能需要修改此库以使其行为符合自身需求。通过以下简单步骤即可实现:
- 遵循贡献指南中的 前提条件 和 安装说明;
- 进行所需修改;
- 运行
gulp命令,生成文件:dist/easymde.min.css和dist/easymde.min.js; - 将这些文件复制到您的代码库中,即可完成。
贡献
想要为 EasyMDE 贡献力量?非常感谢!我们为您准备了一份 贡献指南!
许可证
本项目基于 MIT 许可证 发布。
- 版权所有 (c) 2015 Sparksuite, Inc.
- 版权所有 (c) 2017 Jeroen Akkerman.
Introduction
易用Markdown编辑器(EasyMDE):一款简洁、美观且可嵌入的JavaScript Markdown编辑器。无论是初学者还是专家,都能享受到愉悦的编辑体验。内建自动保存和拼写检查功能。【此简介由AI生成】
