112 lines
2.8 KiB
Plaintext
112 lines
2.8 KiB
Plaintext
|
/**
|
||
|
* Copyright (c) 2013-present, Facebook, Inc.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* This source code is licensed under the BSD-style license found in the
|
||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||
|
*
|
||
|
* @providesModule UnicodeBidiDirection
|
||
|
* @typechecks
|
||
|
* @flow
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Constants to represent text directionality
|
||
|
*
|
||
|
* Also defines a *global* direciton, to be used in bidi algorithms as a
|
||
|
* default fallback direciton, when no better direction is found or provided.
|
||
|
*
|
||
|
* NOTE: Use `setGlobalDir()`, or update `initGlobalDir()`, to set the initial
|
||
|
* global direction value based on the application.
|
||
|
*
|
||
|
* Part of the implementation of Unicode Bidirectional Algorithm (UBA)
|
||
|
* Unicode Standard Annex #9 (UAX9)
|
||
|
* http://www.unicode.org/reports/tr9/
|
||
|
*/
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
const invariant = require('./invariant');
|
||
|
|
||
|
export type BidiDirection = 'LTR' | 'RTL' | 'NEUTRAL';
|
||
|
export type HTMLDir = 'ltr' | 'rtl';
|
||
|
|
||
|
const NEUTRAL = 'NEUTRAL'; // No strong direction
|
||
|
const LTR = 'LTR'; // Left-to-Right direction
|
||
|
const RTL = 'RTL'; // Right-to-Left direction
|
||
|
|
||
|
let globalDir: ?BidiDirection = null;
|
||
|
|
||
|
// == Helpers ==
|
||
|
|
||
|
/**
|
||
|
* Check if a directionality value is a Strong one
|
||
|
*/
|
||
|
function isStrong(dir: BidiDirection): boolean {
|
||
|
return dir === LTR || dir === RTL;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get string value to be used for `dir` HTML attribute or `direction` CSS
|
||
|
* property.
|
||
|
*/
|
||
|
function getHTMLDir(dir: BidiDirection): HTMLDir {
|
||
|
invariant(isStrong(dir), '`dir` must be a strong direction to be converted to HTML Direction');
|
||
|
return dir === LTR ? 'ltr' : 'rtl';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get string value to be used for `dir` HTML attribute or `direction` CSS
|
||
|
* property, but returns null if `dir` has same value as `otherDir`.
|
||
|
* `null`.
|
||
|
*/
|
||
|
function getHTMLDirIfDifferent(dir: BidiDirection, otherDir: BidiDirection): ?HTMLDir {
|
||
|
invariant(isStrong(dir), '`dir` must be a strong direction to be converted to HTML Direction');
|
||
|
invariant(isStrong(otherDir), '`otherDir` must be a strong direction to be converted to HTML Direction');
|
||
|
return dir === otherDir ? null : getHTMLDir(dir);
|
||
|
}
|
||
|
|
||
|
// == Global Direction ==
|
||
|
|
||
|
/**
|
||
|
* Set the global direction.
|
||
|
*/
|
||
|
function setGlobalDir(dir: BidiDirection): void {
|
||
|
globalDir = dir;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Initialize the global direction
|
||
|
*/
|
||
|
function initGlobalDir(): void {
|
||
|
setGlobalDir(LTR);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the global direction
|
||
|
*/
|
||
|
function getGlobalDir(): BidiDirection {
|
||
|
if (!globalDir) {
|
||
|
this.initGlobalDir();
|
||
|
}
|
||
|
invariant(globalDir, 'Global direction not set.');
|
||
|
return globalDir;
|
||
|
}
|
||
|
|
||
|
const UnicodeBidiDirection = {
|
||
|
// Values
|
||
|
NEUTRAL,
|
||
|
LTR,
|
||
|
RTL,
|
||
|
// Helpers
|
||
|
isStrong,
|
||
|
getHTMLDir,
|
||
|
getHTMLDirIfDifferent,
|
||
|
// Global Direction
|
||
|
setGlobalDir,
|
||
|
initGlobalDir,
|
||
|
getGlobalDir
|
||
|
};
|
||
|
|
||
|
module.exports = UnicodeBidiDirection;
|