directionality.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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(editor.selection.getStartElementPath(),function(n){return n && n.nodeType == 1 && n.getAttribute('dir')});
  21. },
  22. doDirectionality = function(range,editor,forward){
  23. var bookmark,
  24. filterFn = function( node ) {
  25. return node.nodeType == 1 ? !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node);
  26. },
  27. obj = getObj( editor );
  28. if ( obj && range.collapsed ) {
  29. obj.setAttribute( 'dir', forward );
  30. return range;
  31. }
  32. bookmark = range.createBookmark();
  33. range.enlarge( true );
  34. var bookmark2 = range.createBookmark(),
  35. current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ),
  36. tmpRange = range.cloneRange(),
  37. tmpNode;
  38. while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) {
  39. if ( current.nodeType == 3 || !block( current ) ) {
  40. tmpRange.setStartBefore( current );
  41. while ( current && current !== bookmark2.end && !block( current ) ) {
  42. tmpNode = current;
  43. current = domUtils.getNextDomNode( current, false, null, function( node ) {
  44. return !block( node );
  45. } );
  46. }
  47. tmpRange.setEndAfter( tmpNode );
  48. var common = tmpRange.getCommonAncestor();
  49. if ( !domUtils.isBody( common ) && block( common ) ) {
  50. //遍历到了block节点
  51. common.setAttribute( 'dir', forward );
  52. current = common;
  53. } else {
  54. //没有遍历到,添加一个block节点
  55. var p = range.document.createElement( 'p' );
  56. p.setAttribute( 'dir', forward );
  57. var frag = tmpRange.extractContents();
  58. p.appendChild( frag );
  59. tmpRange.insertNode( p );
  60. current = p;
  61. }
  62. current = domUtils.getNextDomNode( current, false, filterFn );
  63. } else {
  64. current = domUtils.getNextDomNode( current, true, filterFn );
  65. }
  66. }
  67. return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark );
  68. };
  69. /**
  70. * 文字输入方向
  71. * @command directionality
  72. * @method execCommand
  73. * @param { String } cmdName 命令字符串
  74. * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入
  75. * @example
  76. * ```javascript
  77. * editor.execCommand( 'directionality', 'ltr');
  78. * ```
  79. */
  80. /**
  81. * 查询当前选区的文字输入方向
  82. * @command directionality
  83. * @method queryCommandValue
  84. * @param { String } cmdName 命令字符串
  85. * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入
  86. * @example
  87. * ```javascript
  88. * editor.queryCommandValue( 'directionality');
  89. * ```
  90. */
  91. UE.commands['directionality'] = {
  92. execCommand : function( cmdName,forward ) {
  93. var range = this.selection.getRange();
  94. //闭合时单独处理
  95. if(range.collapsed){
  96. var txt = this.document.createTextNode('d');
  97. range.insertNode(txt);
  98. }
  99. doDirectionality(range,this,forward);
  100. if(txt){
  101. range.setStartBefore(txt).collapse(true);
  102. domUtils.remove(txt);
  103. }
  104. range.select();
  105. return true;
  106. },
  107. queryCommandValue : function() {
  108. var node = getObj(this);
  109. return node ? node.getAttribute('dir') : 'ltr';
  110. }
  111. };
  112. })();