Bug 934072 - Part 3: Implement complex CJK ideographic counter styles. r=jfkthame

This commit is contained in:
Xidorn Quan 2013-12-02 12:51:26 -05:00
Родитель 5455ba44d8
Коммит fe31575536
4 изменённых файлов: 295 добавлений и 128 удалений

Просмотреть файл

@ -361,6 +361,15 @@ nsBulletFrame::PaintBullet(nsRenderingContext& aRenderingContext, nsPoint aPt,
case NS_STYLE_LIST_STYLE_KATAKANA:
case NS_STYLE_LIST_STYLE_HIRAGANA_IROHA:
case NS_STYLE_LIST_STYLE_KATAKANA_IROHA:
case NS_STYLE_LIST_STYLE_JAPANESE_INFORMAL:
case NS_STYLE_LIST_STYLE_JAPANESE_FORMAL:
case NS_STYLE_LIST_STYLE_KOREAN_HANGUL_FORMAL:
case NS_STYLE_LIST_STYLE_KOREAN_HANJA_INFORMAL:
case NS_STYLE_LIST_STYLE_KOREAN_HANJA_FORMAL:
case NS_STYLE_LIST_STYLE_SIMP_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_SIMP_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_TRAD_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_TRAD_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_INFORMAL:
@ -765,103 +774,203 @@ static bool CharListDecimalToText(int32_t ordinal, nsString& result, const PRUni
return true;
}
static const PRUnichar gCJKIdeographicDigit1[10] =
{
0x96f6, 0x4e00, 0x4e8c, 0x4e09, 0x56db, // 0 - 4
0x4e94, 0x516d, 0x4e03, 0x516b, 0x4e5d // 5 - 9
enum CJKIdeographicLang {
CHINESE, KOREAN, JAPANESE
};
static const PRUnichar gCJKIdeographicDigit2[10] =
{
0x96f6, 0x58f9, 0x8cb3, 0x53c3, 0x8086, // 0 - 4
0x4f0d, 0x9678, 0x67d2, 0x634c, 0x7396 // 5 - 9
struct CJKIdeographicData {
const PRUnichar *negative;
PRUnichar digit[10];
PRUnichar unit[3];
PRUnichar unit10K[2];
uint8_t lang;
bool informal;
};
static const PRUnichar gCJKIdeographicDigit3[10] =
{
0x96f6, 0x58f9, 0x8d30, 0x53c1, 0x8086, // 0 - 4
0x4f0d, 0x9646, 0x67d2, 0x634c, 0x7396 // 5 - 9
static const PRUnichar gJapaneseNegative[] = {
0x30de, 0x30a4, 0x30ca, 0x30b9, 0x0000
};
static const PRUnichar gCJKIdeographicUnit1[4] =
{
0x000, 0x5341, 0x767e, 0x5343
static const CJKIdeographicData gDataJapaneseInformal = {
gJapaneseNegative, // negative
{ // digit
0x3007, 0x4e00, 0x4e8c, 0x4e09, 0x56db,
0x4e94, 0x516d, 0x4e03, 0x516b, 0x4e5d
},
{ 0x5341, 0x767e, 0x5343 }, // unit
{ 0x4e07, 0x5104 }, // unit10K
JAPANESE, // lang
true // informal
};
static const PRUnichar gCJKIdeographicUnit2[4] =
{
0x000, 0x62FE, 0x4F70, 0x4EDF
static const CJKIdeographicData gDataJapaneseFormal = {
gJapaneseNegative, // negative
{ // digit
0x96f6, 0x58f1, 0x5f10, 0x53c2, 0x56db,
0x4f0d, 0x516d, 0x4e03, 0x516b, 0x4e5d
},
{ 0x62fe, 0x767e, 0x9621 }, // unit
{ 0x842c, 0x5104 }, // unit10K
JAPANESE, // lang
false // informal
};
static const PRUnichar gCJKIdeographic10KUnit1[4] =
{
0x000, 0x842c, 0x5104, 0x5146
static const PRUnichar gKoreanNegative[] = {
0xb9c8, 0xc774, 0xb108, 0xc2a4, 0x0020, 0x0000
};
static const PRUnichar gCJKIdeographic10KUnit2[4] =
{
0x000, 0x4E07, 0x4ebf, 0x5146
static const CJKIdeographicData gDataKoreanHangulFormal = {
gKoreanNegative, // negative
{ // digit
0xc601, 0xc77c, 0xc774, 0xc0bc, 0xc0ac,
0xc624, 0xc721, 0xce60, 0xd314, 0xad6c
},
{ 0xc2ed, 0xbc31, 0xcc9c }, // unit
{ 0xb9cc, 0xc5b5 }, // unit10K
KOREAN, // lang
false // informal
};
static const PRUnichar gCJKIdeographic10KUnit3[4] =
{
0x000, 0x4E07, 0x5104, 0x5146
static const CJKIdeographicData gDataKoreanHanjaInformal = {
gKoreanNegative, // negative
{ // digit
0x96f6, 0x4e00, 0x4e8c, 0x4e09, 0x56db,
0x4e94, 0x516d, 0x4e03, 0x516b, 0x4e5d
},
{ 0x5341, 0x767e, 0x5343 }, // unit
{ 0x842c, 0x5104 }, // unit10K
KOREAN, // lang
true // informal
};
static const CJKIdeographicData gDataKoreanHanjaFormal = {
gKoreanNegative, // negative
{ // digit
0x96f6, 0x58f9, 0x8cb3, 0x53c3, 0x56db,
0x4e94, 0x516d, 0x4e03, 0x516b, 0x4e5d
},
{ 0x62fe, 0x767e, 0x4edf }, // unit
{ 0x842c, 0x5104 }, // unit10K
KOREAN, // lang
false // informal
};
static const PRUnichar gSimpChineseNegative[] = {
0x8d1f, 0x0000
};
static const CJKIdeographicData gDataSimpChineseInformal = {
gSimpChineseNegative, // negative
{ // digit
0x96f6, 0x4e00, 0x4e8c, 0x4e09, 0x56db,
0x4e94, 0x516d, 0x4e03, 0x516b, 0x4e5d
},
{ 0x5341, 0x767e, 0x5343 }, // unit
{ 0x4e07, 0x4ebf }, // unit10K
CHINESE, // lang
true // informal
};
static const CJKIdeographicData gDataSimpChineseFormal = {
gSimpChineseNegative, // negative
{ // digit
0x96f6, 0x58f9, 0x8d30, 0x53c1, 0x8086,
0x4f0d, 0x9646, 0x67d2, 0x634c, 0x7396
},
{ 0x62fe, 0x4f70, 0x4edf }, // unit
{ 0x4e07, 0x4ebf }, // unit10K
CHINESE, // lang
false // informal
};
static const PRUnichar gTradChineseNegative[] = {
0x8ca0, 0x0000
};
static const CJKIdeographicData gDataTradChineseInformal = {
gTradChineseNegative, // negative
{ // digit
0x96f6, 0x4e00, 0x4e8c, 0x4e09, 0x56db,
0x4e94, 0x516d, 0x4e03, 0x516b, 0x4e5d
},
{ 0x5341, 0x767e, 0x5343 }, // unit
{ 0x842c, 0x5104 }, // unit10K
CHINESE, // lang
true // informal
};
static const CJKIdeographicData gDataTradChineseFormal = {
gTradChineseNegative, // negative
{ // digit
0x96f6, 0x58f9, 0x8cb3, 0x53c3, 0x8086,
0x4f0d, 0x9678, 0x67d2, 0x634c, 0x7396
},
{ 0x62fe, 0x4f70, 0x4edf }, // unit
{ 0x842c, 0x5104 }, // unit10K
CHINESE, // lang
false // informal
};
static const bool CJKIdeographicToText(int32_t ordinal, nsString& result,
const PRUnichar* digits,
const PRUnichar *unit,
const PRUnichar* unit10k)
static const bool CJKIdeographicToText(int32_t ordinal, nsString& result,
const CJKIdeographicData& data)
{
// In theory, we need the following if condiction,
// However, the limit, 10 ^ 16, is greater than the max of uint32_t
// so we don't really need to test it here.
// if( ordinal > 9999999999999999)
// {
// PR_snprintf(cbuf, sizeof(cbuf), "%ld", ordinal);
// result.Append(cbuf);
// }
// else
// {
if (ordinal < 0) {
return false;
}
PRUnichar c10kUnit = 0;
PRUnichar cUnit = 0;
PRUnichar cDigit = 0;
uint32_t ud = 0;
PRUnichar buf[NUM_BUF_SIZE];
int32_t idx = NUM_BUF_SIZE;
bool bOutputZero = ( 0 == ordinal );
int32_t pos = 0;
bool isNegative = (ordinal < 0);
bool needZero = (ordinal == 0);
int32_t unitidx = 0, unit10Kidx = 0;
if (isNegative) {
ordinal = -ordinal;
}
do {
if(0 == (ud % 4)) {
c10kUnit = unit10k[ud/4];
unitidx = pos % 4;
if (unitidx == 0) {
unit10Kidx = pos / 4;
}
int32_t cur = ordinal % 10;
cDigit = digits[cur];
if( 0 == cur)
{
cUnit = 0;
if(bOutputZero) {
bOutputZero = false;
if(0 != cDigit)
buf[--idx] = cDigit;
if (cur == 0) {
if (needZero) {
needZero = false;
buf[--idx] = data.digit[0];
}
}
else
{
bOutputZero = true;
cUnit = unit[ud%4];
if(0 != c10kUnit)
buf[--idx] = c10kUnit;
if(0 != cUnit)
buf[--idx] = cUnit;
if((0 != cDigit) &&
( (1 != cur) || (1 != (ud%4)) || ( ordinal > 10)) )
buf[--idx] = cDigit;
c10kUnit = 0;
} else {
if (data.lang == CHINESE) {
needZero = true;
}
if (unit10Kidx != 0) {
if (data.lang == KOREAN) {
buf[--idx] = ' ';
}
buf[--idx] = data.unit10K[unit10Kidx - 1];
}
if (unitidx != 0) {
buf[--idx] = data.unit[unitidx - 1];
}
if (cur != 1) {
buf[--idx] = data.digit[cur];
} else {
bool needOne = true;
if (data.informal) {
switch (data.lang) {
case CHINESE:
if (unitidx == 1 &&
(ordinal == 1 || (pos > 4 && ordinal % 1000 == 1))) {
needOne = false;
}
break;
case JAPANESE:
if (unitidx > 0 &&
(unitidx != 3 || (pos == 3 && ordinal == 1))) {
needOne = false;
}
break;
case KOREAN:
if (unitidx > 0 || (pos == 4 && (ordinal % 1000) == 1)) {
needOne = false;
}
break;
}
}
if (needOne) {
buf[--idx] = data.digit[1];
}
}
unit10Kidx = 0;
}
ordinal /= 10;
++ud;
} while( ordinal > 0);
result.Append(buf+idx,NUM_BUF_SIZE-idx);
// }
pos++;
} while (ordinal > 0);
if (isNegative) {
result.Append(data.negative);
}
result.Append(buf + idx, NUM_BUF_SIZE - idx);
return true;
}
@ -1154,46 +1263,59 @@ nsBulletFrame::AppendCounterText(int32_t aListStyleType,
break;
case NS_STYLE_LIST_STYLE_CJK_IDEOGRAPHIC:
case NS_STYLE_LIST_STYLE_TRAD_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_INFORMAL:
fallback = NS_STYLE_LIST_STYLE_CJK_DECIMAL;
success = CJKIdeographicToText(aOrdinal, result, gCJKIdeographicDigit1,
gCJKIdeographicUnit1,
gCJKIdeographic10KUnit1);
success =
CJKIdeographicToText(aOrdinal, result, gDataTradChineseInformal);
break;
case NS_STYLE_LIST_STYLE_TRAD_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_FORMAL:
fallback = NS_STYLE_LIST_STYLE_CJK_DECIMAL;
success = CJKIdeographicToText(aOrdinal, result, gCJKIdeographicDigit2,
gCJKIdeographicUnit2,
gCJKIdeographic10KUnit1);
success = CJKIdeographicToText(aOrdinal, result, gDataTradChineseFormal);
break;
case NS_STYLE_LIST_STYLE_SIMP_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_INFORMAL:
fallback = NS_STYLE_LIST_STYLE_CJK_DECIMAL;
success = CJKIdeographicToText(aOrdinal, result, gCJKIdeographicDigit1,
gCJKIdeographicUnit1,
gCJKIdeographic10KUnit2);
success =
CJKIdeographicToText(aOrdinal, result, gDataSimpChineseInformal);
break;
case NS_STYLE_LIST_STYLE_SIMP_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_FORMAL:
fallback = NS_STYLE_LIST_STYLE_CJK_DECIMAL;
success = CJKIdeographicToText(aOrdinal, result, gCJKIdeographicDigit3,
gCJKIdeographicUnit2,
gCJKIdeographic10KUnit2);
success = CJKIdeographicToText(aOrdinal, result, gDataSimpChineseFormal);
break;
case NS_STYLE_LIST_STYLE_JAPANESE_INFORMAL:
case NS_STYLE_LIST_STYLE_MOZ_JAPANESE_INFORMAL:
fallback = NS_STYLE_LIST_STYLE_CJK_DECIMAL;
success = CJKIdeographicToText(aOrdinal, result, gCJKIdeographicDigit1,
gCJKIdeographicUnit1,
gCJKIdeographic10KUnit3);
success = CJKIdeographicToText(aOrdinal, result, gDataJapaneseInformal);
break;
case NS_STYLE_LIST_STYLE_JAPANESE_FORMAL:
case NS_STYLE_LIST_STYLE_MOZ_JAPANESE_FORMAL:
fallback = NS_STYLE_LIST_STYLE_CJK_DECIMAL;
success = CJKIdeographicToText(aOrdinal, result, gCJKIdeographicDigit2,
gCJKIdeographicUnit2,
gCJKIdeographic10KUnit3);
success = CJKIdeographicToText(aOrdinal, result, gDataJapaneseFormal);
break;
case NS_STYLE_LIST_STYLE_KOREAN_HANGUL_FORMAL:
fallback = NS_STYLE_LIST_STYLE_CJK_DECIMAL;
success =
CJKIdeographicToText(aOrdinal, result, gDataKoreanHangulFormal);
break;
case NS_STYLE_LIST_STYLE_KOREAN_HANJA_INFORMAL:
fallback = NS_STYLE_LIST_STYLE_CJK_DECIMAL;
success =
CJKIdeographicToText(aOrdinal, result, gDataKoreanHanjaInformal);
break;
case NS_STYLE_LIST_STYLE_KOREAN_HANJA_FORMAL:
fallback = NS_STYLE_LIST_STYLE_CJK_DECIMAL;
success = CJKIdeographicToText(aOrdinal, result, gDataKoreanHanjaFormal);
break;
case NS_STYLE_LIST_STYLE_HEBREW:
@ -1338,6 +1460,12 @@ nsBulletFrame::GetListItemSuffix(int32_t aListStyleType,
case NS_STYLE_LIST_STYLE_CJK_DECIMAL:
case NS_STYLE_LIST_STYLE_CJK_IDEOGRAPHIC:
case NS_STYLE_LIST_STYLE_TRAD_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_TRAD_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_SIMP_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_SIMP_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_JAPANESE_INFORMAL:
case NS_STYLE_LIST_STYLE_JAPANESE_FORMAL:
case NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_INFORMAL:
@ -1350,6 +1478,9 @@ nsBulletFrame::GetListItemSuffix(int32_t aListStyleType,
aSuppressPadding = true;
break;
case NS_STYLE_LIST_STYLE_KOREAN_HANGUL_FORMAL:
case NS_STYLE_LIST_STYLE_KOREAN_HANJA_INFORMAL:
case NS_STYLE_LIST_STYLE_KOREAN_HANJA_FORMAL:
case NS_STYLE_LIST_STYLE_MOZ_HANGUL:
case NS_STYLE_LIST_STYLE_MOZ_HANGUL_CONSONANT:
aResult = ',';
@ -1464,6 +1595,15 @@ nsBulletFrame::GetDesiredSize(nsPresContext* aCX,
case NS_STYLE_LIST_STYLE_ARMENIAN:
case NS_STYLE_LIST_STYLE_GEORGIAN:
case NS_STYLE_LIST_STYLE_CJK_IDEOGRAPHIC:
case NS_STYLE_LIST_STYLE_JAPANESE_INFORMAL:
case NS_STYLE_LIST_STYLE_JAPANESE_FORMAL:
case NS_STYLE_LIST_STYLE_KOREAN_HANGUL_FORMAL:
case NS_STYLE_LIST_STYLE_KOREAN_HANJA_INFORMAL:
case NS_STYLE_LIST_STYLE_KOREAN_HANJA_FORMAL:
case NS_STYLE_LIST_STYLE_SIMP_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_SIMP_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_TRAD_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_TRAD_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_INFORMAL:
case NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_FORMAL:
case NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_INFORMAL:

Просмотреть файл

@ -334,6 +334,8 @@ CSS_KEY(inside, inside)
CSS_KEY(interpolatematrix, interpolatematrix)
CSS_KEY(invert, invert)
CSS_KEY(italic, italic)
CSS_KEY(japanese-formal, japanese_formal)
CSS_KEY(japanese-informal, japanese_informal)
CSS_KEY(jis78, jis78)
CSS_KEY(jis83, jis83)
CSS_KEY(jis90, jis90)
@ -343,6 +345,9 @@ CSS_KEY(katakana, katakana)
CSS_KEY(katakana-iroha, katakana_iroha)
CSS_KEY(keep-all, keep_all)
CSS_KEY(khz, khz)
CSS_KEY(korean-hangul-formal, korean_hangul_formal)
CSS_KEY(korean-hanja-formal, korean_hanja_formal)
CSS_KEY(korean-hanja-informal, korean_hanja_informal)
CSS_KEY(landscape, landscape)
CSS_KEY(large, large)
CSS_KEY(larger, larger)
@ -476,6 +481,8 @@ CSS_KEY(separate, separate)
CSS_KEY(sepia, sepia)
CSS_KEY(show, show)
CSS_KEY(sideways, sideways)
CSS_KEY(simp-chinese-formal, simp_chinese_formal)
CSS_KEY(simp-chinese-informal, simp_chinese_informal)
CSS_KEY(simplified, simplified)
CSS_KEY(skew, skew)
CSS_KEY(skewx, skewx)
@ -534,6 +541,8 @@ CSS_KEY(titling-caps, titling_caps)
CSS_KEY(toggle, toggle)
CSS_KEY(top, top)
CSS_KEY(top-outside, top_outside)
CSS_KEY(trad-chinese-formal, trad_chinese_formal)
CSS_KEY(trad-chinese-informal, trad_chinese_informal)
CSS_KEY(traditional, traditional)
CSS_KEY(translate, translate)
CSS_KEY(translate3d, translate3d)

Просмотреть файл

@ -1237,6 +1237,15 @@ const int32_t nsCSSProps::kListStyleKTable[] = {
eCSSKeyword_katakana, NS_STYLE_LIST_STYLE_KATAKANA,
eCSSKeyword_hiragana_iroha, NS_STYLE_LIST_STYLE_HIRAGANA_IROHA,
eCSSKeyword_katakana_iroha, NS_STYLE_LIST_STYLE_KATAKANA_IROHA,
eCSSKeyword_japanese_informal, NS_STYLE_LIST_STYLE_JAPANESE_INFORMAL,
eCSSKeyword_japanese_formal, NS_STYLE_LIST_STYLE_JAPANESE_FORMAL,
eCSSKeyword_korean_hangul_formal, NS_STYLE_LIST_STYLE_KOREAN_HANGUL_FORMAL,
eCSSKeyword_korean_hanja_informal, NS_STYLE_LIST_STYLE_KOREAN_HANJA_INFORMAL,
eCSSKeyword_korean_hanja_formal, NS_STYLE_LIST_STYLE_KOREAN_HANJA_FORMAL,
eCSSKeyword_simp_chinese_informal, NS_STYLE_LIST_STYLE_SIMP_CHINESE_INFORMAL,
eCSSKeyword_simp_chinese_formal, NS_STYLE_LIST_STYLE_SIMP_CHINESE_FORMAL,
eCSSKeyword_trad_chinese_informal, NS_STYLE_LIST_STYLE_TRAD_CHINESE_INFORMAL,
eCSSKeyword_trad_chinese_formal, NS_STYLE_LIST_STYLE_TRAD_CHINESE_FORMAL,
eCSSKeyword__moz_cjk_heavenly_stem, NS_STYLE_LIST_STYLE_MOZ_CJK_HEAVENLY_STEM,
eCSSKeyword__moz_cjk_earthly_branch, NS_STYLE_LIST_STYLE_MOZ_CJK_EARTHLY_BRANCH,
eCSSKeyword__moz_trad_chinese_informal, NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_INFORMAL,

Просмотреть файл

@ -607,37 +607,46 @@ static inline mozilla::css::Side operator++(mozilla::css::Side& side, int) {
#define NS_STYLE_LIST_STYLE_KATAKANA 17
#define NS_STYLE_LIST_STYLE_HIRAGANA_IROHA 18
#define NS_STYLE_LIST_STYLE_KATAKANA_IROHA 19
#define NS_STYLE_LIST_STYLE_MOZ_CJK_HEAVENLY_STEM 24
#define NS_STYLE_LIST_STYLE_MOZ_CJK_EARTHLY_BRANCH 25
#define NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_INFORMAL 26
#define NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_FORMAL 27
#define NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_INFORMAL 28
#define NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_FORMAL 29
#define NS_STYLE_LIST_STYLE_MOZ_JAPANESE_INFORMAL 30
#define NS_STYLE_LIST_STYLE_MOZ_JAPANESE_FORMAL 31
#define NS_STYLE_LIST_STYLE_MOZ_ARABIC_INDIC 32
#define NS_STYLE_LIST_STYLE_MOZ_PERSIAN 33
#define NS_STYLE_LIST_STYLE_MOZ_URDU 34
#define NS_STYLE_LIST_STYLE_MOZ_DEVANAGARI 35
#define NS_STYLE_LIST_STYLE_MOZ_GURMUKHI 36
#define NS_STYLE_LIST_STYLE_MOZ_GUJARATI 37
#define NS_STYLE_LIST_STYLE_MOZ_ORIYA 38
#define NS_STYLE_LIST_STYLE_MOZ_KANNADA 39
#define NS_STYLE_LIST_STYLE_MOZ_MALAYALAM 40
#define NS_STYLE_LIST_STYLE_MOZ_BENGALI 41
#define NS_STYLE_LIST_STYLE_MOZ_TAMIL 42
#define NS_STYLE_LIST_STYLE_MOZ_TELUGU 43
#define NS_STYLE_LIST_STYLE_MOZ_THAI 44
#define NS_STYLE_LIST_STYLE_MOZ_LAO 45
#define NS_STYLE_LIST_STYLE_MOZ_MYANMAR 46
#define NS_STYLE_LIST_STYLE_MOZ_KHMER 47
#define NS_STYLE_LIST_STYLE_MOZ_HANGUL 48
#define NS_STYLE_LIST_STYLE_MOZ_HANGUL_CONSONANT 49
#define NS_STYLE_LIST_STYLE_MOZ_ETHIOPIC_HALEHAME 50
#define NS_STYLE_LIST_STYLE_MOZ_ETHIOPIC_NUMERIC 51
#define NS_STYLE_LIST_STYLE_MOZ_ETHIOPIC_HALEHAME_AM 52
#define NS_STYLE_LIST_STYLE_MOZ_ETHIOPIC_HALEHAME_TI_ER 53
#define NS_STYLE_LIST_STYLE_MOZ_ETHIOPIC_HALEHAME_TI_ET 54
#define NS_STYLE_LIST_STYLE_JAPANESE_INFORMAL 20
#define NS_STYLE_LIST_STYLE_JAPANESE_FORMAL 21
#define NS_STYLE_LIST_STYLE_KOREAN_HANGUL_FORMAL 22
#define NS_STYLE_LIST_STYLE_KOREAN_HANJA_INFORMAL 23
#define NS_STYLE_LIST_STYLE_KOREAN_HANJA_FORMAL 24
#define NS_STYLE_LIST_STYLE_SIMP_CHINESE_INFORMAL 25
#define NS_STYLE_LIST_STYLE_SIMP_CHINESE_FORMAL 26
#define NS_STYLE_LIST_STYLE_TRAD_CHINESE_INFORMAL 27
#define NS_STYLE_LIST_STYLE_TRAD_CHINESE_FORMAL 28
#define NS_STYLE_LIST_STYLE_MOZ_CJK_HEAVENLY_STEM 124
#define NS_STYLE_LIST_STYLE_MOZ_CJK_EARTHLY_BRANCH 125
#define NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_INFORMAL 126
#define NS_STYLE_LIST_STYLE_MOZ_TRAD_CHINESE_FORMAL 127
#define NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_INFORMAL 128
#define NS_STYLE_LIST_STYLE_MOZ_SIMP_CHINESE_FORMAL 129
#define NS_STYLE_LIST_STYLE_MOZ_JAPANESE_INFORMAL 130
#define NS_STYLE_LIST_STYLE_MOZ_JAPANESE_FORMAL 131
#define NS_STYLE_LIST_STYLE_MOZ_ARABIC_INDIC 132
#define NS_STYLE_LIST_STYLE_MOZ_PERSIAN 133
#define NS_STYLE_LIST_STYLE_MOZ_URDU 134
#define NS_STYLE_LIST_STYLE_MOZ_DEVANAGARI 135
#define NS_STYLE_LIST_STYLE_MOZ_GURMUKHI 136
#define NS_STYLE_LIST_STYLE_MOZ_GUJARATI 137
#define NS_STYLE_LIST_STYLE_MOZ_ORIYA 138
#define NS_STYLE_LIST_STYLE_MOZ_KANNADA 139
#define NS_STYLE_LIST_STYLE_MOZ_MALAYALAM 140
#define NS_STYLE_LIST_STYLE_MOZ_BENGALI 141
#define NS_STYLE_LIST_STYLE_MOZ_TAMIL 142
#define NS_STYLE_LIST_STYLE_MOZ_TELUGU 143
#define NS_STYLE_LIST_STYLE_MOZ_THAI 144
#define NS_STYLE_LIST_STYLE_MOZ_LAO 145
#define NS_STYLE_LIST_STYLE_MOZ_MYANMAR 146
#define NS_STYLE_LIST_STYLE_MOZ_KHMER 147
#define NS_STYLE_LIST_STYLE_MOZ_HANGUL 148
#define NS_STYLE_LIST_STYLE_MOZ_HANGUL_CONSONANT 149
#define NS_STYLE_LIST_STYLE_MOZ_ETHIOPIC_HALEHAME 150
#define NS_STYLE_LIST_STYLE_MOZ_ETHIOPIC_NUMERIC 151
#define NS_STYLE_LIST_STYLE_MOZ_ETHIOPIC_HALEHAME_AM 152
#define NS_STYLE_LIST_STYLE_MOZ_ETHIOPIC_HALEHAME_TI_ER 153
#define NS_STYLE_LIST_STYLE_MOZ_ETHIOPIC_HALEHAME_TI_ET 154
// See nsStyleList
#define NS_STYLE_LIST_STYLE_POSITION_INSIDE 0