1508 lines
53 KiB
JavaScript
1508 lines
53 KiB
JavaScript
|
//>>built
|
||
|
define("dojox/string/BidiEngine", ["dojo/_base/lang", "dojo/_base/declare"],
|
||
|
function(lang,declare){
|
||
|
lang.getObject("string", true, dojox);
|
||
|
|
||
|
declare("dojox.string.BidiEngine", null, {
|
||
|
// summary:
|
||
|
// This class provides a bidi transformation engine, i.e.
|
||
|
// functions for reordering and shaping bidi text.
|
||
|
// description:
|
||
|
// Bidi stands for support for languages with a bidirectional script.
|
||
|
//
|
||
|
// Usually Unicode Bidi Algorithm used by OS platform (and web browsers) is capable of properly transforming
|
||
|
// Bidi text and as a result it is adequately displayed on the screen. However, in some situations,
|
||
|
// Unicode Bidi Algorithm is not invoked or is not properly applied. This may occur in situation in which software
|
||
|
// responsible for rendering the text is not leveraging Unicode Bidi Algorithm implemented by OS (e.g. dojox.GFX renderers).
|
||
|
//
|
||
|
// Bidi engine provided in this class implements Unicode Bidi Algorithm as specified at:
|
||
|
// http://www.unicode.org/reports/tr9/.
|
||
|
//
|
||
|
// For more information on basic Bidi concepts please read following article:
|
||
|
// "Bidirectional script support - A primer" available from:
|
||
|
// http://www.ibm.com/developerworks/websphere/library/techarticles/bidi/bidigen.html
|
||
|
//
|
||
|
// As of February 2011, Bidi engine has following limitations:
|
||
|
// 1. No support for following numeric shaping options:
|
||
|
// H - Hindi,
|
||
|
// C - Contextual,
|
||
|
// N - Nominal.
|
||
|
// 2. No support for following shaping options:
|
||
|
// I - Initial shaping,
|
||
|
// M - Middle shaping,
|
||
|
// F - Final shaping,
|
||
|
// B - Isolated shaping.
|
||
|
// 3. No support for source-to-target or/and target-to-source maps.
|
||
|
// 4. No support for LRE/RLE/LRO/RLO/PDF (they are handled like neutrals).
|
||
|
// 5. No support for Windows compatibility.
|
||
|
// 6. No support for insert/remove marks.
|
||
|
// 7. No support for code pages (currently only UTF-8 is supported. Ideally we should convert from any code page to UTF-8).
|
||
|
|
||
|
bidiTransform: function (/*String*/text, /*String*/formatIn, /*String*/formatOut){
|
||
|
// summary:
|
||
|
// Central public API for Bidi engine. Transforms the text according to formatIn, formatOut parameters.
|
||
|
// If formatIn or formatOut parametrs are not valid throws an exception.
|
||
|
// inputText:
|
||
|
// Input text subject to application of Bidi transformation.
|
||
|
// formatIn:
|
||
|
// Input Bidi layout in which inputText is passed to the function.
|
||
|
// formatOut:
|
||
|
// Output Bidi layout to which inputText should be transformed.
|
||
|
// description:
|
||
|
// Both formatIn and formatOut parameters are 5 letters long strings.
|
||
|
// For example - "ILYNN". Each letter is associated with specific attribute of Bidi layout.
|
||
|
// Possible and default values for each one of the letters are provided below:
|
||
|
//
|
||
|
// First letter:
|
||
|
// Letter position/index:
|
||
|
// 1
|
||
|
// Letter meaning:
|
||
|
// Ordering Schema.
|
||
|
// Possible values:
|
||
|
// I - Implicit (Logical).
|
||
|
// V - Visual.
|
||
|
// Default value:
|
||
|
// I
|
||
|
//
|
||
|
// Second letter:
|
||
|
// Letter position/index:
|
||
|
// 2
|
||
|
// Letter meaning:
|
||
|
// Orientation.
|
||
|
// Possible values:
|
||
|
// L - Left To Right.
|
||
|
// R - Right To Left.
|
||
|
// C - Contextual Left to Right.
|
||
|
// D - Contextual Right to Left.
|
||
|
// Default value:
|
||
|
// L
|
||
|
//
|
||
|
// Third letter:
|
||
|
// Letter position/index:
|
||
|
// 3
|
||
|
// Letter meaning:
|
||
|
// Symmetric Swapping.
|
||
|
// Possible values:
|
||
|
// Y - Symmetric swapping is on.
|
||
|
// N - Symmetric swapping is off.
|
||
|
// Default value:
|
||
|
// Y
|
||
|
//
|
||
|
// Fourth letter:
|
||
|
// Letter position/index:
|
||
|
// 4
|
||
|
// Letter meaning:
|
||
|
// Shaping.
|
||
|
// Possible values:
|
||
|
// S - Text is shaped.
|
||
|
// N - Text is not shaped.
|
||
|
// Default value:
|
||
|
// N
|
||
|
//
|
||
|
// Fifth letter:
|
||
|
// Letter position/index:
|
||
|
// 5
|
||
|
// Letter meaning:
|
||
|
// Numeric Shaping.
|
||
|
// Possible values:
|
||
|
// N - Nominal.
|
||
|
// Default value:
|
||
|
// N
|
||
|
//
|
||
|
// The output of this function is original text (passed via first argument) transformed from input Bidi layout (second argument)
|
||
|
// to output Bidi layout (last argument).
|
||
|
//
|
||
|
// Sample call:
|
||
|
// | mytext = bidiTransform("HELLO WORLD", "ILYNN", "VLYNN");
|
||
|
// In this case, "HELLO WORLD" text is transformed from Logical - LTR to Visual - LTR Bidi layout with
|
||
|
// default values for symmetric swapping (Yes), shaping (Not shaped) and numeric shaping (Nominal).
|
||
|
// returns: /*String*/ or throws an exception.
|
||
|
// Original text transformed from input Bidi layout (second argument)
|
||
|
// to output Bidi layout (last argument).
|
||
|
// Throws an exception if the bidi layout strings are not valid.
|
||
|
// tags:
|
||
|
// public
|
||
|
|
||
|
if(!text){
|
||
|
return '';
|
||
|
}
|
||
|
if(!formatIn && !formatOut){
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
// regex for format validation
|
||
|
// Allowed values for format string are:
|
||
|
// 1st letter- I, V
|
||
|
// 2nd letter- L, R, C, D
|
||
|
// 3rd letter- Y, N
|
||
|
// 4th letter- S, N
|
||
|
// 5th letter- N
|
||
|
var validFormat = /^[(I|V)][(L|R|C|D)][(Y|N)][(S|N)][N]$/;
|
||
|
if(!validFormat.test(formatIn) || !validFormat.test(formatOut)){
|
||
|
throw new Error("dojox.string.BidiEngine: the bidi layout string is wrong!");
|
||
|
}
|
||
|
|
||
|
if(formatIn == formatOut){
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
var orientIn = getOrientation(formatIn.charAt(1))
|
||
|
, orientOut = getOrientation(formatOut.charAt(1))
|
||
|
, os_in = (formatIn.charAt(0) == 'I') ? 'L' : formatIn.charAt(0)
|
||
|
, os_out = (formatOut.charAt(0) == 'I') ? 'L' : formatOut.charAt(0)
|
||
|
, inFormat = os_in + orientIn
|
||
|
, outFormat = os_out + orientOut
|
||
|
, swap = formatIn.charAt(2) + formatOut.charAt(2)
|
||
|
;
|
||
|
|
||
|
if(inFormat){
|
||
|
bdx.defInFormat = inFormat;
|
||
|
}
|
||
|
if(outFormat){
|
||
|
bdx.defOutFormat = outFormat;
|
||
|
}
|
||
|
if(swap){
|
||
|
bdx.defSwap = swap;
|
||
|
}
|
||
|
|
||
|
var stage1_text = doBidiReorder(text, os_in + orientIn, os_out + orientOut, formatIn.charAt(2) + formatOut.charAt(2))
|
||
|
, isRtl = false;
|
||
|
|
||
|
if(formatOut.charAt(1) == 'R'){
|
||
|
isRtl = true;
|
||
|
}else if(formatOut.charAt(1) == 'C' || formatOut.charAt(1) == 'D'){
|
||
|
isRtl = this.checkContextual(stage1_text);
|
||
|
}
|
||
|
if(formatIn.charAt(3) == formatOut.charAt(3)){
|
||
|
return stage1_text;
|
||
|
}else if(formatOut.charAt(3) == 'S'){
|
||
|
return shape(isRtl, stage1_text, true);
|
||
|
}
|
||
|
if(formatOut.charAt(3) == 'N'){
|
||
|
return deshape(stage1_text, isRtl, true);
|
||
|
}
|
||
|
},
|
||
|
checkContextual: function(/*String*/text){
|
||
|
// summary:
|
||
|
// Determine the base direction of a bidi text according
|
||
|
// to its first strong directional character.
|
||
|
// text:
|
||
|
// The text to check.
|
||
|
// returns: /*String*/
|
||
|
// "ltr" or "rtl" according to the first strong character.
|
||
|
// If there is no strong character, returns the value of the
|
||
|
// document dir property.
|
||
|
// tags:
|
||
|
// public
|
||
|
var dir = firstStrongDir(text);
|
||
|
if(dir != "ltr" && dir != "rtl"){
|
||
|
dir = document.dir.toLowerCase();
|
||
|
if(dir != "ltr" && dir != "rtl"){dir = "ltr";}
|
||
|
}
|
||
|
return dir;
|
||
|
},
|
||
|
hasBidiChar: function(/*String*/text){
|
||
|
// summary:
|
||
|
// Return true if text contains RTL directed character.
|
||
|
// text:
|
||
|
// The source string.
|
||
|
// description:
|
||
|
// Iterates over the text string, letter by letter starting from its beginning,
|
||
|
// searching for RTL directed character.
|
||
|
// Return true if found else false. Needed for vml transformation.
|
||
|
// returns: /*Boolean*/
|
||
|
// true - if text has a RTL directed character.
|
||
|
// false - otherwise.
|
||
|
// tags:
|
||
|
// public
|
||
|
|
||
|
var type = null, uc = null, hi = null;
|
||
|
for(var i = 0; i < text.length; i++){
|
||
|
uc = text.charAt(i).charCodeAt(0);
|
||
|
hi = MasterTable[uc >> 8];
|
||
|
type = hi < TBBASE ? hi : UnicodeTable[hi - TBBASE][uc & 0xFF];
|
||
|
if(type == UBAT_R || type == UBAT_AL){
|
||
|
return true;
|
||
|
}
|
||
|
if(type == UBAT_B){
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
|
||
|
function doBidiReorder(/*String*/text, /*String*/inFormat,
|
||
|
/*String*/outFormat, /*String*/swap){
|
||
|
// summary:
|
||
|
// Reorder the source text according to the bidi attributes
|
||
|
// of source and result.
|
||
|
// text:
|
||
|
// The text to reorder.
|
||
|
// inFormat:
|
||
|
// Ordering scheme and base direction of the source text.
|
||
|
// Can be "LLTR", "LRTL", "LCLR", "LCRL", "VLTR", "VRTL",
|
||
|
// "VCLR", "VCRL".
|
||
|
// The first letter is "L" for logical ordering scheme,
|
||
|
// "V" for visual ordering scheme.
|
||
|
// The other letters specify the base direction.
|
||
|
// "CLR" means contextual direction defaulting to LTR if
|
||
|
// there is no strong letter.
|
||
|
// "CRL" means contextual direction defaulting to RTL if
|
||
|
// there is no strong letter.
|
||
|
// The initial value is "LLTR", if none, the initial value is used.
|
||
|
// outFormat:
|
||
|
// Required ordering scheme and base direction of the
|
||
|
// result. Has the same format as inFormat.
|
||
|
// If none, the initial value "VLTR" is used.
|
||
|
// swap:
|
||
|
// Symmetric swapping attributes of source and result.
|
||
|
// The allowed values can be "YN", "NY", "YY" and "NN".
|
||
|
// The first letter reflects the symmetric swapping attribute
|
||
|
// of the source, the second letter that of the result.
|
||
|
// returns:
|
||
|
// Text reordered according to source and result attributes.
|
||
|
|
||
|
if(inFormat == undefined){
|
||
|
inFormat = bdx.defInFormat;
|
||
|
}
|
||
|
if(outFormat == undefined){
|
||
|
outFormat = bdx.defOutFormat;
|
||
|
}
|
||
|
if(swap == undefined){
|
||
|
swap = bdx.defSwap;
|
||
|
}
|
||
|
if(inFormat == outFormat){
|
||
|
return text;
|
||
|
}
|
||
|
var dir, inOrdering = inFormat.substring(0,1)
|
||
|
, inOrientation = inFormat.substring(1,4)
|
||
|
, outOrdering = outFormat.substring(0,1)
|
||
|
, outOrientation = outFormat.substring(1,4)
|
||
|
;
|
||
|
if(inOrientation.charAt(0) == "C"){
|
||
|
dir = firstStrongDir(text);
|
||
|
if(dir == "ltr" || dir == "rtl"){
|
||
|
inOrientation = dir.toUpperCase();
|
||
|
}else{
|
||
|
inOrientation = inFormat.charAt(2) == "L" ? "LTR" : "RTL";
|
||
|
}
|
||
|
inFormat = inOrdering + inOrientation;
|
||
|
}
|
||
|
if(outOrientation.charAt(0) == "C"){
|
||
|
dir = firstStrongDir(text);
|
||
|
if(dir == "rtl"){
|
||
|
outOrientation = "RTL";
|
||
|
}else if(dir == "ltr"){
|
||
|
dir = lastStrongDir(text);
|
||
|
outOrientation = dir.toUpperCase();
|
||
|
}else{
|
||
|
outOrientation = outFormat.charAt(2) == "L" ? "LTR" : "RTL";
|
||
|
}
|
||
|
outFormat = outOrdering + outOrientation;
|
||
|
}
|
||
|
if(inFormat == outFormat){
|
||
|
return text;
|
||
|
}
|
||
|
bdx.inFormat = inFormat;
|
||
|
bdx.outFormat = outFormat;
|
||
|
bdx.swap = swap;
|
||
|
if((inOrdering == "L") && (outFormat == "VLTR")){ //core cases
|
||
|
//cases: LLTR->VLTR, LRTL->VLTR
|
||
|
if(inOrientation == "LTR"){
|
||
|
bdx.dir = LTR;
|
||
|
return doReorder(text);
|
||
|
}
|
||
|
if(inOrientation == "RTL"){
|
||
|
bdx.dir = RTL;
|
||
|
return doReorder(text);
|
||
|
}
|
||
|
}
|
||
|
if((inOrdering == "V") && (outOrdering == "V")){
|
||
|
//inOrientation != outOrientation
|
||
|
//cases: VRTL->VLTR, VLTR->VRTL
|
||
|
return invertStr(text);
|
||
|
}
|
||
|
if((inOrdering == "L") && (outFormat == "VRTL")){
|
||
|
//cases: LLTR->VRTL, LRTL->VRTL
|
||
|
if(inOrientation == "LTR"){
|
||
|
bdx.dir = LTR;
|
||
|
text = doReorder(text);
|
||
|
}else{
|
||
|
//inOrientation == RTL
|
||
|
bdx.dir = RTL;
|
||
|
text = doReorder(text);
|
||
|
}
|
||
|
return invertStr(text);
|
||
|
}
|
||
|
if((inFormat == "VLTR") && (outFormat == "LLTR")){
|
||
|
//case: VLTR->LLTR
|
||
|
bdx.dir = LTR;
|
||
|
return doReorder(text);
|
||
|
}
|
||
|
if((inOrdering == "V") && (outOrdering == "L") && (inOrientation != outOrientation)){
|
||
|
//cases: VLTR->LRTL, VRTL->LLTR
|
||
|
text = invertStr(text);
|
||
|
|
||
|
return (inOrientation == "RTL") ? doBidiReorder(text, "LLTR","VLTR", swap) : doBidiReorder(text, "LRTL","VRTL", swap);
|
||
|
}
|
||
|
if((inFormat == "VRTL") && (outFormat == "LRTL")){
|
||
|
//case VRTL->LRTL
|
||
|
return doBidiReorder(text, "LRTL","VRTL", swap);
|
||
|
}
|
||
|
if((inOrdering == "L") && (outOrdering == "L")){
|
||
|
//inOrientation != outOrientation
|
||
|
//cases: LRTL->LLTR, LLTR->LRTL
|
||
|
var saveSwap = bdx.swap;
|
||
|
bdx.swap = saveSwap.substr(0, 1) + "N";
|
||
|
if(inOrientation == "RTL"){
|
||
|
//LRTL->LLTR
|
||
|
bdx.dir = RTL;
|
||
|
text = doReorder(text);
|
||
|
bdx.swap = "N" + saveSwap.substr(1, 2);
|
||
|
bdx.dir = LTR;
|
||
|
text = doReorder(text);
|
||
|
}else{ //LLTR->LRTL
|
||
|
bdx.dir = LTR;
|
||
|
text = doReorder(text);
|
||
|
bdx.swap = "N" + saveSwap.substr(1, 2);
|
||
|
text = doBidiReorder(text, "VLTR","LRTL", bdx.swap);
|
||
|
}
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
function shape(/*boolean*/rtl, /*String*/text, /*boolean*/compress){
|
||
|
// summary:
|
||
|
// Shape the source text.
|
||
|
// rtl:
|
||
|
// Flag indicating if the text is in RTL direction (logical
|
||
|
// direction for Arabic words).
|
||
|
// text:
|
||
|
// The text to shape.
|
||
|
// compress:
|
||
|
// A flag indicates to insert extra space after the lam alef compression
|
||
|
// to preserve the buffer size or not insert an extra space which will lead
|
||
|
// to decrease the buffer size. this option can be:
|
||
|
// - true (default) to not insert extra space after compressing Lam+Alef into one character Lamalef
|
||
|
// - false to insert an extra space after compressed Lamalef to preserve the buffer size
|
||
|
// returns:
|
||
|
// text shaped.
|
||
|
// tags:
|
||
|
// private.
|
||
|
|
||
|
if(text.length == 0){
|
||
|
return;
|
||
|
}
|
||
|
if(rtl == undefined){
|
||
|
rtl = true;
|
||
|
}
|
||
|
if(compress == undefined){
|
||
|
compress = true;
|
||
|
}
|
||
|
text = new String(text);
|
||
|
|
||
|
var str06 = text.split("")
|
||
|
, Ix = 0
|
||
|
, step = +1
|
||
|
, nIEnd = str06.length
|
||
|
;
|
||
|
if(!rtl){
|
||
|
Ix = str06.length - 1;
|
||
|
step = -1;
|
||
|
nIEnd = 1;
|
||
|
}
|
||
|
var previousCursive = 0, compressArray = [], compressArrayIndx = 0;
|
||
|
for(var index = Ix; index * step < nIEnd; index = index + step){
|
||
|
if(isArabicAlefbet(str06[index]) || isArabicDiacritics(str06[index])){
|
||
|
// Arabic letter Lam
|
||
|
if(str06[index] == '\u0644'){
|
||
|
if(isNextAlef(str06, (index + step), step, nIEnd)){
|
||
|
str06[index] = (previousCursive == 0) ? getLamAlefFE(str06[index + step], LamAlefInialTableFE) : getLamAlefFE(str06[index + step], LamAlefMedialTableFE);
|
||
|
index += step;
|
||
|
setAlefToSpace(str06, index, step, nIEnd);
|
||
|
if(compress){
|
||
|
compressArray[compressArrayIndx] = index;
|
||
|
compressArrayIndx++;
|
||
|
}
|
||
|
previousCursive = 0;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
var currentChr = str06[index];
|
||
|
if(previousCursive == 1){
|
||
|
// if next is Arabic
|
||
|
//Character is in medial form
|
||
|
// else character is in final form
|
||
|
str06[index] = (isNextArabic(str06, (index + step), step, nIEnd)) ?
|
||
|
getMedialFormCharacterFE(str06[index]) : getFormCharacterFE(str06[index], FinalForm);
|
||
|
}else{
|
||
|
if(isNextArabic(str06, (index + step), step, nIEnd) == true){
|
||
|
//character is in Initial form
|
||
|
str06[index] = getFormCharacterFE(str06[index],InitialForm);
|
||
|
}else{
|
||
|
str06[index] = getFormCharacterFE(str06[index], IsolatedForm);
|
||
|
}
|
||
|
}
|
||
|
//exam if the current character is cursive
|
||
|
if(!isArabicDiacritics(currentChr)){
|
||
|
previousCursive = 1;
|
||
|
}
|
||
|
if(isStandAlonCharacter(currentChr) == true){
|
||
|
previousCursive = 0;
|
||
|
}
|
||
|
}else{
|
||
|
previousCursive = 0;
|
||
|
}
|
||
|
}
|
||
|
var outBuf = "";
|
||
|
for(idx = 0; idx < str06.length; idx++){
|
||
|
if(!(compress && indexOf(compressArray, compressArray.length, idx) > -1)){
|
||
|
outBuf += str06[idx];
|
||
|
}
|
||
|
}
|
||
|
return outBuf;
|
||
|
};
|
||
|
function firstStrongDir(/*String*/text){
|
||
|
// summary:
|
||
|
// Return the first strong character direction
|
||
|
// text:
|
||
|
// The source string.
|
||
|
// description:
|
||
|
// Iterates over the text string, letter by letter starting from its beginning,
|
||
|
// searching for first "strong" character.
|
||
|
// Returns if strong character was found with the direction defined by this
|
||
|
// character, if no strong character was found returns an empty string.
|
||
|
// returns: /*String*/
|
||
|
// "ltr" - if the first strong character is Latin.
|
||
|
// "rtl" - if the first strong character is RTL directed character.
|
||
|
// "" - if the strong character wasn't found.
|
||
|
// tags:
|
||
|
// private
|
||
|
|
||
|
var type = null, uc = null, hi = null;
|
||
|
for(var i = 0; i < text.length; i++){
|
||
|
uc = text.charAt(i).charCodeAt(0);
|
||
|
hi = MasterTable[uc >> 8];
|
||
|
type = hi < TBBASE ? hi : UnicodeTable[hi - TBBASE][uc & 0xFF];
|
||
|
if(type == UBAT_R || type == UBAT_AL){
|
||
|
return "rtl";
|
||
|
}
|
||
|
if(type == UBAT_L){
|
||
|
return "ltr";
|
||
|
}
|
||
|
if(type == UBAT_B){
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return "";
|
||
|
};
|
||
|
function lastStrongDir(text){
|
||
|
// summary:
|
||
|
// Return the last strong character direction
|
||
|
// text:
|
||
|
// The source string.
|
||
|
// description:
|
||
|
// Iterates over the text string, letter by letter starting from its end,
|
||
|
// searching for first (from the end) "strong" character.
|
||
|
// Returns if strong character was found with the direction defined by this
|
||
|
// character, if no strong character was found returns an empty string.
|
||
|
// tags:
|
||
|
// private
|
||
|
var type = null;
|
||
|
for(var i = text.length - 1; i >= 0; i--){
|
||
|
type = getCharacterType(text.charAt(i));
|
||
|
if(type == UBAT_R || type == UBAT_AL){
|
||
|
return "rtl";
|
||
|
}
|
||
|
if(type == UBAT_L){
|
||
|
return "ltr";
|
||
|
}
|
||
|
if(type == UBAT_B){
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return "";
|
||
|
};
|
||
|
function deshape(/*String*/text, /*boolean*/rtl, /*boolean*/consume_next_space){
|
||
|
// summary:
|
||
|
// deshape the source text.
|
||
|
// text:
|
||
|
// the text to be deshape.
|
||
|
// rtl:
|
||
|
// flag indicating if the text is in RTL direction (logical
|
||
|
// direction for Arabic words).
|
||
|
// consume_next_space:
|
||
|
// flag indicating whether to consume the space next to the
|
||
|
// the lam alef if there is a space followed the Lamalef character to preserve the buffer size.
|
||
|
// In case there is no space next to the lam alef the buffer size will be increased due to the
|
||
|
// expansion of the lam alef one character into lam+alef two characters
|
||
|
// returns: text deshaped.
|
||
|
if(text.length == 0){
|
||
|
return;
|
||
|
}
|
||
|
if(consume_next_space == undefined){
|
||
|
consume_next_space = true;
|
||
|
}
|
||
|
if(rtl == undefined){
|
||
|
rtl = true;
|
||
|
}
|
||
|
text = new String(text);
|
||
|
|
||
|
var outBuf = "", strFE = [], textBuff = "";
|
||
|
if(consume_next_space){
|
||
|
for(var j = 0; j < text.length; j++){
|
||
|
if(text.charAt(j) == ' '){
|
||
|
if(rtl){
|
||
|
if(j > 0){
|
||
|
if(text.charAt(j - 1) >= '\uFEF5' && text.charAt(j - 1) <= '\uFEFC'){
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
}else{
|
||
|
if(j+1 < text.length){
|
||
|
if(text.charAt(j + 1) >= '\uFEF5' && text.charAt(j + 1) <= '\uFEFC'){
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
textBuff += text.charAt(j);
|
||
|
}
|
||
|
}else{
|
||
|
textBuff = new String(text);
|
||
|
}
|
||
|
strFE = textBuff.split("");
|
||
|
for(var i = 0; i < textBuff.length; i++){
|
||
|
if(strFE[i] >= '\uFE70' && strFE[i] < '\uFEFF'){
|
||
|
var chNum = textBuff.charCodeAt(i);
|
||
|
if(strFE[i] >= '\uFEF5' && strFE[i] <= '\uFEFC'){
|
||
|
//expand the LamAlef
|
||
|
if(rtl){
|
||
|
//Lam + Alef
|
||
|
outBuf += '\u0644';
|
||
|
outBuf += AlefTable[parseInt((chNum - 65269) / 2)];
|
||
|
}else{
|
||
|
outBuf += AlefTable[parseInt((chNum - 65269) / 2)];
|
||
|
outBuf += '\u0644';
|
||
|
}
|
||
|
}else{
|
||
|
outBuf += FETo06Table[chNum - 65136];
|
||
|
}
|
||
|
}else{
|
||
|
outBuf += strFE[i];
|
||
|
}
|
||
|
}
|
||
|
return outBuf;
|
||
|
};
|
||
|
function doReorder(str){
|
||
|
// summary:
|
||
|
// Helper to the doBidiReorder. Manages the UBA.
|
||
|
// str:
|
||
|
// the string to reorder.
|
||
|
// returns:
|
||
|
// text reordered according to source and result attributes.
|
||
|
// tags:
|
||
|
// private
|
||
|
var chars = str.split(""), levels = [];
|
||
|
|
||
|
computeLevels(chars, levels);
|
||
|
swapChars(chars, levels);
|
||
|
invertLevel(2, chars, levels);
|
||
|
invertLevel(1, chars, levels);
|
||
|
return chars.join("");
|
||
|
};
|
||
|
function computeLevels(chars, levels){
|
||
|
var len = chars.length
|
||
|
, impTab = bdx.dir ? impTab_RTL : impTab_LTR
|
||
|
, prevState = null, newClass = null, newLevel = null, newState = 0
|
||
|
, action = null, cond = null, condPos = -1, i = null, ix = null
|
||
|
, types = []
|
||
|
, classes = []
|
||
|
;
|
||
|
bdx.hiLevel = bdx.dir;
|
||
|
bdx.lastArabic = false;
|
||
|
bdx.hasUBAT_AL = false,
|
||
|
bdx.hasUBAT_B = false;
|
||
|
bdx.hasUBAT_S = false;
|
||
|
for(i = 0; i < len; i++){
|
||
|
types[i] = getCharacterType(chars[i]);
|
||
|
}
|
||
|
for(ix = 0; ix < len; ix++){
|
||
|
prevState = newState;
|
||
|
classes[ix] = newClass = getCharClass(chars, types, classes, ix);
|
||
|
newState = impTab[prevState][newClass];
|
||
|
action = newState & 0xF0;
|
||
|
newState &= 0x0F;
|
||
|
levels[ix] = newLevel = impTab[newState][ITIL];
|
||
|
if(action > 0){
|
||
|
if(action == 0x10){ // set conditional run to level 1
|
||
|
for(i = condPos; i < ix; i++){
|
||
|
levels[i] = 1;
|
||
|
}
|
||
|
condPos = -1;
|
||
|
}else{ // 0x20 confirm the conditional run
|
||
|
condPos = -1;
|
||
|
}
|
||
|
}
|
||
|
cond = impTab[newState][ITCOND];
|
||
|
if(cond){
|
||
|
if(condPos == -1){
|
||
|
condPos = ix;
|
||
|
}
|
||
|
}else{ // unconditional level
|
||
|
if(condPos > -1){
|
||
|
for(i = condPos; i < ix; i++){
|
||
|
levels[i] = newLevel;
|
||
|
}
|
||
|
condPos = -1;
|
||
|
}
|
||
|
}
|
||
|
if(types[ix] == UBAT_B){
|
||
|
levels[ix] = 0;
|
||
|
}
|
||
|
bdx.hiLevel |= newLevel;
|
||
|
}
|
||
|
if(bdx.hasUBAT_S){
|
||
|
for(i = 0; i < len; i++){
|
||
|
if(types[i] == UBAT_S){
|
||
|
levels[i] = bdx.dir;
|
||
|
for(var j = i - 1; j >= 0; j--){
|
||
|
if(types[j] == UBAT_WS){
|
||
|
levels[j] = bdx.dir;
|
||
|
}else{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
function swapChars(chars, levels){
|
||
|
// summary:
|
||
|
// Swap characters with symmetrical mirroring as all kinds of parenthesis.
|
||
|
// (When needed).
|
||
|
// chars:
|
||
|
// The source string as Array of characters.
|
||
|
// levels:
|
||
|
// An array (like hash) of flags for each character in the source string,
|
||
|
// that defines if swapping should be applied on the following character.
|
||
|
// description:
|
||
|
// First checks if the swapping should be applied, if not returns, else
|
||
|
// uses the levels "hash" to find what characters should be swapped.
|
||
|
// tags:
|
||
|
// private
|
||
|
|
||
|
if(bdx.hiLevel == 0 || bdx.swap.substr(0, 1) == bdx.swap.substr(1, 2)){
|
||
|
return;
|
||
|
};
|
||
|
|
||
|
//console.log("bdx.hiLevel == 0: " + bdx.hiLevel + "bdx.swap[0]: "+ bdx.swap[0] +" bdx.swap[1]: " +bdx.swap[1]);
|
||
|
for(var i = 0; i < chars.length; i++){
|
||
|
if(levels[i] == 1){chars[i] = getMirror(chars[i]);}
|
||
|
}
|
||
|
};
|
||
|
function getCharacterType(ch){
|
||
|
// summary:
|
||
|
// Return the type of the character.
|
||
|
// ch:
|
||
|
// The character to be checked.
|
||
|
|
||
|
// description:
|
||
|
// Check the type of the character according to MasterTable,
|
||
|
// type = LTR, RTL, neutral,Arabic-Indic digit etc.
|
||
|
// tags:
|
||
|
// private
|
||
|
var uc = ch.charCodeAt(0)
|
||
|
, hi = MasterTable[uc >> 8];
|
||
|
return (hi < TBBASE) ? hi : UnicodeTable[hi - TBBASE][uc & 0xFF];
|
||
|
};
|
||
|
function invertStr(str){
|
||
|
// summary:
|
||
|
// Return the reversed string.
|
||
|
// str:
|
||
|
// The string to be reversed.
|
||
|
// description:
|
||
|
// Reverse the string str.
|
||
|
// tags:
|
||
|
// private
|
||
|
var chars = str.split("");
|
||
|
chars.reverse();
|
||
|
return chars.join("");
|
||
|
};
|
||
|
function indexOf(cArray, cLength, idx){
|
||
|
var counter = -1;
|
||
|
for(var i = 0; i < cLength; i++){
|
||
|
if(cArray[i] == idx){
|
||
|
return i;
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
};
|
||
|
function isArabicAlefbet(c){
|
||
|
for(var i = 0; i < ArabicAlefBetIntervalsBegine.length; i++){
|
||
|
if(c >= ArabicAlefBetIntervalsBegine[i] && c <= ArabicAlefBetIntervalsEnd[i]){
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
function isNextArabic(str06, index, step, nIEnd){
|
||
|
while(((index) * step) < nIEnd && isArabicDiacritics(str06[index])){
|
||
|
index += step;
|
||
|
}
|
||
|
if(((index) * step) < nIEnd && isArabicAlefbet(str06[index])){
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
function isNextAlef(str06, index, step, nIEnd){
|
||
|
while(((index) * step) < nIEnd && isArabicDiacritics(str06[index])){
|
||
|
index += step;
|
||
|
}
|
||
|
var c = ' ';
|
||
|
if(((index) * step) < nIEnd){
|
||
|
c = str06[index];
|
||
|
}else{
|
||
|
return false;
|
||
|
}
|
||
|
for(var i = 0; i < AlefTable.length; i++){
|
||
|
if(AlefTable[i] == c){
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
function invertLevel(lev, chars, levels){
|
||
|
if(bdx.hiLevel < lev){
|
||
|
return;
|
||
|
}
|
||
|
if(lev == 1 && bdx.dir == RTL && !bdx.hasUBAT_B){
|
||
|
chars.reverse();
|
||
|
return;
|
||
|
}
|
||
|
var len = chars.length, start = 0, end, lo, hi, tmp;
|
||
|
while(start < len){
|
||
|
if(levels[start] >= lev){
|
||
|
end = start + 1;
|
||
|
while(end < len && levels[end] >= lev){
|
||
|
end++;
|
||
|
}
|
||
|
for(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){
|
||
|
tmp = chars[lo];
|
||
|
chars[lo] = chars[hi];
|
||
|
chars[hi] = tmp;
|
||
|
}
|
||
|
start = end;
|
||
|
}
|
||
|
start++;
|
||
|
}
|
||
|
};
|
||
|
function getCharClass(chars, types, classes, ix){
|
||
|
// summary:
|
||
|
// Return the class if ix character in chars.
|
||
|
// chars:
|
||
|
// The source string as Array of characters.
|
||
|
// types:
|
||
|
// Array of types, for each character in chars.
|
||
|
// classes:
|
||
|
// Array of classes that already been solved.
|
||
|
// ix:
|
||
|
// the index of checked character.
|
||
|
// tags:
|
||
|
// private
|
||
|
var cType = types[ix], wType, nType, len, i;
|
||
|
switch(cType){
|
||
|
case UBAT_L:
|
||
|
case UBAT_R:
|
||
|
bdx.lastArabic = false;
|
||
|
case UBAT_ON:
|
||
|
case UBAT_AN:
|
||
|
return cType;
|
||
|
case UBAT_EN:
|
||
|
return bdx.lastArabic ? UBAT_AN : UBAT_EN;
|
||
|
case UBAT_AL:
|
||
|
bdx.lastArabic = true;
|
||
|
bdx.hasUBAT_AL = true;
|
||
|
return UBAT_R;
|
||
|
case UBAT_WS:
|
||
|
return UBAT_ON;
|
||
|
case UBAT_CS:
|
||
|
if(ix < 1 || (ix + 1) >= types.length ||
|
||
|
((wType = classes[ix - 1]) != UBAT_EN && wType != UBAT_AN) ||
|
||
|
((nType = types[ix + 1]) != UBAT_EN && nType != UBAT_AN)){
|
||
|
return UBAT_ON;
|
||
|
}
|
||
|
if(bdx.lastArabic){nType = UBAT_AN;}
|
||
|
return nType == wType ? nType : UBAT_ON;
|
||
|
case UBAT_ES:
|
||
|
wType = ix > 0 ? classes[ix - 1] : UBAT_B;
|
||
|
if(wType == UBAT_EN && (ix + 1) < types.length && types[ix + 1] == UBAT_EN){
|
||
|
return UBAT_EN;
|
||
|
}
|
||
|
return UBAT_ON;
|
||
|
case UBAT_ET:
|
||
|
if(ix > 0 && classes[ix - 1] == UBAT_EN){
|
||
|
return UBAT_EN;
|
||
|
}
|
||
|
if(bdx.lastArabic){
|
||
|
return UBAT_ON;
|
||
|
}
|
||
|
i = ix + 1;
|
||
|
len = types.length;
|
||
|
while(i < len && types[i] == UBAT_ET){
|
||
|
i++;
|
||
|
}
|
||
|
if(i < len && types[i] == UBAT_EN){
|
||
|
return UBAT_EN;
|
||
|
}
|
||
|
return UBAT_ON;
|
||
|
case UBAT_NSM:
|
||
|
if(bdx.inFormat == "VLTR"){ // visual to implicit transformation
|
||
|
len = types.length;
|
||
|
i = ix + 1;
|
||
|
while(i < len && types[i] == UBAT_NSM){
|
||
|
i++;
|
||
|
}
|
||
|
if(i < len){
|
||
|
var c = chars[ix]
|
||
|
, rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E
|
||
|
;
|
||
|
wType = types[i];
|
||
|
if(rtlCandidate && (wType == UBAT_R || wType == UBAT_AL)){
|
||
|
return UBAT_R;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(ix < 1 || (wType = types[ix - 1]) == UBAT_B){
|
||
|
return UBAT_ON;
|
||
|
}
|
||
|
return classes[ix - 1];
|
||
|
case UBAT_B:
|
||
|
lastArabic = false;
|
||
|
bdx.hasUBAT_B = true;
|
||
|
return bdx.dir;
|
||
|
case UBAT_S:
|
||
|
bdx.hasUBAT_S = true;
|
||
|
return UBAT_ON;
|
||
|
case UBAT_LRE:
|
||
|
case UBAT_RLE:
|
||
|
case UBAT_LRO:
|
||
|
case UBAT_RLO:
|
||
|
case UBAT_PDF:
|
||
|
lastArabic = false;
|
||
|
case UBAT_BN:
|
||
|
return UBAT_ON;
|
||
|
}
|
||
|
};
|
||
|
function getMirror(c){
|
||
|
// summary:
|
||
|
// Calculates the mirrored character of c
|
||
|
// c:
|
||
|
// The character to be mirrored.
|
||
|
// tags:
|
||
|
// private
|
||
|
var mid, low = 0, high = SwapTable.length - 1;
|
||
|
|
||
|
while(low <= high){
|
||
|
mid = Math.floor((low + high) / 2);
|
||
|
if(c < SwapTable[mid][0]){
|
||
|
high = mid - 1;
|
||
|
}else if(c > SwapTable[mid][0]){
|
||
|
low = mid + 1;
|
||
|
}else{
|
||
|
return SwapTable[mid][1];
|
||
|
}
|
||
|
}
|
||
|
return c;
|
||
|
};
|
||
|
function isStandAlonCharacter(c){
|
||
|
for(var i = 0; i < StandAlonForm.length; i++){
|
||
|
if(StandAlonForm[i] == c){
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
function getMedialFormCharacterFE(c){
|
||
|
for(var i = 0; i < BaseForm.length; i++){
|
||
|
if(c == BaseForm[i]){
|
||
|
return MedialForm[i];
|
||
|
}
|
||
|
}
|
||
|
return c;
|
||
|
};
|
||
|
function getFormCharacterFE(/*char*/ c, /*char[]*/formArr){
|
||
|
for(var i = 0; i < BaseForm.length; i++){
|
||
|
if(c == BaseForm[i]){
|
||
|
return formArr[i];
|
||
|
}
|
||
|
}
|
||
|
return c;
|
||
|
};
|
||
|
function isArabicDiacritics(c){
|
||
|
return (c >= '\u064b' && c <= '\u0655') ? true : false;
|
||
|
};
|
||
|
function getOrientation(/*Char*/ oc){
|
||
|
if(oc == 'L'){
|
||
|
return "LTR";
|
||
|
}
|
||
|
if(oc == 'R'){
|
||
|
return "RTL";
|
||
|
}
|
||
|
if(oc == 'C'){
|
||
|
return "CLR";
|
||
|
}
|
||
|
if(oc == 'D'){
|
||
|
return "CRL";
|
||
|
}
|
||
|
};
|
||
|
function setAlefToSpace(str06, index, step, nIEnd){
|
||
|
while(((index) * step) < nIEnd && isArabicDiacritics(str06[index])){
|
||
|
index += step;
|
||
|
}
|
||
|
if(((index) * step) < nIEnd){
|
||
|
str06[index] = ' ';
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
function getLamAlefFE(alef06, LamAlefForm){
|
||
|
for(var i = 0; i < AlefTable.length; i++){
|
||
|
if(alef06 == AlefTable[i]){
|
||
|
return LamAlefForm[i];
|
||
|
}
|
||
|
}
|
||
|
return alef06;
|
||
|
};
|
||
|
function LamAlef(alef){
|
||
|
// summary:
|
||
|
// If the alef variable is an ARABIC ALEF letter,
|
||
|
// return the LamAlef code associated with the specific
|
||
|
// alef character.
|
||
|
// alef:
|
||
|
// The alef code type.
|
||
|
// description:
|
||
|
// If "alef" is an ARABIC ALEF letter, identify which alef is it,
|
||
|
// using AlefTable, then return the LamAlef associated with it.
|
||
|
// tags:
|
||
|
// private
|
||
|
for(var i = 0; i < AlefTable.length; i++){
|
||
|
if(AlefTable[i] == alef){
|
||
|
return AlefTable[i];
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
};
|
||
|
|
||
|
var bdx = {
|
||
|
dir: 0,
|
||
|
defInFormat: "LLTR",
|
||
|
defoutFormat: "VLTR",
|
||
|
defSwap: "YN",
|
||
|
inFormat: "LLTR",
|
||
|
outFormat: "VLTR",
|
||
|
swap: "YN",
|
||
|
hiLevel: 0,
|
||
|
lastArabic: false,
|
||
|
hasUBAT_AL: false,
|
||
|
hasBlockSep: false,
|
||
|
hasSegSep: false
|
||
|
};
|
||
|
|
||
|
var ITIL = 5;
|
||
|
|
||
|
var ITCOND = 6;
|
||
|
|
||
|
var LTR = 0;
|
||
|
|
||
|
var RTL = 1;
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Array in which directional characters are replaced by their symmetric. */
|
||
|
/****************************************************************************/
|
||
|
var SwapTable = [
|
||
|
[ "\u0028", "\u0029" ], /* Round brackets */
|
||
|
[ "\u0029", "\u0028" ],
|
||
|
[ "\u003C", "\u003E" ], /* Less than/greater than */
|
||
|
[ "\u003E", "\u003C" ],
|
||
|
[ "\u005B", "\u005D" ], /* Square brackets */
|
||
|
[ "\u005D", "\u005B" ],
|
||
|
[ "\u007B", "\u007D" ], /* Curly brackets */
|
||
|
[ "\u007D", "\u007B" ],
|
||
|
[ "\u00AB", "\u00BB" ], /* Double angle quotation marks */
|
||
|
[ "\u00BB", "\u00AB" ],
|
||
|
[ "\u2039", "\u203A" ], /* single angle quotation mark */
|
||
|
[ "\u203A", "\u2039" ],
|
||
|
[ "\u207D", "\u207E" ], /* Superscript parentheses */
|
||
|
[ "\u207E", "\u207D" ],
|
||
|
[ "\u208D", "\u208E" ], /* Subscript parentheses */
|
||
|
[ "\u208E", "\u208D" ],
|
||
|
[ "\u2264", "\u2265" ], /* Less/greater than or equal */
|
||
|
[ "\u2265", "\u2264" ],
|
||
|
[ "\u2329", "\u232A" ], /* Angle brackets */
|
||
|
[ "\u232A", "\u2329" ],
|
||
|
[ "\uFE59", "\uFE5A" ], /* Small round brackets */
|
||
|
[ "\uFE5A", "\uFE59" ],
|
||
|
[ "\uFE5B", "\uFE5C" ], /* Small curly brackets */
|
||
|
[ "\uFE5C", "\uFE5B" ],
|
||
|
[ "\uFE5D", "\uFE5E" ], /* Small tortoise shell brackets */
|
||
|
[ "\uFE5E", "\uFE5D" ],
|
||
|
[ "\uFE64", "\uFE65" ], /* Small less than/greater than */
|
||
|
[ "\uFE65", "\uFE64" ]
|
||
|
];
|
||
|
var AlefTable = ['\u0622', '\u0623', '\u0625', '\u0627'];
|
||
|
|
||
|
var AlefTableFE = [0xFE81, 0xFE82, 0xFE83, 0xFE84, 0xFE87, 0xFE88, 0xFE8D, 0xFE8E];
|
||
|
|
||
|
var LamTableFE = [0xFEDD, 0xFEDE, 0xFEDF, 0xFEE0];
|
||
|
|
||
|
var LamAlefInialTableFE = ['\ufef5', '\ufef7', '\ufef9', '\ufefb'];
|
||
|
|
||
|
var LamAlefMedialTableFE = ['\ufef6', '\ufef8', '\ufefa', '\ufefc'];
|
||
|
/**
|
||
|
* Arabic Characters in the base form
|
||
|
*/
|
||
|
var BaseForm = ['\u0627', '\u0628', '\u062A', '\u062B', '\u062C', '\u062D', '\u062E', '\u062F', '\u0630', '\u0631', '\u0632', '\u0633', '\u0634', '\u0635', '\u0636', '\u0637', '\u0638', '\u0639', '\u063A', '\u0641', '\u0642', '\u0643', '\u0644', '\u0645', '\u0646', '\u0647', '\u0648', '\u064A', '\u0625', '\u0623', '\u0622', '\u0629', '\u0649', '\u06CC', '\u0626', '\u0624', '\u064B', '\u064C', '\u064D', '\u064E', '\u064F', '\u0650', '\u0651', '\u0652', '\u0621'];
|
||
|
|
||
|
/**
|
||
|
* Arabic shaped characters in Isolated form
|
||
|
*/
|
||
|
var IsolatedForm = ['\uFE8D', '\uFE8F', '\uFE95', '\uFE99', '\uFE9D', '\uFEA1', '\uFEA5', '\uFEA9', '\uFEAB', '\uFEAD', '\uFEAF', '\uFEB1', '\uFEB5', '\uFEB9', '\uFEBD', '\uFEC1', '\uFEC5', '\uFEC9', '\uFECD', '\uFED1', '\uFED5', '\uFED9', '\uFEDD', '\uFEE1', '\uFEE5', '\uFEE9', '\uFEED', '\uFEF1', '\uFE87', '\uFE83', '\uFE81', '\uFE93', '\uFEEF', '\uFBFC', '\uFE89', '\uFE85', '\uFE70', '\uFE72', '\uFE74', '\uFE76', '\uFE78', '\uFE7A', '\uFE7C', '\uFE7E', '\uFE80'];
|
||
|
|
||
|
/**
|
||
|
* Arabic shaped characters in Final form
|
||
|
*/
|
||
|
var FinalForm = ['\uFE8E', '\uFE90', '\uFE96', '\uFE9A', '\uFE9E', '\uFEA2', '\uFEA6', '\uFEAA', '\uFEAC', '\uFEAE', '\uFEB0', '\uFEB2', '\uFEB6', '\uFEBA', '\uFEBE', '\uFEC2', '\uFEC6', '\uFECA', '\uFECE', '\uFED2', '\uFED6', '\uFEDA', '\uFEDE', '\uFEE2', '\uFEE6', '\uFEEA', '\uFEEE', '\uFEF2', '\uFE88', '\uFE84', '\uFE82', '\uFE94', '\uFEF0', '\uFBFD', '\uFE8A', '\uFE86', '\uFE70', '\uFE72', '\uFE74', '\uFE76', '\uFE78', '\uFE7A', '\uFE7C', '\uFE7E', '\uFE80'];
|
||
|
|
||
|
/**
|
||
|
* Arabic shaped characters in Media form
|
||
|
*/
|
||
|
var MedialForm = ['\uFE8E', '\uFE92', '\uFE98', '\uFE9C', '\uFEA0', '\uFEA4', '\uFEA8', '\uFEAA', '\uFEAC', '\uFEAE', '\uFEB0', '\uFEB4', '\uFEB8', '\uFEBC', '\uFEC0', '\uFEC4', '\uFEC8', '\uFECC', '\uFED0', '\uFED4', '\uFED8', '\uFEDC', '\uFEE0', '\uFEE4', '\uFEE8', '\uFEEC', '\uFEEE', '\uFEF4', '\uFE88', '\uFE84', '\uFE82', '\uFE94', '\uFEF0', '\uFBFF', '\uFE8C', '\uFE86', '\uFE71', '\uFE72', '\uFE74', '\uFE77', '\uFE79', '\uFE7B', '\uFE7D', '\uFE7F', '\uFE80'];
|
||
|
|
||
|
/**
|
||
|
* Arabic shaped characters in Initial form
|
||
|
*/
|
||
|
var InitialForm = ['\uFE8D', '\uFE91', '\uFE97', '\uFE9B', '\uFE9F', '\uFEA3', '\uFEA7', '\uFEA9', '\uFEAB', '\uFEAD', '\uFEAF', '\uFEB3', '\uFEB7', '\uFEBB', '\uFEBF', '\uFEC3', '\uFEC7', '\uFECB', '\uFECF', '\uFED3', '\uFED7', '\uFEDB', '\uFEDF', '\uFEE3', '\uFEE7', '\uFEEB', '\uFEED', '\uFEF3', '\uFE87', '\uFE83', '\uFE81', '\uFE93', '\uFEEF', '\uFBFE', '\uFE8B', '\uFE85', '\uFE70', '\uFE72', '\uFE74', '\uFE76', '\uFE78', '\uFE7A', '\uFE7C', '\uFE7E', '\uFE80'];
|
||
|
|
||
|
/**
|
||
|
* Arabic characters that couldn't join to the next character
|
||
|
*/
|
||
|
var StandAlonForm = ['\u0621', '\u0627', '\u062F', '\u0630', '\u0631', '\u0632', '\u0648', '\u0622', '\u0629', '\u0626', '\u0624', '\u0625', '\u0675', '\u0623'];
|
||
|
|
||
|
var FETo06Table = ['\u064B', '\u064B', '\u064C', '\u061F', '\u064D', '\u061F', '\u064E', '\u064E', '\u064F', '\u064F', '\u0650', '\u0650', '\u0651', '\u0651', '\u0652', '\u0652', '\u0621', '\u0622', '\u0622', '\u0623', '\u0623', '\u0624', '\u0624', '\u0625', '\u0625', '\u0626', '\u0626', '\u0626', '\u0626', '\u0627', '\u0627', '\u0628', '\u0628', '\u0628', '\u0628', '\u0629', '\u0629', '\u062A', '\u062A', '\u062A', '\u062A', '\u062B', '\u062B', '\u062B', '\u062B', '\u062C', '\u062C', '\u062C', '\u062c', '\u062D', '\u062D', '\u062D', '\u062D', '\u062E', '\u062E', '\u062E', '\u062E', '\u062F', '\u062F', '\u0630', '\u0630', '\u0631', '\u0631', '\u0632', '\u0632', '\u0633', '\u0633', '\u0633', '\u0633', '\u0634', '\u0634', '\u0634', '\u0634', '\u0635', '\u0635', '\u0635', '\u0635', '\u0636', '\u0636', '\u0636', '\u0636', '\u0637', '\u0637', '\u0637', '\u0637', '\u0638', '\u0638', '\u0638', '\u0638', '\u0639', '\u0639', '\u0639', '\u0639', '\u063A', '\u063A', '\u063A', '\u063A', '\u0641', '\u0641', '\u0641', '\u0641', '\u0642', '\u0642', '\u0642', '\u0642', '\u0643', '\u0643', '\u0643', '\u0643', '\u0644', '\u0644', '\u0644', '\u0644', '\u0645', '\u0645', '\u0645', '\u0645', '\u0646', '\u0646', '\u0646', '\u0646', '\u0647', '\u0647', '\u0647', '\u0647', '\u0648', '\u0648', '\u0649', '\u0649', '\u064A', '\u064A', '\u064A', '\u064A', '\uFEF5', '\uFEF6', '\uFEF7', '\uFEF8', '\uFEF9', '\uFEFA', '\uFEFB', '\uFEFC', '\u061F', '\u061F', '\u061F'];
|
||
|
|
||
|
var ArabicAlefBetIntervalsBegine = ['\u0621', '\u0641'];
|
||
|
|
||
|
var ArabicAlefBetIntervalsEnd = ['\u063A', '\u064a'];
|
||
|
|
||
|
var Link06 = [
|
||
|
1 + 32 + 256 * 0x11,
|
||
|
1 + 32 + 256 * 0x13,
|
||
|
1 + 256 * 0x15,
|
||
|
1 + 32 + 256 * 0x17,
|
||
|
1 + 2 + 256 * 0x19,
|
||
|
1 + 32 + 256 * 0x1D,
|
||
|
1 + 2 + 256 * 0x1F,
|
||
|
1 + 256 * 0x23,
|
||
|
1 + 2 + 256 * 0x25,
|
||
|
1 + 2 + 256 * 0x29,
|
||
|
1 + 2 + 256 * 0x2D,
|
||
|
1 + 2 + 256 * 0x31,
|
||
|
1 + 2 + 256 * 0x35,
|
||
|
1 + 256 * 0x39,
|
||
|
1 + 256 * 0x3B,
|
||
|
1 + 256 * 0x3D,
|
||
|
1 + 256 * 0x3F,
|
||
|
1 + 2 + 256 * 0x41,
|
||
|
1 + 2 + 256 * 0x45,
|
||
|
1 + 2 + 256 * 0x49,
|
||
|
1 + 2 + 256 * 0x4D,
|
||
|
1 + 2 + 256 * 0x51,
|
||
|
1 + 2 + 256 * 0x55,
|
||
|
1 + 2 + 256 * 0x59,
|
||
|
1 + 2 + 256 * 0x5D,
|
||
|
0, 0, 0, 0, 0, /* 0x63B - 0x63F */
|
||
|
1 + 2,
|
||
|
1 + 2 + 256 * 0x61,
|
||
|
1 + 2 + 256 * 0x65,
|
||
|
1 + 2 + 256 * 0x69,
|
||
|
1 + 2 + 16 + 256 * 0x6D,
|
||
|
1 + 2 + 256 * 0x71,
|
||
|
1 + 2 + 256 * 0x75,
|
||
|
1 + 2 + 256 * 0x79,
|
||
|
1 + 256 * 0x7D,
|
||
|
1 + 256 * 0x7F,
|
||
|
1 + 2 + 256 * 0x81,
|
||
|
4, 4, 4, 4,
|
||
|
4, 4, 4, 4, /* 0x64B - 0x652 */
|
||
|
0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, /* 0x653 - 0x65B */
|
||
|
1 + 256 * 0x85,
|
||
|
1 + 256 * 0x87,
|
||
|
1 + 256 * 0x89,
|
||
|
1 + 256 * 0x8B,
|
||
|
0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0,/* 0x660 - 0x66F */
|
||
|
4,
|
||
|
0,
|
||
|
1 + 32,
|
||
|
1 + 32,
|
||
|
0,
|
||
|
1 + 32,
|
||
|
1, 1,
|
||
|
1+2, 1+2, 1+2, 1+2, 1+2, 1+2,
|
||
|
1+2, 1+2, 1+2, 1+2, 1+2, 1+2,
|
||
|
1+2, 1+2, 1+2, 1+2,
|
||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2,
|
||
|
1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2,
|
||
|
1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2,
|
||
|
1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, 1+2,
|
||
|
1,
|
||
|
1+2,
|
||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
1+2,
|
||
|
1,
|
||
|
1+2, 1+2, 1+2, 1+2,
|
||
|
1, 1
|
||
|
];
|
||
|
|
||
|
var LinkFE = [
|
||
|
1 + 2,
|
||
|
1 + 2,
|
||
|
1 + 2, 0, 1+ 2, 0, 1+ 2,
|
||
|
1 + 2,
|
||
|
1+ 2, 1 + 2, 1+2, 1 + 2,
|
||
|
1+ 2, 1 + 2, 1+2, 1 + 2,
|
||
|
0, 0 + 32, 1 + 32, 0 + 32,
|
||
|
1 + 32, 0, 1, 0 + 32,
|
||
|
1 + 32, 0, 2, 1 + 2,
|
||
|
1, 0 + 32, 1 + 32, 0,
|
||
|
2, 1 + 2, 1, 0,
|
||
|
1, 0, 2, 1 + 2,
|
||
|
1, 0, 2, 1 + 2,
|
||
|
1, 0, 2, 1 + 2,
|
||
|
1, 0, 2, 1 + 2,
|
||
|
1, 0, 2, 1 + 2,
|
||
|
1, 0, 1, 0,
|
||
|
1, 0, 1, 0,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0 + 16, 2 + 16, 1 + 2 +16,
|
||
|
1 + 16, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 1, 0,
|
||
|
1, 0, 2, 1+2,
|
||
|
1, 0, 1, 0,
|
||
|
1, 0, 1, 0,
|
||
|
1
|
||
|
];
|
||
|
var impTab_LTR = [
|
||
|
/* L, R, EN, AN, N, IL, Cond */
|
||
|
/* 0 LTR text */ [ 0, 3, 0, 1, 0, 0, 0 ],
|
||
|
/* 1 LTR+AN */ [ 0, 3, 0, 1, 2, 2, 0 ],
|
||
|
/* 2 LTR+AN+N */ [ 0, 3, 0, 0x11, 2, 0, 1 ],
|
||
|
/* 3 RTL text */ [ 0, 3, 5, 5, 4, 1, 0 ],
|
||
|
/* 4 RTL cont */ [ 0, 3, 0x15, 0x15, 4, 0, 1 ],
|
||
|
/* 5 RTL+EN/AN */ [ 0, 3, 5, 5, 4, 2, 0 ]
|
||
|
];
|
||
|
var impTab_RTL = [
|
||
|
/* L, R, EN, AN, N, IL, Cond */
|
||
|
/* 0 RTL text */ [ 2, 0, 1, 1, 0, 1, 0 ],
|
||
|
/* 1 RTL+EN/AN */ [ 2, 0, 1, 1, 0, 2, 0 ],
|
||
|
/* 2 LTR text */ [ 2, 0, 2, 1, 3, 2, 0 ],
|
||
|
/* 3 LTR+cont */ [ 2, 0, 2, 0x21, 3, 1, 1 ]
|
||
|
];
|
||
|
|
||
|
var UBAT_L = 0; /* left to right */
|
||
|
var UBAT_R = 1; /* right to left */
|
||
|
var UBAT_EN = 2; /* European digit */
|
||
|
var UBAT_AN = 3; /* Arabic-Indic digit */
|
||
|
var UBAT_ON = 4; /* neutral */
|
||
|
var UBAT_B = 5; /* block separator */
|
||
|
var UBAT_S = 6; /* segment separator */
|
||
|
var UBAT_AL = 7; /* Arabic Letter */
|
||
|
var UBAT_WS = 8; /* white space */
|
||
|
var UBAT_CS = 9; /* common digit separator */
|
||
|
var UBAT_ES = 10; /* European digit separator */
|
||
|
var UBAT_ET = 11; /* European digit terminator */
|
||
|
var UBAT_NSM = 12; /* Non Spacing Mark */
|
||
|
var UBAT_LRE = 13; /* LRE */
|
||
|
var UBAT_RLE = 14; /* RLE */
|
||
|
var UBAT_PDF = 15; /* PDF */
|
||
|
var UBAT_LRO = 16; /* LRO */
|
||
|
var UBAT_RLO = 17; /* RLO */
|
||
|
var UBAT_BN = 18; /* Boundary Neutral */
|
||
|
|
||
|
var TBBASE = 100;
|
||
|
|
||
|
var TB00 = TBBASE + 0;
|
||
|
var TB05 = TBBASE + 1;
|
||
|
var TB06 = TBBASE + 2;
|
||
|
var TB07 = TBBASE + 3;
|
||
|
var TB20 = TBBASE + 4;
|
||
|
var TBFB = TBBASE + 5;
|
||
|
var TBFE = TBBASE + 6;
|
||
|
var TBFF = TBBASE + 7;
|
||
|
|
||
|
var L = UBAT_L;
|
||
|
var R = UBAT_R;
|
||
|
var EN = UBAT_EN;
|
||
|
var AN = UBAT_AN;
|
||
|
var ON = UBAT_ON;
|
||
|
var B = UBAT_B;
|
||
|
var S = UBAT_S;
|
||
|
var AL = UBAT_AL;
|
||
|
var WS = UBAT_WS;
|
||
|
var CS = UBAT_CS;
|
||
|
var ES = UBAT_ES;
|
||
|
var ET = UBAT_ET;
|
||
|
var NSM = UBAT_NSM;
|
||
|
var LRE = UBAT_LRE;
|
||
|
var RLE = UBAT_RLE;
|
||
|
var PDF = UBAT_PDF;
|
||
|
var LRO = UBAT_LRO;
|
||
|
var RLO = UBAT_RLO;
|
||
|
var BN = UBAT_BN;
|
||
|
|
||
|
var MasterTable = [
|
||
|
/************************************************************************************************************************************/
|
||
|
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||
|
/************************************************************************************************************************************/
|
||
|
/*0-*/ TB00, L , L , L , L , TB05, TB06, TB07, R , L , L , L , L , L , L , L ,
|
||
|
/*1-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*2-*/ TB20, ON , ON , ON , L , ON , L , ON , L , ON , ON , ON , L , L , ON , ON ,
|
||
|
/*3-*/ L , L , L , L , L , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*4-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , L , L , ON ,
|
||
|
/*5-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*6-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*7-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*8-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*9-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , L ,
|
||
|
/*A-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , ON , ON , ON ,
|
||
|
/*B-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*C-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*D-*/ ON , ON , ON , ON , ON , ON , ON , L , L , ON , ON , L , L , ON , ON , L ,
|
||
|
/*E-*/ L , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*F-*/ ON , ON , ON , ON , ON , ON , ON , ON , L , L , L , TBFB, AL , AL , TBFE, TBFF
|
||
|
];
|
||
|
|
||
|
delete TB00;
|
||
|
delete TB05;
|
||
|
delete TB06;
|
||
|
delete TB07;
|
||
|
delete TB20;
|
||
|
delete TBFB;
|
||
|
delete TBFE;
|
||
|
delete TBFF;
|
||
|
|
||
|
var UnicodeTable = [
|
||
|
[ /* Table 00: Unicode 00xx */
|
||
|
/************************************************************************************************************************************/
|
||
|
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||
|
/************************************************************************************************************************************/
|
||
|
/*0-*/ BN , BN , BN , BN , BN , BN , BN , BN , BN , S , B , S , WS , B , BN , BN ,
|
||
|
/*1-*/ BN , BN , BN , BN , BN , BN , BN , BN , BN , BN , BN , BN , B , B , B , S ,
|
||
|
/*2-*/ WS , ON , ON , ET , ET , ET , ON , ON , ON , ON , ON , ES , CS , ES , CS , CS ,
|
||
|
/*3-*/ EN , EN , EN , EN , EN , EN , EN , EN , EN , EN , CS , ON , ON , ON , ON , ON ,
|
||
|
/*4-*/ ON , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*5-*/ L , L , L , L , L , L , L , L , L , L , L , ON , ON , ON , ON , ON ,
|
||
|
/*6-*/ ON , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*7-*/ L , L , L , L , L , L , L , L , L , L , L , ON , ON , ON , ON , BN ,
|
||
|
/*8-*/ BN , BN , BN , BN , BN , B , BN , BN , BN , BN , BN , BN , BN , BN , BN , BN ,
|
||
|
/*9-*/ BN , BN , BN , BN , BN , BN , BN , BN , BN , BN , BN , BN , BN , BN , BN , BN ,
|
||
|
/*A-*/ CS , ON , ET , ET , ET , ET , ON , ON , ON , ON , L , ON , ON , BN , ON , ON ,
|
||
|
/*B-*/ ET , ET , EN , EN , ON , L , ON , ON , ON , EN , L , ON , ON , ON , ON , ON ,
|
||
|
/*C-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*D-*/ L , L , L , L , L , L , L , ON , L , L , L , L , L , L , L , L ,
|
||
|
/*E-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*F-*/ L , L , L , L , L , L , L , ON , L , L , L , L , L , L , L , L
|
||
|
],
|
||
|
[ /* Table 01: Unicode 05xx */
|
||
|
/************************************************************************************************************************************/
|
||
|
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||
|
/************************************************************************************************************************************/
|
||
|
/*0-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*1-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*2-*/ L , L , L , L , L , L , L , L , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*3-*/ ON , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*4-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*5-*/ L , L , L , L , L , L , L , ON , ON , L , L , L , L , L , L , L ,
|
||
|
/*6-*/ ON , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*7-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*8-*/ L , L , L , L , L , L , L , L , ON , L , ON , ON , ON , ON , ON , ON ,
|
||
|
/*9-*/ ON , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM ,
|
||
|
/*A-*/ NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM ,
|
||
|
/*B-*/ NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , R , NSM ,
|
||
|
/*C-*/ R , NSM , NSM , R , NSM , NSM , R , NSM , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*D-*/ R , R , R , R , R , R , R , R , R , R , R , R , R , R , R , R ,
|
||
|
/*E-*/ R , R , R , R , R , R , R , R , R , R , R , ON , ON , ON , ON , ON ,
|
||
|
/*F-*/ R , R , R , R , R , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON
|
||
|
],
|
||
|
[ /* Table 02: Unicode 06xx */
|
||
|
/************************************************************************************************************************************/
|
||
|
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||
|
/************************************************************************************************************************************/
|
||
|
/*0-*/ AN , AN , AN , AN , ON , ON , ON , ON , AL , ET , ET , AL , CS , AL , ON , ON ,
|
||
|
/*1-*/ NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , AL , ON , ON , AL , AL ,
|
||
|
/*2-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*3-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*4-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , NSM , NSM , NSM , NSM , NSM ,
|
||
|
/*5-*/ NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM ,
|
||
|
/*6-*/ AN , AN , AN , AN , AN , AN , AN , AN , AN , AN , ET , AN , AN , AL , AL , AL ,
|
||
|
/*7-*/ NSM , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*8-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*9-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*A-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*B-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*C-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*D-*/ AL , AL , AL , AL , AL , AL , NSM , NSM , NSM , NSM , NSM , NSM , NSM , AN , ON , NSM ,
|
||
|
/*E-*/ NSM , NSM , NSM , NSM , NSM , AL , AL , NSM , NSM , ON , NSM , NSM , NSM , NSM , AL , AL ,
|
||
|
/*F-*/ EN , EN , EN , EN , EN , EN , EN , EN , EN , EN , AL , AL , AL , AL , AL , AL
|
||
|
],
|
||
|
[ /* Table 03: Unicode 07xx */
|
||
|
/************************************************************************************************************************************/
|
||
|
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||
|
/************************************************************************************************************************************/
|
||
|
/*0-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , ON , AL ,
|
||
|
/*1-*/ AL , NSM , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*2-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*3-*/ NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM ,
|
||
|
/*4-*/ NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , ON , ON , AL , AL , AL ,
|
||
|
/*5-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*6-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*7-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*8-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*9-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*A-*/ AL , AL , AL , AL , AL , AL , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM ,
|
||
|
/*B-*/ NSM , AL , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*C-*/ R , R , R , R , R , R , R , R , R , R , R , R , R , R , R , R ,
|
||
|
/*D-*/ R , R , R , R , R , R , R , R , R , R , R , R , R , R , R , R ,
|
||
|
/*E-*/ R , R , R , R , R , R , R , R , R , R , R , NSM , NSM , NSM , NSM , NSM ,
|
||
|
/*F-*/ NSM , NSM , NSM , NSM , R , R , ON , ON , ON , ON , R , ON , ON , ON , ON , ON
|
||
|
],
|
||
|
[ /* Table 04: Unicode 20xx */
|
||
|
/************************************************************************************************************************************/
|
||
|
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||
|
/************************************************************************************************************************************/
|
||
|
/*0-*/ WS , WS , WS , WS , WS , WS , WS , WS , WS , WS , WS , BN , BN , BN , L , R ,
|
||
|
/*1-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*2-*/ ON , ON , ON , ON , ON , ON , ON , ON , WS , B , LRE , RLE , PDF , LRO , RLO , CS ,
|
||
|
/*3-*/ ET , ET , ET , ET , ET , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*4-*/ ON , ON , ON , ON , CS , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*5-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , WS ,
|
||
|
/*6-*/ BN , BN , BN , BN , BN , ON , ON , ON , ON , ON , BN , BN , BN , BN , BN , BN ,
|
||
|
/*7-*/ EN , L , ON , ON , EN , EN , EN , EN , EN , EN , ES , ES , ON , ON , ON , L ,
|
||
|
/*8-*/ EN , EN , EN , EN , EN , EN , EN , EN , EN , EN , ES , ES , ON , ON , ON , ON ,
|
||
|
/*9-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , ON , ON , ON ,
|
||
|
/*A-*/ ET , ET , ET , ET , ET , ET , ET , ET , ET , ET , ET , ET , ET , ET , ET , ET ,
|
||
|
/*B-*/ ET , ET , ET , ET , ET , ET , ET , ET , ET , ET , ON , ON , ON , ON , ON , ON ,
|
||
|
/*C-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*D-*/ NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM ,
|
||
|
/*E-*/ NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM ,
|
||
|
/*F-*/ NSM , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON
|
||
|
],
|
||
|
[ /* Table 05: Unicode FBxx */
|
||
|
/************************************************************************************************************************************/
|
||
|
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||
|
/************************************************************************************************************************************/
|
||
|
/*0-*/ L , L , L , L , L , L , L , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*1-*/ ON , ON , ON , L , L , L , L , L , ON , ON , ON , ON , ON , R , NSM , R ,
|
||
|
/*2-*/ R , R , R , R , R , R , R , R , R , ES , R , R , R , R , R , R ,
|
||
|
/*3-*/ R , R , R , R , R , R , R , ON , R , R , R , R , R , ON , R , ON ,
|
||
|
/*4-*/ R , R , ON , R , R , ON , R , R , R , R , R , R , R , R , R , R ,
|
||
|
/*5-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*6-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*7-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*8-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*9-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*A-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*B-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*C-*/ AL , AL , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*D-*/ ON , ON , ON , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*E-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*F-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL
|
||
|
],
|
||
|
[ /* Table 06: Unicode FExx */
|
||
|
/************************************************************************************************************************************/
|
||
|
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||
|
/************************************************************************************************************************************/
|
||
|
/*0-*/ NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM , NSM ,
|
||
|
/*1-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*2-*/ NSM , NSM , NSM , NSM , NSM , NSM , NSM , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*3-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*4-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*5-*/ CS , ON , CS , ON , ON , CS , ON , ON , ON , ON , ON , ON , ON , ON , ON , ET ,
|
||
|
/*6-*/ ON , ON , ES , ES , ON , ON , ON , ON , ON , ET , ET , ON , ON , ON , ON , ON ,
|
||
|
/*7-*/ AL , AL , AL , AL , AL , ON , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*8-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*9-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*A-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*B-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*C-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*D-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*E-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL ,
|
||
|
/*F-*/ AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , AL , ON , ON , BN
|
||
|
],
|
||
|
[ /* Table 07: Unicode FFxx */
|
||
|
/************************************************************************************************************************************/
|
||
|
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||
|
/************************************************************************************************************************************/
|
||
|
/*0-*/ ON , ON , ON , ET , ET , ET , ON , ON , ON , ON , ON , ES , CS , ES , CS , CS ,
|
||
|
/*1-*/ EN , EN , EN , EN , EN , EN , EN , EN , EN , EN , CS , ON , ON , ON , ON , ON ,
|
||
|
/*2-*/ ON , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*3-*/ L , L , L , L , L , L , L , L , L , L , L , ON , ON , ON , ON , ON ,
|
||
|
/*4-*/ ON , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*5-*/ L , L , L , L , L , L , L , L , L , L , L , ON , ON , ON , ON , ON ,
|
||
|
/*6-*/ ON , ON , ON , ON , ON , ON , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*7-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*8-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*9-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*A-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , L ,
|
||
|
/*B-*/ L , L , L , L , L , L , L , L , L , L , L , L , L , L , L , ON ,
|
||
|
/*C-*/ ON , ON , L , L , L , L , L , L , ON , ON , L , L , L , L , L , L ,
|
||
|
/*D-*/ ON , ON , L , L , L , L , L , L , ON , ON , L , L , L , ON , ON , ON ,
|
||
|
/*E-*/ ET , ET , ON , ON , ON , ET , ET , ON , ON , ON , ON , ON , ON , ON , ON , ON ,
|
||
|
/*F-*/ ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON , ON
|
||
|
]
|
||
|
];
|
||
|
|
||
|
delete L;
|
||
|
delete R;
|
||
|
delete EN;
|
||
|
delete AN;
|
||
|
delete ON;
|
||
|
delete B;
|
||
|
delete S;
|
||
|
delete AL;
|
||
|
delete WS;
|
||
|
delete CS;
|
||
|
delete ES;
|
||
|
delete ET;
|
||
|
delete NSM;
|
||
|
delete LRE;
|
||
|
delete RLE;
|
||
|
delete PDF;
|
||
|
delete LRO;
|
||
|
delete RLO;
|
||
|
delete BN;
|
||
|
|
||
|
return dojox.string.BidiEngine;
|
||
|
});
|