113 lines
4.2 KiB
JavaScript
113 lines
4.2 KiB
JavaScript
define("dijit/_BidiSupport", ["./_WidgetBase"], function(_WidgetBase){
|
|
|
|
// module:
|
|
// dijit/_BidiSupport
|
|
|
|
/*=====
|
|
return function(){
|
|
// summary:
|
|
// Module that deals with BIDI, special with the auto
|
|
// direction if needed without changing the GUI direction.
|
|
// Including this module will extend _WidgetBase with BIDI related methods.
|
|
// description:
|
|
// There's a special need for displaying BIDI text in rtl direction
|
|
// in ltr GUI, sometimes needed auto support.
|
|
// In creation of widget, if it's want to activate this class,
|
|
// the widget should define the "textDir".
|
|
};
|
|
=====*/
|
|
|
|
_WidgetBase.extend({
|
|
|
|
getTextDir: function(/*String*/ text){
|
|
// summary:
|
|
// Gets the right direction of text.
|
|
// description:
|
|
// If textDir is ltr or rtl returns the value.
|
|
// If it's auto, calls to another function that responsible
|
|
// for checking the value, and defining the direction.
|
|
// tags:
|
|
// protected.
|
|
return this.textDir == "auto" ? this._checkContextual(text) : this.textDir;
|
|
},
|
|
|
|
_checkContextual: function(text){
|
|
// summary:
|
|
// Finds the first strong (directional) character, return ltr if isLatin
|
|
// or rtl if isBidiChar.
|
|
// tags:
|
|
// private.
|
|
|
|
// look for strong (directional) characters
|
|
var fdc = /[A-Za-z\u05d0-\u065f\u066a-\u06ef\u06fa-\u07ff\ufb1d-\ufdff\ufe70-\ufefc]/.exec(text);
|
|
// if found return the direction that defined by the character, else return widgets dir as defult.
|
|
return fdc ? ( fdc[0] <= 'z' ? "ltr" : "rtl" ) : this.dir ? this.dir : this.isLeftToRight() ? "ltr" : "rtl";
|
|
},
|
|
|
|
applyTextDir: function(/*Object*/ element, /*String*/ text){
|
|
// summary:
|
|
// Set element.dir according to this.textDir
|
|
// element:
|
|
// The text element to be set. Should have dir property.
|
|
// text:
|
|
// Used in case this.textDir is "auto", for calculating the right transformation
|
|
// description:
|
|
// If textDir is ltr or rtl returns the value.
|
|
// If it's auto, calls to another function that responsible
|
|
// for checking the value, and defining the direction.
|
|
// tags:
|
|
// protected.
|
|
|
|
var textDir = this.textDir == "auto" ? this._checkContextual(text) : this.textDir;
|
|
// update only when there's a difference
|
|
if(element.dir != textDir){
|
|
element.dir = textDir;
|
|
}
|
|
},
|
|
enforceTextDirWithUcc: function(option, text){
|
|
// summary:
|
|
// Wraps by UCC (Unicode control characters) option's text according to this.textDir
|
|
// option:
|
|
// The element (`<option>`) we wrapping the text for.
|
|
// text:
|
|
// The text to be wrapped.
|
|
// description:
|
|
// There's a dir problem with some HTML elements. For some elements (e.g. `<option>`, `<select>`)
|
|
// defining the dir in different direction then the GUI orientation, won't display correctly.
|
|
// FF 3.6 will change the alignment of the text in option - this doesn't follow the bidi standards (static text
|
|
// should be aligned following GUI direction). IE8 and Opera11.10 completely ignore dir setting for `<option>`.
|
|
// Therefore the only solution is to use UCC (Unicode control characters) to display the text in correct orientation.
|
|
// This function saves the original text value for later restoration if needed, for example if the textDir will change etc.
|
|
if(this.textDir){
|
|
option.originalText = text;
|
|
var dir = this.textDir == "auto" ? this._checkContextual(text) : this.textDir;
|
|
return (dir == "ltr" ? bidi_const.LRE : bidi_const.RLE ) + text + bidi_const.PDF;
|
|
}
|
|
return text;
|
|
},
|
|
restoreOriginalText: function(origObj){
|
|
// summary:
|
|
// Restores the text of origObj, if needed, after enforceTextDirWithUcc, e.g. set("textDir", textDir).
|
|
// origObj:
|
|
// The element (`<option>`) to restore.
|
|
// description:
|
|
// Sets the text of origObj to origObj.originalText, which is the original text, without the UCCs.
|
|
// The function than removes the originalText from origObj!
|
|
if(origObj.originalText){
|
|
origObj.text = origObj.originalText;
|
|
delete origObj.originalText;
|
|
}
|
|
return origObj;
|
|
}
|
|
});
|
|
|
|
// UCC - constants that will be used by bidi support.
|
|
var bidi_const = {
|
|
LRM : '\u200E',
|
|
LRE : '\u202A',
|
|
PDF : '\u202C',
|
|
RLM : '\u200f',
|
|
RLE : '\u202B'
|
|
};
|
|
return _WidgetBase;
|
|
});
|