Compare commits

...

17 Commits

  1. 9
      .editorconfig
  2. 1
      .gitignore
  3. 733
      CHANGE.md
  4. 2
      Gulpfile.js
  5. 11
      README.md
  6. 1060
      css/editormd.css
  7. 8
      css/editormd.logo.css
  8. 4
      css/editormd.logo.min.css
  9. 6
      css/editormd.min.css
  10. 1056
      css/editormd.preview.css
  11. 6
      css/editormd.preview.min.css
  12. 1136
      editormd.amd.js
  13. 6
      editormd.amd.min.js
  14. 1135
      editormd.js
  15. 5
      editormd.min.js
  16. 8
      examples/dynamic-create-editormd.html
  17. 6
      examples/emoji.html
  18. 2
      examples/form-get-value.html
  19. 8
      examples/html-preview-markdown-to-html.html
  20. 25
      examples/html-tags-decode.html
  21. 22
      examples/image-cross-domain-upload.html
  22. 12
      examples/image-upload.html
  23. 17
      examples/katex.html
  24. 25
      examples/multi-editormd.html
  25. 5
      examples/php/cross-domain-upload.php
  26. 19
      examples/php/editormd.uploader.class.php
  27. 4
      examples/php/upload.php
  28. 16
      examples/php/upload_callback.html
  29. 47
      examples/sequence-diagram.html
  30. 5
      examples/task-lists.html
  31. 6
      examples/test.md
  32. 15
      examples/toolbar-auto-fixed.html
  33. 0
      examples/uploads/.gitkeep
  34. 4
      languages/zh-tw.js
  35. 6
      lib/codemirror/addons.min.js
  36. 12
      lib/codemirror/modes.min.js
  37. 11
      lib/marked.min.js
  38. 8
      lib/sequence-diagram.min.js
  39. 4
      package.json
  40. 4
      plugins/code-block-dialog/code-block-dialog.js
  41. 117
      plugins/emoji-dialog/emoji-dialog.js
  42. 4
      plugins/goto-line-dialog/goto-line-dialog.js
  43. 2
      plugins/help-dialog/help-dialog.js
  44. 4
      plugins/html-entities-dialog/html-entities-dialog.js
  45. 37
      plugins/image-dialog/image-dialog.js
  46. 4
      plugins/link-dialog/link-dialog.js
  47. 2
      plugins/preformatted-text-dialog/preformatted-text-dialog.js
  48. 4
      plugins/reference-link-dialog/reference-link-dialog.js
  49. 4
      plugins/table-dialog/table-dialog.js
  50. 2
      scss/editormd.dialog.scss
  51. 30
      scss/editormd.preview.scss
  52. 20
      scss/editormd.preview.themes.scss
  53. 2
      scss/editormd.scss
  54. 1008
      scss/github-markdown.scss
  55. 2
      scss/prettify.scss
  56. 1183
      src/editormd.js

9
.editorconfig

@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

1
.gitignore

@ -8,6 +8,7 @@ research/
test/
backup/
examples/uploads/**/*
!.gitkeep
*.bat
*.sh
.project

733
CHANGE.md

@ -1,222 +1,244 @@
## 更新日志
# 更新日志
### v1.0.x
##### v1.0.0 beta
预览版:基本功能完成;
##### v1.0.0 releases
发布 v1.0.0 正式版。
主要更新:
- 新建分支 `mathjax-version`,但不打算继续对此分支进行开发;
## 目录
- 移除 MathJax,改用 KaTeX [#2](https://github.com/pandao/editor.md/issues/2),解析和预览响应速度大幅度提高 [#3](https://github.com/pandao/editor.md/issues/3);
- 移除 `mathjax` 配置项;
- 移除 `mathjaxURL` 属性;
- 移除 `setMathJaxConfig()` 方法;
- 移除 `loadMathJax()` 方法;
- 移除MathJax的所有示例;
- 新增 `tex` 配置项,表示是否开启支持科学公式 TeX ,基于 KaTeX;
- 新增 `katexURL` 属性;
- 新增 `loadKaTeX` 方法;
- 新增 KaTeX 的示例;
[TOC]
- `setCodeEditor()` 方法更名为 `setCodeMirror()`
## v1.x
- 合并 CodeMirror 使用到的多个 JS 模块文件,大幅减少 HTTP 请求,加快下载速度;
- 新增合并后的两个模块文件:`./lib/codemirror/modes.min.js`、`./lib/codemirror/addons.min.js` ;
- `Gulpfile.js` 新增合并 CodeMirror 模块文件的任务方法 `codemirror-mode``codemirror-addon`
- 另外在使用 Require.js 时,因为 CodeMirror 的严格模块依赖的限制,不能使用上述合并的模块文件,仍然采用动态加载多个模块文件;
### v1.5.x
- 更新 `README.md` 等相关文档和示例;
#### v1.5.0
- 解决 Sea.js 环境下 Raphael.js 无法运行导致不支持流程图和时序图的问题,即必须先加载 Raphael.js ,后加载 Sea.js ;
**主要更新:**
### v1.1.x
- 新增:编辑器黑色主题 Dark,改进自定义主题功能(即工具栏、编辑区、预览区可分别设置主题样式);
- 新增:多行公式支持;
- 新增:支持非编辑状态下的 ToC 自定义容器;
- 新增:支持设置为单向同步滚动;
- 改进:编辑器样式美化,更换了滚动条样式;
- 改进:提高同步滚动定位的精确度;
- 改进:修复和改进 HTML 标签及属性过滤功能;
- 改进:修复在 Bootstrap 下的兼容性问题;
- 修复多处 Bug;
##### v1.1.0
**具体更新:**
主要更新:
- 新增:解析后的代码块自动换行;
- 设计并更换了 Logo;
- 新增添加图片、链接、锚点链接、代码块、预格式文本等操作弹出对话框层及示例;
- 新增支持图片(跨域)上传;
- 改用 `<textarea>` 来存放 Markdown 源文档;
- 新增支持自定义工具栏;
- 新增支持多语言;
- 新增支持 Zepto.js;
- 新增支持多个 Editor.md 并存和动态加载 Editor.md 及示例;
- 新增支持智能识别和解析 HTML 标签及示例;
- 新增多个外部操作方法接口及示例;
- 修复了一些大大小小的 Bug;
- 新增:支持多行公式;
- 新增:新增语法:\`\`\`math | latex | katex;
- 改进:美化 KaTeX 公式,即加大字号等;
具体更新如下:
- 新增:支持设置为单向同步滚动,即只是编辑区单向同步滚动,配置项 `syncScrolling : "single"`
- 新增:配置同步滚动示例文件 `sync-scrolling.html`
- 更换 Logo,建立基础 VI;
- 创建了全系列 WebFont 字体 `dist/fonts/editormd-logo.*`
- 新增样式类 `editormd-logo` 等;
- 新增:增加了编辑器样式主题 Dark,即工具栏和预览区各自有一个暗黑色主题;
- 变更:自 `v1.5.0` 开始,配置项 `theme` 改为指定 Editor.md 本身的主题;
- 新增配置项 `editorTheme` ,用于指定编辑区的主题,即 CodeMirror 的主题;
- 新增配置项 `previewTheme` ,用于指定预览区的主题;
- 新增方法 `setEditorTheme()`,别名: `setCodeMirror()`
- 新增方法 `setPreviewTheme()`
- 修改了方法 `setTheme()`
- 更换了滚动条样式,Only Webkit;
- 改进全屏状态下的样式显示,去掉 JS 操作的部分,改为通过 CSS 样式类 `.editormd-fullscreen` 控制;
- 修改和增加相关的方法、SCSS 文件及示例文件 `themes.html`
- 改用 `<textarea>` 来存放 Markdown 源文档;
- 原先使用 `<script type="text/markdown"></script>` 来存放 Markdown 源文档;
- 创建 Editor.md 只需要写一个 `<div id="xxxx"></div>` ,如果没有添加 `class="editormd"` 属性会自动添加,另外如果不存在 `<textarea>` 标签,则也会自动添加 `<textarea>`
- 新增:非编辑状态下 ToC 自定义容器支持;
- 新增配置项 `markdownSourceCode`,即解析后是否保留源码,默认为不保留 `false`
- 新增配置项 `tocContainer`,值为自定义 ToC 容器的 ID 选择器 `#xxxxx`,默认为空;
- 新增和修改了相关示例文件;
- 新增支持智能识别和解析 HTML 标签,增强了 Markdown 语法的扩展性,几乎无限,例如:插入视频等等;
- 新增配置项 `htmlDecode` ,表示是否开启 HTML 标签识别和解析,但是为了安全性,默认不开启;
- 新增识别和解析 HTML 标签的示例;
- 新增:新增加了 CSS 样式类 `editormd-preview-active`,可以控制全屏HTML预览时的内容层样式;
- 修改了 `previewing()``previewed()` 方法;
- 相关 issues [#103](https://github.com/pandao/editor.md/issues/103);
- 另外也调整了关闭按钮的位置;
- 新增插入链接、锚点链接、预格式文本和代码块的弹出对话框层;
- 弹出层改为使用固定定位;
- 新增动态创建对话框的方法 `createDialog()`
- 新增静态属性 `editormd.codeLanguages` ,用于存放代码语言列表;
- 改进:修复插入 Emoji `:moon:` 无法显示的问题,修改为其是 `:waxing_gibbous_moon:` 的别名 [#94](https://github.com/pandao/editor.md/pull/94);
- 开始支持图片上传;
- 新增添加图片(上传)弹出对话框层;
- 支持基于 iframe 的跨域上传,并添加相应的示例( PHP 版);
- 改进:修改了 CodeMirror 代码行的左右内间距,使其不会挨着左边的行号层;
- 相关 issues [#97](https://github.com/pandao/editor.md/issues/97);
- 开始支持自定义工具栏图标及操作处理;
- 配置项 `toolbarIcons` 类型由数组更改为函数,返回一个图标按钮列表数组;
- 新增配置项 `toolbarHandlers``toolbarIconsTexts` ,分别用于自定义按钮操作处理和按钮内容文本;
- 新增方法 `getToolbarHandles()` ,用于可在外部使用默认的操作方法;
- 新增成员属性 `activeIcon` ,可获取当前或上次点击的工具栏图标的 jQuery 实例对象;
- 改进:修改了同步滚动的定位算法,提高精确度;
- 修正问题 [#99](https://github.com/pandao/editor.md/issues/99);
- 修改了 `bindScrollEvent()` 方法;
- 新增表单取值、自定义工具栏、图片上传、多个 Editor.md 并存和动态加载 Editor.md 等多个示例;
- 改进:完善 HTML 标签过滤功能,即代码块、`<pre>` 预格式文本和行内代码里的标签及属性不会被过滤;
- 修复 Bug [#105](https://github.com/pandao/editor.md/issues/105);
- 改进:当不显示行号时 `settings.lineNumbers == false`,CodeMirror 行号层去掉右边框;
- 改进:根据指针在当前行的位置更合理插入标题和水平线 [#104](https://github.com/pandao/editor.md/pull/104);
- 改进:调整了字体,优先显示 `"YaHei Consolas Hybrid", Consolas`
- 改进:修复在 Bootstrap 下的兼容性问题,即因为 box-sizing 写错位置导致的弹出层宽度等错位问题 [#107](https://github.com/pandao/editor.md/issues/107);
- 新增插入锚点按钮和操作处理;
### v1.4.x
- 新增预览 HTML 内容窗口的关闭按钮,之前只能按 ESC 才能退出 HTML 全窗口预览;
#### v1.4.5
- 新增多语言( l18n )及动态加载语言包支持;
- 新增英语 `en` 和繁体中文 `zh-tw` 语言包模块;
- 修改一些方法的内部实现以支持动态语言加载:
- `toolbarHandler()` 更为 `setToolbarHandler()`
- `setToolbar()` 方法包含 `setToolbarHandler()`
- 新建 `createInfoDialog()` 方法;
- 修改 `showInfoDialog()``hideInfoDialog()` 方法的内部实现等;
- 规范项目的中英文混排;
- 新增配置项 `name`,用于指定 Markdown textarea 的 `name="xxxx"` 属性;
- 修复 Bug,即无法正确解析公式的 `<``>` 的问题 [#87](https://github.com/pandao/editor.md/issues/87);
- 修复 Bug,即 `getHTML()` 无效的问题 [#95](https://github.com/pandao/editor.md/issues/95);
- 修复 Bug,即火狐上传图片后无法返回值的问题 [#96](https://github.com/pandao/editor.md/issues/96);
- 修改了图片上传插件;
- 修改 PHP 上传类及示例;
- 方法更名:`extends()` 更名为 `extend()`,以兼容 IE8;
- 修复 IE8 下 Emoji 正则表达式字符集越界的问题;
- 更新了 `README.md``CHANGE.md` 等相关文档文件;
- 修改多次 Bug ,并优化触摸事件,改进对 iPad 的支持;
#### v1.4.4
- 工具栏新增清空按钮和清空方法 `clear()` ,解决工具栏文本会被选中出现蓝底的问题;
- 修复 Bug [#81](https://github.com/pandao/editor.md/issues/81),即不支持 `:+1:` 的问题;
- 修复 Bug [#85](https://github.com/pandao/editor.md/issues/85),即图片上传返回结果不支持 `Content-Type=application/json` 的问题;
- 修复图片上传无法显示 loading 的问题;
- 配置项 `tocStartLevel` 的默认值由 2 改为 1,表示默认从 H1 开始生成 ToC;
#### v1.4.3
- 解决 IE8 下加载出错的问题;
- 新增两个静态成员属性 `isIE``isIE8` ,用于判断 IE8;
- 由于 IE8 不支持 FlowChart 和 SequenceDiagram,默认在 IE8 下不加载这两个组件,无论是否开启;
- 改进:可配置是否自动聚焦编辑器 [#74](https://github.com/pandao/editor.md/issues/74);
- 新增配置项 `autoFocus`,默认值为 `true`;
- 修复 Bug [#77](https://github.com/pandao/editor.md/issues/77);
- 改进:帮助对话框里的链接改为新窗口打开,避免直接跳转到链接,导致编辑内容丢失的问题 [#79](https://github.com/pandao/editor.md/issues/79);
- 改进和完善编辑器配置项;
- 新增配置项 `tabSize`、`indentUnit` 和 `lineWrapping`
- 新增配置项 `autoCloseBrackets``showTrailingSpace`
- 新增配置项 `matchBrackets`、`indentWithTabs` 和 `styleSelectedText`
- 改进:修改 CSS `font-family`,改进跨平台中英文字体显示;
- 修改了 `README.md`
- 新增 Zepto.js 的支持;
- 为了兼容 Zepto.js ,某些元素在操作处理上不再使用 `outerWidth()``outerHeight()` 、`hover()` 、`is()` 等方法;
- 为了避免修改 flowChart.js 和 sequence-diagram.js 的源码,所以想支持 flowChart 或 sequenceDiagram 得加上这一句: `var jQuery = Zepto;`
#### v1.4.2
- 新增 `editormd.$name` 属性,修改 `editormd.homePage` 属性的新地址;
- 改进和增强自定义工具栏功能,支持图标按钮右对齐 [#69](https://github.com/pandao/editor.md/issues/69);
- 改进和增强 HTML 标签的解析过滤功能,支持过滤指定的属性等 [#70](https://github.com/pandao/editor.md/issues/70);
- 删除分支 `mathjax-version``v1.1.9`
- `editormd.markdownToHTML()` 新增方法返回一个 jQuery 实例对象;
- 该实例对象定义了一个 `getMarkdown()`方法,用于获取 Markdown 源代码;
- 该实例对象定义了一个 `tocContainer` 成员属性,即 ToC 列表的父层的 jQuery 实例对象;
#### v1.4.1
- 新增只读模式;
- 新增配置项 `readOnly` ,默认值为 `false` ,即可编辑模式;
- 其他相关改动;
- 新增配置项 `syncScrolling`,即是否开启同步滚动预览,默认值为 `false`
- 修复 Bug [#64](https://github.com/pandao/editor.md/issues/64);
- 更新 `editormd.katexURL` 资源地址的默认值,即更新版本为 `0.3.0`
- 新增测试用例`tests/katex-tests.html`;
- 修改示例文件`examples/katex.html`;
- 修复 Bug [#66](https://github.com/pandao/editor.md/issues/66);
- 修复编辑器工具栏按钮 `:hover` CSS3 transition 无效的问题;
- 修改了 `README.md`
- 新增方法 `focus()``setCursor()``getCursor()` 、`setSelection()` 、`getSelection()` 、 `replaceSelection()``insertValue()` 方法,并增加对应的示例;
#### v1.4.0
- 新增配置项 `saveHTMLToTextarea` ,用于将解析后的 HTML 保存到 Textarea,以供提交到后台程序;
- `getHTML()` 方法必须在 `saveHTMLToTextarea == true` 的情况下才能使用;
- 新增 `getHTML()` 方法的别名 `getTextareaSavedHTML()` 方法;
- 新增方法 `getPreviewedHTML()` ,用于获取预览窗口的 HTML ;
**主要更新:**
- 修复了一些大大小小的 Bugs;
- 新增延迟解析机制,预览更即时;
- 新增跳转到指定行的功能和对话框;
- 新增 ToC 下拉菜单、自定义 ToC 容器的功能;
- 新增跳转到行、搜索的工具栏按钮;
- 新增支持插入和解析(打印)分页符;
- 改进快捷键功能和自动高度模式等;
- 改进:将锚点链接改名为引用链接;
- 改进编辑器重建和重配置功能;
- 修复多个 Bug;
##### v1.1.1
**具体更新:**
- 接受一个 pull 请求,修复了 `getHTML ()``getPreviewedHTML()` 方法中的 3 处错误;
- 新增延迟解析预览的机制,解决输入太多太快出现的 “延迟卡顿” 问题;
- 新增配置项 `delay` ,默认值为 `300`
- 修复当输入速度太快时,解析Flowchart会抛出错误的问题;
- 修改 iPad 等移动终端的浏览器无法上传图片的问题 [#48](https://github.com/pandao/editor.md/issues/48);
- 修复单独引用 `editormd.preview.css` 时无法显示 Font Awesome 和 Editor.md logo 字体的问题;
- 更新和修改 Gulp 构建;
- 修改了 `Gulpfile.js` ,并且 `gulp-ruby-sass` 升级到最新版本 `1.0.0-alpha.3` ;
- 编辑 SCSS 时,不再生成 CSS 的 Source map 文件;
- 执行 jshint 和更正一些 JS 写法的不规范,精简了代码;
- 新增配置项 `appendMarkdown``appendMarkdown()` 方法,用于(初始化前后)追加 Markdown 到 Textarea ;
- 改进部分预设快捷键功能,包括 F9 (watch)、F10 (preview)、F11 (fullscreen)等;
- 修复自动高度模式下出现的几个问题;
- 全屏退出时高度不正确的问题:修改了 `fullscreenExit()` 方法的内部实现;
- 当解析预览后的 HTML 内容高度高于 Markdown 源码编辑器高度时,无法正确预览的问题 [#49](https://github.com/pandao/editor.md/issues/49);
- 修改 `onscroll``onpreviewscroll` 无法访问 `this` 的问题;
- 修改 `init()` 方法,可以只设置一个参数;
- 新增插入 TeX (KaTeX) 公式的快捷键 `Ctrl + Shift + K` 和插入方法 `tex()`
- 将锚点链接改为引用链接,引用的链接改为插入到页尾;
- 工具栏的名称 `anchor` 改为 `reference-link`
- 工具栏的名称 `htmlEntities` 改名为 `html-entities`
- 改进编辑器重建和重配置功能;
- 修改了 `loadedDisplay()` 方法;
- 修改了 `config()``recreate()` 方法;
- 新增跳转到指定行的功能;
- 新增方法 `gotoLine()`
- 新增跳转到行对话框插件 `goto-line-dialog`
- 新增快捷键 `Ctrl + Alt + G`
- 改进 `executePlugin()` 方法;
- 修改了 `help-dialog/help.md`
- 新增搜索工具栏按钮;
- 新增方法 `search()` 、`searchReplace()` 和 `searchReplaceAll()`
- 原全屏预览 HTML 按钮的图标改为 `fa-desktop`
- 改为默认开启搜索替换功能;
- 更换了关于 Editor.md 的标语( slogan );
- 标题按钮 `h` 改为大写的 `H`
- `saveToTextareas()` 方法更名为 `save()`
- 新增 ToC 下拉菜单、自定义 ToC 容器的功能;
- 新增 Markdown 扩展语法 `[TOCM]` ,自动生成 ToC 下拉菜单;
- 新增配置项 `tocm` ,默认为 `true`,即可以使用 `[TOCM]`
- 新增配置项 `tocDropdown``tocTitle`
- 新增方法 `editormd.tocDropdownMenu()`
- 新增配置项 `tocContainer` ,值为 jQuery 选择器,默认为空;
- 修改了配置项 `placeholder` 的默认值;
- 改进对 IE8 的兼容支持;
- 修复 Firefox 下因为 `Object.watch()` 而出现的问题;
- 新增支持插入和解析(打印)分页符;
- 新增配置项 `pageBreak` ,默认值为 `true`
- 新增语法 `[========]` ,即括号内至少 8 个等号;
- 新增插入分页符的工具栏图标和方法 `pagebreak()`
- 新增插入分页符的快捷键 `Shift + Alt + P`
- 修复一些 Bug,包括 [#51](https://github.com/pandao/editor.md/issues/51) 等;
- 新增和修改以上更新的相关示例;
##### v1.1.2
### v1.3.x
- 修复 Bug [#10](https://github.com/pandao/editor.md/issues/10);
- 修复 Bug [#12](https://github.com/pandao/editor.md/issues/12);
#### v1.3.0
##### v1.1.3
**主要更新:**
- 修复 Bug [#14](https://github.com/pandao/editor.md/issues/14);
- 修复 Bug [#15](https://github.com/pandao/editor.md/issues/15);
- 预设键盘快捷键处理(粗体等),插入 Markdown 更加方便;
- 更新 CodeMirror 版本为 `5.0`
- 更新 Marked 版本为 `0.3.3`
- 新增自动高度和工具栏固定定位功能;
- 改进表格插入对话框;
- 工具栏新增三个按钮,分别是将所选文本首字母转成大写、转成小写、转成大写;
- 修改使用帮助文档;
- 修复多个 Bug;
##### v1.1.4
**具体更新如下:**
- 修复 Bug [#17](https://github.com/pandao/editor.md/issues/17);
- 修改了 `getToolbarHandles()``setToolbarHandler()` 方法;
- 从 `editormd.scss` 中分离出 `editormd.logo.scss` ,并生成 `editormd.logo.css` ,以便单独使用;
- 同时修改了 `Gulpfile.js` 的相应任务;
##### v1.1.5
- 修复 Bug [#18](https://github.com/pandao/editor.md/issues/18);
- 修改了 `showInfoDialog()``createInfoDialog()` 方法;
- 新增 `infoDialogPosition()` 方法;
- 修复 Bug [#20](https://github.com/pandao/editor.md/issues/20);
- 修改了引用的处理函数;
- 插入的 headers 的 `#` 号后面都加上了一个空格;
##### v1.1.6
修复多处 Bug,具体如下:
- 修复 Bug [#23](https://github.com/pandao/editor.md/issues/23),即 Headers 的 id 属性的重复及中文问题;
- 修改了 `editormd.markedRenderer()` 方法;
- 修复 Bug [#24](https://github.com/pandao/editor.md/issues/24);
- 修改了 `setMarkdown()``clear()``loadedDisplay()` 方法的内部实现;
- 新增了 `katexRender()``flowChartAndSequenceDiagramRender()``previewCodeHighlight()` 方法;
- 修复有些情况下无法保存 Markdown 源文档到 textarea 的问题;
- 修改了 `setCodeMirror()``recreateEditor()` 等方法;
- 修改了以上 Bug 及部分相关示例文件;
##### v1.1.7
修复多处 Bug,具体如下:
- 修复 Bug [#25](https://github.com/pandao/editor.md/issues/25);
- 修改了 `loadedDisplay()` 方法,将 `settings.onload` 移动了 `CodeMirror.on("change")` 事件注册后再触发;
- 修复 Bug [#26](https://github.com/pandao/editor.md/issues/26);
- 修改了 `saveToTextareas()` 方法;
- 新增 `state.loaded``state.watching` 两个属性;
- 修改了以上 Bug 相关示例文件;
##### v1.1.8
改进功能,具体如下:
- 改进 [#27](https://github.com/pandao/editor.md/issues/27);
- 新增配置项 `matchWordHighlight` ,可选值有: `true, false, "onselected"` ,默认值为 `true` ,即开启自动匹配和标示相同单词;
- 改进 [#28](https://github.com/pandao/editor.md/issues/28);
- 将 `jquery.min.js``font-awesome.min.css``github-markdown.css` 移除(这是一个疏忽,它们不是动态加载的依赖模块或者不需要的,避免不必要的硬盘空间占用);
- 修改了所有相关的示例文件;
##### v1.1.9
- 修复无法解析 heading link 的 Bug [#29](https://github.com/pandao/editor.md/issues/29);
- 修改了 `editormd.markedRenderer()` 方法的内部实现;
- 新增了 `editormd.trim()` ,用于清除字符串两边的空格;
- 修改了所有相关的示例文件和测试用例 `marked-heading-link-test.html`
- 新增常用键盘快捷键预设处理;
- 新增属性 `editormd.keyMaps` ,预设一些常用操作,例如插入粗体等;
- 新增成员方法 `registerKeyMaps()`
- 退出HTML全屏预览快捷键更改为 `Shift + ESC`
- 新增配置项 `disabledKeyMaps` ,用于屏蔽一些快捷键操作;
- 更新 CodeMirror 版本为 `5.0`
- 修改无法输入 `/` 的问题;
- 更新 Marked 版本为 `0.3.3`
- 新增自动高度和工具栏固定定位(滚动条拖动时)模式;
- 新增配置项 `settings.autoHeight`
- 新增配置项 `settings.toolbarAutoFixed`
- 新增方法 `setToolbarAutoFixed(true|false)`
- 新增邮箱地址自动添加链接功能;
- 新增配置项 `emailLink` ,默认为 `true` ;
- 改进表格插入对话框;
- 工具栏新增三个按钮,分别是将所选文本首字母转成大写、转成小写、转成大写;
- 新增方法 `editormd.ucwords()` ,别名 `editormd.wordsFirstUpperCase()`
- 新增方法 `editormd.ucfirst()` ,别名 `editormd.firstUpperCase()`
- 新增两个成员方法 `getSelections()``getSelections()`
- 修改了 `README.md` ,添加了 `Shields.io` 图标;
- 修复 Font awesome 图标 emoji 部分无法解析的 Bug,[#39](https://github.com/pandao/editor.md/issues/39)
- 改进 @link 功能 [#40](https://github.com/pandao/editor.md/issues/40);
- 新增配置项 `atLink` ,默认为 `true` ;
- 修复无法输入 `/` 的问题 [#42](https://github.com/pandao/editor.md/issues/42);
- 修改使用帮助说明的错误 [#43](https://github.com/pandao/editor.md/issues/43);
- 新增配置项 `pluginPath`,默认为空时,等于 `settings.path + "../plugins/"`
### v1.2
### v1.2.x
##### v1.2.0
#### v1.2.0
v1.2.0 主要更新:
**主要更新:**
- 新增代码折叠、搜索替换、自定义样式主题和自定义快捷键等功能;
- 新增 Emoji 表情、@Link 、GFM Task Lists 支持;
@ -304,231 +326,212 @@ v1.2.0 主要更新:
- 修改和新增以上改进等相关示例;
### v1.3
### v1.1.x
#### v1.3.0
#### v1.1.9
主要更新:
- 修复无法解析 heading link 的 Bug [#29](https://github.com/pandao/editor.md/issues/29);
- 预设键盘快捷键处理(粗体等),插入 Markdown 更加方便;
- 更新 CodeMirror 版本为 `5.0`
- 更新 Marked 版本为 `0.3.3`
- 新增自动高度和工具栏固定定位功能;
- 改进表格插入对话框;
- 工具栏新增三个按钮,分别是将所选文本首字母转成大写、转成小写、转成大写;
- 修改使用帮助文档;
- 修复多个 Bug;
- 修改了 `editormd.markedRenderer()` 方法的内部实现;
- 新增了 `editormd.trim()` ,用于清除字符串两边的空格;
- 修改了所有相关的示例文件和测试用例 `marked-heading-link-test.html`
具体更新如下:
- 修改了 `README.md` ,添加了 `Shields.io` 图标;
- 新增常用键盘快捷键预设处理;
- 新增属性 `editormd.keyMaps` ,预设一些常用操作,例如插入粗体等;
- 新增成员方法 `registerKeyMaps()`
- 退出HTML全屏预览快捷键更改为 `Shift + ESC`
- 新增配置项 `disabledKeyMaps` ,用于屏蔽一些快捷键操作;
- 更新 CodeMirror 版本为 `5.0`
- 修改无法输入 `/` 的问题;
- 更新 Marked 版本为 `0.3.3`
- 新增自动高度和工具栏固定定位(滚动条拖动时)模式;
- 新增配置项 `settings.autoHeight`
- 新增配置项 `settings.toolbarAutoFixed`
- 新增方法 `setToolbarAutoFixed(true|false)`
- 新增邮箱地址自动添加链接功能;
- 新增配置项 `emailLink` ,默认为 `true` ;
- 改进表格插入对话框;
- 工具栏新增三个按钮,分别是将所选文本首字母转成大写、转成小写、转成大写;
- 新增方法 `editormd.ucwords()` ,别名 `editormd.wordsFirstUpperCase()`
- 新增方法 `editormd.ucfirst()` ,别名 `editormd.firstUpperCase()`
- 新增两个成员方法 `getSelections()``getSelections()`
#### v1.1.8
- 修复 Font awesome 图标 emoji 部分无法解析的 Bug,[#39](https://github.com/pandao/editor.md/issues/39)
- 改进 @link 功能 [#40](https://github.com/pandao/editor.md/issues/40);
- 新增配置项 `atLink` ,默认为 `true` ;
- 修复无法输入 `/` 的问题 [#42](https://github.com/pandao/editor.md/issues/42);
- 修改使用帮助说明的错误 [#43](https://github.com/pandao/editor.md/issues/43);
- 新增配置项 `pluginPath`,默认为空时,等于 `settings.path + "../plugins/"`
改进功能,具体如下:
### v1.4
- 改进 [#27](https://github.com/pandao/editor.md/issues/27);
- 新增配置项 `matchWordHighlight` ,可选值有: `true, false, "onselected"` ,默认值为 `true` ,即开启自动匹配和标示相同单词;
#### v1.4.0
- 改进 [#28](https://github.com/pandao/editor.md/issues/28);
- 将 `jquery.min.js``font-awesome.min.css``github-markdown.css` 移除(这是一个疏忽,它们不是动态加载的依赖模块或者不需要的,避免不必要的硬盘空间占用);
主要更新:
- 修改了所有相关的示例文件;
- 新增延迟解析机制,预览更即时;
- 新增跳转到指定行的功能和对话框;
- 新增 ToC 下拉菜单、自定义 ToC 容器的功能;
- 新增跳转到行、搜索的工具栏按钮;
- 新增支持插入和解析(打印)分页符;
- 改进快捷键功能和自动高度模式等;
- 改进:将锚点链接改名为引用链接;
- 改进编辑器重建和重配置功能;
- 修复多个 Bug;
#### v1.1.7
具体更新
修复多处 Bug,具体如下:
- 新增延迟解析预览的机制,解决输入太多太快出现的 “延迟卡顿” 问题;
- 新增配置项 `delay` ,默认值为 `300`
- 修复当输入速度太快时,解析Flowchart会抛出错误的问题;
- 修改 iPad 等移动终端的浏览器无法上传图片的问题 [#48](https://github.com/pandao/editor.md/issues/48);
- 修复单独引用 `editormd.preview.css` 时无法显示 Font Awesome 和 Editor.md logo 字体的问题;
- 更新和修改 Gulp 构建;
- 修改了 `Gulpfile.js` ,并且 `gulp-ruby-sass` 升级到最新版本 `1.0.0-alpha.3` ;
- 编辑 SCSS 时,不再生成 CSS 的 Source map 文件;
- 执行 jshint 和更正一些 JS 写法的不规范,精简了代码;
- 新增配置项 `appendMarkdown``appendMarkdown()` 方法,用于(初始化前后)追加 Markdown 到 Textarea ;
- 改进部分预设快捷键功能,包括 F9 (watch)、F10 (preview)、F11 (fullscreen)等;
- 修复自动高度模式下出现的几个问题;
- 全屏退出时高度不正确的问题:修改了 `fullscreenExit()` 方法的内部实现;
- 当解析预览后的 HTML 内容高度高于 Markdown 源码编辑器高度时,无法正确预览的问题 [#49](https://github.com/pandao/editor.md/issues/49);
- 修改 `onscroll``onpreviewscroll` 无法访问 `this` 的问题;
- 修改 `init()` 方法,可以只设置一个参数;
- 新增插入 TeX (KaTeX) 公式的快捷键 `Ctrl + Shift + K` 和插入方法 `tex()`
- 将锚点链接改为引用链接,引用的链接改为插入到页尾;
- 工具栏的名称 `anchor` 改为 `reference-link`
- 工具栏的名称 `htmlEntities` 改名为 `html-entities`
- 改进编辑器重建和重配置功能;
- 修改了 `loadedDisplay()` 方法;
- 修改了 `config()``recreate()` 方法;
- 新增跳转到指定行的功能;
- 新增方法 `gotoLine()`
- 新增跳转到行对话框插件 `goto-line-dialog`
- 新增快捷键 `Ctrl + Alt + G`
- 改进 `executePlugin()` 方法;
- 修改了 `help-dialog/help.md`
- 新增搜索工具栏按钮;
- 新增方法 `search()` 、`searchReplace()` 和 `searchReplaceAll()`
- 原全屏预览 HTML 按钮的图标改为 `fa-desktop`
- 改为默认开启搜索替换功能;
- 更换了关于 Editor.md 的标语( slogan );
- 标题按钮 `h` 改为大写的 `H`
- `saveToTextareas()` 方法更名为 `save()`
- 新增 ToC 下拉菜单、自定义 ToC 容器的功能;
- 新增 Markdown 扩展语法 `[TOCM]` ,自动生成 ToC 下拉菜单;
- 新增配置项 `tocm` ,默认为 `true`,即可以使用 `[TOCM]`
- 新增配置项 `tocDropdown``tocTitle`
- 新增方法 `editormd.tocDropdownMenu()`
- 新增配置项 `tocContainer` ,值为 jQuery 选择器,默认为空;
- 修改了配置项 `placeholder` 的默认值;
- 改进对 IE8 的兼容支持;
- 修复 Firefox 下因为 `Object.watch()` 而出现的问题;
- 新增支持插入和解析(打印)分页符;
- 新增配置项 `pageBreak` ,默认值为 `true`
- 新增语法 `[========]` ,即括号内至少 8 个等号;
- 新增插入分页符的工具栏图标和方法 `pagebreak()`
- 新增插入分页符的快捷键 `Shift + Alt + P`
- 修复一些 Bug,包括 [#51](https://github.com/pandao/editor.md/issues/51) 等;
- 新增和修改以上更新的相关示例;
- 修复 Bug [#25](https://github.com/pandao/editor.md/issues/25);
- 修改了 `loadedDisplay()` 方法,将 `settings.onload` 移动了 `CodeMirror.on("change")` 事件注册后再触发;
#### v1.4.1
- 修复 Bug [#26](https://github.com/pandao/editor.md/issues/26);
- 修改了 `saveToTextareas()` 方法;
- 新增 `state.loaded``state.watching` 两个属性;
- 新增配置项 `syncScrolling`,即是否开启同步滚动预览,默认值为 `false`
- 修复 Bug [#64](https://github.com/pandao/editor.md/issues/64);
- 更新 `editormd.katexURL` 资源地址的默认值,即更新版本为 `0.3.0`
- 新增测试用例`tests/katex-tests.html`;
- 修改示例文件`examples/katex.html`;
- 修复 Bug [#66](https://github.com/pandao/editor.md/issues/66);
- 修复编辑器工具栏按钮 `:hover` CSS3 transition 无效的问题;
- 修改了 `README.md`
- 修改了以上 Bug 相关示例文件;
#### v1.4.2
#### v1.1.6
- 改进和增强自定义工具栏功能,支持图标按钮右对齐 [#69](https://github.com/pandao/editor.md/issues/69);
- 改进和增强 HTML 标签的解析过滤功能,支持过滤指定的属性等 [#70](https://github.com/pandao/editor.md/issues/70);
- 删除分支 `mathjax-version``v1.1.9`
修复多处 Bug,具体如下:
#### v1.4.3
- 修复 Bug [#23](https://github.com/pandao/editor.md/issues/23),即 Headers 的 id 属性的重复及中文问题;
- 修改了 `editormd.markedRenderer()` 方法;
- 改进:可配置是否自动聚焦编辑器 [#74](https://github.com/pandao/editor.md/issues/74);
- 新增配置项 `autoFocus`,默认值为 `true`;
- 修复 Bug [#77](https://github.com/pandao/editor.md/issues/77);
- 改进:帮助对话框里的链接改为新窗口打开,避免直接跳转到链接,导致编辑内容丢失的问题 [#79](https://github.com/pandao/editor.md/issues/79);
- 改进和完善编辑器配置项;
- 新增配置项 `tabSize`、`indentUnit` 和 `lineWrapping`
- 新增配置项 `autoCloseBrackets``showTrailingSpace`
- 新增配置项 `matchBrackets`、`indentWithTabs` 和 `styleSelectedText`
- 改进:修改 CSS `font-family`,改进跨平台中英文字体显示;
- 修改了 `README.md`
- 修复 Bug [#24](https://github.com/pandao/editor.md/issues/24);
- 修改了 `setMarkdown()``clear()``loadedDisplay()` 方法的内部实现;
- 新增了 `katexRender()``flowChartAndSequenceDiagramRender()``previewCodeHighlight()` 方法;
#### v1.4.4
- 修复有些情况下无法保存 Markdown 源文档到 textarea 的问题;
- 修改了 `setCodeMirror()``recreateEditor()` 等方法;
- 修复 Bug [#81](https://github.com/pandao/editor.md/issues/81),即不支持 `:+1:` 的问题;
- 修复 Bug [#85](https://github.com/pandao/editor.md/issues/85),即图片上传返回结果不支持 `Content-Type=application/json` 的问题;
- 修复图片上传无法显示 loading 的问题;
- 修改了以上 Bug 及部分相关示例文件;
#### v1.4.5
#### v1.1.5
- 规范项目的中英文混排;
- 新增配置项 `name`,用于指定 Markdown textarea 的 `name="xxxx"` 属性;
- 修复 Bug,即无法正确解析公式的 `<``>` 的问题 [#87](https://github.com/pandao/editor.md/issues/87);
- 修复 Bug,即 `getHTML()` 无效的问题 [#95](https://github.com/pandao/editor.md/issues/95);
- 修复 Bug,即火狐上传图片后无法返回值的问题 [#96](https://github.com/pandao/editor.md/issues/96);
- 修改了图片上传插件;
- 修改 PHP 上传类及示例;
- 方法更名:`extends()` 更名为 `extend()`,以兼容 IE8;
- 修复 IE8 下 Emoji 正则表达式字符集越界的问题;
- 更新了 `README.md``CHANGE.md` 等相关文档文件;
- 修复 Bug [#18](https://github.com/pandao/editor.md/issues/18);
- 修改了 `showInfoDialog()``createInfoDialog()` 方法;
- 新增 `infoDialogPosition()` 方法;
- 修复 Bug [#20](https://github.com/pandao/editor.md/issues/20);
- 修改了引用的处理函数;
- 插入的 headers 的 `#` 号后面都加上了一个空格;
### v1.5
#### v1.1.4
#### v1.5.0
- 修复 Bug [#17](https://github.com/pandao/editor.md/issues/17);
- 修改了 `getToolbarHandles()``setToolbarHandler()` 方法;
- 从 `editormd.scss` 中分离出 `editormd.logo.scss` ,并生成 `editormd.logo.css` ,以便单独使用;
- 同时修改了 `Gulpfile.js` 的相应任务;
主要更新:
#### v1.1.3
- 新增:编辑器黑色主题 Dark,改进自定义主题功能(即工具栏、编辑区、预览区可分别设置主题样式);
- 新增:多行公式支持;
- 新增:支持非编辑状态下的 ToC 自定义容器;
- 新增:支持设置为单向同步滚动;
- 改进:编辑器样式美化,更换了滚动条样式;
- 改进:提高同步滚动定位的精确度;
- 改进:修复和改进 HTML 标签及属性过滤功能;
- 改进:修复在 Bootstrap 下的兼容性问题;
- 修复多处 Bug;
- 修复 Bug [#14](https://github.com/pandao/editor.md/issues/14);
- 修复 Bug [#15](https://github.com/pandao/editor.md/issues/15);
具体更新:
#### v1.1.2
- 新增:解析后的代码块自动换行;
- 修复 Bug [#10](https://github.com/pandao/editor.md/issues/10);
- 修复 Bug [#12](https://github.com/pandao/editor.md/issues/12);
- 新增:支持多行公式;
- 新增:新增语法:\`\`\`math | latex | katex;
- 改进:美化 KaTeX 公式,即加大字号等;
#### v1.1.1
- 新增:支持设置为单向同步滚动,即只是编辑区单向同步滚动,配置项 `syncScrolling : "single"`
- 新增:配置同步滚动示例文件 `sync-scrolling.html`
- 接受一个 pull 请求,修复了 `getHTML ()``getPreviewedHTML()` 方法中的 3 处错误;
- 新增:增加了编辑器样式主题 Dark,即工具栏和预览区各自有一个暗黑色主题;
- 变更:自 `v1.5.0` 开始,配置项 `theme` 改为指定 Editor.md 本身的主题;
- 新增配置项 `editorTheme` ,用于指定编辑区的主题,即 CodeMirror 的主题;
- 新增配置项 `previewTheme` ,用于指定预览区的主题;
- 新增方法 `setEditorTheme()`,别名: `setCodeMirror()`
- 新增方法 `setPreviewTheme()`
- 修改了方法 `setTheme()`
- 更换了滚动条样式,Only Webkit;
- 改进全屏状态下的样式显示,去掉 JS 操作的部分,改为通过 CSS 样式类 `.editormd-fullscreen` 控制;
- 修改和增加相关的方法、SCSS 文件及示例文件 `themes.html`
#### v1.1.0
- 新增:非编辑状态下 ToC 自定义容器支持;
- 新增配置项 `markdownSourceCode`,即解析后是否保留源码,默认为不保留 `false`
- 新增配置项 `tocContainer`,值为自定义 ToC 容器的 ID 选择器 `#xxxxx`,默认为空;
- 新增和修改了相关示例文件;
**主要更新:**
- 新增:新增加了 CSS 样式类 `editormd-preview-active`,可以控制全屏HTML预览时的内容层样式;
- 修改了 `previewing()``previewed()` 方法;
- 相关 issues [#103](https://github.com/pandao/editor.md/issues/103);
- 另外也调整了关闭按钮的位置;
- 设计并更换了 Logo;
- 新增添加图片、链接、锚点链接、代码块、预格式文本等操作弹出对话框层及示例;
- 新增支持图片(跨域)上传;
- 改用 `<textarea>` 来存放 Markdown 源文档;
- 新增支持自定义工具栏;
- 新增支持多语言;
- 新增支持 Zepto.js;
- 新增支持多个 Editor.md 并存和动态加载 Editor.md 及示例;
- 新增支持智能识别和解析 HTML 标签及示例;
- 新增多个外部操作方法接口及示例;
- 修复了一些大大小小的 Bug;
- 改进:修复插入 Emoji `:moon:` 无法显示的问题,修改为其是 `:waxing_gibbous_moon:` 的别名 [#94](https://github.com/pandao/editor.md/pull/94);
**具体更新如下:**
- 改进:修改了 CodeMirror 代码行的左右内间距,使其不会挨着左边的行号层;
- 相关 issues [#97](https://github.com/pandao/editor.md/issues/97);
- 更换 Logo,建立基础 VI;
- 创建了全系列 WebFont 字体 `dist/fonts/editormd-logo.*`
- 新增样式类 `editormd-logo` 等;
- 改进:修改了同步滚动的定位算法,提高精确度;
- 修正问题 [#99](https://github.com/pandao/editor.md/issues/99)
- 修改了 `bindScrollEvent()` 方法
- 改`<textarea>` 来存放 Markdown 源文档
- 原先使用 `<script type="text/markdown"></script>` 来存放 Markdown 源文档
- 创建 Editor.md 只需要写一个 `<div id="xxxx"></div>` ,如果没有添加 `class="editormd"` 属性会自动添加,另外如果不存在 `<textarea>` 标签,则也会自动添加 `<textarea>`
- 改进:完善 HTML 标签过滤功能,即代码块、`<pre>` 预格式文本和行内代码里的标签及属性不会被过滤;
- 修复 Bug [#105](https://github.com/pandao/editor.md/issues/105);
- 改进:当不显示行号时 `settings.lineNumbers == false`,CodeMirror 行号层去掉右边框;
- 改进:根据指针在当前行的位置更合理插入标题和水平线 [#104](https://github.com/pandao/editor.md/pull/104);
- 改进:调整了字体,优先显示 `"YaHei Consolas Hybrid", Consolas`
- 改进:修复在 Bootstrap 下的兼容性问题,即因为 box-sizing 写错位置导致的弹出层宽度等错位问题 [#107](https://github.com/pandao/editor.md/issues/107);
- 新增支持智能识别和解析 HTML 标签,增强了 Markdown 语法的扩展性,几乎无限,例如:插入视频等等;
- 新增配置项 `htmlDecode` ,表示是否开启 HTML 标签识别和解析,但是为了安全性,默认不开启;
- 新增识别和解析 HTML 标签的示例;
- 新增插入链接、锚点链接、预格式文本和代码块的弹出对话框层;
- 弹出层改为使用固定定位;
- 新增动态创建对话框的方法 `createDialog()`
- 新增静态属性 `editormd.codeLanguages` ,用于存放代码语言列表;
- 开始支持图片上传;
- 新增添加图片(上传)弹出对话框层;
- 支持基于 iframe 的跨域上传,并添加相应的示例( PHP 版);
- 开始支持自定义工具栏图标及操作处理;
- 配置项 `toolbarIcons` 类型由数组更改为函数,返回一个图标按钮列表数组;
- 新增配置项 `toolbarHandlers``toolbarIconsTexts` ,分别用于自定义按钮操作处理和按钮内容文本;
- 新增方法 `getToolbarHandles()` ,用于可在外部使用默认的操作方法;
- 新增成员属性 `activeIcon` ,可获取当前或上次点击的工具栏图标的 jQuery 实例对象;
- 新增表单取值、自定义工具栏、图片上传、多个 Editor.md 并存和动态加载 Editor.md 等多个示例;
- 新增插入锚点按钮和操作处理;
- 新增预览 HTML 内容窗口的关闭按钮,之前只能按 ESC 才能退出 HTML 全窗口预览;
- 新增多语言( l18n )及动态加载语言包支持;
- 新增英语 `en` 和繁体中文 `zh-tw` 语言包模块;
- 修改一些方法的内部实现以支持动态语言加载:
- `toolbarHandler()` 更为 `setToolbarHandler()`
- `setToolbar()` 方法包含 `setToolbarHandler()`
- 新建 `createInfoDialog()` 方法;
- 修改 `showInfoDialog()``hideInfoDialog()` 方法的内部实现等;
- 修改多次 Bug ,并优化触摸事件,改进对 iPad 的支持;
- 工具栏新增清空按钮和清空方法 `clear()` ,解决工具栏文本会被选中出现蓝底的问题;
- 配置项 `tocStartLevel` 的默认值由 2 改为 1,表示默认从 H1 开始生成 ToC;
- 解决 IE8 下加载出错的问题;
- 新增两个静态成员属性 `isIE``isIE8` ,用于判断 IE8;
- 由于 IE8 不支持 FlowChart 和 SequenceDiagram,默认在 IE8 下不加载这两个组件,无论是否开启;
- 新增 Zepto.js 的支持;
- 为了兼容 Zepto.js ,某些元素在操作处理上不再使用 `outerWidth()``outerHeight()` 、`hover()` 、`is()` 等方法;
- 为了避免修改 flowChart.js 和 sequence-diagram.js 的源码,所以想支持 flowChart 或 sequenceDiagram 得加上这一句: `var jQuery = Zepto;`
- 新增 `editormd.$name` 属性,修改 `editormd.homePage` 属性的新地址;
- `editormd.markdownToHTML()` 新增方法返回一个 jQuery 实例对象;
- 该实例对象定义了一个 `getMarkdown()`方法,用于获取 Markdown 源代码;
- 该实例对象定义了一个 `tocContainer` 成员属性,即 ToC 列表的父层的 jQuery 实例对象;
- 新增只读模式;
- 新增配置项 `readOnly` ,默认值为 `false` ,即可编辑模式;
- 其他相关改动;
- 新增方法 `focus()``setCursor()``getCursor()` 、`setSelection()` 、`getSelection()` 、 `replaceSelection()``insertValue()` 方法,并增加对应的示例;
- 新增配置项 `saveHTMLToTextarea` ,用于将解析后的 HTML 保存到 Textarea,以供提交到后台程序;
- `getHTML()` 方法必须在 `saveHTMLToTextarea == true` 的情况下才能使用;
- 新增 `getHTML()` 方法的别名 `getTextareaSavedHTML()` 方法;
- 新增方法 `getPreviewedHTML()` ,用于获取预览窗口的 HTML ;
- 修复了一些大大小小的 Bugs;
### v1.0.x
#### v1.0.0 releases
**主要更新:**
- 新建分支 `mathjax-version`,但不打算继续对此分支进行开发;
- 移除 MathJax,改用 KaTeX [#2](https://github.com/pandao/editor.md/issues/2),解析和预览响应速度大幅度提高 [#3](https://github.com/pandao/editor.md/issues/3);
- 移除 `mathjax` 配置项;
- 移除 `mathjaxURL` 属性;
- 移除 `setMathJaxConfig()` 方法;
- 移除 `loadMathJax()` 方法;
- 移除MathJax的所有示例;
- 新增 `tex` 配置项,表示是否开启支持科学公式 TeX ,基于 KaTeX;
- 新增 `katexURL` 属性;
- 新增 `loadKaTeX` 方法;
- 新增 KaTeX 的示例;
- `setCodeEditor()` 方法更名为 `setCodeMirror()`
- 合并 CodeMirror 使用到的多个 JS 模块文件,大幅减少 HTTP 请求,加快下载速度;
- 新增合并后的两个模块文件:`./lib/codemirror/modes.min.js`、`./lib/codemirror/addons.min.js` ;
- `Gulpfile.js` 新增合并 CodeMirror 模块文件的任务方法 `codemirror-mode``codemirror-addon`
- 另外在使用 Require.js 时,因为 CodeMirror 的严格模块依赖的限制,不能使用上述合并的模块文件,仍然采用动态加载多个模块文件;
- 更新 `README.md` 等相关文档和示例;
- 解决 Sea.js 环境下 Raphael.js 无法运行导致不支持流程图和时序图的问题,即必须先加载 Raphael.js ,后加载 Sea.js ;
#### v1.0.0 beta
正式预览版:基本功能完成;

2
Gulpfile.js

@ -325,7 +325,7 @@ gulp.task("jsdoc2md", function() {
});
*/
gulp.task("watch", function() {
gulp.watch("scss/editormd.scss", ["scss"]);
gulp.watch("scss/*.scss", ["scss"]);
gulp.watch("scss/editormd.preview.scss", ["scss", "scss2"]);
gulp.watch("scss/editormd.logo.scss", ["scss", "scss3"]);
gulp.watch("src/editormd.js", ["js", "amd"]);

11
README.md

@ -185,6 +185,9 @@ Editor.md options and default values:
imageUpload : false, // Enable/disable upload
imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
imageUploadURL : "", // Upload url
imageUploadFields : "", // append upload form fields for CRSF etc. Server-side receives the POST parameters. v1.5.1+
imageUploadCallback : function() {}, // set image upload finish (success or failure) callback handler v1.5.1+
imageUploadCallbackName : '__Editor_md_ImageUploadCallback', // upload callback name for cross-domain upload v1.5.1+
crossDomainUpload : false, // Enable/disable Cross-domain upload
uploadCallbackURL : "", // Cross-domain upload callback url
@ -194,7 +197,7 @@ Editor.md options and default values:
tocDropdown : false, // Enable/disable Table Of Contents dropdown menu
tocContainer : "", // Custom Table Of Contents Container Selector
tocStartLevel : 1, // Said from H1 to create ToC
htmlDecode : false, // Open the HTML tag identification
htmlDecode : false, // Open the HTML tag identification, If set String value expression : tagName,tagName,...|attrName,attrName,...
pageBreak : true, // Enable parse page break [========]
atLink : true, // for @link
emailLink : true, // for email address auto link
@ -202,6 +205,12 @@ Editor.md options and default values:
emoji : false, // :emoji: , Support Github emoji, Twitter Emoji (Twemoji);
// Support FontAwesome icon emoji :fa-xxx: > Using fontAwesome icon web fonts;
// Support Editor.md logo icon emoji :editormd-logo: :editormd-logo-1x: > 1~8x;
emojiCategories : [ // Custom Emoji categories
"github-emoji",
"twemoji",
"font-awesome",
"editormd-logo"
],
tex : false, // TeX(LaTeX), based on KaTeX
flowChart : false, // flowChart.js only support IE9+
sequenceDiagram : false, // sequenceDiagram.js only support IE9+

1060
css/editormd.css

File diff suppressed because it is too large

8
css/editormd.logo.css

@ -1,20 +1,20 @@
/*
* Editor.md
*
* @file editormd.logo.css
* @version v1.5.0
* @file /editormd.logo.css
* @version v1.5.1
* @description Open source online markdown editor.
* @license MIT License
* @author Pandao
* {@link https://github.com/pandao/editor.md}
* @updateTime 2015-06-09
* @updateTime 2019-05-11
*/
/*! prefixes.scss v0.1.0 | Author: Pandao | https://github.com/pandao/prefixes.scss | MIT license | Copyright (c) 2015 */
@font-face {
font-family: 'editormd-logo';
src: url("../fonts/editormd-logo.eot?-5y8q6h");
src: url(".../fonts/editormd-logo.eot?#iefix-5y8q6h") format("embedded-opentype"), url("../fonts/editormd-logo.woff?-5y8q6h") format("woff"), url("../fonts/editormd-logo.ttf?-5y8q6h") format("truetype"), url("../fonts/editormd-logo.svg?-5y8q6h#icomoon") format("svg");
src: url("../fonts/editormd-logo.eot?#iefix-5y8q6h") format("embedded-opentype"), url("../fonts/editormd-logo.woff?-5y8q6h") format("woff"), url("../fonts/editormd-logo.ttf?-5y8q6h") format("truetype"), url("../fonts/editormd-logo.svg?-5y8q6h#icomoon") format("svg");
font-weight: normal;
font-style: normal;
}

4
css/editormd.logo.min.css

@ -1,2 +1,2 @@
/*! Editor.md v1.5.0 | editormd.logo.min.css | Open source online markdown editor. | MIT License | By: Pandao | https://github.com/pandao/editor.md | 2015-06-09 */
/*! prefixes.scss v0.1.0 | Author: Pandao | https://github.com/pandao/prefixes.scss | MIT license | Copyright (c) 2015 */@font-face{font-family:editormd-logo;src:url(../fonts/editormd-logo.eot?-5y8q6h);src:url(.../fonts/editormd-logo.eot?#iefix-5y8q6h)format("embedded-opentype"),url(../fonts/editormd-logo.woff?-5y8q6h)format("woff"),url(../fonts/editormd-logo.ttf?-5y8q6h)format("truetype"),url(../fonts/editormd-logo.svg?-5y8q6h#icomoon)format("svg");font-weight:400;font-style:normal}.editormd-logo,.editormd-logo-1x,.editormd-logo-2x,.editormd-logo-3x,.editormd-logo-4x,.editormd-logo-5x,.editormd-logo-6x,.editormd-logo-7x,.editormd-logo-8x{font-family:editormd-logo;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;font-size:inherit;line-height:1;display:inline-block;text-rendering:auto;vertical-align:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.editormd-logo-1x:before,.editormd-logo-2x:before,.editormd-logo-3x:before,.editormd-logo-4x:before,.editormd-logo-5x:before,.editormd-logo-6x:before,.editormd-logo-7x:before,.editormd-logo-8x:before,.editormd-logo:before{content:"\e1987"}.editormd-logo-1x{font-size:1em}.editormd-logo-lg{font-size:1.2em}.editormd-logo-2x{font-size:2em}.editormd-logo-3x{font-size:3em}.editormd-logo-4x{font-size:4em}.editormd-logo-5x{font-size:5em}.editormd-logo-6x{font-size:6em}.editormd-logo-7x{font-size:7em}.editormd-logo-8x{font-size:8em}.editormd-logo-color{color:#2196F3}
/*! Editor.md v1.5.1 | /editormd.logo.min.css | Open source online markdown editor. | MIT License | By: Pandao | https://github.com/pandao/editor.md | 2019-05-11 */
/*! prefixes.scss v0.1.0 | Author: Pandao | https://github.com/pandao/prefixes.scss | MIT license | Copyright (c) 2015 */@font-face{font-family:editormd-logo;src:url(../fonts/editormd-logo.eot?-5y8q6h);src:url(../fonts/editormd-logo.eot?#iefix-5y8q6h) format("embedded-opentype"),url(../fonts/editormd-logo.woff?-5y8q6h) format("woff"),url(../fonts/editormd-logo.ttf?-5y8q6h) format("truetype"),url(../fonts/editormd-logo.svg?-5y8q6h#icomoon) format("svg");font-weight:400;font-style:normal}.editormd-logo,.editormd-logo-1x,.editormd-logo-2x,.editormd-logo-3x,.editormd-logo-4x,.editormd-logo-5x,.editormd-logo-6x,.editormd-logo-7x,.editormd-logo-8x{font-family:editormd-logo;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;font-size:inherit;line-height:1;display:inline-block;text-rendering:auto;vertical-align:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.editormd-logo-1x:before,.editormd-logo-2x:before,.editormd-logo-3x:before,.editormd-logo-4x:before,.editormd-logo-5x:before,.editormd-logo-6x:before,.editormd-logo-7x:before,.editormd-logo-8x:before,.editormd-logo:before{content:"\e1987"}.editormd-logo-1x{font-size:1em}.editormd-logo-lg{font-size:1.2em}.editormd-logo-2x{font-size:2em}.editormd-logo-3x{font-size:3em}.editormd-logo-4x{font-size:4em}.editormd-logo-5x{font-size:5em}.editormd-logo-6x{font-size:6em}.editormd-logo-7x{font-size:7em}.editormd-logo-8x{font-size:8em}.editormd-logo-color{color:#2196F3}

6
css/editormd.min.css

File diff suppressed because one or more lines are too long

1056
css/editormd.preview.css

File diff suppressed because it is too large

6
css/editormd.preview.min.css

File diff suppressed because one or more lines are too long

1136
editormd.amd.js

File diff suppressed because it is too large

6
editormd.amd.min.js

File diff suppressed because one or more lines are too long

1135
editormd.js

File diff suppressed because it is too large

5
editormd.min.js

File diff suppressed because one or more lines are too long

8
examples/dynamic-create-editormd.html

@ -16,6 +16,7 @@
<div class="btns" style="margin:0;">
<button id="create-btn">动态创建一个 Editor.md</button>
<button id="remove-btn">移除 Editor.md</button>
<button id="destroy-btn">消毁 Editor.md</button>
</div>
</header>
</div>
@ -26,7 +27,7 @@
$(function() {
$("#create-btn").click(function(){
$.getScript("../editormd.js", function() {
$.getScript("../editormd.js?v=20190511", function() {
$("#layout").append("<div id=\"test-editormd\"></div>");
testEditormd = editormd("test-editormd", {
@ -41,6 +42,11 @@
$("#remove-btn").click(function() {
testEditormd.editor.remove();
});
$("#destroy-btn").click(function() {
testEditormd.destroy();
testEditormd = null;
});
});
</script>
</body>

6
examples/emoji.html

@ -165,7 +165,7 @@ This is an H1 :editormd-logo-4x: @pandao
// You can custom Emoji's graphics files url path
editormd.emoji = {
path : "http://www.emoji-cheat-sheet.com/graphics/emojis/",
path : "https://www.webpagefx.com/tools/emoji-cheat-sheet/graphics/emojis/",
ext : ".png"
};
@ -181,6 +181,10 @@ This is an H1 :editormd-logo-4x: @pandao
toc : true,
emoji : true, // Support Github emoji, Twitter Emoji(Twemoji), fontAwesome, Editor.md logo emojis.
// emojiCategories : ["github-emoji", "twemoji"], // Custom Emoji categories
// emojiCategories : ["twemoji"], // Custom Emoji categories
// emojiCategories : ["font-awesome"], // Custom Emoji categories
// emojiCategories : ["editormd-logo"], // Custom Emoji categories
taskList : true,
path : '../lib/'

2
examples/form-get-value.html

@ -13,7 +13,7 @@
<h1>表单取值</h1>
<p>Form get textarea value.</p>
</header>
<form method="post" action="http://editormd.ipandao.com/php/post.php">
<form method="post" action="./php/post.php">
<div id="test-editormd">
<!-- Custom textarea name attribute <textarea style="display:none;" name="test-textarea-name"> -->
<textarea style="display:none;">#### Get value

8
examples/html-preview-markdown-to-html.html

@ -29,7 +29,7 @@
<div id="test-editormd-view2">
<textarea id="append-test" style="display:none;">
###科学公式 TeX(KaTeX)
### 科学公式 TeX(KaTeX)
$$E=mc^2$$
@ -41,7 +41,7 @@ $$\sin(\alpha)^{\theta}=\sum_{i=0}^{n}(x^i + \cos(f))$$
$$X^2 > Y$$
#####上标和下标
##### 上标和下标
上标:X&lt;sup&gt;2&lt;/sup&gt;
@ -61,7 +61,7 @@ alert("script");
&lt;iframe height=498 width=510 src="http://player.youku.com/embed/XMzA0MzIwMDgw" frameborder=0 allowfullscreen&gt;&lt;/iframe&gt;
```
#####Style
##### Style
&lt;style&gt;
body{background:red;}
@ -71,7 +71,7 @@ body{background:red;}
body{background:red;}
&lt;/style&gt;
#####Script
##### Script
&lt;script&gt;
alert("script");

25
examples/html-tags-decode.html

@ -22,7 +22,9 @@
<button class="filter-btn" exp="style,script,iframe|onclick,title,onmouseover,onmouseout,style">Filter style,script,iframe|onclick,title,onmouseover,onmouseout,style</button>
</div>
<div id="test-editormd">
<textarea style="display:none;">#### 开启识别和解析 HTML 标签
<textarea style="display:none;">[TOC]
#### 开启识别和解析 HTML 标签
配置项:
@ -56,7 +58,19 @@ alert("script");
&lt;iframe height=498 width=510 src="http://player.youku.com/embed/XMzA0MzIwMDgw" frameborder=0 allowfullscreen&gt;&lt;/iframe&gt;
```
##### Style
#### **Strong text** Test
##### Image
&lt;img src="http://editor.md.ipandao.com/images/logos/editormd-logo-64x64.png"/&gt;
&lt;a href="https://github.com/pandao/editor.md"&gt;&lt;img src="http://editor.md.ipandao.com/images/logos/editormd-logo-64x64.png"/&gt;&lt/a&gt;
[![](http://editor.md.ipandao.com/images/logos/editormd-logo-64x64.png)](https://github.com/pandao/editor.md)
:sweat_smile: :blush: :smiley: :relaxed: :smile: [:laughing:](https://github.com/pandao/editor.md)
##### Style :sweat_smile:
&lt;style&gt;
body{background:red;}
@ -76,6 +90,8 @@ alert("script");
alert("script");
&lt;/script&gt;
&lt;a href="javascript:alert('xss')"&gt;a javascript:alert("xss")&lt;/a&gt;
##### Events
&lt;div style="color:green;" onclick="alert(1233);" title="div xxxxx"&gt;Events&lt;/div&gt;
@ -103,10 +119,11 @@ alert("script");
width: "90%",
height: 720,
path : '../lib/',
emoji: true,
htmlDecode : true, // Decode all html tags & attributes
// Expression : tagName,tagName,...|attrName,attrName,...
//htmlDecode : "style,script,iframe,sub,sup|on*" // Filter tags, and all on* attributes
//htmlDecode : "style,script,iframe,sub,sup|*" // Filter tags, and all attributes
htmlDecode : "style,script,iframe,sub,sup|on*" // Filter tags, and all on* attributes
// htmlDecode : "style,script,iframe,sub,sup|*" // Filter tags, and all attributes, TOC not parsing
//htmlDecode : "style,script,iframe,sub,sup,embed|onclick,title,onmouseover,onmouseout,style" // Filter tags, and your custom attributes
});

22
examples/image-cross-domain-upload.html

@ -21,8 +21,12 @@
imageUpload : true,
imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
imageUploadURL : "http://xxxxxxx/editor.md/examples/php/cross-domain-upload.php?test=dfdf",
imageUploadFields : "&lt;input type=\"hidden\" name=\"token\" value=\"d3sE3fc87\"/&gt;", // v1.5.1+
crossDomainUpload : true,
uploadCallbackURL : "http://xxxxxx/upload_callback.html?test=dfdf"
uploadCallbackURL : "http://xxxxxx/upload_callback.html?test=dfdf",
imageUploadCallback : function (result, dialog) { // v1.5.1+
console.log('imageUploadCallback: ', this, result, dialog);
}
}
```
@ -74,6 +78,14 @@ exit;
var imageDialog = window.parent.document.getElementById(query['dialog_id']);
//console.log(imageDialog, window.parent.document, window.parent, query);
if (query['callback_handler']) {
try {
window.parent[query['callback_handler']](query, imageDialog);
} catch (e) {
console.error('upload_callback: callback_handler =>', e);
}
}
&lt;/script&gt;
```</textarea>
</div>
@ -89,9 +101,13 @@ exit;
path : '../lib/',
imageUpload : true,
imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
imageUploadURL : "http://www.ipandao.com/editor.md/examples/php/cross-domain-upload.php?test=dfdf",
imageUploadURL : "http://127.0.0.1/editor.md/examples/php/cross-domain-upload.php?test=dfdf",
imageUploadFields : "<input type=\"hidden\" name=\"token\" value=\"d3sE3fc87\"/>", // append upload form fields for CRSF etc. Server-side receives the POST parameters. v1.5.1+
crossDomainUpload : true,
uploadCallbackURL : "http://localhost/editor.md/examples/php/upload_callback.html?test=dfdf"
uploadCallbackURL : "http://localhost/editor.md/examples/php/upload_callback.html?test=dfdf",
imageUploadCallback : function (result, dialog) { // v1.5.1+
console.log('imageUploadCallback: ', this, result, dialog);
}
/*
跨域时,上传的图片服务器后台只需要返回一个跳转 URL 并跳转到原页面同域下的 callback 页面,结构如下:

12
examples/image-upload.html

@ -18,9 +18,13 @@
```javascript
{
imageUpload : false,
imageUpload : true,
imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
imageUploadURL : "./php/upload.php",
imageUploadFields: "&lt;input type=\"hidden\" name=\"token\" value=\"d3sE3fc87\"/&gt;", // append upload form fields for CRSF etc. v1.5.1+
imageUploadCallback : function (result, dialog) { // v1.5.1+
console.log('imageUploadCallback: ', this, result, dialog);
}
}
```
@ -44,7 +48,7 @@
height: 640,
markdown : "",
path : '../lib/',
//dialogLockScreen : false, // 设置弹出层对话框不锁屏,全局通用,默认为 true
//dialogLockScreen : false, // 设置弹出层对话框不锁屏,全局通用,默认为 false
//dialogShowMask : false, // 设置弹出层对话框显示透明遮罩层,全局通用,默认为 true
//dialogDraggable : false, // 设置弹出层对话框不可拖动,全局通用,默认为 true
//dialogMaskOpacity : 0.4, // 设置透明遮罩层的透明度,全局通用,默认值为 0.1
@ -52,6 +56,10 @@
imageUpload : true,
imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
imageUploadURL : "./php/upload.php?test=dfdf",
imageUploadFields: "<input type=\"hidden\" name=\"token\" value=\"d3sE3fc87\"/>", // append upload form fields for CRSF etc. Server-side receives the POST parameters. v1.5.1+
imageUploadCallback : function (result, dialog) { // v1.5.1+
console.log('imageUploadCallback: ', this, result, dialog);
}
/*
上传的后台只需要返回一个 JSON 数据,结构如下:

17
examples/katex.html

@ -31,8 +31,8 @@
// Default using CloudFlare KaTeX's CDN
// You can custom url
editormd.katexURL = {
js : "your url", // default: //cdnjs.cloudflare.com/ajax/libs/KaTeX/0.3.0/katex.min
css : "your url" // default: //cdnjs.cloudflare.com/ajax/libs/KaTeX/0.3.0/katex.min
js : "your url", // default: //cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.1/katex.min
css : "your url" // default: //cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.1/katex.min
};
```
@ -162,6 +162,13 @@ f(x) = \int_{-\infty}^\infty
}
```
```katex
\begin{cases}x^2+y^2-2x=0
\\
x^2+y^2-2x=0
\end{cases}
```
```latex
f(x) = \int_{-\infty}^\infty
\hat f(\xi)\,e^{2 \pi i \xi x}
@ -180,6 +187,12 @@ f(x) = \int_{-\infty}^\infty
<script src="../editormd.js"></script>
<script type="text/javascript">
$(function() {
// custom Katex version
// editormd.katexURL = {
// css : "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.1/katex.min",
// js : "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.1/katex.min"
// };
var testEditor = editormd("test-editormd", {
width: "90%",
height: 640,

25
examples/multi-editormd.html

@ -35,28 +35,29 @@
<script src="js/jquery.min.js"></script>
<script src="../editormd.js"></script>
<script type="text/javascript">
var testEditormd, testEditormd2;
$(function() {
testEditormd = editormd("test-editormd", {
var testEditormd = editormd("test-editormd", {
width: "90%",
height: 480,
markdown : "#### Editor.md A",
path : '../lib/'
});
testEditormd2 = editormd("test-editormd2", {
width: "90%",
height: 480,
markdown : "#### Editor.md B",
path : '../lib/'
var testEditormd2 = editormd("test-editormd2", {
width: "50%",
height: 280,
markdown : "#### Editor.md B\n\n多个 Editor.md 并存",
path : '../lib/',
toolbarIcons: 'mini'
});
testEditormd3 = editormd("test-editormd3", {
width: "90%",
height: 480,
var testEditormd3 = editormd("test-editormd3", {
width: "60%",
height: 380,
markdown : "#### Editor.md C",
path : '../lib/'
path : '../lib/',
toolbarIcons: 'simple',
watch: false
});
});
</script>

5
examples/php/cross-domain-upload.php

@ -39,6 +39,11 @@
'cover' => true // 是否覆盖同名文件,默认为true
));
$imageUploader->appendResult = array(
'callback_handler' => $_GET['callback_handler'],
'meta' => $_POST
);
$imageUploader->redirect = true;
$imageUploader->redirectURL = $callbackUrl . (empty(parse_url($callbackUrl)['query']) ? '?' : '&') . 'dialog_id=' . $_GET['dialog_id'] . '&temp=' . date('ymdhis');

19
examples/php/editormd.uploader.class.php

@ -19,6 +19,7 @@
public $saveName; // 最终保存的文件名
public $saveURL; // 最终保存URL地址
public $savePath; // 保存本地文件路径
public $appendResult = []; // 追加到输出结果的数据
public $randomLength = ''; // 生成随机文件名的长度,当为日期时为日期的格式
public $randomNameType = 1; // 生成随机的形式, NULL为保留原文件名, 1生成随机字符串, 2生成日期文件名
public $formats = array( // 允许上传的文件格式
@ -252,7 +253,7 @@
private function setSeveName()
{
$this->saveName = $this->randomFileName().".".$this->fileExt;
$this->saveName = $this->randomFileName();
if($this->saveName == '') //如果没生成随机文件名,就保留原文件名
{
@ -307,15 +308,23 @@
public function message($message, $success = 0)
{
$array = array(
'success' => $success
'success' => $success,
'message' => $message
);
$array = array_merge($array, $this->appendResult);
$url = $this->saveURL . $this->saveName;
// 适用于跨域上传时,跳转到中介页面等
if ($this->redirect)
{
$this->redirectURL .= "&success=" . $success . "&message=" . $message;
foreach ($array as $key => $value) {
if (is_array($value)) {
$this->redirectURL .= '&' . $key . '=' . urlencode(json_encode($value));
} else {
$this->redirectURL .= '&' . $key . '=' . $value;
}
}
if ($success == 1)
{
@ -330,10 +339,6 @@
{
$array['url'] = $url;
}
else
{
$array['message'] = $message;
}
echo json_encode($array);
}

4
examples/php/upload.php

@ -39,6 +39,10 @@
'cover' => true // 是否覆盖同名文件,默认为true
));
$imageUploader->appendResult = array(
'meta' => $_POST
);
if ($imageUploader->upload($name))
{
$imageUploader->message('上传成功!', 1);

16
examples/php/upload_callback.html

@ -15,9 +15,11 @@
for (var i = 0; i< urlParams.length; i++)
{
var param = urlParams[i].split("=");
query[param[0]] = param[1];
query[param[0]] = param[0] === "meta" ? JSON.parse(decodeURIComponent(param[1])) : param[1];
}
console.log('upload_callback: result =>', JSON.stringify(query, null, ' '));
var imageDialog = window.parent.document.getElementById(query['dialog_id']);
if (parseInt(query['success']) === 1)
@ -26,10 +28,18 @@
}
else
{
alert(query['message']);
alert(decodeURIComponent(query['message']));
}
if (query['callback_handler']) {
try {
window.parent[query['callback_handler']](query, imageDialog);
} catch (e) {
console.error('upload_callback: callback_handler =>', e);
}
}
location.href = "about:blank";
location.replace("about:blank");
</script>
</body>
</html>

47
examples/sequence-diagram.html

@ -12,6 +12,8 @@
<header>
<h1>SequenceDiagram 时序图/序列图</h1>
<p>Based on SequenceDiagram.js:<a href="http://bramp.github.io/js-sequence-diagrams/" target="_blank">http://bramp.github.io/js-sequence-diagrams/</a></p>
<br/>
<p>Web Sequence Diagrams Syntax Examples: <a href="https://www.websequencediagrams.com/" target="_blank">https://www.websequencediagrams.com/</a></p>
</header>
<div id="test-editormd">
<textarea style="display:none;">#### Setting
@ -32,7 +34,7 @@
.........
```
#### Example
#### Examples
```seq
A->B: Message
@ -40,6 +42,49 @@ B->C: Message
C->A: Message
```
```seq
Title: Here is a title
A->B: Normal line
B-->C: Dashed line
C->>D: Open arrow
D-->>A: Dashed open arrow
```
```seq
D->A: text xxxx
A->B: text xxxx
B->A: Wow!
A->D: Hi~
```
```seq
A->A: text
A-->B: text
note right of A: Note Text
```
```seq
# Example of a comment.
Note left of A: Note to the\n left of A
Note right of A: Note to the\n right of A
Note over A: Note over A
Note over A,B: Note over both A and B
```
```seq
participant C
participant B
participant A
Note right of A: By listing the participants\n you can change their order
```
```seq
A->+B: text
B-->A: text
Note right of A: Note A
note over A,B: Note over A-B
```
```sequence
Andrew->China: Says Hello
Note right of China: China thinks\nabout it

5
examples/task-lists.html

@ -22,13 +22,13 @@
### Examples
- [x] @mentions, #refs, [links](), **formatting**, and <del>tags</del> supported;
- [x] list syntax required (any unordered or ordered list supported);
- [x] list syntax required (any unordered or ordered list supported); :heart: :blush:
- [x] this is a complete item;
- [ ] this is an incomplete item [test link](#);
- [ ] this is an incomplete item;
- [ ] this is an incomplete item [test link](#);
- [ ] this is an incomplete item [test link](#);
- [x] list syntax required (any unordered or ordered list supported);
- [x] list syntax required (any unordered or ordered list supported); :smile:
- [x] this is a complete item;
- [ ] this is an incomplete item [test link](#);
- [ ] this is an incomplete item;
@ -53,6 +53,7 @@
testEditor = editormd("test-editormd", {
width : "90%",
height : 720,
emoji : true, // enable for test
taskList : true,
path : '../lib/',
htmlDebode : true,

6
examples/test.md

@ -95,7 +95,7 @@ GFM a-tail link @pandao 邮箱地址自动链接 test.test@gmail.com www@vip.q
| Content Cell | Content Cell |
| Content Cell | Content Cell |
#### JS代码 
#### JS代码
```javascript
function test() {
@ -270,13 +270,15 @@ X&sup2; Y&sup3; &frac34; &frac14; &times; &divide; &raquo;
18&ordm;C &quot; &apos;
#### **简要描述**
[========]
### Emoji表情 :smiley:
> Blockquotes :star:
#### GFM task lists & Emoji & fontAwesome icon emoji & editormd logo emoji :editormd-logo-5x:
#### GFM task lists & Emoji & fontAwesome icon emoji & editormd logo emoji :editormd-logo-2x:
- [x] :smiley: @mentions, :smiley: #refs, [links](), **formatting**, and <del>tags</del> supported :editormd-logo:;
- [x] list syntax required (any unordered or ordered list supported) :editormd-logo-3x:;

15
examples/toolbar-auto-fixed.html

@ -8,7 +8,7 @@
<link rel="shortcut icon" href="https://pandao.github.io/editor.md/favicon.ico" type="image/x-icon" />
</head>
<body>
<div id="layout" style="height:3000px;">
<div id="layout" style="height: 4000px;">
<header>
<h1>工具栏自动固定定位的开启与禁用</h1>
<p>Enable / disable toolbar auto fixed position.</p>
@ -16,6 +16,8 @@
<div class="btns">
<button id="enable-btn">Enable</button>
<button id="disable-btn">Disable</button>
<button id="set-offset-btn">Set editor offset(random)</button>
<button id="reset-offset-btn">Reset editor offset</button>
</div>
<div id="test-editormd">
<textarea style="display:none;">### Hello world!
@ -116,6 +118,17 @@ Bower Distribution of the Sparqlification Mapping Language (SML) Syntax Highligh
// or
//testEditor.config("toolbarAutoFixed", false);
});
$("#set-offset-btn").click(function () {
testEditor.editor.css({
marginLeft: editormd.rand(0, 200) + "px",
marginTop: editormd.rand(0, 1000) + "px"
})
});
$("#reset-offset-btn").click(function () {
testEditor.editor.css("margin", "0 auto");
});
});
</script>
</body>

0
examples/uploads/.gitkeep

4
languages/zh-tw.js

@ -78,7 +78,7 @@
preformattedText : {
title : "添加預格式文本或代碼塊",
emptyAlert : "錯誤:請填寫預格式文本或代碼的內容。",
placeholder : "coding now...."
placeholder : "Coding now...."
},
codeBlock : {
title : "添加代碼塊",
@ -87,7 +87,7 @@
otherLanguage : "其他語言",
unselectedLanguageAlert : "錯誤:請選擇代碼所屬的語言類型。",
codeEmptyAlert : "錯誤:請填寫代碼內容。",
placeholder: : "coding now...."
placeholder : "Coding now...."
},
htmlEntities : {
title : "HTML實體字符"

6
lib/codemirror/addons.min.js

File diff suppressed because one or more lines are too long

12
lib/codemirror/modes.min.js

File diff suppressed because one or more lines are too long

11
lib/marked.min.js

File diff suppressed because one or more lines are too long

8
lib/sequence-diagram.min.js

File diff suppressed because one or more lines are too long

4
package.json

@ -1,6 +1,6 @@
{
"name": "editor.md",
"version": "1.5.0",
"version": "1.5.1",
"description": "Open source online markdown editor.",
"directories": {
"doc": "docs",
@ -8,6 +8,8 @@
"test": "tests"
},
"scripts": {
"dev": "gulp watch",
"build": "gulp",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {

4
plugins/code-block-dialog/code-block-dialog.js

@ -127,11 +127,15 @@
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}],
cancel : [lang.buttons.cancel, function() {
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}]
}

117
plugins/emoji-dialog/emoji-dialog.js

@ -70,10 +70,10 @@
var cm = this.cm;
var settings = _this.settings;
if (!settings.emoji)
{
if (!settings.emoji) {
alert("settings.emoji == false");
return ;
return false;
}
var path = settings.pluginPath + pluginName + "/";
@ -83,12 +83,20 @@
var classPrefix = this.classPrefix;
$.extend(true, this.lang, langs[this.lang.name]);
this.setToolbar();
var lang = this.lang;
var dialogName = classPrefix + pluginName, dialog;
var dialogLang = lang.dialog.emoji;
var categoryNames = {
"github-emoji" : "Github emoji",
"twemoji" : "Twemoji",
"font-awesome" : "Font Awesome",
"editormd-logo" : "Editor.md logo"
};
var dialogContent = [
"<div class=\"" + classPrefix + "emoji-dialog-box\" style=\"width: 760px;height: 334px;margin-bottom: 8px;overflow: hidden;\">",
"<div class=\"" + classPrefix + "tab\"></div>",
@ -97,8 +105,7 @@
cm.focus();
if (editor.find("." + dialogName).length > 0)
{
if (editor.find("." + dialogName).length > 0) {
dialog = editor.find("." + dialogName);
selecteds = [];
@ -107,16 +114,15 @@
this.dialogShowMask(dialog);
this.dialogLockScreen();
dialog.show();
}
else
{
} else {
dialog = this.createDialog({
name : dialogName,
title : dialogLang.title,
width : 800,
height : 475,
height : 480,
mask : settings.dialogShowMask,
drag : settings.dialogDraggable,
cached : true,
content : dialogContent,
lockScreen : settings.dialogLockScreen,
maskStyle : {
@ -139,16 +145,25 @@
});
}
var category = ["Github emoji", "Twemoji", "Font awesome", "Editor.md logo"];
var tab = dialog.find("." + classPrefix + "tab");
var tabTitles = [];
var emojiCategories = [];
if (settings.emojiCategories) {
$.each(settings.emojiCategories, function (key, value) {
emojiCategories.push(value);
tabTitles.push(categoryNames[value]);
});
}
if (tab.html() === "")
{
if (tab.html() === "") {
var head = "<ul class=\"" + classPrefix + "tab-head\">";
var tabTotal = tabTitles.length;
for (var i = 0; i<4; i++) {
for (var i = 0; i < tabTotal; i++) {
var active = (i === 0) ? " class=\"active\"" : "";
head += "<li" + active + "><a href=\"javascript:;\">" + category[i] + "</a></li>";
head += "<li" + active + "><a href=\"javascript:;\">" + tabTitles[i] + "</a></li>";
}
head += "</ul>";
@ -157,10 +172,10 @@
var container = "<div class=\"" + classPrefix + "tab-container\">";
for (var x = 0; x < 4; x++)
{
for (var x = 0; x < tabTotal; x++) {
var display = (x === 0) ? "" : "display:none;";
container += "<div class=\"" + classPrefix + "tab-box\" style=\"height: 260px;overflow: hidden;overflow-y: auto;" + display + "\"></div>";
container += "<div class=\"" + classPrefix + "tab-box\" style=\"height: 320px;overflow: hidden;overflow-y: auto;" + display + "\"></div>";
}
container += "</div>";
@ -169,7 +184,6 @@
}
var tabBoxs = tab.find("." + classPrefix + "tab-box");
var emojiCategories = ["github-emoji", "twemoji", "font-awesome", logoPrefix];
var drawTable = function() {
var cname = emojiCategories[emojiTabIndex];
@ -177,7 +191,6 @@
var $tab = tabBoxs.eq(emojiTabIndex);
if ($tab.html() !== "") {
//console.log("break =>", cname);
return ;
}
@ -186,20 +199,16 @@
var pageTotal = Math.ceil(data.length / rowNumber);
var table = "<div class=\"" + classPrefix + "grid-table\">";
for (var i = 0; i < pageTotal; i++)
{
for (var i = 0; i < pageTotal; i++) {
var row = "<div class=\"" + classPrefix + "grid-table-row\">";
for (var x = 0; x < rowNumber; x++)
{
for (var x = 0; x < rowNumber; x++) {
var emoji = $.trim(data[(i * rowNumber) + x]);
if (typeof emoji !== "undefined" && emoji !== "")
{
if (typeof emoji !== "undefined" && emoji !== "") {
var img = "", icon = "";
if (type === "github-emoji")
{
if (type === "github-emoji") {
var src = (emoji === "+1") ? "plus1" : emoji;
src = (src === "black_large_square") ? "black_square" : src;
src = (src === "moon") ? "waxing_gibbous_moon" : src;
@ -207,32 +216,23 @@
src = exports.emoji.path + src + exports.emoji.ext;
img = "<img src=\"" + src + "\" width=\"24\" class=\"emoji\" title=\"&#58;" + emoji + "&#58;\" alt=\"&#58;" + emoji + "&#58;\" />";
row += "<a href=\"javascript:;\" value=\":" + emoji + ":\" title=\":" + emoji + ":\" class=\"" + classPrefix + "emoji-btn\">" + img + "</a>";
}
else if (type === "twemoji")
{
} else if (type === "twemoji") {
var twemojiSrc = exports.twemoji.path + emoji + exports.twemoji.ext;
img = "<img src=\"" + twemojiSrc + "\" width=\"24\" title=\"twemoji-" + emoji + "\" alt=\"twemoji-" + emoji + "\" class=\"emoji twemoji\" />";
row += "<a href=\"javascript:;\" value=\":tw-" + emoji + ":\" title=\":tw-" + emoji + ":\" class=\"" + classPrefix + "emoji-btn\">" + img + "</a>";
}
else if (type === "font-awesome")
{
} else if (type === "font-awesome") {
icon = "<i class=\"fa fa-" + emoji + " fa-emoji\" title=\"" + emoji + "\"></i>";
row += "<a href=\"javascript:;\" value=\":fa-" + emoji + ":\" title=\":fa-" + emoji + ":\" class=\"" + classPrefix + "emoji-btn\">" + icon + "</a>";
}
else if (type === "editormd-logo")
{
} else if (type === "editormd-logo") {
icon = "<i class=\"" + emoji + "\" title=\"Editor.md logo (" + emoji + ")\"></i>";
row += "<a href=\"javascript:;\" value=\":" + emoji + ":\" title=\":" + emoji + ":\" style=\"width:20%;\" class=\"" + classPrefix + "emoji-btn\">" + icon + "</a>";
}
}
else
{
} else {
row += "<a href=\"javascript:;\" value=\"\"></a>";
}
}
row += "</div>";
table += row;
}
@ -241,38 +241,31 @@
return table;
};
if (emojiTabIndex === 0)
{
for (var i = 0, len = $data.length; i < len; i++)
{
if (cname === "github-emoji") {
for (var i = 0, len = $data.length; i < len; i++) {
var h4Style = (i === 0) ? " style=\"margin: 0 0 10px;\"" : " style=\"margin: 10px 0;\"";
$tab.append("<h4" + h4Style + ">" + $data[i].category + "</h4>");
$tab.append(pagination($data[i].list, cname));
}
}
else
{
} else {
$tab.append(pagination($data, cname));
}
$tab.find("." + classPrefix + "emoji-btn").bind(exports.mouseOrTouch("click", "touchend"), function() {
$tab.find("." + classPrefix + "emoji-btn").bind("click", function() {
$(this).toggleClass("selected");
if ($(this).hasClass("selected"))
{
if ($(this).hasClass("selected")) {
selecteds.push($(this).attr("value"));
}
});
};
if (emojiData.length < 1)
{
if (emojiData.length < 1) {
if (typeof dialog.loading === "function") {
dialog.loading(true);
}
$.getJSON(path + "emoji.json?temp=" + Math.random(), function(json) {
if (typeof dialog.loading === "function") {
dialog.loading(false);
}
@ -281,13 +274,11 @@
emojiData[logoPrefix] = logos;
drawTable();
});
}
else
{
} else {
drawTable();
}
tab.find("li").bind(exports.mouseOrTouch("click", "touchend"), function() {
tab.find("li").bind("click", function() {
var $this = $(this);
emojiTabIndex = $this.index();
@ -296,16 +287,12 @@
drawTable();
});
};
};
// CommonJS/Node.js
if (typeof require === "function" && typeof exports === "object" && typeof module === "object")
{
if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
module.exports = factory;
}
else if (typeof define === "function") // AMD/CMD/Sea.js
{
} else if (typeof define === "function") { // AMD/CMD/Sea.js
if (define.amd) { // for Require.js
define(["editormd"], function(editormd) {
@ -318,9 +305,7 @@
factory(editormd);
});
}
}
else
{
} else {
factory(window.editormd);
}

4
plugins/goto-line-dialog/goto-line-dialog.js

@ -108,12 +108,16 @@
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}],
cancel : [lang.buttons.cancel, function() {
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}]
}

2
plugins/help-dialog/help-dialog.js

@ -47,6 +47,8 @@
close : [lang.buttons.close, function() {
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}]
}

4
plugins/html-entities-dialog/html-entities-dialog.js

@ -72,11 +72,15 @@
cm.replaceSelection(selecteds.join(" "));
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}],
cancel : [lang.buttons.cancel, function() {
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}]
}

37
plugins/image-dialog/image-dialog.js

@ -41,18 +41,43 @@
var guid = (new Date).getTime();
var action = settings.imageUploadURL + (settings.imageUploadURL.indexOf("?") >= 0 ? "&" : "?") + "guid=" + guid;
var imageUploadCallback = function (json, dialog) {
if (typeof settings.imageUploadCallback === 'function') {
$.proxy(settings.imageUploadCallback, _this)(json, dialog);
}
};
if (settings.crossDomainUpload)
{
var callbackName = settings.imageUploadCallbackName;
window[callbackName] = imageUploadCallback;
action += "&callback_handler=" + callbackName;
action += "&callback=" + settings.uploadCallbackURL + "&dialog_id=editormd-image-dialog-" + guid;
settings.imageUploadFields += "<input type=\"hidden\" name=\"callback\" value=\"" + settings.uploadCallbackURL + "\" />";
settings.imageUploadFields += "<input type=\"hidden\" name=\"callback_handler\" value=\"" + callbackName + "\" />";
settings.imageUploadFields += "<input type=\"hidden\" name=\"dialog_id\" value=\"editormd-image-dialog-" + guid + "\" />";
}
var dialogContent = ( (settings.imageUpload) ? "<form action=\"" + action +"\" target=\"" + iframeName + "\" method=\"post\" enctype=\"multipart/form-data\" class=\"" + classPrefix + "form\">" : "<div class=\"" + classPrefix + "form\">" ) +
var imageUploadAccept = [];
settings.imageFormats.forEach(function (format) {
imageUploadAccept.push("image/" + format);
});
imageUploadAccept.join(",");
var dialogContent = ( (settings.imageUpload) ? "<form action=\"" + action + "\" target=\"" + iframeName + "\" method=\"post\" enctype=\"multipart/form-data\" class=\"" + classPrefix + "form\">" : "<div class=\"" + classPrefix + "form\">" ) +
( (settings.imageUpload) ? "<iframe name=\"" + iframeName + "\" id=\"" + iframeName + "\" guid=\"" + guid + "\"></iframe>" : "" ) +
"<label>" + imageLang.url + "</label>" +
"<input type=\"text\" data-url />" + (function(){
return (settings.imageUpload) ? "<div class=\"" + classPrefix + "file-input\">" +
"<input type=\"file\" name=\"" + classPrefix + "image-file\" accept=\"image/*\" />" +
"<input type=\"file\" name=\"" + classPrefix + "image-file\" accept=\"" + imageUploadAccept + "\" />" +
"<input type=\"submit\" value=\"" + imageLang.uploadButton + "\" />" +
"<input type=\"hidden\" name=\"guid\" value=\"" + guid + "\" />" +
settings.imageUploadFields +
"</div>" : "";
})() +
"<br/>" +
@ -108,7 +133,6 @@
this.hide().lockScreen(false).hideMask();
//删除对话框
this.remove();
return false;
@ -117,7 +141,6 @@
cancel : [lang.buttons.cancel, function() {
this.hide().lockScreen(false).hideMask();
//删除对话框
this.remove();
return false;
@ -176,13 +199,17 @@
{
alert(json.message);
}
if (typeof settings.imageUploadCallback === 'function') {
$.proxy(settings.imageUploadCallback, _this)(json, dialog);
}
}
return false;
};
};
dialog.find("[type=\"submit\"]").bind("click", submitHandler).trigger("click");
dialog.find('form').on("submit", submitHandler).trigger("submit");
});
}

4
plugins/link-dialog/link-dialog.js

@ -90,12 +90,16 @@
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}],
cancel : [lang.buttons.cancel, function() {
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}]
}

2
plugins/preformatted-text-dialog/preformatted-text-dialog.js

@ -82,11 +82,13 @@
cm.replaceSelection(codeTexts);
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}],
cancel : [lang.buttons.cancel, function() {
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}]

4
plugins/reference-link-dialog/reference-link-dialog.js

@ -99,11 +99,15 @@
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}],
cancel : [lang.buttons.cancel, function() {
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}]
}

4
plugins/table-dialog/table-dialog.js

@ -155,12 +155,16 @@
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}],
cancel : [lang.buttons.cancel, function() {
this.hide().lockScreen(false).hideMask();
this.remove();
return false;
}]
}

2
scss/editormd.dialog.scss

@ -134,7 +134,7 @@
position: fixed;
background: #000;
@include opacity(0.2);
z-index: 99998;
z-index: 9998;
}
#{$prefix}container-mask,

30
scss/editormd.preview.scss

@ -113,16 +113,36 @@
@import "prettify";
#{$prefix}preview-container, #{$prefix}html-preview {
pre.prettyprint {
pre {
&.prettyprint {
padding: 10px;
border: 1px solid $borderColor;
white-space: pre-wrap;
word-wrap: break-word;
background: #fff;
@include transition(border-color .3s ease, background-color .3s ease);
li {
border-left: 1px solid #ddd;
padding-left: 0.8em;
@include transition(background-color .3s ease);
&:hover {
background-color: #fafafa;
}
}
li + li {
margin-top: 0;
}
&:hover {
border: 1px solid darken($borderColor, 3%);
}
ol.linenums {
color: #999;
padding-left: 2.5em;
padding-left: 2.7em;
li {
list-style-type: decimal;
@ -134,6 +154,8 @@
}
}
}
}
}
}
#{$prefix}preview-container, #{$prefix}html-preview {
@ -267,6 +289,10 @@
}
}
img {
background: none;
}
.highlight pre, pre {
line-height: 1.6;
}

20
scss/editormd.preview.themes.scss

@ -74,6 +74,26 @@
.pln {
color: #999;
}
&.prettyprint {
border: none;
background-color: #111;
li {
border-left: 1px solid #222;
}
&:hover {
border: none;
background-color: #000;
li {
&:hover {
background-color: rgba(#fff, .1);
}
}
}
}
}
li.L1, li.L3, li.L5, li.L7, li.L9 {

2
scss/editormd.scss

@ -131,7 +131,7 @@
top : 0;
left : 0;
border: none;
margin: 0 auto;
margin: 0 auto!important;
}
@import "editormd.themes";

1008
scss/github-markdown.scss

File diff suppressed because it is too large

2
scss/prettify.scss

@ -50,4 +50,4 @@ li.L1,
li.L3,
li.L5,
li.L7,
li.L9 { background: #eee }
li.L9 { background: #fff }

1183
src/editormd.js

File diff suppressed because it is too large
Loading…
Cancel
Save