/** * Copyright (c) 2013-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @providesModule UnicodeBidiService * @typechecks * @flow */ /** * Stateful API for text direction detection * * This class can be used in applications where you need to detect the * direction of a sequence of text blocks, where each direction shall be used * as the fallback direction for the next one. * * NOTE: A default direction, if not provided, is set based on the global * direction, as defined by `UnicodeBidiDirection`. * * == Example == * ``` * var UnicodeBidiService = require('UnicodeBidiService'); * * var bidiService = new UnicodeBidiService(); * * ... * * bidiService.reset(); * for (var para in paragraphs) { * var dir = bidiService.getDirection(para); * ... * } * ``` * * Part of our implementation of Unicode Bidirectional Algorithm (UBA) * Unicode Standard Annex #9 (UAX9) * http://www.unicode.org/reports/tr9/ */ 'use strict'; const UnicodeBidi = require('./UnicodeBidi'); const UnicodeBidiDirection = require('./UnicodeBidiDirection'); const invariant = require('./invariant'); import type { BidiDirection } from './UnicodeBidiDirection'; class UnicodeBidiService { _defaultDir: BidiDirection; _lastDir: BidiDirection; /** * Stateful class for paragraph direction detection * * @param defaultDir Default direction of the service */ constructor(defaultDir: ?BidiDirection) { if (!defaultDir) { defaultDir = UnicodeBidiDirection.getGlobalDir(); } else { invariant(UnicodeBidiDirection.isStrong(defaultDir), 'Default direction must be a strong direction (LTR or RTL)'); } this._defaultDir = defaultDir; this.reset(); } /** * Reset the internal state * * Instead of creating a new instance, you can just reset() your instance * everytime you start a new loop. */ reset(): void { this._lastDir = this._defaultDir; } /** * Returns the direction of a block of text, and remembers it as the * fall-back direction for the next paragraph. * * @param str A text block, e.g. paragraph, table cell, tag * @return The resolved direction */ getDirection(str: string): BidiDirection { this._lastDir = UnicodeBidi.getDirection(str, this._lastDir); return this._lastDir; } } module.exports = UnicodeBidiService;