Commit 5c695f2f authored by Xiaocheng Hu's avatar Xiaocheng Hu Committed by Commit Bot

Introduce Character::IsBidiControl()

This patch introduces a utility function to check if a unicode character
is a bidi control character defined in UAX9:

http://unicode.org/reports/tr9/#Directional_Formatting_Characters

This is also preparation for crrev.com/c/1039145

Bug: 822575
Change-Id: I6a011f7fc871c3508c811c41cb21208139fa71cd
Reviewed-on: https://chromium-review.googlesource.com/1040648Reviewed-by: default avatarEmil A Eklund <eae@chromium.org>
Commit-Queue: Emil A Eklund <eae@chromium.org>
Cr-Commit-Position: refs/heads/master@{#555588}
parent 6ebcca9a
......@@ -118,6 +118,10 @@ bool Character::IsPotentialCustomElementNameChar(UChar32 character) {
RETURN_HAS_PROPERTY(character, kIsPotentialCustomElementNameChar);
}
bool Character::IsBidiControl(UChar32 character) {
RETURN_HAS_PROPERTY(character, kIsBidiControl);
}
unsigned Character::ExpansionOpportunityCount(const LChar* characters,
size_t length,
TextDirection direction,
......
......@@ -102,6 +102,9 @@ class PLATFORM_EXPORT Character {
}
static bool IsPotentialCustomElementNameChar(UChar32 character);
// http://unicode.org/reports/tr9/#Directional_Formatting_Characters
static bool IsBidiControl(UChar32 character);
static bool TreatAsSpace(UChar32 c) {
return c == kSpaceCharacter || c == kTabulationCharacter ||
c == kNewlineCharacter || c == kNoBreakSpaceCharacter;
......
......@@ -15,6 +15,7 @@ enum class CharacterProperty : CharacterPropertyType {
kIsCJKIdeographOrSymbol = 0x0001,
kIsUprightInMixedVertical = 0x0002,
kIsPotentialCustomElementNameChar = 0x0004,
kIsBidiControl = 0x0008,
};
inline CharacterProperty operator|(CharacterProperty a, CharacterProperty b) {
......
......@@ -81,6 +81,7 @@ static void Generate(FILE* fp) {
SET(kIsCJKIdeographOrSymbol);
SET(kIsUprightInMixedVertical);
SET(kIsPotentialCustomElementNameChar);
SET(kIsBidiControl);
// Create a trie from the value array.
UErrorCode error = U_ZERO_ERROR;
......
......@@ -223,6 +223,13 @@ static const UChar32 kIsPotentialCustomElementNameCharRanges[] = {
0xF900, 0xFDCF, 0xFDF0, 0xFFFD, 0x10000, 0xEFFFF,
};
// http://unicode.org/reports/tr9/#Directional_Formatting_Characters
static const UChar32 kIsBidiControlArray[] = {0x061C, 0x200E, 0x200F};
static const UChar32 kIsBidiControlRanges[] = {
0x202A, 0x202E, 0x2066, 0x2069,
};
} // namespace blink
#endif
......@@ -331,4 +331,22 @@ TEST(CharacterTest, Truncation) {
EXPECT_FALSE(Character::IsNormalizedCanvasSpaceCharacter(test_char));
}
TEST(CharacterTest, IsBidiControl) {
EXPECT_TRUE(Character::IsBidiControl(0x202A)); // LEFT-TO-RIGHT EMBEDDING
EXPECT_TRUE(Character::IsBidiControl(0x202B)); // RIGHT-TO-LEFT EMBEDDING
EXPECT_TRUE(Character::IsBidiControl(0x202D)); // LEFT-TO-RIGHT OVERRIDE
EXPECT_TRUE(Character::IsBidiControl(0x202E)); // RIGHT-TO-LEFT OVERRIDE
EXPECT_TRUE(Character::IsBidiControl(0x202C)); // POP DIRECTIONAL FORMATTING
EXPECT_TRUE(Character::IsBidiControl(0x2066)); // LEFT-TO-RIGHT ISOLATE
EXPECT_TRUE(Character::IsBidiControl(0x2067)); // RIGHT-TO-LEFT ISOLATE
EXPECT_TRUE(Character::IsBidiControl(0x2068)); // FIRST STRONG ISOLATE
EXPECT_TRUE(Character::IsBidiControl(0x2069)); // POP DIRECTIONAL ISOLATE
EXPECT_TRUE(Character::IsBidiControl(0x200E)); // LEFT-TO-RIGHT MARK
EXPECT_TRUE(Character::IsBidiControl(0x200F)); // RIGHT-TO-LEFT MARK
EXPECT_TRUE(Character::IsBidiControl(0x061C)); // ARABIC LETTER MARK
EXPECT_FALSE(Character::IsBidiControl('A'));
EXPECT_FALSE(Character::IsBidiControl('0'));
EXPECT_FALSE(Character::IsBidiControl(0x05D0));
}
} // namespace blink
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment