UNPKG

shuyun-ng-editor

Version:

shuyun angularJs editor

146 lines (127 loc) 123 kB
/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 9); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports) { eval("module.exports = angular;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9leHRlcm5hbCBcImFuZ3VsYXJcIj9mNzg1Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gYW5ndWxhcjsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n"); /***/ }), /* 1 */ /***/ (function(module, exports) { eval("module.exports = \"<div class=\\\"editor-keywords\\\" ng-style=\\\"{'width': '{{$ctrl.width}}' }\\\">\\n\\t<!-- 类型选择器部分 -->\\n\\t<div ng-if=\\\"$ctrl.keywordTypes.length > 1\\\">\\n\\t\\t<span ng-repeat=\\\"keywordType in $ctrl.keywordTypes\\\"\\n\\t\\t\\tng-class=\\\"'editor-keywords-type ' + keywordType + (keywordType === $ctrl.currentType ? ' active' : '')\\\"\\n\\t\\t\\tng-click=\\\"$ctrl.changeTypeClick(keywordType)\\\"\\n\\t\\t\\tng-bind=\\\"keywordType\\\">\\n\\t\\t</span>\\n\\t</div>\\n\\t<!-- 当前类型下的关键词组成 -->\\n\\t<div class=\\\"editor-keywords-wrapper\\\" ng-style=\\\"{'padding-right': $ctrl.isShowAll ? '0':'45px'}\\\" ng-if=\\\"$ctrl.keywords.length\\\">\\n\\n\\t\\t<ul ng-class=\\\"'editor-keywords-list' + (($ctrl.toggle || $ctrl.isShowAll) ? ' expanded': '')\\\">\\n\\t\\t\\t<li class=\\\"editor-keywords-item\\\"\\n\\t\\t\\t\\tng-repeat=\\\"keyword in $ctrl.keywordsInCurrentType\\\"\\n\\t\\t\\t\\tng-if=\\\"keyword.isShow\\\"\\n\\t\\t\\t\\tng-class=\\\"{'disabled': keyword.disabled}\\\"\\n\\t\\t\\t\\tng-click=\\\"$ctrl.insertKeywordClick(keyword)\\\">\\n\\t\\t\\t\\t#{{keyword.text}}\\n\\t\\t\\t</li>\\n\\t\\t</ul>\\n\\n\\t\\t<span ng-if=\\\"!$ctrl.isShowAll\\\" class=\\\"editor-keywords-toggle\\\" ng-if=\\\"$ctrl.isShowToggle\\\" ng-click=\\\"$ctrl.toggleClick()\\\"></span>\\n\\t</div>\\n</div>\\n\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9rZXl3b3JkL2luZGV4LnRwbC5odG1sPzEwNjYiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcImVkaXRvci1rZXl3b3Jkc1xcXCIgbmctc3R5bGU9XFxcInsnd2lkdGgnOiAne3skY3RybC53aWR0aH19JyB9XFxcIj5cXG5cXHQ8IS0tIOexu+Wei+mAieaLqeWZqOmDqOWIhiAtLT5cXG5cXHQ8ZGl2IG5nLWlmPVxcXCIkY3RybC5rZXl3b3JkVHlwZXMubGVuZ3RoID4gMVxcXCI+XFxuXFx0XFx0PHNwYW4gbmctcmVwZWF0PVxcXCJrZXl3b3JkVHlwZSBpbiAkY3RybC5rZXl3b3JkVHlwZXNcXFwiXFxuXFx0XFx0XFx0bmctY2xhc3M9XFxcIidlZGl0b3Ita2V5d29yZHMtdHlwZSAnICsga2V5d29yZFR5cGUgKyAoa2V5d29yZFR5cGUgPT09ICRjdHJsLmN1cnJlbnRUeXBlID8gJyBhY3RpdmUnIDogJycpXFxcIlxcblxcdFxcdFxcdG5nLWNsaWNrPVxcXCIkY3RybC5jaGFuZ2VUeXBlQ2xpY2soa2V5d29yZFR5cGUpXFxcIlxcblxcdFxcdFxcdG5nLWJpbmQ9XFxcImtleXdvcmRUeXBlXFxcIj5cXG5cXHRcXHQ8L3NwYW4+XFxuXFx0PC9kaXY+XFxuXFx0PCEtLSDlvZPliY3nsbvlnovkuIvnmoTlhbPplK7or43nu4TmiJAgLS0+XFxuXFx0PGRpdiBjbGFzcz1cXFwiZWRpdG9yLWtleXdvcmRzLXdyYXBwZXJcXFwiIG5nLXN0eWxlPVxcXCJ7J3BhZGRpbmctcmlnaHQnOiAkY3RybC5pc1Nob3dBbGwgPyAnMCc6JzQ1cHgnfVxcXCIgbmctaWY9XFxcIiRjdHJsLmtleXdvcmRzLmxlbmd0aFxcXCI+XFxuXFxuXFx0XFx0PHVsIG5nLWNsYXNzPVxcXCInZWRpdG9yLWtleXdvcmRzLWxpc3QnICsgKCgkY3RybC50b2dnbGUgfHwgJGN0cmwuaXNTaG93QWxsKSA/ICcgZXhwYW5kZWQnOiAnJylcXFwiPlxcblxcdFxcdFxcdDxsaSBjbGFzcz1cXFwiZWRpdG9yLWtleXdvcmRzLWl0ZW1cXFwiXFxuXFx0XFx0XFx0XFx0bmctcmVwZWF0PVxcXCJrZXl3b3JkIGluICRjdHJsLmtleXdvcmRzSW5DdXJyZW50VHlwZVxcXCJcXG5cXHRcXHRcXHRcXHRuZy1pZj1cXFwia2V5d29yZC5pc1Nob3dcXFwiXFxuXFx0XFx0XFx0XFx0bmctY2xhc3M9XFxcInsnZGlzYWJsZWQnOiBrZXl3b3JkLmRpc2FibGVkfVxcXCJcXG5cXHRcXHRcXHRcXHRuZy1jbGljaz1cXFwiJGN0cmwuaW5zZXJ0S2V5d29yZENsaWNrKGtleXdvcmQpXFxcIj5cXG5cXHRcXHRcXHRcXHQje3trZXl3b3JkLnRleHR9fVxcblxcdFxcdFxcdDwvbGk+XFxuXFx0XFx0PC91bD5cXG5cXG5cXHRcXHQ8c3BhbiBuZy1pZj1cXFwiISRjdHJsLmlzU2hvd0FsbFxcXCIgY2xhc3M9XFxcImVkaXRvci1rZXl3b3Jkcy10b2dnbGVcXFwiIG5nLWlmPVxcXCIkY3RybC5pc1Nob3dUb2dnbGVcXFwiIG5nLWNsaWNrPVxcXCIkY3RybC50b2dnbGVDbGljaygpXFxcIj48L3NwYW4+XFxuXFx0PC9kaXY+XFxuPC9kaXY+XFxuXCI7Il0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n"); /***/ }), /* 2 */ /***/ (function(module, exports) { eval("module.exports = \"<div class=\\\"editor\\\" ng-style=\\\"{width: '{{$ctrl.styles.width}}', 'font-size': '{{$ctrl.styles.fontSize}}' }\\\">\\n\\n\\t<div ng-class=\\\"'editor-content' + ($ctrl.resultContent.length === 0 ? ' empty' : '')\\\" data-empty=\\\"请输入内容…\\\">\\n\\n\\t\\t<div ng-style=\\\"{'min-height': '{{$ctrl.styles.height}}', 'max-height': '{{$ctrl.styles.maxHeight}}'}\\\"\\n\\t\\t\\tclass=\\\"editor-content-main\\\"\\n\\t\\t\\tdata-content\\n\\t\\t\\tcontenteditable=\\\"{{!$ctrl.disabled}}\\\"\\n\\t\\t\\tng-keydown=\\\"$ctrl.handleKeyDown($event)\\\"\\n\\t\\t\\tng-keyup=\\\"$ctrl.onChange($event)\\\"\\n\\t\\t\\tng-mouseup=\\\"$ctrl.onChange($event)\\\"\\n\\t\\t\\tng-paste=\\\"$ctrl.handlePaste($event)\\\"\\n\\t\\t\\tng-focus=\\\"$ctrl.handleFoucsEvent()\\\"\\n\\t\\t\\tng-blur=\\\"$ctrl.handleBlurEvent()\\\">\\n\\t\\t</div>\\n\\t\\t<div class=\\\"url-tips\\\" ng-if=\\\"$ctrl.tip && !$ctrl.invalidStringClosed\\\">\\n\\t\\t\\t{{ $ctrl.tip }}\\n\\t\\t\\t<span class=\\\"url-tips-close\\\" ng-click=\\\"$ctrl.handleCloseInvalidString()\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"url-tips\\\" ng-if=\\\"$ctrl.urlTip && !$ctrl.urlTipClosed\\\">\\n\\t\\t\\t{{ $ctrl.urlTip }}\\n\\t\\t\\t<span class=\\\"url-tips-close\\\" ng-click=\\\"$ctrl.handleCloseUrlTip()\\\"></span>\\n\\t\\t</div>\\n\\n\\t</div>\\n</div>\\n\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9lZGl0b3IvbWFpbi9pbmRleC50cGwuaHRtbD83ZWY3Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJlZGl0b3JcXFwiIG5nLXN0eWxlPVxcXCJ7d2lkdGg6ICd7eyRjdHJsLnN0eWxlcy53aWR0aH19JywgJ2ZvbnQtc2l6ZSc6ICd7eyRjdHJsLnN0eWxlcy5mb250U2l6ZX19JyB9XFxcIj5cXG5cXG5cXHQ8ZGl2IG5nLWNsYXNzPVxcXCInZWRpdG9yLWNvbnRlbnQnICsgKCRjdHJsLnJlc3VsdENvbnRlbnQubGVuZ3RoID09PSAwID8gJyBlbXB0eScgOiAnJylcXFwiIGRhdGEtZW1wdHk9XFxcIuivt+i+k+WFpeWGheWuueKAplxcXCI+XFxuXFxuXFx0XFx0PGRpdiBuZy1zdHlsZT1cXFwieydtaW4taGVpZ2h0JzogJ3t7JGN0cmwuc3R5bGVzLmhlaWdodH19JywgJ21heC1oZWlnaHQnOiAne3skY3RybC5zdHlsZXMubWF4SGVpZ2h0fX0nfVxcXCJcXG5cXHRcXHRcXHRjbGFzcz1cXFwiZWRpdG9yLWNvbnRlbnQtbWFpblxcXCJcXG5cXHRcXHRcXHRkYXRhLWNvbnRlbnRcXG5cXHRcXHRcXHRjb250ZW50ZWRpdGFibGU9XFxcInt7ISRjdHJsLmRpc2FibGVkfX1cXFwiXFxuXFx0XFx0XFx0bmcta2V5ZG93bj1cXFwiJGN0cmwuaGFuZGxlS2V5RG93bigkZXZlbnQpXFxcIlxcblxcdFxcdFxcdG5nLWtleXVwPVxcXCIkY3RybC5vbkNoYW5nZSgkZXZlbnQpXFxcIlxcblxcdFxcdFxcdG5nLW1vdXNldXA9XFxcIiRjdHJsLm9uQ2hhbmdlKCRldmVudClcXFwiXFxuXFx0XFx0XFx0bmctcGFzdGU9XFxcIiRjdHJsLmhhbmRsZVBhc3RlKCRldmVudClcXFwiXFxuXFx0XFx0XFx0bmctZm9jdXM9XFxcIiRjdHJsLmhhbmRsZUZvdWNzRXZlbnQoKVxcXCJcXG5cXHRcXHRcXHRuZy1ibHVyPVxcXCIkY3RybC5oYW5kbGVCbHVyRXZlbnQoKVxcXCI+XFxuXFx0XFx0PC9kaXY+XFxuXFx0XFx0PGRpdiBjbGFzcz1cXFwidXJsLXRpcHNcXFwiIG5nLWlmPVxcXCIkY3RybC50aXAgJiYgISRjdHJsLmludmFsaWRTdHJpbmdDbG9zZWRcXFwiPlxcblxcdFxcdFxcdHt7ICRjdHJsLnRpcCB9fVxcblxcdFxcdFxcdDxzcGFuIGNsYXNzPVxcXCJ1cmwtdGlwcy1jbG9zZVxcXCIgbmctY2xpY2s9XFxcIiRjdHJsLmhhbmRsZUNsb3NlSW52YWxpZFN0cmluZygpXFxcIj48L3NwYW4+XFxuXFx0XFx0PC9kaXY+XFxuXFxuXFx0XFx0PGRpdiBjbGFzcz1cXFwidXJsLXRpcHNcXFwiIG5nLWlmPVxcXCIkY3RybC51cmxUaXAgJiYgISRjdHJsLnVybFRpcENsb3NlZFxcXCI+XFxuXFx0XFx0XFx0e3sgJGN0cmwudXJsVGlwIH19XFxuXFx0XFx0XFx0PHNwYW4gY2xhc3M9XFxcInVybC10aXBzLWNsb3NlXFxcIiBuZy1jbGljaz1cXFwiJGN0cmwuaGFuZGxlQ2xvc2VVcmxUaXAoKVxcXCI+PC9zcGFuPlxcblxcdFxcdDwvZGl2PlxcblxcblxcdDwvZGl2PlxcbjwvZGl2PlxcblwiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2\n"); /***/ }), /* 3 */ /***/ (function(module, exports) { eval("module.exports = \"<div>\\n\\t<shuyun-editor-main\\n\\t\\tref=\\\"$ctrl.setRef\\\"\\n\\t\\tplaceholder=\\\"$ctrl.placeholder\\\"\\n\\t\\tstyles=\\\"$ctrl.styles\\\"\\n\\t\\turl-tip=\\\"$ctrl.urlTip\\\"\\n\\t\\tresult-content=\\\"$ctrl.resultContent\\\"\\n\\t\\tdisabled=\\\"$ctrl.disabled\\\"\\n\\t\\tis-trim-space=\\\"$ctrl.isTrimSpace\\\"\\n\\t\\tillegal-char=\\\"$ctrl.illegalChar\\\"\\n\\t\\ton-focus=\\\"$ctrl.onFocus\\\"\\n\\t\\ton-blur=\\\"$ctrl.onBlur\\\"\\n\\t\\ton-content-changed-action=\\\"$ctrl.handleContent\\\">\\n\\t</shuyun-editor-main>\\n\\n\\t<div class=\\\"sms-temp\\\" style=\\\"display: none\\\"></div>\\n</div>\\n\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9lZGl0b3IvaW5kZXgudHBsLmh0bWw/NmIyMyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdj5cXG5cXHQ8c2h1eXVuLWVkaXRvci1tYWluXFxuXFx0XFx0cmVmPVxcXCIkY3RybC5zZXRSZWZcXFwiXFxuXFx0XFx0cGxhY2Vob2xkZXI9XFxcIiRjdHJsLnBsYWNlaG9sZGVyXFxcIlxcblxcdFxcdHN0eWxlcz1cXFwiJGN0cmwuc3R5bGVzXFxcIlxcblxcdFxcdHVybC10aXA9XFxcIiRjdHJsLnVybFRpcFxcXCJcXG5cXHRcXHRyZXN1bHQtY29udGVudD1cXFwiJGN0cmwucmVzdWx0Q29udGVudFxcXCJcXG5cXHRcXHRkaXNhYmxlZD1cXFwiJGN0cmwuZGlzYWJsZWRcXFwiXFxuXFx0XFx0aXMtdHJpbS1zcGFjZT1cXFwiJGN0cmwuaXNUcmltU3BhY2VcXFwiXFxuXFx0XFx0aWxsZWdhbC1jaGFyPVxcXCIkY3RybC5pbGxlZ2FsQ2hhclxcXCJcXG5cXHRcXHRvbi1mb2N1cz1cXFwiJGN0cmwub25Gb2N1c1xcXCJcXG5cXHRcXHRvbi1ibHVyPVxcXCIkY3RybC5vbkJsdXJcXFwiXFxuXFx0XFx0b24tY29udGVudC1jaGFuZ2VkLWFjdGlvbj1cXFwiJGN0cmwuaGFuZGxlQ29udGVudFxcXCI+XFxuXFx0PC9zaHV5dW4tZWRpdG9yLW1haW4+XFxuXFxuXFx0PGRpdiBjbGFzcz1cXFwic21zLXRlbXBcXFwiIHN0eWxlPVxcXCJkaXNwbGF5OiBub25lXFxcIj48L2Rpdj5cXG48L2Rpdj5cXG5cIjsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3\n"); /***/ }), /* 4 */ /***/ (function(module, exports) { eval("module.exports = \"<div>\\n\\t<shuyun-editor-keyword\\n\\t\\tis-show-all=\\\"true\\\"\\n\\t\\tkeywords=\\\"$ctrl.keywords\\\"\\n\\t\\twidth=\\\"'300px'\\\"\\n\\t\\ton-insert-keyword-action=\\\"$ctrl.insertKeyword\\\">\\n\\t</shuyun-editor-keyword>\\n\\n\\t<shuyun-editor-content\\n\\t\\tref=\\\"$ctrl.defineRef\\\"\\n\\t\\turl-tip=\\\"$ctrl.tip\\\"\\n\\t\\tplaceholder=\\\"'请输入短信内容...'\\\"\\n\\t\\tkeywords=\\\"$ctrl.keywords\\\"\\n\\t\\tdisabled=\\\"$ctrl.opts.disabled\\\"\\n\\t\\tcontent=\\\"$ctrl.opts.content\\\"\\n\\t\\tis-trim-space=\\\"$ctrl.opts.isTrimSpace\\\"\\n\\t\\tstyles=\\\"$ctrl.opts.styles\\\"\\n\\t\\thas-tag-in-preview=\\\"true\\\"\\n\\t\\tillegal-char=\\\"$ctrl.illegalChar\\\"\\n\\t\\ton-content-changed-action=\\\"$ctrl.handleContentChanged\\\">\\n\\t</shuyun-editor-content>\\n</div>\\n\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9zbXMvZWRpdG9yL2luZGV4LnRwbC5odG1sPzljNjEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXY+XFxuXFx0PHNodXl1bi1lZGl0b3Ita2V5d29yZFxcblxcdFxcdGlzLXNob3ctYWxsPVxcXCJ0cnVlXFxcIlxcblxcdFxcdGtleXdvcmRzPVxcXCIkY3RybC5rZXl3b3Jkc1xcXCJcXG5cXHRcXHR3aWR0aD1cXFwiJzMwMHB4J1xcXCJcXG5cXHRcXHRvbi1pbnNlcnQta2V5d29yZC1hY3Rpb249XFxcIiRjdHJsLmluc2VydEtleXdvcmRcXFwiPlxcblxcdDwvc2h1eXVuLWVkaXRvci1rZXl3b3JkPlxcblxcblxcdDxzaHV5dW4tZWRpdG9yLWNvbnRlbnRcXG5cXHRcXHRyZWY9XFxcIiRjdHJsLmRlZmluZVJlZlxcXCJcXG5cXHRcXHR1cmwtdGlwPVxcXCIkY3RybC50aXBcXFwiXFxuXFx0XFx0cGxhY2Vob2xkZXI9XFxcIifor7fovpPlhaXnn63kv6HlhoXlrrkuLi4nXFxcIlxcblxcdFxcdGtleXdvcmRzPVxcXCIkY3RybC5rZXl3b3Jkc1xcXCJcXG5cXHRcXHRkaXNhYmxlZD1cXFwiJGN0cmwub3B0cy5kaXNhYmxlZFxcXCJcXG5cXHRcXHRjb250ZW50PVxcXCIkY3RybC5vcHRzLmNvbnRlbnRcXFwiXFxuXFx0XFx0aXMtdHJpbS1zcGFjZT1cXFwiJGN0cmwub3B0cy5pc1RyaW1TcGFjZVxcXCJcXG5cXHRcXHRzdHlsZXM9XFxcIiRjdHJsLm9wdHMuc3R5bGVzXFxcIlxcblxcdFxcdGhhcy10YWctaW4tcHJldmlldz1cXFwidHJ1ZVxcXCJcXG5cXHRcXHRpbGxlZ2FsLWNoYXI9XFxcIiRjdHJsLmlsbGVnYWxDaGFyXFxcIlxcblxcdFxcdG9uLWNvbnRlbnQtY2hhbmdlZC1hY3Rpb249XFxcIiRjdHJsLmhhbmRsZUNvbnRlbnRDaGFuZ2VkXFxcIj5cXG5cXHQ8L3NodXl1bi1lZGl0b3ItY29udGVudD5cXG48L2Rpdj5cXG5cIjsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4\n"); /***/ }), /* 5 */ /***/ (function(module, exports) { eval("module.exports = \"<div class=\\\"shuyun-sms-preview\\\">\\n\\t<div class=\\\"shuyun-sms-preview-mock\\\">\\n\\t\\t<div class=\\\"shuyun-sms-preview-header\\\">\\n\\t\\t\\t<span class=\\\"shuyun-sms-preview-battery\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"shuyun-sms-preview-main\\\">\\n\\t\\t\\t<div class=\\\"shuyun-sms-preview-content js-preview\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"shuyun-sms-preview-counter\\\">\\n\\t\\t<span class=\\\"shuyun-sms-preview-counter-number\\\" ng-bind=\\\"$ctrl.totals\\\"></span> 个字(不含变量\\n\\t\\t<span ng-if=\\\"$ctrl.opts.newLineNumber > 0\\\">,含\\n\\t\\t\\t<span class=\\\"shuyun-sms-preview-counter-number\\\" ng-bind=\\\"$ctrl.opts.newLineNumber\\\"></span>\\n\\t\\t\\t个换行符\\n\\t\\t</span>\\n\\t\\t),\\n\\t\\t<span class=\\\"shuyun-sms-preview-counter-number\\\" ng-bind=\\\"$ctrl.opts.variableNumber\\\"></span> 个变量\\n\\t</div>\\n\\t<div class=\\\"shuyun-sms-preview-tips\\\">\\n\\t\\t<p>\\n\\t\\t\\t1.当前通道单条短信字数限制 <span class=\\\"shuyun-sms-preview-warning\\\" ng-bind=\\\"$ctrl.opts.gateway.wordsLimit\\\"></span> 个字;超出 {{ $ctrl.opts.gateway.wordsLimit }} 个字,均按 <span class=\\\"shuyun-sms-preview-warning\\\" ng-bind=\\\"$ctrl.opts.gateway.multiLimit\\\"></span> 字一条计费;\\n\\t\\t</p>\\n\\t\\t<span ng-if=\\\"$ctrl.opts.isTrimSpace\\\">2.上图仅为操作预览,最终字数和计费条数以实际执行时发送为准。</span>\\n\\t\\t<span ng-if=\\\"!$ctrl.opts.isTrimSpace\\\">2.上图仅为操作预览,变量无固定长度,最终字数和计费条数以实际执行时发送为准,建议先测试执行。</span>\\n\\t</div>\\n</div>\\n\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9zbXMvcHJldmlldy9pbmRleC50cGwuaHRtbD8wNmRhIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJzaHV5dW4tc21zLXByZXZpZXdcXFwiPlxcblxcdDxkaXYgY2xhc3M9XFxcInNodXl1bi1zbXMtcHJldmlldy1tb2NrXFxcIj5cXG5cXHRcXHQ8ZGl2IGNsYXNzPVxcXCJzaHV5dW4tc21zLXByZXZpZXctaGVhZGVyXFxcIj5cXG5cXHRcXHRcXHQ8c3BhbiBjbGFzcz1cXFwic2h1eXVuLXNtcy1wcmV2aWV3LWJhdHRlcnlcXFwiPjwvc3Bhbj5cXG5cXHRcXHQ8L2Rpdj5cXG5cXG5cXHRcXHQ8ZGl2IGNsYXNzPVxcXCJzaHV5dW4tc21zLXByZXZpZXctbWFpblxcXCI+XFxuXFx0XFx0XFx0PGRpdiBjbGFzcz1cXFwic2h1eXVuLXNtcy1wcmV2aWV3LWNvbnRlbnQganMtcHJldmlld1xcXCI+PC9kaXY+XFxuXFx0XFx0PC9kaXY+XFxuXFx0PC9kaXY+XFxuXFxuXFx0PGRpdiBjbGFzcz1cXFwic2h1eXVuLXNtcy1wcmV2aWV3LWNvdW50ZXJcXFwiPlxcblxcdFxcdDxzcGFuIGNsYXNzPVxcXCJzaHV5dW4tc21zLXByZXZpZXctY291bnRlci1udW1iZXJcXFwiIG5nLWJpbmQ9XFxcIiRjdHJsLnRvdGFsc1xcXCI+PC9zcGFuPiDkuKrlrZco5LiN5ZCr5Y+Y6YePXFxuXFx0XFx0PHNwYW4gbmctaWY9XFxcIiRjdHJsLm9wdHMubmV3TGluZU51bWJlciA+IDBcXFwiPu+8jOWQq1xcblxcdFxcdFxcdDxzcGFuIGNsYXNzPVxcXCJzaHV5dW4tc21zLXByZXZpZXctY291bnRlci1udW1iZXJcXFwiIG5nLWJpbmQ9XFxcIiRjdHJsLm9wdHMubmV3TGluZU51bWJlclxcXCI+PC9zcGFuPlxcblxcdFxcdFxcdOS4quaNouihjOesplxcblxcdFxcdDwvc3Bhbj5cXG5cXHRcXHQp77yMXFxuXFx0XFx0PHNwYW4gY2xhc3M9XFxcInNodXl1bi1zbXMtcHJldmlldy1jb3VudGVyLW51bWJlclxcXCIgbmctYmluZD1cXFwiJGN0cmwub3B0cy52YXJpYWJsZU51bWJlclxcXCI+PC9zcGFuPiDkuKrlj5jph49cXG5cXHQ8L2Rpdj5cXG5cXHQ8ZGl2IGNsYXNzPVxcXCJzaHV5dW4tc21zLXByZXZpZXctdGlwc1xcXCI+XFxuXFx0XFx0PHA+XFxuXFx0XFx0XFx0MS7lvZPliY3pgJrpgZPljZXmnaHnn63kv6HlrZfmlbDpmZDliLYgPHNwYW4gY2xhc3M9XFxcInNodXl1bi1zbXMtcHJldmlldy13YXJuaW5nXFxcIiBuZy1iaW5kPVxcXCIkY3RybC5vcHRzLmdhdGV3YXkud29yZHNMaW1pdFxcXCI+PC9zcGFuPiDkuKrlrZfvvJvotoXlh7oge3sgJGN0cmwub3B0cy5nYXRld2F5LndvcmRzTGltaXQgfX0g5Liq5a2X77yM5Z2H5oyJIDxzcGFuIGNsYXNzPVxcXCJzaHV5dW4tc21zLXByZXZpZXctd2FybmluZ1xcXCIgbmctYmluZD1cXFwiJGN0cmwub3B0cy5nYXRld2F5Lm11bHRpTGltaXRcXFwiPjwvc3Bhbj4g5a2X5LiA5p2h6K6h6LS577ybXFxuXFx0XFx0PC9wPlxcblxcdFxcdDxzcGFuIG5nLWlmPVxcXCIkY3RybC5vcHRzLmlzVHJpbVNwYWNlXFxcIj4yLuS4iuWbvuS7heS4uuaTjeS9nOmihOiniO+8jOacgOe7iOWtl+aVsOWSjOiuoei0ueadoeaVsOS7peWunumZheaJp+ihjOaXtuWPkemAgeS4uuWHhuOAgjwvc3Bhbj5cXG5cXHRcXHQ8c3BhbiBuZy1pZj1cXFwiISRjdHJsLm9wdHMuaXNUcmltU3BhY2VcXFwiPjIu5LiK5Zu+5LuF5Li65pON5L2c6aKE6KeI77yM5Y+Y6YeP5peg5Zu65a6a6ZW/5bqm77yM5pyA57uI5a2X5pWw5ZKM6K6h6LS55p2h5pWw5Lul5a6e6ZmF5omn6KGM5pe25Y+R6YCB5Li65YeG77yM5bu66K6u5YWI5rWL6K+V5omn6KGM44CCPC9zcGFuPlxcblxcdDwvZGl2PlxcbjwvZGl2PlxcblwiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5\n"); /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9rZXl3b3JkL2luZGV4Lmxlc3M/YjRhYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6\n"); /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9lZGl0b3IvaW5kZXgubGVzcz81M2MxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7\n"); /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9zbXMvcHJldmlldy9pbmRleC5sZXNzPzk5Y2IiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8\n"); /***/ }), /* 9 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: external \"angular\"\nvar external_angular_ = __webpack_require__(0);\nvar external_angular_default = /*#__PURE__*/__webpack_require__.n(external_angular_);\n\n// CONCATENATED MODULE: ./src/constant.js\nvar modulePrefix = 'shuyun.editor';\nvar componentPrefix = 'shuyunEditor';\n// CONCATENATED MODULE: ./src/keyword/ViewModel.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction initKeywords(data) {\n return data.reduce(function (types, item) {\n var type = item.type;\n\n if (type && types.indexOf(type) === -1) {\n types.push(type);\n }\n\n return types;\n }, []);\n}\n\nvar ViewModel_ViewModel =\n/*#__PURE__*/\nfunction () {\n function ViewModel() {\n _classCallCheck(this, ViewModel);\n\n _defineProperty(this, \"toggle\", false);\n }\n\n _createClass(ViewModel, [{\n key: \"insertKeywordClick\",\n value: function insertKeywordClick(keyword) {\n if (keyword.disabled) return;\n this.onInsertKeywordAction(keyword);\n }\n }, {\n key: \"changeTypeClick\",\n value: function changeTypeClick(type) {\n this.currentType = type;\n }\n }, {\n key: \"toggleClick\",\n value: function toggleClick() {\n this.toggle = !this.toggle;\n }\n }, {\n key: \"$onChanges\",\n value: function $onChanges(changeObj) {\n var _this = this;\n\n var keywords = changeObj.keywords;\n\n if (keywords.currentValue.length) {\n // 获取关键词的类型\n this.keywordTypes = initKeywords(keywords.currentValue); // 获取当前类型\n\n this.currentType = this.keywordTypes[0]; // 当前类型下的关键词\n\n this.keywordsInCurrentType = keywords.currentValue.filter(function (item) {\n return item.type === _this.currentType;\n });\n }\n }\n }, {\n key: \"isShowToggle\",\n get: function get() {\n var HASH_WIDTH = 7;\n var PADDING = 20;\n var MARGIN = 5;\n var ARROW_PADDING = 45;\n var keywordLength = this.keywordsInCurrentType.reduce(function (result, keyword) {\n return result + keyword.text.length * 12 + HASH_WIDTH + PADDING + MARGIN;\n }, 0);\n return keywordLength > Number(this.width.substring(0, this.width.length - 2)) - ARROW_PADDING;\n }\n }]);\n\n return ViewModel;\n}();\n\n\n// EXTERNAL MODULE: ./src/keyword/index.tpl.html\nvar index_tpl = __webpack_require__(1);\nvar index_tpl_default = /*#__PURE__*/__webpack_require__.n(index_tpl);\n\n// EXTERNAL MODULE: ./src/keyword/index.less\nvar keyword = __webpack_require__(6);\n\n// CONCATENATED MODULE: ./src/keyword/index.js\n\n\n\n\n\nvar ddo = {\n bindings: {\n keywords: '<',\n width: '<',\n isShowAll: '<',\n onInsertKeywordAction: '<'\n },\n controller: ViewModel_ViewModel,\n template: index_tpl_default.a\n};\n/* harmony default export */ var src_keyword = (external_angular_default.a.module(\"\".concat(modulePrefix, \".keyword\"), []).component(\"\".concat(componentPrefix, \"Keyword\"), ddo).name);\n// CONCATENATED MODULE: ./src/editor/common/constant.js\n// common constant\nvar KEYWORD_SIGN = 'œœ';\nvar NEW_LINE = 'þ_enter_þ'; // editor constant\n\nvar DEFAULT_TYPE_NAME = 'default';\nvar HTML_ENTITY_CODE = {\n '&nbsp;': ' ',\n '&lt;': '<',\n '&gt;': '>',\n '&amp;': '&'\n};\nvar regUrlBase = '((([A-Za-z]{3,9}:(?:\\\\/\\\\/)?)(?:[-;:&=\\\\+\\\\$,\\\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\\\\+\\\\$,\\\\w]+@)[A-Za-z0-9.-]+)((?:\\\\/[\\\\+~%\\\\/.\\\\w-_]*)?\\\\??(?:[-\\\\+=&;%@.\\\\w_]*)#?(?:[.\\\\!\\\\/\\\\\\\\w]*))?)';\nvar REG_URL = new RegExp(regUrlBase);\nvar REG_URL_HASH = new RegExp(\"\".concat(regUrlBase, \"#\"));\nvar DEFAULT_ILLEGAL_CHAR = ['œ', 'þ'];\n// CONCATENATED MODULE: ./src/editor/common/utils.js\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n\n/**\n * @description [格式化编辑器内容]\n * @param {*} data\n * @returns 内容切割成数组一段一段\n */\n\nfunction formatEmpty(data) {\n var sms = []; // eslint-disable-next-line no-restricted-syntax\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var item = _step.value;\n var content = item.length ? \"<div>\".concat(item, \"</div>\") : '<div><br/></div>';\n sms.push(content);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return sms.join('');\n}\n/**\n * @description [获取文字宽度]\n * @param {*} text\n * @returns {number} 字数宽度\n */\n\n\nfunction getTextWidth(text) {\n var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '14px';\n var element = document.createElement('div');\n element.className = 'sms-content';\n element.style.display = 'inline-block';\n element.style.opacity = '0';\n element.style.fontSize = fontSize;\n element.innerHTML = text;\n document.body.appendChild(element);\n\n var _window$getComputedSt = window.getComputedStyle(element),\n width = _window$getComputedSt.width;\n\n document.body.removeChild(element);\n return parseInt(width, 10);\n}\n/**\n * 将包含 html 的字符串转为文本\n * e.g. < => &lt; &nbsp; => &amp;nbsp;\n * @param text\n * @returns {string}\n */\n\n\nfunction convertContent(text, isTrimSpace) {\n var reg = /(&nbsp;?)|(&lt;?)|(&gt;?)|(&amp;?)/g;\n\n var _text = text.replace(reg, function (result) {\n return \"&amp;\".concat(result.slice(1));\n }).replace(/</g, '&lt;'); // 针对文本前后空格不 trim 的设置, 将空格转成 &nbsp; 因为 html 不显示文本的前后空格\n\n\n return isTrimSpace ? _text : _text.replace(/\\s/g, '&nbsp;');\n}\n/**\n * @description [判断当前浏览器是否为火狐浏览器]\n * @returns true - 是火狐浏览器, false - 非火狐浏览器\n */\n\nfunction isFirefox() {\n return navigator.userAgent.indexOf('Firefox') !== -1;\n}\nfunction escapeRegExp(str) {\n // eslint-disable-next-line no-useless-escape\n var reg = /[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g;\n return str.replace(reg, '\\\\$&');\n}\nfunction getVarReg(prefix, suffix) {\n return RegExp(\"\".concat(escapeRegExp(prefix), \"_(?:\\\\[(\\\\S*?)])?(.+?)_\").concat(escapeRegExp(suffix)), 'g');\n}\n/**\n * Keyword name 和 text 字段转换\n * @param arg\n * @param argIsText - true: 输入 text, 转出 name - false: 输入 name, 转出 text\n * @returns {*}\n */\n\nfunction keywordTextNameConvert(arg) {\n var argIsText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var keywords = arguments.length > 2 ? arguments[2] : undefined;\n var matchedKeyword;\n\n if (keywords && keywords.length) {\n matchedKeyword = keywords.find(function (keyword) {\n return keyword[argIsText ? 'text' : 'name'] === arg;\n });\n }\n\n return matchedKeyword ? matchedKeyword[argIsText ? 'name' : 'text'] : arg;\n}\n/**\n * 构造插入到文本编辑器的 input 标签\n * @param {string} text - 标签名\n * @param {string} type - 标签类型\n * @returns {string}\n */\n\nfunction createInput(text) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_TYPE_NAME;\n var fontSize = arguments.length > 2 ? arguments[2] : undefined;\n var width = getTextWidth(text, fontSize);\n\n if (isFirefox()) {\n return \"<img class=\\\"keyword-insert \".concat(type, \"\\\" value=\\\"\").concat(text, \"\\\" alt=\\\"\").concat(text, \"\\\" style=\\\"width: \").concat(width + 2, \"px\\\">\");\n }\n\n return \"<input class=\\\"keyword-insert \".concat(type, \"\\\" value=\\\"\").concat(text, \"\\\" style=\\\"width: \").concat(width + 2, \"px\\\" disabled>\");\n}\n/**\n * 将短信数据中的 tag 标签转化为 input\n * @param {string} text - 短信数据\n * @returns {string}\n */\n\nfunction parseTag(text, prefix, suffix, keywords, fontSize) {\n var varReg = getVarReg(prefix, suffix);\n return text.replace(varReg, function (result, $1, $2) {\n var _keyword = keywordTextNameConvert($2, false, keywords);\n\n return createInput(_keyword, $1, fontSize);\n });\n}\n/**\n * @description 格式化短信内容\n * @param {*} text\n * @returns\n */\n\nfunction formatContent(text) {\n var data = text.split(NEW_LINE);\n return formatEmpty(data);\n}\n/**\n * 解析富文本编辑器中的 HTML, 生成预览文本和最终存到服务器的文本\n */\n\nfunction parseHTML(text) {\n var parsed = text.trim().replace(/disabled(=\"[^\"]*\")?/i, '').replace(/style=\"[^\"]+\"/i, '').trim();\n\n if (!parsed.startsWith('<div>')) {\n var parsedArr = parsed.split('<div>');\n var a = parsed.replace(parsedArr[0], '');\n parsed = \"<div>\".concat(parsedArr[0], \"</div>\").concat(a);\n }\n\n parsed = parsed.replace(/<\\/div>/g, '').replace(/<div>/g, NEW_LINE).replace(/þ_enter_þ/, '');\n return parsed;\n}\n/**\n * 获取变量替换的标签表达式\n */\n\nfunction getVariableReg() {\n var reg = /<input\\s+class=\"keyword-insert\\s*([^\"]*)\"\\s+value=\"([^\"]+)\"[^>]*>/gi;\n\n if (isFirefox()) {\n reg = /<img\\s+class=\"keyword-insert\\s*([^\"]*)\"\\s+value=\"([^\"]+)\"[^>]*>/gi;\n }\n\n return reg;\n}\n/**\n * 构造标签的预览文本\n * - 如果标签有默认值, 则显示默认值; 否则显示 #标签名#\n * @param {Array} keywords - 标签列表\n * @param {string} text - 标签名\n * @param {string|undefined} type - 标签类型\n * @returns {string}\n */\n\nfunction createTagPreview(keywords, text) {\n var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n // eslint-disable-next-line\n type === DEFAULT_TYPE_NAME && (type = undefined);\n\n var _keywords$filter = keywords.filter(function (item) {\n return item.type === type && item.text === text;\n }),\n _keywords$filter2 = _slicedToArray(_keywords$filter, 1),\n matchedTag = _keywords$filter2[0]; // eslint-disable-next-line\n\n\n return matchedTag ? matchedTag.defaultValue ? \"\\u0153\".concat(matchedTag.defaultValue, \"\\u0153\") : \"\\u0153#\".concat(matchedTag.text, \"#\\u0153\") : \"\\u0153#\".concat(text, \"#\\u0153\");\n}\n/**\n * 聚焦Node节点的前面还是后面\n */\n\nfunction focusNode(node) {\n var isBefore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var range = document.createRange();\n range.selectNode(node);\n range.collapse(isBefore);\n var selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n return range;\n}\n// CONCATENATED MODULE: ./src/editor/common/firefoxHelper.js\n\n\nfunction focusTextNode(textNode, offset) {\n var range = document.createRange();\n range.setStart(textNode, offset);\n range.setEnd(textNode, offset);\n var selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n}\n/**\n * 删除Node\n */\n\n\nfunction deleteNode(node) {\n var range = document.createRange();\n range.selectNode(node);\n var selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('delete', false, null);\n} // 控制 firefox 的方向键事件\n\n\nfunction controlFirefoxCursor(event) {\n var range = window.getSelection().getRangeAt(0);\n var node = range.startContainer,\n startOffset = range.startOffset;\n var childNodes = node.childNodes,\n nodeType = node.nodeType,\n previousSibling = node.previousSibling,\n parentNode = node.parentNode,\n nextSibling = node.nextSibling;\n var preNode = childNodes[startOffset - 2];\n var currentNode = childNodes[startOffset - 1];\n var nextNode = childNodes[startOffset];\n\n switch (event.keyCode) {\n case 37:\n // left\n if (node && nodeType === 3) {\n if (startOffset === 1) {\n if (previousSibling) {\n // {keyword}{text}\n focusNode(previousSibling);\n event.preventDefault();\n }\n }\n\n if (startOffset === 0) {\n // {text}\n if (parentNode && parentNode.previousSibling) {\n focusNode(parentNode.previousSibling.lastChild);\n event.preventDefault();\n }\n }\n } else if (preNode && preNode.nodeName === 'IMG') {\n // {keyword}{keyword}\n focusNode(preNode);\n event.preventDefault();\n } else if (preNode && preNode.nodeType === 3) {\n // {text}{keyword}\n focusTextNode(preNode, preNode.length);\n event.preventDefault();\n } else if (preNode === undefined && currentNode !== undefined) {\n // {keyword}\n focusNode(currentNode, true);\n event.preventDefault();\n } else if (preNode === undefined && currentNode === undefined) {\n // {keyword}\n if (node && previousSibling) {\n focusNode(previousSibling.lastChild);\n event.preventDefault();\n }\n }\n\n break;\n\n case 39:\n // right\n if (node && nodeType === 3) {\n if (node.length === startOffset) {\n // {text}{keyword}\n if (nextSibling) {\n focusNode(nextSibling);\n event.preventDefault();\n } else {\n // {text}\n // eslint-disable-next-line no-lonely-if\n if (parentNode && parentNode.nextSibling) {\n focusNode(parentNode.nextSibling.firstChild, true);\n event.preventDefault();\n }\n }\n }\n } else if (nextNode && nextNode.nodeName === 'IMG') {\n // {keyword}{keyword}\n focusNode(nextNode);\n event.preventDefault();\n } else if (nextNode === undefined) {\n // {keyword}\n // 火狐下面莫名其妙加入一个 <br>\n if (node && nextSibling && nextSibling.nodeName === 'DIV') {\n focusNode(nextSibling.firstChild, true);\n event.preventDefault();\n }\n }\n\n break;\n\n case 8:\n // delete\n if (node && node.nodeType === 3 && startOffset === 0) {\n if (previousSibling) {\n deleteNode(previousSibling);\n event.preventDefault();\n }\n }\n\n break;\n\n default:\n }\n}\n// CONCATENATED MODULE: ./src/editor/main/ViewModel.js\nfunction ViewModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ViewModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ViewModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) ViewModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) ViewModel_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction ViewModel_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\nvar main_ViewModel_ViewModel =\n/*#__PURE__*/\nfunction () {\n function ViewModel($element, $scope) {\n var _this = this;\n\n ViewModel_classCallCheck(this, ViewModel);\n\n ViewModel_defineProperty(this, \"tip\", '');\n\n ViewModel_defineProperty(this, \"invalidStringClosed\", false);\n\n ViewModel_defineProperty(this, \"urlTipClosed\", false);\n\n ViewModel_defineProperty(this, \"handleFoucsEvent\", function () {\n _this.onFocus && _this.onFocus();\n });\n\n ViewModel_defineProperty(this, \"handleBlurEvent\", function () {\n _this.onBlur && _this.onBlur();\n });\n\n ViewModel_defineProperty(this, \"clearMozBr\", function () {\n var br = _this.contentRef.querySelector('br[type=_moz]');\n\n if (br) {\n br.parentNode.removeChild(br);\n }\n });\n\n ViewModel_defineProperty(this, \"onChange\", function (event) {\n _this.clearMozBr();\n\n var target = event.target;\n var nodeName = target.nodeName;\n\n if (event && (nodeName === 'INPUT' || nodeName === 'IMG')) {\n focusNode(target);\n }\n\n _this.rememberFocus();\n\n var htmlContent = _this.contentRef.innerHTML;\n\n if (_this.ILLEGAL_CHAR_REG.test(htmlContent)) {\n // 记录初始光标\n var nodes = [].slice.call(_this.contentRef.childNodes);\n var node = _this._range.startContainer;\n var offset = _this._range.startOffset - 1;\n var caretNodeIndex = nodes.indexOf(node); // 修改 HTML\n\n _this.contentRef.innerHTML = htmlContent.replace(_this.ILLEGAL_CHAR_REG, ''); // 恢复光标\n\n var selection = window.getSelection();\n var range = document.createRange();\n selection.removeAllRanges();\n var newPosNode = _this.contentRef.childNodes[caretNodeIndex];\n\n if (!newPosNode) {\n // 输入位置在头部\n range.selectNode(_this.contentRef.firstChild);\n range.collapse(true);\n } else if (newPosNode.nodeType !== 3) {\n // 变量之后\n range.selectNode(newPosNode);\n range.collapse();\n } else {\n // 文字之间\n range.setStart(newPosNode, offset);\n range.setEnd(newPosNode, offset);\n }\n\n selection.addRange(range);\n } else {\n _this.onContentChangedAction(htmlContent);\n\n _this.checkEmpty();\n }\n });\n\n ViewModel_defineProperty(this, \"handleKeyDown\", function (event) {\n if (isFirefox()) {\n controlFirefoxCursor(event);\n }\n });\n\n ViewModel_defineProperty(this, \"handlePaste\", function (event) {\n var htmlContent = event.clipboardData.getData('text/html');\n\n if (htmlContent.indexOf('sms-keyword-inserted') > -1) {\n // TODO: 后期考虑使用 <p> 标签做段落处理, 这样可以使用 br 作为行内换行\n if (isFirefox()) {\n // 临时处理 删除导致换行的 html 标签\n event.preventDefault();\n document.execCommand('insertHTML', false, htmlContent.replace(/<div>/g, '').replace(/<\\/div>/g, '').replace(/<br>/g, ''));\n return;\n }\n\n return;\n }\n\n event.preventDefault();\n var textContent = event.clipboardData.getData('text/plain');\n\n var hasError = _this.ILLEGAL_CHAR_REG.test(textContent);\n\n if (hasError) {\n _this.tip = '您的内容中含有非法字符,已进行过滤。';\n _this.invalidStringClosed = false;\n }\n\n if (isFirefox()) {\n document.execCommand('insertText', false, textContent.replace(_this.ILLEGAL_CHAR_REG, '').replace('\\n', ''));\n } else {\n document.execCommand('insertText', false, textContent.replace(_this.ILLEGAL_CHAR_REG, ''));\n }\n });\n\n ViewModel_defineProperty(this, \"reFocus\", function () {\n if (_this._range) {\n var selection = window.getSelection();\n selection.removeAllRanges();\n\n if (_this._range.commonAncestorContainer.parentNode.nodeName === 'A') {\n var range = document.createRange();\n range.selectNodeContents(_this.contentRef);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n selection.addRange(_this._range);\n }\n } else {\n _this.contentRef.focus();\n\n var _range = document.createRange();\n\n _range.selectNodeContents(_this.contentRef);\n\n _range.collapse(false);\n\n var _selection = window.getSelection();\n\n _selection.removeAllRanges();\n\n _selection.addRange(_range);\n }\n });\n\n ViewModel_defineProperty(this, \"handleInsertKeyword\", function (_ref) {\n var text = _ref.text,\n type = _ref.type;\n\n _this.reFocus();\n\n document.execCommand('insertHTML', false, createInput(text, type, _this.styles.fontSize));\n\n _this.handleInsertAfter();\n });\n\n ViewModel_defineProperty(this, \"handleInsertText\", function (text) {\n _this.reFocus(); // 此处不能使用insertText,会出现focus焦点错误\n\n\n document.execCommand('insertHTML', false, text);\n\n _this.handleInsertAfter();\n });\n\n ViewModel_defineProperty(this, \"handleInsertAfter\", function () {\n _this.clearMozBr();\n\n _this.onContentChangedAction(_this.contentRef.innerHTML);\n\n _this.checkEmpty();\n\n if (_this._range) {\n var _this$_range = _this._range,\n startContainer = _this$_range.startContainer,\n startOffset = _this$_range.startOffset;\n var nodeType = startContainer.nodeType,\n childNodes = startContainer.childNodes,\n nextSibling = startContainer.nextSibling;\n\n if (nodeType === 1) {\n _this._range = focusNode(childNodes[startOffset]);\n } else if (nodeType === 3 && startContainer.length === startOffset && nextSibling) {\n _this._range = focusNode(nextSibling);\n }\n }\n });\n\n ViewModel_defineProperty(this, \"handleCloseInvalidString\", function () {\n _this.invalidStringClosed = true;\n });\n\n ViewModel_defineProperty(this, \"handleCloseUrlTip\", function () {\n _this.urlTipClosed = true;\n });\n\n this.$scope = $scope; // 移除 __moz_resizing\n\n if (isFirefox()) {\n document.designMode = 'on';\n document.execCommand('enableObjectResizing', false, 'false');\n document.designMode = 'off';\n }\n\n this.contentRef = $element[0].querySelector('[data-content]'); // 通过默认和业务要求的非法词组成所有的非法词限制\n\n var allIllegalChars = this.illegalChar ? this.illegalChar.concat(DEFAULT_ILLEGAL_CHAR) : DEFAULT_ILLEGAL_CHAR;\n this.ILLEGAL_CHAR_REG = RegExp(\"[\".concat(allIllegalChars.join(''), \"]\"), 'g');\n }\n\n ViewModel_createClass(ViewModel, [{\n key: \"$onInit\",\n value: function $onInit() {\n var _this2 = this;\n\n this.ref(this);\n this.watcher = this.$scope.$watch('$ctrl.resultContent', function (newVal) {\n _this2.contentRef.innerHTML = _this2.resultContent;\n });\n this.watcherTip = this.$scope.$watch('$ctrl.urlTip', function (newVal) {\n _this2.urlTip = newVal;\n _this2.urlTipClosed = false;\n });\n }\n }, {\n key: \"$postLink\",\n value: function $postLink() {\n this.contentRef.parentNode.setAttribute('data-empty', this.placeholder);\n this.checkEmpty();\n }\n }, {\n key: \"$onDestroy\",\n value: function $onDestroy() {\n this.watcher();\n this.watcherTip();\n }\n }, {\n key: \"checkEmpty\",\n\n /**\n * 如果文本编辑器为空, 为其添加 empty 样式\n */\n value: function checkEmpty() {\n var currentElement = this.contentRef;\n\n if (currentElement.innerHTML === '<br>') {\n currentElement.innerHTML = '';\n }\n\n currentElement.parentNode.classList[currentElement.innerHTML.length ? 'remove' : 'add']('empty');\n }\n /**\n * 记录光标在编辑器中的位置\n */\n\n }, {\n key: \"rememberFocus\",\n value: function rememberFocus() {\n var selection = window.getSelection();\n\n if (selection.rangeCount) {\n this._range = selection.getRangeAt(0);\n }\n }\n /**\n * 清除火狐下多出来的br标签\n */\n\n }]);\n\n return ViewModel;\n}();\n\n\nmain_ViewModel_ViewModel.$inject = ['$element', '$scope'];\n// EXTERNAL MODULE: ./src/editor/main/index.tpl.html\nvar main_index_tpl = __webpack_require__(2);\nvar main_index_tpl_default = /*#__PURE__*/__webpack_require__.n(main_index_tpl);\n\n// EXTERNAL MODULE: ./src/editor/index.less\nvar editor = __webpack_require__(7);\n\n// CONCATENATED MODULE: ./src/editor/main/index.js\n\n\n\n\n\nvar main_ddo = {\n bindings: {\n ref: '<',\n placeholder: '<?',\n urlTip: '=?',\n styles: '<',\n disabled: '<',\n resultContent: '=',\n illegalChar: '<',\n onFocus: '<',\n onBlur: '<',\n onContentChangedAction: '<'\n },\n controller: main_ViewModel_ViewModel,\n template: main_index_tpl_default.a\n};\n/* harmony default export */ var main = (external_angular_default.a.module(\"\".concat(modulePrefix, \".main\"), []).component(\"\".concat(componentPrefix, \"Main\"), main_ddo).name);\n// CONCATENATED MODULE: ./src/editor/ViewModel.js\nfunction editor_ViewModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction editor_ViewModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction editor_ViewModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) editor_ViewModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) editor_ViewModel_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction editor_ViewModel_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\nvar editor_ViewModel_ViewModel =\n/*#__PURE__*/\nfunction () {\n function ViewModel($element, $scope) {\n var _this = this;\n\n editor_ViewModel_classCallCheck(this, ViewModel);\n\n editor_ViewModel_defineProperty(this, \"resultContent\", '');\n\n editor_ViewModel_defineProperty(this, \"editorController\", void 0);\n\n editor_ViewModel_defineProperty(this, \"_keywords\", []);\n\n editor_ViewModel_defineProperty(this, \"_content\", '');\n\n editor_ViewModel_defineProperty(this, \"resolveContent\", function () {\n // const { isTrimSpace } = this;\n var _content = _this._content,\n isTrimSpace = _this.isTrimSpace,\n _keywords = _this._keywords;\n var resultContent = '';\n\n if (_content) {\n var text = convertContent(_content, isTrimSpace); // 当前编辑器存在 keywords 的时候才存在变量转换的必要\n\n if (_keywords.length) {\n text = parseTag(text, KEYWORD_SIGN, KEYWORD_SIGN, _keywords, _this.styles.fontSize);\n }\n\n resultContent = formatContent(text);\n _this.resultContent = resultContent;\n }\n\n _this.handleContent(resultContent);\n });\n\n editor_ViewModel_defineProperty(this, \"handleContent\", function (data) {\n var text = parseHTML(data);\n\n _this.setEditorText(text);\n\n _this.setPreviewText(text);\n });\n\n editor_ViewModel_defineProperty(this, \"setPreviewText\", function (text) {\n var isTrimSpace = _this.isTrimSpace,\n _keywords = _this._keywords,\n hasTagInPreview = _this.hasTagInPreview;\n var inputReg = getVariableReg();\n _this.tempHolder.innerHTML = text.replace(inputReg, function (result, $1, $2) {\n return createTagPreview(_keywords, $2, $1);\n });\n var content = convertContent(_this.tempHolder.textContent, isTrimSpace);\n var preview = content;\n\n if (hasTagInPreview) {\n // 关键字高亮, URL, 手机及固话号码下划线\n preview = content.replace(/œ([^œ]+)œ/g, function (result, $1) {\n return \"<span class=\\\"preview-content-tag\\\">\".concat($1.trim(), \"</span>\")