JAVASCRIPT   8

cmd.js

Guest on 25th July 2021 04:08:19 PM

  1.  
  2. // original execCommand
  3. function _nativeCommand(doc, key, val) {
  4.         try {
  5.                 doc.execCommand(key, false, val);
  6.         } catch(e) {}
  7. }
  8. // original queryCommandValue
  9. function _nativeCommandValue(doc, key) {
  10.         var val = '';
  11.         try {
  12.                 val = doc.queryCommandValue(key);
  13.         } catch (e) {}
  14.         if (typeof val !== 'string') {
  15.                 val = '';
  16.         }
  17.         return val;
  18. }
  19. // get current selection of a document
  20. function _getSel(doc) {
  21.         var win = _getWin(doc);
  22.         return _IERANGE ? doc.selection : win.getSelection();
  23. }
  24. // get range of current selection
  25. function _getRng(doc) {
  26.         var sel = _getSel(doc), rng;
  27.         try {
  28.                 if (sel.rangeCount > 0) {
  29.                         rng = sel.getRangeAt(0);
  30.                 } else {
  31.                         rng = sel.createRange();
  32.                 }
  33.         } catch(e) {}
  34.         if (_IERANGE && (!rng || (!rng.item && rng.parentElement().ownerDocument !== doc))) {
  35.                 return null;
  36.         }
  37.         return rng;
  38. }
  39. //将map的复合key转换成单一key
  40. 换成单一key
  41. function _singleKeyMap(map) {
  42.         var newMap = {}, arr, v;
  43.         _each(map, function(key, val) {
  44.                 arr = key.split(',');
  45.                 for (var i = 0, len = arr.length; i < len; i++) {
  46.                         v = arr[i];
  47.                         newMap[v] = v//判断一个node是否有指定属性或CSS
  48. 一个node是否有指定属性或CSS
  49. function _hasAttrOrCss(knode, map) {
  50.         return _hasAttrOrCssByKey(knode, map, '*') || _hasAttrOrCssByKey(knode, map);
  51. }
  52. function _hasAttrOrCssByKey(knode, map, mapKey) {
  53.         mapKey = mapKey || knode.name;
  54.         if (knode.type !== 1) {
  55.                 return false;
  56.         }
  57.         var newMap = _singleKeyMap(map);
  58.         if (!newMap[mapKey]) {
  59.                 return false;
  60.         }
  61.         var arr = newMap[mapKey].split(',');
  62.         for (var i = 0, len = arr.length; i < len; i++) {
  63.                 var key = arr[i];
  64.                 if (key === '*') {
  65.                         return true;
  66.                 }
  67.                 var match = : 'attr';
  68.                 key = match[2];
  69.         .exec(key);
  70.                 var method = match[1] ? 'css' && knode[method](key) !== '
  71.                 var val = match[3] || '';
  72.                 if (val === '' && knode[method](key) !== '') {
  73.                         return true;
  74.                 }
  75.                 if (val !== '' //åˆ é™¤ä¸€ä¸ªnode的属性和CSS
  76.                 return true;
  77.                 }
  78.         }
  79.         return false;
  80. }
  81. //åˆ é™¤ä¸€ä¸ªnode的属性和CSS
  82. function _removeAttrOrCss(knode, map) {
  83.         if (knode.type != 1) {
  84.                 return;
  85.         }
  86.         _removeAttrOrCssByKey(knode, map, '*');
  87.         _removeAttrOrCssByKey(knode, map);
  88. }
  89. function _removeAttrOrCssByKey(knode, map, mapKey) {
  90.         mapKey = mapKey || knode.name;
  91.         if (knode.type !== 1) {
  92.                 return;
  93.         }
  94.         var newMap = _singleKeyMap(map);
  95.         if (!newMap[mapKey]) {
  96.                 return;
  97.         }
  98.         var arr = newMap[mapKey].split(','), allFlag = false;
  99.         for (var i = 0, len = arr.length; i < len; i++) {
  100.                 var key = arr[i];
  101.                 if (key === '*') {
  102.                         allFlag = true;
  103.                         break;
  104.                 }
  105.                 var match =                     if (knode[0].style[key]) {.exec(key);
  106.                 key = match[2];
  107.                 if (match[1]) {
  108.                         key = _toCamel(key);
  109.                         if (knode[0].style[key]) {
  110.                                 knode[0].style[ke//取得最里面的element
  111. knode.removeAttr(key);
  112.                 }
  113.         }
  114.         if (allFlag) {
  115.                 knode.remove(true);
  116.         }
  117. }
  118. //取得最里面的elemen//最里面的element为inline element时返回true
  119. ;
  120.         while (inner.first()) {
  121.                 inner = inner.first();
  122.         }
  123.         return inner;
  124. }
  125. //最里面的element为inline element时返回//merge two wrapper
  126. //a : <span><strong></strong></span>
  127. //b : <strong><em></em></strong>
  128. //result : <span><strong><em></em></strong></span>
  129. ') === '';
  130. }
  131. //merge two wrapper
  132. //a : <span><strong></strong></span>
  133. //b : <strong><em></em></strong>
  134. //result : <span><strong><em></em></strong></span>
  135. function _mergeWrapper(a, b) {
  136.         a = a.clone(true);
  137.         var lastA = _getInnerNode(a), childA = a, merged = false;
  138.         while (b) {
  139.                 while (childA) {
  140.                         if (childA.name === b.name) {
  141.                                 _mergeAttrs(childA, b.attr(), b.css());
  142.                                 mer//wrap and merge a node
  143. dA = childA.first();
  144.                 }
  145.                 if (!merged) {
  146.                         lastA.append(b.clone(fals//node为text nodeæ—¶
  147. lse;
  148.                 b = b.first();
  149.         }
  150.         return a;
  151. }
  152. //wrap and merge a node
  153. function _wrapNode(knode, wrapper) {
  154.         wrapper = wrapper.clone(true)//node为elementæ—¶
  155. n//取得node的wrapper
  156. ype == 3) {
  157.                 _getInnerNode(wrapper).append(knode.clone(false));
  158.                 knode.replaceWith(wrapper);
  159.                 return wrapper;
  160.         }
  161.         //no//å°†node的子节点纳入在一个documentFragment里
  162. er
  163.         var nodeWrapper = knode, child;
  164.         while ((child = knode.first()) && child.children().length == 1) {
  165.                 knode = child;
  166.         }
  167.         //å°†node的子节点纳入在一个documentFragment里
  168.         child = knode.first();
  169.         var frag = knode.doc.createDocumentFragment();
  170.         while (child) {
  171.                 fra//merge attributes and styles
  172. ld = child.next();
  173.         }
  174.         wrapper = _mergeWrapper(nodeWrapper, wrapper);
  175.         if (frag.firstChild) {
  176.                 _getInnerNode(wrapper).append(frag);
  177.         }
  178.         nodeWrapper.replaceWith(wrapper);
  179.         return wrapper;
  180. }
  181. //merge attribu// 判断node是否在pre、style、script里
  182. rs, styles) {
  183.         _each(attrs, function(key, val) {
  184.                 if (key !== 'body'') {
  185.                         knode.attr(key, val);
  186.                 }
  187.         });
  188.         _each(styles, function(key, val) {
  189.                 knode.css(key, val);
  190.         });
  191. }
  192. // 判断node是否在pre、style// create KCmd class
  193. function _inPreElement(knode) {
  194.         while (knode && knode.name != 'body') {
  195.                 if (_PRE_TAG_MAP[knode.name] || knode.name == 'div' && knode.hasClass('ke-script')) {
  196.                         return true;
  197.                 }
  198.                 knode = knode.parent();
  199.         }
  200.         return false;
  201. }
  202. // create KCmd class
  203. function KCmd(range) {
  204.         this.init(range);
  205. }
  206. _extend(KCmd, {
  207.         init : function(range) {
  208.                 var self = this, doc = range.doc;
  209.                 self.doc = doc;
  210.                 self.win = _getWin(doc);
  211.                 self.sel = _getSel(doc);
  212.                 self.range = range;
  213.         },
  214.         selection : function(forceReset) {
  215.                 var self = this, doc = self.doc, rng = _getRng(doc);
  216.                 self.sel = _getSel(doc);
  217.                 if (rng) {
  218.                         self.range = _range(rng);
  219.                         if (K(self.range.startContainer).name == 'html') {
  220.                                 self.range.selectNodeContents(doc.body).collapse(false);
  221.                         }
  222.                         return self;
  223.                 }
  224.                 if (forceReset) {
  225.                         self.range.selectNodeContents(doc.body).collapse(false);
  226.                 }
  227.                 return self;
  228.         },
  229.         select : function(hasDummy) {
  230.                 hasDummy = _undef(hasDummy, tru// tagå†…éƒ¨æ— å†…å®¹æ—¶é€‰ä¸­tag内部,<tagName>[]</tagName>
  231. ange().shrink(),
  232.                         sc = range.startContainer, so = range.startOffset,
  233.                         ec = range.endContainer, eo = range.endOffset,
  234.                         doc = _getDoc(sc), win = self.win, rng, hasU200b = false;
  235.                 // tagå†…éƒ¨æ— å†…å®¹æ—¶é€‰ä¸­tag内部,<tagName>[]</tagName>
  236.                 if (hasDummy && sc.nodeType == 1 && range.collapsed) {
  237.                         if (_IERANGE) {
  238.                                 var dummy = K('<span>&nbsp;</span>', doc);
  239.                                 range.insertNode(dummy[0]);
  240.                                 rng = doc.body.createTextRange();
  241.                                 try {
  242.                                         rng.moveToElementText(dummy[0]);
  243.                                 } catch(ex) {}
  244.                                 rng.collapse(false);
  245.                                 rng.select();
  246.                                 dummy.remove();
  247.                                 win.foc//other case
  248. urn self;
  249.                         }
  250.                         if (_WEBKIT) {
  251.                                 var children = sc.childNodes;
  252.                                 if (K(sc).isInline() || so > 0 && K(children[so - 1]).isInline() || children[so] && K(children[so]).isInline()) {
  253.                                         range.insertNode(doc.createTextNode('\// Bugfix: https://github.com/kindsoft/kindeditor/issues/54
  254. e
  255.                 if (_IERANGE) {
  256.                         try {
  257.                                 rng = range.get(true);
  258.                                 rng.select();
  259.                         } catch(e) {}
  260.                 } else {
  261.                         if (hasU200b) {
  262.                                 range.collapse(false);
  263.                         }
  264.                         rng = range.get(true);
  265.                         sel.removeAllRanges();
  266.                         sel.addRange(rng);
  267.                         // Bugfix: https://github.co// collapsed=true
  268. tor/issues/54
  269.                         if (doc !== document) {
  270.                                 var pos = K(rng.endContainer).pos();
  271.                                 win.scrollTo(pos.x, pos.y);
  272.                         }
  273.                 }
  274.                 win.f// block wrapper
  275. self;
  276.         },
  277.         wrap : function(val) {
  278.                 var self = this, doc = self.doc, range = self.range, wrap// find inner element
  279. , doc);
  280.                 // collapsed=true
  281.                 if (range.collapsed) {
  282.                         range.shrink();
  283.                         range.insertNode(wrapper[0]).selectNodeContents(wrapper[0]);
  284.                         return self;
  285.                 }
  286.                 // block wrapper
  287.                 if (wrappe// collapsed=false
  288. ar copyWrapper = wrapper.clone(true), child = copyWrapper;
  289.                         // find inner element
  290.                         while (child.first()) {
  291.                                 child = child.first();
  292.                         }
  293.                         child.append(range.extractContents());
  294.                         range.insertNode(copyWrapper[0]).selectNode(copyWrapper[0]);
  295.                         return self;
  296.                 }
  297.                 // collapsed=false
  298.                 range.enlarge();
  299.                 var bookmark = range.createBookmark(), ancestor = range.commonAncestor(), isStart = false;
  300.                 K(ancestor).scan(function(node) {
  301.                         if (!isS// textNode为唯一的子节点时,重新设置node
  302.                         return;
  303.                         }
  304.                         if (isStart) {
  305.                                 if (node == bookmark.end) {
  306.                                         return false;
  307.                                 }
  308.                                 var knode = K(node);
  309.                                 if (_inPreElement(knode)) {
  310.                                         return;
  311.                                 }
  312.                                 if (knode.type == 3 && _trim(node.nodeValue).length > 0) {
  313.                                         // textNode为唯一的子节点时,重新//get parent node
  314.                         var parent;
  315.                                         while ((parent = knode.parent()) && parent.isStyle() && parent.children().length == 1) {
  316.                                                 knode = parent;
  317.                                         }
  318.                                         _wrapNode(knode, wrapper);
  319.                                 }
  320.                         }
  321.                 });
  322.                 range.moveToBookmark(bookmark);
  323.                 return self;
  324.         },
  325.         split : function(isStart, map) {
  326.                 var range = this.range, doc = range.doc;
  327.                 //get parent node
  328.                 var tempRange = range.cloneRange().collapse(isStart);
  329.                 var node = tempRange.startContainer, pos = tempRange.startOffset,
  330.                         parent = node.nodeType == 3 ? node.parentNode : node,
  331.                         //split parent node
  332. node;
  333.                 while (parent && parent.parentNode) {
  334.                         knode = K(parent);
  335.                         if (map) {
  336.                                 if (!knode.isStyle()) {
  337.                                         break;
  338.                                 }
  339.                                 if (!_hasAttrOrCss(knode, map)) {
  340.                                         break;
  341.                                 }
  342.                         } else {
  343.                                 if (_NOSPLIT_TAG_MAP[knode.name]) {
  344.                                         break;
  345.                                 }
  346.                         }
  347.                         needSplit = true;
  348.                         parent = parent.parentNode;
  349.                 }
  350.                 //split parent node
  351.                 if (needSplit) {
  352.                         var dummy = doc.createElement('span');
  353.                         range.cloneRange().collapse(!isStart).insertNode(dummy);
  354.                         if (isStart) {
  355.                                 tempRange.setStartBefore(parent.firstChild).setEnd(node, pos);
  356.                         } else {
  357.                                 tempRange.setStart(node, pos//调整endOffset
  358. nt.lastChild);
  359.                         }
  360.                         var frag = tempRange.extractContents(),
  361.                                 first = frag.firstChild, last = frag.lastChild;
  362.                         if (isStart) {
  363.                                 tempRange.insertNode(frag);
  364.                                 range.setStartAfter(last).setEndBef//dummyå…ƒç´ çš„å·¦å³éƒ½æ˜¯textNode,<strong>f<span></span>g</strong>
  365. Before(dummy).setEndBefore(first);
  366.                         }
  367.                         //调整endOffset
  368.                         var dummyParent = dummy.parentNode;
  369.                         if (dummyParent == range.endContainer) {
  370.                                 var prev = K(dummy).prev(), next = K(dummy).next();
  371.                                 if (prev && next && prev.type == 3 && next.type == 3) {
  372.                                         //dummyå…ƒç´ çš„å·¦å³é// <p><strong><em>[123456789]</em></strong></p>, remove strong
  373. ange.setEnd(prev[0], prev[0].nodeValue.length);
  374.                                 } else if (!isStart) {
  375.                                         range.setEnd(range.endContainer, range.endOffset - 1);
  376.                                 }
  377.                         }
  378.                         dummyParent.removeChild(dummy);
  379.                 }
  380.                 return this;
  381.         },
  382.         remove : function(ma// <p style="color:red;">[abcd</p>, remove style
  383. elf.range;
  384.                 range.enlarge();
  385.                 // <p><strong><em>[123456789]</em></strong></p>, remove strong
  386.                 if (range.startOffset === 0) {
  387.                         var ksc = K(range.startContainer), parent;
  388.                         while ((parent = ksc.parent()) && par// collapsed == true
  389. nt.children().length == 1) {
  390.                                 ksc = parent;
  391.                         }
  392.                 // remove empty element
  393. 0);
  394.                         // <p style="color:red;">[abcd</p>, remove style
  395.                         ksc = K(range.startContainer);
  396.                         if (ksc.isBlock()) {
  397.                                 _removeAttrOrCss(ksc, map);
  398.                         }
  399.                         var kscp = ksc.parent();
  400.                         if (kscp && kscp.isBlock()) {
  401.                                 _removeAttrOrCss(kscp, map);
  402.                         }
  403.                 }
  404.                 var sc, so;
  405.                 // collapsed == true
  406.                 if (rang// <strong>|</strong>
  407. .split(true, map);
  408.                         // remove empty element
  409.                         sc = range.startContainer;
  410.                         so = range.startOffset;
  411.                         if (so > 0) {
  412.                         // split range
  413. childNodes[so - 1]);
  414.                                 if (sb && _isEmptyNode(sb)) // insert dummy element
  415.         range.setStart(sc, so - 1);
  416.                                 }
  417.                         }
  418.                         var sa = K(sc.childNodes[so]);
  419.                         if (sa && _isEmptyNode(sa)) {
  420.                                 sa.remove();
  421.                         }
  422.                         // <strong>|</strong>
  423.                         if (_isEmptyNode(sc)) {
  424.                                 range.startBefore(sc// select element
  425. ;
  426.                         }
  427.                         range.collapse(true);
  428.                         return self;
  429.                 }
  430.                 // split range
  431.                 self.split(true, map);
  432.                 self.split(false, map);
  433.                 // insert dummy element
  434.                 var startDummy = doc.createElement('span'), endDummy = doc.createElement('span');
  435.                 range.cloneRange().collapse(false).insertNod// remove dummy element
  436. neRange().collapse(true).insertNode(startDummy);
  437.                 /// remove empty element
  438. odeList = [], cmpStart = false;
  439.                 K(range.commonAncestor()).scan(function(node) {
  440.                         if (!cmpStart && node == startDummy) {
  441.                                 cmpStart = true;
  442.                                 return;
  443.                         }
  444.                         if (node == endDummy) {
  445.                                 return false;
  446.                         }
  447.                         if (cmpStart) {
  448.                                 nodeList.push(node);
  449.                         }
  450.                 });
  451.                 // remove dummy element
  452.                 K(startDummy).remove();
  453.                 K(endDummy).remove();
  454.                 // <b>abc[</b><b>def]</b><b>ghi</b>,分割后HTML变成
  455. = r// <b>abc</b>[<b></b><b>def</b>]<b>ghi</b>
  456. iner, eo = range.endOffset;
  457.                 if (so > 0) {
  458.                         var startBefore = K(sc.childNodes[so - 1]);
  459.                         if (startBefore && _isEmptyNode(startBefore)) {
  460.                                 startBefore.remove();
  461.                                 range.setStart(sc, so - 1);
  462.                                 if (sc == ec) {
  463.                                         range.setEnd(ec, eo - 1);
  464.                                 }
  465.                         }
  466.                         // <b>abc[</b><b>def]</b><b>ghi</b>,分割后HTML变成
  467.                         // <b// remove attributes or styles
  468. hi</b>
  469.                         var startAfter = K(sc.childNodes[so]);
  470.                         if (startAfter && _isEmptyNode(startAfter)) {
  471.                                 startAfter.remove();
  472.                                 if (sc == ec) {
  473.                                         range.setEnd(ec, eo - 1);
  474.                                 }
  475.                         }
  476.                 }
  477.                 var endAfter = K(ec.childNodes[range.endOffset]);
  478.                 if (endAfter && _isEmptyNode(endAfter)) {
  479.                         endAfter.remove();
  480.                 }
  481.                 var bookmark = range.createBookmark(true);
  482.                 // remove attributes or styles
  483.                 _each(nodeList, function(i, node) {
  484.                         _removeAttrOrCss(K(node), map);
  485.                 });
  486.                 range.moveToBookmark(bookmark);
  487.                 return self;
  488.         },
  489.         commonNode : function(map) {
  490.                 var range = this.range;
  491.                 var ec = range.endContainer, eo = range.endOffset,
  492.                         node = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
  493.                 f//<strong>123</strong>|4567
  494. ch//<strong>123</strong>|<br />
  495. while (parent) {
  496.                                 if (_hasAttrOrCss(K(parent), map)) {
  497.                                         return K(parent);
  498.                                 }
  499.                                 parent = parent.parentNode;
  500.                         }
  501.                         while (child && (child = child.lastChild)) {
  502.                                 if (_hasAttrOrCss(K(child), map)) {
  503.                                         return K(child);
  504.                                 }
  505.                         }
  506.                         return null;
  507.                 }
  508.                 var cNode = find(node);
  509.                 if (cNode) {
  510.                         return cNode;
  511.                 }
  512.                 //<strong>123</strong>|4567
  513.                 //<strong>123</strong>|<br />
  514.                 if (node.nodeType == 1 || (ec.nodeType == 3 && eo === 0)) {
  515.                         var prev = K(node).prev();
  516.                         if (prev) {
  517.                                 return find(prev);
  518.                         }
  519.                 }
  520.                 return null;
  521.         },
  522.         commonAncestor : function(tagName) {
  523.                 var range = this.range,
  524.                         sc = range.startContainer, so = range.startOffset,
  525.                         ec = range.endContainer, eo = range.endOffset,
  526.                         startNode = (sc.nodeType == 3 || so === 0) ? sc : sc.childNodes[so - 1],
  527.                         endNode = (ec.nodeType ==// Reference: document.queryCommandState
  528.  // TODO
  529. nction find(node) {
  530.                         while (node) {
  531.                                 if (node.nodeType == 1) {
  532.                                         if (node.tagName.toLowerCase() === tagName) {
  533.                                                 return node;
  534.                                         }
  535.                                 }
  536.                                 no// Reference: document.queryCommandValue
  537. ;
  538.                 }
  539.                 var start = find(startNode), end = find(endNode);
  540.                 if (start && end && start === end) {
  541.                         return K(start);
  542.                 }
  543.                 return null;
  544.         },
  545.         // Reference: document.queryCommandState
  546.         // TODO
  547.         state : function(key) {
  548.                 var self = this, doc = self.doc, bool = false;
  549.                 try {
  550.                         bool = doc.queryCommandState(key);
  551.                 } catch (e) {}
  552.                 return bool;
  553.         },
  554.         // Reference: document.queryCommandValue
  555.         val : function(key) {
  556.                 var self = this, doc = self.doc, range = self.range;
  557.                 function lc(val) {
  558.                         return val.toLowerCase();
  559.                 }
  560.                 key = lc(key);
  561.                 var val = '', knode;
  562.                 if (key === 'fontfamily' || key === 'fontname') {
  563.                         val = _nativeCommandValue(doc, 'fontname');
  564.                         val = val.replace(.font-s, ''});
  565.                         if (knode) {
  566.                                 val = knode.css('formatblock') {
  567.                         val = _nativeCommandValue(doc, key);
  568.                         if (val === '') {
  569.                                 knode = self.commonNode({'h1,h2,h3,h4,h5,h6,p,div,pre,address' : '*'});
  570.                                 if (knode) {
  571.                                         val = knode.name;
  572.                                 }
  573.                         }
  574.                         if (val === 'Normal') {
  575.                                 val = 'p';
  576.                         }
  577.                         return lc(val);
  578.                 }
  579.                 if (key === 'fontsize') {
  580.                         knode = self.commonNode({'*' : '.font-size'});
  581.                         if (knode) {
  582.                                 val = knode.css('font-size');
  583.                         }
  584.                         return lc(val);
  585.                 }
  586.                 if (key === 'forecolor') {
  587.                         knode = self.commonNode({'*' : '.color'});
  588.                         if (knode) {
  589.                                 val = knode.css('color');
  590.                         }
  591.                         val = _toHex(val);
  592.                         if (val === '') {
  593.                                 val = 'default';
  594.                         }
  595.                         return lc(val);
  596.                 }
  597.                 if (key === 'hilitecolor') {
  598.                         knode = self.commonNode({'*' : '.background-color'});
  599.                         if (knode) {
  600.                                 val = knode.css('background-color');
  601.                         }
  602.                         val = _toHex(val);
  603.                         if (val === '') {
  604.                                 val = 'default';
  605.                         }
  606.                         return lc(val);
  607.                 }
  608.                 return val;
  609.         },
  610.         toggle : function(wrapper, map) {
  611.                 var self = this;
  612.                 if (self.commonNode(map)) {
  613.                         self.remove(map);
  614.                 } else {
  615.                         self.wrap(wrapper);
  616.                 }
  617.                 return self.select();
  618.         },
  619.         bold : function() {
  620.                 return this.toggle('<s></s>'</strong>', {
  621.                         span : '.font-weight=bold',
  622.                         strong : '*',
  623.                         b : '*'
  624.                 });
  625.         },
  626.         italic : function() {
  627.                 return this.toggle('<em></em>', {
  628.                         span : '.font-style=italic'// return this.toggle('<span style="color:' + val + ';"></span>', {
  629. rn//    span : '.color=' + val,
  630.         s//     font : 'color'
  631. ti// });
  632. rline',
  633.                         u : '*'
  634.                 });
  635.         },
  636.         strikethrough : function() {
  637.                 return this.toggle('<s></s>', {
  638.                         span : '.text-decoration=// return this.toggle('<span style="background-color:' + val + ';"></span>', {
  639. wr//    span : '.background-color=' + val
  640. /s// });
  641. select();
  642.                 // return this.toggle('<span style="color:' + val + ';"></span>' + val + 'span : '.color=' + val,
  643.         // return this.toggle('<span style="font-size:' + val + ';"></span>', {
  644.  t//    span : '.font-size=' + val,
  645. d-//    font : 'size'
  646. ">// });
  647. ').select();
  648.                 // return this.toggle('<span style="background-color:' + val + ';"></span>', {
  649.                 //      span : '.background-color=' + val
  650.                 // });
  651.         },
  652.         fontsize : function(val) {
  653.                 r// return this.toggle('<span style="font-family:' + val + ';"></span>', {
  654.                 //      span : '.font-family=' + val,
  655. ="//    font : 'face'
  656. + // });
  657. pan>', {
  658.                 //      span : '.font-size=' + val,
  659.                 //      font : '.font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent'(val) {
  660.                 return this.wrap('<span style="font-family:' + val + ';"></span>').select();
  661.                 // return this.toggle('<span style="font-family:' + val + ';"></span>', {
  662.                 //      span : '.font-family=' + val,
  663.                 //      font : 'face'
  664.                 // });
  665.         },
  666.         removeformat : function() {
  667. //if (_inPreElement(K(range.startContainer))) {
  668. ,.//    return self;
  669. .c//}
  670. ,.// IE专用,优化性能
  671. ,.font-family,.text-indent'
  672.                 },
  673.                 tags = _STYLE_TAG_MAP;
  674.                 _each(tags, function(key, val) {
  675.                         map[key] = '*';
  676.                 });
  677.                 this.remove(map);
  678.                 return this.select();
  679.         },
  680.         inserthtml : function(val, quickMode) {
  681.                 var self = this, range = self.range;
  682.                 if (val === '') {
  683.                         return self;
  684.                 }
  685.                 //if (_inPreElement(K(range.startContainer))) {
  686.                 //      return self;
  687.                 //}
  688.                 // IE专用,优化性能
  689.                 function pasteHtml(range, val) {
  690.                         val = '<img id="__kindeditor_temp_tag__" width="0" he// 全浏览器兼容,在IE上速度慢
  691.                         var rng = range.get();
  692.                         if (rng.item) {
  693.                                 rng.item(0).outerHTML = val;
  694.                         } else {
  695.                                 rng.pasteHTML(val);
  696.                         }
  697.                         var temp = range.doc.getElementById('__kindeditor_temp_tag__');
  698.                         temp.parentNode.removeChild(temp);
  699.                         var newRange = _toRange(rng);
  700.                         range.setEnd(newRange.endContainer, newRange.endOffset);
  701.                         range.collapse(false);
  702.                         self.select(false);
  703.                 }
  704.                 // 全浏览器兼容,在IE上速度慢
  705.                 function insertHtml(range, val) {
  706.                         var doc = range.doc,
  707.                                 frag = doc.createDocumentFragment();
  708.                         K('@' + val, doc).each(function() {
  709.                                 frag.appendChild(this);
  710.                         });
  711.                         range.deleteContents();
  712.                         range.insertNode(frag);
  713.                         range.collapse(false);
  714.                         self.select(false);
  715.                 }
  716.                 if (_IERANGE && quickMode) {
  717.                         try {
  718.                                 pasteHtml(range, val);
  719.                         } catch(e) {
  720.                                 insertHtml(range, val);
  721.                         }
  722.                         return self;
  723.                 }
  724.                 insertHtml(range, val);
  725.                 return self;
  726.         },
  727.         hr : function() {
  728.                 return this.inserthtml('<hr />');
  729.         },
  730.         print : function() {
  731.                 this.win.print();
  732.                 return this;
  733.         },
  734.         insertimage : function(url, title, width, height, border, align) {
  735.                 title = _undef(title, '');
  736.                 border = _undef(border, 0);
  737.                 var html = '<img src="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
  738.                 if (width) {
  739.                         html += 'width="' + _escape(width) + '" ';
  740.                 }
  741.                 if (height) {
  742.                         html += 'height="' + _escape(height) + '" ';
  743.                 }
  744.                 if (title) {
  745.                         html += ' + _escape(url) + 'title) + '" ';
  746.                 }
  747.                 if (align) {
  748.                         html += 'align="' + _escape(align) + '" ';
  749.                 }
  750.                 html += 'alt="' + _escape(title) + '" ';
  751.                 html += '/>'>'          return this.inserthtml(html);
  752.         },
  753.         createlink : function(url, type) {
  754.                 var self = this, doc = self.doc, range = self.range;
  755.                 self.select();
  756.                 var a = self.commonNode({ a : ';
  757.                         node.after(K(html, doc));
  758.                         node.next().append(node);
  759.                         range.selectNode(node[0]);
  760.                         return self.select();
  761.                 }
  762.                 function setAttr(node, url, type) {
  763.                         K(node).attr('
  764.                 if (type) {
  765.                         html += ' target="' + _escape(type) + '"';
  766.                 }
  767.                 if (range.collapsed) {
  768.                         html += '>' + _escape(url) + 'target'                   return self// Bugfix: https://github.com/kindsoft/kindeditor/issues/117
  769.  =// [IE] 当两个Aæ ‡ç­¾å¹¶æŽ’åœ¨ä¸€èµ·ä¸­é—´æ²¡æœ‰åˆ«çš„å†…å®¹ï¼Œä¿®æ”¹åŽé¢çš„é“¾æŽ¥åœ°å€æ—¶ï¼Œå‰é¢çš„é“¾æŽ¥åœ°å€ä¹Ÿè¢«æ”¹æŽ‰ã€‚
  770.         range.selectNode(node[0]);
  771.                         return self.select();
  772.                 }
  773.                 function setAttr(node, url, type) {
  774.                         K(node).attr('href', url).attr('data-ke-src', url);
  775.                         if (type) {
  776.                                 K(node).attr('target', type);
  777.                         } else {
  778.                                 K(node).removeAttr('target');
  779.                         }
  780.                 }
  781.                 // Bugfix: https://github.com/kindsoft/kindeditor/issues/117
  782.                 // [IE] 当两个Aæ ‡ç­¾å¹¶æŽ’åœ¨ä¸€èµ·ä¸­é—´æ²¡æœ‰åˆ«çš„å†…å®¹ï¼Œä¿®æ”¹åŽé¢çš„é“¾æŽ¥åœ°å€æ—¶ï¼Œå‰é¢çš„é“¾æŽ¥åœ°å€ä¹Ÿè¢«æ”¹æŽ‰ã€‚
  783.                 var sc = range.startContainer, so = range.startOffset,
  784.                         ec = range.endContainer, eo = range.endOffset;
  785.                 if (sc.nodeType == 1 && sc === ec && so + 1 === eo) {
  786.                         var child = sc.childNodes[so];
  787.                         if (child.nodeName.toLowerCase() == 'a') {
  788.                                 setAttr(child, url, type);
  789.                                 return self;
  790.                         }
  791.                 }
  792.                 _nativeCommand(doc, 'createlink', '__kindeditor_temp_url__');
  793.                 K(', null);
  794.                 }
  795.                 return self;
  796.         }
  797. });
  798.  
  799. _each(('h(function() {
  800.                         setAttr(this, url, type);
  801.                 });
  802.                 return self;
  803.         },
  804.         unlink : function() {
  805.                 var self = this, doc = self.doc, range = self.range;
  806.                 self.select();
  807.                 if (range.collapsed) {
  808.                         var a = self.commonNode({ a : '*' });
  809.                         if (a) {
  810.                                 range.selectNode(a.get());
  811.                                 self.select();
  812.                         }
  813.                         _nati// Bugfix: [IE] å…ˆé€‰ä¸­å›¾ç‰‡åŽå±…ä¸­ï¼Œå†å·¦å¯¹é½ï¼Œå…‰æ ‡è·³åˆ°é¡¶éƒ¨
  814. e === 'img') {
  815.                                 var parent = K(range.startContainer).parent();
  816.                                 if (parent.name === 'a','{
  817.                                         parent.remove(true);
  818.                                 }
  819.                         }// 在webkitå’Œfirefox上需要重新选取range,否则有时候会报错
  820. ;
  821.  
  822. _each(('formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,','
  823.         'insertunorderedlist,indent,outdent,subscript,superscript').split(','), function(i, name) {
  824.         KCmd.prototype[name] = function(val) {
  825.                 var self = this;
  826.                 self.select();
  827.                 _nativeCommand(self.doc, name, val);
  828.                 // Bugfix: [IE] å…ˆé€‰ä¸­å›¾ç‰‡åŽå±…ä¸­ï¼Œå†å·¦å¯¹é½ï¼Œå…‰æ ‡è·³åˆ°é¡¶é// mixed is a node
  829.  && _inArray(name, 'justifyleft,justifycenter,justifyright,justifyfull'.split(',')) >= 0) {
  830.                         self.selection();
  831.                 }
  832.                 // // mixed is a KRange
  833. efox上需要重新选取rangeï

Raw Paste


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