1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- /**
- * 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;
|