justify.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /**
  2. * 段落格式
  3. * @file
  4. * @since 1.2.6.1
  5. */
  6. /**
  7. * 段落对齐方式
  8. * @command justify
  9. * @method execCommand
  10. * @param { String } cmd 命令字符串
  11. * @param { String } align 对齐方式:left => 居左,right => 居右,center => 居中,justify => 两端对齐
  12. * @example
  13. * ```javascript
  14. * editor.execCommand( 'justify', 'center' );
  15. * ```
  16. */
  17. /**
  18. * 如果选区所在位置是段落区域,返回当前段落对齐方式
  19. * @command justify
  20. * @method queryCommandValue
  21. * @param { String } cmd 命令字符串
  22. * @return { String } 返回段落对齐方式
  23. * @example
  24. * ```javascript
  25. * editor.queryCommandValue( 'justify' );
  26. * ```
  27. */
  28. UE.plugins["justify"] = function() {
  29. var me = this,
  30. block = domUtils.isBlockElm,
  31. defaultValue = {
  32. left: 1,
  33. right: 1,
  34. center: 1,
  35. justify: 1
  36. },
  37. doJustify = function(range, style) {
  38. var bookmark = range.createBookmark(),
  39. filterFn = function(node) {
  40. return node.nodeType == 1
  41. ? node.tagName.toLowerCase() != "br" &&
  42. !domUtils.isBookmarkNode(node)
  43. : !domUtils.isWhitespace(node);
  44. };
  45. range.enlarge(true);
  46. var bookmark2 = range.createBookmark(),
  47. current = domUtils.getNextDomNode(bookmark2.start, false, filterFn),
  48. tmpRange = range.cloneRange(),
  49. tmpNode;
  50. while (
  51. current &&
  52. !(
  53. domUtils.getPosition(current, bookmark2.end) &
  54. domUtils.POSITION_FOLLOWING
  55. )
  56. ) {
  57. if (current.nodeType == 3 || !block(current)) {
  58. tmpRange.setStartBefore(current);
  59. while (current && current !== bookmark2.end && !block(current)) {
  60. tmpNode = current;
  61. current = domUtils.getNextDomNode(current, false, null, function(
  62. node
  63. ) {
  64. return !block(node);
  65. });
  66. }
  67. tmpRange.setEndAfter(tmpNode);
  68. var common = tmpRange.getCommonAncestor();
  69. if (!domUtils.isBody(common) && block(common)) {
  70. domUtils.setStyles(
  71. common,
  72. utils.isString(style) ? { "text-align": style } : style
  73. );
  74. current = common;
  75. } else {
  76. var p = range.document.createElement("p");
  77. domUtils.setStyles(
  78. p,
  79. utils.isString(style) ? { "text-align": style } : style
  80. );
  81. var frag = tmpRange.extractContents();
  82. p.appendChild(frag);
  83. tmpRange.insertNode(p);
  84. current = p;
  85. }
  86. current = domUtils.getNextDomNode(current, false, filterFn);
  87. } else {
  88. current = domUtils.getNextDomNode(current, true, filterFn);
  89. }
  90. }
  91. return range.moveToBookmark(bookmark2).moveToBookmark(bookmark);
  92. };
  93. UE.commands["justify"] = {
  94. execCommand: function(cmdName, align) {
  95. var range = this.selection.getRange(),
  96. txt;
  97. //闭合时单独处理
  98. if (range.collapsed) {
  99. txt = this.document.createTextNode("p");
  100. range.insertNode(txt);
  101. }
  102. doJustify(range, align);
  103. if (txt) {
  104. range.setStartBefore(txt).collapse(true);
  105. domUtils.remove(txt);
  106. }
  107. range.select();
  108. return true;
  109. },
  110. queryCommandValue: function() {
  111. var startNode = this.selection.getStart(),
  112. value = domUtils.getComputedStyle(startNode, "text-align");
  113. return defaultValue[value] ? value : "left";
  114. },
  115. queryCommandState: function() {
  116. var start = this.selection.getStart(),
  117. cell =
  118. start &&
  119. domUtils.findParentByTagName(start, ["td", "th", "caption"], true);
  120. return cell ? -1 : 0;
  121. }
  122. };
  123. };