mirror of
https://github.com/doocs/md.git
synced 2024-11-25 03:18:36 +08:00
2 lines
46 KiB
JavaScript
2 lines
46 KiB
JavaScript
(function(e){function t(t){for(var o,a,s=t[0],c=t[1],l=t[2],u=0,f=[];u<s.length;u++)a=s[u],Object.prototype.hasOwnProperty.call(i,a)&&i[a]&&f.push(i[a][0]),i[a]=0;for(o in c)Object.prototype.hasOwnProperty.call(c,o)&&(e[o]=c[o]);d&&d(t);while(f.length)f.shift()();return r.push.apply(r,l||[]),n()}function n(){for(var e,t=0;t<r.length;t++){for(var n=r[t],o=!0,a=1;a<n.length;a++){var c=n[a];0!==i[c]&&(o=!1)}o&&(r.splice(t--,1),e=s(s.s=n[0]))}return e}var o={},i={app:0},r=[];function a(e){return s.p+"js/"+({about:"about"}[e]||e)+"."+{about:"b48c8998"}[e]+".js"}function s(t){if(o[t])return o[t].exports;var n=o[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,s),n.l=!0,n.exports}s.e=function(e){var t=[],n=i[e];if(0!==n)if(n)t.push(n[2]);else{var o=new Promise((function(t,o){n=i[e]=[t,o]}));t.push(n[2]=o);var r,c=document.createElement("script");c.charset="utf-8",c.timeout=120,s.nc&&c.setAttribute("nonce",s.nc),c.src=a(e);var l=new Error;r=function(t){c.onerror=c.onload=null,clearTimeout(u);var n=i[e];if(0!==n){if(n){var o=t&&("load"===t.type?"missing":t.type),r=t&&t.target&&t.target.src;l.message="Loading chunk "+e+" failed.\n("+o+": "+r+")",l.name="ChunkLoadError",l.type=o,l.request=r,n[1](l)}i[e]=void 0}};var u=setTimeout((function(){r({type:"timeout",target:c})}),12e4);c.onerror=c.onload=r,document.head.appendChild(c)}return Promise.all(t)},s.m=e,s.c=o,s.d=function(e,t,n){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},s.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(s.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)s.d(n,o,function(t){return e[t]}.bind(null,o));return n},s.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="/md/",s.oe=function(e){throw console.error(e),e};var c=window["webpackJsonp"]=window["webpackJsonp"]||[],l=c.push.bind(c);c.push=t,c=c.slice();for(var u=0;u<c.length;u++)t(c[u]);var d=l;r.push([0,"chunk-vendors"]),n()})({0:function(e,t,n){e.exports=n("56d7")},"0e52":function(e,t,n){},1:function(e,t){},"3edb":function(e,t,n){},"56d7":function(e,t,n){"use strict";n.r(t);n("e260"),n("e6cf"),n("cca6"),n("a79d");var o=n("2b0e"),i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.loading?n("loading"):n("codemirror-editor")},r=[],a=function(){var e=this,t=e.$createElement;e._self._c;return e._m(0)},s=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"loading",attrs:{id:"loading"}},[n("div",{staticClass:"loading-wrapper"},[n("div",{staticClass:"loading-text"},[e._v("Loading...")]),n("div",{staticClass:"loading-anim"})])])}],c={},l=c,u=n("2877"),d=Object(u["a"])(l,a,s,!1,null,"71788ed8",null),f=d.exports,p=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"container",attrs:{id:"app"}},[n("el-container",[n("el-header",{staticClass:"top editor__header"},[n("editor-header",{on:{uploaded:e.uploaded,cssChanged:e.cssChanged,showBox:function(t){e.showBox=!e.showBox},showAboutDialog:function(t){e.aboutDialogVisible=!0},showDialogForm:function(t){e.dialogFormVisible=!0}}})],1),n("el-main",{staticClass:"main-body"},[n("el-row",{staticClass:"main-section",attrs:{gutter:10}},[n("el-col",{attrs:{span:12}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.source,expression:"source"}],attrs:{id:"editor",type:"textarea",placeholder:"Your markdown text here."},domProps:{value:e.source},on:{input:function(t){t.target.composing||(e.source=t.target.value)}}})]),n("el-col",{staticClass:"preview-wrapper",attrs:{span:12,id:"preview"}},[n("section",{attrs:{id:"output-wrapper"}},[n("div",{staticClass:"preview",attrs:{contenteditable:"true"}},[n("section",{attrs:{id:"output"},domProps:{innerHTML:e._s(e.output)}})])])]),n("transition",{attrs:{name:"custom-classes-transition","enter-active-class":"animated bounceInRight"}},[n("el-col",{directives:[{name:"show",rawName:"v-show",value:e.showBox,expression:"showBox"}],attrs:{id:"cssBox",span:12}},[n("textarea",{attrs:{id:"cssEditor",type:"textarea",placeholder:"Your custom css here."}})])],1)],1)],1)],1),n("about-dialog",{attrs:{aboutDialogVisible:e.aboutDialogVisible},on:{close:function(t){e.aboutDialogVisible=!1}}}),n("insert-form-dialog",{attrs:{dialogFormVisible:e.dialogFormVisible},on:{close:function(t){e.dialogFormVisible=!1}}})],1)},g=[],m=(n("ac1f"),n("5319"),n("5530")),h=n("56b3"),b=n.n(h);n("7b00"),n("959b"),n("8c33"),n("31c5"),n("9b74"),n("111b"),n("c975"),n("baa5"),n("fb6a"),n("1276");(function(){b.a.extendMode("css",{commentStart:"/*",commentEnd:"*/",newlineAfterToken:function(e,t){return/^[;{}]$/.test(t)}}),b.a.defineExtension("commentRange",(function(e,t,n){var o=this,i=b.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)}}))})),b.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")}))})),b.a.defineExtension("autoFormatRange",(function(e,t){var n=this,o=n.getMode(),i=n.getRange(e,t).split("\n"),r=b.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<i.length;++d){var f=new b.a.StringStream(i[d],a);while(!f.eol()){var p=b.a.innerMode(o,r),g=o.token(f,r),m=f.current();f.start=f.pos,l&&!/\S/.test(m)||(s+=m,l=!1),!l&&p.mode.newlineAfterToken&&p.mode.newlineAfterToken(g,m,f.string.slice(f.pos)||i[d+1]||"",p.state)&&u()}!f.pos&&o.blankLine&&o.blankLine(r),l||u()}n.operation((function(){n.replaceRange(s,e,t);for(var o=e.line+1,i=e.line+c;o<=i;++o)n.indentLine(o,"smart");n.setSelection(e,n.getCursor(!1))}))}))})();n("d3b7");var v=n("bc3a"),x=n.n(v),k=x.a.create({baseURL:"",timeout:1e4});k.interceptors.request.use((function(e){return/^(post)|(put)|(delete)$/i.test(e.method)&&e.data&&e.data.upload&&(e.headers["Content-Type"]="multipart/form-data"),e}),(function(e){Promise.reject(e)})),k.interceptors.response.use((function(e){return e.data.success?e.data:(console.log(e),Promise.reject(e.data))}),(function(e){return Promise.reject(e)}));var w=k;function C(e){return w({url:"https://imgkr.com/api/files/upload",method:"post",data:e})}var y={fileUpload:C},S=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-container",{staticClass:"top"},[n("el-upload",{staticClass:"header__item",attrs:{action:"https://imgkr.com/api/files/upload",headers:{"Content-Type":"multipart/form-data"},"show-file-list":!1,multiple:!0,accept:".jpg,.jpeg,.png,.gif",name:"file","before-upload":e.beforeUpload}},[n("el-tooltip",{attrs:{effect:"dark",content:"上传图片",placement:"bottom-start"}},[n("i",{staticClass:"el-icon-upload",attrs:{size:"medium"}})])],1),n("el-tooltip",{staticClass:"header__item",attrs:{effect:"dark",content:"下载编辑框Markdown文档",placement:"bottom-start"}},[n("i",{staticClass:"el-icon-download",attrs:{size:"medium"},on:{click:e.downloadEditorContent}})]),n("el-tooltip",{staticClass:"header__item",attrs:{effect:"dark",content:"重置页面",placement:"bottom-start"}},[n("i",{staticClass:"el-icon-refresh",attrs:{size:"medium"},on:{click:e.reset}})]),n("el-tooltip",{staticClass:"header__item header__item_last",attrs:{effect:"dark",content:"插入表格",placement:"bottom-start"}},[n("i",{staticClass:"el-icon-s-grid",attrs:{size:"medium"},on:{click:function(t){return e.$emit("showDialogForm")}}})]),n("el-form",{staticClass:"ctrl",attrs:{size:"mini",inline:!0}},[n("el-form-item",[n("el-select",{attrs:{size:"mini",placeholder:"选择字体",clearable:""},on:{change:e.fontChanged},model:{value:e.selectFont,callback:function(t){e.selectFont=t},expression:"selectFont"}},e._l(e.config.builtinFonts,(function(t){return n("el-option",{key:t.value,style:{fontFamily:t.value},attrs:{label:t.label,value:t.value}},[n("span",{staticClass:"select-item-left"},[e._v(e._s(t.label))]),n("span",{staticClass:"select-item-right"},[e._v("Abc")])])})),1)],1),n("el-form-item",[n("el-select",{attrs:{size:"mini",placeholder:"选择段落字号",clearable:""},on:{change:e.sizeChanged},model:{value:e.selectSize,callback:function(t){e.selectSize=t},expression:"selectSize"}},e._l(e.config.sizeOption,(function(t){return n("el-option",{key:t.value,attrs:{label:t.label,value:t.value}},[n("span",{staticClass:"select-item-left"},[e._v(e._s(t.label))]),n("span",{staticClass:"select-item-right"},[e._v(e._s(t.desc))])])})),1)],1),n("el-form-item",[n("el-select",{attrs:{size:"mini",placeholder:"选择颜色",clearable:""},on:{change:e.colorChanged},model:{value:e.selectColor,callback:function(t){e.selectColor=t},expression:"selectColor"}},e._l(e.config.colorOption,(function(t){return n("el-option",{key:t.value,attrs:{label:t.label,value:t.value}},[n("span",{staticClass:"select-item-left"},[e._v(e._s(t.label))]),n("span",{staticClass:"select-item-right"},[e._v(e._s(t.hex))])])})),1)],1),n("el-tooltip",{attrs:{content:"自定义颜色",placement:"top"}},[n("el-color-picker",{attrs:{size:"mini","show-alpha":""},on:{change:e.colorChanged},model:{value:e.selectColor,callback:function(t){e.selectColor=t},expression:"selectColor"}})],1),n("el-tooltip",{attrs:{content:"微信外链自动转为文末引用",placement:"top"}},[n("el-switch",{staticClass:"header__switch",attrs:{"active-color":"#67c23a","inactive-color":"#dcdfe6"},on:{change:e.statusChanged},model:{value:e.citeStatus,callback:function(t){e.citeStatus=t},expression:"citeStatus"}})],1)],1),n("el-tooltip",{staticClass:"item",attrs:{effect:"dark",content:"自定义CSS样式",placement:"left"}},[n("el-button",{attrs:{type:"success",plain:"",size:"medium",icon:"el-icon-setting"},on:{click:e.customStyle}})],1),n("el-button",{attrs:{type:"success",plain:"",size:"medium"},on:{click:e.copy}},[e._v("复制")]),n("el-button",{staticClass:"about",attrs:{type:"success",plain:"",size:"medium"},on:{click:function(t){return e.$emit("showAboutDialog")}}},[e._v("关于")])],1)},_=[],O=(n("3ca3"),n("ddb0"),n("2b3d"),n("96cf"),n("1da1")),E=(n("4de4"),n("4160"),n("d81d"),n("b0c0"),n("b64b"),n("498a"),n("9911"),n("159b"),{BASE:{"text-align":"left",color:"#3f3f3f","line-height":"1.75"},BASE_BLOCK:{margin:"1em 8px"},block:{h1:{"font-size":"1.2em","text-align":"center","font-weight":"bold",display:"table",margin:"2em auto 1em",padding:"0 1em","border-bottom":"2px solid rgba(0, 152, 116, 0.9)"},h2:{"font-size":"1.2em","text-align":"center","font-weight":"bold",display:"table",margin:"4em auto 2em",padding:"0 0.2em",background:"rgba(0, 152, 116, 0.9)",color:"#fff"},h3:{"font-weight":"bold","font-size":"1.1em",margin:"2em 8px 0.75em 0","line-height":"1.2","padding-left":"8px","border-left":"3px solid rgba(0, 152, 116, 0.9)"},h4:{"font-weight":"bold","font-size":"1em",margin:"2em 8px 0.5em",color:"rgba(66, 185, 131, 0.9)"},p:{margin:"1.5em 8px","letter-spacing":"0.1em"},blockquote:{"font-style":"normal","border-left":"none",padding:"1em","border-radius":"4px",color:"#FEEEED",background:"rgba(27,31,35,.05)",margin:"2em 8px"},blockquote_p:{"letter-spacing":"0.1em",color:"rgb(80, 80, 80)","font-family":"PingFangSC-light, PingFangTC-light, Open Sans, Helvetica Neue, sans-serif","font-size":"1em",display:"inline"},code:{"font-size":"80%",overflow:"auto",color:"#333",background:"rgb(247, 247, 247)","border-radius":"2px",padding:"10px","line-height":"1.5",border:"1px solid rgb(236,236,236)",margin:"20px 0"},image:{"border-radius":"4px",display:"block",margin:"0.1em auto 0.5em",width:"100% !important"},image_org:{"border-radius":"4px",display:"block"},ol:{"margin-left":"0","padding-left":"1em"},ul:{"margin-left":"0","padding-left":"1em","list-style":"circle"},footnotes:{margin:"0.5em 8px","font-size":"80%"},figure:{margin:"1.5em 8px"}},inline:{listitem:{"text-indent":"-1em",display:"block",margin:"0.2em 8px"},codespan:{"font-size":"90%",color:"#d14",background:"rgba(27,31,35,.05)",padding:"3px 5px","border-radius":"4px"},link:{color:"#576b95"},wx_link:{color:"#576b95","text-decoration":"none"},strong:{color:"rgba(15, 76, 129, 0.9)","font-weight":"bold"},table:{"border-collapse":"collapse","text-align":"center",margin:"1em 8px"},thead:{background:"rgba(0, 0, 0, 0.05)","font-weight":"bold"},td:{border:"1px solid #dfdfdf",padding:"0.25em 0.5em"},footnote:{"font-size":"12px"},figcaption:{"text-align":"center",color:"#888","font-size":"0.8em"}}});function j(e){return function(t){var n=JSON.parse(JSON.stringify(e));return n.block.h1["border-bottom"]="2px solid ".concat(t),n.block.h2["background"]=t,n.block.h3["border-left"]="3px solid ".concat(t),n.block.h4["color"]=t,n.inline.strong["color"]=t,n}}var R=function(e,t){var n=JSON.parse(JSON.stringify(e));return n.block.h1["border-bottom"]="2px solid ".concat(t),n.block.h2["background"]=t,n.block.h3["border-left"]="3px solid ".concat(t),n.block.h4["color"]=t,n.inline.strong["color"]=t,n};function z(e){return function(t){var n=JSON.parse(JSON.stringify(e));return n.block.h1["font-size"]="".concat(1.14*t,"px"),n.block.h2["font-size"]="".concat(1.1*t,"px"),n.block.h3["font-size"]="".concat(t,"px"),n.block.h4["font-size"]="".concat(t,"px"),n}}var F=j(E),T=z(E);function A(e,t,n){var o=JSON.parse(JSON.stringify(n));return o.block.h1["border-bottom"]="2px solid ".concat(t),o.block.h2["background"]=t,o.block.h3["border-left"]="3px solid ".concat(t),o.block.h4["color"]=t,o.inline.strong["color"]=t,o.block.h1=Object.assign(o.block.h1,e.h1),o.block.h2=Object.assign(o.block.h2,e.h2),o.block.h3=Object.assign(o.block.h3,e.h3),o.block.h4=Object.assign(o.block.h4,e.h4),o.block.p=Object.assign(o.block.p,e.p),o.block.blockquote=Object.assign(o.block.blockquote,e.blockquote),o.block.blockquote_p=Object.assign(o.block.blockquote_p,e.blockquote_p),o.block.image=Object.assign(o.block.image,e.image),o.inline.strong=Object.assign(o.inline.strong,e.strong),o.inline.codespan=Object.assign(o.inline.codespan,e.codespan),o.inline.link=Object.assign(o.inline.link,e.link),o.inline.wx_link=Object.assign(o.inline.wx_link,e.wx_link),o}function P(e){while(-1!==(open=e.indexOf("/*"))&&-1!==(close=e.indexOf("*/")))e=e.substring(0,open)+e.substring(close+2);var t={},n=function(){var n=e.indexOf("{"),o=e.indexOf("}");function i(e){var t={};return e.forEach((function(e){var n=e.indexOf(":"),o=e.substring(0,n).trim(),i=e.substring(n+1).trim();t[o]=i})),t}var r=e.substring(n+1,o).split(";").map((function(e){return e.trim()})).filter((function(e){return e.length>0}));r=i(r);var a=e.substring(0,n).split(",").map((function(e){return e.trim()}));a.forEach((function(e){t[e]||(t[e]={}),Object.keys(r).forEach((function(n){t[e][n]=r[n]}))})),e=e.slice(o+1).trim()};while(e.length>0&&-1!==e.indexOf("{")&&-1!==e.indexOf("}"))n();return t}function B(e,t){var n=e.getValue(0);n?localStorage.setItem(t,n):localStorage.removeItem(t)}function G(e){return/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(e.name)?e.size>5242880&&"由于公众号限制,图片大小不能超过 5.0M":"请上传 JPG/PNG/GIF 格式的图片"}var I=n("466b"),$=n.n(I);function D(){for(var e=document.getElementById("output"),t=e.getElementsByTagName("img"),n=0;n<t.length;n++){var o=t[n],i=o.getAttribute("width"),r=o.getAttribute("height");o.removeAttribute("width"),o.removeAttribute("height"),o.style.width=i,o.style.height=r}}function q(){var e=document.getElementById("output-wrapper"),t=e.innerHTML,n="";return n=$.a.inlineContent(t,{inlinePseudoElements:!0,preserveImportant:!0}),n}var M={builtinFonts:[{label:"无衬线",value:"-apple-system-font,BlinkMacSystemFont, Helvetica Neue, PingFang SC, Hiragino Sans GB , Microsoft YaHei UI , Microsoft YaHei ,Arial,sans-serif"},{label:"衬线",value:"Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif"}],sizeOption:[{label:"12px",value:"12px",desc:"更小"},{label:"13px",value:"13px",desc:"稍小"},{label:"14px",value:"14px",desc:"推荐"},{label:"15px",value:"15px",desc:"稍大"},{label:"16px",value:"16px",desc:"更大"}],colorOption:[{label:"经典蓝",value:"rgba(15, 76, 129, 1)",hex:"最新流行"},{label:"翡翠绿",value:"rgba(0, 152, 116, 1)",hex:"优雅清新"},{label:"活力橘",value:"rgba(250, 81, 81, 1)",hex:"热情活泼"}],form:{rows:1,cols:1}},V="/*\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",N=V,L=n("2f62"),H={name:"editor-header",data:function(){return{config:M,citeStatus:!1,selectFont:"",selectSize:"",selectColor:""}},computed:Object(m["a"])({},Object(L["c"])({output:function(e){return e.output},editor:function(e){return e.editor},cssEditor:function(e){return e.cssEditor},currentFont:function(e){return e.currentFont},currentSize:function(e){return e.currentSize},currentColor:function(e){return e.currentColor}})),methods:Object(m["a"])({fontChanged:function(e){this.setWxRendererOptions({fonts:e}),this.setCurrentFont(e),this.editorRefresh()},sizeChanged:function(e){var t=T(e.replace("px",""));t=R(t,this.currentColor),this.setWxRendererOptions({size:e,theme:t}),this.setCurrentSize(e),this.editorRefresh()},colorChanged:function(e){var t=T(this.currentSize.replace("px",""));t=R(t,e),this.setWxRendererOptions({theme:t}),this.setCurrentColor(e),this.editorRefresh()},statusChanged:function(e){this.setCiteStatus(e),this.editorRefresh()},beforeUpload:function(e){var t=this,n=G(e);if(n)return this.$message({showClose:!0,message:n,type:"error"}),!1;var o=new FormData;return o.append("file",e),y.fileUpload(o).then((function(e){t.$emit("uploaded",e)})).catch((function(e){console.log(e.message)})),!1},copy:function(){var e=document.getElementById("output");D(),this.setHtml(q()),e.focus(),window.getSelection().removeAllRanges();var t=document.createRange();t.setStartBefore(e.firstChild),t.setEndAfter(e.lastChild),window.getSelection().addRange(t),document.execCommand("copy"),this.$notify({showClose:!0,message:"已复制渲染后的文章到剪贴板,可直接到公众号后台粘贴",offset:80,duration:1600,type:"success"}),e.innerHTML=this.output},customStyle:function(){var e=this;return Object(O["a"])(regeneratorRuntime.mark((function t(){var n;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.$emit("showBox"),e.$nextTick((function(){e.cssEditor||e.cssEditor.refresh()})),setTimeout((function(){e.cssEditor.refresh()}),50),t.next=5,localStorage.getItem("__css_content");case 5:n=t.sent,n||e.setCssEditorValue(N);case 7:case"end":return t.stop()}}),t)})))()},reset:function(){var e=this;this.$confirm("此操作将丢失本地缓存的文本和自定义样式,是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",confirmButtonClass:"el-button--success",cancelButtonClass:"el-button--success is-plain",type:"warning",center:!0}).then((function(){localStorage.clear(),e.clearEditorToDefault(),e.editor.focus(),e.citeStatus=!1,e.statusChanged(!1),e.fontChanged(e.config.builtinFonts[0].value),e.colorChanged(e.config.colorOption[1].value),e.sizeChanged(e.config.sizeOption[2].value),e.$emit("cssChanged")})).catch((function(){e.editor.focus()}))},downloadEditorContent:function(){var e=document.createElement("a");e.download="content.md",e.style.display="none";var t=new Blob([this.editor.getValue(0)]);e.href=URL.createObjectURL(t),document.body.appendChild(e),e.click(),document.body.removeChild(e)}},Object(L["b"])(["editorRefresh","clearEditorToDefault","setCurrentColor","setCiteStatus","setHtml","setCurrentFont","setCurrentSize","setCssEditorValue","setWxRendererOptions"])),mounted:function(){this.selectFont=this.currentFont,this.selectSize=this.currentSize,this.selectColor=this.currentColor}},J=H,U=(n("72bb"),Object(u["a"])(J,S,_,!1,null,"257e3ffe",null)),W=U.exports,K=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-dialog",{attrs:{title:"关于",visible:e.aboutDialogVisible,width:"30%",center:""},on:{close:function(t){return e.$emit("close")}}},[n("div",{staticStyle:{"text-align":"center"}},[n("h3",[e._v("一款高度简洁的微信 Markdown 编辑器")])]),n("div",{staticStyle:{"text-align":"center","margin-top":"10px"}},[n("p",[e._v("扫码关注我的公众号,原创技术文章第一时间推送!")]),n("img",{staticStyle:{width:"40%",display:"block",margin:"20px auto 10px"},attrs:{src:"assets/images/qrcode-for-doocs.jpg"}})]),n("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[n("el-button",{attrs:{type:"success",plain:""},on:{click:function(t){return e.onRedirect("https://github.com/doocs/md")}}},[e._v("GitHub 仓库")]),n("el-button",{attrs:{type:"success",plain:""},on:{click:function(t){return e.onRedirect("https://gitee.com/doocs/md")}}},[e._v("Gitee 仓库")])],1)])},Y=[],Q={props:{aboutDialogVisible:{type:Boolean,default:!1}},methods:{onRedirect:function(e){window.open(e)}}},Z=Q,X=Object(u["a"])(Z,K,Y,!1,null,"6617996a",null),ee=X.exports,te=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-dialog",{attrs:{title:"插入表格",visible:e.dialogFormVisible},on:{close:function(t){return e.$emit("close")}}},[n("el-form",{attrs:{model:e.config.form}},[n("el-form-item",{attrs:{label:"行数(表头不计入行数)"}},[n("el-input",{model:{value:e.config.form.rows,callback:function(t){e.$set(e.config.form,"rows",t)},expression:"config.form.rows"}})],1),n("el-form-item",{attrs:{label:"列数"}},[n("el-input",{model:{value:e.config.form.cols,callback:function(t){e.$set(e.config.form,"cols",t)},expression:"config.form.cols"}})],1)],1),n("div",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[n("el-button",{attrs:{type:"success",plain:""},on:{click:function(t){return e.$emit("close")}}},[e._v("取 消")]),n("el-button",{attrs:{type:"success"},on:{click:e.insertTable}},[e._v("确 定")])],1)],1)},ne=[],oe={props:{dialogFormVisible:{type:Boolean,default:!1}},data:function(){return{config:M}},computed:Object(m["a"])({},Object(L["c"])({editor:function(e){return e.editor}})),methods:Object(m["a"])({insertTable:function(){var e=this.editor.getCursor(),t=parseInt(this.config.form.rows),n=parseInt(this.config.form.cols);if(isNaN(t)||isNaN(n)||t<1||n<1)this.$message({showClose:!0,message:"输入的行/列数无效,请重新输入",type:"error"});else{for(var o="",i=0;i<t+2;++i){for(var r=0;r<n+1;++r)o+=0===r?"|":1!==i?" |":" --- |";o+="\n"}this.editor.replaceSelection("\n".concat(o,"\n"),e),this.$emit("close"),this.editorRefresh()}}},Object(L["b"])(["editorRefresh"]))},ie=oe,re=Object(u["a"])(ie,te,ne,!1,null,"b73d0f98",null),ae=re.exports,se=(n("18a5"),n("53ca"));(function(e){var t={pairs:"()[]{}''\"\"",closeBefore:")]}'\":;>",triples:"",explode:"[]{}"},n=e.Pos;function o(e,n){return"pairs"==n&&"string"==typeof e?e:"object"==Object(se["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<e.length;t++){var n=e.charAt(t),o="'"+n+"'";i[o]||(i[o]=a(n))}}function a(e){return function(t){return d(t,e)}}function s(e){var t=e.state.closeBrackets;if(!t||t.override)return t;var n=e.getModeAt(e.getCursor());return n.closeBrackets||t}function c(t){var i=s(t);if(!i||t.getOption("disableInput"))return e.Pass;for(var r=o(i,"pairs"),a=t.listSelections(),c=0;c<a.length;c++){if(!a[c].empty())return e.Pass;var l=f(t,a[c].head);if(!l||r.indexOf(l)%2!=0)return e.Pass}for(c=a.length-1;c>=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;a<r.length;a++){if(!r[a].empty())return e.Pass;var c=f(t,r[a].head);if(!c||i.indexOf(c)%2!=0)return e.Pass}t.operation((function(){var e=t.lineSeparator()||"\n";t.replaceSelection(e+e,null),t.execCommand("goCharLeft"),r=t.listSelections();for(var n=0;n<r.length;n++){var o=r[n].head.line;t.indentLine(o,null,!0),t.indentLine(o+1,null,!0)}}))}function u(t){var o=e.cmpPos(t.anchor,t.head)>0;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"),g=a.charAt(c+1)==i,m=t.listSelections(),h=c%2==0,b=0;b<m.length;b++){var v,x=m[b],k=x.head,w=t.getRange(k,n(k.line,k.ch+1));if(h&&!x.empty())v="surround";else if(!g&&h||w!=i)if(g&&k.ch>1&&f.indexOf(i)>=0&&t.getRange(n(k.line,k.ch-2),k)==i+i){if(k.ch>2&&/\bstring/.test(t.getTokenTypeAt(n(k.line,k.ch-2))))return e.Pass;v="addFour"}else if(g){var C=0==k.ch?" ":t.getRange(n(k.line,k.ch-1),k);if(e.isWordChar(w)||C==i||e.isWordChar(C))return e.Pass;v="both"}else{if(!h||!(0===w.length||/\s/.test(w)||d.indexOf(w)>-1))return e.Pass;v="both"}else v=g&&p(t,k)?"both":f.indexOf(i)>=0&&t.getRange(k,n(k.line,k.ch+3))==i+i+i?"skipThree":"skip";if(l){if(l!=v)return e.Pass}else l=v}var y=c%2?a.charAt(c-1):i,S=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<n.length;e++)n[e]=y+n[e]+S;t.replaceSelections(n,"around"),n=t.listSelections().slice();for(e=0;e<n.length;e++)n[e]=u(n[e]);t.setSelections(n)}else"both"==l?(t.replaceSelection(y+S,null),t.triggerElectric(y+S),t.execCommand("goCharLeft")):"addFour"==l&&(t.replaceSelection(y+y+y+y,"before"),t.execCommand("goCharRight"))}))}function f(e,t){var o=e.getRange(n(t.line,t.ch-1),n(t.line,t.ch+1));return 2==o.length?o:null}function p(e,t){var o=e.getTokenAt(n(t.line,t.ch+1));return/\bstring/.test(o.type)&&o.start==t.ch&&(0==t.ch||!/\bstring/.test(e.getTokenTypeAt(t)))}r(t.pairs+"`")})(b.a);var ce=n("1157"),le=n.n(ce);n("f9d4");var ue={data:function(){return{config:M,showBox:!1,aboutDialogVisible:!1,dialogFormVisible:!1,timeout:null,source:""}},components:{editorHeader:W,aboutDialog:ee,insertFormDialog:ae},computed:Object(m["a"])({},Object(L["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},html:function(e){return e.html}})),created:function(){var e=this;this.initEditorState(),this.$nextTick((function(){e.initEditor(),e.initCssEditor(),e.editorRefresh()}))},methods:Object(m["a"])({initEditor:function(){var e=this;this.initEditorEntity(),this.editor.on("change",(function(t,n){e.editorRefresh(),B(e.editor,"__editor_content")})),this.editor.on("paste",(function(t,n){if(n.clipboardData&&n.clipboardData.items)for(var o=0,i=n.clipboardData.items.length;o<i;++o){var r=n.clipboardData.items[o];if("file"===r.kind){var a=r.getAsFile(),s=G(a);if(s)return void e.$message({showClose:!0,message:s,type:"error"});var c=new FormData;c.append("file",a),y.fileUpload(c).then((function(t){e.uploaded(t)})).catch((function(e){console.log(e.message)}))}}}))},initCssEditor:function(){var e=this;this.initCssEditorEntity(),this.cssEditor.on("keyup",(function(e,t){(t.keyCode>=65&&t.keyCode<=90||189===t.keyCode)&&e.showHint(t)})),this.cssEditor.on("update",(function(t){e.cssChanged(),B(e.cssEditor,"__css_content")}))},cssChanged:function(){var e=P(this.cssEditor.getValue(0)),t=T(this.currentSize.replace("px",""));t=A(e,this.currentColor,t),this.setWxRendererOptions({theme:t}),this.editorRefresh()},uploaded:function(e,t,n){if(e)if(e.success){var o=this.editor.getCursor(),i=e.data,r="![](".concat(i,")");this.editor.replaceSelection("\n".concat(r,"\n"),o),this.$message({showClose:!0,message:"图片插入成功",type:"success"}),this.editorRefresh()}else this.$message({showClose:!0,message:e.message,type:"error"});else this.$message({showClose:!0,message:"上传图片未知异常",type:"error"})},leftAndRightScroll:function(){le()("div.CodeMirror-scroll, #preview").on("scroll",(function e(){clearTimeout(this.timeout);var t=le()(this),n=le()(t.is("#preview")?"div.CodeMirror-scroll":"#preview");n.off("scroll");var o=t[0],i=n[0],r=o.scrollTop/(o.scrollHeight-o.offsetHeight),a=r*(i.scrollHeight-i.offsetHeight);i.scrollTo(0,a),this.timeout=setTimeout((function(){n.on("scroll",e)}),100)}))}},Object(L["b"])(["initEditorState","initEditorEntity","setWxRendererOptions","editorRefresh","initCssEditorEntity"])),mounted:function(){this.leftAndRightScroll()}},de=ue,fe=(n("869e"),Object(u["a"])(de,p,g,!1,null,"a0bd6f2e",null)),pe=fe.exports,ge=(n("2cd5"),{name:"App",components:{Loading:f,CodemirrorEditor:pe},data:function(){return{loading:!0}},mounted:function(){var e=this;setTimeout((function(){e.loading=!1}),200),window.console&&window.console.log&&console.log("Think big, train fast, learn deep. See https://github.com/yanglbme"),setTimeout((function(){}),2e3)}}),me=ge,he=Object(u["a"])(me,i,r,!1,null,"208915a8",null),be=he.exports,ve=n("8c4f"),xe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"home"})},ke=[],we={name:"home",components:{}},Ce=we,ye=Object(u["a"])(Ce,xe,ke,!1,null,null,null),Se=ye.exports;o["default"].use(ve["a"]);var _e=[{path:"/",name:"home",component:Se},{path:"/about",name:"about",component:function(){return n.e("about").then(n.bind(null,"f820"))}}],Oe=new ve["a"]({mode:"history",base:"/md/",routes:_e}),Ee=Oe,je=(n("99af"),n("a15b"),n("e0c1")),Re=n.n(je),ze=function(e){var t=this;this.opts=e;var n=!0,o=[],i=0,r=null,a="Menlo, Operator Mono, Consolas, Monaco, monospace",s=function(e,t){return Object.assign({},e,t)};this.buildTheme=function(e){var n={},o=s(e.BASE,{"font-family":t.opts.fonts,"font-size":t.opts.size}),i=s(o,{});for(var r in e.inline)if(e.inline.hasOwnProperty(r)){var c=e.inline[r];"codespan"===r&&(c["font-family"]=a,c["white-space"]="normal"),n[r]=s(o,c)}for(var l in e.block)if(e.block.hasOwnProperty(l)){var u=e.block[l];"code"===l&&(u["font-family"]=a),n[l]=s(i,u)}return n};var c=function(e,t){var n=[],o=r[e];if(!o)return"";for(var i in o)n.push(i+":"+o[i]);return'style="'.concat(n.join(";")+(t||""),'"')},l=function(e,t){return o.push([++i,e,t]),i};this.buildFootnotes=function(){var e=o.map((function(e){return e[1]===e[2]?'<code style="font-size: 90%; opacity: 0.6;">['.concat(e[0],"]</code>: <i>").concat(e[1],"</i><br/>"):'<code style="font-size: 90%; opacity: 0.6;">['.concat(e[0],"]</code> ").concat(e[1],": <i>").concat(e[2],"</i><br/>")}));return"<h4 ".concat(c("h4"),">引用链接</h4><p ").concat(c("footnotes"),">").concat(e.join("\n"),"</p>")},this.buildAddition=function(){return'\n <style>\n .preview-wrapper pre::before {\n font-family: "SourceSansPro", "HelveticaNeue", Arial, sans-serif;\n position: absolute;\n top: 0;\n right: 0;\n color: #ccc;\n text-align: center;\n font-size: 0.8em;\n padding: 5px 10px 0;\n line-height: 15px;\n height: 15px;\n font-weight: 600;\n }\n </style>\n '},this.setOptions=function(e){t.opts=s(t.opts,e)},this.hasFootnotes=function(){return 0!==o.length},this.getRenderer=function(e){o=[],i=0,r=t.buildTheme(t.opts.theme);var a=new Re.a.Renderer;return a.heading=function(e,t){switch(t){case 1:return"<h1 ".concat(c("h1"),">").concat(e,"</h1>");case 2:return"<h2 ".concat(c("h2"),">").concat(e,"</h2>");case 3:return"<h3 ".concat(c("h3"),">").concat(e,"</h3>");default:return"<h4 ".concat(c("h4"),">").concat(e,"</h4>")}},a.paragraph=function(e){return"<p ".concat(c("p"),">").concat(e,"</p>")},a.blockquote=function(e){return e=e.replace(/<p.*?>/,"<p ".concat(c("blockquote_p"),">")),"<blockquote ".concat(c("blockquote"),">").concat(e,"</blockquote>")},a.code=function(e,t){e=e.replace(/</g,"<"),e=e.replace(/>/g,">");for(var n=e.split("\n"),o=[],i=[],r=0;r<n.length;r++){var a=n[r];o.push('<code class="prettyprint"><span class="code-snippet_outer">'.concat(a||"<br>","</span></code>")),i.push("<li></li>")}var s=t||"";return'\n <section class="code-snippet__fix code-snippet__js">\n <ul class="code-snippet__line-index code-snippet__js">'.concat(i.join(""),'</ul>\n <pre class="code-snippet__js" data-lang="').concat(s,'">\n ').concat(o.join(""),"\n </pre>\n </section>\n ")},a.codespan=function(e,t){return"<code ".concat(c("codespan"),">").concat(e,"</code>")},a.listitem=function(e){return"<span ".concat(c("listitem"),'><span style="margin-right: 10px;"><%s/></span>').concat(e,"</span>")},a.list=function(e,t,n){e=e.replace(/<\/*p.*?>/g,"");var o=e.split("<%s/>");if(!t)return e=o.join("•"),"<p ".concat(c("ul"),">").concat(e,"</p>");e=o[0];for(var i=1;i<o.length;i++)e=e+i+"."+o[i];return"<p ".concat(c("ol"),">").concat(e,"</p>")},a.image=function(e,t,o){var i="";o&&(i="<figcaption ".concat(c("figcaption"),">").concat(o,"</figcaption>"));var r=c("figure"),a=c(n?"image":"image_org");return"<figure ".concat(r,"><img ").concat(a,' src="').concat(e,'" title="').concat(t,'" alt="').concat(o,'"/>').concat(i,"</figure>")},a.link=function(t,n,o){if(0===t.indexOf("https://mp.weixin.qq.com"))return'<a href="'.concat(t,'" title="').concat(n||o,'" ').concat(c("wx_link"),">").concat(o,"</a>");if(t===o)return o;if(e){var i=l(n||o,t);return"<span ".concat(c("link"),">").concat(o,"<sup>[").concat(i,"]</sup></span>")}return o},a.strong=function(e){return"<strong ".concat(c("strong"),">").concat(e,"</strong>")},a.em=function(e){return"<p ".concat(c("p",";font-style: italic;"),">").concat(e,"</p>")},a.table=function(e,t){return'<section style="padding:0 8px;"><table class="preview-table"><thead '.concat(c("thead"),">").concat(e,"</thead><tbody>").concat(t,"</tbody></table></section>")},a.tablecell=function(e,t){return"<td ".concat(c("td"),">").concat(e,"</td>")},a.hr=function(){return'<hr style="border-style: solid;border-width: 1px 0 0;border-color: rgba(0,0,0,0.1);-webkit-transform-origin: 0 0;-webkit-transform: scale(1, 0.5);transform-origin: 0 0;transform: scale(1, 0.5);">'},a}},Fe=ze,Te='# 示例文章:Google 搜索的即时自动补全功能究竟是如何“工作”的?\n> Google 搜索**自动补全功能**的强大,相信不少朋友都能感受到,它帮助我们更快地“补全”我们所要输入的搜索关键字。那么,它怎么知道我们要输入什么内容?它又是如何工作的?在这篇文章里,我们一起来看看。\n\n## 使用自动补全\nGoogle 搜索的自动补全功能可以在 Google 搜索应用的大多数位置使用,包括 [Google](https://www.google.com/) 主页、适用于 IOS 和 Android 的 Google 应用,我们只需要在 Google 搜索框上开始键入关键字,就可以看到联想词了。\n\n![](https://imgkr.cn-bj.ufileos.com/17ed83bf-e028-4db2-9503-5a3b4e64deee.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://imgkr.cn-bj.ufileos.com/5b17dc99-606d-42c1-9f86-e09e88aaa822.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://imgkr.cn-bj.ufileos.com/6ca8185d-12c6-4550-bb4e-e49cfbf56db7.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://imgkr.cn-bj.ufileos.com/7cc3cf37-040a-420e-8ef9-d05e92c82cfd.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<center>\n<img src="https://imgkr.cn-bj.ufileos.com/02bc143e-e1a7-4b3c-bd5d-8d6d39139f0a.png" style="width: 50%;"></center>\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<center>\n <img src="https://imgkr.cn-bj.ufileos.com/1092dc45-e817-4bb0-82b0-2b2b4826ccf2.gif" style="width: 100px;">\n</center>\n\n',Ae=Te;o["default"].use(L["a"]);var Pe={wxRenderer:null,output:"",editor:null,cssEditor:null,html:"",currentFont:"",currentSize:"",currentColor:"",citeStatus:0},Be={setHtml:function(e,t){e.html=t},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)},initEditorState:function(e){e.currentFont=localStorage.getItem("fonts")||M.builtinFonts[0].value,e.currentColor=localStorage.getItem("color")||M.colorOption[1].value,e.currentSize=localStorage.getItem("size")||M.sizeOption[2].value,e.citeStatus="true"===localStorage.getItem("citeStatus"),e.wxRenderer=new Fe({theme:F(e.currentColor),fonts:e.currentFont,size:e.currentSize,status:e.citeStatus})},initEditorEntity:function(e){e.editor=b.a.fromTextArea(document.getElementById("editor"),{value:"",mode:"text/x-markdown",theme:"xq-light",lineNumbers:!1,lineWrapping:!0,styleActiveLine:!0,autoCloseBrackets:!0}),localStorage.getItem("__editor_content")?e.editor.setValue(localStorage.getItem("__editor_content")):e.editor.setValue(Ae)},initCssEditorEntity:function(e){e.cssEditor=b.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})}}}),localStorage.getItem("__css_content")?e.cssEditor.setValue(localStorage.getItem("__css_content")):e.cssEditor.setValue(N)},editorRefresh:function(e){var t=Re()(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){e.editor.setValue(Ae),e.cssEditor.setValue(N)}},Ge=new L["a"].Store({state:Pe,mutations:Be,actions:{},modules:{}}),Ie=n("5c96"),$e=n.n(Ie);n("0fae");o["default"].use(Ie["Container"]),o["default"].use(Ie["Header"]),o["default"].use(Ie["Upload"]),o["default"].use(Ie["Tooltip"]),o["default"].use(Ie["Form"]),o["default"].use(Ie["FormItem"]),o["default"].use(Ie["Select"]),o["default"].use(Ie["Option"]),o["default"].use(Ie["ColorPicker"]),o["default"].use(Ie["Switch"]),o["default"].use(Ie["Button"]),o["default"].use(Ie["Main"]),o["default"].use(Ie["Col"]),o["default"].use(Ie["Row"]),o["default"].use(Ie["Dialog"]),o["default"].use(Ie["Loading"]),o["default"].component(Ie["Message"].name,Ie["Message"]),o["default"].prototype.$loading=Ie["Loading"].service,o["default"].prototype.$message=Ie["Message"];n("a7be"),n("0f7c"),n("f6b6"),n("8d7e");o["default"].use($e.a),o["default"].config.productionTip=!1,new o["default"]({router:Ee,store:Ge,render:function(e){return e(be)}}).$mount("#app")},"72bb":function(e,t,n){"use strict";var o=n("0e52"),i=n.n(o);i.a},"869e":function(e,t,n){"use strict";var o=n("3edb"),i=n.n(o);i.a}});
|
||
//# sourceMappingURL=app.64660052.js.map
|