justify.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node);
  41. };
  42. range.enlarge(true);
  43. var bookmark2 = range.createBookmark(),
  44. current = domUtils.getNextDomNode(bookmark2.start, false, filterFn),
  45. tmpRange = range.cloneRange(),
  46. tmpNode;
  47. while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) {
  48. if (current.nodeType == 3 || !block(current)) {
  49. tmpRange.setStartBefore(current);
  50. while (current && current !== bookmark2.end && !block(current)) {
  51. tmpNode = current;
  52. current = domUtils.getNextDomNode(current, false, null, function (node) {
  53. return !block(node);
  54. });
  55. }
  56. tmpRange.setEndAfter(tmpNode);
  57. var common = tmpRange.getCommonAncestor();
  58. if (!domUtils.isBody(common) && block(common)) {
  59. domUtils.setStyles(common, utils.isString(style) ? {'text-align':style} : style);
  60. current = common;
  61. } else {
  62. var p = range.document.createElement('p');
  63. domUtils.setStyles(p, utils.isString(style) ? {'text-align':style} : style);
  64. var frag = tmpRange.extractContents();
  65. p.appendChild(frag);
  66. tmpRange.insertNode(p);
  67. current = p;
  68. }
  69. current = domUtils.getNextDomNode(current, false, filterFn);
  70. } else {
  71. current = domUtils.getNextDomNode(current, true, filterFn);
  72. }
  73. }
  74. return range.moveToBookmark(bookmark2).moveToBookmark(bookmark);
  75. };
  76. UE.commands['justify'] = {
  77. execCommand:function (cmdName, align) {
  78. var range = this.selection.getRange(),
  79. txt;
  80. //闭合时单独处理
  81. if (range.collapsed) {
  82. txt = this.document.createTextNode('p');
  83. range.insertNode(txt);
  84. }
  85. doJustify(range, align);
  86. if (txt) {
  87. range.setStartBefore(txt).collapse(true);
  88. domUtils.remove(txt);
  89. }
  90. range.select();
  91. return true;
  92. },
  93. queryCommandValue:function () {
  94. var startNode = this.selection.getStart(),
  95. value = domUtils.getComputedStyle(startNode, 'text-align');
  96. return defaultValue[value] ? value : 'left';
  97. },
  98. queryCommandState:function () {
  99. var start = this.selection.getStart(),
  100. cell = start && domUtils.findParentByTagName(start, ["td", "th","caption"], true);
  101. return cell? -1:0;
  102. }
  103. };
  104. };