package org.apache.poi.sl.usermodel;
import java.util.Locale;
public enum AutoNumberingScheme {
alphaLcParenBoth(0x0008, 1),
alphaUcParenBoth(0x000A, 2),
alphaLcParenRight(0x0009, 3),
alphaUcParenRight(0x000B, 4),
alphaLcPeriod(0x0000, 5),
alphaUcPeriod(0x0001, 6),
arabicParenBoth(0x000C, 7),
arabicParenRight(0x0002, 8),
arabicPeriod(0x0003, 9),
arabicPlain(0x000D, 10),
romanLcParenBoth(0x0004, 11),
romanUcParenBoth(0x000E, 12),
romanLcParenRight(0x0005, 13),
romanUcParenRight(0x000F, 14),
romanLcPeriod(0x0006, 15),
romanUcPeriod(0x0007, 16),
circleNumDbPlain(0x0012, 17),
circleNumWdBlackPlain(0x0014, 18),
circleNumWdWhitePlain(0x0013, 19),
arabicDbPeriod(0x001D, 20),
arabicDbPlain(0x001C, 21),
ea1ChsPeriod(0x0011, 22),
ea1ChsPlain(0x0010, 23),
ea1ChtPeriod(0x0015, 24),
ea1ChtPlain(0x0014, 25),
ea1JpnChsDbPeriod(0x0026, 26),
ea1JpnKorPlain(0x001A, 27),
ea1JpnKorPeriod(0x001B, 28),
arabic1Minus(0x0017, 29),
arabic2Minus(0x0018, 30),
hebrew2Minus(0x0019, 31),
thaiAlphaPeriod(0x001E, 32),
thaiAlphaParenRight(0x001F, 33),
thaiAlphaParenBoth(0x0020, 34),
thaiNumPeriod(0x0021, 35),
thaiNumParenRight(0x0022, 36),
thaiNumParenBoth(0x0023, 37),
hindiAlphaPeriod(0x0024, 38),
hindiNumPeriod(0x0025, 39),
hindiNumParenRight(0x0027, 40),
hindiAlpha1Period(0x0027, 41);
public final int nativeId, ooxmlId;
AutoNumberingScheme(int nativeId, int ooxmlId) {
this.nativeId = nativeId;
this.ooxmlId = ooxmlId;
}
public static AutoNumberingScheme forNativeID(int nativeId) {
for (AutoNumberingScheme ans : values()) {
if (ans.nativeId == nativeId) return ans;
}
return null;
}
public static AutoNumberingScheme forOoxmlID(int ooxmlId) {
for (AutoNumberingScheme ans : values()) {
if (ans.ooxmlId == ooxmlId) return ans;
}
return null;
}
public String getDescription() {
switch (this) {
case alphaLcPeriod : return "Lowercase Latin character followed by a period. Example: a., b., c., ...";
case alphaUcPeriod : return "Uppercase Latin character followed by a period. Example: A., B., C., ...";
case arabicParenRight : return "Arabic numeral followed by a closing parenthesis. Example: 1), 2), 3), ...";
case arabicPeriod : return "Arabic numeral followed by a period. Example: 1., 2., 3., ...";
case romanLcParenBoth : return "Lowercase Roman numeral enclosed in parentheses. Example: (i), (ii), (iii), ...";
case romanLcParenRight : return "Lowercase Roman numeral followed by a closing parenthesis. Example: i), ii), iii), ...";
case romanLcPeriod : return "Lowercase Roman numeral followed by a period. Example: i., ii., iii., ...";
case romanUcPeriod : return "Uppercase Roman numeral followed by a period. Example: I., II., III., ...";
case alphaLcParenBoth : return "Lowercase alphabetic character enclosed in parentheses. Example: (a), (b), (c), ...";
case alphaLcParenRight : return "Lowercase alphabetic character followed by a closing parenthesis. Example: a), b), c), ...";
case alphaUcParenBoth : return "Uppercase alphabetic character enclosed in parentheses. Example: (A), (B), (C), ...";
case alphaUcParenRight : return "Uppercase alphabetic character followed by a closing parenthesis. Example: A), B), C), ...";
case arabicParenBoth : return "Arabic numeral enclosed in parentheses. Example: (1), (2), (3), ...";
case arabicPlain : return "Arabic numeral. Example: 1, 2, 3, ...";
case romanUcParenBoth : return "Uppercase Roman numeral enclosed in parentheses. Example: (I), (II), (III), ...";
case romanUcParenRight : return "Uppercase Roman numeral followed by a closing parenthesis. Example: I), II), III), ...";
case ea1ChsPlain : return "Simplified Chinese.";
case ea1ChsPeriod : return "Simplified Chinese with single-byte period.";
case circleNumDbPlain : return "Double byte circle numbers.";
case circleNumWdWhitePlain : return "Wingdings white circle numbers.";
case circleNumWdBlackPlain : return "Wingdings black circle numbers.";
case ea1ChtPlain : return "Traditional Chinese.";
case ea1ChtPeriod : return "Traditional Chinese with single-byte period.";
case arabic1Minus : return "Bidi Arabic 1 (AraAlpha) with ANSI minus symbol.";
case arabic2Minus : return "Bidi Arabic 2 (AraAbjad) with ANSI minus symbol.";
case hebrew2Minus : return "Bidi Hebrew 2 with ANSI minus symbol.";
case ea1JpnKorPlain : return "Japanese/Korean.";
case ea1JpnKorPeriod : return "Japanese/Korean with single-byte period.";
case arabicDbPlain : return "Double-byte Arabic numbers.";
case arabicDbPeriod : return "Double-byte Arabic numbers with double-byte period.";
case thaiAlphaPeriod : return "Thai alphabetic character followed by a period.";
case thaiAlphaParenRight : return "Thai alphabetic character followed by a closing parenthesis.";
case thaiAlphaParenBoth : return "Thai alphabetic character enclosed by parentheses.";
case thaiNumPeriod : return "Thai numeral followed by a period.";
case thaiNumParenRight : return "Thai numeral followed by a closing parenthesis.";
case thaiNumParenBoth : return "Thai numeral enclosed in parentheses.";
case hindiAlphaPeriod : return "Hindi alphabetic character followed by a period.";
case hindiNumPeriod : return "Hindi numeric character followed by a period.";
case ea1JpnChsDbPeriod : return "Japanese with double-byte period.";
case hindiNumParenRight : return "Hindi numeric character followed by a closing parenthesis.";
case hindiAlpha1Period : return "Hindi alphabetic character followed by a period.";
default : return "Unknown Numbered Scheme";
}
}
public String format(int value) {
String index = formatIndex(value);
String cased = formatCase(index);
return formatSeperator(cased);
}
private String formatSeperator(String cased) {
String name = name().toLowerCase(Locale.ROOT);
if (name.contains("plain")) return cased;
if (name.contains("parenright")) return cased+")";
if (name.contains("parenboth")) return "("+cased+")";
if (name.contains("period")) return cased+".";
if (name.contains("minus")) return cased+"-";
return cased;
}
private String formatCase(String index) {
String name = name().toLowerCase(Locale.ROOT);
if (name.contains("lc")) return index.toLowerCase(Locale.ROOT);
if (name.contains("uc")) return index.toUpperCase(Locale.ROOT);
return index;
}
private static final String ARABIC_LIST = "0123456789";
private static final String ALPHA_LIST = "abcdefghijklmnopqrstuvwxyz";
private static final String WINGDINGS_WHITE_LIST =
"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089";
private static final String WINGDINGS_BLACK_LIST =
"\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094";
private static final String CIRCLE_DB_LIST =
"\u2776\u2777\u2778\u2779\u277A\u277B\u277C\u277D\u277E";
private String formatIndex(int value) {
String name = name().toLowerCase(Locale.ROOT);
if (name.startsWith("roman")) {
return formatRomanIndex(value);
} else if (name.startsWith("arabic") && !name.contains("db")) {
return getIndexedList(value, ARABIC_LIST, false);
} else if (name.startsWith("alpha")) {
return getIndexedList(value, ALPHA_LIST, true);
} else if (name.contains("WdWhite")) {
return (value == 10) ? "\u008A"
: getIndexedList(value, WINGDINGS_WHITE_LIST, false);
} else if (name.contains("WdBlack")) {
return (value == 10) ? "\u0095"
: getIndexedList(value, WINGDINGS_BLACK_LIST, false);
} else if (name.contains("NumDb")) {
return (value == 10) ? "\u277F"
: getIndexedList(value, CIRCLE_DB_LIST, true);
} else {
return "?";
}
}
private static String getIndexedList(int val, String list, boolean oneBased) {
StringBuilder sb = new StringBuilder();
addIndexedChar(val, list, oneBased, sb);
return sb.toString();
}
private static void addIndexedChar(int val, String list, boolean oneBased, StringBuilder sb) {
if (oneBased) val -= 1;
final int len = list.length();
if (val >= len) {
addIndexedChar(val/len, list, oneBased, sb);
}
sb.append(list.charAt(val%len));
}
private String formatRomanIndex(int value) {
final int[] VALUES = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
final String[] ROMAN = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
final String[][] conciseList = {
{"XLV", "VL"},
{"XCV", "VC"},
{"CDL", "LD"},
{"CML", "LM"},
{"CMVC", "LMVL"},
{"CDXC", "LDXL"},
{"CDVC", "LDVL"},
{"CMXC", "LMXL"},
{"XCIX", "VCIV"},
{"XLIX", "VLIV"},
{"XLIX", "IL"},
{"XCIX", "IC"},
{"CDXC", "XD"},
{"CDVC", "XDV"},
{"CDIC", "XDIX"},
{"LMVL", "XMV"},
{"CMIC", "XMIX"},
{"CMXC", "XM"},
{"XDV", "VD"},
{"XDIX", "VDIV"},
{"XMV", "VM"},
{"XMIX", "VMIV"},
{"VDIV", "ID"},
{"VMIV", "IM"}
};
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 13; i++) {
while (value >= VALUES[i]) {
value -= VALUES[i];
sb.append(ROMAN[i]);
}
}
String result = sb.toString();
for (String[] cc : conciseList) {
result = result.replace(cc[0], cc[1]);
}
return result;
}
}