md/js/app.347956bf.js.map
2020-05-02 13:56:27 +00:00

1 line
137 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?ef82","webpack:///./src/components/Loading.vue?4f02","webpack:///src/components/Loading.vue","webpack:///./src/components/Loading.vue?f931","webpack:///./src/components/Loading.vue","webpack:///./src/components/CodemirrorEditor.vue?75f8","webpack:///./src/scripts/format.js","webpack:///./src/api/fetch.js","webpack:///./src/api/file.js","webpack:///./src/components/codeMirror/header.vue?8442","webpack:///./src/scripts/themes/default-theme.js","webpack:///./src/scripts/util.js","webpack:///./src/scripts/converter.js","webpack:///./src/scripts/config.js","webpack:///./src/scripts/themes/default-theme-css.js","webpack:///src/components/codeMirror/header.vue","webpack:///./src/components/codeMirror/header.vue?0e27","webpack:///./src/components/codeMirror/header.vue","webpack:///./src/components/codeMirror/aboutDialog.vue?c1f4","webpack:///src/components/codeMirror/aboutDialog.vue","webpack:///./src/components/codeMirror/aboutDialog.vue?bdaa","webpack:///./src/components/codeMirror/aboutDialog.vue","webpack:///./src/components/codeMirror/insertForm.vue?c4ad","webpack:///src/components/codeMirror/insertForm.vue","webpack:///./src/components/codeMirror/insertForm.vue?c4e5","webpack:///./src/components/codeMirror/insertForm.vue","webpack:///./src/scripts/closebrackets.js","webpack:///src/components/CodemirrorEditor.vue","webpack:///./src/components/CodemirrorEditor.vue?67a4","webpack:///./src/components/CodemirrorEditor.vue","webpack:///src/App.vue","webpack:///./src/App.vue?1160","webpack:///./src/App.vue","webpack:///./src/views/Home.vue?169e","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?493c","webpack:///./src/views/Home.vue","webpack:///./src/router/index.js","webpack:///./src/scripts/renderers/wx-renderer.js","webpack:///./src/scripts/default-content.js","webpack:///./src/store/index.js","webpack:///./src/element/index.js","webpack:///./src/main.js","webpack:///./src/components/codeMirror/header.vue?b1ad","webpack:///./src/components/CodemirrorEditor.vue?135b"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","jsonpScriptSrc","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","window","oldJsonpFunction","slice","_vm","this","_h","$createElement","_c","_self","staticRenderFns","_m","staticClass","attrs","_v","component","on","uploaded","cssChanged","$event","showBox","aboutDialogVisible","dialogFormVisible","directives","rawName","expression","domProps","composing","source","_s","output","CodeMirror","extendMode","commentStart","commentEnd","newlineAfterToken","content","test","defineExtension","isComment","from","to","cm","curMode","innerMode","getMode","getTokenAt","state","operation","replaceRange","line","ch","setCursor","selText","getRange","startIndex","indexOf","endIndex","lastIndexOf","substr","substring","cmInstance","indentLine","outer","text","split","copyState","tabSize","getOption","out","lines","atSol","newline","stream","StringStream","eol","inner","style","token","cur","current","start","pos","string","blankLine","end","setSelection","getCursor","service","axios","baseURL","interceptors","use","config","method","upload","headers","response","res","success","log","fileUpload","fetch","url","beforeUpload","downloadEditorContent","reset","$emit","fontChanged","model","callback","$$v","selectFont","_l","font","fontFamily","label","sizeChanged","selectSize","size","desc","colorChanged","selectColor","color","hex","statusChanged","citeStatus","customStyle","copy","BASE","BASE_BLOCK","block","h1","h2","h3","h4","blockquote","blockquote_p","code","image","image_org","ol","ul","footnotes","figure","inline","listitem","codespan","link","wx_link","strong","table","thead","td","footnote","figcaption","setColorWithTemplate","template","custom_theme","JSON","parse","stringify","setColorWithCustomTemplate","setFontSizeWithTemplate","fontSize","setColor","default_theme","setFontSize","customCssWithTemplate","jsonString","theme","assign","css2json","css","open","close","json","lbracket","rbracket","toObject","array","ret","forEach","index","trim","declarations","map","filter","selectors","selector","keys","saveEditorContent","editor","getValue","localStorage","setItem","removeItem","isImageIllegal","file","solveWeChatImage","clipboardDiv","getElementById","images","getElementsByTagName","width","getAttribute","height","removeAttribute","solveHtml","element","html","innerHTML","juice","inlineContent","inlinePseudoElements","preserveImportant","builtinFonts","sizeOption","colorOption","form","rows","cols","DEFAULT_CSS_CONTENT","staticStyle","slot","onRedirect","$set","insertTable","defaults","pairs","closeBefore","triples","explode","Pos","conf","defineOption","val","old","Init","removeKeyMap","keyMap","closeBrackets","ensureBound","addKeyMap","Backspace","handleBackspace","Enter","handleEnter","chars","charAt","handler","handleChar","getConfig","deflt","override","getModeAt","Pass","ranges","listSelections","empty","around","charsAround","linesep","lineSeparator","replaceSelection","execCommand","contractSelection","sel","inverted","cmpPos","anchor","identical","opening","curType","range","next","getTokenTypeAt","prev","isWordChar","stringStartsAfter","left","right","sels","getSelections","replaceSelections","setSelections","triggerElectric","str","components","Vue","VueRouter","routes","path","Home","router","base","process","WxRenderer","opts","ENV_STRETCH_IMAGE","footnoteIndex","styleMapping","CODE_FONT_FAMILY","merge","extend","buildTheme","themeTpl","mapping","fonts","base_block","ele","getStyles","tokenName","addition","arr","dict","join","addFootnote","title","buildFootnotes","footnoteArray","x","buildAddition","setOptions","newOpts","hasFootnotes","getRenderer","status","renderer","marked","Renderer","heading","level","paragraph","replace","infoString","codeLines","numbers","lang","list","ordered","segments","href","subText","figureStyles","imgStyles","ref","em","header","body","tablecell","flags","hr","DEFAULT_CONTENT","Vuex","wxRenderer","cssEditor","currentFont","currentSize","currentColor","mutations","setHtml","setEditorValue","setValue","setCssEditorValue","setWxRendererOptions","setCiteStatus","setCurrentFont","setCurrentSize","setCurrentColor","initEditorState","getItem","initEditorEntity","fromTextArea","lineNumbers","lineWrapping","styleActiveLine","autoCloseBrackets","initCssEditorEntity","matchBrackets","autofocus","extraKeys","totalLines","lineCount","autoFormatRange","editorRefresh","clearEditorToDefault","Store","actions","Container","Header","Upload","Tooltip","Form","FormItem","Select","Option","ColorPicker","Switch","Button","Main","Col","Row","Dialog","Loading","Message","$loading","$message","ElementUI","productionTip","store","render","h","App","$mount"],"mappings":"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","file":"js/app.347956bf.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({\"about\":\"about\"}[chunkId]||chunkId) + \".\" + {\"about\":\"b48c8998\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/md/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.loading)?_c('loading'):_c('codemirror-editor')}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","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-text\"},[_vm._v(\"Loading...\")]),_c('div',{staticClass:\"loading-anim\"})])])}]\n\nexport { render, staticRenderFns }","<template>\n <div class=\"loading\" id=\"loading\">\n <div class=\"loading-wrapper\">\n <div class=\"loading-text\">Loading...</div>\n <div class=\"loading-anim\"></div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n\n}\n</script>\n\n<style scoped>\n\n</style>\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!./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 { render, staticRenderFns } from \"./Loading.vue?vue&type=template&id=71788ed8&scoped=true&\"\nimport script from \"./Loading.vue?vue&type=script&lang=js&\"\nexport * from \"./Loading.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 \"71788ed8\",\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('div',{staticClass:\"container\",attrs:{\"id\":\"app\"}},[_c('el-container',[_c('el-header',{staticClass:\"top editor__header\"},[_c('editor-header',{on:{\"uploaded\":_vm.uploaded,\"cssChanged\":_vm.cssChanged,\"showBox\":function($event){_vm.showBox = !_vm.showBox},\"showAboutDialog\":function($event){_vm.aboutDialogVisible = true},\"showDialogForm\":function($event){_vm.dialogFormVisible = true}}})],1),_c('el-main',{staticClass:\"main-body\"},[_c('el-row',{staticClass:\"main-section\",attrs:{\"gutter\":10}},[_c('el-col',{attrs:{\"span\":12}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.source),expression:\"source\"}],attrs:{\"id\":\"editor\",\"type\":\"textarea\",\"placeholder\":\"Your markdown text here.\"},domProps:{\"value\":(_vm.source)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.source=$event.target.value}}})]),_c('el-col',{staticClass:\"preview-wrapper\",attrs:{\"span\":12,\"id\":\"preview\"}},[_c('section',{attrs:{\"id\":\"output-wrapper\"}},[_c('div',{staticClass:\"preview\",attrs:{\"contenteditable\":\"true\"}},[_c('section',{attrs:{\"id\":\"output\"},domProps:{\"innerHTML\":_vm._s(_vm.output)}})])])]),_c('transition',{attrs:{\"name\":\"custom-classes-transition\",\"enter-active-class\":\"animated bounceInRight\"}},[_c('el-col',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showBox),expression:\"showBox\"}],attrs:{\"id\":\"cssBox\",\"span\":12}},[_c('textarea',{attrs:{\"id\":\"cssEditor\",\"type\":\"textarea\",\"placeholder\":\"Your custom css here.\"}})])],1)],1)],1)],1),_c('about-dialog',{attrs:{\"aboutDialogVisible\":_vm.aboutDialogVisible},on:{\"close\":function($event){_vm.aboutDialogVisible = false}}}),_c('insert-form-dialog',{attrs:{\"dialogFormVisible\":_vm.dialogFormVisible},on:{\"close\":function($event){_vm.dialogFormVisible = false}}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","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; 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 { cm.setCursor(from.line, from.ch + curMode.commentStart.length) }\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(); 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 = ''; var lines = 0; var atSol = from.ch == 0\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); 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)) { newline() }\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) { cm.indentLine(cur, 'smart') }\n cm.setSelection(from, cm.getCursor(false))\n })\n })\n})()\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 if (res.data.success) {\n return res.data;\n } else {\n console.log(res);\n }\n return 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};","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-container',{staticClass:\"top\"},[_c('el-upload',{staticClass:\"header__item\",attrs:{\"action\":\"https://imgkr.com/api/files/upload\",\"headers\":{'Content-Type': 'multipart/form-data'},\"show-file-list\":false,\"multiple\":true,\"accept\":\".jpg,.jpeg,.png,.gif\",\"name\":\"file\",\"before-upload\":_vm.beforeUpload}},[_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"content\":\"上传图片\",\"placement\":\"bottom-start\"}},[_c('i',{staticClass:\"el-icon-upload\",attrs:{\"size\":\"medium\"}})])],1),_c('el-tooltip',{staticClass:\"header__item\",attrs:{\"effect\":\"dark\",\"content\":\"下载编辑框Markdown文档\",\"placement\":\"bottom-start\"}},[_c('i',{staticClass:\"el-icon-download\",attrs:{\"size\":\"medium\"},on:{\"click\":_vm.downloadEditorContent}})]),_c('el-tooltip',{staticClass:\"header__item\",attrs:{\"effect\":\"dark\",\"content\":\"重置页面\",\"placement\":\"bottom-start\"}},[_c('i',{staticClass:\"el-icon-refresh\",attrs:{\"size\":\"medium\"},on:{\"click\":_vm.reset}})]),_c('el-tooltip',{staticClass:\"header__item header__item_last\",attrs:{\"effect\":\"dark\",\"content\":\"插入表格\",\"placement\":\"bottom-start\"}},[_c('i',{staticClass:\"el-icon-s-grid\",attrs:{\"size\":\"medium\"},on:{\"click\":function($event){return _vm.$emit('showDialogForm')}}})]),_c('el-form',{staticClass:\"ctrl\",attrs:{\"size\":\"mini\",\"inline\":true}},[_c('el-form-item',[_c('el-select',{attrs:{\"size\":\"mini\",\"placeholder\":\"选择字体\",\"clearable\":\"\"},on:{\"change\":_vm.fontChanged},model:{value:(_vm.selectFont),callback:function ($$v) {_vm.selectFont=$$v},expression:\"selectFont\"}},_vm._l((_vm.config.builtinFonts),function(font){return _c('el-option',{key:font.value,style:({fontFamily: font.value}),attrs:{\"label\":font.label,\"value\":font.value}},[_c('span',{staticClass:\"select-item-left\"},[_vm._v(_vm._s(font.label))]),_c('span',{staticClass:\"select-item-right\"},[_vm._v(\"Abc\")])])}),1)],1),_c('el-form-item',[_c('el-select',{attrs:{\"size\":\"mini\",\"placeholder\":\"选择段落字号\",\"clearable\":\"\"},on:{\"change\":_vm.sizeChanged},model:{value:(_vm.selectSize),callback:function ($$v) {_vm.selectSize=$$v},expression:\"selectSize\"}},_vm._l((_vm.config.sizeOption),function(size){return _c('el-option',{key:size.value,attrs:{\"label\":size.label,\"value\":size.value}},[_c('span',{staticClass:\"select-item-left\"},[_vm._v(_vm._s(size.label))]),_c('span',{staticClass:\"select-item-right\"},[_vm._v(_vm._s(size.desc))])])}),1)],1),_c('el-form-item',[_c('el-select',{attrs:{\"size\":\"mini\",\"placeholder\":\"选择颜色\",\"clearable\":\"\"},on:{\"change\":_vm.colorChanged},model:{value:(_vm.selectColor),callback:function ($$v) {_vm.selectColor=$$v},expression:\"selectColor\"}},_vm._l((_vm.config.colorOption),function(color){return _c('el-option',{key:color.value,attrs:{\"label\":color.label,\"value\":color.value}},[_c('span',{staticClass:\"select-item-left\"},[_vm._v(_vm._s(color.label))]),_c('span',{staticClass:\"select-item-right\"},[_vm._v(_vm._s(color.hex))])])}),1)],1),_c('el-tooltip',{attrs:{\"content\":\"自定义颜色\",\"placement\":\"top\"}},[_c('el-color-picker',{attrs:{\"size\":\"mini\",\"show-alpha\":\"\"},on:{\"change\":_vm.colorChanged},model:{value:(_vm.selectColor),callback:function ($$v) {_vm.selectColor=$$v},expression:\"selectColor\"}})],1),_c('el-tooltip',{attrs:{\"content\":\"微信外链自动转为文末引用\",\"placement\":\"top\"}},[_c('el-switch',{staticClass:\"header__switch\",attrs:{\"active-color\":\"#67c23a\",\"inactive-color\":\"#dcdfe6\"},on:{\"change\":_vm.statusChanged},model:{value:(_vm.citeStatus),callback:function ($$v) {_vm.citeStatus=$$v},expression:\"citeStatus\"}})],1)],1),_c('el-tooltip',{staticClass:\"item\",attrs:{\"effect\":\"dark\",\"content\":\"自定义CSS样式\",\"placement\":\"left\"}},[_c('el-button',{attrs:{\"type\":\"success\",\"plain\":\"\",\"size\":\"medium\",\"icon\":\"el-icon-setting\"},on:{\"click\":_vm.customStyle}})],1),_c('el-button',{attrs:{\"type\":\"success\",\"plain\":\"\",\"size\":\"medium\"},on:{\"click\":_vm.copy}},[_vm._v(\"复制\")]),_c('el-button',{staticClass:\"about\",attrs:{\"type\":\"success\",\"plain\":\"\",\"size\":\"medium\"},on:{\"click\":function($event){return _vm.$emit('showAboutDialog')}}},[_vm._v(\"关于\")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export default {\n BASE: {\n 'text-align': 'left',\n 'color': '#3f3f3f',\n 'line-height': '1.75',\n },\n BASE_BLOCK: {\n 'margin': '1em 8px'\n },\n block: {\n // 一级标题样式\n h1: {\n 'font-size': '1.2em',\n 'text-align': 'center',\n 'font-weight': 'bold',\n 'display': 'table',\n 'margin': '2em auto 1em',\n 'padding': '0 1em',\n 'border-bottom': '2px solid rgba(0, 152, 116, 0.9)'\n },\n\n // 二级标题样式\n h2: {\n 'font-size': '1.2em',\n 'text-align': 'center',\n 'font-weight': 'bold',\n 'display': 'table',\n 'margin': '4em auto 2em',\n 'padding': '0 0.2em',\n 'background': 'rgba(0, 152, 116, 0.9)',\n 'color': '#fff'\n },\n\n // 三级标题样式\n h3: {\n 'font-weight': 'bold',\n 'font-size': '1.1em',\n 'margin': '2em 8px 0.75em 0',\n 'line-height': '1.2',\n 'padding-left': '8px',\n 'border-left': '3px solid rgba(0, 152, 116, 0.9)'\n },\n\n // 四级标题样式\n h4: {\n 'font-weight': 'bold',\n 'font-size': '1em',\n 'margin': '2em 8px 0.5em',\n 'color': 'rgba(66, 185, 131, 0.9)'\n },\n\n // 段落样式\n p: {\n 'margin': '1.5em 8px',\n 'letter-spacing': '0.1em'\n },\n\n // 引用样式\n blockquote: {\n 'font-style': 'normal',\n 'border-left': 'none',\n 'padding': '1em',\n 'border-radius': '4px',\n 'color': '#FEEEED',\n 'background': 'rgba(27,31,35,.05)',\n 'margin': '2em 8px'\n },\n\n blockquote_p: {\n 'letter-spacing': '0.1em',\n 'color': 'rgb(80, 80, 80)',\n 'font-family': 'PingFangSC-light, PingFangTC-light, Open Sans, Helvetica Neue, sans-serif',\n 'font-size': '1em',\n 'display': 'inline',\n },\n\n code: {\n 'font-size': '80%',\n 'overflow': 'auto',\n 'color': '#333',\n 'background': 'rgb(247, 247, 247)',\n 'border-radius': '2px',\n 'padding': '10px',\n 'line-height': '1.5',\n 'border': '1px solid rgb(236,236,236)',\n 'margin': '20px 0',\n },\n\n image: {\n 'border-radius': '4px',\n 'display': 'block',\n 'margin': '0.1em auto 0.5em',\n 'width': '100% !important',\n },\n\n image_org: {\n 'border-radius': '4px',\n 'display': 'block'\n },\n\n ol: {\n 'margin-left': '0',\n 'padding-left': '1em'\n },\n\n ul: {\n 'margin-left': '0',\n 'padding-left': '1em',\n 'list-style': 'circle'\n },\n\n footnotes: {\n 'margin': '0.5em 8px',\n 'font-size': '80%'\n },\n\n figure: {\n 'margin': '1.5em 8px',\n }\n },\n inline: {\n listitem: {\n 'text-indent': '-1em',\n 'display': 'block',\n 'margin': '0.2em 8px'\n },\n\n codespan: {\n 'font-size': '90%',\n 'color': '#d14',\n 'background': 'rgba(27,31,35,.05)',\n 'padding': '3px 5px',\n 'border-radius': '4px',\n },\n\n link: {\n 'color': '#576b95'\n },\n\n wx_link: {\n 'color': '#576b95',\n 'text-decoration': 'none',\n },\n\n // 字体加粗样式\n strong: {\n 'color': 'rgba(15, 76, 129, 0.9)',\n 'font-weight': 'bold',\n },\n\n table: {\n 'border-collapse': 'collapse',\n 'text-align': 'center',\n 'margin': '1em 8px'\n },\n\n thead: {\n 'background': 'rgba(0, 0, 0, 0.05)',\n 'font-weight': 'bold'\n },\n\n td: {\n 'border': '1px solid #dfdfdf',\n 'padding': '0.25em 0.5em'\n },\n\n footnote: {\n 'font-size': '12px'\n },\n\n figcaption: {\n 'text-align': 'center',\n 'color': '#888',\n 'font-size': '0.8em'\n }\n }\n};\n","import default_theme from \"./themes/default-theme\";\n\n\n// 设置自定义颜色\nexport function setColorWithTemplate (template) {\n return function (color) {\n let custom_theme = JSON.parse(JSON.stringify(template))\n custom_theme.block.h1['border-bottom'] = `2px solid ${color}`\n custom_theme.block.h2['background'] = color\n custom_theme.block.h3['border-left'] = `3px solid ${color}`\n custom_theme.block.h4['color'] = color\n custom_theme.inline.strong['color'] = color\n return custom_theme\n }\n}\n\nexport const setColorWithCustomTemplate = function setColorWithCustomTemplate (\n template,\n color\n) {\n let custom_theme = JSON.parse(JSON.stringify(template))\n custom_theme.block.h1['border-bottom'] = `2px solid ${color}`\n custom_theme.block.h2['background'] = color\n custom_theme.block.h3['border-left'] = `3px solid ${color}`\n custom_theme.block.h4['color'] = color\n custom_theme.inline.strong['color'] = color\n return custom_theme\n}\n\n// 设置自定义字体大小\nexport function setFontSizeWithTemplate (template) {\n return function (fontSize) {\n let custom_theme = JSON.parse(JSON.stringify(template))\n custom_theme.block.h1['font-size'] = `${fontSize * 1.14}px`\n custom_theme.block.h2['font-size'] = `${fontSize * 1.1}px`\n custom_theme.block.h3['font-size'] = `${fontSize}px`\n custom_theme.block.h4['font-size'] = `${fontSize}px`\n return custom_theme\n }\n}\n\nexport const setColor = setColorWithTemplate(default_theme)\nexport const setFontSize = setFontSizeWithTemplate(default_theme)\n\nexport function customCssWithTemplate (jsonString, color, theme) {\n let custom_theme = JSON.parse(JSON.stringify(theme))\n // block\n custom_theme.block.h1['border-bottom'] = `2px solid ${color}`\n custom_theme.block.h2['background'] = color\n custom_theme.block.h3['border-left'] = `3px solid ${color}`\n custom_theme.block.h4['color'] = color\n custom_theme.inline.strong['color'] = color\n\n custom_theme.block.h1 = Object.assign(custom_theme.block.h1, jsonString.h1)\n custom_theme.block.h2 = Object.assign(custom_theme.block.h2, jsonString.h2)\n custom_theme.block.h3 = Object.assign(custom_theme.block.h3, jsonString.h3)\n custom_theme.block.h4 = Object.assign(custom_theme.block.h4, jsonString.h4)\n custom_theme.block.p = Object.assign(custom_theme.block.p, jsonString.p)\n custom_theme.block.blockquote = Object.assign(\n custom_theme.block.blockquote,\n jsonString.blockquote\n )\n custom_theme.block.blockquote_p = Object.assign(\n custom_theme.block.blockquote_p,\n jsonString.blockquote_p\n )\n custom_theme.block.image = Object.assign(\n custom_theme.block.image,\n jsonString.image\n )\n\n // inline\n custom_theme.inline.strong = Object.assign(\n custom_theme.inline.strong,\n jsonString.strong\n )\n custom_theme.inline.codespan = Object.assign(\n custom_theme.inline.codespan,\n jsonString.codespan\n )\n custom_theme.inline.link = Object.assign(\n custom_theme.inline.link,\n jsonString.link\n )\n custom_theme.inline.wx_link = Object.assign(\n custom_theme.inline.wx_link,\n jsonString.wx_link\n )\n\n return custom_theme\n}\n\n/**\n * 将CSS形式的字符串转换为JSON\n *\n * @param {css字符串} css\n */\nexport function css2json (css) {\n // 移除CSS所有注释\n while (\n (open = css.indexOf('/*')) !== -1 &&\n (close = css.indexOf('*/')) !== -1\n ) {\n css = css.substring(0, open) + css.substring(close + 2)\n }\n\n // 初始化返回值\n let json = {}\n\n while (css.length > 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\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 {\n inlinePseudoElements: true,\n preserveImportant: true\n }\n );\n// console.log(res);\n return res;\n}\n","export default {\n builtinFonts: [\n {\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 {\n label: '12px',\n value: '12px',\n desc: '更小'\n },\n {\n label: '13px',\n value: '13px',\n desc: '稍小'\n },\n {\n label: '14px',\n value: '14px',\n desc: '推荐'\n },\n {\n label: '15px',\n value: '15px',\n desc: '稍大'\n },\n {\n label: '16px',\n value: '16px',\n desc: '更大'\n }\n ],\n colorOption: [\n {\n label: '经典蓝',\n value: 'rgba(15, 76, 129, 1)',\n hex: '最新流行'\n },\n {\n label: '翡翠绿',\n value: 'rgba(0, 152, 116, 1)',\n hex: '优雅清新'\n },\n {\n label: '活力橘',\n value: 'rgba(250, 81, 81, 1)',\n hex: '热情活泼'\n }\n ],\n form: {\n rows: 1,\n cols: 1\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","<template>\n <el-container class=\"top\">\n <!-- 图片上传 -->\n <el-upload class=\"header__item\" action=\"https://imgkr.com/api/files/upload\"\n :headers=\"{'Content-Type': 'multipart/form-data'}\"\n :show-file-list=\"false\" :multiple=\"true\" accept=\".jpg,.jpeg,.png,.gif\" name=\"file\"\n :before-upload=\"beforeUpload\">\n <el-tooltip effect=\"dark\" content=\"上传图片\" placement=\"bottom-start\">\n <i class=\"el-icon-upload\" size=\"medium\"></i>\n </el-tooltip>\n </el-upload>\n <!-- 下载文本文档 -->\n <el-tooltip class=\"header__item\" effect=\"dark\" content=\"下载编辑框Markdown文档\" placement=\"bottom-start\">\n <i class=\"el-icon-download\" size=\"medium\" @click=\"downloadEditorContent\"></i>\n </el-tooltip>\n <!-- 页面重置 -->\n <el-tooltip class=\"header__item\" effect=\"dark\" content=\"重置页面\" placement=\"bottom-start\">\n <i class=\"el-icon-refresh\" size=\"medium\" @click=\"reset\"></i>\n </el-tooltip>\n <!-- 插入表格 -->\n <el-tooltip class=\"header__item header__item_last\" effect=\"dark\" content=\"插入表格\" placement=\"bottom-start\">\n <i class=\"el-icon-s-grid\" size=\"medium\" @click=\"$emit('showDialogForm')\"></i>\n </el-tooltip>\n <el-form size=\"mini\" class=\"ctrl\" :inline=true>\n <el-form-item>\n <el-select v-model=\"selectFont\" size=\"mini\" placeholder=\"选择字体\" clearable @change=\"fontChanged\">\n <el-option v-for=\"font in config.builtinFonts\" :style=\"{fontFamily: font.value}\" :key=\"font.value\"\n :label=\"font.label\" :value=\"font.value\">\n <span class=\"select-item-left\">{{ font.label }}</span>\n <span class=\"select-item-right\">Abc</span>\n </el-option>\n </el-select>\n </el-form-item>\n <el-form-item>\n <el-select v-model=\"selectSize\" size=\"mini\" placeholder=\"选择段落字号\" clearable @change=\"sizeChanged\">\n <el-option v-for=\"size in config.sizeOption\" :key=\"size.value\" :label=\"size.label\" :value=\"size.value\">\n <span class=\"select-item-left\">{{ size.label }}</span>\n <span class=\"select-item-right\">{{ size.desc }}</span>\n </el-option>\n </el-select>\n </el-form-item>\n <el-form-item>\n <el-select v-model=\"selectColor\" size=\"mini\" placeholder=\"选择颜色\" clearable @change=\"colorChanged\">\n <el-option v-for=\"color in config.colorOption\" :key=\"color.value\" :label=\"color.label\" :value=\"color.value\">\n <span class=\"select-item-left\">{{ color.label }}</span>\n <span class=\"select-item-right\">{{ color.hex }}</span>\n </el-option>\n </el-select>\n </el-form-item>\n <el-tooltip content=\"自定义颜色\" placement=\"top\">\n <el-color-picker v-model=\"selectColor\" size=\"mini\" show-alpha @change=\"colorChanged\"></el-color-picker>\n </el-tooltip>\n <el-tooltip content=\"微信外链自动转为文末引用\" placement=\"top\">\n <el-switch class=\"header__switch\" v-model=\"citeStatus\" active-color=\"#67c23a\" inactive-color=\"#dcdfe6\" @change=\"statusChanged\">\n </el-switch>\n </el-tooltip>\n </el-form>\n <el-tooltip class=\"item\" effect=\"dark\" content=\"自定义CSS样式\" placement=\"left\">\n <el-button type=\"success\" plain size=\"medium\" icon=\"el-icon-setting\" @click=\"customStyle\"></el-button>\n </el-tooltip>\n <el-button type=\"success\" plain size=\"medium\" @click=\"copy\">复制</el-button>\n <el-button type=\"success\" plain size=\"medium\" class=\"about\" @click=\"$emit('showAboutDialog')\">关于</el-button>\n </el-container>\n</template>\n\n<script>\n\nimport {\n setColorWithCustomTemplate,\n setFontSize,\n isImageIllegal\n} from '../../scripts/util'\nimport fileApi from '../../api/file';\nimport {\n solveWeChatImage,\n solveHtml\n} from '../../scripts/converter'\nimport config from '../../scripts/config'\nimport DEFAULT_CSS_CONTENT from '../../scripts/themes/default-theme-css'\nimport {mapState, mapMutations} from 'vuex'\nexport default {\n name: 'editor-header',\n data() {\n return {\n config: config,\n citeStatus: false,\n selectFont: '',\n selectSize: '',\n selectColor: ''\n };\n },\n computed: {\n ...mapState({\n output: state=> state.output,\n editor: state=> state.editor,\n cssEditor: state=> state.cssEditor,\n currentFont: state=> state.currentFont,\n currentSize: state=> state.currentSize,\n currentColor: state=> state.currentColor\n })\n },\n methods: {\n fontChanged(fonts) {\n this.setWxRendererOptions({\n fonts: fonts\n })\n this.setCurrentFont(fonts);\n this.editorRefresh()\n },\n sizeChanged(size) {\n let theme = setFontSize(size.replace('px', ''))\n theme = setColorWithCustomTemplate(theme, this.currentColor)\n this.setWxRendererOptions({\n size: size,\n theme: theme\n })\n this.setCurrentSize(size);\n this.editorRefresh()\n },\n colorChanged(color) {\n let theme = setFontSize(this.currentSize.replace('px', ''))\n theme = setColorWithCustomTemplate(theme, color)\n this.setWxRendererOptions({\n theme: theme\n })\n this.setCurrentColor(color);\n this.editorRefresh()\n },\n statusChanged(val) {\n this.setCiteStatus(val)\n this.editorRefresh()\n },\n // 图片上传前的处理\n beforeUpload(file) {\n const checkImageResult = isImageIllegal(file);\n\n if (checkImageResult) {\n this.$message({\n showClose: true,\n message: checkImageResult,\n type: 'error'\n });\n return false;\n }\n let fd = new FormData();\n\n fd.append('file', file);\n fileApi.fileUpload(fd).then(res => {\n this.$emit('uploaded', res)\n }).catch(err => {\n console.log(err.message)\n })\n return false;\n },\n // 复制到微信公众号\n copy() {\n let clipboardDiv = document.getElementById('output')\n solveWeChatImage()\n this.setHtml(solveHtml())\n\n clipboardDiv.focus()\n window.getSelection().removeAllRanges()\n let range = document.createRange()\n\n range.setStartBefore(clipboardDiv.firstChild)\n range.setEndAfter(clipboardDiv.lastChild)\n window.getSelection().addRange(range)\n document.execCommand('copy')\n // 输出提示\n this.$notify({\n showClose: true,\n message: '已复制渲染后的文章到剪贴板,可直接到公众号后台粘贴',\n offset: 80,\n duration: 1600,\n type: 'success'\n })\n clipboardDiv.innerHTML = this.output; // 恢复现场\n },\n // 自定义CSS样式\n async customStyle () {\n this.$emit('showBox');\n this.$nextTick(() => {\n if(!this.cssEditor) {\n this.cssEditor.refresh()\n }\n })\n setTimeout(() => {\n this.cssEditor.refresh()\n },50)\n let flag = await localStorage.getItem('__css_content')\n\n if (!flag) {\n this.setCssEditorValue(DEFAULT_CSS_CONTENT)\n }\n },\n // 重置页面\n reset() {\n this.$confirm('此操作将丢失本地缓存的文本和自定义样式,是否继续?', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n confirmButtonClass: 'el-button--success',\n cancelButtonClass: 'el-button--success is-plain',\n type: 'warning',\n center: true\n }).then(() => {\n localStorage.clear()\n this.clearEditorToDefault();\n this.editor.focus()\n this.citeStatus = false;\n this.statusChanged(false);\n this.fontChanged(this.config.builtinFonts[0].value)\n this.colorChanged(this.config.colorOption[1].value)\n this.sizeChanged(this.config.sizeOption[2].value)\n this.$emit('cssChanged')\n }).catch(() => {\n this.editor.focus()\n })\n },\n // 下载编辑器内容到本地\n downloadEditorContent () {\n let downLink = document.createElement('a')\n downLink.download = 'content.md'\n downLink.style.display = 'none'\n let blob = new Blob([this.editor.getValue(0)])\n downLink.href = URL.createObjectURL(blob)\n document.body.appendChild(downLink)\n downLink.click()\n document.body.removeChild(downLink)\n },\n ...mapMutations(['editorRefresh', 'clearEditorToDefault','setCurrentColor', 'setCiteStatus',\n 'setHtml', 'setCurrentFont', 'setCurrentSize', 'setCssEditorValue', 'setWxRendererOptions'])\n },\n mounted() {\n this.selectFont = this.currentFont\n this.selectSize = this.currentSize\n this.selectColor = this.currentColor\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n.editor__header {\n width: 100%;\n}\n.header__item {\n margin: 0 3px;\n}\n.header__item_last {\n margin-right: 8px;\n}\n.header__switch {\n margin-left: 8px;\n}\n</style>","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=257e3ffe&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=257e3ffe&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 \"257e3ffe\",\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',{attrs:{\"title\":\"关于\",\"visible\":_vm.aboutDialogVisible,\"width\":\"30%\",\"center\":\"\"},on:{\"close\":function($event){return _vm.$emit('close')}}},[_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 }","<template>\n <el-dialog title=\"关于\" :visible=\"aboutDialogVisible\" @close=\"$emit('close')\" width=\"30%\" center>\n <div style=\"text-align: center;\">\n <h3>一款高度简洁的微信 Markdown 编辑器</h3>\n </div>\n <div style=\"text-align: center;margin-top:10px;\">\n <p>扫码关注我的公众号,原创技术文章第一时间推送!</p>\n <img src=\"https://imgkr.cn-bj.ufileos.com/09f8e662-42ed-4731-a0d7-419deb74dfb6.png\" style=\"width: 40%; display: block; margin: 20px auto 10px;\">\n </div>\n <span slot=\"footer\" class=\"dialog-footer\">\n <el-button type=\"success\" @click=\"onRedirect('https://github.com/doocs/md')\" plain>GitHub 仓库</el-button>\n <el-button type=\"success\" @click=\"onRedirect('https://gitee.com/doocs/md')\" plain>Gitee 仓库</el-button>\n </span>\n </el-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n aboutDialogVisible: {\n type: Boolean,\n default: false\n }\n },\n methods: {\n onRedirect(url) {\n window.open(url)\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n</style>","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=6cbfbbc4&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 \"6cbfbbc4\",\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',{attrs:{\"title\":\"插入表格\",\"visible\":_vm.dialogFormVisible},on:{\"close\":function($event){return _vm.$emit('close')}}},[_c('el-form',{attrs:{\"model\":_vm.config.form}},[_c('el-form-item',{attrs:{\"label\":\"行数(表头不计入行数)\"}},[_c('el-input',{model:{value:(_vm.config.form.rows),callback:function ($$v) {_vm.$set(_vm.config.form, \"rows\", $$v)},expression:\"config.form.rows\"}})],1),_c('el-form-item',{attrs:{\"label\":\"列数\"}},[_c('el-input',{model:{value:(_vm.config.form.cols),callback:function ($$v) {_vm.$set(_vm.config.form, \"cols\", $$v)},expression:\"config.form.cols\"}})],1)],1),_c('div',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{attrs:{\"type\":\"success\",\"plain\":\"\"},on:{\"click\":function($event){return _vm.$emit('close')}}},[_vm._v(\"取 消\")]),_c('el-button',{attrs:{\"type\":\"success\"},on:{\"click\":_vm.insertTable}},[_vm._v(\"确 定\")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <el-dialog title=\"插入表格\" :visible=\"dialogFormVisible\" @close=\"$emit('close')\">\n <el-form :model=\"config.form\">\n <el-form-item label=\"行数(表头不计入行数)\">\n <el-input v-model=\"config.form.rows\"></el-input>\n </el-form-item>\n <el-form-item label=\"列数\">\n <el-input v-model=\"config.form.cols\"></el-input>\n </el-form-item>\n </el-form>\n <div slot=\"footer\" class=\"dialog-footer\">\n <el-button type=\"success\" plain @click=\"$emit('close')\">取 消</el-button>\n <el-button type=\"success\" @click=\"insertTable\">确 定</el-button>\n </div>\n </el-dialog>\n</template>\n\n<script>\nimport config from '../../scripts/config'\nimport {mapState, mapMutations} from 'vuex';\nexport default {\n props: {\n dialogFormVisible: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n config: config\n }\n },\n computed: {\n ...mapState({\n editor: state=> state.editor\n })\n },\n methods: {\n // 插入表格\n insertTable() {\n const cursor = this.editor.getCursor()\n const rows = parseInt(this.config.form.rows)\n const cols = parseInt(this.config.form.cols)\n if (isNaN(rows) || isNaN(cols) || rows < 1 || cols < 1) {\n this.$message({\n showClose: true,\n message: '输入的行/列数无效,请重新输入',\n type: 'error'\n })\n return\n }\n\n let table = ''\n for (let i = 0; i < rows + 2; ++i) {\n for (let j = 0; j < cols + 1; ++j) {\n table += (j === 0 ? '|' : (i !== 1 ? ' |' : ' --- |'))\n }\n table += '\\n'\n }\n\n this.editor.replaceSelection(`\\n${table}\\n`, cursor)\n this.$emit('close')\n this.editorRefresh()\n },\n ...mapMutations(['editorRefresh'])\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n</style>","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=b73d0f98&scoped=true&\"\nimport script from \"./insertForm.vue?vue&type=script&lang=js&\"\nexport * from \"./insertForm.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 \"b73d0f98\",\n null\n \n)\n\nexport default component.exports","// 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 = { Backspace: handleBackspace, Enter: handleEnter };\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","<template>\n <div id=\"app\" class=\"container\">\n <el-container>\n <el-header class=\"top editor__header\">\n <editor-header\n @uploaded=\"uploaded\"\n @cssChanged=\"cssChanged\"\n @showBox=\"showBox = !showBox\"\n @showAboutDialog=\"aboutDialogVisible = true\"\n @showDialogForm=\"dialogFormVisible = true\"\n />\n </el-header>\n <el-main class=\"main-body\">\n <el-row :gutter=\"10\" class=\"main-section\">\n <el-col :span=\"12\">\n <textarea id=\"editor\" type=\"textarea\" placeholder=\"Your markdown text here.\" v-model=\"source\">\n </textarea>\n </el-col>\n <el-col :span=\"12\" class=\"preview-wrapper\" id=\"preview\">\n <section id=\"output-wrapper\">\n <div class=\"preview\" contenteditable=\"true\">\n <section id=\"output\" v-html=\"output\">\n </section>\n </div>\n </section>\n </el-col>\n <transition name=\"custom-classes-transition\" enter-active-class=\"animated bounceInRight\">\n <el-col id=\"cssBox\" :span=\"12\" v-show=\"showBox\">\n <textarea id=\"cssEditor\" type=\"textarea\" placeholder=\"Your custom css here.\">\n </textarea>\n </el-col>\n </transition>\n </el-row>\n </el-main>\n </el-container>\n <about-dialog :aboutDialogVisible=\"aboutDialogVisible\"\n @close=\"aboutDialogVisible = false\" />\n <insert-form-dialog :dialogFormVisible=\"dialogFormVisible\"\n @close=\"dialogFormVisible = false\" />\n </div>\n</template>\n<script>\nimport CodeMirror from 'codemirror/lib/codemirror'\n\nimport 'codemirror/mode/css/css'\nimport 'codemirror/mode/markdown/markdown'\nimport 'codemirror/addon/edit/matchbrackets'\nimport 'codemirror/addon/selection/active-line'\n\nimport 'codemirror/addon/hint/show-hint.js'\nimport 'codemirror/addon/hint/css-hint.js'\nimport '../scripts/format.js'\n\nimport fileApi from '../api/file';\nimport editorHeader from './codeMirror/header';\nimport aboutDialog from './codeMirror/aboutDialog';\nimport insertFormDialog from './codeMirror/insertForm';\nimport {\n setFontSize,\n css2json,\n customCssWithTemplate,\n saveEditorContent,\n isImageIllegal\n} from '../scripts/util'\n\nrequire('codemirror/mode/javascript/javascript')\nimport '../scripts/closebrackets'\nimport $ from 'jquery'\nimport config from '../scripts/config'\nimport {mapState, mapMutations} from 'vuex';\nexport default {\n data() {\n return {\n config: config,\n showBox: false,\n aboutDialogVisible: false,\n dialogFormVisible: false,\n timeout: null,\n source: ''\n }\n },\n components: {\n editorHeader, aboutDialog, insertFormDialog\n },\n computed: {\n ...mapState({\n wxRenderer: state=> state.wxRenderer,\n output: state=> state.output,\n editor: state=> state.editor,\n cssEditor: state=> state.cssEditor,\n currentSize: state=> state.currentSize,\n currentColor: state=> state.currentColor,\n html: state=> state.html\n })\n },\n created() {\n this.initEditorState()\n this.$nextTick(() => {\n this.initEditor()\n this.initCssEditor()\n this.editorRefresh()\n })\n },\n methods: {\n initEditor() {\n this.initEditorEntity();\n this.editor.on('change', (cm, e) => {\n this.editorRefresh()\n saveEditorContent(this.editor, '__editor_content')\n });\n\n // 粘贴上传图片并插入\n this.editor.on('paste', (cm, e) => {\n if (!(e.clipboardData && e.clipboardData.items)) {\n return\n }\n for (let i = 0, len = e.clipboardData.items.length; i < len; ++i) {\n let item = e.clipboardData.items[i]\n if (item.kind === 'file') {\n const pasteFile = item.getAsFile()\n const checkImageResult = isImageIllegal(pasteFile);\n\n if (checkImageResult) {\n this.$message({\n showClose: true,\n message: checkImageResult,\n type: 'error'\n });\n return;\n }\n let data = new FormData()\n data.append('file', pasteFile)\n\n fileApi.fileUpload(data).then(res => {\n this.uploaded(res)\n }).catch(err => {\n console.log(err.message)\n })\n }\n }\n });\n },\n initCssEditor() {\n this.initCssEditorEntity();\n // 自动提示\n this.cssEditor.on('keyup', (cm, e) => {\n if ((e.keyCode >= 65 && e.keyCode <= 90) || e.keyCode === 189) {\n cm.showHint(e)\n }\n });\n this.cssEditor.on('update', (instance) => {\n this.cssChanged()\n saveEditorContent(this.cssEditor, '__css_content')\n })\n },\n cssChanged() {\n let json = css2json(this.cssEditor.getValue(0))\n let theme = setFontSize(this.currentSize.replace('px', ''))\n\n theme = customCssWithTemplate(json, this.currentColor, theme)\n this.setWxRendererOptions({\n theme: theme\n });\n this.editorRefresh()\n },\n // 图片上传结束\n uploaded(response, file, fileList) {\n if (response) {\n if (response.success) {\n // 上传成功,获取光标\n const cursor = this.editor.getCursor()\n const imageUrl = response.data\n const markdownImage = `![](${imageUrl})`\n // 将 Markdown 形式的 URL 插入编辑框光标所在位置\n this.editor.replaceSelection(`\\n${markdownImage}\\n`, cursor)\n this.$message({\n showClose: true,\n message: '图片插入成功',\n type: 'success'\n })\n this.editorRefresh()\n } else {\n // 上传失败\n this.$message({\n showClose: true,\n message: response.message,\n type: 'error'\n })\n }\n } else {\n this.$message({\n showClose: true,\n message: '上传图片未知异常',\n type: 'error'\n })\n }\n },\n // 左右栏同步滚动\n leftAndRightScroll() {\n $('div.CodeMirror-scroll, #preview').on('scroll', function callback() {\n clearTimeout(this.timeout)\n\n let source = $(this)\n let target = $(source.is('#preview') ? 'div.CodeMirror-scroll' : '#preview')\n\n target.off('scroll')\n\n let source0 = source[0]\n let target0 = target[0]\n\n let percentage = source0.scrollTop / (source0.scrollHeight - source0.offsetHeight)\n let height = percentage * (target0.scrollHeight - target0.offsetHeight)\n target0.scrollTo(0, height)\n\n this.timeout = setTimeout(() => {\n target.on('scroll', callback)\n }, 100)\n })\n },\n ...mapMutations(['initEditorState', 'initEditorEntity', 'setWxRendererOptions',\n 'editorRefresh', 'initCssEditorEntity'])\n },\n mounted() {\n this.leftAndRightScroll()\n }\n}\n\n</script>\n<style lang=\"less\" scoped>\n.main-body {\n padding-top: 0;\n}\n</style>\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=a0bd6f2e&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=a0bd6f2e&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 \"a0bd6f2e\",\n null\n \n)\n\nexport default component.exports","<template>\n <loading v-if=\"loading\" />\n <codemirror-editor v-else />\n</template>\n\n<script>\nimport Loading from './components/Loading'\nimport CodemirrorEditor from './components/CodemirrorEditor'\nimport prettyPrint from 'prettify'\nexport default {\n name: 'App',\n components: {\n Loading,\n CodemirrorEditor\n },\n data() {\n return {\n loading: true\n }\n },\n mounted() {\n setTimeout(() => {\n this.loading = false\n }, 200)\n window.console &&\n window.console.log &&\n (console.log(\"Think big, train fast, learn deep. See https://github.com/yanglbme\"))\n setTimeout(() => {\n // document.body.addEventListener('load', prettyPrint())\n }, 2000)\n }\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n</style>\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=208915a8&scoped=true&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.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 \"208915a8\",\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('div',{staticClass:\"home\"})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"home\">\n </div>\n</template>\n\n<script>\n// @ is an alias to /src\n\nexport default {\n name: 'home',\n components: {\n }\n}\n</script>\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!./Home.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!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=18be6acc&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.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 null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport Home from '../views/Home.vue'\n\nVue.use(VueRouter)\n\nconst routes = [\n {\n path: '/',\n name: 'home',\n component: Home\n },\n {\n path: '/about',\n name: 'about',\n // route level code-splitting\n // this generates a separate chunk (about.[hash].js) for this route\n // which is lazy-loaded when the route is visited.\n component: () => import(/* webpackChunkName: \"about\" */ '../views/About.vue')\n }\n]\n\nconst router = new VueRouter({\n mode: 'history',\n base: process.env.BASE_URL,\n routes\n})\n\nexport default router\n","import marked from 'marked'\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 `<code style=\"font-size: 90%; opacity: 0.6;\">[${x[0]}]</code>: <i>${x[1]}</i><br/>`\n }\n return `<code style=\"font-size: 90%; opacity: 0.6;\">[${x[0]}]</code> ${x[1]}: <i>${x[2]}</i><br/>`\n })\n return `<h4 ${getStyles('h4')}>引用链接</h4><p ${getStyles('footnotes')}>${footnoteArray.join('\\n')}</p>`\n }\n\n this.buildAddition = () => {\n 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 `\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 `<h1 ${getStyles('h1')}>${text}</h1>`\n case 2:\n return `<h2 ${getStyles('h2')}>${text}</h2>`\n case 3:\n return `<h3 ${getStyles('h3')}>${text}</h3>`\n default:\n return `<h4 ${getStyles('h4')}>${text}</h4>`\n }\n }\n renderer.paragraph = text => `<p ${getStyles('p')}>${text}</p>`\n\n renderer.blockquote = text => {\n text = text.replace(/<p.*?>/, `<p ${getStyles('blockquote_p')}>`)\n return `<blockquote ${getStyles('blockquote')}>${text}</blockquote>`\n }\n renderer.code = (text, infoString) => {\n text = text.replace(/</g, '&lt;')\n text = text.replace(/>/g, '&gt;')\n\n let lines = text.split('\\n')\n let codeLines = []\n let numbers = []\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n codeLines.push(`<code class=\"prettyprint\"><span class=\"code-snippet_outer\">${(line || '<br>')}</span></code>`)\n numbers.push('<li></li>')\n }\n let lang = infoString || ''\n\n return `\n <section class=\"code-snippet__fix code-snippet__js\">\n <ul class=\"code-snippet__line-index code-snippet__js\">${numbers.join('')}</ul>\n <pre class=\"code-snippet__js\" data-lang=\"${lang}\">\n ${codeLines.join('')}\n </pre>\n </section>\n `\n }\n renderer.codespan = (text, infoString) => `<code ${getStyles('codespan')}>${text}</code>`\n renderer.listitem = text => `<span ${getStyles('listitem')}><span style=\"margin-right: 10px;\"><%s/></span>${text}</span>`\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 `<p ${getStyles('ul')}>${text}</p>`\n }\n text = segments[0]\n for (let i = 1; i < segments.length; i++) {\n text = text + i + '.' + segments[i]\n }\n return `<p ${getStyles('ol')}>${text}</p>`\n }\n renderer.image = (href, title, text) => {\n let subText = ''\n if (text) {\n subText = `<figcaption ${getStyles('figcaption')}>${text}</figcaption>`\n }\n let figureStyles = getStyles('figure')\n let imgStyles = getStyles(ENV_STRETCH_IMAGE ? 'image' : 'image_org')\n return `<figure ${figureStyles}><img ${imgStyles} src=\"${href}\" title=\"${title}\" alt=\"${text}\"/>${subText}</figure>`\n }\n renderer.link = (href, title, text) => {\n if (href.indexOf('https://mp.weixin.qq.com') === 0) {\n return `<a href=\"${href}\" title=\"${(title || text)}\" ${getStyles('wx_link')}>${text}</a>`\n } else if (href === text) {\n return text\n } else {\n if (status) {\n let ref = addFootnote(title || text, href)\n return `<span ${getStyles('link')}>${text}<sup>[${ref}]</sup></span>`\n } else {\n return text\n }\n }\n }\n renderer.strong = text => `<strong ${getStyles('strong')}>${text}</strong>`\n renderer.em = text => `<p ${getStyles('p', ';font-style: italic;')}>${text}</p>`\n renderer.table = (header, body) => `<section style=\"padding:0 8px;\"><table class=\"preview-table\"><thead ${getStyles('thead')}>${header}</thead><tbody>${body}</tbody></table></section>`\n // renderer.tablerow = (text) => `<tr style=\"\">${text}</tr>`;\n renderer.tablecell = (text, flags) => `<td ${getStyles('td')}>${text}</td>`\n renderer.hr = () => `<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);\">`\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<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`\nexport default DEFAULT_CONTENT\n","import Vue from 'vue'\nimport Vuex from 'vuex'\nimport config from '../scripts/config';\nimport WxRenderer from '../scripts/renderers/wx-renderer'\nimport marked from 'marked'\nimport CodeMirror from 'codemirror/lib/codemirror'\nimport DEFAULT_CONTENT from '../scripts/default-content'\nimport DEFAULT_CSS_CONTENT from '../scripts/themes/default-theme-css'\nimport {\n setColor\n} from '../scripts/util'\n\nVue.use(Vuex)\n\nconst state = {\n wxRenderer: null,\n output: '',\n editor: null,\n cssEditor: null,\n html: '',\n currentFont: '',\n currentSize: '',\n currentColor: '',\n citeStatus: 0\n};\nconst mutations = {\n setHtml(state, data) {\n state.html = data;\n },\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 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.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 {\n value: '',\n mode: 'text/x-markdown',\n theme: 'xq-light',\n lineNumbers: false,\n lineWrapping: true,\n styleActiveLine: true,\n autoCloseBrackets: true\n }\n )\n // 如果有编辑器内容被保存则读取,否则加载默认内容\n if (localStorage.getItem('__editor_content')) {\n state.editor.setValue(localStorage.getItem('__editor_content'))\n } else {\n state.editor.setValue(DEFAULT_CONTENT)\n }\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\n editor.autoFormatRange({\n line: 0,\n ch: 0\n }, {\n line: totalLines\n })\n }\n }\n }\n )\n\n // 如果有编辑器内容被保存则读取,否则加载默认内容\n if (localStorage.getItem('__css_content')) {\n state.cssEditor.setValue(localStorage.getItem('__css_content'))\n } else {\n state.cssEditor.setValue(DEFAULT_CSS_CONTENT)\n }\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 \n state.output = output\n },\n clearEditorToDefault(state) {\n state.editor.setValue(DEFAULT_CONTENT)\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 Vue from 'vue'\nimport App from './App.vue'\nimport router from './router'\nimport store from './store'\nimport ElementUI from 'element-ui'\nimport 'element-ui/lib/theme-chalk/index.css'\nimport './element'\nimport 'codemirror/lib/codemirror.css';\nimport \"codemirror/theme/ambiance.css\";\nimport \"codemirror/addon/hint/show-hint.css\";\nimport \"codemirror/theme/xq-light.css\";\nVue.use(ElementUI)\n\nVue.config.productionTip = false\n\nnew Vue({\n router,\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!./header.vue?vue&type=style&index=0&id=257e3ffe&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!./header.vue?vue&type=style&index=0&id=257e3ffe&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!./CodemirrorEditor.vue?vue&type=style&index=0&id=a0bd6f2e&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=a0bd6f2e&lang=less&scoped=true&\""],"sourceRoot":""}