16 Star 54 Fork 20

简单 / bookeditor

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
bookeditor.min.js 31.41 KB
一键复制 编辑 原始数据 按行查看 历史
柴君 提交于 2018-03-17 06:31 . init bookeditor
window.bookeditor=function(){function t(t,e){t=t||"click",e=e||"touchend";var o=t;try{document.createEvent("TouchEvent"),o=e}catch(t){}return o}function e(t,e,o){function i(t){var e,o=['<ul class="dropdown-menu">'];for(var i in t)e=t[i],void 0!==s.menuTexts[e]&&o.push("<li>"+s.menuTexts[e]+"</li>");return o.push("</ul"),o}var a=this,s=a.settings=o;a.bookeditor=t,a.editor=e;var n=['<div class="book-catalog-wraper" id="book-catalog-wraper">','<div class="book-catalog-head">书籍目录</div>','<div class="book-catalog-body" id="book-catalog-body">','<div class="book-catalog-group" id="book-catalog-group">',"</div>",'<div class="book-catalog-footer">','<button id="new-book-catalog" class="editor-btn">新建章节</button>',"</div>","</div>","</div>"].join("\n");t.main_sel.prepend(n);a.catalog_sel=$("#book-catalog-group");var l=a.wraper_sel=$("#book-catalog-wraper"),r=a.new_sel=$("#new-book-catalog");a.new_sel=$("#new-catalog"),$("#book-catalog-body").on("click",".menu",function(t){var e=$(this),o=e.offset(),i=e.parent().attr("data-nodeid"),a=e.attr("data-target"),s=$(a);s.attr("data-nodeid",i);var n=s.find(".dropdown-menu");n.css("left",o.left),n.css("top",o.top+e.height())});var d=['<div id="files-dropdown" class="book-dropdown">'];(d=d.concat(i(s.filesMenus))).push("</div>"),l.append(d.join("\n")),(d=(d=['<div id="file-dropdown" class="book-dropdown">']).concat(i(s.fileMenus))).push("</div>"),l.append(d.join("\n"));var c=$(".book-dropdown");return c.on("hidden.bs.dropdown",function(){$(this).removeAttr("data-nodeid")}),c.on("click",".dropdown-menu > li > a",function(e){var o=$(this).attr("name"),i=a.handlers;return customHandlers=s.menuHandlers,void 0===o||(e.preventDefault(),void 0!==customHandlers[o]?$.proxy(customHandlers[o],this)(t):void 0!==i[o]&&$.proxy(i[o],this)(t),!0)}),r.on("click",function(e){var o=a.settings,i=a.handlers,s=o.menuHandlers;return e.preventDefault(),void 0!==s.new?$.proxy(s.new,this)(t):void 0!==i.new&&$.proxy(i.new,this)(t),!0}),a.loadCatalogs(s.catalogs),a}function o(t){var e,o={text:t.title,href:t.href,selectable:!0,attrs:t.attrs,state:{checked:!1,disabled:!1,selected:!1}};return t.nodeid&&(o.parentId=t.nodeid),t.selected&&(o.state.selected=!0),t.is_dir?(o.icon="fa fa-files-o",o.classs=["files"],e="files-dropdown"):(o.icon="fa fa-file",o.classs=["file"],e="file-dropdown"),o.custom='<a class="menu" href="javascript:void(0)" data-toggle="dropdown" data-target="#'+e+'"><i class="fa fa-ellipsis-h menu-icon"></i></a>',o}function i(t,e,o){var i=this.settings=o;this.bookeditor=t,this.editor=e;var a=this.toolbar_sel=t.toolbar_sel;if(this.newBtns(i.toolbarBtns,!1),this.newBtns(i.toolbarRightBtns,!0),a.find(".tooltipped").tooltip({placement:"bottom",title:function(){return $(this).attr("aria-label")}}),i.watch){a.find(".book-tool-btn[name=preview]").addClass("watched")}return this.setHandlers(),this.registerKeymaps(),this}function a(t,e){var o=this;o.bookeditor=t;var i=o.settings=e;o.old_markdown="",o.old_html="",o.saveTimer=null;var a=['<div class="book-editor-wraper">','<div class="book-editor-area">','<div id="book-editor" class="book-editor">','<div id="book-codemirror" class="book-codemirror"></div>',"</div>",'<div id="book-preview" class="book-preview">','<div id="book-html" class="book-html"></div>',"</div>","</div>","</div>"].join("\n");if(t.main_sel.append(a),o.editor_sel=$("#book-editor"),o.codemirror_sel=$("#book-codemirror"),o.preview_sel=$("#book-preview"),o.html_sel=$("#book-html"),o.status_sel=null,i.catalog&&i.editorStatus){var s=t.main_sel.find(".book-editor-wraper");s.addClass("book-status-wraper"),s.prepend('<div class="book-editor-status" id="book-editor-status"></div>'),o.status_sel=$("#book-editor-status")}return o.codemirror_sel.on("click",function(){o.editor&&o.editor.focus()}),o.initCodeMirror(),o}function s(t){return function(){var e=t;e._save(),e.saveTimer=setTimeout(s(e),e.settings.saveInterval),e.bookeditor.handleState("save")}}function n(t){if(!(this instanceof n))return new n(t);t=t||{};var o=this.settings=$.extend(!0,n.defaults,t);if(o.toolbarBtns=void 0===t.toolbarBtns?n.defaults.toolbarBtns:t.toolbarBtns,o.toolbarRightBtns=void 0===t.toolbarRightBtns?n.defaults.toolbarRightBtns:t.toolbarRightBtns,void 0!==o.wraperId&&o.wraperId){var s=this.wraper=$("#"+o.wraperId);s.addClass(global.wraperClass),o.full?s.addClass(global.fullClass):(s.addClass(global.notfullClass),s.css("width",o.width),s.css("height",o.height),o.catalog=!1);var l=['<div id="book-toolbar" class="book-toolbar"></div>','<div id="book-main" class="book-main"></div>'].join("\n");s.append(l),this.toolbar_sel=$("#book-toolbar"),this.main_sel=$("#book-main");var r=this.editor=new a(this,o);o.catalog&&(this.catalog=new e(this,r,o),this.main_sel.addClass("book-catalog-main")),this.toolbar=new i(this,r,o);var d=['<div id="'+global.modalClass+'" class="modal fade '+global.modalClass+'" >','<div class="modal-dialog">','<div class="modal-content">',"</div>","</div>","</div>"].join("\n");if(void 0!==o.modalSelector){$(o.modalSelector).append(d)}else this.main_sel.append(d);return this.modal_sel=$("#"+global.modalClass),"Windows"==global.os&&r.addScrollbar(),this.modal_sel.on("hidden.bs.modal",function(t){$(this).find(".modal-content").empty(),r.focus()}),this.modal_sel.on("shown.bs.modal",function(t){var e=$(this).find("input[type=text]");e.length>0&&e[0].focus()}),this.modal_sel.on("keypress",function(t){if(13===t.keyCode){$(this).find(".book-dialog").find(".ok").click(),t.preventDefault()}}),this.modal_sel.on("keypress",".ok",function(t){13===t.keyCode&&t.stopPropagation()}),this.load(),this}}if("undefined"==typeof $)return;String.prototype.format=function(){var t=arguments;return this.replace(/\{(\d+)\}/g,function(e,o){return t[o]})},$.fn.serializeObject=function(){var t={};return $.each(this.serializeArray(),function(e,o){o.name in t||(t[o.name]=o.value)}),t};global={fullClass:"book-full-wraper",notfullClass:"book-notfull-wraper",wraperClass:"book-wraper",scrollbarClass:"book-scrollbar",katexClass:"book-katex",modalClass:"book-modal",state:{loaded:!1,preview:!1,savebtn:!1,undobtn:!1,redobtn:!1}},global.os=function(){{if(navigator.userAgent.indexOf("Window")>0)return"Windows";if(navigator.userAgent.indexOf("Mac OS X")>0)return"MacOS";if(navigator.userAgent.indexOf("Linux")>0)return"Linux"}return"Other"}();e.json2catalogs=function(t){var i,a,s=[];for(var n in t)a=t[n],i=o(a),a.catalogs&&a.catalogs.length>0&&(i.nodes=e.json2catalogs(a.catalogs)),s.push(i);return s},e.prototype={loadCatalogs:function(t){var o=e.json2catalogs(t);this.createCatalogs(o);var i=this.getSelectCatalogTitle();void 0!==i&&this.editor.statusDone('正在编辑: <span style="color:#444;">'+i+"</span>")},createCatalogs:function(t){var e=this;e.treeview=e.catalog_sel.treeview({data:t,expandIcon:"fa fa-caret-right",collapseIcon:"fa fa-caret-down",enableLinks:!0,levels:3,select_node:function(t){e.selectCatalog(t)}}),e.sortCatalogs()},sortCatalogs:function(){var t=this;Sortable.create(t.catalog_sel.find(".list-group")[0],{filter:".files",onUpdate:function(e){t.sortCatalog(e)}})},selectCatalog:function(t){function e(e){e=e||"",a.reload(e);var o=t.find(".catalog-link").text();a.statusDone('正在编辑: <span style="color:#444;">'+o+"</span>")}var o=this.bookeditor,i=this.settings,a=this.editor;o.getDisabled()&&o.enabled(),a.statusDoing("正在切换章节");var s=this.getSelectCatalog();!1!==$.proxy(i.event.selectCatalog,o)(s,t,e)&&e()},getSelectCatalog:function(){return this.catalog_sel.find(".list-group-item.node-selected")},getSelectCatalogTitle:function(){return this.getSelectCatalog().find(".catalog-link").text()},sortCatalog:function(t){function e(){if(o.treeview.treeview("moveTree",{item:a,next:s}),a.find(".indent").remove(),s.length>0)for(var t=s.find(".indent"),e=0;e<t.length;e++)a.prepend('<span class="indent"></span>')}var o=this,i=o.bookeditor,a=$(t.item),s=a.next(),n=o.settings;!1!==$.proxy(n.event.sortCatalog,i)(a,e)&&e()},clickCatalog:function(t){if($(this).parent(".list-gorup-item").hasClass("node-check"))return!1},newCatalog:function(t){var e=this.treeview,i=o(t);e.treeview("addNode",i),t.nodeid&&e.treeview("expandNode",[parseInt(t.nodeid)])},handlers:{new:function(t){var e=t.settings,o=t.modal_sel,i=o.find(".modal-content"),a=['<div class="book-dialog new-dialog">',"<h3>新建章节</h3>","<form>",'<input type="checkbox" name="is_dir" class="hidden">','<div class="form-group">','<h4 class="title">章节名称</h4>','<input type="text" name="title" class="form-control" autocomplete="off" placeholder="名称" >',"</div>",'<div class="form-group">','<h4 class="title">章节类型</h4>','<label class="catalog-type">','<input type="radio" value="0" class="catalog-type-radio" name="is_dir" checked="checked"/>','<i class="fa fa-file"></i> 单章节 <span class="gray-white">(不能创建子章节)</span>',"</label>",'<label class="catalog-type">','<input type="radio" value="1" class="catalog-type-radio" name="is_dir"/>','<i class="fa fa-files-o"></i> 多章节 <span class="gray-white">(可以创建子章节)</span>',"</label>","</div>","</form>",'<div class="clearfix">','<div class="col-sm-6 center-text">','<button class="editor-btn ok" href="javascript:">新建</button>',"</div>",'<div class="col-sm-6 center-text">','<button class="editor-btn cancel" data-dismiss="modal">取消</button>',"</div>","</div>","</div>"].join("\n");i.append(a);var s=$(this).parents(".book-dropdown").attr("data-nodeid");i.find(".ok").bind("click",function(i){function a(e){e=e||{title:n.title,nodeid:s,is_dir:n.is_dir},t.catalog.newCatalog(e),o.modal("hide")}var n=$(this).parents(".new-dialog").find("form").serializeObject(),l=null;return n.title=n.title.replace(/\//g,""),n.is_dir="1"==n.is_dir?1:0,""!==n.title&&(s&&(l=t.getCatalog(s)),!1!==$.proxy(e.event.newCatalog,t)(l,n,a)&&(a(),!1))}),o.modal("show")},rename:function(t){var e=t.settings,o=$(this).parents(".book-dropdown").attr("data-nodeid"),i=t.getCatalog(o);if(i.length<1)return!1;var a=i.find(".catalog-link").text(),s=t.modal_sel,n=s.find(".modal-content"),l=['<div class="book-dialog">',"<h3>重命名</h3>",'<form class="form-horizontal">','<div class="form-group">','<div class="col-sm-9">','<input name="title" type="text" autocomplete="off" placeholder="请输入名称" class="form-control" value="'+a+'">',"</div>",'<div class="col-sm-3">','<button class="editor-btn rename ok" type="submit" href="javascript:">确定</button>',"</div>","</div>","</form>","</div>"].join("\n");n.html(l),n.find(".ok").bind("click",function(a){function n(){t.catalog.treeview.treeview("renameNode",{text:l.title,nodeId:o}),s.modal("hide")}var l=$(this).parents("form").serializeObject();return l.title=l.title.replace(/\//g,""),""!==l.title&&o?!1!==$.proxy(e.event.renameCatalog,t)(i,l,n)&&(n(),!1):(s.modal("hide"),!1)}),s.modal("show")},delete:function(t){var e=t.settings,o=t.modal_sel,i=o.find(".modal-content"),a=['<div class="book-dialog delete-dialog">','<div class="center-text">',"<h4>确定要删除吗</h4>","</div>",'<div class="clearfix">','<div class="pull-right">','<button href="javascript:" class="editor-btn" data-dismiss="modal">取消</button>','<button href="javascript:" class="editor-btn danger ok">删除</button>',"</div>","</div>","</div>"].join("\n");i.append(a);var s=$(this).parents(".book-dropdown").attr("data-nodeid");i.find(".ok").bind("click",function(i){function a(){t.catalog.treeview.treeview("deleteNode",s),o.modal("hide")}var n=t.getCatalog(s);return n.length<1?(o.modal("hide"),!1):!1!==$.proxy(e.event.deleteCatalog,t)(n,a)&&(a(),!1)}),o.modal("show")},quote:function(t){var e=$(this).parents(".book-dropdown").attr("data-nodeid"),o=t.getCatalog(e);link=o.find(".catalog-link")[0];var i="["+link.innerHTML+"]("+link.pathname+")";t.write(i)}}};i.prototype={newBtns:function(t,e){for(var o,i,a="MacOS"===global.os?"macos":"common",s=this.settings,n=s.tooltip[a],l=this.toolbar_sel,r=[],d=0;d<t.length;d++)if(!("object"!=typeof(r=t[d])||r.length<1)){tool_group=$('<div class="book-tool-group"></div>'),e&&tool_group.css("float","right"),l.append(tool_group);for(var c=0;c<r.length;c++)name=r[c],void 0!==s.toolbarCustomBtns[name]?((i=$(s.toolbarCustomBtns[name])).attr("name",name),tool_group.append(i)):(o=n[name],"H1"===name||"H2"===name||"H3"===name?tool_group.append('<button class="btn book-tool-btn tooltipped" name="'+name+'" aria-label="'+o+'">'+name+"</button>"):tool_group.append('<button class="btn book-tool-btn tooltipped" name="'+name+'" aria-label="'+o+'"><i class="'+s.toolbarBtnClass[name]+'" aria-hidden="true"></i></button>'))}},setHandlers:function(){var e,o,i=this.settings,a=this.toolbar_sel,s=this.bookeditor,n=this.editor.editor,l=this.handlers,r=i.toolbarHandlers;return a.find(".book-tool-btn").bind(t("click","touchend"),function(t){e=$(this).attr("name"),o=n.getCursor();var i=n.getSelection();if(e&&""!==e){if(void 0!==r[e])$.proxy(r[e],s)(n,o,i);else{if(void 0===l[e])return;$.proxy(l[e],s)(n)}return"table"!==e&&"link"!==e&&"image"!==e&&n.focus(),!1}}),this},registerKeymaps:function(){var t,e,o,i,a=this.editor.editor,s=this.settings,n=this.bookeditor,l=this.handlers,r=s.toolbarHandlers,d="MacOS"===global.os?"macos":"common",c=s.keymaps[d],h=s.gkeymaps[d];for(o in c)t=c[o],e="string"==typeof t?void 0!==r[t]?$.proxy(r[t],n):$.proxy(l[t],n):$.proxy(t,n),(i={})[o]=e,a.addKeyMap(i);for(o in h)t=h[o],e="string"==typeof t?void 0!==r[t]?$.proxy(r[t],n):$.proxy(l[t],n):$.proxy(t,n),Mousetrap.bind(o,e);return this},handlers:{save:function(){return!this.settings.disabled&&(!!global.state.savebtn&&(this.editor.save(),this.editor.editor.execCommand("save"),this.handleState("save"),!1))},undo:function(){var t=global.state;return!this.settings.disabled&&(!!t.undobtn&&(this.editor.editor.undo(),void this.handleState("undo")))},redo:function(){var t=global.state;return!this.settings.disabled&&(!!t.redobtn&&(this.editor.editor.redo(),void this.bookeditor.handleState("redo")))},bold:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();t.replaceSelection("**"+o+"**"),""===o&&t.setCursor(e.line,e.ch+2)},italic:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();t.replaceSelection("*"+o+"*"),""===o&&t.setCursor(e.line,e.ch+1)},del:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();t.replaceSelection("~~"+o+"~~"),""===o&&t.setCursor(e.line,e.ch+2)},H1:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();0!==e.ch?(t.setCursor(e.line,0),t.replaceSelection("# "+o),t.setCursor(e.line,e.ch+2)):t.replaceSelection("# "+o)},H2:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();0!==e.ch?(t.setCursor(e.line,0),t.replaceSelection("## "+o),t.setCursor(e.line,e.ch+2)):t.replaceSelection("## "+o)},H3:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();0!==e.ch?(t.setCursor(e.line,0),t.replaceSelection("### "+o),t.setCursor(e.line,e.ch+2)):t.replaceSelection("### "+o)},H4:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();0!==e.ch?(t.setCursor(e.line,0),t.replaceSelection("#### "+o),t.setCursor(e.line,e.ch+2)):t.replaceSelection("#### "+o)},H5:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();0!==e.ch?(t.setCursor(e.line,0),t.replaceSelection("##### "+o),t.setCursor(e.line,e.ch+2)):t.replaceSelection("##### "+o)},H6:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();0!==e.ch?(t.setCursor(e.line,0),t.replaceSelection("###### "+o),t.setCursor(e.line,e.ch+2)):t.replaceSelection("###### "+o)},"list-ul":function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();if(""===o)0!==e.ch?(t.setCursor(e.line,0),t.replaceSelection("- "+o),t.setCursor(e.line,e.ch+2)):t.replaceSelection("- "+o);else{for(var i=o.split("\n"),a=0,s=i.length;a<s;a++)i[a]=""===i[a]?"":"- "+i[a];t.replaceSelection(i.join("\n"))}},"list-ol":function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();if(""===o)0!==e.ch?(t.setCursor(e.line,0),t.replaceSelection("1. "+o),t.setCursor(e.line,e.ch+2)):t.replaceSelection("1. "+o);else{for(var i=o.split("\n"),a=0,s=i.length;a<s;a++)i[a]=""===i[a]?"":a+1+". "+i[a];t.replaceSelection(i.join("\n"))}},quote:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();0!==e.ch?(t.setCursor(e.line,0),t.replaceSelection("> "+o),t.setCursor(e.line,e.ch+2)):t.replaceSelection("> "+o)},table:function(){if(this.settings.disabled)return!1;var t=this.modal_sel,e=t.find(".modal-content"),o=['<div class="book-dialog dialog-table">',"<h3>添加表格</h3>",'<div class="form-group">','<label class="control-label col-sm-2">行数:</label><input class="col-sm-2 form-control" name="rows" value="2" type="text" style="width:80px;margin-right: 40px;">','<label class="control-label col-sm-2">列数:</label><input class="col-sm-2 form-control" name="cols" value="3" type="text" style="width:80px">',"</div>",'<div class="clearfix">','<div class="pull-right">','<button class="editor-btn ok">确定</button>','<button class="editor-btn" data-dismiss="modal">取消</button>',"</div>","</div>","</div>"].join("\n");e.append(o);var i=this.editor.editor,a=i.getCursor();e.find(".ok").bind("click",function(o){var s=parseInt(e.find("input[name=rows]").val(),10),n=parseInt(e.find("input[name=cols]").val(),10),l="";if(s>1&&n>0)for(var r=0,d=s;r<d;r++){for(var c=[],h=[],u=0,f=n;u<f;u++)1===r&&h.push("-----"),c.push(" ");1===r&&(l+="| "+h.join(" | ")+" |\n"),l+="| "+c.join(1===n?"":" | ")+" | \n"}return i.replaceSelection(l),i.setCursor(a.line,a.ch+2),t.modal("hide"),!1}),t.modal("show")},line:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor();t.getSelection();t.replaceSelection((0!==e.ch?"\n\n":"\n")+"------------\n")},link:function(){if(this.settings.disabled)return!1;var t=this.modal_sel,e=t.find(".modal-content"),o=['<div class="book-dialog dialog-link">',"<h3>添加链接</h3>",'<div class="form-group">','<label class="col-sm-2 control-label">链接地址:</label>','<div class="col-sm-10">','<input class="form-control" placeholder="http://..." name="link" type="text">',"</div>","</div>",'<div class="form-group">','<label class="col-sm-2 control-label">链接标题:</label>','<div class="col-sm-10">','<input class="form-control" autocomplete="off" name="title" type="text">',"</div>","</div>",'<div class="clearfix">','<div class="pull-right">','<button class="editor-btn ok">确定</button>','<button class="editor-btn" data-dismiss="modal">取消</button>',"</div>","</div>","</div>"].join("\n");e.append(o);var i=this.editor.editor,a=i.getCursor();e.find(".ok").bind("click",function(o){var s=e.find("input[name=link]").val(),n=e.find("input[name=title]").val(),l="[{0}]({1})".format(n,s);return i.replaceSelection(l),""===n?i.setCursor(a.line,a.ch+1):""===s&&i.setCursor(a.line,a.ch+n.length+3),t.modal("hide"),!1}),t.modal("show")},image:function(){if(this.settings.disabled)return!1;var t=this.modal_sel,e=(this.settings,t.find(".modal-content")),o=['<div class="book-dialog dialog-image">',"<h3>图片链接</h3>","<div>",'<div class="form-group">','<label class="col-sm-2 control-label">图片地址:</label>','<div class="col-sm-10">','<input class="form-control" name="src" type="text" placeholder="输入图片地址">',"</div>","</div>",'<div class="form-group">','<label class="col-sm-2 control-label">图片描述:</label>','<div class="col-sm-10">','<input class="form-control" name="name" type="text" placeholder="输入描述">',"</div>","</div>",'<div class="clearfix">','<div class="pull-right">','<button class="editor-btn ok">确定</button>','<button class="editor-btn" data-dismiss="modal">取消</button>',"</div>","</div>","</div>","</div>"].join("\n");e.append(o);var i=this.editor.editor;e.find(".ok").bind("click",function(e){var o,a,s,n=$(this).parents(".book-dialog"),l=i.getCursor();i.getSelection();o=n.find("input[name=src]").val(),a=n.find("input[name=name]").val(),s="![{0}]({1})".format(a,o),i.replaceSelection(s);var r=o?l.ch+a.length+o.length+5:l.ch+a.length+4;return i.setCursor(l.line,r),t.modal("hide"),!1}),t.modal("show")},code:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();0!==e.ch?(t.replaceSelection(["\n```",o,"```"].join("\n")),""===o&&t.setCursor(e.line+2,1)):(t.replaceSelection(["```",o,"```"].join("\n")),""===o&&t.setCursor(e.line+1,1))},math:function(){if(this.settings.disabled)return!1;var t=this.editor.editor,e=t.getCursor(),o=t.getSelection();t.replaceSelection("$$x=y$$"),""===o&&t.setCursor(e.line,e.ch+5)},preview:function(){if(this.settings.disabled)return!1;var t=this.toolbar_sel.find(".book-tool-btn[name=preview]");t.hasClass("watched")?(t.removeClass("watched"),this.unwatch()):(t.addClass("watched"),this.watch())}}};a.prototype={watch:function(){this.bookeditor;var t=this.settings;return t.watch=!0,this.editor_sel.css("width",t.editorWidth),this.preview_sel.css("left",t.editorWidth),this.preview_sel.show(),this.editor.refresh(),this},unwatch:function(){this.bookeditor;return this.settings.watch=!1,this.editor_sel.css("width","100%"),this.preview_sel.css("left","100%"),this.preview_sel.hide(),this.editor.refresh(),this},initCodeMirror:function(){var t=this.settings,e=this.codemirror_sel,o={mode:"gfm",lineNumbers:t.lineNumbers,tabSize:t.tabSize,autofocus:t.autoFocus,indentWithTabs:!0,lineWrapping:!0},i=this.editor=CodeMirror(e[0],o);t.autoHeight&&(e.find(".CodeMirror").css("height","auto"),i.setOption("viewportMargin",1/0)),t.lineNumbers||e.find(".CodeMirror-gutters").css("border-right","none")},display:function(){return this.preview(),this.settings.watch?this.watch():this.unwatch(),this.bindScrollEvent().bindChangeEvent(),this},preview:function(){var t=this.settings;if(null!==this.timer&&!t.disabled){var e=this.html_sel,o=(this.editor_sel,this.editor.getValue()),i=this.markdown2html(o);e&&e.html(i)}},focus:function(){this.editor&&this.editor.focus()},reload:function(t){var e=this.settings,o=this.editor,i=this.bookeditor;i.getDisabled()||(o.setValue(t),o.execCommand("goDocEnd"),this.old_markdown=t,this.old_html=this.markdown2html(t),this.autoSave(),e.autoFocus&&this.focus()),i.handleState("init")},write:function(t){var e=this.editor,o=e.getCursor();e.getSelection();e.replaceSelection(t),e.setCursor(o.line,o.ch+t.length),e.focus()},disabled:function(){this.editor_sel.find(".CodeMirror").hide(),this.html_sel.hide(),this.stopSave()},enabled:function(){this.html_sel.show(),this.editor_sel.find(".CodeMirror").show(),this.autoSave()},_save:function(){function t(){e.old_markdown=o,e.old_html=i;var t=e.bookeditor.getSelectCatalogTitle();void 0!==t&&e.statusDone('正在编辑: <span style="color:#444;">'+t+"</span>")}var e=this,o=e.editor.getValue(),i=e.markdown2html(o);if(o!=e.old_markdown){e.statusDoing("正在保存");var a={markdown:o,html:i,old_markdown:e.old_markdown,old_html:e.old_html};!1!==$.proxy(e.settings.event.save,e.bookeditor)(a,t)&&t()}},save:function(){this.settings.save&&(this.autoSave(),this._save())},addExtraHtml:function(t){return root='<div class="root-html">'+t+"</div>",root=$(root),root.find("pre").addClass("prettyprint linenums"),root.find("table").addClass("table table-bordered table-striped"),prettyPrint(null,root[0]),root.find("."+global.katexClass).each(function(){var t=$(this),e=t.text();e=e.replace(/\u2019/g,"'");try{katex.render(e,t[0])}catch(t){return}t.find(".katex").css("font-size","1.5em")}),root[0].innerHTML},markdown2html:function(t){var e={renderer:this.renderer(),gfm:!0,tables:!0,breaks:!0,smartLists:!0,smartypants:!0,sanitize:!0},o=marked(t,e);return this.addExtraHtml(o)},autoSave:function(){var t=this.settings;t.save&&(this.saveTimer&&clearTimeout(this.saveTimer),this.saveTimer=setTimeout(s(this),t.saveInterval))},stopSave:function(){this.settings.save&&(this.saveTimer&&clearTimeout(this.saveTimer),this.saveTimer=null)},statusHtml:function(){return this.status_sel?this.status_sel.html():""},statusDoing:function(t){this.status_sel&&this.status_sel.html(t+' <i class="fa fa-spinner fa-pulse fa-fw"></i>')},statusDone:function(t){this.status_sel&&this.status_sel.html(t)},renderer:function(){var t=new marked.Renderer;return t.tablecell=function(t,e){var o=e.header?"th":"td";return(e.header&&e.width?e.align?"<"+o+' style="text-align:'+e.align+'" style="width:'+e.width+';">':"<"+o+' style="width:'+e.width+'">':e.align?"<"+o+' style="text-align:'+e.align+'">':"<"+o+">")+t+"</"+o+">\n"},t.paragraph=function(t){var e=/\$\$(.*)\$\$/g.test(t),o=/^\$\$(.*)\$\$$/.test(t),i=o?' class="'+global.katexClass+'"':"";return t=!o&&e?t.replace(/(\$\$([^\$]*)\$\$)+/g,function(t,e){return'<span class="'+global.katexClass+'">'+e.replace(/\$/g,"")+"</span>"}):o?t.replace(/\$/g,""):t,"<p"+i+">"+t+"</p>\n"},t.code=function(t,e,o){return"math"===e||"latex"===e||"katex"===e?'<p class="'+global.katexClass+'">'+t+"</p>":marked.Renderer.prototype.code.apply(this,arguments)},t},addScrollbar:function(){this.settings;this.editor_sel.addClass(global.scrollbarClass),this.preview_sel.addClass(global.scrollbarClass)},bindScrollEvent:function(){var e=this.preview_sel,o=this.editor_sel;this.settings;if(!e)return this;var i=function(){o.bind(t("scroll","touchmove"),function(t){var o=$(this),i=o.height(),a=o.scrollTop(),s=a/o[0].scrollHeight;0==a?e.scrollTop(0):a+i>=o[0].scrollHeight-16?e.scrollTop(e[0].scrollHeight):e.scrollTop(e[0].scrollHeight*s)})},a=function(){o.unbind(t("scroll","touchmove"))};return o.bind({mouseover:i,mouseout:a,touchstart:i,touchend:a}),this},bindChangeEvent:function(){var t=this,e=t.editor;t.settings;e.on("change",function(e,o){t.timer=setTimeout(function(){clearTimeout(t.timer),t.preview(),t.timer=null,t.bookeditor.handleState("onchange")},400)})}},n.defaults={watch:!0,disabled:!1,save:!0,saveInterval:6e3,full:!1,width:"100%",height:"480px",editorWidth:"60%",markdown:"",wraperId:null,event:{sortCatalog:function(t,e){},selectCatalog:function(t,e,o){},newCatalog:function(t,e,o){},renameCatalog:function(t,e,o){},deleteCatalog:function(t,e){},save:function(t,e){}},tabSize:4,autoFocus:!0,lineNumbers:!0,autoHeight:!0,catalog:!1,editorStatus:!0,filesMenus:["new","rename","quote","delete"],fileMenus:["rename","quote","delete"],menuTexts:{new:'<a href="#" name="new">新建</a>',rename:'<a href="#" name="rename">重命名</a>',quote:'<a href="#" name="quote">引用</a>',delete:'<a href="#" style="color:#D32F2F;" name="delete">删除</a>'},menuHandlers:{},toolbarBtns:[["save"],["undo","redo"],["bold","italic","del"],["H1","H2","H3"],["list-ol","list-ul","quote","table","line"],["link","image","code","math"]],toolbarRightBtns:[["preview"]],toolbarCustomBtns:{},toolbarBtnClass:{save:"fa fa-save",undo:"fa fa-undo",redo:"fa fa-repeat",bold:"fa fa-bold",italic:"fa fa-italic",del:"fa fa-strikethrough",H1:"",H2:"",H3:"","list-ul":"fa fa-list-ul","list-ol":"fa fa-list-ol",quote:"fa fa-quote-left",table:"fa fa-table",line:"fa fa-minus",link:"fa fa-link",image:"fa fa-image",code:"fa fa-code",math:"fa fa-superscript",preview:"fa fa-eye"},toolbarHandlers:{},tooltip:{macos:{save:"保存(Cmd + S)",undo:"撤销(Cmd + Z)",redo:"重做(Cmd + Y)",bold:"粗体(Cmd + B)",italic:"斜体(Cmd + I)",del:"删除线(Option + Shift + 5)",H1:"标题1(Cmd + 1)",H2:"标题2(Cmd + 2)",H3:"标题3(Cmd + 3)","list-ul":"无序列表(Cmd + Shift + 8)","list-ol":"有序列表(Cmd + Shift + 7)",quote:"引用(Cmd + ])",table:"表格(Cmd + Shift + K)",line:"横线(Cmd + Shift + H)",link:"添加链接(Cmd + Shift + L)",image:"添加图片(Cmd + Shift + I)",code:"代码块(Cmd + Shift + 9)",math:"公式(Cmd + Shift + M)",preview:"预览(Cmd + Shift + P)"},common:{save:"保存(Ctrl + S)",undo:"撤销(Ctrl + Z)",redo:"重做(Ctrl + Y)",bold:"粗体(Alt + B)",italic:"斜体(Alt + I)",del:"删除线(Alt + Shift + 5)",H1:"标题1(Alt + 1)",H2:"标题2(Alt + 2)",H3:"标题3(Alt + 3)","list-ul":"无序列表(Alt + Shift + 8)","list-ol":"有序列表(Alt + Shift + 7)",quote:"引用(Alt + ])",table:"表格(Alt + Shift + K)",line:"横线(Alt + Shift + H)",link:"添加链接(Alt + Shift + L)",image:"添加图片(Alt + Shift + I)",code:"代码块(Alt + Shift + 9)",math:"公式(Alt + Shift + M)",preview:"预览(Ctrl + Shift + P)"}},keymaps:{macos:{"Cmd-S":"save","Cmd-Z":"undo","Cmd-Y":"redo","Cmd-B":"bold","Cmd-I":"italic","Shift-Alt-5":"del","Cmd-1":"H1","Cmd-2":"H2","Cmd-3":"H3","Cmd-4":"H4","Cmd-5":"H5","Cmd-6":"H6","Shift-Cmd-8":"list-ul","Shift-Cmd-7":"list-ol","Cmd-]":"quote","Shift-Cmd-K":"table","Shift-Cmd-H":"line","Shift-Cmd-L":"link","Shift-Cmd-I":"image","Shift-Cmd-9":"code","Shift-Cmd-M":"math","Shift-Cmd-P":"preview"},common:{"Ctrl-S":"save","Ctrl-Z":"undo","Ctrl-Y":"redo","Alt-B":"bold","Alt-I":"italic","Shift-Alt-5":"del","Alt-1":"H1","Alt-2":"H2","Alt-3":"H3","Alt-4":"H4","Alt-5":"H5","Alt-6":"H6","Shift-Alt-8":"list-ul","Shift-Alt-7":"list-ol","Alt-]":"quote","Shift-Alt-K":"table","Shift-Alt-H":"line","Shift-Alt-L":"link","Shift-Alt-I":"image","Shift-Alt-9":"code","Shift-Alt-M":"math","Shift-Ctrl-P":"preview"}},gkeymaps:{macos:{"command+shift+p":"preview"},common:{"ctrl+shift+p":"preview"}}};return n.prototype={load:function(){var t=this.settings;this.editor.reload(t.markdown),this.editor.display(),t.disabled&&this.editor.disabled(),global.state.loaded=!0},reload:function(t){this.editor.reload(t)},write:function(t){this.editor.write(t)},disabled:function(){this.settings.disabled=!0,this.editor.disabled()},enabled:function(){this.settings.disabled=!1,this.editor.enabled()},save:function(){this.editor.save()},focus:function(){this.getDisabled()||this.editor.editor.focus()},setValue:function(t){if(!this.getDisabled()){var e=this.editor.editor;e.setValue(t),e.execCommand("goDocEnd")}},getValue:function(){return this.editor.editor.getValue()},getHtml:function(){var t=this.getValue();return this.markdown2html(t)},watch:function(){this.editor.watch()},unwatch:function(){this.editor.unwatch()},statusDoing:function(t){this.editor.statusDoing(t)},statusDone:function(t){this.editor.statusDone(t)},getDisabled:function(){return this.settings.disabled},getSelectCatalog:function(){if(this.settings.catalog)return this.catalog.getSelectCatalog()},getSelectCatalogTitle:function(){if(this.settings.catalog)return this.catalog.getSelectCatalogTitle()},getCatalog:function(t){return this.catalog.catalog_sel.find(".list-group-item[data-nodeid="+t+"]")},getEditor:function(){return this.editor.editor},markdown2html:function(t){return this.editor.markdown2html(t)},handleState:function(t){var e,o,i,a,s=this.getEditor(),n=this.toolbar_sel,l=global.state,r="disabled";switch(t){case"init":e=n.find(".book-tool-btn[name=save]"),i=n.find(".book-tool-btn[name=redo]"),o=n.find(".book-tool-btn[name=undo]"),e.addClass(r),e.attr(r,r),i.addClass(r),i.attr(r,r),o.addClass(r),o.attr(r,r),l.savebtn=!1,l.undobtn=!1,l.redobtn=!1,l.loaded=!1,s.clearHistory();break;case"save":(e=n.find(".book-tool-btn[name=save]")).addClass(r),e.attr(r,r),l.savebtn=!1;break;case"undo":(i=n.find(".book-tool-btn[name=redo]")).removeClass(r),i.removeAttr(r,r),l.redobtn=!0,(a=s.historySize()).undo||((o=n.find(".book-tool-btn[name=undo]")).addClass(r),o.attr(r,r),l.undobtn=!1);break;case"redo":(o=n.find(".book-tool-btn[name=undo]")).removeClass(r),o.removeAttr(r,r),l.undobtn=!0,(a=s.historySize()).redo||((i=n.find(".book-tool-btn[name=redo]")).addClass(r),i.attr(r,r),l.redobtn=!1);break;case"onchange":!l.savebtn&&l.loaded&&((e=n.find(".book-tool-btn[name=save]")).removeClass(r),e.removeAttr(r),l.savebtn=!0),l.loaded=!0,l.undobtn&&!l.redobtn||((a=s.historySize()).undo&&((o=n.find(".book-tool-btn[name=undo]")).removeClass(r),o.removeAttr(r),l.undobtn=!0),a.redo||((i=n.find(".book-tool-btn[name=redo]")).addClass(r),i.attr(r,r),l.redobtn=!1))}}},n}();
JavaScript
1
https://gitee.com/beibq/bookeditor.git
git@gitee.com:beibq/bookeditor.git
beibq
bookeditor
bookeditor
master

搜索帮助