1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
// Copyright 2015 The Servo Project Developers. // Copyright 2017 The UNIC Project Developers. // // See the COPYRIGHT file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms. #![forbid(unsafe_code, missing_docs)] //! # UNIC — Unicode Bidirectional Algorithm //! //! A component of [`unic`: Unicode and Internationalization Crates for Rust](/unic/). //! //! This UNIC component implements algorithms from [Unicode Standard Annex #9 - Unicode //! Bidirectional Algorithm](http://unicode.org/reports/tr9/), a.k.a. *UBA*, used for display of //! mixed right-to-left and left-to-right text. It is written in safe Rust, compatible with the //! current stable release. //! //! //! ## Example //! //! ```rust //! use unic_bidi::BidiInfo; //! //! // This example text is defined using `concat!` because some browsers //! // and text editors have trouble displaying bidi strings. //! let text = concat![ //! "א", //! "ב", //! "ג", //! "a", //! "b", //! "c", //! ]; //! //! // Resolve embedding levels within the text. Pass `None` to detect the //! // paragraph level automatically. //! let bidi_info = BidiInfo::new(&text, None); //! //! // This paragraph has embedding level 1 because its first strong character is RTL. //! assert_eq!(bidi_info.paragraphs.len(), 1); //! let para = &bidi_info.paragraphs[0]; //! assert_eq!(para.level.number(), 1); //! assert_eq!(para.level.is_rtl(), true); //! //! // Re-ordering is done after wrapping each paragraph into a sequence of //! // lines. For this example, I'll just use a single line that spans the //! // entire paragraph. //! let line = para.range.clone(); //! //! let display = bidi_info.reorder_line(para, line); //! assert_eq!(display, concat![ //! "a", //! "b", //! "c", //! "ג", //! "ב", //! "א", //! ]); //! ``` //! //! [tr9]: http://www.unicode.org/reports/tr9/ extern crate unic_ucd_bidi; #[macro_use] extern crate matches; #[cfg(feature = "serde")] #[macro_use] extern crate serde; #[cfg(all(feature = "serde", test))] extern crate serde_test; pub mod format_chars; pub mod level; mod bidi_info; mod explicit; mod implicit; mod prepare; pub use unic_ucd_bidi::UNICODE_VERSION; pub use unic_ucd_bidi::{bidi_class, BidiClass, BidiClassCategory}; pub use bidi_info::{BidiInfo, ParagraphInfo}; pub use level::Level; pub use prepare::LevelRun; /// UNIC component version. pub const PKG_VERSION: &'static str = env!("CARGO_PKG_VERSION"); /// UNIC component name. pub const PKG_NAME: &'static str = env!("CARGO_PKG_NAME"); /// UNIC component description. pub const PKG_DESCRIPTION: &'static str = env!("CARGO_PKG_DESCRIPTION");