blockquote.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /**
  2. * 添加引用
  3. * @file
  4. * @since 1.2.6.1
  5. */
  6. /**
  7. * 添加引用
  8. * @command blockquote
  9. * @method execCommand
  10. * @param { String } cmd 命令字符串
  11. * @example
  12. * ```javascript
  13. * editor.execCommand( 'blockquote' );
  14. * ```
  15. */
  16. /**
  17. * 添加引用
  18. * @command blockquote
  19. * @method execCommand
  20. * @param { String } cmd 命令字符串
  21. * @param { Object } attrs 节点属性
  22. * @example
  23. * ```javascript
  24. * editor.execCommand( 'blockquote',{
  25. * style: "color: red;"
  26. * } );
  27. * ```
  28. */
  29. UE.plugins["blockquote"] = function() {
  30. var me = this;
  31. function getObj(editor) {
  32. return domUtils.filterNodeList(
  33. editor.selection.getStartElementPath(),
  34. "blockquote"
  35. );
  36. }
  37. me.commands["blockquote"] = {
  38. execCommand: function(cmdName, attrs) {
  39. var range = this.selection.getRange(),
  40. obj = getObj(this),
  41. blockquote = dtd.blockquote,
  42. bookmark = range.createBookmark();
  43. if (obj) {
  44. var start = range.startContainer,
  45. startBlock = domUtils.isBlockElm(start)
  46. ? start
  47. : domUtils.findParent(start, function(node) {
  48. return domUtils.isBlockElm(node);
  49. }),
  50. end = range.endContainer,
  51. endBlock = domUtils.isBlockElm(end)
  52. ? end
  53. : domUtils.findParent(end, function(node) {
  54. return domUtils.isBlockElm(node);
  55. });
  56. //处理一下li
  57. startBlock =
  58. domUtils.findParentByTagName(startBlock, "li", true) || startBlock;
  59. endBlock =
  60. domUtils.findParentByTagName(endBlock, "li", true) || endBlock;
  61. if (
  62. startBlock.tagName == "LI" ||
  63. startBlock.tagName == "TD" ||
  64. startBlock === obj ||
  65. domUtils.isBody(startBlock)
  66. ) {
  67. domUtils.remove(obj, true);
  68. } else {
  69. domUtils.breakParent(startBlock, obj);
  70. }
  71. if (startBlock !== endBlock) {
  72. obj = domUtils.findParentByTagName(endBlock, "blockquote");
  73. if (obj) {
  74. if (
  75. endBlock.tagName == "LI" ||
  76. endBlock.tagName == "TD" ||
  77. domUtils.isBody(endBlock)
  78. ) {
  79. obj.parentNode && domUtils.remove(obj, true);
  80. } else {
  81. domUtils.breakParent(endBlock, obj);
  82. }
  83. }
  84. }
  85. var blockquotes = domUtils.getElementsByTagName(
  86. this.document,
  87. "blockquote"
  88. );
  89. for (var i = 0, bi; (bi = blockquotes[i++]); ) {
  90. if (!bi.childNodes.length) {
  91. domUtils.remove(bi);
  92. } else if (
  93. domUtils.getPosition(bi, startBlock) &
  94. domUtils.POSITION_FOLLOWING &&
  95. domUtils.getPosition(bi, endBlock) & domUtils.POSITION_PRECEDING
  96. ) {
  97. domUtils.remove(bi, true);
  98. }
  99. }
  100. } else {
  101. var tmpRange = range.cloneRange(),
  102. node = tmpRange.startContainer.nodeType == 1
  103. ? tmpRange.startContainer
  104. : tmpRange.startContainer.parentNode,
  105. preNode = node,
  106. doEnd = 1;
  107. //调整开始
  108. while (1) {
  109. if (domUtils.isBody(node)) {
  110. if (preNode !== node) {
  111. if (range.collapsed) {
  112. tmpRange.selectNode(preNode);
  113. doEnd = 0;
  114. } else {
  115. tmpRange.setStartBefore(preNode);
  116. }
  117. } else {
  118. tmpRange.setStart(node, 0);
  119. }
  120. break;
  121. }
  122. if (!blockquote[node.tagName]) {
  123. if (range.collapsed) {
  124. tmpRange.selectNode(preNode);
  125. } else {
  126. tmpRange.setStartBefore(preNode);
  127. }
  128. break;
  129. }
  130. preNode = node;
  131. node = node.parentNode;
  132. }
  133. //调整结束
  134. if (doEnd) {
  135. preNode = node = node = tmpRange.endContainer.nodeType == 1
  136. ? tmpRange.endContainer
  137. : tmpRange.endContainer.parentNode;
  138. while (1) {
  139. if (domUtils.isBody(node)) {
  140. if (preNode !== node) {
  141. tmpRange.setEndAfter(preNode);
  142. } else {
  143. tmpRange.setEnd(node, node.childNodes.length);
  144. }
  145. break;
  146. }
  147. if (!blockquote[node.tagName]) {
  148. tmpRange.setEndAfter(preNode);
  149. break;
  150. }
  151. preNode = node;
  152. node = node.parentNode;
  153. }
  154. }
  155. node = range.document.createElement("blockquote");
  156. domUtils.setAttributes(node, attrs);
  157. node.appendChild(tmpRange.extractContents());
  158. tmpRange.insertNode(node);
  159. //去除重复的
  160. var childs = domUtils.getElementsByTagName(node, "blockquote");
  161. for (var i = 0, ci; (ci = childs[i++]); ) {
  162. if (ci.parentNode) {
  163. domUtils.remove(ci, true);
  164. }
  165. }
  166. }
  167. range.moveToBookmark(bookmark).select();
  168. },
  169. queryCommandState: function() {
  170. return getObj(this) ? 1 : 0;
  171. }
  172. };
  173. };