JAVASCRIPT   7

main.js

Guest on 25th July 2021 04:17:50 PM

  1.  
  2. var _plugins = {};
  3.  
  4. function _plugin(name, fn) {
  5.         if (name === undefined) {
  6.                 return _plugins;
  7.         }
  8.         if (!fn) {
  9.                 return _plugins[name];
  10.         }
  11.         _plugins[name] = fn;
  12. }
  13.  
  14. var _language = {};
  15.  
  16. function _parseLangKey(key) {
  17.         var match, ns = 'core';
  18.         if ((match = /^(\w+)\.(\w+)$/.exec(key))) {
  19.                 ns = match[1];
  20.                 key = match[2];
  21.         }
  22.         return { ns : ns, key : key };
  23. }
  24. /**
  25.         @example
  26.         K.lang('about'); //get core.about
  27.         K.lang('about.version'); // get about.version
  28.         K.lang('about.').version; // get about.version
  29.         K.lang('about', 'en'); //get English core.about
  30.         K.lang({
  31.                 core.about : '关于',
  32.                 about.version : '4.0'
  33.         }, 'zh-CN'); //add language
  34. */uage
  35. */
  36. function _lang(mixed, langType) {
  37.         langType = langType === undefined ? K.options.langType : langType;
  38.         if (typeof mixed === ') {
  39.                 if (!_language[langType]) {
  40.                         return 'eturn 'no language';
  41.                 }
  42.                 var pos = mixed.length - 1;
  43.                 if (mixed.substr(pos) === '.') {
  44.                         return _language[langType][mixed.substr(0, pos)];
  45.                 }
  46.                 var obj = _parseLangKey(mixed);
  47.                 return _language[langType][obj.ns][obj.key];
  48.         }
  49.         _each(mixed, function(key, val) {
  50.                 var obj = _parseLangKey(key);
  51.                 if (!_language[langType]) {
  52.                         _language[langType] = {};
  53.                 }
  54.                 if (!_language[langType][obj.ns]) {
  55.                         _language[langType][obj.ns] = {};
  56.                 }
  57.                 _language[langType][obj.ns][obj.key] = val;
  58.         // 当前range为图片时返回KNode,否则返回undefined
  59. 回KNode,否则返回undefined
  60. function _getImageFromRange(range, fn) {
  61.         if (range.collapsed) {
  62.                 return;
  63.         }
  64.         range = range.cloneRange().up();
  65.         var sc = range.startContainer, so = range.startOffset;
  66.         if (!_WEBKIT && !range.isControl()) {
  67.                 return;
  68.         }
  69.         var img = K(sc.childNodes[so]);
  70.         if (!img || img.name != 'img') {
  71.                 return;
  72.         }
  73.         if (fn(img)) {
  74.                 return img;
  75.         }
  76. }
  77.  
  78. function _bindContextmenuEvent() {
  79.         var self = this, doc = self.edit.doc;
  80.         K(doc).contextmenu(function(e) {
  81.                 if (self.menu) {
  82.                         self.hideMenu();
  83.                 }
  84.                 if (!self.useContextmenu) {
  85.                         e.preventDefault();
  86.                         return;
  87.                 }
  88.                 if (self._contextmenus.length === 0) {
  89.                         return;
  90.                 }
  91.                 var maxWidth = 0, items = [];
  92.                 _each(self._contextmenus, function() {
  93.                         if (this.title == '-') {
  94.                                 items.push(this);
  95.                                 return;
  96.                         }
  97.                         if (this.cond && this.cond()) {
  98.                                 items.push(this);
  99.                                 if (this.width && this.width > maxWidth) {
  100.                                         maxWidth = this.width;
  101.                                 }
  102.                         }
  103.                 });
  104.                 while (items.length > 0 && items[0].title == '-') {
  105.                         items.shift();
  106.                 }
  107.                 while (items.length > 0 && items[items.length - 1].title == '-') {
  108.                         items.pop();
  109.                 }
  110.                 var prevItem = null;
  111.                 _each(items, function(i) {
  112.                         if (this.title == '-' && prevItem.title == '-') {
  113.                                 delete items[i];
  114.                         }
  115.                         prevItem = this;
  116.                 });
  117.                 if (items.length > 0) {
  118.                         e.preventDefault();
  119.                         var pos = K(self.edit.iframe).pos(),
  120.                                 menu = _menu({
  121.                                         x : pos.x + e.clientX,
  122.                                         y : pos.y + e.clientY,
  123.                                         width : maxWidth,
  124.                                         css : { visibility: 'hidden' },
  125.                                         shadowMode : self.shadowMode
  126.                                 });
  127.                         _each(items, function() {
  128.                                 if// 下拉菜单超过可视区域时调整菜单位置
  129.                 // 下拉菜单超过可视区域时调整菜单位置
  130.                         var docEl = _docElement(menu.doc),
  131.                                 menuHeight = menu.div.height();
  132.                         if (e.clientY + menuHeight >= docEl.clientHeight - 100) {
  133.                                 menu.pos(menu.x, _removeUnit(menu.y) - menuHeight);
  134.                         }
  135.                         menu.div.css('visibility', 'visible');
  136.                         self.menu = menu;
  137.                 }
  138.         });
  139. }
  140.  
  141. function _bindNewlineEvent() {
  142.         var self = this, doc = self.edit.doc, newlineTag = self.newlineTag;
  143.         if (_IE && newlineTag !== 'br') {
  144.                 return;
  145.         }
  146.         if (_GECKO && _V < 3 && newlineTag !== 'p') {
  147.                 return;
  148.         }
  149.         if (_OPERA && _V < 9) {
  150.                 return;
  151.         }
  152.         var// 取得rangeçš„blockæ ‡ç­¾å
  153. ,h4,h5,h6,pre,li'),
  154.                 pSkipTagMap = _toMap('p,h1,h2,h3,h4,h5,h6,pre,li,blockquote');
  155.         // 取得rangeçš„blockæ ‡ç­¾å
  156.         function getAncestorTagName(range) {
  157.                 var ancestor = K(range.commonAncestor());
  158.                 while (ancestor) {
  159.                         if (ancestor.type == 1 && !ancestor.isStyle()) {
  160.                                 break;
  161.                         }
  162.                         ancestor = ancestor.parent();
  163.                 }
  164.                 return ancestor.name;
  165.         }
  166.         K(doc).keydown(function(e) {
  167.                 if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
  168.                         return;
  169.                 }
  170.                 self.// br
  171. lection();
  172.                 var tagName = getAncestorTagName(self.cmd.range);
  173.                 if (tagName == 'marquee' || tagName == ' + (_IE && _V < 9 ? '
  174.                 }
  175.                 // br
  176.                 if (newlineTag ===// p
  177.  && !brSkipTagMap[tagName]) {
  178.                         e.preventDefault();
  179.                         self.insertHtml('<br />' + (_IE && _V < 9 ? '' : '\u200B'));
  180.                         return;
  181.                 }
  182.                 // p
  183.                 if (!pSkipTagMap[tagName]) {
  184.                         _nativeCommand(doc, 'formatblock', '<p>');
  185.                 }
  186.         });
  187.         K(doc).keyup(function(e) {
  188.                 if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
  189.                         return;
  190.                 }
  191.                 if (newlineTag == 'br') {
  192.                         return;
  193.                 }
  194.                 if (_GECKO) {
  195.                         var root = self.cmd.commonAncestor('p');
  196.                         var a = self.cmd.commonAncestor('a');
  197.                         if (a && a.text() == '') {
  198.                                 a.remove(true);
  199.                                 self.cmd.range.selectNodeContents(root[0]).collapse(true);
  200.                                 self.cmd.select();
  201.                         }
  202.                         return;
  203.                 }
  204.                 self.cmd.selection();
  205.                 var tagName = getAncestorTagName(self.cmd.range);
  206.                 if (tagNam// [WEBKIT] å°†DIV改成P
  207. == 'select') {
  208.                         return;
  209.                 }
  210.                 if (!pSkipTagMap[tagName]) {
  211.                         _nativeCommand(doc, 'formatblock', '<p>');
  212.                 }
  213.                 // [WEBKIT] å°†DIV改成P
  214.                 var div = self.cmd.commonAncestor('div');
  215.                 if (div) {
  216.                         var p = K('<p></p>'),
  217.                                 child = div[0].firstChild;
  218.                         while (child) {
  219.                                 var next = child.nextSibling;
  220.                                 p.append(child);
  221.                                 child = next;
  222.                         }
  223.                         div.before(p);
  224.                         div.remove();
  225.                         self.cmd.range.selectNodeContents(p[0]);
  226.                         self.cmd.select();
  227.                 }
  228.         });
  229. }
  230.  
  231. function _bindTabEvent() {
  232.         var self = this, doc = self.edit.doc;
  233.         K(doc).keydown(function(e) {
  234.                 if (e.which == 9) {
  235.                         e.preven// Bugfix #271: 回车,按下tabé”®ï¼Œå…‰æ ‡åœ¨ä¸‹ä¸€è¡Œæ˜¾ç¤º
  236. e);
  237.                                 return;
  238.                         }
  239.                         var cmd = self.cmd, range = cmd.range;
  240.                         range.shrink();
  241.                         // Bugfix #271: 回车,按下tabé”®ï¼Œå…‰æ ‡åœ¨ä¸‹ä¸€è¡Œæ˜¾ç¤º
  242.                         if (range.collapsed && range.startContainer.nodeType == 1) {
  243.                                 range.insertNode(K('@&nbsp;', doc)[0]);
  244.                                 cmd.select();
  245.                         }
  246.                         self.insertHtml('&nbsp;&nbsp;&nbsp;&nbsp;');
  247.                 }
  248.         });
  249. }
  250.  
  251. function _bindFocusEvent() {
  252.         var self = this;
  253.         K(self.edit.textarea[0], self.edit.win).focus(function(e) {
  254.                 if (self.afterFocus) {
  255.                         self.afterFocus.call(self, e);
  256.                 }
  257.         }).blur(function(e) {
  258.                 if (self.afterBlur) {
  259.                         self.afterBlur.call(self, e);
  260.                 }
  261.         });
  262. }
  263.  
  264. function _removeBookmarkTag(html) {
  265.         return _trim(html.replace(
  266.  
  267. function _addBookmarkToStack(stack, bookmark) {
  268.         if (stack.length, ''));
  269. }
  270.  
  271. function _removeTempTag(html) {
  272.         return html.replace([stack.length - 1];
  273.         if (_removeBookmarkTag(bookmark.html) !== _, '');
  274. }
  275.  
  276. function _addBookmarkToStack(stack, bookmark) {
  277.         if // undo: _undoToRedo.call(this, undoStack, redoStack);
  278. // redo: _undoToRedo.call(this, redoStack, undoStack);
  279. ookmarkTag(bookmark.html) !== _removeBookmarkTag(prev.html)) {
  280.                 stack.push(bookmark);
  281.         }
  282. }
  283.  
  284. // undo: _undoToRedo.call(this, undoStack, redoStack);
  285. // redo: _undoToRedo.call(this, redoStack, undoStack);
  286. function _undoToRedo(fromStack, toStack) {
  287.         var self = this, edit = self.edit,
  288.                 body = edit.doc.body,
  289.                 range, bookmark;
  290.         if (fromStack.length === 0) {
  291.                 return self;
  292.         }
  293.         if (edit.designMode) {
  294.                 range = self.cmd.range;
  295.                 bookmark = range.createBookmark(true);
  296.                 bookmark.html = body.innerHTML;
  297.         } else {
  298.                 bookmark = {
  299.                         html : body.innerHTML
  300.                 };
  301.         }
  302.         _addBookmarkToStack(toStack, bookmark);
  303.         var prev = fromStack.pop();
  304.         if (_removeBookmarkTag(bookmark.html) === _removeBookmarkTag(prev.html) && fromStack.length > 0) {
  305.                 prev = fromStack.pop();
  306.         }
  307.         if (edit.designMode) {
  308.                 edit.html(prev.h// save original options
  309.  
  310.                         range.moveToBookmark(prev);
  311.                         self.select();
  312.                 }
  313.         } else {
  314.                 K(body).html(_removeBookmarkTag(prev.html));
  315.         }
  316.         return self;
  317. }
  318.  
  319. function KEditor(optio// set options from param
  320. / save original options
  321.         self.options = {};
  322.         function setOption(key, val) {// set options from default setting
  323. defined) {
  324.                         self[key] = val;
  325.                 }
  326.                 self.options[key] = val;
  327.         }
  328.         // set options from param
  329.         _each(options, function(key, val) {
  330.                 setOption(key, options[key]);
  331.         });
  332.         // set options from default setting
  333.         _each(K.options, function(key, val) {
  334.                 if (self[key] === undefined) {
  335.                         setOption(key, val);
  336.                 }
  337.         });
  338.         var se = K(self.srcElement || '<textarea/>');
  339.         if (!self.width) {
  340.                 self.width = se[0].style.width || se.width();
  341.         }
  342.         if (!self.height) {
  343.                 self.height = se[0].style.height || se.height();
  344.         }
  345.         setOption('width', _undef(self.width, self.minWidth));
  346.         setOption('height', _undef(self.height, self.minHeight));
  347.         setOption('width', _addUnit(self.width));
  348.         se// private properties
  349. Unit(self.height));
  350.         if (_MOBILE && (!_IOS || _V < 534)) {
  351.                 self.designMode = false;
  352.         }
  353.         self.srcElement = se;
  354.         self.initContent = '';
  355.         self.plugin = {};
  356.         self.isCreated = false;
  357.         // private properties
  358.         self._handlers = {};
  359.         self._contextmenus = [];
  360.         self._undoStack = [];
  361.         self._redoStack = [];
  362.         self._firstAddBookmark = true;
  363.         self.menu = self.contextmenu = null;
  364.         self.dialogs = [];
  365. }
  366.  
  367. KEditor.prototype = {
  368.         lang : function(mixed) {
  369.                 return _lang(mixed, this.langType// JSåŠ è½½ä¸­ï¼Œç­‰å¾…JSåŠ è½½å®Œæˆ
  370. ) {
  371.                 var self = this;
  372.                 var _pluginStatus = this._pluginStatus;
  373.                 if (!_pluginStatus) {
  374.                         _pluginStatus = this._pluginStatus = {};
  375.                 }
  376.  
  377. // JSåŠ è½½å®Œæˆï¼Œé¿å…åˆå§‹åŒ–å¤šæ¬¡
  378. 中,等待JSåŠ è½½å®Œæˆ
  379.                         if (!_isFunction(_plugins[name])) {
  380.                                 setTimeout(function() {
  381.                                         self.loadPlugin(name, fn);
  382.                                 }, 100);
  383.                                 retur// è¿˜æ²¡åŠ è½½ç›¸å…³pluginï¼ŒåŠ¨æ€åŠ è½½
  384. ï¼Œé¿å…åˆå§‹åŒ–多次
  385.                         if(!_pluginStatus[name]) {
  386.                                 _plugins[name].call(self, KindEditor);
  387.                                 _pluginStatus[name] = 'inited// Fix bug: https://github.com/kindsoft/kindeditor/issues/105
  388.                 }
  389.                 // è¿˜æ²¡åŠ è½½ç›¸å…³pluginï¼ŒåŠ¨æ€åŠ è½½
  390.                 _plugins[name] = 'loading';
  391.                 _loadScript(self.pluginsPath + name + '/' + name + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function() {
  392.                         // Fix bug: https://github.com/kindsoft/kindeditor/issues/105
  393.                         setTimeout(function() {
  394.                                 if (_plugins[name]) {
  395.                                         self.loadPlugin(name, fn);
  396.                                 }
  397.                         }, 0);
  398.                 });
  399.                 return self;
  400.         },
  401.         handler : function(key, fn) {
  402.                 var self = this;
  403.                 if (!self._handlers[key]) {
  404.                         self._handlers[key] = [];
  405.                 }
  406.                 if (_isFunction(fn)) {
  407.                         self._handlers[key].push(fn);
  408.                         return self;
  409.                 }
  410.                 _each(self._handlers[key], function() {
  411.                         fn = this.call(self, fn);
  412.                 });
  413.                 return fn;
  414.         },
  415.         clickToolbar : function(name, fn) {
  416.                 var self = this, key = 'clickToolbar' + name;
  417.                 if (fn === undefined) {
  418.                         if (self._handlers[key]) {
  419.                                 return self.handler(key);
  420.                         }
  421.                         self.loadPlugin(name, function() {
  422.                                 self.handler(key);
  423.                         });
  424.                         return self;
  425.                 }
  426.                 return self.handler(key, fn);
  427.         },
  428.         updateState : function() {
  429.                 var self = this;
  430.                 _each(('justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,' +
  431.                         'subscript,superscript,bold,italic,underline,strikethrough').split(','), function(i, name) {
  432.                         self.cmd.state(name) ? self.toolbar.select(name) : self.toolbar.unselect(name);
  433.                 });
  434.                 return self;
  435.         },
  436.         addContextmenu : function(item) {
  437.                 this._contextmenus.push(item);
  438.                 return this;
  439.         },
  440.         afterCreate : function(fn) {
  441.                 return this.handler('afterCreate', fn);
  442.         },
  443.         beforeRemove : function(fn) {
  444.                 return this.handler('beforeRemove', fn);
  445.         },
  446.         beforeGetHtml : function(fn) {
  447.                 return this.handler('beforeGetHtml', fn);
  448.         },
  449.         beforeSetHtml : function(fn) {
  450.                 return this.handler('beforeSetHtml', fn);
  451.         },
  452.         afterSetHtml : function(fn) {
  453.                 return this.handler('afterSetHtml', fn);
  454.         },
  455.         create : function() {
  456.                 var self = this, fullscreenMode = self.fullscreenMode;
  457.                 if (self.isCreated) {
  458.                         return self;
  459.                 }
  460.  
  461.                 if (self.srcElement.data('kindeditor')) {
  462.                         return self;
  463.                 }
  464.                 self.srcElement.dat// æ ¡æ­£IE6å’ŒIE7的高度
  465. if (fullscreenMode) {
  466.                         _docElement().style.overflow = 'hidden';
  467.                 } else {
  468.                         _docElement().style.overflow = '';
  469.                 }
  470.                 var width = fullscreenMode ? _docElement().clientWidth + 'px' : self.width,
  471.                         height = fullscreenMode ? _docElement().clientHeight + 'px' : self.height;
  472.                 // æ ¡æ­£IE6å’ŒIE7的高度
  473.                 if ((_IE && _V < 8) || _QUIRKS) {
  474.                         height = _addUnit(_removeUnit(height) + 2);
  475.                 }
  476.                 var container = self.container = K(self.layout);
  477.                 if (fullscreenMode) {
  478.                         K(document.body).append(container);
  479.                 } else {
  480.                         self.srcElement.before(container);
  481.                 }
  482.                 var toolbarDiv = K('.toolbar', container),
  483.                         editDiv = K('.edit', container),
  484.                         statusbar = self.statusbar = K('.statusbar', container);
  485.                 container.// bugfix: [WEBKIT] 高度为0时在dialogé‡Œæ— æ³•ç²˜è´´æ–‡æœ¬
  486. -' + self.themeType).css('width', width);
  487.                 if (fullscreenMode) {
  488.                         container.css({
  489.                                 position : 'absolute',
  490.                                 left : 0,
  491.                                 top : 0,
  492.                                 'z-index' : 811211
  493.                         });
  494.                         if (!_GECKO) {
  495.                                 self._scrollPos = _getScrollPos();// 恢复文档高度
  496. To(0, 0);
  497.                         // bugfix: [WEBKIT] 高度为0时在dialogé‡Œæ— æ³•ç²˜è´´æ–‡æœ¬
  498.                         K(document.body).css({
  499.                                 'height' : '1px',
  500.                                 'overflow' : 'hidden'
  501.                         });
  502.                         K(document.body.parentNode).// create toolbar
  503. idden');
  504.                         self._fullscreenExecuted = true;
  505.                 } else {
  506.                         if (self._fullscreenExecuted) {
  507.                                 // 恢复文档高度
  508.                                 K(document.body).css({
  509.                                         'height' : '') {
  510.                                 htmlList.push('                         });
  511.                                 K(document.body.parentNode).css('overflow', '');
  512.                         }
  513.                         if (self._scrollPos) {
  514.                                 window.scrollTo(self._scrollPos.x, self._scrollPos.y);
  515.                         }
  516.                 }
  517.                 // create toolbar
  518.                 var htmlList = [];
  519.                 K.each(self.items, function(i, name) {
  520.                         if (name == '|') {
  521.                                 htmlList.push('<span class="ke-inline-block ke-separator"></span>');
  522.                         } else if (name == '/') {
  523.                                 htmlList.push('<div class="ke-hr"></div>');
  524.                         } else {
  525.                                 htmlList.push('<span class="ke-outline" data-name="' + name + '" title="' + self.lang(name) + '" unselectable="on">');
  526.                                 htmlList.push('<span class="ke-toolbar-icon ke-icon-' + name + '" unselectable="on">&#x' + self.fonts[name] + ';// create edit
  527. );
  528.                         }
  529.                 });
  530.                 var toolbar = self.toolbar = _toolbar({
  531.                         src : toolbarDiv,
  532.                         html : htmlList.join(''),
  533.                         noDisableItems : self.noDisableItems,
  534.                         click : function(e, name) {
  535.                                 e.stop();
  536.                                 if (self.menu) {
  537.                                         var menuName = self.menu.name;
  538.                                         self.hideMenu();
  539.                                         if (menuName === name) {
  540.                                                 return;
  541.                                         }
  542.                                 }
  543.                                 self.clickToolbar(name);
  544.                         }
  545.                 });
  546.                 // create edit
  547.                 var editHeight = _removeUnit(height) - toolbar.div.height();
  548.                 var edit = self.edit = // Bugfix: 浏览器后退产生__kindeditor_bookmark_start_0__
  549. .minHeight ? editHeight : self.minHeight,
  550.                         src : editDiv,
  551.                         srcElement : self.srcElement,
  552.                         designMode : self.designMode,
  553.                         themesPath : self.themesPath,
  554.                         bodyClass : self.bodyClass,
  555.                         cssPath : self.cssPath,
  556.                         cssData : self.cssData,
  557.                         beforeGetHtml : function(html) {
  558.                                 html = self.beforeGetHtml(html);
  559.                                 // Bugfix: 浏览器后退产生__kindeditor_bookmark_start_0__
  560.                                 html = _removeBookmarkTag(_removeTempTag(html));
  561.                                 return _formatHtml(html, self.filterMode ? self.htmlT// hide menu when click document
  562. llFormatMode, self.indentChar);
  563.                         },
  564.                         beforeSetHtml : function(html) {
  565.                                 html = _formatHtml(html, self.filterMode ? self.htmlTags : null, '', false);
  566.                                 return self.beforeSetHtml(html);
  567.                         },
  568.                         afterSetHtml : function() {
  569.                                 self.edit = edit = this;
  570.                                 self.afterSetHtml();
  571.                         },
  572.                         after// afterChange event
  573.  
  574.                                 self.edit = edit = this;
  575.                                 self.cmd = edit.cmd;
  576.                                 // hide menu when click document
  577.                                 self._docMousedownFn = function(e) {
  578.                                         if (self.menu) {
  579.                                                 self.hideMenu();
  580.                                         }
  581.                                 };
  582.                                 K(edit.doc, document).mousedown(self._docMousedownFn);
  583.                                 _bindContextmenuEvent.call(self);
  584.                                 _bindNewlineEvent.call(self);
  585.                                 _bindTabEvent.call(self);
  586.                                 _bindFocusEvent.call(self);
  587.                                 // afterChange event
  588.                                 edit.afterChange(function(// readonly
  589.  (!edit.designMode) {
  590.                                                 return;
  591.                                         }
  592.                                         self.updateState();
  593.                                         self.addBookmark();
  594.                                         if (self.options.afterChange) {
  595.                                                 self.options.afterChange.call(// Bugfix: å…¨å±åŽå’Œè¿˜åŽŸåŽå…‰æ ‡æ²¡æœ‰é€‰ä¸­ä¹‹å‰å…‰æ ‡çš„ä½ç½®
  596. ctrlKey && !e.altKey && _INPUT_KEY_MAP[e.which]) {
  597.                                                 if (self.options.afterChange) {
  598.                                                         self.options.afterChange.call(self);
  599.                                                 }
  600.                                         }
  601.                                 });
  602.                                 // readonly
  603.                                 if (self.readonlyMode) {
  604.                                         self.readonly();
  605.                                 }
  606.                                 self.isCreated = true;
  607.                                 if (self.initContent === '') {
  608.                                         self.initContent = self.html()// create statusbar
  609. x: å…¨å±åŽå’Œè¿˜åŽŸåŽå…‰æ ‡æ²¡æœ‰é€‰ä¸­ä¹‹å‰å…‰æ ‡çš„ä½ç½®
  610.                                 if (self._undoStack.length > 0) {
  611.                                         var prev = self._undoStack.pop();
  612.                                         i// remove resize event
  613. self.html(prev.html);
  614.                                                 edit.cmd.range.moveToBookmark(prev);
  615.                                                 self.select();
  616.                                         }
  617.                                 }
  618.                                 self.afterCreate();
  619.                                 if (self.options.afte// reset size
  620.                 self.options.afterCreate.ca// Bugfix: é¡µé¢åˆ·æ–°åŽï¼Œä¸Žç¬¬ä¸€æ¬¡è®¿é—®åŠ è½½çš„ç¼–è¯‘å™¨é«˜åº¦ä¸ä¸€è‡´
  621. ar').addClass('ke-statusbar')
  622.                         .append('<span class="ke-inline-block ke-statusbar-center-icon"></span>')
  623.                         .append('<span class="ke-inline-blo// fullscreen mode
  624. ht-icon"></span>');
  625.  
  626.                 // remove resize event
  627.                 if (self._fullscreenResizeHandler) {
  628.                         K(window).unbind('resize', self._fullscreenResizeHandler);
  629.                         self._fullscreenResizeHandler = null;
  630.                 }
  631.                 // reset size
  632.                 function initResize() {
  633.                         // Bugfix: é¡µé¢åˆ·æ–°åŽï¼Œä¸Žç¬¬ä¸€æ¬¡è®¿é—®åŠ è½½çš„ç¼–è¯‘å™¨é«˜åº¦ä¸ä¸€è‡´
  634.                         if (statusbar.height() === 0) {
  635.                                 setTimeout(initResize, 100);
  636.                                 return;
  637.                         }
  638.                         self.resize(width, height, // bind drag event
  639. esize();
  640.                 // fullscreen mode
  641.                 if (fullscreenMode) {
  642.                         self._fullscreenResizeHandler = function(e) {
  643.                                 if (self.isCreated) {
  644.                                         self.resize(_docElement().clientWidth, _docElement().clientHeight, false);
  645.                                 }
  646.                         };
  647.                         K(window).bind('resize', self._fullscreenResizeHandler);
  648.                         toolbar.select('fullscreen');
  649.                         statusbar.first().css('visibility', 'hidden');
  650.                         statusbar.last().css('visibility', 'hidden');
  651.                 } else {
  652.                         if (_GECKO) {
  653.                                 K(window).bind('scroll', function(e) {
  654.                                         self._scrollPos = _getScrollPos();
  655.                                 });
  656.                         }
  657.                         // bind drag event
  658.                         if (self.resizeType > 0) {
  659.                                 _drag({
  660.                                         moveEl : container,
  661.                                         clickEl : statusbar,
  662.                                         moveFn : function(x, y, width, height, diffX, diffY) {
  663.                                                 height += diffY;
  664.                                                 self.resize(null, height);
  665.                                         }
  666.                                 });
  667.                         } else {
  668.                                 statusbar.first().css('visibility', 'hidden');
  669.                         }
  670.                         if (self.resizeType === 2) {
  671.                                 _drag({
  672.                                         moveEl : container,
  673.                                         clickEl : statusbar.last(),
  674.                                         moveFn : function(x, y, width, height, diffX, diffY) {
  675.                                                 width += diffX;
  676.                                                 height += diffY;
  677.                                                 self.resize(width, height);
  678.                                         }
  679.                                 });
  680.                         } else {
  681.                                 statusbar.last().css('visibility', 'hidden');
  682.                         }
  683.                 }
  684.                 return self;
  685.         },
  686.         remove : function() {
  687.                 var self = this;
  688.                 if (!self.isCreated) {
  689.                         return self;
  690.                 }
  691.                 self.beforeRemove();
  692.  
  693.                 self.srcElement.data('kindeditor', '');
  694.  
  695.                 if (self.menu) {
  696.                         self.hideMenu();
  697.                 }
  698.                 _each(self.dialogs, function() {
  699.                         self.hideDialog();
  700.                 });
  701.                 K(document).unbind('mousedown'width'._docMousedownFn);
  702.                 self.toolbar.remove();
  703.                 self.edit.remove();
  704.                 self.statusbar.last().unbind();
  705.                 self.statusbar.unbind();
  706.                 self.container.remove();
  707.                 self.container = self.toolbar = self.edit = self.menu = null;
  708.                 self.dialogs = [];
  709.                 self.isCreated = false;
  710.                 return self;
  711.         },
  712.         resize : function(width, height, updateProp) {
  713.                 var self = this;
  714.                 updateProp = _undef(updateProp, true);
  715.                 if (width) {
  716.                         if (!/%/.test(width)) {
  717.                                 width = _removeUnit(width);
  718.                                 width = width < self.minWidth ? self.minWidth : width;
  719.                         }
  720.                         self.container.css('width', _addUnit(width));
  721.                         if (updateProp) {
  722.                                 self.width = _addUnit(width);
  723.                         }
  724.                 }
  725.                 if (height) {
  726.                         height = _removeUnit(height);
  727.                         editHeight = _removeUnit(height) -// Bugfix: http://www.kindsoft.net/view.php?bbsid=4&postid=6703&pagenum=1
  728. Height < self.minHeight ? self.minHeight : editHeight;
  729.                         self.edit.setHeight(editHeight);
  730.                         if (updateProp) {
  731.                                 self.height = _addUnit(height);
  732.                         }
  733.                 }
  734.                 return self;
  735.         },
  736.         select : function() {
  737.                 this.isCreated && this.cmd.select();
  738.                 return this;
  739.         },
  740.         html : function(val) {
  741.                 var self = this;
  742.                 if (val === undefined) {
  743.                         return self.isCreated ? self.edit.html() : _elementVal(self.srcElement);
  744.                 }
  745.                 self.isCreated ? self.edit.html(val) : _elementVal(self.srcElement, val);
  746.                 // Bugfix: http://www.kindsoft.net/view.php?bbsid=4&postid=6703&pagenum=1
  747.                 if (self.isCreated) {
  748.                         self.cmd.selection();
  749.                 }
  750.                 return self;
  751.         },
  752.         fullHtml : function() {
  753.                 return this.isCreated ? this.edit.html(undefined, true) : '';
  754.         },
  755.         text : function(val) {
  756.                 var self = this;
  757.                 if (val === undefined) {
  758.                         return _trim(self.html().replace(html').toLowerCase();
  759. , '').replace( 'html') {, ' '));
  760.                 } else {
  761.                         return self.html(_escape(val));
  762.                 }
  763.         },
  764.         isEmpty : function() {
  765.                 return _trim(this.text().replace(lace(/\r\n|\, '')) === '';
  766.         },
  767.         isDirty : function() {
  768.                 return _trim(this.initContent.replace(Case();
  769.                 var s, '')) !== _trim(this.html().replace(Flag = _inArray, ''));
  770.         },
  771.         selectedHtml : function() {
  772.                 var val = this.isCreated ? this.cmd.range.html() : '';
  773.                 val = _removeBookmarkTag(_removeTempTag(val));
  774.                 retu// ä¸éœ€è¦æ”¹å˜å·¥å…·æ çŠ¶æ€ï¼Œä¸éœ€è¦ä¿å­˜bookmark
  775. ode = (mode || 'html').toLowerCase();
  776.                 if (mode === 'html') {
  777.                         return self.html().length;
  778.                 }
  779.                 if (mode === 'text') {
  780.                         return self.text().replace(             }
  781.                 return self;
  782.         },, 'K').replace(function(val,, '').length;
  783.                 }
  784.                 return 0;
  785.         },
  786.         exec : function(key) {
  787.                 key = key.toLowerCase();
  788.                 var self = this, cmd = self.cmd,
  789.                         changeFlag = _inArray(key, 'selectall,copy,paste,print'.split(',')) < 0;
  790.                 if (changeFlag) {
  791.                         self.addBookmark(false);
  792.                 }
  793.                 cmd[key].apply(cmd, _toArray(arguments, 1));
  794.                 // ä¸éœ€è¦æ”¹å˜å·¥å…·æ çŠ¶æ€ï¼Œä¸éœ€è¦ä¿å­˜bookmark
  795.                 if (changeFlag) {
  796.                         self.updateState();
  797.                         self.addBookmark(false);
  798.                         if (self.options.afterChange) {
  799.                                 self.options.afterChange.call(self);
  800.                         }
  801.                 }
  802.                 return self;
  803.         },
  804.         insertHtml : function(val, quickMode) {
  805.                 if (!this.isCreated) {
  806.                         return this;
  807.                 }
  808.                 val = this.beforeSetHtml(val);
  809.                 this.exec('inserthtml', val, quickMode);
  810.                 return this;
  811.         },
  812.         appendHtml : function(val) {
  813.                 this.html(this.html() + val);
  814.                 if (this.isCreated) {
  815.                         var cmd = this.cmd;
  816.                         cmd.range.selectNodeContents(cmd.doc.body).collapse(false);
  817.                         cmd.select();
  818.                 }
  819.                 return this;
  820.         },
  821.         sync : function() {
  822.                 _elementVal(this.srcElement, this.html());
  823.                 return this;
  824.         },
  825.         focus : function() {// 第一次执行addBookmark时不执行range.createBookmark
  826. us();
  827.                 return this;
  828.         },
  829.         blur : function() {
  830.                 this.isCreated ? this.edit.blur() : this.srcElement[0].blur();
  831.                 return this;
  832.         },
  833.         addBookmark : function(checkSize) {
  834.                 checkSize = _undef(checkSize, true);
  835.                 var self = this, edit = self.edit,
  836.                         body = edit.doc.body,
  837.                         html = _removeTempTag(body.innerHTML), bookmark;
  838.  
  839.                 if (checkSize && self._undoStack.length > 0) {
  840.                         var prev = self._undoStack[self._undoStack.length - 1];
  841.                         if (Math.abs(html.length - _removeBookmarkTag(prev.html).length) < self.minChangeSize) {
  842.                                 return self;
  843.                         }
  844.                 }
  845.                 // 第一次执行addBookmark时不执行range.createBookmark
  846.                 if (edit.designMode && !self._firstAddBookmark) {
  847.                         var range = self.cmd.range;
  848.                         bookmark = range.createBookmark(true);
  849.                         bookmark.html = _removeTempTag(body.innerHTML);
  850.                         range.moveToBookmark(bookmark);
  851.                 } else {
  852.                         bookmark = {
  853.                                 html : html
  854.                         };
  855.                 }
  856.                 self._firstAddBookmark = false;
  857.                 _addBookmarkToStack(self._undoStack, bookmark);
  858.                 return self;
  859.         },
  860.         undo : function() {
  861.                 return _undoToRedo.call(this, this._undoStack, this._redoStack);
  862.         },
  863.         redo : function() {
  864.                 return _undoToRedo.call(this, this._redoStack, this._undoStack);
  865.         },
  866.         fullscreen : function(bool) {
  867.                 this.fullscreenMode = (bool === undefined ? !this.fullscreenMode : bool);
  868.                 this.addBookmark(false);
  869.                 return this.remove().create();
  870.         },
  871.         readonly : function(isReadonly) {
  872.                 isReadonly = _undef(isReadonly, true);
  873.                 var self = this, edit = self.edit, doc = edit.doc;
  874.                 if (self.designMode) {
  875.                         self.toolbar.disableAll(isReadonly, []);
  876.                 } else {
  877.                         _each(self.noDisableItems, function() {
  878.                                 self.toolbar[isReadonly ? 'disable' : 'enable'](this);
  879.                         });
  880.                 }
  881.                 if (_IE) {
  882.                         doc.body.contentEditable = !isReadonly;
  883.                 } else {
  884.                         doc.designMode = isReadonly ? 'off' : 'on';
  885.                 }
  886.                 edit.textarea[0].disabled = isReadonly;
  887.         },
  888.         createMenu : function(options) {
  889.                 var self = this,
  890.                         name = options.name,
  891.                         knode = self.toolbar.get(name),
  892.                         pos = knode.pos();
  893.                 options.x = pos.x;
  894.                 options.y = pos.y + knode.height();
  895.                 options.z = self.options.zIndex;
  896.                 options.shadowMode = _undef(options.shadowMode, self.shadowMode);
  897.                 if (options.selectedColor !== undefined) {
  898.                         options.cls = 'ke-colorpicker-' + self.themeType;
  899.                         options.noColor = self.lang('noColor');
  900.                         self.menu = _colorpicker(options);
  901.                 } else {
  902. // IE bugfix: 关闭dialog后,跳转到top
  903.  
  904.                         options.centerLineMode = false;
  905.                         self.menu = _menu(options);
  906.                 }
  907.                 return self.menu;
  908.         },
  909.         hideMenu : function() {
  910.                 this.menu.remove();
  911.                 this.menu = null;
  912.                 return this;
  913.         },
  914.         hideContextmenu : function() {
  915.                 t// IE bugfix: 关闭dialog后,跳转到top
  916. = null;
  917.                 return this;
  918.         },
  919.         createDialog : function(options) {
  920.                 var self = this, name = options.name;
  921.                 options.z = self.options.zIndex;
  922.                 options.shadowMode = _undef(options.shadowMode, self.shadowMode);
  923.                 options.closeBtn = _undef(options.closeBtn, {
  924.                         name : self.lang('close'),
  925.                         click : function(e) {
  926.                                 self.hideDialog(// 提高maskçš„z-index
  927. ³é—­dialog后,跳转到top
  928.         // 提高dialogçš„z-index
  929.                                         self.cmd.select();
  930.                                 }
  931.                         }
  932.                 }// 不显示mask
  933. n = _undef(options.noBtn, {
  934.                         name : self.lang(options.yesBtn ? 'no' : 'close'),
  935.                         click : function(e) {
  936.                                 self.hideDialog();
  937.                                 // IE bugfix: 关闭dialog后,跳转到top
  938.                                 if (_IE && self.cmd) {
  939.                                         self.cmd.select();
  940.                                 }
  941.                         }
  942.                 });
  943.                 if (self.dialogAlignType != 'page') {
  944.                         options.alignEl = self.container;
  945.                 }
  946.                 options.cl// 降低maskçš„z-index
  947. themeType;
  948.  
  949.                 if (self.dialogs.length > 0) {
  950.                         var firstDialog = self.dialogs[0],
  951.                                 parentDialog = self.dialogs[self.dialogs.length - 1];
  952.                         // 提高maskçš„z-index
  953.                         firstDialog.setMaskIndex(parentDialog.z + 2);
  954.                         // 提高dialogçš„z-index
  955.                         options.z = parentDialog.z + 3;
  956.                         // 不显示mask
  957.                         options.showMask = false;
  958.                 }
  959.                 var dialog = _dialog(options);
  960.                 self.dialogs.push(dialog);
  961.                 return dialog;
  962.         },
  963.         hideDialog : function() {
  964.                 var self = this;
  965.                 if (self.dialogs.length > 0) {
  966.                         self.dialogs.pop().remove();
  967.                 }
  968.                 if (self.dialogs.length > 0) {
  969.                         var firstDialog = self.dialogs[0],
  970.         /**
  971.         @example
  972.         K.create('textarea');
  973.         K.create('textarea.class');
  974.         K.create('#id');
  975. */z-index
  976.                         firstDialog.setMaskIndex(parentDialog.z - 1);
  977.                 }
  978.                 return self;
  979.         },
  980.         errorDialog : function(html) {
  981.                 var self = this;
  982.                 var dialog = self.createDialog({
  983.                         width : 750,
  984.                         title : self.lang('uploadError'),
  985.                         body : '<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'
  986.                 });
  987.                 var iframe // è‡ªåŠ¨åŠ è½½CSS文件
  988. , doc = K.iframeDoc(iframe);
  989.                 doc.open();
  990.                 doc.write(html);
  991.                 doc.close();
  992.                 K(doc.body).css('background-color', '#FFF');
  993.                 iframe[0].contentWindow.focus();
  994.                 return self;
  995.         }
  996. };
  997.  
  998. function _editor(options) {
  999.         return new KEditor(options);
  1000. }
  1001.  
  1002. _instances = [];
  1003.  
  1004. /**
  1005.         @example
  1006.         K.create('textarea');
  1007.         K.create('textarea.class');
  1008.         K.create('#id');
  1009. */
  1010. function _create(expr, options) {
  1011.         options = options || {};
  1012.         options.basePath = _undef(options.basePath, K.basePath);
  1013.         options.themesPath = _undef(options.themesPath, options.basePath + 'themes/');
  1014.         options.langPath = _undef(options.langPath, options.basePath + 'lang/');
  1015.         options.pluginsPath = _undef(options.pluginsPath, options.basePath + 'plugins/');
  1016.         // // create editor
  1017.  è½½CSS文件
  1018.         if (_undef(options.loadStyleMode, K.op// create editor after load lang file
  1019. e = _undef(options.themeType, K.options.themeType);
  1020.                 _loadStyle(options.themesPath + 'default/default.css');
  1021.                 _loadStyle(options.themesPath + themeType + '/' + themeType + '.css');
  1022.         }
  1023.         function create(editor) {
  1024.                 _each(_plugins, function(name, fn) {
  1025.                         if (_isFunction(fn)) {
  1026.                                 fn.call(editor, KindEditor);
  1027.                         }
  1028.                 });
  1029.                 return editor.create();
  1030.         }
  1031.         var knode = K(expr);
  1032.         if (!knode || knode.length === 0) {
  1033.                 return;
  1034.         }
  1035.         if (knode.length > 1) {
  1036.                 knode.each(function() {
  1037.                         _create(this, options);
  1038.                 });
  1039.                 return _instances[0];
  1040.         }
  1041.         options.srcElement = knode[0];
  1042.         var editor = new KEditor(options);
  1043.         _instances.push(editor);
  1044.         // create editor
  1045.         if (_language[editor.langType]) {
  1046.                 return create(editor);
  1047.         }
  1048.         // create editor after load lang file
  1049.         _loadScript(editor.langPath + editor.langType + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function() {
  1050. // 解决IE6浏览器重复下载背景图片的问题
  1051. hEditor(expr, fn) {
  1052.         K(expr).each(function(i, el) {
  1053.                 K.each(_instances, function(j, editor) {
  1054.                         if (editor && editor.srcElement[0] == el) {
  1055.                                 fn.call(editor, j);
  1056.                                 return false;
  1057.                         }
  1058.                 });
  1059.         });
  1060. }
  1061.  
  1062. K.remo// core plugins
  1063. pr) {
  1064.         _eachEditor(expr, function(i) {
  1065.                 this.remove();
  1066.                 _instances.splice(i, 1);
  1067.         });
  1068. };
  1069.  
  1070. K.sync = function(expr) {
  1071.         _eachEditor(expr, function() {
  1072.                 this.sync();
  1073.         });
  1074. };// afterChange
  1075. tion(expr, val) {
  1076.         _eachEditor(expr, function() {
  1077.                 this.html(val);
  1078.         });
  1079. };
  1080.  
  1081. K.insertHtml = function(expr, val) {
  1082.         _// sync
  1083. or(expr, function() {
  1084.                 this.insertHtml(val);
  1085.         });
  1086. };
  1087.  
  1088. K.appendHtml = function(expr, val) {
  1089.         _eachEditor(expr, function() {
  1090.                 this.appendHtml(val);
  1091.         });
  1092. };
  1093.  
  1094. // 解决IE6浏览器重复下载背景图片的问题
  1095. if (_IE && _V < 7) {
  1096.         _native// Bugfix:       Firefox下后退,编辑器数据不保存
  1097. itorClass = KEditor;
  1098. K.editor = _editor;
  1099. K.create = _create;
  1100. K.instances = _instances;
  1101. K.plugin = _plugin;
  1102. K.lang = _lang;
  1103.  
  1104. // core plugins
  1105. _plugin('core', function(K) {
  1106.         var self = this,
  1107.                 shortcutKeys = {
  1108.                         undo : 'Z', redo : 'Y', bold : 'B', italic : 'I', underline : 'U', print : 'P', selectall : 'A'
  1109.                 };
  1110.         // afterCh// source
  1111. .afterSetHtml(function() {
  1112.                 if (self.options.afterChange) {
  1113.                         self.options.afterChange.call(self);
  1114.                 }
  1115.         });
  1116.         // sync
  1117.         self.afterCreate(function() {
  1118.                 if (self.syncType != 'form') {
  1119.                         return;
  1120.                 }
  1121.                 var el = K(self.srcElement), hasForm = false;
  1122.                 while ((el = el.parent())) {
  1123.                         // Bugfix: http://www.kindsoft.net/view.php?bbsid=4&postid=7061&pagenum=1
  1124. Form) {
  1125.                         el.bind('submit', function(e) {
  1126.                                 self.sync();
  1127.                                 // Bugfix:      Firefox下后退,编辑器数据不保存
  1128.                                 K(window).bind('unload', function() {
  1129.                                         self.edit.textarea.remove();
  1130.                                 });
  1131.                         });
  1132.                         var resetBtn = K('source'reset"]', el)// fullscreen
  1133. click(function() {
  1134.                                 self.html(self.initContent);
  1135.                                 self.cmd.selection();
  1136.                         });
  1137.                         self.beforeRemove(function() {
  1138.                                 el.unbind();
  1139.                                 resetBtn.unbind();
  1140.                         });
  1141.                 }
  1142.         });
  1143.         // source
  1144.         self.clickToolbar('source', function() {
  1145.                 if (self.edit.desi// bugfix: 在opera 11ä¸Šæ— æ³•å…¨å±ï¼Œå¿…é¡»ç”¨setTimeout
  1146. ign(false);
  1147.                         self.toolbar.select('source');
  1148.                 } else {
  1149.                         self.toolbar.disableAll(false);
  1150.                         self.// bugfix: 在IEä¸Šåœ¨ä»£ç æ¨¡å¼ä¸‹åˆ‡æ¢å…¨å±å‡ºçŽ°å¥‡æ€ªçŽ°è±¡
  1151.  http://www.kindsoft.net/view.php?bbsid=4&postid=7061&pagenum=1
  1152.                         if (_GECKO) {
  1153.                                 setTimeout(function() {
  1154.                                         self.cmd.select// undo, redo
  1155. 0);
  1156.                         } else {
  1157.                                 self.cmd.selection();
  1158.                         }
  1159.                 }
  1160.                 self.designMode = self.edit.designMode;
  1161.         });
  1162.         self.afterCreate(function() {
  1163.                 if (!self.designMode) {
  1164.                         self.toolbar.disableAll(true).select('source');
  1165.                 }
  1166.         });
  1167.         // fullscreen
  1168.         self.clickToolbar('fullscreen', function() {
  1169.                 self.full// formatblock
  1170.         if (self.fullscreenShortcut) {
  1171.                 var loaded = false;
  1172.                 self.afterCreate(function() {
  1173.                         K(self.edit.doc, self.edit.textarea).keyup(function(e) {
  1174.                                 if (e.which == 27) {
  1175.                                         // bugfix: 在opera 11ä¸Šæ— æ³•å…¨å±ï¼Œå¿…é¡»ç”¨setTimeout
  1176.                                         setTimeout(function() {
  1177.                                                 self.fullscreen();
  1178.                                         }, 0);
  1179.                                 }
  1180.                         });
  1181.                         if (loaded) {
  1182.                                 // bugfix: 在IEä¸Šåœ¨ä»£ç æ¨¡å¼ä¸‹åˆ‡æ¢å…¨å±å‡ºçŽ°å¥‡æ€ªçŽ°è±¡
  1183.                                 if (_IE && !self.designMode) {
  1184.                                         return;
  1185.                                 }
  1186.                                 self.focus();
  1187.                         }
  1188.                         if (!loaded) {
  1189.                                 loaded = true;
  1190.                         }
  1191.                 });
  1192.         }
  1193.         // undo, redo
  1194.         _each('undo,redo'.split(','), function(i, name) {
  1195.                 if (shortcutKeys[name]) {
  1196.                         self.afterCreate(function() {
  1197.                                 _ctrl(this.edit.doc, shortcutKeys[// fontname
  1198. ion() {
  1199.                                         self.clickToolbar(name);
  1200.                                 });
  1201.                         });
  1202.                 }
  1203.                 self.clickToolbar(name, function() {
  1204.                         self[name]();
  1205.                 });
  1206.         });
  1207.         // formatblock
  1208.         self.clickToolbar('formatblock', function() {
  1209.                 var blocks = self.lang('formatblock.formatBlock'),
  1210.                         heights = {
  1211.                                 h1 : 28,
  1212.                                 h2 : 24,
  1213.                                 h3 : 18,
  1214.                                 H4 : 14,
  1215.                                 p : 12
  1216.                         },
  1217.                         curVal = self.cmd.val('formatblock'),
  1218.                         menu = self.createMenu({
  1219.                                 name : 'formatblock',
  1220.                                 width : self.langType == 'fontname' : 150
  1221.                         });
  1222.                 _each(blocks, function(key, // fontsize
  1223. r style = 'font-size:' + heights[key] + 'px;';
  1224.                         if (key.charAt(0) === 'fontsize'        style += 'font-weight:bold;';
  1225.                         }
  1226.                         menu.addItem({
  1227.                                 title : '<span style="' + style + '" unselectable="on">' + val + '</span>',
  1228.                                 height : heights[key] + 12,
  1229.                                 checked : (curVal === key || curVal === val),
  1230.                                 click : function() {
  1231.                                         self.select().exec('formatblock', '<' + key + '>').hideMenu();
  1232.                                 }
  1233.                         });
  1234.                 });
  1235.         });
  1236.         // fontname
  1237.         self.clickToolbar('fontname', function() {
  1238.         // forecolor,hilitecolor
  1239. l('fontname'),
  1240.                         menu = self.createMenu({
  1241.                                 name : 'fontname',
  1242.                                 width : 150
  1243.                         });
  1244.                 _each(self.lang('fontname.fontName'), function(key, val) {
  1245.                         menu.addItem({
  1246.                                 title : '<span style="font-family: ' + key + ';" unselectable="on">' + val + '</span>',
  1247.                                 checked : (curVal === key.toLowerCase() || curVal === // cut,copy,paste
  1248. ,
  1249.                                 click : function() {
  1250.                                         self.exec('fontname', key).hideMenu();
  1251.                                 }
  1252.                         });
  1253.                 });
  1254.         });
  1255.         // fontsize
  1256.         self.clickToolbar('fontsize', function() {
  1257.                 var curVal = self.cmd.val('fontsize'),
  1258.                         menu = self.createMenu({
  1259. // about
  1260. : 'fontsize',
  1261.                                 width : 150
  1262.                         });
  1263.                 _each(self.fontSizeTable, function(i, val) {
  1264.                         menu.addItem({
  1265.                                 title : '<span style="font-size:' + val + ';" unselectable="http://www.kindsoft.net/"                           height : _removeUnit(val) + 12,
  1266.                                 checked : curVal === val,
  1267.                                 click : function() {
  1268.                                         self.exec('fontsize',
  1269.                         width : 350,
  1270.                         title : self.lang(');
  1271.         // forecolor,hilitecolor
  1272.         _each(// link,image,flash,media,anchor
  1273. ), function(i, name) {
  1274.                 self.clickToolbar(name, function() {
  1275.                         self.createMenu({
  1276.                                 name : name,
  1277.                                 selectedColor : self.cmd.val(name) || 'default',
  1278.                                 colors : self.colorTable,
  1279.                                 click : function(color) {
  1280.                                         self.exec(name, color).hideMenu();
  1281.                                 }
  1282.                         });
  1283.                 });
  1284.         });
  1285.         // cut,copy,paste
  1286.         _each(('cut,copy,paste').split(','), function(i, name) {
  1287.                 self.clickToolbar(name, function() {
  1288.                         self.focus();
  1289.                         try {
  1290.                                 self.exec(name, null);
  1291.                         } catch(e) {
  1292.                                 alert(self.lang(name + 'Error'));
  1293.                         }
  1294.                 });
  1295.         });
  1296.         // about
  1297.         self.clickToolbar('about', function() {
  1298.                 var html = '<div style="margin:20px;">' +
  1299.                         '<div>KindEditor ' + _VERSION + '</div>' +
  1300.                         '<div>Copyright &copy; <a href="http://www.kindsoft.net/" target="_blank">kindsoft.net</a> All rights reserved.</div>' +
  1301.                         '</div>';
  1302.                 self.createDialog({
  1303.                         name : 'about',
  1304.                         width : 350,
  1305.                         title : self.lang('about'),
  1306.                         body : html
  1307.                 });
  1308.         });
  1309.         // link,image,flash,media,anchor
  1310.         self.plugin.getSelectedLink = function() {
  1311.                 return self.cmd.commonAncestor('a');
  1312.         };
  1313.         self.plugin.getSelectedImage = function() {
  1314.                 return _getImageFromRange(self.edit.cmd.range, function(img) {
  1315.                         return !/^ke-\w+$/i.test(img[0].className);
  1316.                 });
  1317.         };
  1318.         self.plugin.getSelectedFlash = function() {
  1319.                 return _getImageFromRange(self.edit.cmd.range, function(img) {
  1320.                         return img[0].className == 'ke-// table
  1321.         });
  1322.         };
  1323.         self.plugin.getSelectedMedia = function() {
  1324.                 return _getImageFromRange(self.edit.cmd.range, function(img) {
  1325.                         return img[0].className == 'ke-media' || img[0].className == 'ke-rm';
  1326.                 });
  1327.         };
  1328.         self.plugin.getSelectedAnchor = function() {
  1329.                 return _getImageFromRange(self.edit.cmd.range, function(img) {
  1330.                         return img[0].className == 'ke-anchor';
  1331.                 });
  1332.         };
  1333.         _each('link,image,flash,media,anchor'.split(','), function(i, name) {
  1334.                 var uName = name.charAt(0).toUpperCase() + name.substr(1);
  1335.                 _each('edit,delete'.split(','), function(j, val) {
  1336.                         self.addContextmenu({
  1337.                                 title : self.lang(val + uName),
  1338.                                 click : function() {
  1339.                                         self.loadPlugin(name, function() {
  1340.                                                 self.plugin[name][val]();
  1341.                                                 self.hideMenu();
  1342.                                         });
  1343.                                 },
  1344.                                 cond : self.plugin['getSelected' + uName],
  1345.                                 width : 150,
  1346.                                 iconClass : val == 'edit' ? 'ke-icon-' + name : undefined
  1347.                         });
  1348.                 })// other
  1349. addContextmenu({ title : '-' });
  1350.         });
  1351.         // table
  1352.         self.plugin.getSelectedTable = function() {
  1353.                 return self.cmd.commonAncestor('table');
  1354.         };
  1355.         self.plugin.getSelectedRow = function() {
  1356.                 return self.cmd.commonAncestor('tr');
  1357.         };
  1358.         self.plugin.getSelectedCell = function() {
  1359.                 return self.cmd.commonAncestor('td');
  1360.         };
  1361.         _each(('prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,' +
  1362.         'rowsplit,colsplit,coldelete,rowdelete,insert,delete').split(','), function(i, val) {
  1363.                 var cond = _inArray(val, ['pro// paste
  1364. te']) < 0 ? self.plugin.getSelectedCell : self.plugin.getSelectedTable;
  1365.                 self.addContextmenu({
  1366.                         title : self.lang('table' + val),
  1367.                         click : function() {
  1368.                                 self.loadPlugin('table', function() {
  1369.                                         self.plugin.table[val]();
  1370.                                         self.hideMenu();
  1371.                                 });
  1372.                         },
  1373.                         cond : cond,
  1374.                         width : 170,
  1375.                         iconClass : 'ke-icon-table' + val
  1376.                 });
  1377.         });
  1378.         self.addContextmenu({ title : '-' });
  1379.         // other
  1380.         _each(('selectall,justifyleft,ju// Bugfix: https://github.com/kindsoft/kindeditor/issues/8
  1381.                 'insertunorderedlist,indent,outdent,subscript,superscript,hr,print,' +
  1382.                 'bold,italic,underline,strikethrough,removeformat,unlink').split(','), function(i, name) {
  1383.                 if (shortcutKeys[name]) {
  1384.                         self.afterCreate(function() {
  1385.                                 _ctrl(this.edit.doc, shortcutKey// Chrome纯文本粘贴问题
  1386. .cmd.selection();
  1387.                                         self.clickToolbar(name);
  1388.                                 });
  1389.                         });
  1390.                 }
  1391.                 se// paste HTML
  1392. r(name, function() {
  1393.                         self.focus(// 去除内容为空的pæ ‡ç­¾
  1394. // paste
  1395.         self.afterCreate(function() {
  1396.                 var doc = self.edit.doc,// paste from ms word
  1397.                 cls = '__kindeditor_paste__', pasting = false;
  1398.                 function movePastedData() {
  1399.                         cmd.range.moveToBookmark(bookmark);
  1400.                         cmd.select();
  1401.                         if (_WEBKIT) {
  1402.                                 K('div.' + cls, div).each(function() {
  1403.                                         K(this).after('<br />').remove(true);
  1404.                                 });
  1405.                                 K('span.Apple-style-span', div).remove(// paste text
  1406. span.Apple-tab-span', div).remove(true);
  1407.                                 // Bugfix: https://github.com/kindsoft/kindeditor/issues/8
  1408.                                 K('span[style]', div).each(function() {
  1409.                                         if (K(this).css('white-space') == 'nowrap') {
  1410.                                                 K(this).remove(true);
  1411.                                         }
  1412.                                 });
  1413.                                 K(''eta', div).remove();
  1414.                         }
  1415.                         var html = div[0].innerHTML;
  1416.                         div.remove();
  1417.                         if (html === '') {
  1418.                                 return;
  1419.                         }
  1420.                         // Chrome纯文本粘贴问题
  1421.                         if (_WEBKIT) {
  1422.                                 html = html.replace(
  1423.                                 } else , '$1');
  1424.                         }
  1425.                         // paste HTML
  1426.                         if (self.pasteType === 2) {
  1427.                                 // 去除内容为空的pæ ‡ç­¾
  1428.                                 html = html.replace(ype === 0) {
  1429.                                 e.stop();
  1430.                                 , '');
  1431.                                 // paste from ms word
  1432.                                 if (;
  1433.                         }
  1434.                         pasting = true;
  1435.                         K('div.' + cls, .test(html)) {
  1436.                                         html = _clearMsWord(html, self.filterMode ? self.htmlTags : K.options.htmlTags);
  1437.                                 } else {
  1438.                                         html = _formatHtml(html, self.filterMode ? self.htmlTags : null);
  1439.                                         html = self.beforeSetHtml(html);
  1440.                                 }
  1441.                         }
  1442.                         // paste text
  1443.                         if (self.pasteType === 1) {
  1444.                                 html = html.replace('white-spa, ' : '
  1445.                                 html = html.replace(ody).appen, '\n');
  1446.                                 html = html.replace( = cmd.range., '\n');
  1447.                                 html = html.replace(ext(div[0]);
  1448.                                 , '\n');
  1449.                                 html = html.replace(('paste');, '');
  1450.                                 html = html.replace(/ {2}/g, ' &nbsp;');
  1451.                                 if (self.newlineTag == 'p') {
  1452.                                         if (;
  1453.                 .test(html)) {
  1454.                                                 html = html.replace(ted, '<p>').replace(ng , '<br /></p>').replace(
  1455.         });, // 取得HTML前执行
  1456. }
  1457.                                 } else {
  1458.                                         html = html.replace// Bugifx : https://github.com/kindsoft/kindeditor/issues/66
  1459. );
  1460.                 }
  1461.                 K(doc.body).bind('paste', function(e){
  1462.                         if (self.pasteType === 0) {
  1463.                                 e.stop();
  1464.                                 return;
  1465.                         }
  1466.                         if (pasting) {
  1467.                                 return;
  1468.                         }
  1469.                         pasting = true;
  1470.                         K('div// Bugfix: https://github.com/kindsoft/kindeditor/issues/88
  1471. ookmark = cmd.range.createBookmark();
  1472.                         div = K('<div class="' + cls + '"></div>', doc).css({
  1473.                                 position : 'absolute',
  1474.                                 width : '1px',
  1475.                                 height : '1px',
  1476.                                 overflow : 'hidden',
  1477.                                 left : '-1981px',
  1478.                                 top : K(bookmark.start).pos().y + 'px',
  1479.                                 'white-space' : 'nowrap'
  1480.                         });
  1481.                         K(doc.body).append(div);
  1482.                         if (_IE) {
  1483.                                 var rng = cmd.range.get(true);
  1484.                                 rng.moveToElementText(div[0]);
  1485.                                 rng.select();
  1486.                                 rng.execCommand('paste');
  1487.                                 e.preventDefault();
  1488.                         } else {
  1489.                                 cmd.range.selectNodeContents(div[0]);
  1490.                                 cmd.select();
  1491.                         }
  1492.                         setTimeout(function() {
  1493.                                 movePastedData();
  1494.                                 pasting = false;
  1495.                         }, 0);
  1496.                 });
  1497.         });
  1498.         // 取得HTML前执行
  1499.         self.beforeGetHtml(function(html) {
  1500.                 // Bugifx : https://github.com/kindsoft/kindeditor/issues/66
  1501.                 if (_IE && _V <= 8) {
  1502.                         html = html.replace(dth, width);
  1503.                         attrs.height = _undef(imgAttrs.height, height);
  1504.                 , function(full, tag) {
  1505.                                 return unescape(tag);
  1506.                         });
  1507.                         // Bugfix: https://github.com/kindsoft/kindeditor/issues/88
  1508.                         html = html.replace(eturn '<a name="' + unescape, function($0, $1, $2) {
  1509.                                 if (!/\s+type="[^"]+"/i.test($0)) {
  1510.                                         return $1 + ' type="text"' + $2;
  1511.                                 }
  1512.                                 return $0;
  1513.                         });
  1514.                 }
  1515.                 return html.replace(return '<script' + unescape(attr) + '>' + unescape(code) + ', function($0, $1, $2, $3) {
  1516.                         return $1 + _unescape($2).replace(^"]*)", ' ') + $3;
  1517.                 })
  1518.                 .replace(unction(full, attr, code) {
  1519.                         return '<noscript, function(full) {
  1520.                         var imgAttrs = _getAttrList(full);
  1521.                         var styles = _getCssList(imgAttrs.style || '');
  1522.                         var attrs = _mediaAttrs(imgAttrs['data-ke-tag']);
  1523.                         var width = _undef(styles.width, '');
  1524.                         var height = _undef(styles.height, '');
  1525.                         if (ape(s.test(width)) {
  1526.                                 width = _removeUnit(width);
  1527.                         }
  1528.                         if (]*"/i.test(height)) {
  1529.                                 height = _removeUnit(height);
  1530.                         }
  1531.                         attrs.width = _undef(imgAttrs.width, width);
  1532.                         attrs.height = _undef(imgAttrs.height, he// 设置HTML前执行
  1533. Embed(attrs);
  1534.                 })
  1535.                 .replace(tml) {
  1536.                 // Bugifx : https://github.co, function(full) {
  1537.                         var imgAttrs = _getAttrList(full);
  1538.                         return '<a name="' + unescape(imgAttrs['data-ke-name']) + '"></a>';
  1539.                 })
  1540.                 .replace(ull) {
  1541.                                 var attrs = _getAttrList(full);
  1542.                                 var styles = _getCssL, function(full, attr, code) {
  1543.                         return '<script' + unescape(attr) + '>'<div class="ke-display-none" data-ke-input-tag="' + escape(full) + '"></div>';
  1544.                                 }
  1545.                                 return full;
  1546.                         });
  1547.                 }
  1548.                 retu, function(full, attr, code) {
  1549.                         return '<noscript' + unescape(attr) + '>' + unescape(code) + '</noscript>';
  1550.                 })
  1551.                 .replace(s.src = _undef(attrs.src, '');
  1552.                         attrs.w, function(full, start, src, end) {
  1553.                         full = full.replace(rs.height, 0);
  1554.                         return _medi, function($0, $1, $2) {
  1555.                                 return $1 + _unescape(src) + $2;
  1556.                         });
  1557.                         full = full.replace(]*>(?:<\/a>)?/ig, functio, '');
  1558.                         return full;
  1559.                 })
  1560.                 .replace(ull);
  1561.                         if (attrs.href !== undefined) {
  1562.                 , function(full, start, end) {
  1563.                         return start + end;
  1564.                 });
  1565.         });
  1566.         // 设置HTML前执行
  1567.         self.beforeSetHtml(function(html) {
  1568.                 // Bugifx : https://github.com/kindsoft/kindeditor/issues/66
  1569.                 if (_IE && _V <= 8) {
  1570.                         html = html.replace(ss="ke-script" data-ke-script-attr="' + escape(attr) , function(full) {
  1571.                                 var attrs = _getAttrList(full);
  1572.                                 var styles = _getCssList(attrs.style || '');
  1573.                                 if (styles.display == 'none') {
  1574.                                         return '<div class="ke-display-none" data-ke-input-tag="' + escape(full) + '"></div>';
  1575.                                 }
  1576.                                 return full;
  1577.                         });
  1578.                 }
  1579.                 return html.replace(ig, function(full, start, key, src, end) {
  1580.                         if , function(full) {
  1581.                         var attrs = _getAttrList(full);
  1582.                         attrs.src = _undef(attrs.src, '="'
  1583.                         attrs.width = _undef(attrs.width, 0);
  1584.                         attrs.height = _undef(attrs.height, 0);
  1585.                         return _mediaImg(self.themesPath + 'common/blank.gif', attrs);
  1586.                 })
  1587.                 .replace( start + 'data-ke-' + end;
  1588.                 })
  1589.                 .replac, function(full) {
  1590.                         var attrs = _getAttrList(full);
  1591.                         if (attrs.href !== undefined) {
  1592.                                 return full;
  1593.                         }
  1594.                         return '<img class="ke-anchor" src="' + self.themesPath + 'common/ancho

Raw Paste


Login or Register to edit or fork this paste. It's free.