directionality.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /**
  2. * 设置文字输入的方向的插件
  3. * @file
  4. * @since 1.2.6.1
  5. */
  6. (function() {
  7. var block = domUtils.isBlockElm,
  8. getObj = function(editor) {
  9. // var startNode = editor.selection.getStart(),
  10. // parents;
  11. // if ( startNode ) {
  12. // //查找所有的是block的父亲节点
  13. // parents = domUtils.findParents( startNode, true, block, true );
  14. // for ( var i = 0,ci; ci = parents[i++]; ) {
  15. // if ( ci.getAttribute( 'dir' ) ) {
  16. // return ci;
  17. // }
  18. // }
  19. // }
  20. return domUtils.filterNodeList(
  21. editor.selection.getStartElementPath(),
  22. function(n) {
  23. return n && n.nodeType == 1 && n.getAttribute("dir");
  24. }
  25. );
  26. },
  27. doDirectionality = function(range, editor, forward) {
  28. var bookmark,
  29. filterFn = function(node) {
  30. return node.nodeType == 1
  31. ? !domUtils.isBookmarkNode(node)
  32. : !domUtils.isWhitespace(node);
  33. },
  34. obj = getObj(editor);
  35. if (obj && range.collapsed) {
  36. obj.setAttribute("dir", forward);
  37. return range;
  38. }
  39. bookmark = range.createBookmark();
  40. range.enlarge(true);
  41. var bookmark2 = range.createBookmark(),
  42. current = domUtils.getNextDomNode(bookmark2.start, false, filterFn),
  43. tmpRange = range.cloneRange(),
  44. tmpNode;
  45. while (
  46. current &&
  47. !(
  48. domUtils.getPosition(current, bookmark2.end) &
  49. domUtils.POSITION_FOLLOWING
  50. )
  51. ) {
  52. if (current.nodeType == 3 || !block(current)) {
  53. tmpRange.setStartBefore(current);
  54. while (current && current !== bookmark2.end && !block(current)) {
  55. tmpNode = current;
  56. current = domUtils.getNextDomNode(current, false, null, function(
  57. node
  58. ) {
  59. return !block(node);
  60. });
  61. }
  62. tmpRange.setEndAfter(tmpNode);
  63. var common = tmpRange.getCommonAncestor();
  64. if (!domUtils.isBody(common) && block(common)) {
  65. //遍历到了block节点
  66. common.setAttribute("dir", forward);
  67. current = common;
  68. } else {
  69. //没有遍历到,添加一个block节点
  70. var p = range.document.createElement("p");
  71. p.setAttribute("dir", forward);
  72. var frag = tmpRange.extractContents();
  73. p.appendChild(frag);
  74. tmpRange.insertNode(p);
  75. current = p;
  76. }
  77. current = domUtils.getNextDomNode(current, false, filterFn);
  78. } else {
  79. current = domUtils.getNextDomNode(current, true, filterFn);
  80. }
  81. }
  82. return range.moveToBookmark(bookmark2).moveToBookmark(bookmark);
  83. };
  84. /**
  85. * 文字输入方向
  86. * @command directionality
  87. * @method execCommand
  88. * @param { String } cmdName 命令字符串
  89. * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入
  90. * @example
  91. * ```javascript
  92. * editor.execCommand( 'directionality', 'ltr');
  93. * ```
  94. */
  95. /**
  96. * 查询当前选区的文字输入方向
  97. * @command directionality
  98. * @method queryCommandValue
  99. * @param { String } cmdName 命令字符串
  100. * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入
  101. * @example
  102. * ```javascript
  103. * editor.queryCommandValue( 'directionality');
  104. * ```
  105. */
  106. UE.commands["directionality"] = {
  107. execCommand: function(cmdName, forward) {
  108. var range = this.selection.getRange();
  109. //闭合时单独处理
  110. if (range.collapsed) {
  111. var txt = this.document.createTextNode("d");
  112. range.insertNode(txt);
  113. }
  114. doDirectionality(range, this, forward);
  115. if (txt) {
  116. range.setStartBefore(txt).collapse(true);
  117. domUtils.remove(txt);
  118. }
  119. range.select();
  120. return true;
  121. },
  122. queryCommandValue: function() {
  123. var node = getObj(this);
  124. return node ? node.getAttribute("dir") : "ltr";
  125. }
  126. };
  127. })();