diff --git a/client/components/auto-direction/direction.js b/client/components/auto-direction/direction.js new file mode 100644 index 00000000000000..5da22e0c1325a5 --- /dev/null +++ b/client/components/auto-direction/direction.js @@ -0,0 +1,809 @@ +// Strong directionality characters +// http://www.unicode.org/reports/tr9/#Bidirectional_Character_Types +const RIGHT_TO_LEFT = [ + // R: + [ 0x5be, 0x5be ], + [ 0x5c0, 0x5c0 ], + [ 0x5c3, 0x5c3 ], + [ 0x5c6, 0x5c6 ], + [ 0x5d0, 0x5ea ], + [ 0x5f0, 0x5f4 ], + [ 0x7c0, 0x7ea ], + [ 0x7f4, 0x7f5 ], + [ 0x7fa, 0x7fa ], + [ 0x800, 0x815 ], + [ 0x81a, 0x81a ], + [ 0x824, 0x824 ], + [ 0x828, 0x828 ], + [ 0x830, 0x83e ], + [ 0x840, 0x858 ], + [ 0x85e, 0x85e ], + [ 0x200f, 0x200f ], + [ 0xfb1d, 0xfb1d ], + [ 0xfb1f, 0xfb28 ], + [ 0xfb2a, 0xfb36 ], + [ 0xfb38, 0xfb3c ], + [ 0xfb3e, 0xfb3e ], + [ 0xfb40, 0xfb41 ], + [ 0xfb43, 0xfb44 ], + [ 0xfb46, 0xfb4f ], + [ 0x10800, 0x10805 ], + [ 0x10808, 0x10808 ], + [ 0x1080a, 0x10835 ], + [ 0x10837, 0x10838 ], + [ 0x1083c, 0x1083c ], + [ 0x1083f, 0x10855 ], + [ 0x10857, 0x1089e ], + [ 0x108a7, 0x108af ], + [ 0x108e0, 0x108f2 ], + [ 0x108f4, 0x108f5 ], + [ 0x108fb, 0x1091b ], + [ 0x10920, 0x10939 ], + [ 0x1093f, 0x1093f ], + [ 0x10980, 0x109b7 ], + [ 0x109bc, 0x109cf ], + [ 0x109d2, 0x10a00 ], + [ 0x10a10, 0x10a13 ], + [ 0x10a15, 0x10a17 ], + [ 0x10a19, 0x10a33 ], + [ 0x10a40, 0x10a47 ], + [ 0x10a50, 0x10a58 ], + [ 0x10a60, 0x10a9f ], + [ 0x10ac0, 0x10ae4 ], + [ 0x10aeb, 0x10af6 ], + [ 0x10b00, 0x10b35 ], + [ 0x10b40, 0x10b55 ], + [ 0x10b58, 0x10b72 ], + [ 0x10b78, 0x10b91 ], + [ 0x10b99, 0x10b9c ], + [ 0x10ba9, 0x10baf ], + [ 0x10c00, 0x10c48 ], + [ 0x10c80, 0x10cb2 ], + [ 0x10cc0, 0x10cf2 ], + [ 0x10cfa, 0x10cff ], + [ 0x1e800, 0x1e8c4 ], + [ 0x1e8c7, 0x1e8cf ], + [ 0x1e900, 0x1e943 ], + [ 0x1e950, 0x1e959 ], + [ 0x1e95e, 0x1e95f ], + + // AL: + [ 0x608, 0x608 ], + [ 0x60b, 0x60b ], + [ 0x60d, 0x60d ], + [ 0x61b, 0x61c ], + [ 0x61e, 0x64a ], + [ 0x66d, 0x66f ], + [ 0x671, 0x6d5 ], + [ 0x6e5, 0x6e6 ], + [ 0x6ee, 0x6ef ], + [ 0x6fa, 0x70d ], + [ 0x70f, 0x710 ], + [ 0x712, 0x72f ], + [ 0x74d, 0x7a5 ], + [ 0x7b1, 0x7b1 ], + [ 0x8a0, 0x8b4 ], + [ 0x8b6, 0x8bd ], + [ 0xfb50, 0xfbc1 ], + [ 0xfbd3, 0xfd3d ], + [ 0xfd50, 0xfd8f ], + [ 0xfd92, 0xfdc7 ], + [ 0xfdf0, 0xfdfc ], + [ 0xfe70, 0xfe74 ], + [ 0xfe76, 0xfefc ], + [ 0x1ee00, 0x1ee03 ], + [ 0x1ee05, 0x1ee1f ], + [ 0x1ee21, 0x1ee22 ], + [ 0x1ee24, 0x1ee24 ], + [ 0x1ee27, 0x1ee27 ], + [ 0x1ee29, 0x1ee32 ], + [ 0x1ee34, 0x1ee37 ], + [ 0x1ee39, 0x1ee39 ], + [ 0x1ee3b, 0x1ee3b ], + [ 0x1ee42, 0x1ee42 ], + [ 0x1ee47, 0x1ee47 ], + [ 0x1ee49, 0x1ee49 ], + [ 0x1ee4b, 0x1ee4b ], + [ 0x1ee4d, 0x1ee4f ], + [ 0x1ee51, 0x1ee52 ], + [ 0x1ee54, 0x1ee54 ], + [ 0x1ee57, 0x1ee57 ], + [ 0x1ee59, 0x1ee59 ], + [ 0x1ee5b, 0x1ee5b ], + [ 0x1ee5d, 0x1ee5d ], + [ 0x1ee5f, 0x1ee5f ], + [ 0x1ee61, 0x1ee62 ], + [ 0x1ee64, 0x1ee64 ], + [ 0x1ee67, 0x1ee6a ], + [ 0x1ee6c, 0x1ee72 ], + [ 0x1ee74, 0x1ee77 ], + [ 0x1ee79, 0x1ee7c ], + [ 0x1ee7e, 0x1ee7e ], + [ 0x1ee80, 0x1ee89 ], + [ 0x1ee8b, 0x1ee9b ], + [ 0x1eea1, 0x1eea3 ], + [ 0x1eea5, 0x1eea9 ], + [ 0x1eeab, 0x1eebb ] +]; + +const LEFT_TO_RIGHT = [ + [ 0x41, 0x5a ], + [ 0x61, 0x7a ], + [ 0xaa, 0xaa ], + [ 0xb5, 0xb5 ], + [ 0xba, 0xba ], + [ 0xc0, 0xd6 ], + [ 0xd8, 0xf6 ], + [ 0xf8, 0x2b8 ], + [ 0x2bb, 0x2c1 ], + [ 0x2d0, 0x2d1 ], + [ 0x2e0, 0x2e4 ], + [ 0x2ee, 0x2ee ], + [ 0x370, 0x373 ], + [ 0x376, 0x377 ], + [ 0x37a, 0x37d ], + [ 0x37f, 0x37f ], + [ 0x386, 0x386 ], + [ 0x388, 0x38a ], + [ 0x38c, 0x38c ], + [ 0x38e, 0x3a1 ], + [ 0x3a3, 0x3f5 ], + [ 0x3f7, 0x482 ], + [ 0x48a, 0x52f ], + [ 0x531, 0x556 ], + [ 0x559, 0x55f ], + [ 0x561, 0x587 ], + [ 0x589, 0x589 ], + [ 0x903, 0x939 ], + [ 0x93b, 0x93b ], + [ 0x93d, 0x940 ], + [ 0x949, 0x94c ], + [ 0x94e, 0x950 ], + [ 0x958, 0x961 ], + [ 0x964, 0x980 ], + [ 0x982, 0x983 ], + [ 0x985, 0x98c ], + [ 0x98f, 0x990 ], + [ 0x993, 0x9a8 ], + [ 0x9aa, 0x9b0 ], + [ 0x9b2, 0x9b2 ], + [ 0x9b6, 0x9b9 ], + [ 0x9bd, 0x9c0 ], + [ 0x9c7, 0x9c8 ], + [ 0x9cb, 0x9cc ], + [ 0x9ce, 0x9ce ], + [ 0x9d7, 0x9d7 ], + [ 0x9dc, 0x9dd ], + [ 0x9df, 0x9e1 ], + [ 0x9e6, 0x9f1 ], + [ 0x9f4, 0x9fa ], + [ 0xa03, 0xa03 ], + [ 0xa05, 0xa0a ], + [ 0xa0f, 0xa10 ], + [ 0xa13, 0xa28 ], + [ 0xa2a, 0xa30 ], + [ 0xa32, 0xa33 ], + [ 0xa35, 0xa36 ], + [ 0xa38, 0xa39 ], + [ 0xa3e, 0xa40 ], + [ 0xa59, 0xa5c ], + [ 0xa5e, 0xa5e ], + [ 0xa66, 0xa6f ], + [ 0xa72, 0xa74 ], + [ 0xa83, 0xa83 ], + [ 0xa85, 0xa8d ], + [ 0xa8f, 0xa91 ], + [ 0xa93, 0xaa8 ], + [ 0xaaa, 0xab0 ], + [ 0xab2, 0xab3 ], + [ 0xab5, 0xab9 ], + [ 0xabd, 0xac0 ], + [ 0xac9, 0xac9 ], + [ 0xacb, 0xacc ], + [ 0xad0, 0xad0 ], + [ 0xae0, 0xae1 ], + [ 0xae6, 0xaf0 ], + [ 0xaf9, 0xaf9 ], + [ 0xb02, 0xb03 ], + [ 0xb05, 0xb0c ], + [ 0xb0f, 0xb10 ], + [ 0xb13, 0xb28 ], + [ 0xb2a, 0xb30 ], + [ 0xb32, 0xb33 ], + [ 0xb35, 0xb39 ], + [ 0xb3d, 0xb3e ], + [ 0xb40, 0xb40 ], + [ 0xb47, 0xb48 ], + [ 0xb4b, 0xb4c ], + [ 0xb57, 0xb57 ], + [ 0xb5c, 0xb5d ], + [ 0xb5f, 0xb61 ], + [ 0xb66, 0xb77 ], + [ 0xb83, 0xb83 ], + [ 0xb85, 0xb8a ], + [ 0xb8e, 0xb90 ], + [ 0xb92, 0xb95 ], + [ 0xb99, 0xb9a ], + [ 0xb9c, 0xb9c ], + [ 0xb9e, 0xb9f ], + [ 0xba3, 0xba4 ], + [ 0xba8, 0xbaa ], + [ 0xbae, 0xbb9 ], + [ 0xbbe, 0xbbf ], + [ 0xbc1, 0xbc2 ], + [ 0xbc6, 0xbc8 ], + [ 0xbca, 0xbcc ], + [ 0xbd0, 0xbd0 ], + [ 0xbd7, 0xbd7 ], + [ 0xbe6, 0xbf2 ], + [ 0xc01, 0xc03 ], + [ 0xc05, 0xc0c ], + [ 0xc0e, 0xc10 ], + [ 0xc12, 0xc28 ], + [ 0xc2a, 0xc39 ], + [ 0xc3d, 0xc3d ], + [ 0xc41, 0xc44 ], + [ 0xc58, 0xc5a ], + [ 0xc60, 0xc61 ], + [ 0xc66, 0xc6f ], + [ 0xc7f, 0xc80 ], + [ 0xc82, 0xc83 ], + [ 0xc85, 0xc8c ], + [ 0xc8e, 0xc90 ], + [ 0xc92, 0xca8 ], + [ 0xcaa, 0xcb3 ], + [ 0xcb5, 0xcb9 ], + [ 0xcbd, 0xcc4 ], + [ 0xcc6, 0xcc8 ], + [ 0xcca, 0xccb ], + [ 0xcd5, 0xcd6 ], + [ 0xcde, 0xcde ], + [ 0xce0, 0xce1 ], + [ 0xce6, 0xcef ], + [ 0xcf1, 0xcf2 ], + [ 0xd02, 0xd03 ], + [ 0xd05, 0xd0c ], + [ 0xd0e, 0xd10 ], + [ 0xd12, 0xd3a ], + [ 0xd3d, 0xd40 ], + [ 0xd46, 0xd48 ], + [ 0xd4a, 0xd4c ], + [ 0xd4e, 0xd4f ], + [ 0xd54, 0xd61 ], + [ 0xd66, 0xd7f ], + [ 0xd82, 0xd83 ], + [ 0xd85, 0xd96 ], + [ 0xd9a, 0xdb1 ], + [ 0xdb3, 0xdbb ], + [ 0xdbd, 0xdbd ], + [ 0xdc0, 0xdc6 ], + [ 0xdcf, 0xdd1 ], + [ 0xdd8, 0xddf ], + [ 0xde6, 0xdef ], + [ 0xdf2, 0xdf4 ], + [ 0xe01, 0xe30 ], + [ 0xe32, 0xe33 ], + [ 0xe40, 0xe46 ], + [ 0xe4f, 0xe5b ], + [ 0xe81, 0xe82 ], + [ 0xe84, 0xe84 ], + [ 0xe87, 0xe88 ], + [ 0xe8a, 0xe8a ], + [ 0xe8d, 0xe8d ], + [ 0xe94, 0xe97 ], + [ 0xe99, 0xe9f ], + [ 0xea1, 0xea3 ], + [ 0xea5, 0xea5 ], + [ 0xea7, 0xea7 ], + [ 0xeaa, 0xeab ], + [ 0xead, 0xeb0 ], + [ 0xeb2, 0xeb3 ], + [ 0xebd, 0xebd ], + [ 0xec0, 0xec4 ], + [ 0xec6, 0xec6 ], + [ 0xed0, 0xed9 ], + [ 0xedc, 0xedf ], + [ 0xf00, 0xf17 ], + [ 0xf1a, 0xf34 ], + [ 0xf36, 0xf36 ], + [ 0xf38, 0xf38 ], + [ 0xf3e, 0xf47 ], + [ 0xf49, 0xf6c ], + [ 0xf7f, 0xf7f ], + [ 0xf85, 0xf85 ], + [ 0xf88, 0xf8c ], + [ 0xfbe, 0xfc5 ], + [ 0xfc7, 0xfcc ], + [ 0xfce, 0xfda ], + [ 0x1000, 0x102c ], + [ 0x1031, 0x1031 ], + [ 0x1038, 0x1038 ], + [ 0x103b, 0x103c ], + [ 0x103f, 0x1057 ], + [ 0x105a, 0x105d ], + [ 0x1061, 0x1070 ], + [ 0x1075, 0x1081 ], + [ 0x1083, 0x1084 ], + [ 0x1087, 0x108c ], + [ 0x108e, 0x109c ], + [ 0x109e, 0x10c5 ], + [ 0x10c7, 0x10c7 ], + [ 0x10cd, 0x10cd ], + [ 0x10d0, 0x1248 ], + [ 0x124a, 0x124d ], + [ 0x1250, 0x1256 ], + [ 0x1258, 0x1258 ], + [ 0x125a, 0x125d ], + [ 0x1260, 0x1288 ], + [ 0x128a, 0x128d ], + [ 0x1290, 0x12b0 ], + [ 0x12b2, 0x12b5 ], + [ 0x12b8, 0x12be ], + [ 0x12c0, 0x12c0 ], + [ 0x12c2, 0x12c5 ], + [ 0x12c8, 0x12d6 ], + [ 0x12d8, 0x1310 ], + [ 0x1312, 0x1315 ], + [ 0x1318, 0x135a ], + [ 0x1360, 0x137c ], + [ 0x1380, 0x138f ], + [ 0x13a0, 0x13f5 ], + [ 0x13f8, 0x13fd ], + [ 0x1401, 0x167f ], + [ 0x1681, 0x169a ], + [ 0x16a0, 0x16f8 ], + [ 0x1700, 0x170c ], + [ 0x170e, 0x1711 ], + [ 0x1720, 0x1731 ], + [ 0x1735, 0x1736 ], + [ 0x1740, 0x1751 ], + [ 0x1760, 0x176c ], + [ 0x176e, 0x1770 ], + [ 0x1780, 0x17b3 ], + [ 0x17b6, 0x17b6 ], + [ 0x17be, 0x17c5 ], + [ 0x17c7, 0x17c8 ], + [ 0x17d4, 0x17da ], + [ 0x17dc, 0x17dc ], + [ 0x17e0, 0x17e9 ], + [ 0x1810, 0x1819 ], + [ 0x1820, 0x1877 ], + [ 0x1880, 0x1884 ], + [ 0x1887, 0x18a8 ], + [ 0x18aa, 0x18aa ], + [ 0x18b0, 0x18f5 ], + [ 0x1900, 0x191e ], + [ 0x1923, 0x1926 ], + [ 0x1929, 0x192b ], + [ 0x1930, 0x1931 ], + [ 0x1933, 0x1938 ], + [ 0x1946, 0x196d ], + [ 0x1970, 0x1974 ], + [ 0x1980, 0x19ab ], + [ 0x19b0, 0x19c9 ], + [ 0x19d0, 0x19da ], + [ 0x1a00, 0x1a16 ], + [ 0x1a19, 0x1a1a ], + [ 0x1a1e, 0x1a55 ], + [ 0x1a57, 0x1a57 ], + [ 0x1a61, 0x1a61 ], + [ 0x1a63, 0x1a64 ], + [ 0x1a6d, 0x1a72 ], + [ 0x1a80, 0x1a89 ], + [ 0x1a90, 0x1a99 ], + [ 0x1aa0, 0x1aad ], + [ 0x1b04, 0x1b33 ], + [ 0x1b35, 0x1b35 ], + [ 0x1b3b, 0x1b3b ], + [ 0x1b3d, 0x1b41 ], + [ 0x1b43, 0x1b4b ], + [ 0x1b50, 0x1b6a ], + [ 0x1b74, 0x1b7c ], + [ 0x1b82, 0x1ba1 ], + [ 0x1ba6, 0x1ba7 ], + [ 0x1baa, 0x1baa ], + [ 0x1bae, 0x1be5 ], + [ 0x1be7, 0x1be7 ], + [ 0x1bea, 0x1bec ], + [ 0x1bee, 0x1bee ], + [ 0x1bf2, 0x1bf3 ], + [ 0x1bfc, 0x1c2b ], + [ 0x1c34, 0x1c35 ], + [ 0x1c3b, 0x1c49 ], + [ 0x1c4d, 0x1c88 ], + [ 0x1cc0, 0x1cc7 ], + [ 0x1cd3, 0x1cd3 ], + [ 0x1ce1, 0x1ce1 ], + [ 0x1ce9, 0x1cec ], + [ 0x1cee, 0x1cf3 ], + [ 0x1cf5, 0x1cf6 ], + [ 0x1d00, 0x1dbf ], + [ 0x1e00, 0x1f15 ], + [ 0x1f18, 0x1f1d ], + [ 0x1f20, 0x1f45 ], + [ 0x1f48, 0x1f4d ], + [ 0x1f50, 0x1f57 ], + [ 0x1f59, 0x1f59 ], + [ 0x1f5b, 0x1f5b ], + [ 0x1f5d, 0x1f5d ], + [ 0x1f5f, 0x1f7d ], + [ 0x1f80, 0x1fb4 ], + [ 0x1fb6, 0x1fbc ], + [ 0x1fbe, 0x1fbe ], + [ 0x1fc2, 0x1fc4 ], + [ 0x1fc6, 0x1fcc ], + [ 0x1fd0, 0x1fd3 ], + [ 0x1fd6, 0x1fdb ], + [ 0x1fe0, 0x1fec ], + [ 0x1ff2, 0x1ff4 ], + [ 0x1ff6, 0x1ffc ], + [ 0x200e, 0x200e ], + [ 0x2071, 0x2071 ], + [ 0x207f, 0x207f ], + [ 0x2090, 0x209c ], + [ 0x2102, 0x2102 ], + [ 0x2107, 0x2107 ], + [ 0x210a, 0x2113 ], + [ 0x2115, 0x2115 ], + [ 0x2119, 0x211d ], + [ 0x2124, 0x2124 ], + [ 0x2126, 0x2126 ], + [ 0x2128, 0x2128 ], + [ 0x212a, 0x212d ], + [ 0x212f, 0x2139 ], + [ 0x213c, 0x213f ], + [ 0x2145, 0x2149 ], + [ 0x214e, 0x214f ], + [ 0x2160, 0x2188 ], + [ 0x2336, 0x237a ], + [ 0x2395, 0x2395 ], + [ 0x249c, 0x24e9 ], + [ 0x26ac, 0x26ac ], + [ 0x2800, 0x28ff ], + [ 0x2c00, 0x2c2e ], + [ 0x2c30, 0x2c5e ], + [ 0x2c60, 0x2ce4 ], + [ 0x2ceb, 0x2cee ], + [ 0x2cf2, 0x2cf3 ], + [ 0x2d00, 0x2d25 ], + [ 0x2d27, 0x2d27 ], + [ 0x2d2d, 0x2d2d ], + [ 0x2d30, 0x2d67 ], + [ 0x2d6f, 0x2d70 ], + [ 0x2d80, 0x2d96 ], + [ 0x2da0, 0x2da6 ], + [ 0x2da8, 0x2dae ], + [ 0x2db0, 0x2db6 ], + [ 0x2db8, 0x2dbe ], + [ 0x2dc0, 0x2dc6 ], + [ 0x2dc8, 0x2dce ], + [ 0x2dd0, 0x2dd6 ], + [ 0x2dd8, 0x2dde ], + [ 0x3005, 0x3007 ], + [ 0x3021, 0x3029 ], + [ 0x302e, 0x302f ], + [ 0x3031, 0x3035 ], + [ 0x3038, 0x303c ], + [ 0x3041, 0x3096 ], + [ 0x309d, 0x309f ], + [ 0x30a1, 0x30fa ], + [ 0x30fc, 0x30ff ], + [ 0x3105, 0x312d ], + [ 0x3131, 0x318e ], + [ 0x3190, 0x31ba ], + [ 0x31f0, 0x321c ], + [ 0x3220, 0x324f ], + [ 0x3260, 0x327b ], + [ 0x327f, 0x32b0 ], + [ 0x32c0, 0x32cb ], + [ 0x32d0, 0x32fe ], + [ 0x3300, 0x3376 ], + [ 0x337b, 0x33dd ], + [ 0x33e0, 0x33fe ], + [ 0x3400, 0x3400 ], + [ 0x4db5, 0x4db5 ], + [ 0x4e00, 0x4e00 ], + [ 0x9fd5, 0x9fd5 ], + [ 0xa000, 0xa48c ], + [ 0xa4d0, 0xa60c ], + [ 0xa610, 0xa62b ], + [ 0xa640, 0xa66e ], + [ 0xa680, 0xa69d ], + [ 0xa6a0, 0xa6ef ], + [ 0xa6f2, 0xa6f7 ], + [ 0xa722, 0xa787 ], + [ 0xa789, 0xa7ae ], + [ 0xa7b0, 0xa7b7 ], + [ 0xa7f7, 0xa801 ], + [ 0xa803, 0xa805 ], + [ 0xa807, 0xa80a ], + [ 0xa80c, 0xa824 ], + [ 0xa827, 0xa827 ], + [ 0xa830, 0xa837 ], + [ 0xa840, 0xa873 ], + [ 0xa880, 0xa8c3 ], + [ 0xa8ce, 0xa8d9 ], + [ 0xa8f2, 0xa8fd ], + [ 0xa900, 0xa925 ], + [ 0xa92e, 0xa946 ], + [ 0xa952, 0xa953 ], + [ 0xa95f, 0xa97c ], + [ 0xa983, 0xa9b2 ], + [ 0xa9b4, 0xa9b5 ], + [ 0xa9ba, 0xa9bb ], + [ 0xa9bd, 0xa9cd ], + [ 0xa9cf, 0xa9d9 ], + [ 0xa9de, 0xa9e4 ], + [ 0xa9e6, 0xa9fe ], + [ 0xaa00, 0xaa28 ], + [ 0xaa2f, 0xaa30 ], + [ 0xaa33, 0xaa34 ], + [ 0xaa40, 0xaa42 ], + [ 0xaa44, 0xaa4b ], + [ 0xaa4d, 0xaa4d ], + [ 0xaa50, 0xaa59 ], + [ 0xaa5c, 0xaa7b ], + [ 0xaa7d, 0xaaaf ], + [ 0xaab1, 0xaab1 ], + [ 0xaab5, 0xaab6 ], + [ 0xaab9, 0xaabd ], + [ 0xaac0, 0xaac0 ], + [ 0xaac2, 0xaac2 ], + [ 0xaadb, 0xaaeb ], + [ 0xaaee, 0xaaf5 ], + [ 0xab01, 0xab06 ], + [ 0xab09, 0xab0e ], + [ 0xab11, 0xab16 ], + [ 0xab20, 0xab26 ], + [ 0xab28, 0xab2e ], + [ 0xab30, 0xab65 ], + [ 0xab70, 0xabe4 ], + [ 0xabe6, 0xabe7 ], + [ 0xabe9, 0xabec ], + [ 0xabf0, 0xabf9 ], + [ 0xac00, 0xac00 ], + [ 0xd7a3, 0xd7a3 ], + [ 0xd7b0, 0xd7c6 ], + [ 0xd7cb, 0xd7fb ], + [ 0xd800, 0xd800 ], + [ 0xdb7f, 0xdb80 ], + [ 0xdbff, 0xdc00 ], + [ 0xdfff, 0xe000 ], + [ 0xf8ff, 0xfa6d ], + [ 0xfa70, 0xfad9 ], + [ 0xfb00, 0xfb06 ], + [ 0xfb13, 0xfb17 ], + [ 0xff21, 0xff3a ], + [ 0xff41, 0xff5a ], + [ 0xff66, 0xffbe ], + [ 0xffc2, 0xffc7 ], + [ 0xffca, 0xffcf ], + [ 0xffd2, 0xffd7 ], + [ 0xffda, 0xffdc ], + [ 0x10000, 0x1000b ], + [ 0x1000d, 0x10026 ], + [ 0x10028, 0x1003a ], + [ 0x1003c, 0x1003d ], + [ 0x1003f, 0x1004d ], + [ 0x10050, 0x1005d ], + [ 0x10080, 0x100fa ], + [ 0x10100, 0x10100 ], + [ 0x10102, 0x10102 ], + [ 0x10107, 0x10133 ], + [ 0x10137, 0x1013f ], + [ 0x1018d, 0x1018e ], + [ 0x101d0, 0x101fc ], + [ 0x10280, 0x1029c ], + [ 0x102a0, 0x102d0 ], + [ 0x10300, 0x10323 ], + [ 0x10330, 0x1034a ], + [ 0x10350, 0x10375 ], + [ 0x10380, 0x1039d ], + [ 0x1039f, 0x103c3 ], + [ 0x103c8, 0x103d5 ], + [ 0x10400, 0x1049d ], + [ 0x104a0, 0x104a9 ], + [ 0x104b0, 0x104d3 ], + [ 0x104d8, 0x104fb ], + [ 0x10500, 0x10527 ], + [ 0x10530, 0x10563 ], + [ 0x1056f, 0x1056f ], + [ 0x10600, 0x10736 ], + [ 0x10740, 0x10755 ], + [ 0x10760, 0x10767 ], + [ 0x11000, 0x11000 ], + [ 0x11002, 0x11037 ], + [ 0x11047, 0x1104d ], + [ 0x11066, 0x1106f ], + [ 0x11082, 0x110b2 ], + [ 0x110b7, 0x110b8 ], + [ 0x110bb, 0x110c1 ], + [ 0x110d0, 0x110e8 ], + [ 0x110f0, 0x110f9 ], + [ 0x11103, 0x11126 ], + [ 0x1112c, 0x1112c ], + [ 0x11136, 0x11143 ], + [ 0x11150, 0x11172 ], + [ 0x11174, 0x11176 ], + [ 0x11182, 0x111b5 ], + [ 0x111bf, 0x111c9 ], + [ 0x111cd, 0x111cd ], + [ 0x111d0, 0x111df ], + [ 0x111e1, 0x111f4 ], + [ 0x11200, 0x11211 ], + [ 0x11213, 0x1122e ], + [ 0x11232, 0x11233 ], + [ 0x11235, 0x11235 ], + [ 0x11238, 0x1123d ], + [ 0x11280, 0x11286 ], + [ 0x11288, 0x11288 ], + [ 0x1128a, 0x1128d ], + [ 0x1128f, 0x1129d ], + [ 0x1129f, 0x112a9 ], + [ 0x112b0, 0x112de ], + [ 0x112e0, 0x112e2 ], + [ 0x112f0, 0x112f9 ], + [ 0x11302, 0x11303 ], + [ 0x11305, 0x1130c ], + [ 0x1130f, 0x11310 ], + [ 0x11313, 0x11328 ], + [ 0x1132a, 0x11330 ], + [ 0x11332, 0x11333 ], + [ 0x11335, 0x11339 ], + [ 0x1133d, 0x1133f ], + [ 0x11341, 0x11344 ], + [ 0x11347, 0x11348 ], + [ 0x1134b, 0x1134d ], + [ 0x11350, 0x11350 ], + [ 0x11357, 0x11357 ], + [ 0x1135d, 0x11363 ], + [ 0x11400, 0x11437 ], + [ 0x11440, 0x11441 ], + [ 0x11445, 0x11445 ], + [ 0x11447, 0x11459 ], + [ 0x1145b, 0x1145b ], + [ 0x1145d, 0x1145d ], + [ 0x11480, 0x114b2 ], + [ 0x114b9, 0x114b9 ], + [ 0x114bb, 0x114be ], + [ 0x114c1, 0x114c1 ], + [ 0x114c4, 0x114c7 ], + [ 0x114d0, 0x114d9 ], + [ 0x11580, 0x115b1 ], + [ 0x115b8, 0x115bb ], + [ 0x115be, 0x115be ], + [ 0x115c1, 0x115db ], + [ 0x11600, 0x11632 ], + [ 0x1163b, 0x1163c ], + [ 0x1163e, 0x1163e ], + [ 0x11641, 0x11644 ], + [ 0x11650, 0x11659 ], + [ 0x11680, 0x116aa ], + [ 0x116ac, 0x116ac ], + [ 0x116ae, 0x116af ], + [ 0x116b6, 0x116b6 ], + [ 0x116c0, 0x116c9 ], + [ 0x11700, 0x11719 ], + [ 0x11720, 0x11721 ], + [ 0x11726, 0x11726 ], + [ 0x11730, 0x1173f ], + [ 0x118a0, 0x118f2 ], + [ 0x118ff, 0x118ff ], + [ 0x11ac0, 0x11af8 ], + [ 0x11c00, 0x11c08 ], + [ 0x11c0a, 0x11c2f ], + [ 0x11c3e, 0x11c45 ], + [ 0x11c50, 0x11c6c ], + [ 0x11c70, 0x11c8f ], + [ 0x11ca9, 0x11ca9 ], + [ 0x11cb1, 0x11cb1 ], + [ 0x11cb4, 0x11cb4 ], + [ 0x12000, 0x12399 ], + [ 0x12400, 0x1246e ], + [ 0x12470, 0x12474 ], + [ 0x12480, 0x12543 ], + [ 0x13000, 0x1342e ], + [ 0x14400, 0x14646 ], + [ 0x16800, 0x16a38 ], + [ 0x16a40, 0x16a5e ], + [ 0x16a60, 0x16a69 ], + [ 0x16a6e, 0x16a6f ], + [ 0x16ad0, 0x16aed ], + [ 0x16af5, 0x16af5 ], + [ 0x16b00, 0x16b2f ], + [ 0x16b37, 0x16b45 ], + [ 0x16b50, 0x16b59 ], + [ 0x16b5b, 0x16b61 ], + [ 0x16b63, 0x16b77 ], + [ 0x16b7d, 0x16b8f ], + [ 0x16f00, 0x16f44 ], + [ 0x16f50, 0x16f7e ], + [ 0x16f93, 0x16f9f ], + [ 0x16fe0, 0x16fe0 ], + [ 0x17000, 0x17000 ], + [ 0x187ec, 0x187ec ], + [ 0x18800, 0x18af2 ], + [ 0x1b000, 0x1b001 ], + [ 0x1bc00, 0x1bc6a ], + [ 0x1bc70, 0x1bc7c ], + [ 0x1bc80, 0x1bc88 ], + [ 0x1bc90, 0x1bc99 ], + [ 0x1bc9c, 0x1bc9c ], + [ 0x1bc9f, 0x1bc9f ], + [ 0x1d000, 0x1d0f5 ], + [ 0x1d100, 0x1d126 ], + [ 0x1d129, 0x1d166 ], + [ 0x1d16a, 0x1d172 ], + [ 0x1d183, 0x1d184 ], + [ 0x1d18c, 0x1d1a9 ], + [ 0x1d1ae, 0x1d1e8 ], + [ 0x1d360, 0x1d371 ], + [ 0x1d400, 0x1d454 ], + [ 0x1d456, 0x1d49c ], + [ 0x1d49e, 0x1d49f ], + [ 0x1d4a2, 0x1d4a2 ], + [ 0x1d4a5, 0x1d4a6 ], + [ 0x1d4a9, 0x1d4ac ], + [ 0x1d4ae, 0x1d4b9 ], + [ 0x1d4bb, 0x1d4bb ], + [ 0x1d4bd, 0x1d4c3 ], + [ 0x1d4c5, 0x1d505 ], + [ 0x1d507, 0x1d50a ], + [ 0x1d50d, 0x1d514 ], + [ 0x1d516, 0x1d51c ], + [ 0x1d51e, 0x1d539 ], + [ 0x1d53b, 0x1d53e ], + [ 0x1d540, 0x1d544 ], + [ 0x1d546, 0x1d546 ], + [ 0x1d54a, 0x1d550 ], + [ 0x1d552, 0x1d6a5 ], + [ 0x1d6a8, 0x1d6da ], + [ 0x1d6dc, 0x1d714 ], + [ 0x1d716, 0x1d74e ], + [ 0x1d750, 0x1d788 ], + [ 0x1d78a, 0x1d7c2 ], + [ 0x1d7c4, 0x1d7cb ], + [ 0x1d800, 0x1d9ff ], + [ 0x1da37, 0x1da3a ], + [ 0x1da6d, 0x1da74 ], + [ 0x1da76, 0x1da83 ], + [ 0x1da85, 0x1da8b ], + [ 0x1f110, 0x1f12e ], + [ 0x1f130, 0x1f169 ], + [ 0x1f170, 0x1f1ac ], + [ 0x1f1e6, 0x1f202 ], + [ 0x1f210, 0x1f23b ], + [ 0x1f240, 0x1f248 ], + [ 0x1f250, 0x1f251 ], + [ 0x20000, 0x20000 ], + [ 0x2a6d6, 0x2a6d6 ], + [ 0x2a700, 0x2a700 ], + [ 0x2b734, 0x2b734 ], + [ 0x2b740, 0x2b740 ], + [ 0x2b81d, 0x2b81d ], + [ 0x2b820, 0x2b820 ], + [ 0x2cea1, 0x2cea1 ], + [ 0x2f800, 0x2fa1d ], + [ 0xf0000, 0xf0000 ], + [ 0xffffd, 0xffffd ], + [ 0x100000, 0x100000 ], + [ 0x10fffd, 0x10fffd ] +]; + +const createLookUpMap = ( charactersRangeArray ) => { + const set = new Set(); + + charactersRangeArray.forEach( range => { + for ( let i = range[ 0 ]; i <= range[ 1 ]; i++ ) { + set.add( i ); + } + } ); + + return set; +}; + +const RTL_SET = createLookUpMap( RIGHT_TO_LEFT ); +const LTR_SET = createLookUpMap( LEFT_TO_RIGHT ); + +export const isRTLCharacter = character => RTL_SET.has( character.charCodeAt( 0 ) ); +export const isLTRCharacter = character => LTR_SET.has( character.charCodeAt( 0 ) ); diff --git a/client/components/auto-direction/index.jsx b/client/components/auto-direction/index.jsx index 0a1403d9745077..18e2bf4126f075 100644 --- a/client/components/auto-direction/index.jsx +++ b/client/components/auto-direction/index.jsx @@ -8,10 +8,10 @@ import React, { PropTypes } from 'react'; */ import userModule from 'lib/user'; import { stripHTML } from 'lib/formatting'; +import { isRTLCharacter, isLTRCharacter } from './direction'; const user = userModule(); -const RTL_THRESHOLD = 0.5; const MAX_LENGTH_OF_TEXT_TO_EXAMINE = 100; /*** @@ -51,77 +51,6 @@ const getContent = ( reactElement ) => { return null; }; -// Adopted from from: https://github.com/twitter/RTLtextarea/blob/master/src/RTLText.module.js#L25 -const rtlCharacterRanges = [ - { - name: 'Hebrew', - start: 0x590, - end: 0x5FF - }, - { - name: 'Arabic', - start: 0x600, - end: 0x6FF - }, - { - name: 'Syriac', - start: 0x700, - end: 0x74F - }, - { - name: 'Arabic Supplement', - start: 0x750, - end: 0x77F - }, - { - name: 'Thaana', - start: 0x780, - end: 0x7BF - }, - { - name: 'N\'Ko', - start: 0x7C0, - end: 0x7FF - }, - { - name: 'Samaritan', - start: 0x800, - end: 0x83F - }, - { - name: 'Arabic Extended-A', - start: 0x8A0, - end: 0x8FF - }, - { - name: 'Hebrew presentation forms', - start: 0xFB1D, - end: 0xFB4F - }, - { - name: 'Arabic presentation forms A', - start: 0xFB50, - end: 0xFDFF - }, - { - name: 'Arabic presentation forms B', - start: 0xFE70, - end: 0xFEFF - }, -]; - - - -const isRTLCharacter = ( character ) => { - const characterCode = character.charCodeAt( 0 ); - return rtlCharacterRanges.some( range => range.start <= characterCode && range.end >= characterCode ); -}; - -const whitespaceRe = /[\s\-\_0-9]/u; -const isNeutralCharacter = ( character ) => { - return whitespaceRe.test( character ); -} - /*** * Gets the main directionality in a text * It returns what kind of characters we had the most, RTL or LTR according to some ratio @@ -131,21 +60,22 @@ const isNeutralCharacter = ( character ) => { */ const getTextMainDirection = ( text ) => { let rtlCount = 0; - let countedCharacters = 0; + let ltrCount = 0; + const examinedLength = Math.min( MAX_LENGTH_OF_TEXT_TO_EXAMINE, text.length ); for ( let i = 0; i < examinedLength; i++ ) { - if ( isNeutralCharacter( text[ i ] ) ) { - continue; + if ( isRTLCharacter( text[ i ] ) ) { + rtlCount++; + } else if ( isLTRCharacter( text[ i ] ) ) { + ltrCount++; } - rtlCount += isRTLCharacter( text[ i ] ) ? 1 : 0; - countedCharacters++; } - if ( countedCharacters === 0 ) { + if ( ( rtlCount + ltrCount ) === 0 ) { return user.isRTL() ? 'rtl' : 'ltr'; } - return ( rtlCount / countedCharacters > RTL_THRESHOLD ) ? 'rtl' : 'ltr'; + return rtlCount > ltrCount ? 'rtl' : 'ltr'; }; /***