customstyle.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /**
  2. * 自定义样式
  3. * @file
  4. * @since 1.2.6.1
  5. */
  6. /**
  7. * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。
  8. * @command customstyle
  9. * @method execCommand
  10. * @param { String } cmd 命令字符串
  11. * @example
  12. * ```javascript
  13. * editor.execCommand( 'customstyle' );
  14. * ```
  15. */
  16. UE.plugins["customstyle"] = function() {
  17. var me = this;
  18. me.setOpt({
  19. customstyle: [
  20. {
  21. tag: "h1",
  22. name: "tc",
  23. style:
  24. "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;"
  25. },
  26. {
  27. tag: "h1",
  28. name: "tl",
  29. style:
  30. "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;"
  31. },
  32. {
  33. tag: "span",
  34. name: "im",
  35. style:
  36. "font-size:16px;font-style:italic;font-weight:bold;line-height:18px;"
  37. },
  38. {
  39. tag: "span",
  40. name: "hi",
  41. style:
  42. "font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;"
  43. }
  44. ]
  45. });
  46. me.commands["customstyle"] = {
  47. execCommand: function(cmdName, obj) {
  48. var me = this,
  49. tagName = obj.tag,
  50. node = domUtils.findParent(
  51. me.selection.getStart(),
  52. function(node) {
  53. return node.getAttribute("label");
  54. },
  55. true
  56. ),
  57. range,
  58. bk,
  59. tmpObj = {};
  60. for (var p in obj) {
  61. if (obj[p] !== undefined) tmpObj[p] = obj[p];
  62. }
  63. delete tmpObj.tag;
  64. if (node && node.getAttribute("label") == obj.label) {
  65. range = this.selection.getRange();
  66. bk = range.createBookmark();
  67. if (range.collapsed) {
  68. //trace:1732 删掉自定义标签,要有p来回填站位
  69. if (dtd.$block[node.tagName]) {
  70. var fillNode = me.document.createElement("p");
  71. domUtils.moveChild(node, fillNode);
  72. node.parentNode.insertBefore(fillNode, node);
  73. domUtils.remove(node);
  74. } else {
  75. domUtils.remove(node, true);
  76. }
  77. } else {
  78. var common = domUtils.getCommonAncestor(bk.start, bk.end),
  79. nodes = domUtils.getElementsByTagName(common, tagName);
  80. if (new RegExp(tagName, "i").test(common.tagName)) {
  81. nodes.push(common);
  82. }
  83. for (var i = 0, ni; (ni = nodes[i++]); ) {
  84. if (ni.getAttribute("label") == obj.label) {
  85. var ps = domUtils.getPosition(ni, bk.start),
  86. pe = domUtils.getPosition(ni, bk.end);
  87. if (
  88. (ps & domUtils.POSITION_FOLLOWING ||
  89. ps & domUtils.POSITION_CONTAINS) &&
  90. (pe & domUtils.POSITION_PRECEDING ||
  91. pe & domUtils.POSITION_CONTAINS)
  92. )
  93. if (dtd.$block[tagName]) {
  94. var fillNode = me.document.createElement("p");
  95. domUtils.moveChild(ni, fillNode);
  96. ni.parentNode.insertBefore(fillNode, ni);
  97. }
  98. domUtils.remove(ni, true);
  99. }
  100. }
  101. node = domUtils.findParent(
  102. common,
  103. function(node) {
  104. return node.getAttribute("label") == obj.label;
  105. },
  106. true
  107. );
  108. if (node) {
  109. domUtils.remove(node, true);
  110. }
  111. }
  112. range.moveToBookmark(bk).select();
  113. } else {
  114. if (dtd.$block[tagName]) {
  115. this.execCommand("paragraph", tagName, tmpObj, "customstyle");
  116. range = me.selection.getRange();
  117. if (!range.collapsed) {
  118. range.collapse();
  119. node = domUtils.findParent(
  120. me.selection.getStart(),
  121. function(node) {
  122. return node.getAttribute("label") == obj.label;
  123. },
  124. true
  125. );
  126. var pNode = me.document.createElement("p");
  127. domUtils.insertAfter(node, pNode);
  128. domUtils.fillNode(me.document, pNode);
  129. range.setStart(pNode, 0).setCursor();
  130. }
  131. } else {
  132. range = me.selection.getRange();
  133. if (range.collapsed) {
  134. node = me.document.createElement(tagName);
  135. domUtils.setAttributes(node, tmpObj);
  136. range.insertNode(node).setStart(node, 0).setCursor();
  137. return;
  138. }
  139. bk = range.createBookmark();
  140. range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select();
  141. }
  142. }
  143. },
  144. queryCommandValue: function() {
  145. var parent = domUtils.filterNodeList(
  146. this.selection.getStartElementPath(),
  147. function(node) {
  148. return node.getAttribute("label");
  149. }
  150. );
  151. return parent ? parent.getAttribute("label") : "";
  152. }
  153. };
  154. //当去掉customstyle是,如果是块元素,用p代替
  155. me.addListener("keyup", function(type, evt) {
  156. var keyCode = evt.keyCode || evt.which;
  157. if (keyCode == 32 || keyCode == 13) {
  158. var range = me.selection.getRange();
  159. if (range.collapsed) {
  160. var node = domUtils.findParent(
  161. me.selection.getStart(),
  162. function(node) {
  163. return node.getAttribute("label");
  164. },
  165. true
  166. );
  167. if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) {
  168. var p = me.document.createElement("p");
  169. domUtils.insertAfter(node, p);
  170. domUtils.fillNode(me.document, p);
  171. domUtils.remove(node);
  172. range.setStart(p, 0).setCursor();
  173. }
  174. }
  175. }
  176. });
  177. };