package yuku.alkitab.base.util;
import gnu.trove.map.hash.TObjectIntHashMap;
import yuku.alkitab.util.Ari;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class OsisBookNames {
public static final String TAG = OsisBookNames.class.getSimpleName();
private static TObjectIntHashMap<String> bookNameToBookIdMap;
private static Pattern bookNamePattern;
private static Pattern bookNameWithChapterAndOptionalVersePattern;
static String[] names = {
"Gen",
"Exod",
"Lev",
"Num",
"Deut",
"Josh",
"Judg",
"Ruth",
"1Sam",
"2Sam",
"1Kgs",
"2Kgs",
"1Chr",
"2Chr",
"Ezra",
"Neh",
"Esth",
"Job",
"Ps",
"Prov",
"Eccl",
"Song",
"Isa",
"Jer",
"Lam",
"Ezek",
"Dan",
"Hos",
"Joel",
"Amos",
"Obad",
"Jonah",
"Mic",
"Nah",
"Hab",
"Zeph",
"Hag",
"Zech",
"Mal",
"Matt",
"Mark",
"Luke",
"John",
"Acts",
"Rom",
"1Cor",
"2Cor",
"Gal",
"Eph",
"Phil",
"Col",
"1Thess",
"2Thess",
"1Tim",
"2Tim",
"Titus",
"Phlm",
"Heb",
"Jas",
"1Pet",
"2Pet",
"1John",
"2John",
"3John",
"Jude",
"Rev",
};
static {
bookNameToBookIdMap = new TObjectIntHashMap<>(250, 0.75f, -1);
for (int i = 0; i < names.length; i++) {
bookNameToBookIdMap.put(names[i], i);
}
}
public static Pattern getBookNamePattern() {
if (bookNamePattern == null) {
StringBuilder sb = new StringBuilder(400);
sb.append('(');
for (int i = 0; i < names.length; i++) {
if (i != 0) sb.append('|');
sb.append(names[i]);
}
sb.append(')');
bookNamePattern = Pattern.compile(sb.toString());
}
return bookNamePattern;
}
public static Pattern getBookNameWithChapterAndOptionalVersePattern() {
if (bookNameWithChapterAndOptionalVersePattern == null) {
StringBuilder sb = new StringBuilder(400);
sb.append('(');
for (int i = 0; i < names.length; i++) {
if (i != 0) sb.append('|');
sb.append(names[i]);
}
sb.append(')');
sb.append("\\.([1-9][0-9]{0,2})(?:\\.([1-9][0-9]{0,2}))?");
bookNameWithChapterAndOptionalVersePattern = Pattern.compile(sb.toString());
}
return bookNameWithChapterAndOptionalVersePattern;
}
/**
* @param osisBookName OSIS Book Name (only OT and NT currently supported)
* @return 0 to 65 when OK, -1 when not found
*/
public static int osisBookNameToBookId(String osisBookName) {
if (osisBookName == null) return -1;
return bookNameToBookIdMap.get(osisBookName);
}
public static int osisToAri(final String osis) {
final Matcher m = getBookNameWithChapterAndOptionalVersePattern().matcher(osis);
if (m.matches()) {
String osisBookName = m.group(1);
String chapter_s = m.group(2);
String verse_s = m.group(3);
final int bookId = osisBookNameToBookId(osisBookName);
final int chapter_1 = Integer.parseInt(chapter_s);
final int verse_1 = (verse_s == null || verse_s.length() == 0)? 0: Integer.parseInt(verse_s);
return Ari.encode(bookId, chapter_1, verse_1);
}
return 0;
}
public static String getBookName(final int bookId) {
if (bookId < 0 || bookId >= names.length) {
return null;
}
return names[bookId];
}
}