|
@ -7,7 +7,7 @@ |
|
|
* @license MIT License |
|
|
* @license MIT License |
|
|
* @author Pandao |
|
|
* @author Pandao |
|
|
* {@link https://github.com/pandao/editor.md}
|
|
|
* {@link https://github.com/pandao/editor.md}
|
|
|
* @updateTime 2015-06-09 |
|
|
|
|
|
|
|
|
* @updateTime 2019-05-11 |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
;(function(factory) { |
|
|
;(function(factory) { |
|
@ -16,20 +16,20 @@ |
|
|
// CommonJS/Node.js
|
|
|
// 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; |
|
|
|
|
|
|
|
|
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
|
|
|
if (define.amd) // for Require.js
|
|
|
{ |
|
|
{ |
|
|
var cmModePath = "./lib/codemirror/mode/"; |
|
|
|
|
|
var cmAddonPath = "./lib/codemirror/addon/"; |
|
|
|
|
|
|
|
|
var cmModePath = "codemirror/mode/"; |
|
|
|
|
|
var cmAddonPath = "codemirror/addon/"; |
|
|
|
|
|
|
|
|
var codeMirrorModules = [ |
|
|
var codeMirrorModules = [ |
|
|
"jquery", "marked", "prettify", |
|
|
"jquery", "marked", "prettify", |
|
|
"katex", "raphael", "underscore", "flowchart", "jqueryflowchart", "sequenceDiagram", |
|
|
"katex", "raphael", "underscore", "flowchart", "jqueryflowchart", "sequenceDiagram", |
|
|
|
|
|
|
|
|
"./lib/codemirror/lib/codemirror", |
|
|
|
|
|
|
|
|
"codemirror/lib/codemirror", |
|
|
cmModePath + "css/css", |
|
|
cmModePath + "css/css", |
|
|
cmModePath + "sass/sass", |
|
|
cmModePath + "sass/sass", |
|
|
cmModePath + "shell/shell", |
|
|
cmModePath + "shell/shell", |
|
@ -110,7 +110,7 @@ |
|
|
|
|
|
|
|
|
"use strict"; |
|
|
"use strict"; |
|
|
|
|
|
|
|
|
var $ = (typeof (jQuery) !== "undefined") ? jQuery : Zepto; |
|
|
|
|
|
|
|
|
var $ = (typeof (window.jQuery) !== "undefined") ? window.jQuery : window.Zepto; |
|
|
|
|
|
|
|
|
if (typeof ($) === "undefined") { |
|
|
if (typeof ($) === "undefined") { |
|
|
return ; |
|
|
return ; |
|
@ -194,7 +194,7 @@ |
|
|
styleSelectedText : true, |
|
|
styleSelectedText : true, |
|
|
matchWordHighlight : true, // options: true, false, "onselected"
|
|
|
matchWordHighlight : true, // options: true, false, "onselected"
|
|
|
styleActiveLine : true, // Highlight the current line
|
|
|
styleActiveLine : true, // Highlight the current line
|
|
|
dialogLockScreen : true, |
|
|
|
|
|
|
|
|
dialogLockScreen : false, |
|
|
dialogShowMask : true, |
|
|
dialogShowMask : true, |
|
|
dialogDraggable : true, |
|
|
dialogDraggable : true, |
|
|
dialogMaskBgColor : "#fff", |
|
|
dialogMaskBgColor : "#fff", |
|
@ -374,7 +374,8 @@ |
|
|
}, |
|
|
}, |
|
|
preformattedText : { |
|
|
preformattedText : { |
|
|
title : "添加预格式文本或代码块", |
|
|
title : "添加预格式文本或代码块", |
|
|
emptyAlert : "错误:请填写预格式文本或代码的内容。" |
|
|
|
|
|
|
|
|
emptyAlert : "错误:请填写预格式文本或代码的内容。", |
|
|
|
|
|
placeholder : "Coding now...." |
|
|
}, |
|
|
}, |
|
|
codeBlock : { |
|
|
codeBlock : { |
|
|
title : "添加代码块", |
|
|
title : "添加代码块", |
|
@ -382,7 +383,8 @@ |
|
|
selectDefaultText : "请选择代码语言", |
|
|
selectDefaultText : "请选择代码语言", |
|
|
otherLanguage : "其他语言", |
|
|
otherLanguage : "其他语言", |
|
|
unselectedLanguageAlert : "错误:请选择代码所属的语言类型。", |
|
|
unselectedLanguageAlert : "错误:请选择代码所属的语言类型。", |
|
|
codeEmptyAlert : "错误:请填写代码内容。" |
|
|
|
|
|
|
|
|
codeEmptyAlert : "错误:请填写代码内容。", |
|
|
|
|
|
placeholder : "Coding now...." |
|
|
}, |
|
|
}, |
|
|
htmlEntities : { |
|
|
htmlEntities : { |
|
|
title : "HTML 实体字符" |
|
|
title : "HTML 实体字符" |
|
@ -433,9 +435,8 @@ |
|
|
options = id; |
|
|
options = id; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var _this = this; |
|
|
|
|
|
var classPrefix = this.classPrefix = editormd.classPrefix; |
|
|
var classPrefix = this.classPrefix = editormd.classPrefix; |
|
|
var settings = this.settings = $.extend(true, editormd.defaults, options); |
|
|
|
|
|
|
|
|
var settings = this.settings = $.extend(true, {}, editormd.defaults, options); |
|
|
|
|
|
|
|
|
id = (typeof id === "object") ? settings.id : id; |
|
|
id = (typeof id === "object") ? settings.id : id; |
|
|
|
|
|
|
|
@ -523,9 +524,9 @@ |
|
|
|
|
|
|
|
|
if (typeof define === "function" && define.amd) |
|
|
if (typeof define === "function" && define.amd) |
|
|
{ |
|
|
{ |
|
|
if (typeof katex !== "undefined") |
|
|
|
|
|
|
|
|
if (typeof window.katex !== "undefined") |
|
|
{ |
|
|
{ |
|
|
editormd.$katex = katex; |
|
|
|
|
|
|
|
|
editormd.$katex = window.katex; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (settings.searchReplace && !settings.readOnly) |
|
|
if (settings.searchReplace && !settings.readOnly) |
|
@ -537,12 +538,12 @@ |
|
|
|
|
|
|
|
|
if ((typeof define === "function" && define.amd) || !settings.autoLoadModules) |
|
|
if ((typeof define === "function" && define.amd) || !settings.autoLoadModules) |
|
|
{ |
|
|
{ |
|
|
if (typeof CodeMirror !== "undefined") { |
|
|
|
|
|
editormd.$CodeMirror = CodeMirror; |
|
|
|
|
|
|
|
|
if (typeof window.CodeMirror !== "undefined") { |
|
|
|
|
|
editormd.$CodeMirror = window.CodeMirror; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (typeof marked !== "undefined") { |
|
|
|
|
|
editormd.$marked = marked; |
|
|
|
|
|
|
|
|
if (typeof window.marked !== "undefined") { |
|
|
|
|
|
editormd.$marked = window.marked; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
this.setCodeMirror().setToolbar().loadedDisplay(); |
|
|
this.setCodeMirror().setToolbar().loadedDisplay(); |
|
@ -883,7 +884,6 @@ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var editor = this.editor; |
|
|
|
|
|
var count = cm.lineCount(); |
|
|
var count = cm.lineCount(); |
|
|
var preview = this.preview; |
|
|
var preview = this.preview; |
|
|
|
|
|
|
|
@ -1182,7 +1182,6 @@ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var editor = this.editor; |
|
|
var editor = this.editor; |
|
|
var preview = this.preview; |
|
|
|
|
|
var classPrefix = this.classPrefix; |
|
|
var classPrefix = this.classPrefix; |
|
|
|
|
|
|
|
|
var toolbar = this.toolbar = editor.children("." + classPrefix + "toolbar"); |
|
|
var toolbar = this.toolbar = editor.children("." + classPrefix + "toolbar"); |
|
@ -1317,7 +1316,7 @@ |
|
|
var toolbarIcons = this.toolbarIcons = toolbar.find("." + classPrefix + "menu > li > a"); |
|
|
var toolbarIcons = this.toolbarIcons = toolbar.find("." + classPrefix + "menu > li > a"); |
|
|
var toolbarIconHandlers = this.getToolbarHandles(); |
|
|
var toolbarIconHandlers = this.getToolbarHandles(); |
|
|
|
|
|
|
|
|
toolbarIcons.bind(editormd.mouseOrTouch("click", "touchend"), function(event) { |
|
|
|
|
|
|
|
|
toolbarIcons.bind("click", function() { |
|
|
|
|
|
|
|
|
var icon = $(this).children(".fa"); |
|
|
var icon = $(this).children(".fa"); |
|
|
var name = icon.attr("name"); |
|
|
var name = icon.attr("name"); |
|
@ -1395,7 +1394,7 @@ |
|
|
|
|
|
|
|
|
var infoDialog = this.infoDialog = editor.children("." + classPrefix + "dialog-info"); |
|
|
var infoDialog = this.infoDialog = editor.children("." + classPrefix + "dialog-info"); |
|
|
|
|
|
|
|
|
infoDialog.find("." + classPrefix + "dialog-close").bind(editormd.mouseOrTouch("click", "touchend"), function() { |
|
|
|
|
|
|
|
|
infoDialog.find("." + classPrefix + "dialog-close").bind("click", function() { |
|
|
_this.hideInfoDialog(); |
|
|
_this.hideInfoDialog(); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
@ -1441,7 +1440,6 @@ |
|
|
|
|
|
|
|
|
$("html,body").css("overflow-x", "hidden"); |
|
|
$("html,body").css("overflow-x", "hidden"); |
|
|
|
|
|
|
|
|
var _this = this; |
|
|
|
|
|
var editor = this.editor; |
|
|
var editor = this.editor; |
|
|
var settings = this.settings; |
|
|
var settings = this.settings; |
|
|
var infoDialog = this.infoDialog = editor.children("." + this.classPrefix + "dialog-info"); |
|
|
var infoDialog = this.infoDialog = editor.children("." + this.classPrefix + "dialog-info"); |
|
@ -1504,7 +1502,6 @@ |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
recreate : function() { |
|
|
recreate : function() { |
|
|
var _this = this; |
|
|
|
|
|
var editor = this.editor; |
|
|
var editor = this.editor; |
|
|
var settings = this.settings; |
|
|
var settings = this.settings; |
|
|
|
|
|
|
|
@ -1699,17 +1696,17 @@ |
|
|
{ |
|
|
{ |
|
|
case 120: |
|
|
case 120: |
|
|
$.proxy(toolbarHandlers["watch"], _this)(); |
|
|
$.proxy(toolbarHandlers["watch"], _this)(); |
|
|
return false; |
|
|
|
|
|
|
|
|
event.stopPropagation(); |
|
|
break; |
|
|
break; |
|
|
|
|
|
|
|
|
case 121: |
|
|
case 121: |
|
|
$.proxy(toolbarHandlers["preview"], _this)(); |
|
|
$.proxy(toolbarHandlers["preview"], _this)(); |
|
|
return false; |
|
|
|
|
|
|
|
|
event.stopPropagation(); |
|
|
break; |
|
|
break; |
|
|
|
|
|
|
|
|
case 122: |
|
|
case 122: |
|
|
$.proxy(toolbarHandlers["fullscreen"], _this)(); |
|
|
$.proxy(toolbarHandlers["fullscreen"], _this)(); |
|
|
return false; |
|
|
|
|
|
|
|
|
event.stopPropagation(); |
|
|
break; |
|
|
break; |
|
|
|
|
|
|
|
|
default: |
|
|
default: |
|
@ -1837,8 +1834,7 @@ |
|
|
return this; |
|
|
return this; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
cm.on("change", function(_cm, changeObj) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cm.on("change", function() { |
|
|
if (settings.watch) |
|
|
if (settings.watch) |
|
|
{ |
|
|
{ |
|
|
_this.previewContainer.css("padding", settings.autoHeight ? "20px 20px 50px 40px" : "20px"); |
|
|
_this.previewContainer.css("padding", settings.autoHeight ? "20px 20px 50px 40px" : "20px"); |
|
@ -1987,7 +1983,7 @@ |
|
|
|
|
|
|
|
|
if(settings.watch) |
|
|
if(settings.watch) |
|
|
{ |
|
|
{ |
|
|
codeMirror.width(editor.width() / 2); |
|
|
|
|
|
|
|
|
codeMirror.width((editor.width() / 2) - 1); |
|
|
preview.width((!state.preview) ? editor.width() / 2 : editor.width()); |
|
|
preview.width((!state.preview) ? editor.width() / 2 : editor.width()); |
|
|
|
|
|
|
|
|
this.previewContainer.css("padding", settings.autoHeight ? "20px 20px 50px 40px" : "20px"); |
|
|
this.previewContainer.css("padding", settings.autoHeight ? "20px 20px 50px 40px" : "20px"); |
|
@ -2085,12 +2081,7 @@ |
|
|
marked.setOptions(markedOptions); |
|
|
marked.setOptions(markedOptions); |
|
|
|
|
|
|
|
|
var newMarkdownDoc = editormd.$marked(cmValue, markedOptions); |
|
|
var newMarkdownDoc = editormd.$marked(cmValue, markedOptions); |
|
|
|
|
|
|
|
|
//console.info("cmValue", cmValue, newMarkdownDoc);
|
|
|
|
|
|
|
|
|
|
|
|
newMarkdownDoc = editormd.filterHTMLTags(newMarkdownDoc, settings.htmlDecode); |
|
|
|
|
|
|
|
|
|
|
|
//console.error("cmValue", cmValue, newMarkdownDoc);
|
|
|
|
|
|
|
|
|
newMarkdownDoc = editormd.filterHTMLTags(newMarkdownDoc, settings.htmlDecode); |
|
|
|
|
|
|
|
|
this.markdownTextarea.text(cmValue); |
|
|
this.markdownTextarea.text(cmValue); |
|
|
|
|
|
|
|
@ -2297,8 +2288,7 @@ |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
appendMarkdown : function(md) { |
|
|
appendMarkdown : function(md) { |
|
|
var settings = this.settings; |
|
|
|
|
|
var cm = this.cm; |
|
|
|
|
|
|
|
|
var cm = this.cm; |
|
|
|
|
|
|
|
|
cm.setValue(cm.getValue() + md); |
|
|
cm.setValue(cm.getValue() + md); |
|
|
|
|
|
|
|
@ -2533,6 +2523,19 @@ |
|
|
return this; |
|
|
return this; |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 消毁并移除编辑器实例 |
|
|
|
|
|
* |
|
|
|
|
|
* destroy & remove editor |
|
|
|
|
|
* |
|
|
|
|
|
* @returns {void} void 无返回值 |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
destroy : function () { |
|
|
|
|
|
this.hide(); |
|
|
|
|
|
this.editor.remove(); |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 隐藏编辑器部分,只预览HTML |
|
|
* 隐藏编辑器部分,只预览HTML |
|
|
* Enter preview html state |
|
|
* Enter preview html state |
|
@ -2554,6 +2557,8 @@ |
|
|
return this; |
|
|
return this; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var editorHeight = this.editor.outerHeight(); |
|
|
|
|
|
|
|
|
if (settings.toolbar && toolbar) { |
|
|
if (settings.toolbar && toolbar) { |
|
|
toolbar.toggle(); |
|
|
toolbar.toggle(); |
|
|
toolbar.find(".fa[name=preview]").toggleClass("active"); |
|
|
toolbar.find(".fa[name=preview]").toggleClass("active"); |
|
@ -2571,11 +2576,15 @@ |
|
|
{ |
|
|
{ |
|
|
this.state.preview = true; |
|
|
this.state.preview = true; |
|
|
|
|
|
|
|
|
|
|
|
if (this.settings.autoHeight) { |
|
|
|
|
|
this.editor.css("height", editorHeight); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (this.state.fullscreen) { |
|
|
if (this.state.fullscreen) { |
|
|
preview.css("background", "#fff"); |
|
|
preview.css("background", "#fff"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
editor.find("." + this.classPrefix + "preview-close-btn").show().bind(editormd.mouseOrTouch("click", "touchend"), function(){ |
|
|
|
|
|
|
|
|
editor.find("." + this.classPrefix + "preview-close-btn").show().bind("click", function(){ |
|
|
_this.previewed(); |
|
|
_this.previewed(); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
@ -2637,7 +2646,7 @@ |
|
|
|
|
|
|
|
|
preview[(settings.watch) ? "show" : "hide"](); |
|
|
preview[(settings.watch) ? "show" : "hide"](); |
|
|
|
|
|
|
|
|
previewCloseBtn.hide().unbind(editormd.mouseOrTouch("click", "touchend")); |
|
|
|
|
|
|
|
|
previewCloseBtn.hide().unbind("click"); |
|
|
|
|
|
|
|
|
previewContainer.removeClass(this.classPrefix + "preview-active"); |
|
|
previewContainer.removeClass(this.classPrefix + "preview-active"); |
|
|
|
|
|
|
|
@ -2646,6 +2655,10 @@ |
|
|
previewContainer.css("padding", "20px"); |
|
|
previewContainer.css("padding", "20px"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (this.settings.autoHeight) { |
|
|
|
|
|
this.editor.css("height", "auto"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
preview.css({ |
|
|
preview.css({ |
|
|
background : null, |
|
|
background : null, |
|
|
position : "absolute", |
|
|
position : "absolute", |
|
@ -2674,7 +2687,6 @@ |
|
|
var _this = this; |
|
|
var _this = this; |
|
|
var state = this.state; |
|
|
var state = this.state; |
|
|
var editor = this.editor; |
|
|
var editor = this.editor; |
|
|
var preview = this.preview; |
|
|
|
|
|
var toolbar = this.toolbar; |
|
|
var toolbar = this.toolbar; |
|
|
var settings = this.settings; |
|
|
var settings = this.settings; |
|
|
var fullscreenClass = this.classPrefix + "fullscreen"; |
|
|
var fullscreenClass = this.classPrefix + "fullscreen"; |
|
@ -2972,7 +2984,6 @@ |
|
|
|
|
|
|
|
|
lowercase : function() { |
|
|
lowercase : function() { |
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var cursor = cm.getCursor(); |
|
|
|
|
|
var selection = cm.getSelection(); |
|
|
var selection = cm.getSelection(); |
|
|
var selections = cm.listSelections(); |
|
|
var selections = cm.listSelections(); |
|
|
|
|
|
|
|
@ -3084,7 +3095,6 @@ |
|
|
|
|
|
|
|
|
"list-ul" : function() { |
|
|
"list-ul" : function() { |
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var cursor = cm.getCursor(); |
|
|
|
|
|
var selection = cm.getSelection(); |
|
|
var selection = cm.getSelection(); |
|
|
|
|
|
|
|
|
if (selection === "") |
|
|
if (selection === "") |
|
@ -3106,7 +3116,6 @@ |
|
|
|
|
|
|
|
|
"list-ol" : function() { |
|
|
"list-ol" : function() { |
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var cursor = cm.getCursor(); |
|
|
|
|
|
var selection = cm.getSelection(); |
|
|
var selection = cm.getSelection(); |
|
|
|
|
|
|
|
|
if(selection === "") |
|
|
if(selection === "") |
|
@ -3129,7 +3138,6 @@ |
|
|
hr : function() { |
|
|
hr : function() { |
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var cursor = cm.getCursor(); |
|
|
var cursor = cm.getCursor(); |
|
|
var selection = cm.getSelection(); |
|
|
|
|
|
|
|
|
|
|
|
cm.replaceSelection(((cursor.ch !== 0) ? "\n\n" : "\n") + "------------\n\n"); |
|
|
cm.replaceSelection(((cursor.ch !== 0) ? "\n\n" : "\n") + "------------\n\n"); |
|
|
}, |
|
|
}, |
|
@ -3167,8 +3175,7 @@ |
|
|
return this; |
|
|
return this; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var cm = this.cm; |
|
|
|
|
|
var selection = cm.getSelection(); |
|
|
|
|
|
|
|
|
var cm = this.cm; |
|
|
|
|
|
|
|
|
cm.replaceSelection("\r\n[========]\r\n"); |
|
|
cm.replaceSelection("\r\n[========]\r\n"); |
|
|
}, |
|
|
}, |
|
@ -3203,8 +3210,6 @@ |
|
|
|
|
|
|
|
|
datetime : function() { |
|
|
datetime : function() { |
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var selection = cm.getSelection(); |
|
|
|
|
|
var date = new Date(); |
|
|
|
|
|
var langName = this.settings.lang.name; |
|
|
var langName = this.settings.lang.name; |
|
|
var datefmt = editormd.dateFormat() + " " + editormd.dateFormat((langName === "zh-cn" || langName === "zh-tw") ? "cn-week-day" : "week-day"); |
|
|
var datefmt = editormd.dateFormat() + " " + editormd.dateFormat((langName === "zh-cn" || langName === "zh-tw") ? "cn-week-day" : "week-day"); |
|
|
|
|
|
|
|
@ -3252,6 +3257,9 @@ |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
// var isMac = navigator.platform.toUpperCase().indexOf("MAC") >= 0;
|
|
|
|
|
|
// var key = isMac ? "Cmd" : "Ctrl";
|
|
|
|
|
|
|
|
|
editormd.keyMaps = { |
|
|
editormd.keyMaps = { |
|
|
"Ctrl-1" : "h1", |
|
|
"Ctrl-1" : "h1", |
|
|
"Ctrl-2" : "h2", |
|
|
"Ctrl-2" : "h2", |
|
@ -3261,8 +3269,7 @@ |
|
|
"Ctrl-6" : "h6", |
|
|
"Ctrl-6" : "h6", |
|
|
"Ctrl-B" : "bold", // if this is string == editormd.toolbarHandlers.xxxx
|
|
|
"Ctrl-B" : "bold", // if this is string == editormd.toolbarHandlers.xxxx
|
|
|
"Ctrl-D" : "datetime", |
|
|
"Ctrl-D" : "datetime", |
|
|
|
|
|
|
|
|
"Ctrl-E" : function() { // emoji
|
|
|
|
|
|
|
|
|
"Ctrl-E" : function() { // emoji
|
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var cursor = cm.getCursor(); |
|
|
var cursor = cm.getCursor(); |
|
|
var selection = cm.getSelection(); |
|
|
var selection = cm.getSelection(); |
|
@ -3283,7 +3290,6 @@ |
|
|
"Ctrl-H" : "hr", |
|
|
"Ctrl-H" : "hr", |
|
|
"Ctrl-I" : "italic", |
|
|
"Ctrl-I" : "italic", |
|
|
"Ctrl-K" : "code", |
|
|
"Ctrl-K" : "code", |
|
|
|
|
|
|
|
|
"Ctrl-L" : function() { |
|
|
"Ctrl-L" : function() { |
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var cursor = cm.getCursor(); |
|
|
var cursor = cm.getCursor(); |
|
@ -3298,7 +3304,6 @@ |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
"Ctrl-U" : "list-ul", |
|
|
"Ctrl-U" : "list-ul", |
|
|
|
|
|
|
|
|
"Shift-Ctrl-A" : function() { |
|
|
"Shift-Ctrl-A" : function() { |
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var cursor = cm.getCursor(); |
|
|
var cursor = cm.getCursor(); |
|
@ -3316,12 +3321,10 @@ |
|
|
cm.setCursor(cursor.line, cursor.ch + 1); |
|
|
cm.setCursor(cursor.line, cursor.ch + 1); |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
"Shift-Ctrl-C" : "code", |
|
|
"Shift-Ctrl-C" : "code", |
|
|
"Shift-Ctrl-Q" : "quote", |
|
|
"Shift-Ctrl-Q" : "quote", |
|
|
"Shift-Ctrl-S" : "del", |
|
|
"Shift-Ctrl-S" : "del", |
|
|
"Shift-Ctrl-K" : "tex", // KaTeX
|
|
|
"Shift-Ctrl-K" : "tex", // KaTeX
|
|
|
|
|
|
|
|
|
"Shift-Alt-C" : function() { |
|
|
"Shift-Alt-C" : function() { |
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var cursor = cm.getCursor(); |
|
|
var cursor = cm.getCursor(); |
|
@ -3333,39 +3336,36 @@ |
|
|
cm.setCursor(cursor.line, cursor.ch + 3); |
|
|
cm.setCursor(cursor.line, cursor.ch + 3); |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
"Shift-Ctrl-Alt-C" : "code-block", |
|
|
|
|
|
"Shift-Ctrl-H" : "html-entities", |
|
|
|
|
|
"Shift-Alt-H" : "help", |
|
|
|
|
|
"Shift-Ctrl-E" : "emoji", |
|
|
|
|
|
"Shift-Ctrl-U" : "uppercase", |
|
|
|
|
|
"Shift-Alt-U" : "ucwords", |
|
|
|
|
|
"Shift-Ctrl-Alt-U" : "ucfirst", |
|
|
|
|
|
"Shift-Alt-L" : "lowercase", |
|
|
|
|
|
|
|
|
|
|
|
"Shift-Ctrl-I" : function() { |
|
|
|
|
|
|
|
|
"Shift-Ctrl-Alt-C" : "code-block", |
|
|
|
|
|
"Shift-Ctrl-H" : "html-entities", |
|
|
|
|
|
"Shift-Alt-H" : "help", |
|
|
|
|
|
"Shift-Ctrl-E" : "emoji", |
|
|
|
|
|
"Shift-Ctrl-U" : "uppercase", |
|
|
|
|
|
"Shift-Alt-U" : "ucwords", |
|
|
|
|
|
"Shift-Ctrl-Alt-U" : "ucfirst", |
|
|
|
|
|
"Shift-Alt-L" : "lowercase", |
|
|
|
|
|
"Shift-Ctrl-I" : function() { |
|
|
var cm = this.cm; |
|
|
var cm = this.cm; |
|
|
var cursor = cm.getCursor(); |
|
|
var cursor = cm.getCursor(); |
|
|
var selection = cm.getSelection(); |
|
|
var selection = cm.getSelection(); |
|
|
|
|
|
|
|
|
var title = (selection === "") ? "" : " \""+selection+"\""; |
|
|
|
|
|
|
|
|
var title = (selection === "") ? "" : " \"" + selection + "\""; |
|
|
|
|
|
|
|
|
cm.replaceSelection(""); |
|
|
|
|
|
|
|
|
cm.replaceSelection(""); |
|
|
|
|
|
|
|
|
if (selection === "") { |
|
|
if (selection === "") { |
|
|
cm.setCursor(cursor.line, cursor.ch + 4); |
|
|
cm.setCursor(cursor.line, cursor.ch + 4); |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
"Shift-Ctrl-Alt-I" : "image", |
|
|
|
|
|
"Shift-Ctrl-L" : "link", |
|
|
|
|
|
"Shift-Ctrl-O" : "list-ol", |
|
|
|
|
|
"Shift-Ctrl-P" : "preformatted-text", |
|
|
|
|
|
"Shift-Ctrl-T" : "table", |
|
|
|
|
|
"Shift-Alt-P" : "pagebreak", |
|
|
|
|
|
"F9" : "watch", |
|
|
|
|
|
"F10" : "preview", |
|
|
|
|
|
"F11" : "fullscreen", |
|
|
|
|
|
|
|
|
"Shift-Ctrl-Alt-I" : "image", |
|
|
|
|
|
"Shift-Ctrl-L" : "link", |
|
|
|
|
|
"Shift-Ctrl-O" : "list-ol", |
|
|
|
|
|
"Shift-Ctrl-P" : "preformatted-text", |
|
|
|
|
|
"Shift-Ctrl-T" : "table", |
|
|
|
|
|
"Shift-Alt-P" : "pagebreak", |
|
|
|
|
|
"F9" : "watch", |
|
|
|
|
|
"F10" : "preview", |
|
|
|
|
|
"F11" : "fullscreen", |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -3412,8 +3412,6 @@ |
|
|
}); |
|
|
}); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
var ucfirst = firstUpperCase; |
|
|
|
|
|
|
|
|
|
|
|
editormd.firstUpperCase = editormd.ucfirst = firstUpperCase; |
|
|
editormd.firstUpperCase = editormd.ucfirst = firstUpperCase; |
|
|
|
|
|
|
|
|
editormd.urls = { |
|
|
editormd.urls = { |
|
@ -3425,7 +3423,7 @@ |
|
|
email : /(\w+)@(\w+)\.(\w+)\.?(\w+)?/g, |
|
|
email : /(\w+)@(\w+)\.(\w+)\.?(\w+)?/g, |
|
|
emailLink : /(mailto:)?([\w\.\_]+)@(\w+)\.(\w+)\.?(\w+)?/g, |
|
|
emailLink : /(mailto:)?([\w\.\_]+)@(\w+)\.(\w+)\.?(\w+)?/g, |
|
|
emoji : /:([\w\+-]+):/g, |
|
|
emoji : /:([\w\+-]+):/g, |
|
|
emojiDatetime : /(\d{2}:\d{2}:\d{2})/g, |
|
|
|
|
|
|
|
|
emojiDatetime : /(\d{1,2}:\d{1,2}:\d{1,2})/g, |
|
|
twemoji : /:(tw-([\w]+)-?(\w+)?):/g, |
|
|
twemoji : /:(tw-([\w]+)-?(\w+)?):/g, |
|
|
fontAwesome : /:(fa-([\w]+)(-(\w+)){0,}):/g, |
|
|
fontAwesome : /:(fa-([\w]+)(-(\w+)){0,}):/g, |
|
|
editormdLogo : /:(editormd-logo-?(\w+)?):/g, |
|
|
editormdLogo : /:(editormd-logo-?(\w+)?):/g, |
|
@ -3434,7 +3432,7 @@ |
|
|
|
|
|
|
|
|
// Emoji graphics files url path
|
|
|
// Emoji graphics files url path
|
|
|
editormd.emoji = { |
|
|
editormd.emoji = { |
|
|
path : "http://www.emoji-cheat-sheet.com/graphics/emojis/", |
|
|
|
|
|
|
|
|
path : "https://www.webpagefx.com/tools/emoji-cheat-sheet/graphics/emojis/", |
|
|
ext : ".png" |
|
|
ext : ".png" |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
@ -3500,7 +3498,7 @@ |
|
|
matchs[i] = ":\\+1:"; |
|
|
matchs[i] = ":\\+1:"; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
text = text.replace(new RegExp(matchs[i]), function($1, $2){ |
|
|
|
|
|
|
|
|
text = text.replace(new RegExp(matchs[i]), function($1) { |
|
|
var faMatchs = $1.match(faIconReg); |
|
|
var faMatchs = $1.match(faIconReg); |
|
|
var name = $1.replace(/:/g, ""); |
|
|
var name = $1.replace(/:/g, ""); |
|
|
|
|
|
|
|
@ -3581,12 +3579,12 @@ |
|
|
|
|
|
|
|
|
if (this.options.sanitize) { |
|
|
if (this.options.sanitize) { |
|
|
try { |
|
|
try { |
|
|
var prot = decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase(); |
|
|
|
|
|
} catch(e) { |
|
|
|
|
|
return ""; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
var prot = decodeURIComponent(unescape(href)).replace(/[^\w:]/g, "").toLowerCase(); |
|
|
|
|
|
|
|
|
if (prot.indexOf("javascript:") === 0) { |
|
|
|
|
|
|
|
|
if (prot.indexOf("javascript:") === 0) { |
|
|
|
|
|
return ""; |
|
|
|
|
|
} |
|
|
|
|
|
} catch(e) { |
|
|
return ""; |
|
|
return ""; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -3612,11 +3610,11 @@ |
|
|
return out; |
|
|
return out; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
markedRenderer.heading = function(text, level, raw) { |
|
|
|
|
|
|
|
|
markedRenderer.heading = function(text, level) { |
|
|
|
|
|
|
|
|
var linkText = text; |
|
|
var linkText = text; |
|
|
var hasLinkReg = /\s*\<a\s*href\=\"(.*)\"\s*([^\>]*)\>(.*)\<\/a\>\s*/; |
|
|
var hasLinkReg = /\s*\<a\s*href\=\"(.*)\"\s*([^\>]*)\>(.*)\<\/a\>\s*/; |
|
|
var getLinkTextReg = /\s*\<a\s*([^\>]+)\>([^\>]*)\<\/a\>\s*/g; |
|
|
|
|
|
|
|
|
// var getLinkTextReg = /\s*\<a\s*([^\>]+)\>([^\>]*)\<\/a\>\s*/g;
|
|
|
|
|
|
|
|
|
if (hasLinkReg.test(text)) |
|
|
if (hasLinkReg.test(text)) |
|
|
{ |
|
|
{ |
|
@ -3688,7 +3686,7 @@ |
|
|
: ( (pageBreakReg.test(text)) ? this.pageBreak(text) : "<p" + isTeXAddClass + ">" + this.atLink(this.emoji(text)) + "</p>\n" ); |
|
|
: ( (pageBreakReg.test(text)) ? this.pageBreak(text) : "<p" + isTeXAddClass + ">" + this.atLink(this.emoji(text)) + "</p>\n" ); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
markedRenderer.code = function (code, lang, escaped) { |
|
|
|
|
|
|
|
|
markedRenderer.code = function (code, lang) { |
|
|
|
|
|
|
|
|
if (lang === "seq" || lang === "sequence") |
|
|
if (lang === "seq" || lang === "sequence") |
|
|
{ |
|
|
{ |
|
@ -3879,7 +3877,7 @@ |
|
|
editormd.filterHTMLTags = function(html, filters) { |
|
|
editormd.filterHTMLTags = function(html, filters) { |
|
|
|
|
|
|
|
|
if (typeof html !== "string") { |
|
|
if (typeof html !== "string") { |
|
|
html = new String(html); |
|
|
|
|
|
|
|
|
html = html.toString(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (typeof filters !== "string") { |
|
|
if (typeof filters !== "string") { |
|
@ -3917,7 +3915,9 @@ |
|
|
var $attrs = {}; |
|
|
var $attrs = {}; |
|
|
|
|
|
|
|
|
$.each(_attrs, function(i, e) { |
|
|
$.each(_attrs, function(i, e) { |
|
|
if (e.nodeName !== '"') $attrs[e.nodeName] = e.nodeValue; |
|
|
|
|
|
|
|
|
if (e.nodeName !== "\"") { |
|
|
|
|
|
$attrs[e.nodeName] = e.nodeValue; |
|
|
|
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
$.each($attrs, function(i) { |
|
|
$.each($attrs, function(i) { |
|
@ -3988,7 +3988,7 @@ |
|
|
editormd.$marked = marked; |
|
|
editormd.$marked = marked; |
|
|
|
|
|
|
|
|
var div = $("#" + id); |
|
|
var div = $("#" + id); |
|
|
var settings = div.settings = $.extend(true, defaults, options || {}); |
|
|
|
|
|
|
|
|
var settings = div.settings = $.extend(true, {}, defaults, options || {}); |
|
|
var saveTo = div.find("textarea"); |
|
|
var saveTo = div.find("textarea"); |
|
|
|
|
|
|
|
|
if (saveTo.length < 1) |
|
|
if (saveTo.length < 1) |
|
@ -4026,7 +4026,7 @@ |
|
|
smartypants : true |
|
|
smartypants : true |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
markdownDoc = new String(markdownDoc); |
|
|
|
|
|
|
|
|
markdownDoc = markdownDoc.toString(); |
|
|
|
|
|
|
|
|
var markdownParsed = marked(markdownDoc, markedOptions); |
|
|
var markdownParsed = marked(markdownDoc, markedOptions); |
|
|
|
|
|
|
|
@ -4193,8 +4193,8 @@ |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
editormd.isIE = (navigator.appName == "Microsoft Internet Explorer"); |
|
|
|
|
|
editormd.isIE8 = (editormd.isIE && navigator.appVersion.match(/8./i) == "8."); |
|
|
|
|
|
|
|
|
editormd.isIE = (navigator.appName === "Microsoft Internet Explorer"); |
|
|
|
|
|
editormd.isIE8 = (editormd.isIE && navigator.appVersion.match(/8./i) === "8."); |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 动态加载JS文件的方法 |
|
|
* 动态加载JS文件的方法 |
|
@ -4248,8 +4248,8 @@ |
|
|
// 使用国外的CDN,加载速度有时会很慢,或者自定义URL
|
|
|
// 使用国外的CDN,加载速度有时会很慢,或者自定义URL
|
|
|
// You can custom KaTeX load url.
|
|
|
// You can custom KaTeX load url.
|
|
|
editormd.katexURL = { |
|
|
editormd.katexURL = { |
|
|
css : "//cdnjs.cloudflare.com/ajax/libs/KaTeX/0.3.0/katex.min", |
|
|
|
|
|
js : "//cdnjs.cloudflare.com/ajax/libs/KaTeX/0.3.0/katex.min" |
|
|
|
|
|
|
|
|
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" |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
editormd.kaTeXLoaded = false; |
|
|
editormd.kaTeXLoaded = false; |
|
@ -4295,6 +4295,7 @@ |
|
|
title : "", |
|
|
title : "", |
|
|
drag : true, |
|
|
drag : true, |
|
|
closed : true, |
|
|
closed : true, |
|
|
|
|
|
cached : false, |
|
|
content : "", |
|
|
content : "", |
|
|
mask : true, |
|
|
mask : true, |
|
|
maskStyle : { |
|
|
maskStyle : { |
|
@ -4313,8 +4314,6 @@ |
|
|
var classPrefix = editormd.classPrefix; |
|
|
var classPrefix = editormd.classPrefix; |
|
|
var guid = (new Date()).getTime(); |
|
|
var guid = (new Date()).getTime(); |
|
|
var dialogName = ( (options.name === "") ? classPrefix + "dialog-" + guid : options.name); |
|
|
var dialogName = ( (options.name === "") ? classPrefix + "dialog-" + guid : options.name); |
|
|
var mouseOrTouch = editormd.mouseOrTouch; |
|
|
|
|
|
|
|
|
|
|
|
var html = "<div class=\"" + classPrefix + "dialog " + dialogName + "\">"; |
|
|
var html = "<div class=\"" + classPrefix + "dialog " + dialogName + "\">"; |
|
|
|
|
|
|
|
|
if (options.title !== "") |
|
|
if (options.title !== "") |
|
@ -4337,7 +4336,6 @@ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
html += "</div>"; |
|
|
html += "</div>"; |
|
|
|
|
|
|
|
|
html += "<div class=\"" + classPrefix + "dialog-mask " + classPrefix + "dialog-mask-bg\"></div>"; |
|
|
html += "<div class=\"" + classPrefix + "dialog-mask " + classPrefix + "dialog-mask-bg\"></div>"; |
|
|
html += "<div class=\"" + classPrefix + "dialog-mask " + classPrefix + "dialog-mask-con\"></div>"; |
|
|
html += "<div class=\"" + classPrefix + "dialog-mask " + classPrefix + "dialog-mask-con\"></div>"; |
|
|
html += "</div>"; |
|
|
html += "</div>"; |
|
@ -4400,8 +4398,12 @@ |
|
|
|
|
|
|
|
|
$(window).resize(dialogPosition); |
|
|
$(window).resize(dialogPosition); |
|
|
|
|
|
|
|
|
dialog.children("." + classPrefix + "dialog-close").bind(mouseOrTouch("click", "touchend"), function() { |
|
|
|
|
|
|
|
|
dialog.children("." + classPrefix + "dialog-close").bind("click", function() { |
|
|
dialog.hide().lockScreen(false).hideMask(); |
|
|
dialog.hide().lockScreen(false).hideMask(); |
|
|
|
|
|
|
|
|
|
|
|
if (!options.cached) { |
|
|
|
|
|
dialog.remove(); |
|
|
|
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
if (typeof options.buttons === "object") |
|
|
if (typeof options.buttons === "object") |
|
@ -4415,7 +4417,7 @@ |
|
|
|
|
|
|
|
|
footer.append("<button class=\"" + classPrefix + "btn " + btnClassName + "\">" + btn[0] + "</button>"); |
|
|
footer.append("<button class=\"" + classPrefix + "btn " + btnClassName + "\">" + btn[0] + "</button>"); |
|
|
btn[1] = $.proxy(btn[1], dialog); |
|
|
btn[1] = $.proxy(btn[1], dialog); |
|
|
footer.children("." + btnClassName).bind(mouseOrTouch("click", "touchend"), btn[1]); |
|
|
|
|
|
|
|
|
footer.children("." + btnClassName).bind("click", btn[1]); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -4425,26 +4427,18 @@ |
|
|
var dialogHeader = dialog.children("." + classPrefix + "dialog-header"); |
|
|
var dialogHeader = dialog.children("." + classPrefix + "dialog-header"); |
|
|
|
|
|
|
|
|
if (!options.mask) { |
|
|
if (!options.mask) { |
|
|
dialogHeader.bind(mouseOrTouch("click", "touchend"), function(){ |
|
|
|
|
|
|
|
|
dialogHeader.bind("click", function(){ |
|
|
editormd.dialogZindex += 2; |
|
|
editormd.dialogZindex += 2; |
|
|
dialog.css("z-index", editormd.dialogZindex); |
|
|
dialog.css("z-index", editormd.dialogZindex); |
|
|
}); |
|
|
}); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
dialogHeader.mousedown(function(e) { |
|
|
|
|
|
e = e || window.event; //IE
|
|
|
|
|
|
posX = e.clientX - parseInt(dialog[0].style.left); |
|
|
|
|
|
posY = e.clientY - parseInt(dialog[0].style.top); |
|
|
|
|
|
|
|
|
|
|
|
document.onmousemove = moveAction; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
var userCanSelect = function (obj) { |
|
|
var userCanSelect = function (obj) { |
|
|
obj.removeClass(classPrefix + "user-unselect").off("selectstart"); |
|
|
obj.removeClass(classPrefix + "user-unselect").off("selectstart"); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
var userUnselect = function (obj) { |
|
|
var userUnselect = function (obj) { |
|
|
obj.addClass(classPrefix + "user-unselect").on("selectstart", function(event) { // selectstart for IE
|
|
|
|
|
|
|
|
|
obj.addClass(classPrefix + "user-unselect").on("selectstart", function() { // selectstart for IE
|
|
|
return false; |
|
|
return false; |
|
|
}); |
|
|
}); |
|
|
}; |
|
|
}; |
|
@ -4484,6 +4478,14 @@ |
|
|
dialog[0].style.top = top + "px"; |
|
|
dialog[0].style.top = top + "px"; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
dialogHeader.mousedown(function(e) { |
|
|
|
|
|
e = e || window.event; //IE
|
|
|
|
|
|
posX = e.clientX - parseInt(dialog[0].style.left); |
|
|
|
|
|
posY = e.clientY - parseInt(dialog[0].style.top); |
|
|
|
|
|
|
|
|
|
|
|
document.onmousemove = moveAction; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
document.onmouseup = function() { |
|
|
document.onmouseup = function() { |
|
|
userCanSelect($("body")); |
|
|
userCanSelect($("body")); |
|
|
userCanSelect(dialog); |
|
|
userCanSelect(dialog); |
|
|