typecho-core
Version:
An element-drived engine working well with XHR-intensive front-end. Originally designed for Typecho.
1 lines • 4.61 kB
JavaScript
let Carol=window.Carol||{};Carol={editor:[],editorOptions:{},editorOptionsGlobal:{},editorArea:null,editTrigger:null,securityToken:null,contentId:null,codeMirrorThemeConfig:[],init:function(e,t,o){this.setEditorArea(e),this.editorArea&&CarolEditor&&this.editorInit(t,o)},setEditorArea:function(e){this.editorArea=e},setEditorOptions:function(e){this.editorOptions=e},setSecurityToken:function(e){this.securityToken=e},setContentId:function(e){this.contentId=e},getCurrentEditor:function(){return this.editor.slice(-1)[0]},setCodeMirrorThemeConfig:function(e){this.codeMirrorThemeConfig=Object.keys(e).map((t=>({[t]:e[t]})))},extendEditorOptions:function(e,t,o=!1){o?this.editorOptionsGlobal[e]=t:this.editorOptions[e]=t},editorInit:function(e,t){let o;o=Object.assign({codeMirror:{themeConfig:this.codeMirrorThemeConfig},style:{definitions:[{name:"圈住",element:"span",classes:["boxed"]},{name:"文艺青年",element:"blockquote",classes:["well-quote"]},{name:"黑幕",element:"span",classes:["spoiler"]},{name:"键盘按键",element:"kbd",classes:["key-item"]},{name:"提示",element:"p",classes:["info-box"]},{name:"红色提示",element:"p",classes:["info-box","info-box--red"]},{name:"绿色提示",element:"p",classes:["info-box","info-box--green"]},{name:"黄色提示",element:"p",classes:["info-box","info-box--yellow"]},{name:"常规按钮",element:"a",classes:["button","p-button","p-button--default"]},{name:"主要按钮",element:"a",classes:["button","p-button","p-button--primary"]},{name:"红色按钮",element:"a",classes:["button","p-button","p-button--destructive"]}]},codeBlock:{languages:[{language:"plaintext",label:"纯文本"},{language:"js",label:"JavaScript"},{language:"css",label:"CSS"},{language:"html",label:"HTML"},{language:"php",label:"PHP"},{language:"json",label:"JSON"},{language:"cpp",label:"C++"},{language:"java",label:"Java"},{language:"apacheconf",label:"Apache 配置"},{language:"bash",label:"Bash"},{language:"sql",label:"SQL"}]},mediaEmbed:{providers:[{name:"BiliBili",url:/^bilibili\.com\/video\/(\w+)/,html:e=>`<iframe src="//player.bilibili.com/player.html?bvid=${e[1]}&danmaku=0&autoplay=0" width="100%" height="500"></iframe>`}]},gallery:{types:[{type:"classic",title:"经典",description:"原始极简、舒适且经典的相册。所见即所得,所有图片的尺寸统一为相册高度。",default:!0},{type:"carousel",title:"Carousel",description:"带有左右控件、允许实现轮播的相册。这种模式下,相册高度是指整个控件的最大高度。"},{type:"classic-carousel",title:"Carousel [经典缩略图]",description:"使用旧版、较为方正缩略图样式的轮播相册。"},{type:"autoPlay-carousel",title:"Carousel [自动播放]",description:"此模式下的缩略图会尝试完成自动播放。鼠标离开一段时间后,就会自动载入下一张。"}]},wordCount:{displayWords:!1},customButtons:[{name:"citizen_editor_cancel_edit",label:"取消编辑",class:"p-editor-action--cancel",type:"submit",withText:!0,onExecute:()=>this.actionFromButton(!1)},{name:"citizen_editor_commit_edit",label:"保存更改...",class:"p-editor-action--commit",type:"submit",withText:!0,onExecute:e=>this.actionFromButton(!0,e.getData())}],placeholder:"这里是您的编辑区域。将光标聚焦至此处以开始写作。",updateSourceElementOnDestroy:!0},this.editorOptionsGlobal,this.editorOptions,t),window.CarolEditor.create(this.editorArea,o).then((t=>{this.editor.push(t),"function"==typeof e&&e(t);const o=t.sourceElement;"TEXTAREA"===o.tagName&&this.syncStatusChanges(o),this.editorOptions={}})).catch((e=>{console.error("Carol 编辑器出现错误。",e)}))},syncStatusChanges:function(e){const t=this.getCurrentEditor();t.model.document.on("change:data",(()=>{e.value=t.getData()}))},actionFromButton:function(e=!0,t=""){if(!e||!this.editor||0===this.editor.length)return TypechoCore.xhr.redirect();const o=this.securityToken;TypechoCore.xhr.request({url:"/action/contents-post-edit",method:"POST",data:{do:"fastPublish",_:o,cid:this.contentId,text:t},useFormData:!0,success:e=>TypechoCore.engine.handleServerResponse(e),error:e=>{console.error("XHR 发生错误。",e),TypechoCore.ui.flashMessage("快速保存遇到错误,详见控制台信息。请先保存你的内容,然后刷新页面重试。")}})},destroy:function(){Carol.editor&&Carol.editor.length>0&&(Carol.editor.forEach((function(e){e.ui.view.toolbar.element.remove(),e.ui.view.editable.element.remove();document.querySelectorAll(".instant-editor").forEach((function(e){e.classList.remove("instant-editor")})),e.destroy()})),Carol.editor=[])}};