123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /**
- * 设置文字输入的方向的插件
- * @file
- * @since 1.2.6.1
- */
- (function() {
- var block = domUtils.isBlockElm,
- getObj = function(editor) {
- // var startNode = editor.selection.getStart(),
- // parents;
- // if ( startNode ) {
- // //查找所有的是block的父亲节点
- // parents = domUtils.findParents( startNode, true, block, true );
- // for ( var i = 0,ci; ci = parents[i++]; ) {
- // if ( ci.getAttribute( 'dir' ) ) {
- // return ci;
- // }
- // }
- // }
- return domUtils.filterNodeList(
- editor.selection.getStartElementPath(),
- function(n) {
- return n && n.nodeType == 1 && n.getAttribute("dir");
- }
- );
- },
- doDirectionality = function(range, editor, forward) {
- var bookmark,
- filterFn = function(node) {
- return node.nodeType == 1
- ? !domUtils.isBookmarkNode(node)
- : !domUtils.isWhitespace(node);
- },
- obj = getObj(editor);
- if (obj && range.collapsed) {
- obj.setAttribute("dir", forward);
- return range;
- }
- bookmark = range.createBookmark();
- range.enlarge(true);
- var bookmark2 = range.createBookmark(),
- current = domUtils.getNextDomNode(bookmark2.start, false, filterFn),
- tmpRange = range.cloneRange(),
- tmpNode;
- while (
- current &&
- !(
- domUtils.getPosition(current, bookmark2.end) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- if (current.nodeType == 3 || !block(current)) {
- tmpRange.setStartBefore(current);
- while (current && current !== bookmark2.end && !block(current)) {
- tmpNode = current;
- current = domUtils.getNextDomNode(current, false, null, function(
- node
- ) {
- return !block(node);
- });
- }
- tmpRange.setEndAfter(tmpNode);
- var common = tmpRange.getCommonAncestor();
- if (!domUtils.isBody(common) && block(common)) {
- //遍历到了block节点
- common.setAttribute("dir", forward);
- current = common;
- } else {
- //没有遍历到,添加一个block节点
- var p = range.document.createElement("p");
- p.setAttribute("dir", forward);
- var frag = tmpRange.extractContents();
- p.appendChild(frag);
- tmpRange.insertNode(p);
- current = p;
- }
- current = domUtils.getNextDomNode(current, false, filterFn);
- } else {
- current = domUtils.getNextDomNode(current, true, filterFn);
- }
- }
- return range.moveToBookmark(bookmark2).moveToBookmark(bookmark);
- };
- /**
- * 文字输入方向
- * @command directionality
- * @method execCommand
- * @param { String } cmdName 命令字符串
- * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入
- * @example
- * ```javascript
- * editor.execCommand( 'directionality', 'ltr');
- * ```
- */
- /**
- * 查询当前选区的文字输入方向
- * @command directionality
- * @method queryCommandValue
- * @param { String } cmdName 命令字符串
- * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入
- * @example
- * ```javascript
- * editor.queryCommandValue( 'directionality');
- * ```
- */
- UE.commands["directionality"] = {
- execCommand: function(cmdName, forward) {
- var range = this.selection.getRange();
- //闭合时单独处理
- if (range.collapsed) {
- var txt = this.document.createTextNode("d");
- range.insertNode(txt);
- }
- doDirectionality(range, this, forward);
- if (txt) {
- range.setStartBefore(txt).collapse(true);
- domUtils.remove(txt);
- }
- range.select();
- return true;
- },
- queryCommandValue: function() {
- var node = getObj(this);
- return node ? node.getAttribute("dir") : "ltr";
- }
- };
- })();
|