Index: Source/core/layout/LayoutListMarker.cpp |
diff --git a/Source/core/layout/LayoutListMarker.cpp b/Source/core/layout/LayoutListMarker.cpp |
index f5c43ef80f635328097733d3b0c0fc576291050c..6342510585ad0454a109d65ace58b666b952c60b 100644 |
--- a/Source/core/layout/LayoutListMarker.cpp |
+++ b/Source/core/layout/LayoutListMarker.cpp |
@@ -318,21 +318,31 @@ static String toGeorgian(int number) |
} |
// The table uses the order from the CSS3 specification: |
-// first 3 group markers, then 3 digit markers, then ten digits. |
-static String toCJKIdeographic(int number, const UChar table[16]) |
+// first 3 group markers, then 3 digit markers, then ten digits, then negative symbols. |
+static String toCJKIdeographic(int number, const UChar table[23]) |
{ |
- ASSERT(number >= 0); |
- |
enum AbstractCJKChar { |
- NoChar, |
+ NoChar = 0, |
+ Lang = 0, |
SecondGroupMarker, ThirdGroupMarker, FourthGroupMarker, |
SecondDigitMarker, ThirdDigitMarker, FourthDigitMarker, |
Digit0, Digit1, Digit2, Digit3, Digit4, |
- Digit5, Digit6, Digit7, Digit8, Digit9 |
+ Digit5, Digit6, Digit7, Digit8, Digit9, |
+ Neg1, Neg2, Neg3, Neg4, Neg5 |
+ }; |
+ |
+ enum CJKLang { |
+ Chinese = 1, |
+ Korean, |
+ Japanese |
}; |
if (number == 0) |
- return String(&table[Digit0 - 1], 1); |
+ return String(&table[Digit0], 1); |
+ |
+ const bool negative = number < 0; |
+ if (negative) |
+ number = -number; |
const int groupLength = 8; // 4 digits, 3 digit markers, and a group marker |
const int bufferLength = 4 * groupLength; |
@@ -371,7 +381,7 @@ static String toCJKIdeographic(int number, const UChar table[16]) |
// Remove the tens digit, but leave the marker, for any group that has |
// a value of less than 20. |
- if (groupValue < 20) { |
+ if (table[Lang] == Chinese && groupValue < 20) { |
ASSERT(group[4] == NoChar || group[4] == Digit0 || group[4] == Digit1); |
group[4] = NoChar; |
} |
@@ -383,17 +393,25 @@ static String toCJKIdeographic(int number, const UChar table[16]) |
// Convert into characters, omitting consecutive runs of Digit0 and |
// any trailing Digit0. |
int length = 0; |
- UChar characters[bufferLength]; |
+ const int maxLengthForNegativeSymbols = 5; |
+ UChar characters[bufferLength + maxLengthForNegativeSymbols]; |
AbstractCJKChar last = NoChar; |
+ if (negative) { |
+ while (UChar a = table[Neg1 + length]) |
+ characters[length++] = a; |
+ } |
for (int i = 0; i < bufferLength; ++i) { |
AbstractCJKChar a = buffer[i]; |
if (a != NoChar) { |
- if (a != Digit0 || last != Digit0) |
- characters[length++] = table[a - 1]; |
+ if (a != Digit0 || (table[Lang] == Chinese && last != Digit0)) { |
+ characters[length++] = table[a]; |
+ if (table[Lang] == Korean && a >= SecondGroupMarker && a <= FourthGroupMarker) |
+ characters[length++] = ' '; |
+ } |
last = a; |
} |
} |
- if (last == Digit0) |
+ if ((table[Lang] == Chinese && last == Digit0) || characters[length - 1] == ' ') |
--length; |
return String(characters, length); |
@@ -428,6 +446,7 @@ static EListStyleType effectiveListMarkerType(EListStyleType type, int value) |
case Thai: |
case Tibetan: |
case Urdu: |
+ case KoreanHangulFormal: |
return type; // Can represent all ordinals. |
case Armenian: |
return (value < 1 || value > 99999999) ? DecimalListStyle : type; |
@@ -527,6 +546,8 @@ UChar LayoutListMarker::listMarkerSuffix(EListStyleType type, int value) |
case UpperRoman: |
case Urdu: |
return '.'; |
+ case KoreanHangulFormal: |
+ return ','; |
} |
ASSERT_NOT_REACHED(); |
@@ -801,12 +822,25 @@ String listMarkerText(EListStyleType type, int value) |
}; |
return toAlphabetic(value, ethiopicHalehameTiEtAlphabet); |
} |
+ case KoreanHangulFormal: { |
+ static const UChar koreanHangulFormalTable[23] = { |
+ 0x2, |
+ 0xB9CC, 0xC5B5, 0xC870, |
+ 0xC2ED, 0xBC31, 0xCC9C, |
+ 0xC601, 0xC77C, 0xC774, 0xC0BC, 0xC0AC, |
+ 0xC624, 0xC721, 0xCE60, 0xD314, 0xAD6C, |
+ 0xB9C8, 0xC774, 0xB108, 0xC2A4, 0x0020, 0x0000 |
+ }; |
+ return toCJKIdeographic(value, koreanHangulFormalTable); |
+ } |
case CJKIdeographic: { |
- static const UChar traditionalChineseInformalTable[16] = { |
+ static const UChar traditionalChineseInformalTable[19] = { |
+ 0x1, |
0x842C, 0x5104, 0x5146, |
0x5341, 0x767E, 0x5343, |
0x96F6, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, |
- 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D |
+ 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, |
+ 0x8CA0, 0x0000 |
}; |
return toCJKIdeographic(value, traditionalChineseInformalTable); |
} |
@@ -1004,6 +1038,7 @@ void LayoutListMarker::updateContent() |
case Gurmukhi: |
case Hangul: |
case HangulConsonant: |
+ case KoreanHangulFormal: |
case Hebrew: |
case Hiragana: |
case HiraganaIroha: |
@@ -1079,6 +1114,7 @@ void LayoutListMarker::computePreferredLogicalWidths() |
case Gurmukhi: |
case Hangul: |
case HangulConsonant: |
+ case KoreanHangulFormal: |
case Hebrew: |
case Hiragana: |
case HiraganaIroha: |
@@ -1249,6 +1285,7 @@ IntRect LayoutListMarker::getRelativeMarkerRect() |
case Gujarati: |
case Gurmukhi: |
case Hangul: |
+ case KoreanHangulFormal: |
case HangulConsonant: |
case Hebrew: |
case Hiragana: |