From 79fbaf8a92e45ac02d2d31c736f1d25a4f8c9ca2 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Thu, 30 Jul 2020 07:16:49 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20=20@=20a5a25?= =?UTF-8?q?4c0d1dbf88050f5c4cda7fcf14b6ec9e8c1=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/app.3493efb8.css | 2 ++ index.html | 2 +- js/app.edd2f8ff.js | 4 ++++ js/app.edd2f8ff.js.map | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 css/app.3493efb8.css create mode 100644 js/app.edd2f8ff.js create mode 100644 js/app.edd2f8ff.js.map diff --git a/css/app.3493efb8.css b/css/app.3493efb8.css new file mode 100644 index 0000000..cf3e868 --- /dev/null +++ b/css/app.3493efb8.css @@ -0,0 +1,2 @@ +.loading-wrapper[data-v-31c61828]{position:fixed;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.loading[data-v-31c61828]{text-align:center;position:fixed;width:100%;height:100%;overflow:hidden;z-index:99999;background-color:#f2f2f2}.loading_night[data-v-31c61828]{background-color:#303133}.loading-text[data-v-31c61828]{font-size:18px;font-weight:700;margin-top:26px;color:#303133}.loading-anim[data-v-31c61828]{display:inline-block;width:100px;height:100px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAABHPGVmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAAt1BMVEX///8AAABIz0hHzkdIzkhIz0hIz0hHzkdIzkhFz0VAz0BHzUdIz0hHzkdIzkhIzUhHzUdHzUdIzkhEzEREzERGz0ZIz0hHzUdIzkhIzUhHzkdHzkdHzUdGz0ZIzkhHzkdKzkpIzUhGzUZD00NIzUhGzUZIzkhIzkhHzkdHzkdIzkhHz0dIzUhK1UpHzUdC0EJHzkdHzkdIz0hH1UdHzUdGzkZIzUhJ20lD10NJzklIzkhIzkj////r6/fCAAAAO3RSTlMAACDvoEBg0MAwEI9fz9+A8JDgDx5Ff/r9i+VdbHSDkx9RTRdce+6q6brLb58YSBvtd0oScFTxBxM/v5xq7LMAAAABYktHRACIBR1IAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4wwcCBssFsYwawAAAe9JREFUaN7t2tlywiAUBmABiQY1W6vWbna1i6Z2sYs97/9eNcQ6U40kEMhoh/824qeAxwSo1Wx2MUgimAAQLNNCAanDInWzCAUeahRxUsQx212NxGgaHhMq21sqCHIpdZFpRDoW2ROEtdpY/S1xu8XyEdZZ/BA8VcNbNO6wPIQbAK6akZa2v0rWN0mLk6+G+Gnr3O5qgnR1EjfOQviHCRS7yw02uyELwWGkbHAlCnGR3wkuM4WxLSuGkQNfmLYW5BDE8fUgXcHVXv9oYB45PoGBeQSd5ioaEHSWp+hA0DkMzSNoKFZKI78zuWsQuaA8l3BlEFnm2iL/FrlpZqanFbntZxmjO73IfdbVh31ERjQjj1LImEyYGMn+9xUjbELGKyRObviJI57CTzBdu/b8Ip7CDkkeQuIlQrffY5dB0rtvuqvINHnpqwISR8nTQsExSWbVW7ExSZ4jong1u2ZByJDu7kKsHszkCqQCIl+FLbKLyPtaefwwgWxEP2LvVixiEYtoQgqlHPJJC+XLLqoZRsyvpuKJB0R9XZiA18pfF+Yr3KqKS4qtcFeyVl/FrgNrlN8/aeTun3AlUh34aMPYsqcVOmWmsBMyW1Ysooi487nx/fhKThbwDdVvs0glpz0qObdSyQkchAOAQOUskU3h/AAe7qmqtAqp/QAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOS0xMi0yOFQwODoyNzo0NCswMDowMPJYdAwAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTktMTItMjhUMDg6Mjc6NDQrMDA6MDCDBcywAAAAAElFTkSuQmCC) no-repeat;background-size:cover}.dialog-footer[data-v-7cee040c],.reset__dialog[data-v-7cee040c],.text[data-v-7cee040c]{text-align:center}.editor__header[data-v-0c8ec6c5]{width:100%}.header__item[data-v-0c8ec6c5]{margin:0 3px}.header__item_last[data-v-0c8ec6c5]{margin-right:8px}.header__switch[data-v-0c8ec6c5]{margin-left:8px}.mode__switch[data-v-0c8ec6c5]{margin-left:24px;width:24px;height:24px;background:url(../img/night.8bc3a963.png) no-repeat;background-size:cover;-webkit-transition:all .3s;transition:all .3s}.mode__switch_black[data-v-0c8ec6c5]{background:url(../img/light.f7a977db.png) no-repeat;background-size:cover}.top[data-v-0c8ec6c5]{margin-right:0}.tb-options{margin-bottom:20px}.head-style .el-input__inner{background-color:#f2f2f2}.menu[data-v-663dfa9d]{position:absolute;padding:6px 0;border-radius:4px;border:1px solid #aaa;background-color:#fff;z-index:9999}.menu_item[data-v-663dfa9d]{margin-top:10px;min-width:125px;font-size:14px;line-height:20px;color:#303133;cursor:pointer}.menu_item[data-v-663dfa9d]:first-of-type{margin-top:0}.menu_item[data-v-663dfa9d]:hover{color:#fff;background:#8b9294}.menu_item .btn-upload[data-v-663dfa9d],.menu_item span[data-v-663dfa9d]{text-align:center;display:inline-block;padding:4px 0;width:100%}.menu_item .btn-upload[data-v-663dfa9d]{margin:0;border:none;outline:none;background:transparent}.menu_item .btn-upload[data-v-663dfa9d]:hover{color:#fff;background:#8b9294}.menu_item[data-v-663dfa9d] .el-upload{width:100%}li[data-v-663dfa9d]:hover{background-color:#1790ff;color:#fff}li[data-v-663dfa9d]{font-size:15px;list-style:none}.main-body[data-v-b985330a]{padding-top:12px;overflow:hidden}.el-main[data-v-b985330a]{padding:0;margin:20px;margin-top:0}.container[data-v-b985330a],.el-main[data-v-b985330a]{-webkit-transition:all .3s;transition:all .3s}.preview[data-v-b985330a]{-webkit-transition:background 0s;transition:background 0s;-webkit-transition-delay:.2s;transition-delay:.2s}.preview-wrapper_night[data-v-b985330a]{overflow-y:inherit;position:relative;left:-3px}.preview-wrapper_night .preview[data-v-b985330a]{background-color:#fff}#output-wrapper[data-v-b985330a]{position:relative}.loading-mask[data-v-b985330a]{top:50%;width:376px;height:101%;padding-top:1px;font-size:15px;color:grey;background-color:#1e1e1e}.loading-mask .loading__img[data-v-b985330a],.loading-mask[data-v-b985330a]{position:absolute;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.loading-mask .loading__img[data-v-b985330a]{top:330px;width:50px;height:50px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAABHPGVmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAAt1BMVEX///8AAABIz0hHzkdIzkhIz0hIz0hHzkdIzkhFz0VAz0BHzUdIz0hHzkdIzkhIzUhHzUdHzUdIzkhEzEREzERGz0ZIz0hHzUdIzkhIzUhHzkdHzkdHzUdGz0ZIzkhHzkdKzkpIzUhGzUZD00NIzUhGzUZIzkhIzkhHzkdHzkdIzkhHz0dIzUhK1UpHzUdC0EJHzkdHzkdIz0hH1UdHzUdGzkZIzUhJ20lD10NJzklIzkhIzkj////r6/fCAAAAO3RSTlMAACDvoEBg0MAwEI9fz9+A8JDgDx5Ff/r9i+VdbHSDkx9RTRdce+6q6brLb58YSBvtd0oScFTxBxM/v5xq7LMAAAABYktHRACIBR1IAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4wwcCBssFsYwawAAAe9JREFUaN7t2tlywiAUBmABiQY1W6vWbna1i6Z2sYs97/9eNcQ6U40kEMhoh/824qeAxwSo1Wx2MUgimAAQLNNCAanDInWzCAUeahRxUsQx212NxGgaHhMq21sqCHIpdZFpRDoW2ROEtdpY/S1xu8XyEdZZ/BA8VcNbNO6wPIQbAK6akZa2v0rWN0mLk6+G+Gnr3O5qgnR1EjfOQviHCRS7yw02uyELwWGkbHAlCnGR3wkuM4WxLSuGkQNfmLYW5BDE8fUgXcHVXv9oYB45PoGBeQSd5ioaEHSWp+hA0DkMzSNoKFZKI78zuWsQuaA8l3BlEFnm2iL/FrlpZqanFbntZxmjO73IfdbVh31ERjQjj1LImEyYGMn+9xUjbELGKyRObviJI57CTzBdu/b8Ip7CDkkeQuIlQrffY5dB0rtvuqvINHnpqwISR8nTQsExSWbVW7ExSZ4jong1u2ZByJDu7kKsHszkCqQCIl+FLbKLyPtaefwwgWxEP2LvVixiEYtoQgqlHPJJC+XLLqoZRsyvpuKJB0R9XZiA18pfF+Yr3KqKS4qtcFeyVl/FrgNrlN8/aeTun3AlUh34aMPYsqcVOmWmsBMyW1Ysooi487nx/fhKThbwDdVvs0glpz0qObdSyQkchAOAQOUskU3h/AAe7qmqtAqp/QAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOS0xMi0yOFQwODoyNzo0NCswMDowMPJYdAwAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTktMTItMjhUMDg6Mjc6NDQrMDA6MDCDBcywAAAAAElFTkSuQmCC) no-repeat;background-size:cover}.loading-mask span[data-v-b985330a]{position:absolute;left:50%;top:390px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.bounceInRight[data-v-b985330a]{-webkit-animation-name:bounceInRight-data-v-b985330a;animation-name:bounceInRight-data-v-b985330a;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes bounceInRight-data-v-b985330a{0%,60%,75%,90%,to{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes bounceInRight-data-v-b985330a{0%,60%,75%,90%,to{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}.cm-s-style-mirror.CodeMirror{background:#f5f5f5;color:#444;font-size:16px;padding:20px;line-height:25px}.cm-s-style-mirror div.CodeMirror-selected{background:#e0e0e0}.cm-s-style-mirror .CodeMirror-line::selection,.cm-s-style-mirror .CodeMirror-line>span::selection,.cm-s-style-mirror .CodeMirror-line>span>span::selection{background:#e0e0e0}.cm-s-style-mirror .CodeMirror-line::-moz-selection,.cm-s-style-mirror .CodeMirror-line>span::-moz-selection,.cm-s-style-mirror .CodeMirror-line>span>span::-moz-selection{background:#e0e0e0}.cm-s-style-mirror .CodeMirror-gutters{background:#f5f5f5;border-right:0}.cm-s-style-mirror .CodeMirror-guttermarker{color:#ac4142}.cm-s-style-mirror .CodeMirror-guttermarker-subtle,.cm-s-style-mirror .CodeMirror-linenumber{color:#b0b0b0}.cm-s-style-mirror .CodeMirror-cursor{border-left:1px solid #505050}.cm-s-style-mirror span.cm-comment{color:green}.cm-s-style-mirror span.cm-atom,.cm-s-style-mirror span.cm-number{color:#aa759f}.cm-s-style-mirror span.cm-attribute,.cm-s-style-mirror span.cm-property{color:#90a959}.cm-s-style-mirror span.cm-keyword{color:#023a52}.cm-s-style-mirror span.cm-string{color:#e46918}.cm-s-style-mirror span.cm-variable{color:#90a959}.cm-s-style-mirror span.cm-variable-2{color:#00695f}.cm-s-style-mirror span.cm-variable-3{color:#2e6e8a}.cm-s-style-mirror span.cm-def{color:#d28445}.cm-s-style-mirror span.cm-bracket{color:#202020}.cm-s-style-mirror span.cm-tag{color:#000}.cm-s-style-mirror span.cm-link{color:#b26a00}.cm-s-style-mirror span.cm-error{text-decoration:underline;-webkit-text-decoration-style:wavy;text-decoration-style:wavy;-webkit-text-decoration-color:#df8d8e;text-decoration-color:#df8d8e}.cm-s-style-mirror .CodeMirror-activeline-background{background:#dddcdc}.cm-s-style-mirror .CodeMirror-matchingbracket{color:#202020!important;background-color:rgba(0,0,0,.1)!important} +/*! Color themes for Google Code Prettify | MIT License | github.com/jmblog/color-themes-for-google-code-prettify */.prettyprint{font-family:Menlo,Bitstream Vera Sans Mono,DejaVu Sans Mono,Monaco,Consolas,monospace;border:0!important}.pln{color:#333}ol.linenums{margin-top:0;margin-bottom:0;color:#ccc}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{padding-left:1em;background-color:#fff;list-style-type:decimal}@media screen{.str{color:#183691}.kwd{color:#a71d5d}.com{color:#969896}.lit,.typ{color:#0086b3}.clo,.opn,.pun{color:#333}.tag{color:navy}.atn{color:#795da3}.atv{color:#183691}.dec{color:#333}.var{color:teal}.fun{color:#900}}.rich_media_content .code-snippet *,.rich_media_content .code-snippet__wechat *{max-width:1000%!important}.code-snippet__wechat{word-wrap:break-word!important;font-size:14px;margin:10px 8px;color:#333;position:relative;background-color:rgba(27,31,35,.05);border:1px solid #f0f0f0;border-radius:2px;display:-webkit-box;display:-ms-flexbox;display:flex;line-height:24px}.code-snippet__wechat .code-snippet__line-index{counter-reset:line;-ms-flex-negative:0;flex-shrink:0;height:100%;padding:1em;list-style-type:none}.code-snippet__wechat .code-snippet__line-index li{list-style-type:none;text-align:right}.code-snippet__wechat .code-snippet__line-index li:before{min-width:1.5em;text-align:right;left:-2.5em;counter-increment:line;content:counter(line);display:inline;color:rgba(0,0,0,.15)}.code-snippet__wechat pre{overflow-x:auto;padding:1em 1em 1em 1em;white-space:normal;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-overflow-scrolling:touch}.code-snippet__wechat code{text-align:left;font-size:14px;white-space:pre;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;font-family:Consolas,Liberation Mono,Menlo,Courier,monospace}.code-snippet__wechat ul li{list-style:none}.code-snippet__github{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;margin:10px 8px;position:relative;height:auto;background-color:rgba(27,31,35,.05)}.code-snippet__github .code-snippet__line-index{display:none}.code-snippet__github .code__pre{display:grid;position:relative;counter-reset:line;overflow-x:auto;padding:1em;white-space:normal;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:20px;font-family:Operator Mono,Consolas,Monaco,Menlo,monospace;-webkit-overflow-scrolling:touch}.code-snippet__github pre{display:inline-block;font-size:12px}.code-snippet__github code{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;padding-right:8px;text-align:left;white-space:pre;font-family:Consolas,Liberation Mono,Menlo,Courier,monospace}.code-snippet__github code:before{display:none}.code-snippet__github ul li{list-style:none}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}button,input,textarea{font-family:inherit}h1,h2,h3,h4,h5,h6{font-weight:400}em{font-style:normal!important}body,html{height:100%;font-family:PingFang SC,BlinkMacSystemFont,Roboto,Helvetica Neue,sans-serif}.el-message__icon{display:none}.container{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.container,.top{display:-webkit-box;display:-ms-flexbox;display:flex}.top{height:60px;padding:10px 20px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:20px}.web-title{margin:0 15px 0 5px}.web-icon{width:auto;height:1.5rem;vertical-align:middle}#editor{display:block;border:none;width:100%;padding:10px}#editor,section{height:100%}.main-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-top:0;padding-bottom:10px}.ctrl{-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1}.ctrl,.preview-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.preview-wrapper{-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);padding:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;overflow:scroll;word-break:break-all}.main-section{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%}.hint{opacity:.6;margin:20px 0}.preview{margin:0 -20px;width:375px;padding:20px;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;outline:none;-webkit-box-shadow:0 0 60px rgba(0,0,0,.1);box-shadow:0 0 60px rgba(0,0,0,.1)}.preview table{margin-bottom:10px;border-collapse:collapse;display:table;width:100%!important}.select-item-left{float:left}.select-item-right{float:right;color:#8492a6;font-size:13px}.CodeMirror{height:100%!important;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);font-size:14px;padding:20px;width:100%!important;font-family:PingFang SC,BlinkMacSystemFont,Roboto,Helvetica Neue,sans-serif!important}.el-form-item{margin-bottom:0!important}.el-tooltip{cursor:pointer}::-webkit-scrollbar{width:6px;height:6px;background-color:#fff}::-webkit-scrollbar-track{border-radius:6px;background-color:hsla(0,0%,78.4%,.3)}::-webkit-scrollbar-thumb{border-radius:6px;-webkit-transition:background-color .3s;transition:background-color .3s}::-webkit-scrollbar-thumb,::-webkit-scrollbar-thumb:hover{background-color:rgba(144,146,152,.5)}.CodeMirror-vscrollbar:focus{outline:none}.CodeMirror-scroll,.preview-wrapper{overflow:unset;overflow-y:scroll}.fade-enter[data-v-6f36a3b6],.fade-leave-to[data-v-6f36a3b6]{opacity:0}.fade-enter-to[data-v-6f36a3b6],.fade-leave[data-v-6f36a3b6]{opacity:1}.fade-enter-active[data-v-6f36a3b6],.fade-leave-active[data-v-6f36a3b6]{-webkit-transition:all 1s;transition:all 1s}.container_night,.container_night .el-main{background-color:#333}.container_night .CodeMirror{caret-color:grey;color:grey;background-color:#1e1e1e;-webkit-box-shadow:inset 0 0 0 1px rgba(100,37,37,.102);box-shadow:inset 0 0 0 1px rgba(100,37,37,.102)}.container_night .output_night .preview{background-color:#1e1e1e;-webkit-box-shadow:0 0 70px rgba(0,0,0,.3);box-shadow:0 0 70px rgba(0,0,0,.3)}.container_night .output_night .preview-wrapper{background-color:#1e1e1e;-webkit-box-shadow:inset 0 0 0 1px hsla(0,4.3%,91%,.102);box-shadow:inset 0 0 0 1px hsla(0,4.3%,91%,.102)}.container_night .output_night .code-snippet__fix{background-color:#eee}.container_night .cm-s-style-mirror .CodeMirror-matchingbracket{color:#fff!important;background:#1e1e1e!important}.container_night .cm-s-style-mirror span.cm-tag,.container_night .cm-s-xq-light span.cm-variable-2{color:grey}.container_night .cm-s-xq-light .CodeMirror-activeline-background{background-color:transparent}.container_night .cm-s-xq-light span.cm-string{color:#8e9eb9}.container_night .cm-s-xq-light span.cm-link{color:#84868b}.container_night .editor__header{background-color:#3c3c3c}.container_night .el-button{color:#fff;background-color:#1e1e1e;border:1px solid transparent}.container_night .el-button.is-plain:focus,.container_night .el-button.is-plain:hover{background:#1e1e1e;color:#fff;border:1px solid #fff}.container_night .el-button.is-plain:focus i,.container_night .el-button.is-plain:hover i{color:#fff}.container_night .about__dialog .el-dialog,.container_night .insert__dialog .el-dialog,.container_night .reset__dialog .el-dialog{background-color:#333}.container_night .about__dialog .el-dialog__body,.container_night .about__dialog .el-dialog__title,.container_night .about__dialog .el-form-item__label,.container_night .el-icon-download,.container_night .el-icon-refresh,.container_night .el-icon-s-grid,.container_night .insert__dialog .el-dialog__body,.container_night .insert__dialog .el-dialog__title,.container_night .insert__dialog .el-form-item__label,.container_night .reset__dialog .el-dialog__body,.container_night .reset__dialog .el-dialog__title,.container_night .reset__dialog .el-form-item__label,.container_night /deep/ .el-icon-upload{color:#fff}.container_night ::-webkit-scrollbar{background-color:#1e1e1e} \ No newline at end of file diff --git a/index.html b/index.html index 8d3fe79..d8d8fa8 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.edd2f8ff.js b/js/app.edd2f8ff.js new file mode 100644 index 0000000..868b958 --- /dev/null +++ b/js/app.edd2f8ff.js @@ -0,0 +1,4 @@ +(function(e){function t(t){for(var o,s,a=t[0],c=t[1],l=t[2],d=0,f=[];d0}));r=i(r);var s=e.substring(0,t).split(",").map((function(e){return e.trim()}));s.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 S(e,t){var n=e.getValue(0);n?localStorage.setItem(t,n):localStorage.removeItem(t)}function E(e){var t=g.a.format(e,{parser:"markdown",plugins:[b.a]});return t}function O(){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 R(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)}n("b0c0");var T=n("bc3a"),j=n.n(T),M=j.a.create({baseURL:"",timeout:1e4});M.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)})),M.interceptors.response.use((function(e){return e.data.success?e.data:Promise.reject(e.data)}),(function(e){return Promise.reject(e)}));var z=M;function $(e){return z({url:"https://imgkr.com/api/files/upload",method:"post",data:e})}var F={fileUpload:$};function P(e){return new Promise((function(t,n){var o=A(e);if(o)n(o);else{var i=new FormData;i.append("file",e),F.fileUpload(i).then((function(e){t(e)})).catch((function(e){console.log(e.message)}))}}))}function A(e){return/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(e.name)?e.size>5242880&&"由于公众号限制,图片大小不能超过 5.0M":"请上传 JPG/PNG/GIF 格式的图片"}var D=n("466b"),N=n.n(D);function V(){for(var e=document.getElementById("output"),t=e.getElementsByTagName("img"),n=0;n1?i-1:i;1===i?o.push("---\t"):o.push(this.tableData["k_".concat(s,"_").concat(r)]||"")}n+=o.join("\t|\t"),n+="\t|\n"}this.tableData={},this.rowNum=1,this.colNum=1,this.editor.replaceSelection("\n".concat(n,"\n"),"end"),this.$emit("input",!1),this.editorRefresh()}},Object(J["b"])(["editorRefresh"])),{},{handleChange:function(e,t){}})}),de=ue,fe=(n("6f0c"),Object(K["a"])(de,ce,le,!1,null,null,null)),pe=fe.exports,he=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ul",{directives:[{name:"show",rawName:"v-show",value:e.value,expression:"value"}],staticClass:"menu",style:"left: "+e.left+"px;top: "+e.top+"px;",attrs:{id:"menu"}},e._l(e.list,(function(t){return n("li",{key:t.key,staticClass:"menu_item",on:{mousedown:function(n){return e.onMouseDown(t.key)}}},["insertPic"===t.key?n("el-upload",{staticClass:"li__upload",attrs:{action:"","show-file-list":!1,multiple:!0,accept:".jpg,.jpeg,.png,.gif",name:"file","before-upload":e.beforeUpload}},[n("button",{staticClass:"btn-upload"},[e._v(e._s(t.text))])]):n("span",[e._v(e._s(t.text))])],1)})),0)},ge=[],me=(n("a9e3"),{props:{value:{type:Boolean,default:!1},top:{type:Number,default:0},left:{type:Number,default:0}},data:function(){return{list:[{text:"上传图片",key:"insertPic"},{text:"插入表格",key:"insertTable"},{text:"页面重置",key:"pageReset"},{text:"下载MD文档",key:"downLoad"}]}},methods:{closeCB:function(){this.$emit("input",!1)},beforeUpload:function(e){var t=this;return P(e).then((function(e){t.$emit("menuTick","insertPic",e)})).catch((function(e){t.$message({showClose:!0,message:e,type:"error"})})),!1},onMouseDown:function(e){"insertPic"==e?document.querySelector(".li__upload button").click():this.$emit("menuTick",e),this.$emit("closeMenu",!1)}}}),be=me,ve=(n("e6ba"),Object(K["a"])(be,he,ge,!1,null,"663dfa9d",null)),Ce=ve.exports;n("f9d4");var ke={data:function(){return{showCssEditor:!1,aboutDialogVisible:!1,dialogFormVisible:!1,isCoping:!1,isImgLoading:!1,backLight:!1,timeout:null,changeTimer:null,source:"",mouseLeft:0,mouseTop:0}},components:{editorHeader:te,aboutDialog:ae,insertFormDialog:pe,rightClickMenu:Ce},computed:Object(l["a"])({},Object(J["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(),S(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(),S(e.cssEditor,"__css_content")}))},cssChanged:function(){var e=_(this.cssEditor.getValue(0)),t=x(this.currentSize.replace("px",""));t=y(e,this.currentColor,t),this.setWxRendererOptions({theme:t}),this.onEditorRefresh()},uploaded:function(e){if(e&&e.success){var t=this.editor.getCursor(),n=e.data,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 s=i.scrollTop/(i.scrollHeight-i.offsetHeight),a=s*(r.scrollHeight-r.offsetHeight);r.scrollTo(0,a)},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(){R(this.editor.getValue(0))},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){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};switch(e){case"pageReset":this.$refs.header.showResetConfirm=!0;break;case"insertPic":this.uploaded(t);break;case"downLoad":this.downloadEditorContent();break;case"insertTable":this.dialogFormVisible=!0;default:break}}},Object(J["b"])(["initEditorState","initEditorEntity","setWxRendererOptions","editorRefresh","initCssEditorEntity"])),mounted:function(){var e=this;setTimeout((function(){e.leftAndRightScroll(),PR.prettyPrint()}),300)}},we=ke,xe=(n("c9cc"),n("85fe"),Object(K["a"])(we,a,c,!1,null,"b985330a",null)),ye=xe.exports,_e={name:"App",components:{Loading:s["default"],CodemirrorEditor:ye},data:function(){return{loading:!0}},mounted:function(){var e=this;setTimeout((function(){e.loading=!1}),100)}},Se=_e,Ee=(n("c95f"),Object(K["a"])(Se,i,r,!1,null,"6f36a3b6",null)),Oe=Ee.exports,Re=n("e0c1"),Te=n.n(Re),je=function(e){var t=this;this.opts=e;var n=!0,o=[],i=0,r=null,s="Menlo, Operator Mono, Consolas, Monaco, monospace",a=function(e,t){return Object.assign({},e,t)};this.buildTheme=function(e){var n={},o=a(e.BASE,{"font-family":t.opts.fonts,"font-size":t.opts.size}),i=a(o,{});for(var r in e.inline)if(e.inline.hasOwnProperty(r)){var c=e.inline[r];"codespan"===r&&(c["font-family"]=s,c["white-space"]="normal"),n[r]=a(o,c)}for(var l in e.block)if(e.block.hasOwnProperty(l)){var u=e.block[l];"code"===l&&(u["font-family"]=s),n[l]=a(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]?'['.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){t.opts=a(t.opts,e)},this.hasFootnotes=function(){return 0!==o.length},this.getRenderer=function(e){o=[],i=0,r=t.buildTheme(t.opts.theme);var s=new Te.a.Renderer;return s.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,"

")}},s.paragraph=function(e){return-1!=e.indexOf("").concat(e,"

")},s.blockquote=function(e){return e=e.replace(//g,"

")),"

").concat(e,"
")},s.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 ")},s.codespan=function(e,t){return"").concat(e,"")},s.listitem=function(e){return"<%s/>').concat(e,"")},s.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,"

")},s.image=function(e,t,o){var i="";o&&(i="
").concat(o,"
"));var r=c("figure"),s=c(n?"image":"image_org");return"
').concat(o,'').concat(i,"
")},s.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=l(n||o,t);return"").concat(o,"[").concat(i,"]")},s.strong=function(e){return"").concat(e,"")},s.em=function(e){return''.concat(e,"")},s.table=function(e,t){return'
").concat(e,"").concat(t,"
")},s.tablecell=function(e,t){return"").concat(e,"")},s.hr=function(){return'
'},s}},Me=je,ze=n("56b3"),$e=n.n(ze),Fe='# 示例文章: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
\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',Pe=Fe;o["default"].use(J["a"]);var Ae={wxRenderer:null,output:"",html:"",editor:null,cssEditor:null,currentFont:"",currentSize:"",currentColor:"",citeStatus:0,nightMode:!1,codeTheme:"github",rightClickMenuVisible:!1},De={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},initEditorState:function(e){e.currentFont=localStorage.getItem("fonts")||G.builtinFonts[0].value,e.currentColor=localStorage.getItem("color")||G.colorOption[1].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.wxRenderer=new Me({theme:w(e.currentColor),fonts:e.currentFont,size:e.currentSize,status:e.citeStatus})},initEditorEntity:function(e){e.editor=$e.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(e.getValue(0));localStorage.setItem("__editor_content",t),e.setValue(t)}}}),e.editor.setValue(localStorage.getItem("__editor_content")||E(Pe))},initCssEditorEntity:function(e){e.cssEditor=$e.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})}}}),e.cssEditor.setValue(localStorage.getItem("__css_content")||B)},editorRefresh:function(e){var t=Te()(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=E(Pe);e.editor.setValue(t),e.cssEditor.setValue(B)}},Ne=new J["a"].Store({state:Ae,mutations:De,actions:{},modules:{}}),Ve=n("5c96"),Ie=n.n(Ve);n("0fae");o["default"].use(Ve["Container"]),o["default"].use(Ve["Header"]),o["default"].use(Ve["Upload"]),o["default"].use(Ve["Tooltip"]),o["default"].use(Ve["Form"]),o["default"].use(Ve["FormItem"]),o["default"].use(Ve["Select"]),o["default"].use(Ve["Option"]),o["default"].use(Ve["ColorPicker"]),o["default"].use(Ve["Switch"]),o["default"].use(Ve["Button"]),o["default"].use(Ve["Main"]),o["default"].use(Ve["Col"]),o["default"].use(Ve["Row"]),o["default"].use(Ve["Dialog"]),o["default"].use(Ve["Loading"]),o["default"].component(Ve["Message"].name,Ve["Message"]),o["default"].prototype.$loading=Ve["Loading"].service,o["default"].prototype.$message=Ve["Message"];n("a7be"),n("0f7c"),n("8d7e"),n("7b00"),n("959b"),n("8c33"),n("31c5"),n("9b74"),n("111b"),n("90ba"),n("baa5");(function(){$e.a.extendMode("css",{commentStart:"/*",commentEnd:"*/",newlineAfterToken:function(e,t){return/^[;{}]$/.test(t)}}),$e.a.defineExtension("commentRange",(function(e,t,n){var o=this,i=$e.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),s=r.indexOf(i.commentStart),a=r.lastIndexOf(i.commentEnd);s>-1&&a>-1&&a>s&&(r=r.substr(0,s)+r.substring(s+i.commentStart.length,a)+r.substr(a+i.commentEnd.length)),o.replaceRange(r,t,n)}}))})),$e.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")}))})),$e.a.defineExtension("autoFormatRange",(function(e,t){var n=this,o=n.getMode(),i=n.getRange(e,t).split("\n"),r=$e.a.copyState(o,n.getTokenAt(e).state),s=n.getOption("tabSize"),a="",c=0,l=0==e.ch;function u(){a+="\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(Ge["a"])(e)&&null!=e[n]?e[n]:t[n]}e.defineOption("autoCloseBrackets",!1,(function(t,n,s){s&&s!=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=s[c].head;t.replaceRange("",n(u.line,u.ch-1),n(u.line,u.ch+1),"+delete")}}function l(t){var n=a(t),i=n&&o(n,"explode");if(!i||t.getOption("disableInput"))return e.Pass;for(var r=t.listSelections(),s=0;s0;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=a(t);if(!r||t.getOption("disableInput"))return e.Pass;var s=o(r,"pairs"),c=s.indexOf(i);if(-1==c)return e.Pass;for(var l,d=o(r,"closeBefore"),f=o(r,"triples"),h=s.charAt(c+1)==i,g=t.listSelections(),m=c%2==0,b=0;b1&&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(h){var x=0==k.ch?" ":t.getRange(n(k.line,k.ch-1),k);if(e.isWordChar(w)||x==i||e.isWordChar(x))return e.Pass;v="both"}else{if(!m||!(0===w.length||/\s/.test(w)||d.indexOf(w)>-1))return e.Pass;v="both"}else v=h&&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?s.charAt(c-1):i,_=c%2?i:s.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 && css.indexOf('{') !== -1 && css.indexOf('}') !== -1) {\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/**\n * 将编辑器内容保存到 LocalStorage\n * @param {*} editor \n * @param {*} name \n */\nexport function saveEditorContent(editor, name) {\n const content = editor.getValue(0)\n\n if (content) {\n localStorage.setItem(name, content)\n } else {\n localStorage.removeItem(name)\n }\n}\n\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\n if (preDomList.length > 0) {\n preDomList.forEach(pre=> {\n pre.style.whiteSpace = value;\n })\n }\n}\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}","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 }, error => {\n Promise.reject(error);\n }\n);\n\nservice.interceptors.response.use(res => {\n return res.data.success ? res.data : Promise.reject(res.data);\n}, error => Promise.reject(error));\n\nexport default service;","import fetch from './fetch';\n\n\nfunction fileUpload(data) {\n return fetch({\n url: 'https://imgkr.com/api/files/upload',\n method: 'post',\n data: data\n })\n}\n\n\nexport default {\n fileUpload\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 } else {\n let fd = new FormData();\n \n fd.append('file', file);\n fileApi.fileUpload(fd).then(res => {\n resolve(res);\n }).catch(err => {\n console.log(err.message)\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}","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(\n html, {\n inlinePseudoElements: true,\n preserveImportant: true\n }\n );\n return res;\n}\n","export default {\n builtinFonts: [{\n label: '无衬线',\n value: '-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: \"Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif\"\n }\n ],\n sizeOption: [{\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 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`/*\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","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=7cee040c&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=7cee040c&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 \"7cee040c\",\n null\n \n)\n\nexport default component.exports","\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=0c8ec6c5&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=0c8ec6c5&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 \"0c8ec6c5\",\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://imgkr.cn-bj.ufileos.com/09f8e662-42ed-4731-a0d7-419deb74dfb6.png\"}})]),_c('span',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{attrs:{\"type\":\"success\",\"plain\":\"\"},on:{\"click\":function($event){return _vm.onRedirect('https://github.com/doocs/md')}}},[_vm._v(\"GitHub 仓库\")]),_c('el-button',{attrs:{\"type\":\"success\",\"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\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=480586b0&scoped=true&\"\nimport script from \"./aboutDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./aboutDialog.vue?vue&type=script&lang=js&\"\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 \"480586b0\",\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',{attrs:{\"span\":6}},[_vm._v(\" 行: \"),_c('el-input-number',{attrs:{\"controls-position\":\"right\",\"min\":1,\"max\":100,\"size\":\"small\"},on:{\"change\":function($event){return _vm.handleChange($event,'row')}},model:{value:(_vm.rowNum),callback:function ($$v) {_vm.rowNum=$$v},expression:\"rowNum\"}})],1),_c('el-col',{attrs:{\"span\":6}},[_vm._v(\" 列: \"),_c('el-input-number',{attrs:{\"controls-position\":\"right\",\"min\":1,\"max\":100,\"size\":\"small\"},on:{\"change\":function($event){return _vm.handleChange($event,'col')}},model:{value:(_vm.colNum),callback:function ($$v) {_vm.colNum=$$v},expression:\"colNum\"}})],1)],1),_c('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","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=3bbb6e00&\"\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&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 null,\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.list),function(item){return _c('li',{key:item.key,staticClass:\"menu_item\",on:{\"mousedown\":function($event){return _vm.onMouseDown(item.key)}}},[(item.key === 'insertPic')?_c('el-upload',{staticClass:\"li__upload\",attrs:{\"action\":\"\",\"show-file-list\":false,\"multiple\":true,\"accept\":\".jpg,.jpeg,.png,.gif\",\"name\":\"file\",\"before-upload\":_vm.beforeUpload}},[_c('button',{staticClass:\"btn-upload\"},[_vm._v(_vm._s(item.text))])]):_c('span',[_vm._v(_vm._s(item.text))])],1)}),0)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\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=663dfa9d&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=663dfa9d&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 \"663dfa9d\",\n null\n \n)\n\nexport default component.exports","\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=b985330a&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=b985330a&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 \"b985330a\",\n null\n \n)\n\nexport default component.exports","\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=6f36a3b6&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=6f36a3b6&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 \"6f36a3b6\",\n null\n \n)\n\nexport default component.exports","import marked from 'marked';\nimport store from '../../../store/index';\nconst WxRenderer = function (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 = '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 if (ele === 'codespan') {\n style['font-family'] = CODE_FONT_FAMILY\n style['white-space'] = 'normal'\n }\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 (text.indexOf('${text}

`\n }\n\n renderer.blockquote = text => {\n text = text.replace(//g, `

`)\n return `

${text}
`\n }\n renderer.code = (text, lang) => {\n text = text.replace(//g, '>')\n const codeLines = text.split('\\n').map(line => `${(line || '
')}
`)\n const codeTheme = 'github'\n return `\n
\n
\n                        ${codeLines.join('')}\n                    
\n
\n `\n }\n renderer.codespan = (text, lang) => `${text}`\n renderer.listitem = text => `<%s/>${text}`\n\n renderer.list = (text, ordered, start) => {\n text = text.replace(/<\\/*p.*?>/g, '')\n let segments = text.split(`<%s/>`)\n if (!ordered) {\n text = segments.join('•')\n return `

${text}

`\n }\n text = segments[0]\n for (let i = 1; i < segments.length; i++) {\n text = text + i + '.' + segments[i]\n }\n return `

${text}

`\n }\n renderer.image = (href, title, text) => {\n let subText = ''\n if (text) {\n subText = `
${text}
`\n }\n let figureStyles = getStyles('figure')\n let imgStyles = getStyles(ENV_STRETCH_IMAGE ? 'image' : 'image_org')\n return `
\"${text}\"/${subText}
`\n }\n renderer.link = (href, title, text) => {\n if (href.indexOf('https://mp.weixin.qq.com') === 0) {\n return `${text}`\n }\n if (href === text || !status) {\n return text\n }\n let ref = addFootnote(title || text, href)\n return `${text}[${ref}]`\n }\n renderer.strong = text => `${text}`\n renderer.em = text => `${text}`\n renderer.table = (header, body) => `
${header}${body}
`\n // renderer.tablerow = (text) => `${text}`;\n renderer.tablecell = (text, flags) => `${text}`\n renderer.hr = () => `
`\n return renderer\n }\n}\nexport default WxRenderer\n","const DEFAULT_CONTENT =\n`# 示例文章: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
\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`\nexport default DEFAULT_CONTENT\n","import Vue from 'vue'\nimport Vuex from 'vuex'\nimport config from '../assets/scripts/config';\nimport WxRenderer from '../assets/scripts/renderers/wx-renderer'\nimport marked from 'marked'\nimport CodeMirror from 'codemirror/lib/codemirror'\nimport DEFAULT_CONTENT from '../assets/scripts/default-content'\nimport DEFAULT_CSS_CONTENT from '../assets/scripts/themes/default-theme-css'\nimport {\n setColor,\n formatDoc\n} from '../assets/scripts/util'\n\nVue.use(Vuex)\n\nconst state = {\n wxRenderer: null,\n output: '',\n html: '',\n editor: null,\n cssEditor: null,\n currentFont: '',\n currentSize: '',\n currentColor: '',\n citeStatus: 0,\n nightMode: false,\n codeTheme: 'github',\n rightClickMenuVisible: false\n};\nconst mutations = {\n setEditorValue(state, data) {\n state.editor.setValue(data)\n },\n setCssEditorValue(state, data) {\n state.cssEditor.setValue(data)\n },\n setWxRendererOptions(state, data) {\n state.wxRenderer.setOptions(data);\n },\n setCiteStatus(state, data) {\n state.citeStatus = data;\n localStorage.setItem('citeStatus', data)\n },\n setCurrentFont(state, data) {\n state.currentFont = data;\n localStorage.setItem('fonts', data)\n },\n setCurrentSize(state, data) {\n state.currentSize = data;\n localStorage.setItem('size', data)\n },\n setCurrentColor(state, data) {\n state.currentColor = data;\n localStorage.setItem('color', data)\n },\n setCurrentCodeTheme(state, data) {\n state.codeTheme = data;\n localStorage.setItem('codeTheme', data)\n },\n setRightClickMenuVisible(state, data) {\n state.rightClickMenuVisible = data;\n },\n themeChanged(state) {\n state.nightMode = !state.nightMode;\n },\n initEditorState(state) {\n state.currentFont = localStorage.getItem('fonts') || config.builtinFonts[0].value\n state.currentColor = localStorage.getItem('color') || config.colorOption[1].value\n state.currentSize = localStorage.getItem('size') || config.sizeOption[2].value\n state.codeTheme = localStorage.getItem('codeTheme') || config.codeThemeOption[0].value\n state.citeStatus = localStorage.getItem('citeStatus') === 'true'\n state.wxRenderer = new WxRenderer({\n theme: setColor(state.currentColor),\n fonts: state.currentFont,\n size: state.currentSize,\n status: state.citeStatus\n })\n },\n initEditorEntity(state) {\n state.editor = CodeMirror.fromTextArea(\n document.getElementById('editor'), {\n value: '',\n mode: 'text/x-markdown',\n theme: 'xq-light',\n lineNumbers: false,\n lineWrapping: true,\n styleActiveLine: true,\n autoCloseBrackets: true,\n extraKeys: {\n 'Ctrl-F': function autoFormat(editor) {\n const doc = formatDoc(editor.getValue(0))\n localStorage.setItem('__editor_content', doc)\n editor.setValue(doc)\n }\n }\n }\n )\n \n // 如果有编辑器内容被保存则读取,否则加载默认内容\n state.editor.setValue(localStorage.getItem('__editor_content') || formatDoc(DEFAULT_CONTENT))\n },\n initCssEditorEntity(state) {\n state.cssEditor = CodeMirror.fromTextArea(\n document.getElementById('cssEditor'), {\n value: '',\n mode: 'css',\n theme: 'style-mirror',\n lineNumbers: false,\n lineWrapping: true,\n matchBrackets: true,\n autofocus: true,\n extraKeys: {\n 'Ctrl-F': function autoFormat(editor) {\n const totalLines = editor.lineCount()\n editor.autoFormatRange({\n line: 0,\n ch: 0\n }, {\n line: totalLines\n })\n }\n }\n }\n )\n\n // 如果有编辑器内容被保存则读取,否则加载默认内容\n state.cssEditor.setValue(localStorage.getItem('__css_content') || DEFAULT_CSS_CONTENT)\n },\n editorRefresh(state) {\n let output = marked(state.editor.getValue(0), {\n renderer: state.wxRenderer.getRenderer(state.citeStatus)\n })\n // 去除第一行的 margin-top\n output = output.replace(/(style=\".*?)\"/, '$1;margin-top: 0\"')\n if (state.citeStatus) {\n // 引用脚注\n output += state.wxRenderer.buildFootnotes()\n // 附加的一些 style\n output += state.wxRenderer.buildAddition()\n }\n state.output = output\n },\n clearEditorToDefault(state) {\n const doc = formatDoc(DEFAULT_CONTENT)\n state.editor.setValue(doc)\n state.cssEditor.setValue(DEFAULT_CSS_CONTENT)\n }\n}\n\nexport default new Vuex.Store({\n state,\n mutations,\n actions: {},\n modules: {}\n})\n","import Vue from 'vue'\nimport {\n Container,\n Header,\n Upload,\n Tooltip,\n Form,\n FormItem,\n Select,\n Option,\n ColorPicker,\n Switch,\n Button,\n Main,\n Col,\n Row,\n Dialog,\n Loading,\n Message\n} from 'element-ui'\n\nVue.use(Container)\nVue.use(Header)\nVue.use(Upload)\nVue.use(Tooltip)\nVue.use(Form)\nVue.use(FormItem)\nVue.use(Select)\nVue.use(Option)\nVue.use(ColorPicker)\nVue.use(Switch)\nVue.use(Button)\nVue.use(Main)\nVue.use(Col)\nVue.use(Row)\nVue.use(Dialog)\nVue.use(Loading)\nVue.component(Message.name, Message)\n\nVue.prototype.$loading = Loading.service\nVue.prototype.$message = Message\n","import CodeMirror from \"codemirror/lib/codemirror\";\n(function () {\n CodeMirror.extendMode('css', {\n commentStart: '/*',\n commentEnd: '*/',\n newlineAfterToken: function (type, content) {\n return /^[;{}]$/.test(content)\n }\n })\n\n // Comment/uncomment the specified range\n CodeMirror.defineExtension('commentRange', function (isComment, from, to) {\n var cm = this;\n var curMode = CodeMirror.innerMode(cm.getMode(), cm.getTokenAt(from).state).mode\n cm.operation(function () {\n if (isComment) { // Comment range\n cm.replaceRange(curMode.commentEnd, to)\n cm.replaceRange(curMode.commentStart, from)\n if (from.line == to.line && from.ch == to.ch) // An empty comment inserted - put cursor inside\n {\n cm.setCursor(from.line, from.ch + curMode.commentStart.length)\n }\n } else { // Uncomment range\n var selText = cm.getRange(from, to)\n var startIndex = selText.indexOf(curMode.commentStart)\n var endIndex = selText.lastIndexOf(curMode.commentEnd)\n if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) {\n // Take string till comment start\n selText = selText.substr(0, startIndex) +\n // From comment start till comment end\n selText.substring(startIndex + curMode.commentStart.length, endIndex) +\n // From comment end till string end\n selText.substr(endIndex + curMode.commentEnd.length)\n }\n cm.replaceRange(selText, from, to)\n }\n })\n })\n\n // Applies automatic mode-aware indentation to the specified range\n CodeMirror.defineExtension('autoIndentRange', function (from, to) {\n var cmInstance = this\n this.operation(function () {\n for (var i = from.line; i <= to.line; i++) {\n cmInstance.indentLine(i, 'smart')\n }\n })\n })\n\n // Applies automatic formatting to the specified range\n CodeMirror.defineExtension('autoFormatRange', function (from, to) {\n var cm = this\n var outer = cm.getMode();\n var text = cm.getRange(from, to).split('\\n')\n var state = CodeMirror.copyState(outer, cm.getTokenAt(from).state)\n var tabSize = cm.getOption('tabSize')\n\n var out = '';\n var lines = 0;\n var atSol = from.ch == 0\n\n function newline() {\n out += '\\n'\n atSol = true\n ++lines\n }\n\n for (var i = 0; i < text.length; ++i) {\n var stream = new CodeMirror.StringStream(text[i], tabSize)\n while (!stream.eol()) {\n var inner = CodeMirror.innerMode(outer, state)\n var style = outer.token(stream, state);\n var cur = stream.current()\n stream.start = stream.pos\n if (!atSol || /\\S/.test(cur)) {\n out += cur\n atSol = false\n }\n if (!atSol && inner.mode.newlineAfterToken &&\n inner.mode.newlineAfterToken(style, cur, stream.string.slice(stream.pos) || text[i + 1] || '', inner.state)) {\n newline()\n }\n }\n if (!stream.pos && outer.blankLine) outer.blankLine(state)\n if (!atSol) newline()\n }\n\n cm.operation(function () {\n cm.replaceRange(out, from, to)\n for (var cur = from.line + 1, end = from.line + lines; cur <= end; ++cur) {\n cm.indentLine(cur, 'smart')\n }\n cm.setSelection(from, cm.getCursor(false))\n })\n })\n})()\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\nimport CodeMirror from \"codemirror/lib/codemirror\";\n(function (CodeMirror) {\n var defaults = {\n pairs: \"()[]{}''\\\"\\\"\",\n closeBefore: \")]}'\\\":;>\",\n triples: \"\",\n explode: \"[]{}\"\n };\n\n var Pos = CodeMirror.Pos;\n\n CodeMirror.defineOption(\"autoCloseBrackets\", false, function (cm, val, old) {\n if (old && old != CodeMirror.Init) {\n cm.removeKeyMap(keyMap);\n cm.state.closeBrackets = null;\n }\n if (val) {\n ensureBound(getOption(val, \"pairs\"));\n cm.state.closeBrackets = val;\n cm.addKeyMap(keyMap);\n }\n });\n\n function getOption(conf, name) {\n if (name == \"pairs\" && typeof conf == \"string\") return conf;\n if (typeof conf == \"object\" && conf[name] != null) return conf[name];\n return defaults[name];\n }\n\n var keyMap = {\n Backspace: handleBackspace,\n Enter: handleEnter\n };\n\n function ensureBound(chars) {\n for (var i = 0; i < chars.length; i++) {\n var ch = chars.charAt(i),\n key = \"'\" + ch + \"'\";\n if (!keyMap[key]) keyMap[key] = handler(ch);\n }\n }\n ensureBound(defaults.pairs + \"`\");\n\n function handler(ch) {\n return function (cm) {\n return handleChar(cm, ch);\n };\n }\n\n function getConfig(cm) {\n var deflt = cm.state.closeBrackets;\n if (!deflt || deflt.override) return deflt;\n var mode = cm.getModeAt(cm.getCursor());\n return mode.closeBrackets || deflt;\n }\n\n function handleBackspace(cm) {\n var conf = getConfig(cm);\n if (!conf || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n var pairs = getOption(conf, \"pairs\");\n var ranges = cm.listSelections();\n for (var i = 0; i < ranges.length; i++) {\n if (!ranges[i].empty()) return CodeMirror.Pass;\n var around = charsAround(cm, ranges[i].head);\n if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;\n }\n for (var i = ranges.length - 1; i >= 0; i--) {\n var cur = ranges[i].head;\n cm.replaceRange(\n \"\",\n Pos(cur.line, cur.ch - 1),\n Pos(cur.line, cur.ch + 1),\n \"+delete\"\n );\n }\n }\n\n function handleEnter(cm) {\n var conf = getConfig(cm);\n var explode = conf && getOption(conf, \"explode\");\n if (!explode || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n var ranges = cm.listSelections();\n for (var i = 0; i < ranges.length; i++) {\n if (!ranges[i].empty()) return CodeMirror.Pass;\n var around = charsAround(cm, ranges[i].head);\n if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;\n }\n cm.operation(function () {\n var linesep = cm.lineSeparator() || \"\\n\";\n cm.replaceSelection(linesep + linesep, null);\n cm.execCommand(\"goCharLeft\");\n ranges = cm.listSelections();\n for (var i = 0; i < ranges.length; i++) {\n var line = ranges[i].head.line;\n cm.indentLine(line, null, true);\n cm.indentLine(line + 1, null, true);\n }\n });\n }\n\n function contractSelection(sel) {\n var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;\n return {\n anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),\n head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))\n };\n }\n\n function handleChar(cm, ch) {\n var conf = getConfig(cm);\n if (!conf || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n var pairs = getOption(conf, \"pairs\");\n var pos = pairs.indexOf(ch);\n if (pos == -1) return CodeMirror.Pass;\n\n var closeBefore = getOption(conf, \"closeBefore\");\n\n var triples = getOption(conf, \"triples\");\n\n var identical = pairs.charAt(pos + 1) == ch;\n var ranges = cm.listSelections();\n var opening = pos % 2 == 0;\n\n var type;\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i],\n cur = range.head,\n curType;\n var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));\n if (opening && !range.empty()) {\n curType = \"surround\";\n } else if ((identical || !opening) && next == ch) {\n if (identical && stringStartsAfter(cm, cur)) curType = \"both\";\n else if (\n triples.indexOf(ch) >= 0 &&\n cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch\n )\n curType = \"skipThree\";\n else curType = \"skip\";\n } else if (\n identical &&\n cur.ch > 1 &&\n triples.indexOf(ch) >= 0 &&\n cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch\n ) {\n if (\n cur.ch > 2 &&\n /\\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))\n )\n return CodeMirror.Pass;\n curType = \"addFour\";\n } else if (identical) {\n var prev =\n cur.ch == 0 ? \" \" : cm.getRange(Pos(cur.line, cur.ch - 1), cur);\n if (\n !CodeMirror.isWordChar(next) &&\n prev != ch &&\n !CodeMirror.isWordChar(prev)\n )\n curType = \"both\";\n else return CodeMirror.Pass;\n } else if (\n opening &&\n (next.length === 0 || /\\s/.test(next) || closeBefore.indexOf(next) > -1)\n ) {\n curType = \"both\";\n } else {\n return CodeMirror.Pass;\n }\n if (!type) type = curType;\n else if (type != curType) return CodeMirror.Pass;\n }\n\n var left = pos % 2 ? pairs.charAt(pos - 1) : ch;\n var right = pos % 2 ? ch : pairs.charAt(pos + 1);\n cm.operation(function () {\n if (type == \"skip\") {\n cm.execCommand(\"goCharRight\");\n } else if (type == \"skipThree\") {\n for (var i = 0; i < 3; i++) cm.execCommand(\"goCharRight\");\n } else if (type == \"surround\") {\n var sels = cm.getSelections();\n for (var i = 0; i < sels.length; i++) sels[i] = left + sels[i] + right;\n cm.replaceSelections(sels, \"around\");\n sels = cm.listSelections().slice();\n for (var i = 0; i < sels.length; i++)\n sels[i] = contractSelection(sels[i]);\n cm.setSelections(sels);\n } else if (type == \"both\") {\n cm.replaceSelection(left + right, null);\n cm.triggerElectric(left + right);\n cm.execCommand(\"goCharLeft\");\n } else if (type == \"addFour\") {\n cm.replaceSelection(left + left + left + left, \"before\");\n cm.execCommand(\"goCharRight\");\n }\n });\n }\n\n function charsAround(cm, pos) {\n var str = cm.getRange(Pos(pos.line, pos.ch - 1), Pos(pos.line, pos.ch + 1));\n return str.length == 2 ? str : null;\n }\n\n function stringStartsAfter(cm, pos) {\n var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1));\n return (\n /\\bstring/.test(token.type) &&\n token.start == pos.ch &&\n (pos.ch == 0 || !/\\bstring/.test(cm.getTokenTypeAt(pos)))\n );\n }\n})(CodeMirror);\n","import Vue from 'vue'\nimport App from './App.vue'\nimport store from './store'\nimport ElementUI from 'element-ui'\nimport 'element-ui/lib/theme-chalk/index.css'\nimport './plugins/element'\nimport 'codemirror/lib/codemirror.css';\nimport 'codemirror/theme/ambiance.css';\nimport 'codemirror/theme/xq-light.css';\nimport 'codemirror/mode/css/css'\nimport 'codemirror/mode/markdown/markdown'\nimport 'codemirror/addon/edit/matchbrackets'\nimport 'codemirror/addon/selection/active-line'\nimport 'codemirror/addon/hint/show-hint.js'\nimport 'codemirror/addon/hint/css-hint.js'\nimport './assets/less/theme.less';\n// 对codemirror预处理\nimport './assets/scripts/format'\nimport './assets/scripts/closebrackets'\nVue.use(ElementUI)\n\nVue.config.productionTip = false\n\nnew Vue({\n store,\n render: h => h(App)\n}).$mount('#app')\n","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./insertForm.vue?vue&type=style&index=0&lang=less&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./insertForm.vue?vue&type=style&index=0&lang=less&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"loading\",attrs:{\"id\":\"loading\"}},[_c('div',{staticClass:\"loading-wrapper\"},[_c('div',{staticClass:\"loading-anim\"}),_c('div',{staticClass:\"loading-text\"},[_vm._v(\"致力于让 Markdown 编辑更简单\")])])])}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CodemirrorEditor.vue?vue&type=style&index=1&lang=less&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CodemirrorEditor.vue?vue&type=style&index=1&lang=less&\"","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&id=6f36a3b6&lang=scss&scoped=true&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&id=6f36a3b6&lang=scss&scoped=true&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CodemirrorEditor.vue?vue&type=style&index=0&id=b985330a&lang=less&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CodemirrorEditor.vue?vue&type=style&index=0&id=b985330a&lang=less&scoped=true&\"","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!./Loading.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!./Loading.vue?vue&type=script&lang=js&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./rightClickMenu.vue?vue&type=style&index=0&id=663dfa9d&lang=less&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./rightClickMenu.vue?vue&type=style&index=0&id=663dfa9d&lang=less&scoped=true&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./resetDialog.vue?vue&type=style&index=0&id=7cee040c&lang=less&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./resetDialog.vue?vue&type=style&index=0&id=7cee040c&lang=less&scoped=true&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loading.vue?vue&type=style&index=0&id=31c61828&lang=less&scoped=true&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loading.vue?vue&type=style&index=0&id=31c61828&lang=less&scoped=true&\""],"sourceRoot":""} \ No newline at end of file