diff --git a/index.html b/index.html
index 4bd9382..3d9b38d 100644
--- a/index.html
+++ b/index.html
@@ -1 +1 @@
-
微信 Markdown 编辑器
\ No newline at end of file
+微信 Markdown 编辑器
\ No newline at end of file
diff --git a/js/app.3d58af3e.js b/js/app.0cd158ff.js
similarity index 74%
rename from js/app.3d58af3e.js
rename to js/app.0cd158ff.js
index 034bc1d..ec9cfec 100644
--- a/js/app.3d58af3e.js
+++ b/js/app.0cd158ff.js
@@ -1,4 +1,4 @@
-(function(e){function t(t){for(var o,a,s=t[0],c=t[1],l=t[2],d=0,f=[];d0}));r=i(r);var a=e.substring(0,t).split(",").map((function(e){return e.trim()}));a.forEach((function(e){o[e]||(o[e]={}),Object.keys(r).forEach((function(t){o[e][t]=r[t]}))})),e=e.slice(n+1).trim()};while(e.length>0&&-1!==e.indexOf("{")&&-1!==e.indexOf("}"))i();return o}function O(e,t){var n=e.getValue(0);n?localStorage.setItem(t,n):localStorage.removeItem(t)}function _(e){var t=g.a.format(e,{parser:"markdown",plugins:[b.a]});return t}function T(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"pre",t=document.getElementsByClassName("code__pre");t.length>0&&t.forEach((function(t){t.style.whiteSpace=e}))}function E(e){var t=document.createElement("a");t.download="content.md",t.style.display="none";var n=new Blob([e]);t.href=URL.createObjectURL(n),document.body.appendChild(t),t.click(),document.body.removeChild(t)}function I(e){for(var t=e.data,n=e.rows,o=e.cols,i="",r=[],a=0;a1?a-1:a;1===a?r.push("---\t"):r.push(t["k_".concat(c,"_").concat(s)]||"")}i+=r.join("\t|\t"),i+="\t|\n"}return i}var R=n("466b"),$=n.n(R);function A(){for(var e=document.getElementById("output"),t=e.getElementsByTagName("img"),n=0;n=1&&i<=127?t+=e.charAt(n):i>2047?(t+=String.fromCharCode(224|i>>12&15),t+=String.fromCharCode(128|i>>6&63),t+=String.fromCharCode(128|i>>0&63)):(t+=String.fromCharCode(192|i>>6&31),t+=String.fromCharCode(128|i>>0&63));return t}var _e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);function Te(e){var t,n,o,i,r,a;o=e.length,n=0,t="";while(n>2),t+=_e.charAt((3&i)<<4),t+="==";break}if(r=e.charCodeAt(n++),n==o){t+=_e.charAt(i>>2),t+=_e.charAt((3&i)<<4|(240&r)>>4),t+=_e.charAt((15&r)<<2),t+="=";break}a=e.charCodeAt(n++),t+=_e.charAt(i>>2),t+=_e.charAt((3&i)<<4|(240&r)>>4),t+=_e.charAt((15&r)<<2|(192&a)>>6),t+=_e.charAt(63&a)}return t}function Ee(e){return e=e.replace(/\+/g,"-"),e=e.replace(/\//g,"_"),e}function Ie(e,t){var n="github"===t?me:pe;if(e){var o=n.username,i=n.repoList,r=n.branch,a=n.accessTokenList,s=Math.floor(Math.random()*a.length),c=Math.floor(Math.random()*i.length),l=a[s].replace("doocsmd",""),u=i[c];return{username:o,repo:u,branch:r,accessToken:l}}var d=JSON.parse(localStorage.getItem("".concat(t,"Config"))),f=d.repo.replace("https://".concat(t,".com/"),"").replace("http://".concat(t,".com/"),"").replace("".concat(t,".com/"),"").split("/");return{username:f[0],repo:f[1],branch:d.branch||"master",accessToken:d.accessToken}}function Re(){var e=new Date,t=e.getFullYear(),n=(e.getMonth()+1).toString().padStart(2,"0"),o=e.getDate().toString().padStart(2,"0");return"".concat(t,"/").concat(n,"/").concat(o)}function $e(e){var t=(new Date).getTime(),n=e.split(".")[1];return"".concat(t,"-").concat(Object(xe["a"])(),".").concat(n)}function Ae(e,t){return Me.apply(this,arguments)}function Me(){return Me=Object(f["a"])(regeneratorRuntime.mark((function e(t,n){var o,i,r,a,s,c,l,u,d,f,m,p;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return o="default"===localStorage.getItem("imgHost"),i=Ie(o,"github"),r=i.username,a=i.repo,s=i.branch,c=i.accessToken,l=Re(),u="https://api.github.com/repos/".concat(r,"/").concat(a,"/contents/").concat(l,"/"),d=$e(n),e.next=7,fe({url:u+d,method:"put",headers:{Authorization:"token ".concat(c)},data:{content:t,branch:s,message:"Upload by ".concat(window.location.href)}});case 7:return f=e.sent,m="raw.githubusercontent.com/".concat(r,"/").concat(a,"/").concat(s,"/"),p="cdn.jsdelivr.net/gh/".concat(r,"/").concat(a,"@").concat(s,"/"),e.abrupt("return",o?f.content.download_url.replace(m,p):f.content.download_url);case 11:case"end":return e.stop()}}),e)}))),Me.apply(this,arguments)}function Ge(e,t){return je.apply(this,arguments)}function je(){return je=Object(f["a"])(regeneratorRuntime.mark((function e(t,n){var o,i,r,a,s,c,l,u,d,f;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return o="default"===localStorage.getItem("imgHost"),i=Ie(o,"gitee"),r=i.username,a=i.repo,s=i.branch,c=i.accessToken,l=Re(),u=$e(n),d="https://gitee.com/api/v5/repos/".concat(r,"/").concat(a,"/contents/").concat(l,"/").concat(u),e.next=7,fe({url:d,method:"POST",data:{content:t,branch:s,access_token:c,message:"Upload by ".concat(window.location.href)}});case 7:return f=e.sent,e.abrupt("return",encodeURI(f.content.download_url));case 9:case"end":return e.stop()}}),e)}))),je.apply(this,arguments)}function ze(e,t,n){var o=JSON.stringify(n),i=Te(Oe(o)),r=he.a.HmacSHA1(i,t),a=r.toString(he.a.enc.Base64);return"".concat(e,":").concat(Ee(a),":").concat(i)}function He(e){return Fe.apply(this,arguments)}function Fe(){return Fe=Object(f["a"])(regeneratorRuntime.mark((function e(t){var n,o,i,r,a,s,c,l,u,d,f,m;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return n=JSON.parse(localStorage.getItem("qiniuConfig")),o=n.accessKey,i=n.secretKey,r=n.bucket,a=n.region,s=n.path,c=n.domain,l=ze(o,i,{scope:r,deadline:Math.trunc((new Date).getTime()/1e3)+3600}),u=s?"".concat(s,"/"):"",d=u+$e(t.name),f={region:a},m=we["a"](t,d,l,{},f),e.abrupt("return",new Promise((function(e,t){m.subscribe({next:function(e){console.log(e)},error:function(e){t(e.message)},complete:function(t){e("".concat(c,"/").concat(t.key))}})})));case 7:case"end":return e.stop()}}),e)}))),Fe.apply(this,arguments)}function qe(e,t){return Ne.apply(this,arguments)}function Ne(){return Ne=Object(f["a"])(regeneratorRuntime.mark((function e(t,n){var o,i,r,a,s,c,l,u,d,f,m,p;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return o=$e(n),i=JSON.parse(localStorage.getItem("aliOSSConfig")),r=i.region,a=i.bucket,s=i.accessKeyId,c=i.accessKeySecret,l=i.cdnHost,u=i.path,d=ye()(t,"base64"),f="".concat(u,"/").concat(o),m=new ve.a({region:r,bucket:a,accessKeyId:s,accessKeySecret:c}),e.prev=5,e.next=8,m.put(f,d);case 8:if(p=e.sent,""!=l){e.next=11;break}return e.abrupt("return",p.url);case 11:return e.abrupt("return","".concat(l,"/").concat(""==u?o:f));case 14:return e.prev=14,e.t0=e["catch"](5),e.abrupt("return",Promise.reject(e.t0));case 17:case"end":return e.stop()}}),e,null,[[5,14]])}))),Ne.apply(this,arguments)}function De(e){return Ke.apply(this,arguments)}function Ke(){return Ke=Object(f["a"])(regeneratorRuntime.mark((function e(t){var n,o,i,r,a,s,c,l,u;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return n=$e(t.name),o=JSON.parse(localStorage.getItem("txCOSConfig")),i=o.secretId,r=o.secretKey,a=o.bucket,s=o.region,c=o.path,l=o.cdnHost,u=new Se.a({SecretId:i,SecretKey:r}),e.abrupt("return",new Promise((function(e,o){u.putObject({Bucket:a,Region:s,Key:"".concat(c,"/").concat(n),Body:t},(function(t,i){t?o(t):e(l?""==c?"".concat(l,"/").concat(n):"".concat(l,"/").concat(c,"/").concat(n):"https://".concat(i.Location))}))})));case 4:case"end":return e.stop()}}),e)}))),Ke.apply(this,arguments)}function Ve(e,t){var n=localStorage.getItem("imgHost");switch(!n&&localStorage.setItem("imgHost","default"),n){case"aliOSS":return qe(e,t.name);case"txCOS":return De(t);case"qiniu":return He(t);case"gitee":return Ge(e,t.name);case"github":return Ae(e,t.name);default:return Ae(e,t.name)}}var Pe={fileUpload:Ve};function Be(e){return new Promise((function(t,n){var o=Le(e);if(o)n(o);else{var i=new FileReader;i.readAsDataURL(e),i.onload=function(){var o=this.result.split(",").pop();Pe.fileUpload(o,e).then((function(e){t(e)})).catch((function(e){n(e)}))}}}))}function Le(e){return/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(e.name)?e.size>5242880&&"由于公众号限制,图片大小不能超过 5.0M":"请上传 JPG/PNG/GIF 格式的图片"}var Qe={props:{value:{type:Boolean,default:!1},top:{type:Number,default:0},left:{type:Number,default:0}},data:function(){return{menu:[[{text:"上传图片",key:"insertPic"},{text:"插入表格",key:"insertTable"},{text:"页面重置",key:"pageReset"}],[{text:"下载 Markdown 文档",key:"download"},{text:"格式化 Markdown 文档",key:"formatMarkdown"}]]}},methods:{closeCB:function(){this.$emit("input",!1)},onMouseDown:function(e){this.$emit("menuTick",e),this.$emit("closeMenu",!1)}}},Je=Qe,Ue=(n("16aa"),Object(K["a"])(Je,se,ce,!1,null,"449cad31",null)),We=Ue.exports,Ye=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-dialog",{staticClass:"upload__dialog",attrs:{title:"本地上传",visible:e.value},on:{close:function(t){return e.$emit("close")}}},[n("el-tabs",{attrs:{type:"activeName",value:"upload"}},[n("el-tab-pane",{staticClass:"upload-panel",attrs:{label:"选择上传",name:"upload"}},[n("el-select",{attrs:{placeholder:"请选择",size:"small"},on:{change:e.changeImgHost},model:{value:e.imgHost,callback:function(t){e.imgHost=t},expression:"imgHost"}},e._l(e.options,(function(e){return n("el-option",{key:e.value,attrs:{label:e.label,value:e.value}})})),1),n("el-upload",{directives:[{name:"loading",rawName:"v-loading",value:e.uploadingImg,expression:"uploadingImg"}],attrs:{drag:"",action:"",headers:{"Content-Type":"multipart/form-data"},"show-file-list":!1,multiple:!0,accept:".jpg, .jpeg, .png, .gif",name:"file","before-upload":e.beforeUpload}},[n("i",{staticClass:"el-icon-upload"}),n("div",{staticClass:"el-upload__text"},[e._v(" 将图片拖到此处,或 "),n("em",[e._v("点击上传")])])])],1),n("el-tab-pane",{staticClass:"github-panel",attrs:{label:"Gitee 图床",name:"gitee"}},[n("el-form",{staticClass:"setting-form",attrs:{model:e.formGitee,"label-position":"right","label-width":"140px"}},[n("el-form-item",{attrs:{label:"Gitee 仓库",required:!0}},[n("el-input",{attrs:{placeholder:"如:gitee.com/yanglbme/resource"},model:{value:e.formGitee.repo,callback:function(t){e.$set(e.formGitee,"repo","string"===typeof t?t.trim():t)},expression:"formGitee.repo"}})],1),n("el-form-item",{attrs:{label:"分支"}},[n("el-input",{attrs:{placeholder:"如:release,可不填,默认 master"},model:{value:e.formGitee.branch,callback:function(t){e.$set(e.formGitee,"branch","string"===typeof t?t.trim():t)},expression:"formGitee.branch"}})],1),n("el-form-item",{attrs:{label:"私人令牌",required:!0}},[n("el-input",{attrs:{"show-password":"",placeholder:"如:cc1d0c1426d0fd0902bd2d7184b14da61b8abc46"},model:{value:e.formGitee.accessToken,callback:function(t){e.$set(e.formGitee,"accessToken","string"===typeof t?t.trim():t)},expression:"formGitee.accessToken"}}),n("el-link",{attrs:{type:"primary",href:"https://gitee.com/profile/personal_access_tokens",target:"_blank"}},[e._v("请在 Gitee「设置->安全设置->私人令牌」中生成")])],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:e.saveGiteeConfiguration}},[e._v("保存配置")])],1)],1)],1),n("el-tab-pane",{staticClass:"github-panel",attrs:{label:"GitHub 图床",name:"github"}},[n("el-form",{staticClass:"setting-form",attrs:{model:e.formGitHub,"label-position":"right","label-width":"140px"}},[n("el-form-item",{attrs:{label:"GitHub 仓库",required:!0}},[n("el-input",{attrs:{placeholder:"如:github.com/yanglbme/resource"},model:{value:e.formGitHub.repo,callback:function(t){e.$set(e.formGitHub,"repo","string"===typeof t?t.trim():t)},expression:"formGitHub.repo"}})],1),n("el-form-item",{attrs:{label:"分支"}},[n("el-input",{attrs:{placeholder:"如:release,可不填,默认 master"},model:{value:e.formGitHub.branch,callback:function(t){e.$set(e.formGitHub,"branch","string"===typeof t?t.trim():t)},expression:"formGitHub.branch"}})],1),n("el-form-item",{attrs:{label:"Token",required:!0}},[n("el-input",{attrs:{"show-password":"",placeholder:"如:cc1d0c1426d0fd0902bd2d7184b14da61b8abc46"},model:{value:e.formGitHub.accessToken,callback:function(t){e.$set(e.formGitHub,"accessToken","string"===typeof t?t.trim():t)},expression:"formGitHub.accessToken"}}),n("el-link",{attrs:{type:"primary",href:"https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token",target:"_blank"}},[e._v("如何获取 GitHub Token?")])],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:e.saveGitHubConfiguration}},[e._v("保存配置")])],1)],1)],1),n("el-tab-pane",{staticClass:"github-panel",attrs:{label:"阿里云 OSS",name:"aliOSS"}},[n("el-form",{staticClass:"setting-form",attrs:{model:e.formAliOSS,"label-position":"right","label-width":"140px"}},[n("el-form-item",{attrs:{label:"AccessKey ID",required:!0}},[n("el-input",{attrs:{placeholder:"如:LTAI4GdoocsmdoxUf13ylbaNHk"},model:{value:e.formAliOSS.accessKeyId,callback:function(t){e.$set(e.formAliOSS,"accessKeyId","string"===typeof t?t.trim():t)},expression:"formAliOSS.accessKeyId"}})],1),n("el-form-item",{attrs:{label:"AccessKey Secret",required:!0}},[n("el-input",{attrs:{"show-password":"",placeholder:"如:cc1d0c142doocs0902bd2d7md4b14da6ylbabc46"},model:{value:e.formAliOSS.accessKeySecret,callback:function(t){e.$set(e.formAliOSS,"accessKeySecret","string"===typeof t?t.trim():t)},expression:"formAliOSS.accessKeySecret"}})],1),n("el-form-item",{attrs:{label:"Bucket",required:!0}},[n("el-input",{attrs:{placeholder:"如:doocs"},model:{value:e.formAliOSS.bucket,callback:function(t){e.$set(e.formAliOSS,"bucket","string"===typeof t?t.trim():t)},expression:"formAliOSS.bucket"}})],1),n("el-form-item",{attrs:{label:"Bucket 所在区域",required:!0}},[n("el-input",{attrs:{placeholder:"如:oss-cn-shenzhen"},model:{value:e.formAliOSS.region,callback:function(t){e.$set(e.formAliOSS,"region","string"===typeof t?t.trim():t)},expression:"formAliOSS.region"}})],1),n("el-form-item",{attrs:{label:"自定义 CDN 域名",required:!1}},[n("el-input",{attrs:{placeholder:"如:https://imagecdn.alidaodao.com,可不填"},model:{value:e.formAliOSS.cdnHost,callback:function(t){e.$set(e.formAliOSS,"cdnHost","string"===typeof t?t.trim():t)},expression:"formAliOSS.cdnHost"}})],1),n("el-form-item",{attrs:{label:"存储路径"}},[n("el-input",{attrs:{placeholder:"如:img,可不填,默认为根目录"},model:{value:e.formAliOSS.path,callback:function(t){e.$set(e.formAliOSS,"path","string"===typeof t?t.trim():t)},expression:"formAliOSS.path"}}),n("el-link",{attrs:{type:"primary",href:"https://help.aliyun.com/document_detail/31883.html",target:"_blank"}},[e._v("如何使用阿里云 OSS?")])],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:e.saveAliOSSConfiguration}},[e._v("保存配置")])],1)],1)],1),n("el-tab-pane",{staticClass:"github-panel",attrs:{label:"腾讯云 COS",name:"txCOS"}},[n("el-form",{staticClass:"setting-form",attrs:{model:e.formTxCOS,"label-position":"right","label-width":"140px"}},[n("el-form-item",{attrs:{label:"SecretId",required:!0}},[n("el-input",{attrs:{placeholder:"如:AKIDnQp1w3DOOCSs8F5MDp9tdoocsmdUPonW3"},model:{value:e.formTxCOS.secretId,callback:function(t){e.$set(e.formTxCOS,"secretId","string"===typeof t?t.trim():t)},expression:"formTxCOS.secretId"}})],1),n("el-form-item",{attrs:{label:"SecretKey",required:!0}},[n("el-input",{attrs:{"show-password":"",placeholder:"如:ukLmdtEJ9271f3DOocsMDsCXdS3YlbW0"},model:{value:e.formTxCOS.secretKey,callback:function(t){e.$set(e.formTxCOS,"secretKey","string"===typeof t?t.trim():t)},expression:"formTxCOS.secretKey"}})],1),n("el-form-item",{attrs:{label:"Bucket",required:!0}},[n("el-input",{attrs:{placeholder:"如:doocs-3212520134"},model:{value:e.formTxCOS.bucket,callback:function(t){e.$set(e.formTxCOS,"bucket","string"===typeof t?t.trim():t)},expression:"formTxCOS.bucket"}})],1),n("el-form-item",{attrs:{label:"Bucket 所在区域",required:!0}},[n("el-input",{attrs:{placeholder:"如:ap-guangzhou"},model:{value:e.formTxCOS.region,callback:function(t){e.$set(e.formTxCOS,"region","string"===typeof t?t.trim():t)},expression:"formTxCOS.region"}})],1),n("el-form-item",{attrs:{label:"自定义 CDN 域名",required:!1}},[n("el-input",{attrs:{placeholder:"如:https://imagecdn.alidaodao.com,可不填"},model:{value:e.formTxCOS.cdnHost,callback:function(t){e.$set(e.formTxCOS,"cdnHost","string"===typeof t?t.trim():t)},expression:"formTxCOS.cdnHost"}})],1),n("el-form-item",{attrs:{label:"存储路径"}},[n("el-input",{attrs:{placeholder:"如:img,可不填,默认根目录"},model:{value:e.formTxCOS.path,callback:function(t){e.$set(e.formTxCOS,"path","string"===typeof t?t.trim():t)},expression:"formTxCOS.path"}}),n("el-link",{attrs:{type:"primary",href:"https://cloud.tencent.com/document/product/436/38484",target:"_blank"}},[e._v("如何使用腾讯云 COS?")])],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:e.saveTxCOSConfiguration}},[e._v("保存配置")])],1)],1)],1),n("el-tab-pane",{staticClass:"github-panel",attrs:{label:"七牛云 Kodo",name:"qiniu"}},[n("el-form",{staticClass:"setting-form",attrs:{model:e.formQiniu,"label-position":"right","label-width":"140px"}},[n("el-form-item",{attrs:{label:"AccessKey",required:!0}},[n("el-input",{attrs:{placeholder:"如:6DD3VaLJ_SQgOdoocsyTV_YWaDmdnL2n8EGx7kG"},model:{value:e.formQiniu.accessKey,callback:function(t){e.$set(e.formQiniu,"accessKey","string"===typeof t?t.trim():t)},expression:"formQiniu.accessKey"}})],1),n("el-form-item",{attrs:{label:"SecretKey",required:!0}},[n("el-input",{attrs:{"show-password":"",placeholder:"如:qgZa5qrvDOOcsmdKStD1oCjZ9nB7MDvJUs_34SIm"},model:{value:e.formQiniu.secretKey,callback:function(t){e.$set(e.formQiniu,"secretKey","string"===typeof t?t.trim():t)},expression:"formQiniu.secretKey"}})],1),n("el-form-item",{attrs:{label:"Bucket",required:!0}},[n("el-input",{attrs:{placeholder:"如:md"},model:{value:e.formQiniu.bucket,callback:function(t){e.$set(e.formQiniu,"bucket","string"===typeof t?t.trim():t)},expression:"formQiniu.bucket"}})],1),n("el-form-item",{attrs:{label:"Bucket 对应域名",required:!0}},[n("el-input",{attrs:{placeholder:"如:https://images.123ylb.cn"},model:{value:e.formQiniu.domain,callback:function(t){e.$set(e.formQiniu,"domain","string"===typeof t?t.trim():t)},expression:"formQiniu.domain"}})],1),n("el-form-item",{attrs:{label:"存储区域",required:!0}},[n("el-input",{attrs:{placeholder:"如:z2"},model:{value:e.formQiniu.region,callback:function(t){e.$set(e.formQiniu,"region","string"===typeof t?t.trim():t)},expression:"formQiniu.region"}})],1),n("el-form-item",{attrs:{label:"存储路径",required:!1}},[n("el-input",{attrs:{placeholder:"如:img,可不填,默认为根目录"},model:{value:e.formQiniu.path,callback:function(t){e.$set(e.formQiniu,"path","string"===typeof t?t.trim():t)},expression:"formQiniu.path"}}),n("el-link",{attrs:{type:"primary",href:"https://developer.qiniu.com/kodo",target:"_blank"}},[e._v("如何使用七牛云 Kodo?")])],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:e.saveQiniuConfiguration}},[e._v("保存配置")])],1)],1)],1)],1)],1)},Ze=[],Xe={props:{value:{type:Boolean,default:!1}},data:function(){return{formGitHub:{repo:"",branch:"",accessToken:""},formGitee:{repo:"",branch:"",accessToken:""},formAliOSS:{accessKeyId:"",accessKeySecret:"",bucket:"",region:"",path:"",cdnHost:""},formTxCOS:{secretId:"",secretKey:"",bucket:"",region:"",path:"",cdnHost:""},formQiniu:{accessKey:"",secretKey:"",bucket:"",domain:"",region:""},options:[{value:"default",label:"默认"},{value:"gitee",label:"Gitee"},{value:"github",label:"GitHub"},{value:"aliOSS",label:"阿里云"},{value:"txCOS",label:"腾讯云"},{value:"qiniu",label:"七牛云"}],imgHost:"default",uploadingImg:!1}},created:function(){localStorage.getItem("githubConfig")&&(this.formGitHub=JSON.parse(localStorage.getItem("githubConfig"))),localStorage.getItem("giteeConfig")&&(this.formGitee=JSON.parse(localStorage.getItem("giteeConfig"))),localStorage.getItem("aliOSSConfig")&&(this.formAliOSS=JSON.parse(localStorage.getItem("aliOSSConfig"))),localStorage.getItem("txCOSConfig")&&(this.formTxCOS=JSON.parse(localStorage.getItem("txCOSConfig"))),localStorage.getItem("imgHost")&&(this.imgHost=localStorage.getItem("imgHost"))},methods:{changeImgHost:function(){localStorage.setItem("imgHost",this.imgHost),this.$message({showClose:!0,message:"已成功切换图床",type:"success"})},saveGitHubConfiguration:function(){if(this.formGitHub.repo&&this.formGitHub.accessToken)localStorage.setItem("githubConfig",JSON.stringify(this.formGitHub)),this.$message({message:"保存成功",type:"success"});else{var e=this.formGitHub.repo?"token":"GitHub 仓库";this.$message({showClose:!0,message:"参数「".concat(e,"」不能为空"),type:"error"})}},saveGiteeConfiguration:function(){if(this.formGitee.repo&&this.formGitee.accessToken)localStorage.setItem("giteeConfig",JSON.stringify(this.formGitee)),this.$message({message:"保存成功",type:"success"});else{var e=this.formGitee.repo?"私人令牌":"Gitee 仓库";this.$message({showClose:!0,message:"参数「".concat(e,"」不能为空"),type:"error"})}},saveAliOSSConfiguration:function(){this.formAliOSS.accessKeyId&&this.formAliOSS.accessKeySecret&&this.formAliOSS.bucket&&this.formAliOSS.region?(localStorage.setItem("aliOSSConfig",JSON.stringify(this.formAliOSS)),this.$message({message:"保存成功",type:"success"})):this.$message({showClose:!0,message:"阿里云 OSS 参数配置不全",type:"error"})},saveTxCOSConfiguration:function(){this.formTxCOS.secretId&&this.formTxCOS.secretKey&&this.formTxCOS.bucket&&this.formTxCOS.region?(localStorage.setItem("txCOSConfig",JSON.stringify(this.formTxCOS)),this.$message({message:"保存成功",type:"success"})):this.$message({showClose:!0,message:"腾讯云 COS 参数配置不全",type:"error"})},saveQiniuConfiguration:function(){this.formQiniu.accessKey&&this.formQiniu.secretKey&&this.formQiniu.bucket&&this.formQiniu.domain&&this.formQiniu.region?(localStorage.setItem("qiniuConfig",JSON.stringify(this.formQiniu)),this.$message({message:"保存成功",type:"success"})):this.$message({showClose:!0,message:"七牛云 Kodo 参数配置不全",type:"error"})},beforeUpload:function(e){var t=this,n=localStorage.getItem("imgHost"),o=localStorage.getItem("".concat(n,"Config"));return o||""===n||"default"===n?(this.uploadingImg=!0,Be(e).then((function(e){t.$emit("uploaded",e),t.uploadingImg=!1})).catch((function(e){t.uploadingImg=!1,t.$message({showClose:!0,message:e,type:"error"})})),!1):(this.$message.error("请先配置 ".concat(n," 图床参数")),!1)}}},et=Xe,tt=(n("0fd0"),Object(K["a"])(et,Ye,Ze,!1,null,"fab4705a",null)),nt=tt.exports;n("f9d4");var ot={data:function(){return{showCssEditor:!1,aboutDialogVisible:!1,dialogUploadImgVisible:!1,dialogFormVisible:!1,isCoping:!1,isImgLoading:!1,backLight:!1,timeout:null,changeTimer:null,source:"",mouseLeft:0,mouseTop:0}},components:{editorHeader:J,aboutDialog:ee,insertFormDialog:ae,rightClickMenu:We,uploadImgDialog:nt},computed:Object(l["a"])({},Object(q["c"])({wxRenderer:function(e){return e.wxRenderer},output:function(e){return e.output},editor:function(e){return e.editor},cssEditor:function(e){return e.cssEditor},currentSize:function(e){return e.currentSize},currentColor:function(e){return e.currentColor},nightMode:function(e){return e.nightMode},rightClickMenuVisible:function(e){return e.rightClickMenuVisible}})),created:function(){var e=this;this.initEditorState(),this.$nextTick((function(){e.initEditor(),e.initCssEditor(),e.onEditorRefresh()}))},methods:Object(l["a"])({initEditor:function(){var e=this;this.initEditorEntity(),this.editor.on("change",(function(t,n){e.changeTimer&&clearTimeout(e.changeTimer),e.changeTimer=setTimeout((function(){e.onEditorRefresh(),O(e.editor,"__editor_content")}),300)})),this.editor.on("paste",(function(t,n){if(n.clipboardData&&n.clipboardData.items&&!e.isImgLoading)for(var o=0,i=n.clipboardData.items.length;o0}));r=i(r);var a=e.substring(0,t).split(",").map((function(e){return e.trim()}));a.forEach((function(e){o[e]||(o[e]={}),Object.keys(r).forEach((function(t){o[e][t]=r[t]}))})),e=e.slice(n+1).trim()};while(e.length>0&&-1!==e.indexOf("{")&&-1!==e.indexOf("}"))i();return o}function O(e,t){var n=e.getValue(0);n?localStorage.setItem(t,n):localStorage.removeItem(t)}function _(e){var t=g.a.format(e,{parser:"markdown",plugins:[b.a]});return t}function T(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"pre",t=document.getElementsByClassName("code__pre");t.length>0&&t.forEach((function(t){t.style.whiteSpace=e}))}function E(e){var t=document.createElement("a");t.download="content.md",t.style.display="none";var n=new Blob([e]);t.href=URL.createObjectURL(n),document.body.appendChild(t),t.click(),document.body.removeChild(t)}function I(e){for(var t=e.data,n=e.rows,o=e.cols,i="",r=[],a=0;a1?a-1:a;1===a?r.push("---\t"):r.push(t["k_".concat(c,"_").concat(s)]||"")}i+=r.join("\t|\t"),i+="\t|\n"}return i}var R=n("466b"),$=n.n(R);function A(){for(var e=document.getElementById("output"),t=e.getElementsByTagName("img"),n=0;n=1&&i<=127?t+=e.charAt(n):i>2047?(t+=String.fromCharCode(224|i>>12&15),t+=String.fromCharCode(128|i>>6&63),t+=String.fromCharCode(128|i>>0&63)):(t+=String.fromCharCode(192|i>>6&31),t+=String.fromCharCode(128|i>>0&63));return t}var _e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);function Te(e){var t,n,o,i,r,a;o=e.length,n=0,t="";while(n>2),t+=_e.charAt((3&i)<<4),t+="==";break}if(r=e.charCodeAt(n++),n==o){t+=_e.charAt(i>>2),t+=_e.charAt((3&i)<<4|(240&r)>>4),t+=_e.charAt((15&r)<<2),t+="=";break}a=e.charCodeAt(n++),t+=_e.charAt(i>>2),t+=_e.charAt((3&i)<<4|(240&r)>>4),t+=_e.charAt((15&r)<<2|(192&a)>>6),t+=_e.charAt(63&a)}return t}function Ee(e){return e=e.replace(/\+/g,"-"),e=e.replace(/\//g,"_"),e}function Ie(e,t){var n="github"===t?me:pe;if(e){var o=n.username,i=n.repoList,r=n.branch,a=n.accessTokenList,s=Math.floor(Math.random()*a.length),c=Math.floor(Math.random()*i.length),l=a[s].replace("doocsmd",""),u=i[c];return{username:o,repo:u,branch:r,accessToken:l}}var d=JSON.parse(localStorage.getItem("".concat(t,"Config"))),f=d.repo.replace("https://".concat(t,".com/"),"").replace("http://".concat(t,".com/"),"").replace("".concat(t,".com/"),"").split("/");return{username:f[0],repo:f[1],branch:d.branch||"master",accessToken:d.accessToken}}function Re(){var e=new Date,t=e.getFullYear(),n=(e.getMonth()+1).toString().padStart(2,"0"),o=e.getDate().toString().padStart(2,"0");return"".concat(t,"/").concat(n,"/").concat(o)}function $e(e){var t=(new Date).getTime(),n=e.split(".")[1];return"".concat(t,"-").concat(Object(xe["a"])(),".").concat(n)}function Ae(e,t){return Me.apply(this,arguments)}function Me(){return Me=Object(f["a"])(regeneratorRuntime.mark((function e(t,n){var o,i,r,a,s,c,l,u,d,f,m,p;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return o="default"===localStorage.getItem("imgHost"),i=Ie(o,"github"),r=i.username,a=i.repo,s=i.branch,c=i.accessToken,l=Re(),u="https://api.github.com/repos/".concat(r,"/").concat(a,"/contents/").concat(l,"/"),d=$e(n),e.next=7,fe({url:u+d,method:"put",headers:{Authorization:"token ".concat(c)},data:{content:t,branch:s,message:"Upload by ".concat(window.location.href)}});case 7:return f=e.sent,m="raw.githubusercontent.com/".concat(r,"/").concat(a,"/").concat(s,"/"),p="cdn.jsdelivr.net/gh/".concat(r,"/").concat(a,"@").concat(s,"/"),e.abrupt("return",o?f.content.download_url.replace(m,p):f.content.download_url);case 11:case"end":return e.stop()}}),e)}))),Me.apply(this,arguments)}function Ge(e,t){return je.apply(this,arguments)}function je(){return je=Object(f["a"])(regeneratorRuntime.mark((function e(t,n){var o,i,r,a,s,c,l,u,d,f;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return o="default"===localStorage.getItem("imgHost"),i=Ie(o,"gitee"),r=i.username,a=i.repo,s=i.branch,c=i.accessToken,l=Re(),u=$e(n),d="https://gitee.com/api/v5/repos/".concat(r,"/").concat(a,"/contents/").concat(l,"/").concat(u),e.next=7,fe({url:d,method:"POST",data:{content:t,branch:s,access_token:c,message:"Upload by ".concat(window.location.href)}});case 7:return f=e.sent,e.abrupt("return",encodeURI(f.content.download_url));case 9:case"end":return e.stop()}}),e)}))),je.apply(this,arguments)}function ze(e,t,n){var o=JSON.stringify(n),i=Te(Oe(o)),r=he.a.HmacSHA1(i,t),a=r.toString(he.a.enc.Base64);return"".concat(e,":").concat(Ee(a),":").concat(i)}function He(e){return Fe.apply(this,arguments)}function Fe(){return Fe=Object(f["a"])(regeneratorRuntime.mark((function e(t){var n,o,i,r,a,s,c,l,u,d,f;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return n=JSON.parse(localStorage.getItem("qiniuConfig")),o=n.accessKey,i=n.secretKey,r=n.bucket,a=n.region,s=n.path,c=n.domain,l=ze(o,i,{scope:r,deadline:Math.trunc((new Date).getTime()/1e3)+3600}),u=s?"".concat(s,"/"):"",d=u+$e(t.name),f=we["a"](t,d,l,{},{region:a}),e.abrupt("return",new Promise((function(e,t){f.subscribe({next:function(e){console.log(e)},error:function(e){t(e.message)},complete:function(t){e("".concat(c,"/").concat(t.key))}})})));case 6:case"end":return e.stop()}}),e)}))),Fe.apply(this,arguments)}function qe(e,t){return Ne.apply(this,arguments)}function Ne(){return Ne=Object(f["a"])(regeneratorRuntime.mark((function e(t,n){var o,i,r,a,s,c,l,u,d,f,m,p;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return o=$e(n),i=JSON.parse(localStorage.getItem("aliOSSConfig")),r=i.region,a=i.bucket,s=i.accessKeyId,c=i.accessKeySecret,l=i.cdnHost,u=i.path,d=ye()(t,"base64"),f="".concat(u,"/").concat(o),m=new ve.a({region:r,bucket:a,accessKeyId:s,accessKeySecret:c}),e.prev=5,e.next=8,m.put(f,d);case 8:if(p=e.sent,""!=l){e.next=11;break}return e.abrupt("return",p.url);case 11:return e.abrupt("return","".concat(l,"/").concat(""==u?o:f));case 14:return e.prev=14,e.t0=e["catch"](5),e.abrupt("return",Promise.reject(e.t0));case 17:case"end":return e.stop()}}),e,null,[[5,14]])}))),Ne.apply(this,arguments)}function De(e){return Ke.apply(this,arguments)}function Ke(){return Ke=Object(f["a"])(regeneratorRuntime.mark((function e(t){var n,o,i,r,a,s,c,l,u;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return n=$e(t.name),o=JSON.parse(localStorage.getItem("txCOSConfig")),i=o.secretId,r=o.secretKey,a=o.bucket,s=o.region,c=o.path,l=o.cdnHost,u=new Se.a({SecretId:i,SecretKey:r}),e.abrupt("return",new Promise((function(e,o){u.putObject({Bucket:a,Region:s,Key:"".concat(c,"/").concat(n),Body:t},(function(t,i){t?o(t):e(l?""==c?"".concat(l,"/").concat(n):"".concat(l,"/").concat(c,"/").concat(n):"https://".concat(i.Location))}))})));case 4:case"end":return e.stop()}}),e)}))),Ke.apply(this,arguments)}function Ve(e,t){var n=localStorage.getItem("imgHost");switch(!n&&localStorage.setItem("imgHost","default"),n){case"aliOSS":return qe(e,t.name);case"txCOS":return De(t);case"qiniu":return He(t);case"gitee":return Ge(e,t.name);case"github":return Ae(e,t.name);default:return Ae(e,t.name)}}var Pe={fileUpload:Ve};function Be(e){return new Promise((function(t,n){var o=Le(e);if(o)n(o);else{var i=new FileReader;i.readAsDataURL(e),i.onload=function(){var o=this.result.split(",").pop();Pe.fileUpload(o,e).then((function(e){t(e)})).catch((function(e){n(e)}))}}}))}function Le(e){return/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(e.name)?e.size>5242880&&"由于公众号限制,图片大小不能超过 5.0M":"请上传 JPG/PNG/GIF 格式的图片"}var Qe={props:{value:{type:Boolean,default:!1},top:{type:Number,default:0},left:{type:Number,default:0}},data:function(){return{menu:[[{text:"上传图片",key:"insertPic"},{text:"插入表格",key:"insertTable"},{text:"页面重置",key:"pageReset"}],[{text:"下载 Markdown 文档",key:"download"},{text:"格式化 Markdown 文档",key:"formatMarkdown"}]]}},methods:{closeCB:function(){this.$emit("input",!1)},onMouseDown:function(e){this.$emit("menuTick",e),this.$emit("closeMenu",!1)}}},Je=Qe,Ue=(n("16aa"),Object(K["a"])(Je,se,ce,!1,null,"449cad31",null)),We=Ue.exports,Ye=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-dialog",{staticClass:"upload__dialog",attrs:{title:"本地上传",visible:e.value},on:{close:function(t){return e.$emit("close")}}},[n("el-tabs",{attrs:{type:"activeName",value:"upload"}},[n("el-tab-pane",{staticClass:"upload-panel",attrs:{label:"选择上传",name:"upload"}},[n("el-select",{attrs:{placeholder:"请选择",size:"small"},on:{change:e.changeImgHost},model:{value:e.imgHost,callback:function(t){e.imgHost=t},expression:"imgHost"}},e._l(e.options,(function(e){return n("el-option",{key:e.value,attrs:{label:e.label,value:e.value}})})),1),n("el-upload",{directives:[{name:"loading",rawName:"v-loading",value:e.uploadingImg,expression:"uploadingImg"}],attrs:{drag:"",action:"",headers:{"Content-Type":"multipart/form-data"},"show-file-list":!1,multiple:!0,accept:".jpg, .jpeg, .png, .gif",name:"file","before-upload":e.beforeUpload}},[n("i",{staticClass:"el-icon-upload"}),n("div",{staticClass:"el-upload__text"},[e._v(" 将图片拖到此处,或 "),n("em",[e._v("点击上传")])])])],1),n("el-tab-pane",{staticClass:"github-panel",attrs:{label:"Gitee 图床",name:"gitee"}},[n("el-form",{staticClass:"setting-form",attrs:{model:e.formGitee,"label-position":"right","label-width":"140px"}},[n("el-form-item",{attrs:{label:"Gitee 仓库",required:!0}},[n("el-input",{attrs:{placeholder:"如:gitee.com/yanglbme/resource"},model:{value:e.formGitee.repo,callback:function(t){e.$set(e.formGitee,"repo","string"===typeof t?t.trim():t)},expression:"formGitee.repo"}})],1),n("el-form-item",{attrs:{label:"分支"}},[n("el-input",{attrs:{placeholder:"如:release,可不填,默认 master"},model:{value:e.formGitee.branch,callback:function(t){e.$set(e.formGitee,"branch","string"===typeof t?t.trim():t)},expression:"formGitee.branch"}})],1),n("el-form-item",{attrs:{label:"私人令牌",required:!0}},[n("el-input",{attrs:{"show-password":"",placeholder:"如:cc1d0c1426d0fd0902bd2d7184b14da61b8abc46"},model:{value:e.formGitee.accessToken,callback:function(t){e.$set(e.formGitee,"accessToken","string"===typeof t?t.trim():t)},expression:"formGitee.accessToken"}}),n("el-link",{attrs:{type:"primary",href:"https://gitee.com/profile/personal_access_tokens",target:"_blank"}},[e._v("请在 Gitee「设置->安全设置->私人令牌」中生成")])],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:e.saveGiteeConfiguration}},[e._v("保存配置")])],1)],1)],1),n("el-tab-pane",{staticClass:"github-panel",attrs:{label:"GitHub 图床",name:"github"}},[n("el-form",{staticClass:"setting-form",attrs:{model:e.formGitHub,"label-position":"right","label-width":"140px"}},[n("el-form-item",{attrs:{label:"GitHub 仓库",required:!0}},[n("el-input",{attrs:{placeholder:"如:github.com/yanglbme/resource"},model:{value:e.formGitHub.repo,callback:function(t){e.$set(e.formGitHub,"repo","string"===typeof t?t.trim():t)},expression:"formGitHub.repo"}})],1),n("el-form-item",{attrs:{label:"分支"}},[n("el-input",{attrs:{placeholder:"如:release,可不填,默认 master"},model:{value:e.formGitHub.branch,callback:function(t){e.$set(e.formGitHub,"branch","string"===typeof t?t.trim():t)},expression:"formGitHub.branch"}})],1),n("el-form-item",{attrs:{label:"Token",required:!0}},[n("el-input",{attrs:{"show-password":"",placeholder:"如:cc1d0c1426d0fd0902bd2d7184b14da61b8abc46"},model:{value:e.formGitHub.accessToken,callback:function(t){e.$set(e.formGitHub,"accessToken","string"===typeof t?t.trim():t)},expression:"formGitHub.accessToken"}}),n("el-link",{attrs:{type:"primary",href:"https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token",target:"_blank"}},[e._v("如何获取 GitHub Token?")])],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:e.saveGitHubConfiguration}},[e._v("保存配置")])],1)],1)],1),n("el-tab-pane",{staticClass:"github-panel",attrs:{label:"阿里云 OSS",name:"aliOSS"}},[n("el-form",{staticClass:"setting-form",attrs:{model:e.formAliOSS,"label-position":"right","label-width":"140px"}},[n("el-form-item",{attrs:{label:"AccessKey ID",required:!0}},[n("el-input",{attrs:{placeholder:"如:LTAI4GdoocsmdoxUf13ylbaNHk"},model:{value:e.formAliOSS.accessKeyId,callback:function(t){e.$set(e.formAliOSS,"accessKeyId","string"===typeof t?t.trim():t)},expression:"formAliOSS.accessKeyId"}})],1),n("el-form-item",{attrs:{label:"AccessKey Secret",required:!0}},[n("el-input",{attrs:{"show-password":"",placeholder:"如:cc1d0c142doocs0902bd2d7md4b14da6ylbabc46"},model:{value:e.formAliOSS.accessKeySecret,callback:function(t){e.$set(e.formAliOSS,"accessKeySecret","string"===typeof t?t.trim():t)},expression:"formAliOSS.accessKeySecret"}})],1),n("el-form-item",{attrs:{label:"Bucket",required:!0}},[n("el-input",{attrs:{placeholder:"如:doocs"},model:{value:e.formAliOSS.bucket,callback:function(t){e.$set(e.formAliOSS,"bucket","string"===typeof t?t.trim():t)},expression:"formAliOSS.bucket"}})],1),n("el-form-item",{attrs:{label:"Bucket 所在区域",required:!0}},[n("el-input",{attrs:{placeholder:"如:oss-cn-shenzhen"},model:{value:e.formAliOSS.region,callback:function(t){e.$set(e.formAliOSS,"region","string"===typeof t?t.trim():t)},expression:"formAliOSS.region"}})],1),n("el-form-item",{attrs:{label:"自定义 CDN 域名",required:!1}},[n("el-input",{attrs:{placeholder:"如:https://imagecdn.alidaodao.com,可不填"},model:{value:e.formAliOSS.cdnHost,callback:function(t){e.$set(e.formAliOSS,"cdnHost","string"===typeof t?t.trim():t)},expression:"formAliOSS.cdnHost"}})],1),n("el-form-item",{attrs:{label:"存储路径"}},[n("el-input",{attrs:{placeholder:"如:img,可不填,默认为根目录"},model:{value:e.formAliOSS.path,callback:function(t){e.$set(e.formAliOSS,"path","string"===typeof t?t.trim():t)},expression:"formAliOSS.path"}}),n("el-link",{attrs:{type:"primary",href:"https://help.aliyun.com/document_detail/31883.html",target:"_blank"}},[e._v("如何使用阿里云 OSS?")])],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:e.saveAliOSSConfiguration}},[e._v("保存配置")])],1)],1)],1),n("el-tab-pane",{staticClass:"github-panel",attrs:{label:"腾讯云 COS",name:"txCOS"}},[n("el-form",{staticClass:"setting-form",attrs:{model:e.formTxCOS,"label-position":"right","label-width":"140px"}},[n("el-form-item",{attrs:{label:"SecretId",required:!0}},[n("el-input",{attrs:{placeholder:"如:AKIDnQp1w3DOOCSs8F5MDp9tdoocsmdUPonW3"},model:{value:e.formTxCOS.secretId,callback:function(t){e.$set(e.formTxCOS,"secretId","string"===typeof t?t.trim():t)},expression:"formTxCOS.secretId"}})],1),n("el-form-item",{attrs:{label:"SecretKey",required:!0}},[n("el-input",{attrs:{"show-password":"",placeholder:"如:ukLmdtEJ9271f3DOocsMDsCXdS3YlbW0"},model:{value:e.formTxCOS.secretKey,callback:function(t){e.$set(e.formTxCOS,"secretKey","string"===typeof t?t.trim():t)},expression:"formTxCOS.secretKey"}})],1),n("el-form-item",{attrs:{label:"Bucket",required:!0}},[n("el-input",{attrs:{placeholder:"如:doocs-3212520134"},model:{value:e.formTxCOS.bucket,callback:function(t){e.$set(e.formTxCOS,"bucket","string"===typeof t?t.trim():t)},expression:"formTxCOS.bucket"}})],1),n("el-form-item",{attrs:{label:"Bucket 所在区域",required:!0}},[n("el-input",{attrs:{placeholder:"如:ap-guangzhou"},model:{value:e.formTxCOS.region,callback:function(t){e.$set(e.formTxCOS,"region","string"===typeof t?t.trim():t)},expression:"formTxCOS.region"}})],1),n("el-form-item",{attrs:{label:"自定义 CDN 域名",required:!1}},[n("el-input",{attrs:{placeholder:"如:https://imagecdn.alidaodao.com,可不填"},model:{value:e.formTxCOS.cdnHost,callback:function(t){e.$set(e.formTxCOS,"cdnHost","string"===typeof t?t.trim():t)},expression:"formTxCOS.cdnHost"}})],1),n("el-form-item",{attrs:{label:"存储路径"}},[n("el-input",{attrs:{placeholder:"如:img,可不填,默认根目录"},model:{value:e.formTxCOS.path,callback:function(t){e.$set(e.formTxCOS,"path","string"===typeof t?t.trim():t)},expression:"formTxCOS.path"}}),n("el-link",{attrs:{type:"primary",href:"https://cloud.tencent.com/document/product/436/38484",target:"_blank"}},[e._v("如何使用腾讯云 COS?")])],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:e.saveTxCOSConfiguration}},[e._v("保存配置")])],1)],1)],1),n("el-tab-pane",{staticClass:"github-panel",attrs:{label:"七牛云 Kodo",name:"qiniu"}},[n("el-form",{staticClass:"setting-form",attrs:{model:e.formQiniu,"label-position":"right","label-width":"140px"}},[n("el-form-item",{attrs:{label:"AccessKey",required:!0}},[n("el-input",{attrs:{placeholder:"如:6DD3VaLJ_SQgOdoocsyTV_YWaDmdnL2n8EGx7kG"},model:{value:e.formQiniu.accessKey,callback:function(t){e.$set(e.formQiniu,"accessKey","string"===typeof t?t.trim():t)},expression:"formQiniu.accessKey"}})],1),n("el-form-item",{attrs:{label:"SecretKey",required:!0}},[n("el-input",{attrs:{"show-password":"",placeholder:"如:qgZa5qrvDOOcsmdKStD1oCjZ9nB7MDvJUs_34SIm"},model:{value:e.formQiniu.secretKey,callback:function(t){e.$set(e.formQiniu,"secretKey","string"===typeof t?t.trim():t)},expression:"formQiniu.secretKey"}})],1),n("el-form-item",{attrs:{label:"Bucket",required:!0}},[n("el-input",{attrs:{placeholder:"如:md"},model:{value:e.formQiniu.bucket,callback:function(t){e.$set(e.formQiniu,"bucket","string"===typeof t?t.trim():t)},expression:"formQiniu.bucket"}})],1),n("el-form-item",{attrs:{label:"Bucket 对应域名",required:!0}},[n("el-input",{attrs:{placeholder:"如:https://images.123ylb.cn"},model:{value:e.formQiniu.domain,callback:function(t){e.$set(e.formQiniu,"domain","string"===typeof t?t.trim():t)},expression:"formQiniu.domain"}})],1),n("el-form-item",{attrs:{label:"存储区域",required:!0}},[n("el-input",{attrs:{placeholder:"如:z2"},model:{value:e.formQiniu.region,callback:function(t){e.$set(e.formQiniu,"region","string"===typeof t?t.trim():t)},expression:"formQiniu.region"}})],1),n("el-form-item",{attrs:{label:"存储路径",required:!1}},[n("el-input",{attrs:{placeholder:"如:img,可不填,默认为根目录"},model:{value:e.formQiniu.path,callback:function(t){e.$set(e.formQiniu,"path","string"===typeof t?t.trim():t)},expression:"formQiniu.path"}}),n("el-link",{attrs:{type:"primary",href:"https://developer.qiniu.com/kodo",target:"_blank"}},[e._v("如何使用七牛云 Kodo?")])],1),n("el-form-item",[n("el-button",{attrs:{type:"primary"},on:{click:e.saveQiniuConfiguration}},[e._v("保存配置")])],1)],1)],1)],1)],1)},Ze=[],Xe={props:{value:{type:Boolean,default:!1}},data:function(){return{formGitHub:{repo:"",branch:"",accessToken:""},formGitee:{repo:"",branch:"",accessToken:""},formAliOSS:{accessKeyId:"",accessKeySecret:"",bucket:"",region:"",path:"",cdnHost:""},formTxCOS:{secretId:"",secretKey:"",bucket:"",region:"",path:"",cdnHost:""},formQiniu:{accessKey:"",secretKey:"",bucket:"",domain:"",region:""},options:[{value:"default",label:"默认"},{value:"gitee",label:"Gitee"},{value:"github",label:"GitHub"},{value:"aliOSS",label:"阿里云"},{value:"txCOS",label:"腾讯云"},{value:"qiniu",label:"七牛云"}],imgHost:"default",uploadingImg:!1}},created:function(){localStorage.getItem("githubConfig")&&(this.formGitHub=JSON.parse(localStorage.getItem("githubConfig"))),localStorage.getItem("giteeConfig")&&(this.formGitee=JSON.parse(localStorage.getItem("giteeConfig"))),localStorage.getItem("aliOSSConfig")&&(this.formAliOSS=JSON.parse(localStorage.getItem("aliOSSConfig"))),localStorage.getItem("txCOSConfig")&&(this.formTxCOS=JSON.parse(localStorage.getItem("txCOSConfig"))),localStorage.getItem("imgHost")&&(this.imgHost=localStorage.getItem("imgHost"))},methods:{changeImgHost:function(){localStorage.setItem("imgHost",this.imgHost),this.$message({showClose:!0,message:"已成功切换图床",type:"success"})},saveGitHubConfiguration:function(){if(this.formGitHub.repo&&this.formGitHub.accessToken)localStorage.setItem("githubConfig",JSON.stringify(this.formGitHub)),this.$message({message:"保存成功",type:"success"});else{var e=this.formGitHub.repo?"token":"GitHub 仓库";this.$message({showClose:!0,message:"参数「".concat(e,"」不能为空"),type:"error"})}},saveGiteeConfiguration:function(){if(this.formGitee.repo&&this.formGitee.accessToken)localStorage.setItem("giteeConfig",JSON.stringify(this.formGitee)),this.$message({message:"保存成功",type:"success"});else{var e=this.formGitee.repo?"私人令牌":"Gitee 仓库";this.$message({showClose:!0,message:"参数「".concat(e,"」不能为空"),type:"error"})}},saveAliOSSConfiguration:function(){this.formAliOSS.accessKeyId&&this.formAliOSS.accessKeySecret&&this.formAliOSS.bucket&&this.formAliOSS.region?(localStorage.setItem("aliOSSConfig",JSON.stringify(this.formAliOSS)),this.$message({message:"保存成功",type:"success"})):this.$message({showClose:!0,message:"阿里云 OSS 参数配置不全",type:"error"})},saveTxCOSConfiguration:function(){this.formTxCOS.secretId&&this.formTxCOS.secretKey&&this.formTxCOS.bucket&&this.formTxCOS.region?(localStorage.setItem("txCOSConfig",JSON.stringify(this.formTxCOS)),this.$message({message:"保存成功",type:"success"})):this.$message({showClose:!0,message:"腾讯云 COS 参数配置不全",type:"error"})},saveQiniuConfiguration:function(){this.formQiniu.accessKey&&this.formQiniu.secretKey&&this.formQiniu.bucket&&this.formQiniu.domain&&this.formQiniu.region?(localStorage.setItem("qiniuConfig",JSON.stringify(this.formQiniu)),this.$message({message:"保存成功",type:"success"})):this.$message({showClose:!0,message:"七牛云 Kodo 参数配置不全",type:"error"})},beforeUpload:function(e){var t=this,n=localStorage.getItem("imgHost"),o=localStorage.getItem("".concat(n,"Config"));return o||""===n||"default"===n?(this.uploadingImg=!0,Be(e).then((function(e){t.$emit("uploaded",e),t.uploadingImg=!1})).catch((function(e){t.uploadingImg=!1,t.$message({showClose:!0,message:e,type:"error"})})),!1):(this.$message.error("请先配置 ".concat(n," 图床参数")),!1)}}},et=Xe,tt=(n("0fd0"),Object(K["a"])(et,Ye,Ze,!1,null,"fab4705a",null)),nt=tt.exports;n("f9d4");var ot={data:function(){return{showCssEditor:!1,aboutDialogVisible:!1,dialogUploadImgVisible:!1,dialogFormVisible:!1,isCoping:!1,isImgLoading:!1,backLight:!1,timeout:null,changeTimer:null,source:"",mouseLeft:0,mouseTop:0}},components:{editorHeader:J,aboutDialog:ee,insertFormDialog:ae,rightClickMenu:We,uploadImgDialog:nt},computed:Object(l["a"])({},Object(q["c"])({wxRenderer:function(e){return e.wxRenderer},output:function(e){return e.output},editor:function(e){return e.editor},cssEditor:function(e){return e.cssEditor},currentSize:function(e){return e.currentSize},currentColor:function(e){return e.currentColor},nightMode:function(e){return e.nightMode},rightClickMenuVisible:function(e){return e.rightClickMenuVisible}})),created:function(){var e=this;this.initEditorState(),this.$nextTick((function(){e.initEditor(),e.initCssEditor(),e.onEditorRefresh()}))},methods:Object(l["a"])({initEditor:function(){var e=this;this.initEditorEntity(),this.editor.on("change",(function(t,n){e.changeTimer&&clearTimeout(e.changeTimer),e.changeTimer=setTimeout((function(){e.onEditorRefresh(),O(e.editor,"__editor_content")}),300)})),this.editor.on("paste",(function(t,n){if(n.clipboardData&&n.clipboardData.items&&!e.isImgLoading)for(var o=0,i=n.clipboardData.items.length;o=65&&t.keyCode<=90||189===t.keyCode)&&e.showHint(t)})),this.cssEditor.on("update",(function(t){e.cssChanged(),O(e.cssEditor,"__css_content")}))},cssChanged:function(){var e=w(this.cssEditor.getValue(0)),t=y(this.currentSize.replace("px",""));t=x(e,this.currentColor,t),this.setWxRendererOptions({theme:t}),this.onEditorRefresh()},uploaded:function(e){if(e){this.dialogUploadImgVisible=!1;var t=this.editor.getCursor(),n=e,o="![](".concat(n,")");this.editor.replaceSelection("\n".concat(o,"\n"),t),this.$message({showClose:!0,message:"图片上传成功",type:"success"}),this.onEditorRefresh()}else this.$message({showClose:!0,message:"上传图片未知异常",type:"error"})},leftAndRightScroll:function(){var e=this,t=function(t){var i,r;clearTimeout(e.timeout),"preview"===t?(i=e.$refs.preview.$el,r=document.getElementsByClassName("CodeMirror-scroll")[0],e.editor.off("scroll",n),e.timeout=setTimeout((function(){e.editor.on("scroll",n)}),300)):"editor"===t&&(i=document.getElementsByClassName("CodeMirror-scroll")[0],r=e.$refs.preview.$el,r.removeEventListener("scroll",o,!1),e.timeout=setTimeout((function(){r.addEventListener("scroll",o,!1)}),300));var a=i.scrollTop/(i.scrollHeight-i.offsetHeight),s=a*(r.scrollHeight-r.offsetHeight);r.scrollTo(0,s)},n=function(){t("editor")},o=function(){t("preview")};this.$refs.preview.$el.addEventListener("scroll",o,!1),this.editor.on("scroll",n)},onEditorRefresh:function(){this.editorRefresh(),setTimeout((function(){return PR.prettyPrint()}),0)},endCopy:function(){var e=this;this.backLight=!1,setTimeout((function(){e.isCoping=!1}),800)},downloadEditorContent:function(){E(this.editor.getValue(0))},formatContent:function(){var e=_(this.editor.getValue(0));localStorage.setItem("__editor_content",e),this.editor.setValue(e)},openMenu:function(e){var t=105,n=this.$el.getBoundingClientRect().left,o=this.$el.offsetWidth,i=o-t,r=e.clientX-n;this.mouseLeft=Math.min(i,r),this.mouseTop=e.clientY+10,this.$store.commit("setRightClickMenuVisible",!0)},closeRightClickMenu:function(){this.$store.commit("setRightClickMenuVisible",!1)},onMenuEvent:function(e){switch(e){case"pageReset":this.$refs.header.showResetConfirm=!0;break;case"insertPic":this.dialogUploadImgVisible=!0;break;case"download":this.downloadEditorContent();break;case"insertTable":this.dialogFormVisible=!0;break;case"formatMarkdown":this.formatContent();break;default:break}}},Object(q["b"])(["initEditorState","initEditorEntity","setWxRendererOptions","editorRefresh","initCssEditorEntity"])),mounted:function(){var e=this;setTimeout((function(){e.leftAndRightScroll(),PR.prettyPrint()}),300)}},it=ot,rt=(n("7318"),n("85fe"),Object(K["a"])(it,s,c,!1,null,"47950998",null)),at=rt.exports,st={name:"App",components:{Loading:a["default"],CodemirrorEditor:at},data:function(){return{loading:!0}},mounted:function(){var e=this;setTimeout((function(){e.loading=!1}),100)}},ct=st,lt=(n("91eb"),Object(K["a"])(ct,i,r,!1,null,"f01d475a",null)),ut=lt.exports,dt=n("d4ec"),ft=n("0e54"),mt=n.n(ft),pt=function e(t){var n=this;Object(dt["a"])(this,e),this.opts=t;var o=!0,i=[],r=0,a=null,s="Menlo, Operator Mono, Consolas, Monaco, monospace",c=function(e,t){return Object.assign({},e,t)};this.buildTheme=function(e){var t={},o=c(e.BASE,{"font-family":n.opts.fonts,"font-size":n.opts.size}),i=c(o,{});for(var r in e.inline)if(e.inline.hasOwnProperty(r)){var a=e.inline[r];t[r]=c(o,a)}for(var l in e.block)if(e.block.hasOwnProperty(l)){var u=e.block[l];"code"===l&&(u["font-family"]=s),t[l]=c(i,u)}return t};var l=function(e,t){var n=[],o=a[e];if(!o)return"";for(var i in o)n.push(i+":"+o[i]);return'style="'.concat(n.join(";")+(t||""),'"')},u=function(e,t){return i.push([++r,e,t]),r};this.buildFootnotes=function(){var e=i.map((function(e){return e[1]===e[2]?'['.concat(e[0],"]
: ").concat(e[1],"
"):'['.concat(e[0],"]
").concat(e[1],": ").concat(e[2],"
")}));return"引用链接
").concat(e.join("\n"),"
")},this.buildAddition=function(){return"\n \n "},this.setOptions=function(e){n.opts=c(n.opts,e)},this.hasFootnotes=function(){return 0!==i.length},this.getRenderer=function(e){i=[],r=0,a=n.buildTheme(n.opts.theme);var t=new mt.a.Renderer;return t.heading=function(e,t){switch(t){case 1:return"").concat(e,"
");case 2:return"").concat(e,"
");case 3:return"").concat(e,"
");default:return"").concat(e,"
")}},t.paragraph=function(e){return-1!=e.indexOf("").concat(e,"")},t.blockquote=function(e){return e=e.replace(//g,"")),"
").concat(e,"
")},t.code=function(e,t){e=e.replace(//g,">");var n=e.split("\n").map((function(e){return''.concat(e||"
","
")})),o="github";return'\n \n \n ').concat(n.join(""),"\n
\n \n ")},t.codespan=function(e,t){return"").concat(e,"
")},t.listitem=function(e){return"<%s/>').concat(e,"")},t.list=function(e,t,n){e=e.replace(/<\/*p.*?>/g,"");var o=e.split("<%s/>");if(!t)return e=o.join("•"),"").concat(e,"
");e=o[0];for(var i=1;i").concat(e,"")},t.image=function(e,t,n){var i="";n&&(i="").concat(n,""));var r=l("figure"),a=l(o?"image":"image_org");return"")},t.link=function(t,n,o){if(0===t.indexOf("https://mp.weixin.qq.com"))return'").concat(o,"");if(t===o||!e)return o;var i=u(n||o,t);return"").concat(o,"[").concat(i,"]")},t.strong=function(e){return"").concat(e,"")},t.em=function(e){return''.concat(e,"")},t.table=function(e,t){return'").concat(e,"").concat(t,"
")},t.tablecell=function(e,t){return"").concat(e," | ")},t.hr=function(){return'
'},t}},gt=pt,ht=n("56b3"),bt=n.n(ht),vt='# 示例文章:Google 搜索的即时自动补全功能究竟是如何“工作”的?\n> Google 搜索**自动补全功能**的强大,相信不少朋友都能感受到,它帮助我们更快地“补全”我们所要输入的搜索关键字。那么,它怎么知道我们要输入什么内容?它又是如何工作的?在这篇文章里,我们一起来看看。\n\n## 使用自动补全\nGoogle 搜索的自动补全功能可以在 Google 搜索应用的大多数位置使用,包括 [Google](https://www.google.com/) 主页、适用于 IOS 和 Android 的 Google 应用,我们只需要在 Google 搜索框上开始键入关键字,就可以看到联想词了。\n\n![](https://gitee.com/yanglbme/resource/raw/master/doocs-md/juejin.gif)\n\n在上图示例中,我们可以看到,输入关键字 `juej`,Google 搜索会联想到“掘金”、“掘金小册”、“绝句”等等,好处就是,我们无须输入完整的关键字即可轻松完成针对这些 topics 的搜索。\n\n谷歌搜索的自动补全功能对于使用移动设备的用户来说特别有用,用户可以轻松在难以键入的小屏幕上完成搜索。当然,对于移动设备用户和台式机用户而言,这都节省了大量的时间。根据 Google 官方报告,自动补全功能可以减少大约 25% 的打字,累积起来,预计每天可以节省 200 多年的打字时间。是的,每天!\n\n> 注意,本文所提到的“**联想词**”与“**预测**”,是同一个意思。\n\n## 基于“预测”而非“建议”\nGoogle 官方将自动补全功能称之为“预测”,而不是“建议”,为什么呢?其实是有充分理由的。自动补全功能是为了**帮助用户完成他们打算进行的搜索**,而不是建议用户要执行什么搜索。\n\n那么,Google 是如何确定这些“预测”的?其实,Google 会根据趋势搜索 [trends](https://trends.google.com/trends/?geo=US) 给到我们这些“预测”。简单来说,哪个热门、哪个搜索频率高,就更可能推给我们。当然,这也与我们当前所处的位置以及我们的搜索历史相关。\n\n另外,这些“预测”也会随着我们键入的关键字的变更而更改。例如,当我们把键入的关键字从 `juej` 更改为 `juex` 时,与“掘金”相关的预测会“消失”,同时,与“觉醒”、“决心”相关联的词会出现。\n\n![](https://gitee.com/yanglbme/resource/raw/master/doocs-md/juex.gif)\n\n## 为什么看不到某些联想词?\n如果我们在输入某个关键字时看不到联想词,那么表明 Google 的算法可能检测到:\n\n- 这个关键字不是热门字词;\n- 搜索的字词太新了,我们可能需要等待几天或几周才能看到联想词;\n- 这是一个侮辱性或敏感字词,这个搜索字词违反了 Google 的相关政策。更加详细的情况,可以了解 [Google 搜索自动补全政策](https://support.google.com/websearch/answer/7368877)。\n\n## 为什么会看到某些不当的联想词?\nGoogle 拥有专门设计的系统,可以自动捕获不适当的预测结果而不显示出来。然而,Google 每天需要处理数十亿次搜索,这意味着 Google 每天会显示数十亿甚至上百亿条预测。再好的系统,也可能存在缺陷,不正确的预测也可能随时会出现。\n\n我们作为 Google 搜索的用户,如果认定某条预测违反了相关的搜索自动补全政策,可以进行举报反馈,点击右下角“**举报不当的联想查询**”并勾选相关选项即可。\n\n![](https://gitee.com/yanglbme/resource/raw/master/doocs-md/report.gif)\n\n## 如何实现自动补全算法?\n目前,Google 官方似乎并没有公开搜索自动补全的算法实现,但是业界在这方面已经有了不少研究。\n\n一个好的自动补全器必须是快速的,并且在用户键入下一个字符后立即更新联想词列表。**自动补全器的核心是一个函数,它接受输入的前缀,并搜索以给定前缀开头的词汇或语句列表**。通常来说,只需要返回少量的数目即可。\n\n接下来,我们先从一个简单且低效的实现开始,并在此基础上逐步构建更高效的方法。\n\n### 词汇表实现\n一个**简单粗暴的实现方式**是:顺序查找词汇表,依次检查每个词汇,看它是否以给定的前缀开头。\n\n但是,此方法需要将前缀与每个词汇进行匹配检查,若词汇量较少,这种方式可能勉强行得通。但是,如果词汇量规模较大,效率就太低了。\n\n一个**更好的实现方式是**:让词汇按字典顺序排序。借助二分搜索算法,可以快速搜索有序词汇表中的前缀。由于二分搜索的每一步都会将搜索的范围减半,因此,总的搜索时间与词汇表中单词数量的对数成正比,即时间复杂度是 `O(log N)`。二分搜索的性能很好,但有没有更好的实现呢?当然有,往下看。\n\n### 前缀树实现\n通常来说,许多词汇都以相同的前缀开头,比如 `need`、`nested` 都以 `ne` 开头,`seed`、`speed` 都以 `s` 开头。要是为每个单词分别存储公共前缀似乎很浪费。\n\n![](https://gitee.com/yanglbme/resource/raw/master/doocs-md/pretree.png)\n\n前缀树是一种利用公共前缀来加速补全速度的数据结构。前缀树在节点树中排列一组单词,单词沿着从根节点到叶子节点的路径存储,树的层次对应于前缀的字母位置。\n\n前缀的补全是顺着前缀定义的路径来查找的。例如,在上图的前缀树中,前缀 `ne` 对应于从子节点取左边缘 `N` 和唯一边缘 `E` 的路径。然后可以通过继续遍历从 `E` 节点可以达到的所有叶节点来生成补全列表。在图中,`ne` 的补全可以是两个分支:`-ed` 和 `-sted`。如果在数中找不到由前缀定义的路径,则说明词汇表中不包含以该前缀开头的单词。\n\n### 有限状态自动机(DFA)实现\n前缀树可以有效处理公共前缀,但是,对于其他共享词部分,仍会分别存储在每个分支中。比如,后缀 `ed`、`ing`、`tion` 在英文单词中特别常见。在上一个例子中,`e`、`d` 分别存放在了每一个分支上。\n\n有没有一种方法可以更加节省存储空间呢?有的,那就是 DFA。\n\n\n\n\n在上面的例子中,单词 `need`、`nested`、`seed` 和 `speed` 仅由 9 个节点组成,而上一张图中的前缀树包含了 17 个节点。\n\n可以看出,最小化前缀树 DFA 可以在很大程度上减少数据结构的大小。即使词汇量很大,最小化 DFA 通常也适合在内存中存储,避免昂贵的磁盘访问是实现快速自动补全的关键。\n\n### 一些扩展\n上面介绍了如何利用合理的数据结构实现基本的自动补全功能。这些数据结构可以通过多种方式进行扩展,从而改善用户体验。\n\n通常,满足特定前缀的词汇可能很多,而用户界面上能够显示的却不多,我们更希望能显示最常搜索或者最有价值的词汇。这通常可以通过为词汇表中的每个单词增加一个代表单词值的**权重** `weight`,并且按照权重高低来排序自动补全列表。\n\n- 对于排序后的词汇表来说,在词汇表每个元素上增加 `weight` 属性并不难;\n- 对于前缀树来说,将 `weight` 存储在叶子节点中,也是很简单的一个实现;\n- 对于 `DFA` 来说,则较为复杂。因为一个叶子节点可以通过多条路径到达。一种解决方案是将权重关联到路径而不是叶子节点。\n\n目前有不少开源库都提供了这个功能,比如主流的搜索引擎框架 [Elasticsearch](https://www.elastic.co/products/elasticsearch)、[Solr](https://lucene.apache.org/solr/) 等,基于此,我们可以实现高效而强大的自动补全功能。\n\n#### 推荐阅读\n- [阿里又一个 20k+ stars 开源项目诞生,恭喜 fastjson!](https://mp.weixin.qq.com/s/RNKDCK2KoyeuMeEs6GUrow)\n- [刷掉 90% 候选人的互联网大厂海量数据面试题(附题解 + 方法总结)](https://mp.weixin.qq.com/s/rjGqxUvrEqJNlo09GrT1Dw)\n- [好用!期待已久的文本块功能究竟如何在 Java 13 中发挥作用?](https://mp.weixin.qq.com/s/kalGv5T8AZGxTnLHr2wDsA)\n- [2019 GitHub 开源贡献排行榜新鲜出炉!微软谷歌领头,阿里跻身前 12!](https://mp.weixin.qq.com/s/_q812aGD1b9QvZ2WFI0Qgw)\n\n---\n\n欢迎关注我的公众号“**Doocs开源社区**”,原创技术文章第一时间推送。\n\n\n \n\n\n',Ct=vt;o["default"].use(q["a"]);var St={wxRenderer:null,output:"",html:"",editor:null,cssEditor:null,currentFont:"",currentSize:"",currentColor:"",citeStatus:0,nightMode:!1,codeTheme:"github",rightClickMenuVisible:!1},kt={setEditorValue:function(e,t){e.editor.setValue(t)},setCssEditorValue:function(e,t){e.cssEditor.setValue(t)},setWxRendererOptions:function(e,t){e.wxRenderer.setOptions(t)},setCiteStatus:function(e,t){e.citeStatus=t,localStorage.setItem("citeStatus",t)},setCurrentFont:function(e,t){e.currentFont=t,localStorage.setItem("fonts",t)},setCurrentSize:function(e,t){e.currentSize=t,localStorage.setItem("size",t)},setCurrentColor:function(e,t){e.currentColor=t,localStorage.setItem("color",t)},setCurrentCodeTheme:function(e,t){e.codeTheme=t,localStorage.setItem("codeTheme",t)},setRightClickMenuVisible:function(e,t){e.rightClickMenuVisible=t},themeChanged:function(e){e.nightMode=!e.nightMode,localStorage.setItem("nightMode",e.nightMode)},initEditorState:function(e){e.currentFont=localStorage.getItem("fonts")||G.builtinFonts[0].value,e.currentColor=localStorage.getItem("color")||G.colorOption[0].value,e.currentSize=localStorage.getItem("size")||G.sizeOption[2].value,e.codeTheme=localStorage.getItem("codeTheme")||G.codeThemeOption[0].value,e.citeStatus="true"===localStorage.getItem("citeStatus"),e.nightMode="true"===localStorage.getItem("nightMode"),e.wxRenderer=new gt({theme:k(e.currentColor),fonts:e.currentFont,size:e.currentSize,status:e.citeStatus})},initEditorEntity:function(e){e.editor=bt.a.fromTextArea(document.getElementById("editor"),{value:"",mode:"text/x-markdown",theme:"xq-light",lineNumbers:!1,lineWrapping:!0,styleActiveLine:!0,autoCloseBrackets:!0,extraKeys:{"Ctrl-F":function(e){var t=_(e.getValue(0));localStorage.setItem("__editor_content",t),e.setValue(t)},"Ctrl-S":function(e){}}}),e.editor.setValue(localStorage.getItem("__editor_content")||_(Ct))},initCssEditorEntity:function(e){e.cssEditor=bt.a.fromTextArea(document.getElementById("cssEditor"),{value:"",mode:"css",theme:"style-mirror",lineNumbers:!1,lineWrapping:!0,matchBrackets:!0,autofocus:!0,extraKeys:{"Ctrl-F":function(e){var t=e.lineCount();e.autoFormatRange({line:0,ch:0},{line:t})},"Ctrl-S":function(e){}}}),e.cssEditor.setValue(localStorage.getItem("__css_content")||z)},editorRefresh:function(e){var t=mt()(e.editor.getValue(0),{renderer:e.wxRenderer.getRenderer(e.citeStatus)});t=t.replace(/(style=".*?)"/,'$1;margin-top: 0"'),e.citeStatus&&(t+=e.wxRenderer.buildFootnotes(),t+=e.wxRenderer.buildAddition()),e.output=t},clearEditorToDefault:function(e){var t=_(Ct);e.editor.setValue(t),e.cssEditor.setValue(z)}},yt=new q["a"].Store({state:St,mutations:kt,actions:{}}),xt=n("5c96"),wt=n.n(xt);n("0fae");o["default"].use(xt["Container"]),o["default"].use(xt["Header"]),o["default"].use(xt["Upload"]),o["default"].use(xt["Tooltip"]),o["default"].use(xt["Form"]),o["default"].use(xt["FormItem"]),o["default"].use(xt["Select"]),o["default"].use(xt["Option"]),o["default"].use(xt["ColorPicker"]),o["default"].use(xt["Switch"]),o["default"].use(xt["Button"]),o["default"].use(xt["Main"]),o["default"].use(xt["Col"]),o["default"].use(xt["Row"]),o["default"].use(xt["Dialog"]),o["default"].use(xt["Loading"]),o["default"].component(xt["Message"].name,xt["Message"]),o["default"].prototype.$loading=xt["Loading"].service,o["default"].prototype.$message=xt["Message"];n("a7be"),n("0f7c"),n("8d7e"),n("7b00"),n("959b"),n("8c33"),n("31c5"),n("9b74"),n("111b6"),n("90ba"),n("baa5");(function(){bt.a.extendMode("css",{commentStart:"/*",commentEnd:"*/",newlineAfterToken:function(e,t){return/^[;{}]$/.test(t)}}),bt.a.defineExtension("commentRange",(function(e,t,n){var o=this,i=bt.a.innerMode(o.getMode(),o.getTokenAt(t).state).mode;o.operation((function(){if(e)o.replaceRange(i.commentEnd,n),o.replaceRange(i.commentStart,t),t.line==n.line&&t.ch==n.ch&&o.setCursor(t.line,t.ch+i.commentStart.length);else{var r=o.getRange(t,n),a=r.indexOf(i.commentStart),s=r.lastIndexOf(i.commentEnd);a>-1&&s>-1&&s>a&&(r=r.substr(0,a)+r.substring(a+i.commentStart.length,s)+r.substr(s+i.commentEnd.length)),o.replaceRange(r,t,n)}}))})),bt.a.defineExtension("autoIndentRange",(function(e,t){var n=this;this.operation((function(){for(var o=e.line;o<=t.line;o++)n.indentLine(o,"smart")}))})),bt.a.defineExtension("autoFormatRange",(function(e,t){var n=this,o=n.getMode(),i=n.getRange(e,t).split("\n"),r=bt.a.copyState(o,n.getTokenAt(e).state),a=n.getOption("tabSize"),s="",c=0,l=0==e.ch;function u(){s+="\n",l=!0,++c}for(var d=0;d",triples:"",explode:"[]{}"},n=e.Pos;function o(e,n){return"pairs"==n&&"string"==typeof e?e:"object"==Object(Ot["a"])(e)&&null!=e[n]?e[n]:t[n]}e.defineOption("autoCloseBrackets",!1,(function(t,n,a){a&&a!=e.Init&&(t.removeKeyMap(i),t.state.closeBrackets=null),n&&(r(o(n,"pairs")),t.state.closeBrackets=n,t.addKeyMap(i))}));var i={Backspace:c,Enter:l};function r(e){for(var t=0;t=0;c--){var u=a[c].head;t.replaceRange("",n(u.line,u.ch-1),n(u.line,u.ch+1),"+delete")}}function l(t){var n=s(t),i=n&&o(n,"explode");if(!i||t.getOption("disableInput"))return e.Pass;for(var r=t.listSelections(),a=0;a0;return{anchor:new n(t.anchor.line,t.anchor.ch+(o?-1:1)),head:new n(t.head.line,t.head.ch+(o?1:-1))}}function d(t,i){var r=s(t);if(!r||t.getOption("disableInput"))return e.Pass;var a=o(r,"pairs"),c=a.indexOf(i);if(-1==c)return e.Pass;for(var l,d=o(r,"closeBefore"),f=o(r,"triples"),p=a.charAt(c+1)==i,g=t.listSelections(),h=c%2==0,b=0;b1&&f.indexOf(i)>=0&&t.getRange(n(S.line,S.ch-2),S)==i+i){if(S.ch>2&&/\bstring/.test(t.getTokenTypeAt(n(S.line,S.ch-2))))return e.Pass;v="addFour"}else if(p){var y=0==S.ch?" ":t.getRange(n(S.line,S.ch-1),S);if(e.isWordChar(k)||y==i||e.isWordChar(y))return e.Pass;v="both"}else{if(!h||!(0===k.length||/\s/.test(k)||d.indexOf(k)>-1))return e.Pass;v="both"}else v=p&&m(t,S)?"both":f.indexOf(i)>=0&&t.getRange(S,n(S.line,S.ch+3))==i+i+i?"skipThree":"skip";if(l){if(l!=v)return e.Pass}else l=v}var x=c%2?a.charAt(c-1):i,w=c%2?i:a.charAt(c+1);t.operation((function(){if("skip"==l)t.execCommand("goCharRight");else if("skipThree"==l)for(var e=0;e<3;e++)t.execCommand("goCharRight");else if("surround"==l){var n=t.getSelections();for(e=0;e 0 &&\n css.indexOf(\"{\") !== -1 &&\n css.indexOf(\"}\") !== -1\n ) {\n // 存储第一个左/右花括号的下标\n const lbracket = css.indexOf(\"{\");\n const rbracket = css.indexOf(\"}\");\n\n // 第一步:将声明转换为Object,如:\n // `font: 'Times New Roman' 1em; color: #ff0000; margin-top: 1em;`\n // ==>\n // `{\"font\": \"'Times New Roman' 1em\", \"color\": \"#ff0000\", \"margin-top\": \"1em\"}`\n\n // 辅助方法:将array转为object\n function toObject(array) {\n let ret = {};\n array.forEach((e) => {\n const index = e.indexOf(\":\");\n const property = e.substring(0, index).trim();\n const value = e.substring(index + 1).trim();\n ret[property] = value;\n });\n return ret;\n }\n\n // 切割声明块并移除空白符,然后放入数组中\n let declarations = css\n .substring(lbracket + 1, rbracket)\n .split(\";\")\n .map((e) => e.trim())\n .filter((e) => e.length > 0); // 移除所有\"\"空值\n\n // 转为Object对象\n declarations = toObject(declarations);\n\n // 第二步:选择器处理,每个选择器会与它对应的声明相关联,如:\n // `h1, p#bar {color: red}`\n // ==>\n // {\"h1\": {color: red}, \"p#bar\": {color: red}}\n\n let selectors = css\n .substring(0, lbracket)\n // 以,切割,并移除空格:`\"h1, p#bar, span.foo\"` => [\"h1\", \"p#bar\", \"span.foo\"]\n .split(\",\")\n .map((selector) => selector.trim());\n\n // 迭代赋值\n selectors.forEach((selector) => {\n // 若不存在,则先初始化\n if (!json[selector]) json[selector] = {};\n // 赋值到JSON\n Object.keys(declarations).forEach((key) => {\n json[selector][key] = declarations[key];\n });\n });\n\n // 继续下个声明块\n css = css.slice(rbracket + 1).trim();\n }\n\n // 返回JSON形式的结果串\n return json;\n}\n\n/**\n * 将编辑器内容保存到 LocalStorage\n * @param {*} editor\n * @param {*} name\n */\nexport function saveEditorContent(editor, name) {\n const content = editor.getValue(0);\n if (content) {\n localStorage.setItem(name, content);\n } else {\n localStorage.removeItem(name);\n }\n}\n\n/**\n * 格式化文档\n * @param {文档内容} content\n */\nexport function formatDoc(content) {\n const doc = prettier.format(content, {\n parser: \"markdown\",\n plugins: [prettierMarkdown],\n });\n return doc;\n}\n\nexport function fixCodeWhiteSpace(value = \"pre\") {\n const preDomList = document.getElementsByClassName(\"code__pre\");\n if (preDomList.length > 0) {\n preDomList.forEach((pre) => {\n pre.style.whiteSpace = value;\n });\n }\n}\n\n/**\n * 下载原始 Markdown 文档\n * @param {文档内容} doc\n */\nexport function downloadMD(doc) {\n let downLink = document.createElement(\"a\");\n\n downLink.download = \"content.md\";\n downLink.style.display = \"none\";\n let blob = new Blob([doc]);\n\n downLink.href = URL.createObjectURL(blob);\n document.body.appendChild(downLink);\n downLink.click();\n document.body.removeChild(downLink);\n}\n\n/**\n * 生成列表字符串\n * @param {*} data 对应内容集合\n * @param {*} rows 行\n * @param {*} cols 列\n */\nexport function createTable({ data, rows, cols }) {\n let table = \"\";\n let currRow = [];\n for (let i = 0; i < rows + 2; ++i) {\n table += \"|\\t\";\n currRow = [];\n for (let j = 0; j < cols; ++j) {\n const rowIdx = i > 1 ? i - 1 : i;\n i === 1\n ? currRow.push(\"---\\t\")\n : currRow.push(data[`k_${rowIdx}_${j}`] || \"\");\n }\n table += currRow.join(\"\\t|\\t\");\n table += \"\\t|\\n\";\n }\n\n return table;\n}\n","import juice from \"juice\";\n\nexport function solveWeChatImage() {\n const clipboardDiv = document.getElementById(\"output\");\n const images = clipboardDiv.getElementsByTagName(\"img\");\n for (let i = 0; i < images.length; i++) {\n const image = images[i];\n const width = image.getAttribute(\"width\");\n const height = image.getAttribute(\"height\");\n image.removeAttribute(\"width\");\n image.removeAttribute(\"height\");\n image.style.width = width;\n image.style.height = height;\n }\n}\nexport function solveHtml() {\n const element = document.getElementById(\"output-wrapper\");\n let html = element.innerHTML;\n let res = \"\";\n res = juice.inlineContent(html, {\n inlinePseudoElements: true,\n preserveImportant: true,\n });\n return res;\n}\n","export default {\n builtinFonts: [\n {\n label: \"无衬线\",\n value:\n \"-apple-system-font,BlinkMacSystemFont, Helvetica Neue, PingFang SC, Hiragino Sans GB , Microsoft YaHei UI , Microsoft YaHei ,Arial,sans-serif\",\n },\n {\n label: \"衬线\",\n value:\n \"Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif\",\n },\n ],\n sizeOption: [\n {\n label: \"12px\",\n value: \"12px\",\n desc: \"更小\",\n },\n {\n label: \"13px\",\n value: \"13px\",\n desc: \"稍小\",\n },\n {\n label: \"14px\",\n value: \"14px\",\n desc: \"推荐\",\n },\n {\n label: \"15px\",\n value: \"15px\",\n desc: \"稍大\",\n },\n {\n label: \"16px\",\n value: \"16px\",\n desc: \"更大\",\n },\n ],\n colorOption: [\n {\n label: \"经典蓝\",\n value: \"rgba(15, 76, 129, 1)\",\n desc: \"最新流行\",\n },\n {\n label: \"翡翠绿\",\n value: \"rgba(0, 152, 116, 1)\",\n desc: \"优雅清新\",\n },\n {\n label: \"活力橘\",\n value: \"rgba(250, 81, 81, 1)\",\n desc: \"热情活泼\",\n },\n ],\n codeThemeOption: [\n {\n label: \"微信\",\n value: \"wechat\",\n desc: \"默认样式\",\n },\n {\n label: \"GitHub\",\n value: \"github\",\n desc: \"精简风格\",\n },\n ],\n form: {\n rows: 1,\n cols: 1,\n },\n};\n","const DEFAULT_CSS_CONTENT = `/*\n 按Ctrl+F可格式化\n*/\n/* 一级标题样式 */\nh1 {\n}\n/* 二级标题样式 */\nh2 {\n}\n/* 三级标题样式 */\nh3 {\n}\n/* 四级标题样式 */\nh4 {\n}\n/* 图片样式 */\nimage {\n}\n/* 引用样式 */\nblockquote {\n}\n/* 引用段落样式 */\nblockquote_p {\n}\n/* 段落样式 */\np {\n}\n/* 行内代码样式 */\ncodespan {\n}\n/* 粗体样式 */\nstrong {\n}\n/* 链接样式 */\nlink {\n}\n/* 微信链接样式 */\nwx_link {\n}\n`;\nexport default DEFAULT_CSS_CONTENT;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{staticClass:\"reset__dialog\",attrs:{\"title\":\"提示\",\"visible\":_vm.showResetConfirm},on:{\"close\":function($event){return _vm.$emit('close')}}},[_c('div',{staticClass:\"text\"},[_vm._v(\" 此操作将丢失本地缓存的文本和自定义样式,是否继续? \")]),_c('div',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{attrs:{\"type\":_vm.btnType,\"plain\":\"\"},on:{\"click\":function($event){return _vm.$emit('close')}}},[_vm._v(\"取 消\")]),_c('el-button',{attrs:{\"type\":_vm.btnType,\"plain\":\"\"},on:{\"click\":function($event){return _vm.$emit('confirm')}}},[_vm._v(\"确 定\")])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n 此操作将丢失本地缓存的文本和自定义样式,是否继续?\n
\n \n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./resetDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./resetDialog.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./resetDialog.vue?vue&type=template&id=e7287bec&scoped=true&\"\nimport script from \"./resetDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./resetDialog.vue?vue&type=script&lang=js&\"\nimport style0 from \"./resetDialog.vue?vue&type=style&index=0&id=e7287bec&lang=less&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e7287bec\",\n null\n \n)\n\nexport default component.exports","\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{ font.label }}\n Abc\n \n \n \n \n \n \n {{ size.label }}\n {{ size.desc }}\n \n \n \n \n \n \n {{ color.label }}\n {{ color.desc }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n 复制\n 关于\n \n \n \n \n \n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./header.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./header.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./header.vue?vue&type=template&id=6334a51f&scoped=true&\"\nimport script from \"./header.vue?vue&type=script&lang=js&\"\nexport * from \"./header.vue?vue&type=script&lang=js&\"\nimport style0 from \"./header.vue?vue&type=style&index=0&id=6334a51f&lang=less&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6334a51f\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{staticClass:\"about__dialog\",attrs:{\"title\":\"关于\",\"visible\":_vm.value,\"width\":\"30%\",\"center\":\"\"},on:{\"close\":function($event){return _vm.$emit('input', false)}}},[_c('div',{staticStyle:{\"text-align\":\"center\"}},[_c('h3',[_vm._v(\"一款高度简洁的微信 Markdown 编辑器\")])]),_c('div',{staticStyle:{\"text-align\":\"center\",\"margin-top\":\"10px\"}},[_c('p',[_vm._v(\"扫码关注我的公众号,原创技术文章第一时间推送!\")]),_c('img',{staticStyle:{\"width\":\"40%\",\"display\":\"block\",\"margin\":\"20px auto 10px\"},attrs:{\"src\":\"https://gitee.com/yanglbme/resource/raw/master/doocs-md/qrcode.png\"}})]),_c('span',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{attrs:{\"type\":\"primary\",\"plain\":\"\"},on:{\"click\":function($event){return _vm.onRedirect('https://github.com/doocs/md')}}},[_vm._v(\"GitHub 仓库\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"plain\":\"\"},on:{\"click\":function($event){return _vm.onRedirect('https://gitee.com/doocs/md')}}},[_vm._v(\"Gitee 仓库\")])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n
一款高度简洁的微信 Markdown 编辑器
\n \n \n
扫码关注我的公众号,原创技术文章第一时间推送!
\n
\n
\n \n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./aboutDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./aboutDialog.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./aboutDialog.vue?vue&type=template&id=224778f2&scoped=true&\"\nimport script from \"./aboutDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./aboutDialog.vue?vue&type=script&lang=js&\"\nimport style0 from \"./aboutDialog.vue?vue&type=style&index=0&id=224778f2&lang=less&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"224778f2\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{staticClass:\"insert__dialog\",attrs:{\"title\":\"插入表格\",\"visible\":_vm.value,\"border\":\"\"},on:{\"close\":function($event){return _vm.$emit('input', false)}}},[_c('el-row',{staticClass:\"tb-options\",attrs:{\"type\":\"flex\",\"align\":\"middle\",\"gutter\":10}},[_c('el-col',[_vm._v(\" 行数: \"),_c('el-input-number',{attrs:{\"controls-position\":\"right\",\"min\":1,\"max\":100,\"size\":\"small\"},model:{value:(_vm.rowNum),callback:function ($$v) {_vm.rowNum=$$v},expression:\"rowNum\"}})],1),_c('el-col',[_vm._v(\" 列数: \"),_c('el-input-number',{attrs:{\"controls-position\":\"right\",\"min\":1,\"max\":100,\"size\":\"small\"},model:{value:(_vm.colNum),callback:function ($$v) {_vm.colNum=$$v},expression:\"colNum\"}})],1)],1),_c('table',{staticClass:\"input-table\",staticStyle:{\"border-collapse\":\"collapse\"}},_vm._l((_vm.rowNum + 1),function(row){return _c('tr',{key:row,class:{ 'head-style': row === 1 }},_vm._l((_vm.colNum),function(col){return _c('td',{key:col},[_c('el-input',{attrs:{\"align\":\"center\",\"placeholder\":row === 1 ? '表头' : ''},model:{value:(_vm.tableData[(\"k_\" + (row - 1) + \"_\" + (col - 1))]),callback:function ($$v) {_vm.$set(_vm.tableData, (\"k_\" + (row - 1) + \"_\" + (col - 1)), $$v)},expression:\"tableData[`k_${row - 1}_${col - 1}`]\"}})],1)}),0)}),0),_c('div',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{attrs:{\"type\":_vm.btnType,\"plain\":\"\"},on:{\"click\":function($event){return _vm.$emit('input', false)}}},[_vm._v(\"取 消\")]),_c('el-button',{attrs:{\"type\":_vm.btnType,\"plain\":\"\"},on:{\"click\":_vm.insertTable}},[_vm._v(\"确 定\")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n \n 行数:\n \n \n \n 列数:\n \n \n \n \n \n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./insertForm.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./insertForm.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./insertForm.vue?vue&type=template&id=7de51ea0&scoped=true&\"\nimport script from \"./insertForm.vue?vue&type=script&lang=js&\"\nexport * from \"./insertForm.vue?vue&type=script&lang=js&\"\nimport style0 from \"./insertForm.vue?vue&type=style&index=0&id=7de51ea0&lang=less&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7de51ea0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.value),expression:\"value\"}],staticClass:\"menu\",style:((\"left: \" + _vm.left + \"px;top: \" + _vm.top + \"px;\")),attrs:{\"id\":\"menu\"}},_vm._l((_vm.menu),function(menuItem,index){return _c('div',{key:index,staticClass:\"menu__group\"},_vm._l((menuItem),function(item){return _c('li',{key:item.key,staticClass:\"menu_item\",on:{\"mousedown\":function($event){return _vm.onMouseDown(item.key)}}},[_c('span',[_vm._v(_vm._s(item.text))])])}),0)}),0)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import axios from \"axios\";\n\n// 创建axios实例\nconst service = axios.create({\n baseURL: \"\",\n timeout: 10 * 1000, // 请求超时时间\n});\n\nservice.interceptors.request.use(\n (config) => {\n if (/^(post)|(put)|(delete)$/i.test(config.method)) {\n if (config.data && config.data.upload) {\n config.headers[\"Content-Type\"] = \"multipart/form-data\";\n }\n }\n return config;\n },\n (error) => {\n Promise.reject(error);\n }\n);\n\nservice.interceptors.response.use(\n (res) => {\n return res.data ? res.data : Promise.reject(res);\n },\n (error) => Promise.reject(error)\n);\n\nexport default service;\n","const githubConfig = {\n username: \"filess\",\n repoList: Array.from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], (e) => `img${e}`),\n branch: \"main\",\n accessTokenList: [\n \"7715d7ca67b5d3837cfdoocsmde8c38421815aa423510af\",\n \"c411415bf95dbe39625doocsmd5047ba9b7a2a6c9642abe\",\n \"2821cd8819fa345c053doocsmdca86ac653f8bc20db1f1b\",\n \"445f0dae46ef1f2a4d6doocsmdc797301e94797b4750a4c\",\n \"cc1d0c1426d0fd0902bdoocsmdd2d7184b14da61b86ec46\",\n \"b67e9d15cb6f910492fdoocsmdac6b44d379c953bb19eff\",\n \"618c4dc2244ccbbc088doocsmd125d17fd31b7d06a50cf3\",\n \"a4b581732e1c1507458doocsmdc5b223b27dae5e2e16a55\",\n ],\n};\n\nconst giteeConfig = {\n username: \"filesss\",\n repoList: Array.from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], (e) => `img${e}`),\n branch: \"main\",\n accessTokenList: [\n \"ed5fc9866bd6c2fdoocsmddd433f806fd2f399c\",\n \"5448ffebbbf1151doocsmdc4e337cf814fc8a62\",\n \"25b05efd2557ca2doocsmd75b5c0835e3395911\",\n \"11628c7a5aef015doocsmd2eeff9fb9566f0458\",\n \"cb2f5145ed938dedoocsmdbd063b4ed244eecf8\",\n \"d8c0b57500672c1doocsmd55f48b866b5ebcd98\",\n \"78c56eadb88e453doocsmd43ddd95753351771a\",\n \"03e1a688003948fdoocsmda16fcf41e6f03f1f0\",\n ],\n};\n\nexport { githubConfig, giteeConfig };\n","export function utf16to8(str) {\n var out, i, len, c;\n out = \"\";\n len = str.length;\n for (i = 0; i < len; i++) {\n c = str.charCodeAt(i);\n if (c >= 0x0001 && c <= 0x007f) {\n out += str.charAt(i);\n } else if (c > 0x07ff) {\n out += String.fromCharCode(0xe0 | ((c >> 12) & 0x0f));\n out += String.fromCharCode(0x80 | ((c >> 6) & 0x3f));\n out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f));\n } else {\n out += String.fromCharCode(0xc0 | ((c >> 6) & 0x1f));\n out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f));\n }\n }\n return out;\n}\n\nexport function utf8to16(str) {\n var out, i, len, c;\n var char2, char3;\n out = \"\";\n len = str.length;\n i = 0;\n while (i < len) {\n c = str.charCodeAt(i++);\n switch (c >> 4) {\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n // 0xxxxxxx\n out += str.charAt(i - 1);\n break;\n case 12:\n case 13:\n // 110x xxxx 10xx xxxx\n char2 = str.charCodeAt(i++);\n out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f));\n break;\n case 14:\n // 1110 xxxx 10xx xxxx 10xx xxxx\n char2 = str.charCodeAt(i++);\n char3 = str.charCodeAt(i++);\n out += String.fromCharCode(\n ((c & 0x0f) << 12) |\n ((char2 & 0x3f) << 6) |\n ((char3 & 0x3f) << 0)\n );\n break;\n }\n }\n return out;\n}\n\nconst base64EncodeChars =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst base64DecodeChars = new Array(\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n 62,\n -1,\n -1,\n -1,\n 63,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57,\n 58,\n 59,\n 60,\n 61,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 14,\n 15,\n 16,\n 17,\n 18,\n 19,\n 20,\n 21,\n 22,\n 23,\n 24,\n 25,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n 26,\n 27,\n 28,\n 29,\n 30,\n 31,\n 32,\n 33,\n 34,\n 35,\n 36,\n 37,\n 38,\n 39,\n 40,\n 41,\n 42,\n 43,\n 44,\n 45,\n 46,\n 47,\n 48,\n 49,\n 50,\n 51,\n -1,\n -1,\n -1,\n -1,\n -1\n);\nexport function base64encode(str) {\n var out, i, len;\n var c1, c2, c3;\n len = str.length;\n i = 0;\n out = \"\";\n while (i < len) {\n c1 = str.charCodeAt(i++) & 0xff;\n if (i == len) {\n out += base64EncodeChars.charAt(c1 >> 2);\n out += base64EncodeChars.charAt((c1 & 0x3) << 4);\n out += \"==\";\n break;\n }\n c2 = str.charCodeAt(i++);\n if (i == len) {\n out += base64EncodeChars.charAt(c1 >> 2);\n out += base64EncodeChars.charAt(\n ((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4)\n );\n out += base64EncodeChars.charAt((c2 & 0xf) << 2);\n out += \"=\";\n break;\n }\n c3 = str.charCodeAt(i++);\n out += base64EncodeChars.charAt(c1 >> 2);\n out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4));\n out += base64EncodeChars.charAt(((c2 & 0xf) << 2) | ((c3 & 0xc0) >> 6));\n out += base64EncodeChars.charAt(c3 & 0x3f);\n }\n return out;\n}\n\nexport function base64decode(str) {\n var c1, c2, c3, c4;\n var i, len, out;\n len = str.length;\n i = 0;\n out = \"\";\n while (i < len) {\n /* c1 */\n do {\n c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];\n } while (i < len && c1 == -1);\n if (c1 == -1) break;\n /* c2 */\n do {\n c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];\n } while (i < len && c2 == -1);\n if (c2 == -1) break;\n out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));\n /* c3 */\n do {\n c3 = str.charCodeAt(i++) & 0xff;\n if (c3 == 61) return out;\n c3 = base64DecodeChars[c3];\n } while (i < len && c3 == -1);\n if (c3 == -1) break;\n out += String.fromCharCode(((c2 & 0xf) << 4) | ((c3 & 0x3c) >> 2));\n /* c4 */\n do {\n c4 = str.charCodeAt(i++) & 0xff;\n if (c4 == 61) return out;\n c4 = base64DecodeChars[c4];\n } while (i < len && c4 == -1);\n if (c4 == -1) break;\n out += String.fromCharCode(((c3 & 0x03) << 6) | c4);\n }\n return out;\n}\n\nexport function safe64(base64) {\n base64 = base64.replace(/\\+/g, \"-\");\n base64 = base64.replace(/\\//g, \"_\");\n return base64;\n}\n","import fetch from \"./fetch\";\nimport { githubConfig, giteeConfig } from \"./config\";\nimport CryptoJS from \"crypto-js\";\nimport OSS from \"ali-oss\";\nimport COS from \"cos-js-sdk-v5\";\nimport Buffer from \"buffer-from\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport * as qiniu from \"qiniu-js\";\nimport { utf16to8, base64encode, safe64 } from \"../assets/scripts/tokenTools\";\n\nfunction getConfig(useDefault, platform) {\n const config = platform === \"github\" ? githubConfig : giteeConfig;\n if (useDefault) {\n const { username, repoList, branch, accessTokenList } = config;\n const tokenIndex = Math.floor(Math.random() * accessTokenList.length);\n const repoIndex = Math.floor(Math.random() * repoList.length);\n const accessToken = accessTokenList[tokenIndex].replace(\"doocsmd\", \"\");\n const repo = repoList[repoIndex];\n return { username, repo, branch, accessToken };\n }\n const customConfig = JSON.parse(localStorage.getItem(`${platform}Config`));\n const repoUrl = customConfig.repo\n .replace(`https://${platform}.com/`, \"\")\n .replace(`http://${platform}.com/`, \"\")\n .replace(`${platform}.com/`, \"\")\n .split(\"/\");\n return {\n username: repoUrl[0],\n repo: repoUrl[1],\n branch: customConfig.branch || \"master\",\n accessToken: customConfig.accessToken,\n };\n}\n\nfunction getDir() {\n const date = new Date();\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n return `${year}/${month}/${day}`;\n}\n\nfunction getDateFilename(filename) {\n const currentTimestamp = new Date().getTime();\n const fileSuffix = filename.split(\".\")[1];\n return `${currentTimestamp}-${uuidv4()}.${fileSuffix}`;\n}\n\n//-----------------------------------------------------------------------\n// GitHub File Upload\n//-----------------------------------------------------------------------\n\nasync function ghFileUpload(content, filename) {\n const useDefault = localStorage.getItem(\"imgHost\") === \"default\";\n const { username, repo, branch, accessToken } = getConfig(\n useDefault,\n \"github\"\n );\n const dir = getDir();\n const url = `https://api.github.com/repos/${username}/${repo}/contents/${dir}/`;\n const dateFilename = getDateFilename(filename);\n const res = await fetch({\n url: url + dateFilename,\n method: \"put\",\n headers: {\n Authorization: `token ${accessToken}`,\n },\n data: {\n content,\n branch,\n message: `Upload by ${window.location.href}`,\n },\n });\n\n const githubResourceUrl = `raw.githubusercontent.com/${username}/${repo}/${branch}/`;\n const cdnResourceUrl = `cdn.jsdelivr.net/gh/${username}/${repo}@${branch}/`;\n return useDefault\n ? res.content.download_url.replace(githubResourceUrl, cdnResourceUrl)\n : res.content.download_url;\n}\n\n//-----------------------------------------------------------------------\n// Gitee File Upload\n//-----------------------------------------------------------------------\n\nasync function giteeUpload(content, filename) {\n const useDefault = localStorage.getItem(\"imgHost\") === \"default\";\n const { username, repo, branch, accessToken } = getConfig(\n useDefault,\n \"gitee\"\n );\n const dir = getDir();\n const dateFilename = getDateFilename(filename);\n const url = `https://gitee.com/api/v5/repos/${username}/${repo}/contents/${dir}/${dateFilename}`;\n const res = await fetch({\n url,\n method: \"POST\",\n data: {\n content,\n branch,\n access_token: accessToken,\n message: `Upload by ${window.location.href}`,\n },\n });\n return encodeURI(res.content.download_url);\n}\n\n//-----------------------------------------------------------------------\n// Qiniu File Upload\n//-----------------------------------------------------------------------\n\nfunction getQiniuToken(accessKey, secretKey, putPolicy) {\n const policy = JSON.stringify(putPolicy);\n const encoded = base64encode(utf16to8(policy));\n const hash = CryptoJS.HmacSHA1(encoded, secretKey);\n const encodedSigned = hash.toString(CryptoJS.enc.Base64);\n return `${accessKey}:${safe64(encodedSigned)}:${encoded}`;\n}\n\nasync function qiniuUpload(file) {\n const { accessKey, secretKey, bucket, region, path, domain } = JSON.parse(\n localStorage.getItem(\"qiniuConfig\")\n );\n const token = getQiniuToken(accessKey, secretKey, {\n scope: bucket,\n deadline: Math.trunc(new Date().getTime() / 1000) + 3600,\n });\n const dir = path ? `${path}/` : \"\";\n const dateFilename = dir + getDateFilename(file.name);\n const observable = qiniu.upload(file, dateFilename, token, {}, { region });\n return new Promise((resolve, reject) => {\n observable.subscribe({\n next: (result) => {\n console.log(result);\n },\n error: (err) => {\n reject(err.message);\n },\n complete: (result) => {\n resolve(`${domain}/${result.key}`);\n },\n });\n });\n}\n\n//-----------------------------------------------------------------------\n// AliOSS File Upload\n//-----------------------------------------------------------------------\n\nasync function aliOSSFileUpload(content, filename) {\n const dateFilename = getDateFilename(filename);\n const {\n region,\n bucket,\n accessKeyId,\n accessKeySecret,\n cdnHost,\n path,\n } = JSON.parse(localStorage.getItem(\"aliOSSConfig\"));\n const buffer = Buffer(content, \"base64\");\n const dir = `${path}/${dateFilename}`;\n const client = new OSS({\n region,\n bucket,\n accessKeyId,\n accessKeySecret,\n });\n try {\n const res = await client.put(dir, buffer);\n if (cdnHost == \"\") return res.url;\n return `${cdnHost}/${path == \"\" ? dateFilename : dir}`;\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\n//-----------------------------------------------------------------------\n// TxCOS File Upload\n//-----------------------------------------------------------------------\n\nasync function txCOSFileUpload(file) {\n const dateFilename = getDateFilename(file.name);\n const { secretId, secretKey, bucket, region, path, cdnHost } = JSON.parse(\n localStorage.getItem(\"txCOSConfig\")\n );\n const cos = new COS({\n SecretId: secretId,\n SecretKey: secretKey,\n });\n return new Promise((resolve, reject) => {\n cos.putObject(\n {\n Bucket: bucket,\n Region: region,\n Key: `${path}/${dateFilename}`,\n Body: file,\n },\n function (err, data) {\n if (err) {\n reject(err);\n } else if (cdnHost) {\n resolve(\n path == \"\"\n ? `${cdnHost}/${dateFilename}`\n : `${cdnHost}/${path}/${dateFilename}`\n );\n } else {\n resolve(`https://${data.Location}`);\n }\n }\n );\n });\n}\n\nfunction fileUpload(content, file) {\n const imgHost = localStorage.getItem(\"imgHost\");\n !imgHost && localStorage.setItem(\"imgHost\", \"default\");\n switch (imgHost) {\n case \"aliOSS\":\n return aliOSSFileUpload(content, file.name);\n case \"txCOS\":\n return txCOSFileUpload(file);\n case \"qiniu\":\n return qiniuUpload(file);\n case \"gitee\":\n return giteeUpload(content, file.name);\n case \"github\":\n return ghFileUpload(content, file.name);\n default:\n // return file.size / 1024 < 1024\n // ? giteeUpload(content, file.name)\n // : ghFileUpload(content, file.name);\n return ghFileUpload(content, file.name);\n }\n}\n\nexport default {\n fileUpload,\n};\n","import fileApi from \"../../api/file\";\n\nexport function uploadImgFile(file) {\n return new Promise((resolve, reject) => {\n const checkImageResult = isImageIllegal(file);\n\n if (checkImageResult) {\n reject(checkImageResult);\n return;\n }\n const base64Reader = new FileReader();\n\n base64Reader.readAsDataURL(file);\n base64Reader.onload = function () {\n const base64Content = this.result.split(\",\").pop();\n fileApi\n .fileUpload(base64Content, file)\n .then((res) => {\n resolve(res);\n })\n .catch((err) => {\n reject(err);\n });\n };\n });\n}\n\nexport function isImageIllegal(file) {\n if (!/\\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(file.name)) {\n return \"请上传 JPG/PNG/GIF 格式的图片\";\n }\n if (file.size > 5 * 1024 * 1024) {\n return \"由于公众号限制,图片大小不能超过 5.0M\";\n }\n return false;\n}\n","\n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./rightClickMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./rightClickMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./rightClickMenu.vue?vue&type=template&id=449cad31&scoped=true&\"\nimport script from \"./rightClickMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./rightClickMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./rightClickMenu.vue?vue&type=style&index=0&id=449cad31&lang=less&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"449cad31\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{staticClass:\"upload__dialog\",attrs:{\"title\":\"本地上传\",\"visible\":_vm.value},on:{\"close\":function($event){return _vm.$emit('close')}}},[_c('el-tabs',{attrs:{\"type\":\"activeName\",\"value\":'upload'}},[_c('el-tab-pane',{staticClass:\"upload-panel\",attrs:{\"label\":\"选择上传\",\"name\":\"upload\"}},[_c('el-select',{attrs:{\"placeholder\":\"请选择\",\"size\":\"small\"},on:{\"change\":_vm.changeImgHost},model:{value:(_vm.imgHost),callback:function ($$v) {_vm.imgHost=$$v},expression:\"imgHost\"}},_vm._l((_vm.options),function(item){return _c('el-option',{key:item.value,attrs:{\"label\":item.label,\"value\":item.value}})}),1),_c('el-upload',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.uploadingImg),expression:\"uploadingImg\"}],attrs:{\"drag\":\"\",\"action\":\"\",\"headers\":{ 'Content-Type': 'multipart/form-data' },\"show-file-list\":false,\"multiple\":true,\"accept\":\".jpg, .jpeg, .png, .gif\",\"name\":\"file\",\"before-upload\":_vm.beforeUpload}},[_c('i',{staticClass:\"el-icon-upload\"}),_c('div',{staticClass:\"el-upload__text\"},[_vm._v(\" 将图片拖到此处,或 \"),_c('em',[_vm._v(\"点击上传\")])])])],1),_c('el-tab-pane',{staticClass:\"github-panel\",attrs:{\"label\":\"Gitee 图床\",\"name\":\"gitee\"}},[_c('el-form',{staticClass:\"setting-form\",attrs:{\"model\":_vm.formGitee,\"label-position\":\"right\",\"label-width\":\"140px\"}},[_c('el-form-item',{attrs:{\"label\":\"Gitee 仓库\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:gitee.com/yanglbme/resource\"},model:{value:(_vm.formGitee.repo),callback:function ($$v) {_vm.$set(_vm.formGitee, \"repo\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formGitee.repo\"}})],1),_c('el-form-item',{attrs:{\"label\":\"分支\"}},[_c('el-input',{attrs:{\"placeholder\":\"如:release,可不填,默认 master\"},model:{value:(_vm.formGitee.branch),callback:function ($$v) {_vm.$set(_vm.formGitee, \"branch\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formGitee.branch\"}})],1),_c('el-form-item',{attrs:{\"label\":\"私人令牌\",\"required\":true}},[_c('el-input',{attrs:{\"show-password\":\"\",\"placeholder\":\"如:cc1d0c1426d0fd0902bd2d7184b14da61b8abc46\"},model:{value:(_vm.formGitee.accessToken),callback:function ($$v) {_vm.$set(_vm.formGitee, \"accessToken\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formGitee.accessToken\"}}),_c('el-link',{attrs:{\"type\":\"primary\",\"href\":\"https://gitee.com/profile/personal_access_tokens\",\"target\":\"_blank\"}},[_vm._v(\"请在 Gitee「设置->安全设置->私人令牌」中生成\")])],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.saveGiteeConfiguration}},[_vm._v(\"保存配置\")])],1)],1)],1),_c('el-tab-pane',{staticClass:\"github-panel\",attrs:{\"label\":\"GitHub 图床\",\"name\":\"github\"}},[_c('el-form',{staticClass:\"setting-form\",attrs:{\"model\":_vm.formGitHub,\"label-position\":\"right\",\"label-width\":\"140px\"}},[_c('el-form-item',{attrs:{\"label\":\"GitHub 仓库\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:github.com/yanglbme/resource\"},model:{value:(_vm.formGitHub.repo),callback:function ($$v) {_vm.$set(_vm.formGitHub, \"repo\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formGitHub.repo\"}})],1),_c('el-form-item',{attrs:{\"label\":\"分支\"}},[_c('el-input',{attrs:{\"placeholder\":\"如:release,可不填,默认 master\"},model:{value:(_vm.formGitHub.branch),callback:function ($$v) {_vm.$set(_vm.formGitHub, \"branch\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formGitHub.branch\"}})],1),_c('el-form-item',{attrs:{\"label\":\"Token\",\"required\":true}},[_c('el-input',{attrs:{\"show-password\":\"\",\"placeholder\":\"如:cc1d0c1426d0fd0902bd2d7184b14da61b8abc46\"},model:{value:(_vm.formGitHub.accessToken),callback:function ($$v) {_vm.$set(_vm.formGitHub, \"accessToken\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formGitHub.accessToken\"}}),_c('el-link',{attrs:{\"type\":\"primary\",\"href\":\"https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token\",\"target\":\"_blank\"}},[_vm._v(\"如何获取 GitHub Token?\")])],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.saveGitHubConfiguration}},[_vm._v(\"保存配置\")])],1)],1)],1),_c('el-tab-pane',{staticClass:\"github-panel\",attrs:{\"label\":\"阿里云 OSS\",\"name\":\"aliOSS\"}},[_c('el-form',{staticClass:\"setting-form\",attrs:{\"model\":_vm.formAliOSS,\"label-position\":\"right\",\"label-width\":\"140px\"}},[_c('el-form-item',{attrs:{\"label\":\"AccessKey ID\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:LTAI4GdoocsmdoxUf13ylbaNHk\"},model:{value:(_vm.formAliOSS.accessKeyId),callback:function ($$v) {_vm.$set(_vm.formAliOSS, \"accessKeyId\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formAliOSS.accessKeyId\"}})],1),_c('el-form-item',{attrs:{\"label\":\"AccessKey Secret\",\"required\":true}},[_c('el-input',{attrs:{\"show-password\":\"\",\"placeholder\":\"如:cc1d0c142doocs0902bd2d7md4b14da6ylbabc46\"},model:{value:(_vm.formAliOSS.accessKeySecret),callback:function ($$v) {_vm.$set(_vm.formAliOSS, \"accessKeySecret\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formAliOSS.accessKeySecret\"}})],1),_c('el-form-item',{attrs:{\"label\":\"Bucket\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:doocs\"},model:{value:(_vm.formAliOSS.bucket),callback:function ($$v) {_vm.$set(_vm.formAliOSS, \"bucket\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formAliOSS.bucket\"}})],1),_c('el-form-item',{attrs:{\"label\":\"Bucket 所在区域\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:oss-cn-shenzhen\"},model:{value:(_vm.formAliOSS.region),callback:function ($$v) {_vm.$set(_vm.formAliOSS, \"region\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formAliOSS.region\"}})],1),_c('el-form-item',{attrs:{\"label\":\"自定义 CDN 域名\",\"required\":false}},[_c('el-input',{attrs:{\"placeholder\":\"如:https://imagecdn.alidaodao.com,可不填\"},model:{value:(_vm.formAliOSS.cdnHost),callback:function ($$v) {_vm.$set(_vm.formAliOSS, \"cdnHost\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formAliOSS.cdnHost\"}})],1),_c('el-form-item',{attrs:{\"label\":\"存储路径\"}},[_c('el-input',{attrs:{\"placeholder\":\"如:img,可不填,默认为根目录\"},model:{value:(_vm.formAliOSS.path),callback:function ($$v) {_vm.$set(_vm.formAliOSS, \"path\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formAliOSS.path\"}}),_c('el-link',{attrs:{\"type\":\"primary\",\"href\":\"https://help.aliyun.com/document_detail/31883.html\",\"target\":\"_blank\"}},[_vm._v(\"如何使用阿里云 OSS?\")])],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.saveAliOSSConfiguration}},[_vm._v(\"保存配置\")])],1)],1)],1),_c('el-tab-pane',{staticClass:\"github-panel\",attrs:{\"label\":\"腾讯云 COS\",\"name\":\"txCOS\"}},[_c('el-form',{staticClass:\"setting-form\",attrs:{\"model\":_vm.formTxCOS,\"label-position\":\"right\",\"label-width\":\"140px\"}},[_c('el-form-item',{attrs:{\"label\":\"SecretId\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:AKIDnQp1w3DOOCSs8F5MDp9tdoocsmdUPonW3\"},model:{value:(_vm.formTxCOS.secretId),callback:function ($$v) {_vm.$set(_vm.formTxCOS, \"secretId\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formTxCOS.secretId\"}})],1),_c('el-form-item',{attrs:{\"label\":\"SecretKey\",\"required\":true}},[_c('el-input',{attrs:{\"show-password\":\"\",\"placeholder\":\"如:ukLmdtEJ9271f3DOocsMDsCXdS3YlbW0\"},model:{value:(_vm.formTxCOS.secretKey),callback:function ($$v) {_vm.$set(_vm.formTxCOS, \"secretKey\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formTxCOS.secretKey\"}})],1),_c('el-form-item',{attrs:{\"label\":\"Bucket\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:doocs-3212520134\"},model:{value:(_vm.formTxCOS.bucket),callback:function ($$v) {_vm.$set(_vm.formTxCOS, \"bucket\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formTxCOS.bucket\"}})],1),_c('el-form-item',{attrs:{\"label\":\"Bucket 所在区域\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:ap-guangzhou\"},model:{value:(_vm.formTxCOS.region),callback:function ($$v) {_vm.$set(_vm.formTxCOS, \"region\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formTxCOS.region\"}})],1),_c('el-form-item',{attrs:{\"label\":\"自定义 CDN 域名\",\"required\":false}},[_c('el-input',{attrs:{\"placeholder\":\"如:https://imagecdn.alidaodao.com,可不填\"},model:{value:(_vm.formTxCOS.cdnHost),callback:function ($$v) {_vm.$set(_vm.formTxCOS, \"cdnHost\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formTxCOS.cdnHost\"}})],1),_c('el-form-item',{attrs:{\"label\":\"存储路径\"}},[_c('el-input',{attrs:{\"placeholder\":\"如:img,可不填,默认根目录\"},model:{value:(_vm.formTxCOS.path),callback:function ($$v) {_vm.$set(_vm.formTxCOS, \"path\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formTxCOS.path\"}}),_c('el-link',{attrs:{\"type\":\"primary\",\"href\":\"https://cloud.tencent.com/document/product/436/38484\",\"target\":\"_blank\"}},[_vm._v(\"如何使用腾讯云 COS?\")])],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.saveTxCOSConfiguration}},[_vm._v(\"保存配置\")])],1)],1)],1),_c('el-tab-pane',{staticClass:\"github-panel\",attrs:{\"label\":\"七牛云 Kodo\",\"name\":\"qiniu\"}},[_c('el-form',{staticClass:\"setting-form\",attrs:{\"model\":_vm.formQiniu,\"label-position\":\"right\",\"label-width\":\"140px\"}},[_c('el-form-item',{attrs:{\"label\":\"AccessKey\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:6DD3VaLJ_SQgOdoocsyTV_YWaDmdnL2n8EGx7kG\"},model:{value:(_vm.formQiniu.accessKey),callback:function ($$v) {_vm.$set(_vm.formQiniu, \"accessKey\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formQiniu.accessKey\"}})],1),_c('el-form-item',{attrs:{\"label\":\"SecretKey\",\"required\":true}},[_c('el-input',{attrs:{\"show-password\":\"\",\"placeholder\":\"如:qgZa5qrvDOOcsmdKStD1oCjZ9nB7MDvJUs_34SIm\"},model:{value:(_vm.formQiniu.secretKey),callback:function ($$v) {_vm.$set(_vm.formQiniu, \"secretKey\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formQiniu.secretKey\"}})],1),_c('el-form-item',{attrs:{\"label\":\"Bucket\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:md\"},model:{value:(_vm.formQiniu.bucket),callback:function ($$v) {_vm.$set(_vm.formQiniu, \"bucket\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formQiniu.bucket\"}})],1),_c('el-form-item',{attrs:{\"label\":\"Bucket 对应域名\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:https://images.123ylb.cn\"},model:{value:(_vm.formQiniu.domain),callback:function ($$v) {_vm.$set(_vm.formQiniu, \"domain\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formQiniu.domain\"}})],1),_c('el-form-item',{attrs:{\"label\":\"存储区域\",\"required\":true}},[_c('el-input',{attrs:{\"placeholder\":\"如:z2\"},model:{value:(_vm.formQiniu.region),callback:function ($$v) {_vm.$set(_vm.formQiniu, \"region\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formQiniu.region\"}})],1),_c('el-form-item',{attrs:{\"label\":\"存储路径\",\"required\":false}},[_c('el-input',{attrs:{\"placeholder\":\"如:img,可不填,默认为根目录\"},model:{value:(_vm.formQiniu.path),callback:function ($$v) {_vm.$set(_vm.formQiniu, \"path\", (typeof $$v === 'string'? $$v.trim(): $$v))},expression:\"formQiniu.path\"}}),_c('el-link',{attrs:{\"type\":\"primary\",\"href\":\"https://developer.qiniu.com/kodo\",\"target\":\"_blank\"}},[_vm._v(\"如何使用七牛云 Kodo?\")])],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.saveQiniuConfiguration}},[_vm._v(\"保存配置\")])],1)],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n \n \n \n \n \n \n \n \n 将图片拖到此处,或\n 点击上传\n
\n \n \n \n \n \n \n \n \n \n \n \n \n 请在\n Gitee「设置->安全设置->私人令牌」中生成\n \n \n 保存配置\n \n \n \n \n \n \n \n \n \n \n \n \n \n 如何获取 GitHub Token?\n \n \n 保存配置\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 如何使用阿里云 OSS?\n \n \n 保存配置\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 如何使用腾讯云 COS?\n \n \n 保存配置\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 如何使用七牛云 Kodo?\n \n \n 保存配置\n \n \n \n \n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./uploadImgDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./uploadImgDialog.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./uploadImgDialog.vue?vue&type=template&id=fab4705a&scoped=true&\"\nimport script from \"./uploadImgDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./uploadImgDialog.vue?vue&type=script&lang=js&\"\nimport style0 from \"./uploadImgDialog.vue?vue&type=style&index=0&id=fab4705a&lang=less&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"fab4705a\",\n null\n \n)\n\nexport default component.exports","\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n
\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CodemirrorEditor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CodemirrorEditor.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CodemirrorEditor.vue?vue&type=template&id=47950998&scoped=true&\"\nimport script from \"./CodemirrorEditor.vue?vue&type=script&lang=js&\"\nexport * from \"./CodemirrorEditor.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CodemirrorEditor.vue?vue&type=style&index=0&id=47950998&lang=less&scoped=true&\"\nimport style1 from \"./CodemirrorEditor.vue?vue&type=style&index=1&lang=less&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"47950998\",\n null\n \n)\n\nexport default component.exports","\n \n \n \n \n\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=f01d475a&scoped=true&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=f01d475a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f01d475a\",\n null\n \n)\n\nexport default component.exports","import marked from \"marked\";\nclass WxRenderer {\n constructor(opts) {\n this.opts = opts;\n let ENV_STRETCH_IMAGE = true;\n\n let footnotes = [];\n let footnoteIndex = 0;\n let styleMapping = null;\n\n const CODE_FONT_FAMILY =\n \"Menlo, Operator Mono, Consolas, Monaco, monospace\";\n\n let merge = (base, extend) => Object.assign({}, base, extend);\n\n this.buildTheme = (themeTpl) => {\n let mapping = {};\n let base = merge(themeTpl.BASE, {\n \"font-family\": this.opts.fonts,\n \"font-size\": this.opts.size,\n });\n let base_block = merge(base, {});\n for (let ele in themeTpl.inline) {\n if (themeTpl.inline.hasOwnProperty(ele)) {\n let style = themeTpl.inline[ele];\n mapping[ele] = merge(base, style);\n }\n }\n\n for (let ele in themeTpl.block) {\n if (themeTpl.block.hasOwnProperty(ele)) {\n let style = themeTpl.block[ele];\n if (ele === \"code\") {\n style[\"font-family\"] = CODE_FONT_FAMILY;\n }\n mapping[ele] = merge(base_block, style);\n }\n }\n return mapping;\n };\n\n let getStyles = (tokenName, addition) => {\n let arr = [];\n let dict = styleMapping[tokenName];\n if (!dict) return \"\";\n for (const key in dict) {\n arr.push(key + \":\" + dict[key]);\n }\n return `style=\"${arr.join(\";\") + (addition || \"\")}\"`;\n };\n\n let addFootnote = (title, link) => {\n footnotes.push([++footnoteIndex, title, link]);\n return footnoteIndex;\n };\n\n this.buildFootnotes = () => {\n let footnoteArray = footnotes.map((x) => {\n if (x[1] === x[2]) {\n return `[${x[0]}]
: ${x[1]}
`;\n }\n return `[${x[0]}]
${x[1]}: ${x[2]}
`;\n });\n return `引用链接
${footnoteArray.join(\"\\n\")}
`;\n };\n\n this.buildAddition = () => {\n return `\n \n `;\n };\n\n this.setOptions = (newOpts) => {\n this.opts = merge(this.opts, newOpts);\n };\n\n this.hasFootnotes = () => footnotes.length !== 0;\n\n this.getRenderer = (status) => {\n footnotes = [];\n footnoteIndex = 0;\n\n styleMapping = this.buildTheme(this.opts.theme);\n let renderer = new marked.Renderer();\n\n renderer.heading = (text, level) => {\n switch (level) {\n case 1:\n return `${text}
`;\n case 2:\n return `${text}
`;\n case 3:\n return `${text}
`;\n default:\n return `${text}
`;\n }\n };\n renderer.paragraph = (text) => {\n if (\n text.indexOf(\"