directionality.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. ///import core
  2. ///commands 输入的方向
  3. ///commandsName DirectionalityLtr,DirectionalityRtl
  4. ///commandsTitle 从左向右输入,从右向左输入
  5. /**
  6. * 输入的方向
  7. * @function
  8. * @name baidu.editor.execCommand
  9. * @param {String} cmdName directionality执行函数的参数
  10. * @param {String} forward ltr从左向右输入,rtl从右向左输入
  11. */
  12. (function() {
  13. var block = domUtils.isBlockElm ,
  14. getObj = function(editor){
  15. // var startNode = editor.selection.getStart(),
  16. // parents;
  17. // if ( startNode ) {
  18. // //查找所有的是block的父亲节点
  19. // parents = domUtils.findParents( startNode, true, block, true );
  20. // for ( var i = 0,ci; ci = parents[i++]; ) {
  21. // if ( ci.getAttribute( 'dir' ) ) {
  22. // return ci;
  23. // }
  24. // }
  25. // }
  26. return domUtils.filterNodeList(editor.selection.getStartElementPath(),function(n){return n.getAttribute('dir')});
  27. },
  28. doDirectionality = function(range,editor,forward){
  29. var bookmark,
  30. filterFn = function( node ) {
  31. return node.nodeType == 1 ? !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node);
  32. },
  33. obj = getObj( editor );
  34. if ( obj && range.collapsed ) {
  35. obj.setAttribute( 'dir', forward );
  36. return range;
  37. }
  38. bookmark = range.createBookmark();
  39. range.enlarge( true );
  40. var bookmark2 = range.createBookmark(),
  41. current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ),
  42. tmpRange = range.cloneRange(),
  43. tmpNode;
  44. while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) {
  45. if ( current.nodeType == 3 || !block( current ) ) {
  46. tmpRange.setStartBefore( current );
  47. while ( current && current !== bookmark2.end && !block( current ) ) {
  48. tmpNode = current;
  49. current = domUtils.getNextDomNode( current, false, null, function( node ) {
  50. return !block( node );
  51. } );
  52. }
  53. tmpRange.setEndAfter( tmpNode );
  54. var common = tmpRange.getCommonAncestor();
  55. if ( !domUtils.isBody( common ) && block( common ) ) {
  56. //遍历到了block节点
  57. common.setAttribute( 'dir', forward );
  58. current = common;
  59. } else {
  60. //没有遍历到,添加一个block节点
  61. var p = range.document.createElement( 'p' );
  62. p.setAttribute( 'dir', forward );
  63. var frag = tmpRange.extractContents();
  64. p.appendChild( frag );
  65. tmpRange.insertNode( p );
  66. current = p;
  67. }
  68. current = domUtils.getNextDomNode( current, false, filterFn );
  69. } else {
  70. current = domUtils.getNextDomNode( current, true, filterFn );
  71. }
  72. }
  73. return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark );
  74. };
  75. UE.commands['directionality'] = {
  76. execCommand : function( cmdName,forward ) {
  77. var range = this.selection.getRange();
  78. //闭合时单独处理
  79. if(range.collapsed){
  80. var txt = this.document.createTextNode('d');
  81. range.insertNode(txt);
  82. }
  83. doDirectionality(range,this,forward);
  84. if(txt){
  85. range.setStartBefore(txt).collapse(true);
  86. domUtils.remove(txt);
  87. }
  88. range.select();
  89. return true;
  90. },
  91. queryCommandValue : function() {
  92. var node = getObj(this);
  93. return node ? node.getAttribute('dir') : 'ltr';
  94. }
  95. };
  96. })();