[jsword-svn] r2199 - trunk/jsword/src/main/java/org/crosswire/jsword/versification

dmsmith at crosswire.org dmsmith at crosswire.org
Fri Jan 6 08:21:33 MST 2012


Author: dmsmith
Date: 2012-01-06 08:21:33 -0700 (Fri, 06 Jan 2012)
New Revision: 2199

Added:
   trunk/jsword/src/main/java/org/crosswire/jsword/versification/ReferenceSystem.java
Log:
First pass of a v11n ReferenceSystem. Currently hardcodes the KJV v11n.

Added: trunk/jsword/src/main/java/org/crosswire/jsword/versification/ReferenceSystem.java
===================================================================
--- trunk/jsword/src/main/java/org/crosswire/jsword/versification/ReferenceSystem.java	                        (rev 0)
+++ trunk/jsword/src/main/java/org/crosswire/jsword/versification/ReferenceSystem.java	2012-01-06 15:21:33 UTC (rev 2199)
@@ -0,0 +1,1178 @@
+/**
+ * Distribution License:
+ * JSword is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License, version 2.1 as published by
+ * the Free Software Foundation. This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ *
+ * The License is available on the internet at:
+ *       http://www.gnu.org/copyleft/lgpl.html
+ * or by writing to:
+ *      Free Software Foundation, Inc.
+ *      59 Temple Place - Suite 330
+ *      Boston, MA 02111-1307, USA
+ *
+ * Copyright: 2012
+ *     The copyright to this program is held by it's authors.
+ *
+ * ID: $Id: org.eclipse.jdt.ui.prefs 1178 2006-11-06 12:48:02Z dmsmith $
+ */
+package org.crosswire.jsword.versification;
+
+import org.crosswire.jsword.JSMsg;
+import org.crosswire.jsword.JSOtherMsg;
+import org.crosswire.jsword.passage.NoSuchKeyException;
+import org.crosswire.jsword.passage.NoSuchVerseException;
+import org.crosswire.jsword.passage.Verse;
+
+/**
+ * A named ReferenceSystem defines
+ * the order of BibleBooks by Testament,
+ * the number of chapters in each BibleBook,
+ * the number of verses in each chapter.
+ *
+ * @see gnu.lgpl.License for license details.<br>
+ *      The copyright to this program is held by it's authors.
+ * @author DM Smith [dmsmith555 at yahoo dot com]
+ */
+public class ReferenceSystem {
+    /**
+     * Construct a ReferenceSystem.
+     * @param osisName
+     */
+    public ReferenceSystem(String osisName) {
+        this.osisName = osisName;
+    }
+
+    /**
+     * Get the OSIS name for this ReferenceSystem.
+     * @return the OSIS name of the ReferenceSystem
+     */
+    public String getOSISName() {
+        return osisName;
+    }
+
+    /**
+     * Given a BibleBook, get the previous BibleBook in this ReferenceSystem. If it is the first book, return null.
+     * @param book A BibleBook in the ReferenceSystem
+     * @return the previous BibleBook or null.
+     */
+    public BibleBook getPreviousBook(BibleBook book) {
+        try {
+            return books[book.ordinal() - 1];
+        } catch (ArrayIndexOutOfBoundsException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Given a BibleBook, get the next BibleBook in this ReferenceSystem. If it is the last book, return null.
+     * @param book A BibleBook in the ReferenceSystem
+     * @return the previous BibleBook or null.
+     */
+    public BibleBook getNextBook(BibleBook book) {
+        try {
+            return books[book.ordinal() + 1];
+        } catch (ArrayIndexOutOfBoundsException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Get the last valid chapter number for a book.
+     * 
+     * @param book
+     *            The book part of the reference.
+     * @return The last valid chapter number for a book.
+     * @exception NoSuchVerseException
+     *                If the book is not valid
+     */
+    public int getLastChapter(BibleBook book) throws NoSuchVerseException {
+        // This is faster than doing the check explicitly, unless
+        // The exception is actually thrown, then it is a lot slower
+        // I'd like to think that the norm is to get it right
+        try {
+            return lastVerse[book.ordinal()].length - 1;
+        } catch (NullPointerException ex) {
+            return 0;
+        } catch (ArrayIndexOutOfBoundsException ex) {
+            return 0;
+        }
+    }
+
+    /**
+     * Get the last valid verse number for a chapter.
+     * 
+     * @param book
+     *            The book part of the reference.
+     * @param chapter
+     *            The current chapter
+     * @return The last valid verse number for a chapter
+     * @exception NoSuchVerseException
+     *                If the book or chapter number is not valid
+     */
+    public int getLastVerse(BibleBook book, int chapter) throws NoSuchVerseException {
+        // This is faster than doing the check explicitly, unless
+        // The exception is actually thrown, then it is a lot slower
+        // I'd like to think that the norm is to get it right
+        try {
+            return lastVerse[book.ordinal()][chapter];
+        } catch (NullPointerException ex) {
+            return 0;
+        } catch (ArrayIndexOutOfBoundsException ex) {
+            return 0;
+        }
+    }
+
+    /**
+     * The maximum number of verses in the Bible, including module, testament, book and chapter introductions.
+     * 
+     * @return the number of addressable verses in this versification.
+     */
+    public int maximumOrdinal() {
+        // The sentinel value in chapterStarts points to what would be the book introduction
+        // of the book following the last book in the NT, typically REV.
+        return chapterStarts[chapterStarts.length - 1][0] - 1;
+    }
+
+    /**
+     * Where does this verse come in the Bible. The value that this returns should be treated as opaque, useful for a bit set.
+     * The introductions to the Book, OT/NT Testaments, Bible books and chapters are included here.
+     * <ul>
+     * <li>0 - INTRO_BIBLE 0:0 - The Book introduction</li>
+     * <li>1 - INTRO_OT 0:0 - The OT Testament introduction</li>
+     * <li>2 - Gen 0:0 - The introduction to the book of Genesis</li>
+     * <li>3 - Gen 1:0 - The introduction to Genesis chapter 1</li>
+     * <li>4 - Gen 1:1</li>
+     * <li>...</li>
+     * <li>35 - Gen 1:31</li>
+     * <li>36 - Gen 2:0 - The introduction to Genesis chapter 2</li>
+     * <li>37 - Gen 2:1</li>
+     * <li>...</li>
+     * <li>n - last verse in the OT</li>
+     * <li>n + 1 - INTRO_NT, 0, 0 - The New Testament introduction</li>
+     * <li>n + 2 - Matt 0:0 - The introduction to Matt</li>
+     * <li>n + 3 - Matt 1:0 - The introduction to Matt 1</li>
+     * <li>n + 4 - Matt 1:1</li>
+     * <li>...</li>
+     * </ul>
+     * 
+     * @param verse
+     *            The verse to convert
+     * @return The ordinal number of verses
+     * @exception NoSuchVerseException
+     *                If the reference is illegal
+     */
+    public int getOrdinal(Verse verse) throws NoSuchVerseException {
+        BibleBook b = verse.getBook();
+        int c = verse.getChapter();
+        int v = verse.getVerse();
+        validate(b, c, v);
+        return chapterStarts[b.ordinal()][c] + v;
+    }
+
+    /**
+     * Where does this verse come in the Bible. The value that this returns should be treated as opaque, useful for a bit set.
+     * The introductions to the Book, OT/NT Testaments, Bible books and chapters are included here.
+     * <ul>
+     * <li>0 - INTRO_BIBLE 0:0 - The Book introduction</li>
+     * <li>1 - INTRO_OT 0:0 - The OT Testament introduction</li>
+     * <li>2 - Gen 0:0 - The introduction to the book of Genesis</li>
+     * <li>3 - Gen 1:0 - The introduction to Genesis chapter 1</li>
+     * <li>4 - Gen 1:1</li>
+     * <li>...</li>
+     * <li>35 - Gen 1:31</li>
+     * <li>36 - Gen 2:0 - The introduction to Genesis chapter 2</li>
+     * <li>37 - Genesis 2:1</li>
+     * <li>...</li>
+     * <li>n - last verse in the OT</li>
+     * <li>0 - INTRO_NT, 0, 0 - The New Testament introduction</li>
+     * <li>1 - Matt 0:0 - The introduction to Matt</li>
+     * <li>2 - Matt 1:0 - The introduction to Matt 1</li>
+     * <li>3 - Matt 1:1</li>
+     * <li>...</li>
+     * </ul>
+     * 
+     * @param verse
+     *            The verse to convert
+     * @return The ordinal number of verses
+     * @exception NoSuchVerseException
+     *                If the reference is illegal
+     */
+    public int getTestamentOrdinal(Verse verse) throws NoSuchVerseException {
+        BibleBook b = verse.getBook();
+        int c = verse.getChapter();
+        int v = verse.getVerse();
+        validate(b, c, v);
+        int ordinal = chapterStarts[b.ordinal()][c] + v;
+        if (ordinal >= ntSart) {
+            return ordinal - ntSart + 1;
+        }
+        return ordinal;
+    }
+
+    /**
+     * Where does this verse come in the Bible. This will unwind the value returned by getOrdinal(Verse).
+     * 
+     * @param ordinal
+     *            The ordinal number of the verse
+     * @return A Verse
+     * @exception NoSuchVerseException
+     *                If the reference is illegal
+     */
+    public Verse decodeOrdinal(int ordinal) throws NoSuchVerseException {
+        BibleBook book = null;
+        int bookIndex = -1;
+        int chapterIndex = 0;
+        int verse = 0;
+
+        if (ordinal < 0 || ordinal > maximumOrdinal()) {
+            throw new NoSuchVerseException(JSOtherMsg.lookupText("Ordinal must be between 0 and {0,number,integer} (given {1,number,integer}).", Integer.valueOf(maximumOrdinal()), Integer.valueOf(ordinal)));
+        }
+
+        // Handle three special cases
+        // Book/Module introduction
+        if (ordinal == 0) {
+            return new Verse(BibleBook.INTRO_BIBLE, 0, 0);
+        }
+
+        // OT introduction
+        if (ordinal == 1) {
+            return new Verse(BibleBook.INTRO_OT, 0, 0);
+        }
+
+        // NT introduction
+        if (ordinal == ntSart) {
+            return new Verse(BibleBook.INTRO_NT, 0, 0);
+        }
+
+        // The chapterStarts has a sentinel value at the end of the array
+        // Therefore, subtract  1
+        int lastBook = chapterStarts.length - 1;
+        for (int b = lastBook; b >= 0; b--) {
+            // A book has a slot for a heading followed by a slot for a chapter heading.
+            // These precede the start of the chapter.
+            if (ordinal >= chapterStarts[b][0]) {
+                bookIndex = b;
+                break;
+            }
+        }
+
+        // There is a gap for the New Testament introduction.
+        // This occurs when ordinal is one less than the book introduction of the next book.
+        if (bookIndex == otLastBook && ordinal == chapterStarts[bookIndex + 1][0] - 1) {
+            bookIndex++;
+        }
+
+        book = BibleBook.getBooks()[bookIndex];
+        int cib = getLastChapter(book);
+        for (int c = cib; c >= 0; c--) {
+            if (ordinal >= chapterStarts[bookIndex][c]) {
+                chapterIndex = c;
+                break;
+            }
+        }
+
+        if (chapterIndex > 0) {
+            verse = ordinal - chapterStarts[bookIndex][chapterIndex];
+        }
+        
+        return new Verse(book, chapterIndex, verse);
+    }
+
+    /**
+     * Does the following represent a real verse?. It is code like this that
+     * makes me wonder if I18 is done well/worth doing. All this code does is
+     * check if the numbers are valid, but the exception handling code is huge
+     * :(
+     * 
+     * @param book
+     *            The book part of the reference.
+     * @param chapter
+     *            The chapter part of the reference.
+     * @param verse
+     *            The verse part of the reference.
+     * @exception NoSuchVerseException
+     *                If the reference is illegal
+     */
+    public void validate(BibleBook book, int chapter, int verse) throws NoSuchVerseException {
+
+        // Check the chapter
+        int maxChapter = getLastChapter(book);
+        if (chapter < 0 || chapter > maxChapter) {
+            // TRANSLATOR: The user supplied a chapter that was out of bounds. This tells them what is allowed.
+            // {0} is the lowest value that is allowed. This is always 0.
+            // {1,number,integer} is the place holder for the highest chapter number in the book. The format is special in that it will present it in the user's preferred format.
+            // {2} is a placeholder for the Bible book name.
+            // {3,number,integer} is a placeholder for the chapter number that the user gave.
+            throw new NoSuchVerseException(JSMsg.gettext("Chapter should be between {0} and {1,number,integer} for {2} (given {3,number,integer}).",
+                    Integer.valueOf(0), Integer.valueOf(maxChapter), book.getPreferredName(), Integer.valueOf(chapter)
+                    ));
+        }
+
+        // Check the verse
+        int maxVerse = getLastVerse(book, chapter);
+        if (verse < 0 || verse > maxVerse) {
+            // TRANSLATOR: The user supplied a verse number that was out of bounds. This tells them what is allowed.
+            // {0} is the lowest value that is allowed. This is always 0.
+            // {1,number,integer} is the place holder for the highest verse number in the chapter. The format is special in that it will present it in the user's preferred format.
+            // {2} is a placeholder for the Bible book name.
+            // {3,number,integer} is a placeholder for the chapter number that the user gave.
+            // {4,number,integer} is a placeholder for the verse number that the user gave.
+            throw new NoSuchVerseException(JSMsg.gettext("Verse should be between {0} and {1,number,integer} for {2} {3,number,integer} (given {4,number,integer}).",
+                    Integer.valueOf(0), Integer.valueOf(maxVerse), book.getPreferredName(), Integer.valueOf(chapter), Integer.valueOf(verse)
+                    ));
+        }
+    }
+
+    /**
+     * Fix up these verses so that they are as valid a possible. This is
+     * currently done so that we can say "Gen 1:1" + 31 = "Gen 1:32" and
+     * "Gen 1:32".patch() is "Gen 2:1".
+     * <p>
+     * There is another patch system that allows us to use large numbers to mean
+     * "the end of" so "Gen 1:32".otherPatch() gives "Gen 1:31". This could be
+     * useful to allow the user to enter things like "Gen 1:99" meaning the end
+     * of the chapter. Or "Isa 99:1" to mean the last chapter in Isaiah verse 1
+     * or even "Rev 99:99" to mean the last verse in the Bible.
+     * <p>
+     * However I have not implemented this because I've used a different
+     * convention: "Gen 1:$" (OLB compatible) or "Gen 1:ff" (common commentary
+     * usage) to mean the end of the chapter - So the functionality is there
+     * anyway.
+     * <p>
+     * I think that getting into the habit of typing "Gen 1:99" is bad. It could
+     * be the source of surprises "Psa 119:99" is not what you'd might expect,
+     * and neither is "Psa 99:1" is you wanted the last chapter in Psalms -
+     * expecting us to type "Psa 999:1" seems like we're getting silly.
+     * <p>
+     * However despite this maybe we should provide the functionality anyway.
+     * 
+     * @param book the book to obtain
+     * @param chapter the supposed chapter
+     * @param verse the supposed verse
+     * @return The resultant verse.
+     */
+    public Verse patch(BibleBook book, int chapter, int verse) {
+        BibleBook patchedBook = book;
+        int patchedChapter = chapter;
+        int patchedVerse = verse;
+        
+        try {
+            // If the book is null, then patch to GENESIS
+            if (patchedBook == null) {
+                patchedBook = BibleBook.GEN;
+            }
+            // If they are too small
+            if (patchedChapter < 0) {
+                patchedChapter = 0;
+            }
+            if (patchedVerse < 0) {
+                patchedVerse = 0;
+            }
+
+            while (patchedChapter > getLastChapter(patchedBook)) {
+                patchedChapter -= getLastChapter(patchedBook);
+                patchedBook = getNextBook(patchedBook);
+
+                if (patchedBook == null) {
+                    patchedBook = BibleBook.REV;
+                    patchedChapter = getLastChapter(patchedBook);
+                    patchedVerse = getLastVerse(patchedBook, patchedChapter);
+                    return new Verse(patchedBook, patchedChapter, patchedVerse);
+                }
+            }
+
+            while (patchedVerse > getLastVerse(patchedBook, patchedChapter)) {
+                patchedVerse -= getLastVerse(patchedBook, patchedChapter);
+                patchedChapter += 1;
+
+                if (patchedChapter > getLastChapter(patchedBook)) {
+                    patchedChapter -= getLastChapter(patchedBook);
+                    patchedBook = getNextBook(patchedBook);
+
+                    if (patchedBook == null) {
+                        patchedBook = BibleBook.REV;
+                        patchedChapter = getLastChapter(patchedBook);
+                        patchedVerse = getLastVerse(patchedBook, patchedChapter);
+                        return new Verse(patchedBook, patchedChapter, patchedVerse);
+                    }
+                }
+            }
+
+            return new Verse(patchedBook, patchedChapter, patchedVerse);
+        } catch (NoSuchKeyException ex) {
+            assert false : ex;
+            return new Verse(BibleBook.GEN, 1, 1, true);
+        }
+    }
+
+    /** The OSIS name of the reference system. */
+    private String osisName;
+
+    /** The ordered list of BibleBooks */
+    private BibleBook[] books;
+
+    private int otLastBook = 38;
+    private int ntSart = 24115;
+
+    /** Constant for the max verse number in each chapter */
+    private int[][] lastVerse =
+    {
+        // Bible Introduction
+        {
+                0,
+        },
+        // Old Testament Introduction
+        {
+                0,
+        },
+        // Gen
+        {
+                0,    31,    25,    24,    26,    32,    22,    24,    22,    29,
+               32,    32,    20,    18,    24,    21,    16,    27,    33,    38,
+               18,    34,    24,    20,    67,    34,    35,    46,    22,    35,
+               43,    55,    32,    20,    31,    29,    43,    36,    30,    23,
+               23,    57,    38,    34,    34,    28,    34,    31,    22,    33,
+               26,
+        },
+        // Exod
+        {
+                0,    22,    25,    22,    31,    23,    30,    25,    32,    35,
+               29,    10,    51,    22,    31,    27,    36,    16,    27,    25,
+               26,    36,    31,    33,    18,    40,    37,    21,    43,    46,
+               38,    18,    35,    23,    35,    35,    38,    29,    31,    43,
+               38,
+        },
+        // Lev
+        {
+                0,    17,    16,    17,    35,    19,    30,    38,    36,    24,
+               20,    47,     8,    59,    57,    33,    34,    16,    30,    37,
+               27,    24,    33,    44,    23,    55,    46,    34,
+        },
+        // Num
+        {
+                0,    54,    34,    51,    49,    31,    27,    89,    26,    23,
+               36,    35,    16,    33,    45,    41,    50,    13,    32,    22,
+               29,    35,    41,    30,    25,    18,    65,    23,    31,    40,
+               16,    54,    42,    56,    29,    34,    13,
+        },
+        // Deut
+        {
+                0,    46,    37,    29,    49,    33,    25,    26,    20,    29,
+               22,    32,    32,    18,    29,    23,    22,    20,    22,    21,
+               20,    23,    30,    25,    22,    19,    19,    26,    68,    29,
+               20,    30,    52,    29,    12,
+        },
+        // Josh
+        {
+                0,    18,    24,    17,    24,    15,    27,    26,    35,    27,
+               43,    23,    24,    33,    15,    63,    10,    18,    28,    51,
+                9,    45,    34,    16,    33,
+        },
+        // Judg
+        {
+                0,    36,    23,    31,    24,    31,    40,    25,    35,    57,
+               18,    40,    15,    25,    20,    20,    31,    13,    31,    30,
+               48,    25,
+        },
+        // Ruth
+        {
+                0,    22,    23,    18,    22,
+        },
+        // 1Sam
+        {
+                0,    28,    36,    21,    22,    12,    21,    17,    22,    27,
+               27,    15,    25,    23,    52,    35,    23,    58,    30,    24,
+               42,    15,    23,    29,    22,    44,    25,    12,    25,    11,
+               31,    13,
+        },
+        // 2Sam
+        {
+                0,    27,    32,    39,    12,    25,    23,    29,    18,    13,
+               19,    27,    31,    39,    33,    37,    23,    29,    33,    43,
+               26,    22,    51,    39,    25,
+        },
+        // 1Kgs
+        {
+                0,    53,    46,    28,    34,    18,    38,    51,    66,    28,
+               29,    43,    33,    34,    31,    34,    34,    24,    46,    21,
+               43,    29,    53,
+        },
+        // 2Kgs
+        {
+                0,    18,    25,    27,    44,    27,    33,    20,    29,    37,
+               36,    21,    21,    25,    29,    38,    20,    41,    37,    37,
+               21,    26,    20,    37,    20,    30,
+        },
+        // 1Chr
+        {
+                0,    54,    55,    24,    43,    26,    81,    40,    40,    44,
+               14,    47,    40,    14,    17,    29,    43,    27,    17,    19,
+                8,    30,    19,    32,    31,    31,    32,    34,    21,    30,
+        },
+        // 2Chr
+        {
+                0,    17,    18,    17,    22,    14,    42,    22,    18,    31,
+               19,    23,    16,    22,    15,    19,    14,    19,    34,    11,
+               37,    20,    12,    21,    27,    28,    23,     9,    27,    36,
+               27,    21,    33,    25,    33,    27,    23,
+        },
+        // Ezra
+        {
+                0,    11,    70,    13,    24,    17,    22,    28,    36,    15,
+               44,
+        },
+        // Neh
+        {
+                0,    11,    20,    32,    23,    19,    19,    73,    18,    38,
+               39,    36,    47,    31,
+        },
+        // Esth
+        {
+                0,    22,    23,    15,    17,    14,    14,    10,    17,    32,
+                3,
+        },
+        // Job
+        {
+                0,    22,    13,    26,    21,    27,    30,    21,    22,    35,
+               22,    20,    25,    28,    22,    35,    22,    16,    21,    29,
+               29,    34,    30,    17,    25,     6,    14,    23,    28,    25,
+               31,    40,    22,    33,    37,    16,    33,    24,    41,    30,
+               24,    34,    17,
+        },
+        // Ps
+        {
+                0,     6,    12,     8,     8,    12,    10,    17,     9,    20,
+               18,     7,     8,     6,     7,     5,    11,    15,    50,    14,
+                9,    13,    31,     6,    10,    22,    12,    14,     9,    11,
+               12,    24,    11,    22,    22,    28,    12,    40,    22,    13,
+               17,    13,    11,     5,    26,    17,    11,     9,    14,    20,
+               23,    19,     9,     6,     7,    23,    13,    11,    11,    17,
+               12,     8,    12,    11,    10,    13,    20,     7,    35,    36,
+                5,    24,    20,    28,    23,    10,    12,    20,    72,    13,
+               19,    16,     8,    18,    12,    13,    17,     7,    18,    52,
+               17,    16,    15,     5,    23,    11,    13,    12,     9,     9,
+                5,     8,    28,    22,    35,    45,    48,    43,    13,    31,
+                7,    10,    10,     9,     8,    18,    19,     2,    29,   176,
+                7,     8,     9,     4,     8,     5,     6,     5,     6,     8,
+                8,     3,    18,     3,     3,    21,    26,     9,     8,    24,
+               13,    10,     7,    12,    15,    21,    10,    20,    14,     9,
+                6,
+        },
+        // Prov
+        {
+                0,    33,    22,    35,    27,    23,    35,    27,    36,    18,
+               32,    31,    28,    25,    35,    33,    33,    28,    24,    29,
+               30,    31,    29,    35,    34,    28,    28,    27,    28,    27,
+               33,    31,
+        },
+        // Eccl
+        {
+                0,    18,    26,    22,    16,    20,    12,    29,    17,    18,
+               20,    10,    14,
+        },
+        // Song
+        {
+                0,    17,    17,    11,    16,    16,    13,    13,    14,
+        },
+        // Isa
+        {
+                0,    31,    22,    26,     6,    30,    13,    25,    22,    21,
+               34,    16,     6,    22,    32,     9,    14,    14,     7,    25,
+                6,    17,    25,    18,    23,    12,    21,    13,    29,    24,
+               33,     9,    20,    24,    17,    10,    22,    38,    22,     8,
+               31,    29,    25,    28,    28,    25,    13,    15,    22,    26,
+               11,    23,    15,    12,    17,    13,    12,    21,    14,    21,
+                      22,    11,    12,    19,    12,    25,    24,
+        },
+        // Jer
+        {
+                0,    19,    37,    25,    31,    31,    30,    34,    22,    26,
+               25,    23,    17,    27,    22,    21,    21,    27,    23,    15,
+               18,    14,    30,    40,    10,    38,    24,    22,    17,    32,
+               24,    40,    44,    26,    22,    19,    32,    21,    28,    18,
+               16,    18,    22,    13,    30,     5,    28,     7,    47,    39,
+               46,    64,    34,
+        },
+        // Lam
+        {
+            0,    22,    22,    66,    22,    22,
+        },
+        // Ezek
+        {
+                0,    28,    10,    27,    17,    17,    14,    27,    18,    11,
+               22,    25,    28,    23,    23,     8,    63,    24,    32,    14,
+               49,    32,    31,    49,    27,    17,    21,    36,    26,    21,
+               26,    18,    32,    33,    31,    15,    38,    28,    23,    29,
+               49,    26,    20,    27,    31,    25,    24,    23,    35,
+        },
+        // Dan
+        {
+                0,    21,    49,    30,    37,    31,    28,    28,    27,    27,
+               21,    45,    13,
+        },
+        // Hos
+        {
+                0,    11,    23,     5,    19,    15,    11,    16,    14,    17,
+               15,    12,    14,    16,     9,
+        },
+        // Joel
+        {
+                0,    20,    32,    21,
+        },
+        // Amos
+        {
+                0,    15,    16,    15,    13,    27,    14,    17,    14,    15,
+        },
+        // Obad
+        {
+                0,    21,
+        },
+        // Jonah
+        {
+                0,    17,    10,    10,    11,
+        },
+        // Mic
+        {
+                0,    16,    13,    12,    13,    15,    16,    20,
+        },
+        // Nah
+        {
+                0,    15,    13,    19,
+        },
+        // Hab
+        {
+                0,    17,    20,    19,
+        },
+        // Zeph
+        {
+                0,    18,    15,    20,
+        },
+        // Hag
+        {
+                0,    15,    23,
+        },
+        // Zech
+        {
+                0,    21,    13,    10,    14,    11,    15,    14,    23,    17,
+               12,    17,    14,     9,    21,
+        },
+        // Mal
+        {
+                0,    14,    17,    18,     6,
+        },
+        // New Testament Introduction
+        {
+                0,
+        },
+        // Matt
+        {
+                0,    25,    23,    17,    25,    48,    34,    29,    34,    38,
+               42,    30,    50,    58,    36,    39,    28,    27,    35,    30,
+               34,    46,    46,    39,    51,    46,    75,    66,    20,
+        },
+        // Mark
+        {
+                0,    45,    28,    35,    41,    43,    56,    37,    38,    50,
+               52,    33,    44,    37,    72,    47,    20,
+        },
+        // Luke
+        {
+                0,    80,    52,    38,    44,    39,    49,    50,    56,    62,
+               42,    54,    59,    35,    35,    32,    31,    37,    43,    48,
+               47,    38,    71,    56,    53,
+        },
+        // John
+        {
+                0,    51,    25,    36,    54,    47,    71,    53,    59,    41,
+               42,    57,    50,    38,    31,    27,    33,    26,    40,    42,
+               31,    25,
+        },
+        // Acts
+        {
+                0,    26,    47,    26,    37,    42,    15,    60,    40,    43,
+               48,    30,    25,    52,    28,    41,    40,    34,    28,    41,
+               38,    40,    30,    35,    27,    27,    32,    44,    31,
+        },
+        // Rom
+        {
+                0,    32,    29,    31,    25,    21,    23,    25,    39,    33,
+               21,    36,    21,    14,    23,    33,    27,
+        },
+        // 1Cor
+        {
+                0,    31,    16,    23,    21,    13,    20,    40,    13,    27,
+               33,    34,    31,    13,    40,    58,    24,
+        },
+        // 2Cor
+        {
+                0,    24,    17,    18,    18,    21,    18,    16,    24,    15,
+               18,    33,    21,    14,
+        },
+        // Gal
+        {
+                0,    24,    21,    29,    31,    26,    18,
+        },
+        // Eph
+        {
+                0,    23,    22,    21,    32,    33,    24,
+        },
+        // Phil
+        {
+                0,    30,    30,    21,    23,
+        },
+        // Col
+        {
+                0,    29,    23,    25,    18,
+        },
+        // 1Thess
+        {
+                0,    10,    20,    13,    18,    28,
+        },
+        // 2Thess
+        {
+                0,    12,    17,    18,
+        },
+        // 1Tim
+        {
+                0,    20,    15,    16,    16,    25,    21,
+        },
+        // 2Tim
+        {
+                0,    18,    26,    17,    22,
+        },
+        // Titus
+        {
+                0,    16,    15,    15,
+        },
+        // Phlm
+        {
+                0,    25,
+        },
+        // Heb
+        {
+                0,    14,    18,    19,    16,    14,    20,    28,    13,    28,
+               39,    40,    29,    25,
+        },
+        // Jas
+        {
+                0,    27,    26,    18,    17,    20,
+        },
+        // 1Pet
+        {
+                0,    25,    25,    22,    19,    14,
+        },
+        // 2Pet
+        {
+                0,    21,    22,    18,
+        },
+        // 1John
+        {
+                0,    10,    29,    24,    21,    21,
+        },
+        // 2John
+        {
+                0,    13,
+        },
+        // 3John
+        {
+                0,    14,
+        },
+        // Jude
+        {
+                0,    25,
+        },
+        // Rev
+        {
+                0,    20,    29,    22,    11,    14,    17,    17,    13,    21,
+               11,    19,    17,    18,    20,     8,    21,    18,    24,    21,
+               15,    27,    21,
+        },
+    };
+
+    /**
+     * Constant for the ordinal number of the first verse in each chapter.
+     */
+    // Note the sentinel at the end of the array is one greater
+    // than the last ordinal in the last book
+    private int[][] chapterStarts =
+    {
+        // Bible Introduction
+        {
+                0,
+        },
+        // Old Testament Introduction
+        {
+                1,
+        },
+        // Gen
+        { 
+                2,     3,    35,    61,    86,   113,   146,   169,   194,   217, 
+              247,   280,   313,   334,   353,   378,   400,   417,   445,   479, 
+              518,   537,   572,   597,   618,   686,   721,   757,   804,   827, 
+              863,   907,   963,   996,  1017,  1049,  1079,  1123,  1160,  1191, 
+             1215,  1239,  1297,  1336,  1371,  1406,  1435,  1470,  1502,  1525, 
+             1559, 
+        },
+        // Exod
+        { 
+             1586,  1587,  1610,  1636,  1659,  1691,  1715,  1746,  1772,  1805, 
+             1841,  1871,  1882,  1934,  1957,  1989,  2017,  2054,  2071,  2099, 
+             2125,  2152,  2189,  2221,  2255,  2274,  2315,  2353,  2375,  2419, 
+             2466,  2505,  2524,  2560,  2584,  2620,  2656,  2695,  2725,  2757, 
+             2801, 
+        },
+        // Lev
+        { 
+             2840,  2841,  2859,  2876,  2894,  2930,  2950,  2981,  3020,  3057, 
+             3082,  3103,  3151,  3160,  3220,  3278,  3312,  3347,  3364,  3395, 
+             3433,  3461,  3486,  3520,  3565,  3589,  3645,  3692, 
+        },
+        // Num
+        { 
+             3727,  3728,  3783,  3818,  3870,  3920,  3952,  3980,  4070,  4097, 
+             4121,  4158,  4194,  4211,  4245,  4291,  4333,  4384,  4398,  4431, 
+             4454,  4484,  4520,  4562,  4593,  4619,  4638,  4704,  4728,  4760, 
+             4801,  4818,  4873,  4916,  4973,  5003,  5038, 
+        },
+        // Deut
+        { 
+             5052,  5053,  5100,  5138,  5168,  5218,  5252,  5278,  5305,  5326, 
+             5356,  5379,  5412,  5445,  5464,  5494,  5518,  5541,  5562,  5585, 
+             5607,  5628,  5652,  5683,  5709,  5732,  5752,  5772,  5799,  5868, 
+             5898,  5919,  5950,  6003,  6033, 
+        },
+        // Josh
+        { 
+             6046,  6047,  6066,  6091,  6109,  6134,  6150,  6178,  6205,  6241, 
+             6269,  6313,  6337,  6362,  6396,  6412,  6476,  6487,  6506,  6535, 
+             6587,  6597,  6643,  6678,  6695, 
+        },
+        // Judg
+        { 
+             6729,  6730,  6767,  6791,  6823,  6848,  6880,  6921,  6947,  6983, 
+             7041,  7060,  7101,  7117,  7143,  7164,  7185,  7217,  7231,  7263, 
+             7294,  7343, 
+        },
+        // Ruth
+        { 
+             7369,  7370,  7393,  7417,  7436, 
+        },
+        // 1Sam
+        { 
+             7459,  7460,  7489,  7526,  7548,  7571,  7584,  7606,  7624,  7647, 
+             7675,  7703,  7719,  7745,  7769,  7822,  7858,  7882,  7941,  7972, 
+             7997,  8040,  8056,  8080,  8110,  8133,  8178,  8204,  8217,  8243, 
+             8255,  8287, 
+        },
+        // 2Sam
+        { 
+             8301,  8302,  8330,  8363,  8403,  8416,  8442,  8466,  8496,  8515, 
+             8529,  8549,  8577,  8609,  8649,  8683,  8721,  8745,  8775,  8809, 
+             8853,  8880,  8903,  8955,  8995, 
+        },
+        // 1Kgs
+        { 
+             9021,  9022,  9076,  9123,  9152,  9187,  9206,  9245,  9297,  9364, 
+             9393,  9423,  9467,  9501,  9536,  9568,  9603,  9638,  9663,  9710, 
+             9732,  9776,  9806, 
+        },
+        // 2Kgs
+        { 
+             9860,  9861,  9880,  9906,  9934,  9979, 10007, 10041, 10062, 10092, 
+            10130, 10167, 10189, 10211, 10237, 10267, 10306, 10327, 10369, 10407, 
+            10445, 10467, 10494, 10515, 10553, 10574, 
+        },
+        // 1Chr
+        { 
+            10605, 10606, 10661, 10717, 10742, 10786, 10813, 10895, 10936, 10977, 
+            11022, 11037, 11085, 11126, 11141, 11159, 11189, 11233, 11261, 11279, 
+            11299, 11308, 11339, 11359, 11392, 11424, 11456, 11489, 11524, 11546, 
+        },
+        // 2Chr
+        { 
+            11577, 11578, 11596, 11615, 11633, 11656, 11671, 11714, 11737, 11756, 
+            11788, 11808, 11832, 11849, 11872, 11888, 11908, 11923, 11943, 11978, 
+            11990, 12028, 12049, 12062, 12084, 12112, 12141, 12165, 12175, 12203, 
+            12240, 12268, 12290, 12324, 12350, 12384, 12412, 
+        },
+        // Ezra
+        { 
+            12436, 12437, 12449, 12520, 12534, 12559, 12577, 12600, 12629, 12666, 
+            12682, 
+        },
+        // Neh
+        { 
+            12727, 12728, 12740, 12761, 12794, 12818, 12838, 12858, 12932, 12951, 
+            12990, 13030, 13067, 13115, 
+        },
+        // Esth
+        { 
+            13147, 13148, 13171, 13195, 13211, 13229, 13244, 13259, 13270, 13288, 
+            13321, 
+        },
+        // Job
+        { 
+            13325, 13326, 13349, 13363, 13390, 13412, 13440, 13471, 13493, 13516, 
+            13552, 13575, 13596, 13622, 13651, 13674, 13710, 13733, 13750, 13772, 
+            13802, 13832, 13867, 13898, 13916, 13942, 13949, 13964, 13988, 14017, 
+            14043, 14075, 14116, 14139, 14173, 14211, 14228, 14262, 14287, 14329, 
+            14360, 14385, 14420, 
+        },
+        // Ps
+        { 
+            14438, 14439, 14446, 14459, 14468, 14477, 14490, 14501, 14519, 14529, 
+            14550, 14569, 14577, 14586, 14593, 14601, 14607, 14619, 14635, 14686, 
+            14701, 14711, 14725, 14757, 14764, 14775, 14798, 14811, 14826, 14836, 
+            14848, 14861, 14886, 14898, 14921, 14944, 14973, 14986, 15027, 15050, 
+            15064, 15082, 15096, 15108, 15114, 15141, 15159, 15171, 15181, 15196, 
+            15217, 15241, 15261, 15271, 15278, 15286, 15310, 15324, 15336, 15348, 
+            15366, 15379, 15388, 15401, 15413, 15424, 15438, 15459, 15467, 15503, 
+            15540, 15546, 15571, 15592, 15621, 15645, 15656, 15669, 15690, 15763, 
+            15777, 15797, 15814, 15823, 15842, 15855, 15869, 15887, 15895, 15914, 
+            15967, 15985, 16002, 16018, 16024, 16048, 16060, 16074, 16087, 16097, 
+            16107, 16113, 16122, 16151, 16174, 16210, 16256, 16305, 16349, 16363, 
+            16395, 16403, 16414, 16425, 16435, 16444, 16463, 16483, 16486, 16516, 
+            16693, 16701, 16710, 16720, 16725, 16734, 16740, 16747, 16753, 16760, 
+            16769, 16778, 16782, 16801, 16805, 16809, 16831, 16858, 16868, 16877, 
+            16902, 16916, 16927, 16935, 16948, 16964, 16986, 16997, 17018, 17033, 
+            17043, 
+        },
+        // Prov
+        { 
+            17050, 17051, 17085, 17108, 17144, 17172, 17196, 17232, 17260, 17297, 
+            17316, 17349, 17381, 17410, 17436, 17472, 17506, 17540, 17569, 17594, 
+            17624, 17655, 17687, 17717, 17753, 17788, 17817, 17846, 17874, 17903, 
+            17931, 17965, 
+        },
+        // Eccl
+        { 
+            17997, 17998, 18017, 18044, 18067, 18084, 18105, 18118, 18148, 18166, 
+            18185, 18206, 18217, 
+        },
+        // Song
+        { 
+            18232, 18233, 18251, 18269, 18281, 18298, 18315, 18329, 18343, 
+        },
+        // Isa
+        { 
+            18358, 18359, 18391, 18414, 18441, 18448, 18479, 18493, 18519, 18542, 
+            18564, 18599, 18616, 18623, 18646, 18679, 18689, 18704, 18719, 18727, 
+            18753, 18760, 18778, 18804, 18823, 18847, 18860, 18882, 18896, 18926, 
+            18951, 18985, 18995, 19016, 19041, 19059, 19070, 19093, 19132, 19155, 
+            19164, 19196, 19226, 19252, 19281, 19310, 19336, 19350, 19366, 19389, 
+            19416, 19428, 19452, 19468, 19481, 19499, 19513, 19526, 19548, 19563, 
+            19585, 19608, 19620, 19633, 19653, 19666, 19692, 
+        },
+        // Jer
+        { 
+            19717, 19718, 19738, 19776, 19802, 19834, 19866, 19897, 19932, 19955, 
+            19982, 20008, 20032, 20050, 20078, 20101, 20123, 20145, 20173, 20197, 
+            20213, 20232, 20247, 20278, 20319, 20330, 20369, 20394, 20417, 20435, 
+            20468, 20493, 20534, 20579, 20606, 20629, 20649, 20682, 20704, 20733, 
+            20752, 20769, 20788, 20811, 20825, 20856, 20862, 20891, 20899, 20947, 
+            20987, 21034, 21099, 
+        },
+        // Lam
+        { 
+            21134, 21135, 21158, 21181, 21248, 21271, 
+        },
+        // Ezek
+        { 
+            21294, 21295, 21324, 21335, 21363, 21381, 21399, 21414, 21442, 21461, 
+            21473, 21496, 21522, 21551, 21575, 21599, 21608, 21672, 21697, 21730, 
+            21745, 21795, 21828, 21860, 21910, 21938, 21956, 21978, 22015, 22042, 
+            22064, 22091, 22110, 22143, 22177, 22209, 22225, 22264, 22293, 22317, 
+            22347, 22397, 22424, 22445, 22473, 22505, 22531, 22556, 22580, 
+        },
+        // Dan
+        { 
+            22616, 22617, 22639, 22689, 22720, 22758, 22790, 22819, 22848, 22876, 
+            22904, 22926, 22972, 
+        },
+        // Hos
+        { 
+            22986, 22987, 22999, 23023, 23029, 23049, 23065, 23077, 23094, 23109, 
+            23127, 23143, 23156, 23171, 23188, 
+        },
+        // Joel
+        { 
+            23198, 23199, 23220, 23253, 
+        },
+        // Amos
+        { 
+            23275, 23276, 23292, 23309, 23325, 23339, 23367, 23382, 23400, 23415, 
+        },
+        // Obad
+        { 
+            23431, 23432, 
+        },
+        // Jonah
+        { 
+            23454, 23455, 23473, 23484, 23495, 
+        },
+        // Mic
+        { 
+            23507, 23508, 23525, 23539, 23552, 23566, 23582, 23599, 
+        },
+        // Nah
+        { 
+            23620, 23621, 23637, 23651, 
+        },
+        // Hab
+        { 
+            23671, 23672, 23690, 23711, 
+        },
+        // Zeph
+        { 
+            23731, 23732, 23751, 23767, 
+        },
+        // Hag
+        { 
+            23788, 23789, 23805, 
+        },
+        // Zech
+        { 
+            23829, 23830, 23852, 23866, 23877, 23892, 23904, 23920, 23935, 23959, 
+            23977, 23990, 24008, 24023, 24033, 
+        },
+        // Mal
+        { 
+            24055, 24056, 24071, 24089, 24108, 
+        },
+        // NT Testament Introduction
+        {
+            24115,
+        },
+        // Matt
+        { 
+            24116, 24117, 24143, 24167, 24185, 24211, 24260, 24295, 24325, 24360, 
+            24399, 24442, 24473, 24524, 24583, 24620, 24660, 24689, 24717, 24753, 
+            24784, 24819, 24866, 24913, 24953, 25005, 25052, 25128, 25195, 
+        },
+        // Mark
+        { 
+            25216, 25217, 25263, 25292, 25328, 25370, 25414, 25471, 25509, 25548, 
+            25599, 25652, 25686, 25731, 25769, 25842, 25890, 
+        },
+        // Luke
+        { 
+            25911, 25912, 25993, 26046, 26085, 26130, 26170, 26220, 26271, 26328, 
+            26391, 26434, 26489, 26549, 26585, 26621, 26654, 26686, 26724, 26768, 
+            26817, 26865, 26904, 26976, 27033, 
+        },
+        // John
+        { 
+            27087, 27088, 27140, 27166, 27203, 27258, 27306, 27378, 27432, 27492, 
+            27534, 27577, 27635, 27686, 27725, 27757, 27785, 27819, 27846, 27887, 
+            27930, 27962, 
+        },
+        // Acts
+        { 
+            27988, 27989, 28016, 28064, 28091, 28129, 28172, 28188, 28249, 28290, 
+            28334, 28383, 28414, 28440, 28493, 28522, 28564, 28605, 28640, 28669, 
+            28711, 28750, 28791, 28822, 28858, 28886, 28914, 28947, 28992, 
+        },
+        // Rom
+        { 
+            29024, 29025, 29058, 29088, 29120, 29146, 29168, 29192, 29218, 29258, 
+            29292, 29314, 29351, 29373, 29388, 29412, 29446, 
+        },
+        // 1Cor
+        { 
+            29474, 29475, 29507, 29524, 29548, 29570, 29584, 29605, 29646, 29660, 
+            29688, 29722, 29757, 29789, 29803, 29844, 29903, 
+        },
+        // 2Cor
+        { 
+            29928, 29929, 29954, 29972, 29991, 30010, 30032, 30051, 30068, 30093, 
+            30109, 30128, 30162, 30184, 
+        },
+        // Gal
+        { 
+            30199, 30200, 30225, 30247, 30277, 30309, 30336, 
+        },
+        // Eph
+        { 
+            30355, 30356, 30380, 30403, 30425, 30458, 30492, 
+        },
+        // Phil
+        { 
+            30517, 30518, 30549, 30580, 30602, 
+        },
+        // Col
+        { 
+            30626, 30627, 30657, 30681, 30707, 
+        },
+        // 1Thess
+        { 
+            30726, 30727, 30738, 30759, 30773, 30792, 
+        },
+        // 2Thess
+        { 
+            30821, 30822, 30835, 30853, 
+        },
+        // 1Tim
+        { 
+            30872, 30873, 30894, 30910, 30927, 30944, 30970, 
+        },
+        // 2Tim
+        { 
+            30992, 30993, 31012, 31039, 31057, 
+        },
+        // Titus
+        { 
+            31080, 31081, 31098, 31114, 
+        },
+        // Phlm
+        { 
+            31130, 31131, 
+        },
+        // Heb
+        { 
+            31157, 31158, 31173, 31192, 31212, 31229, 31244, 31265, 31294, 31308, 
+            31337, 31377, 31418, 31448, 
+        },
+        // Jas
+        { 
+            31474, 31475, 31503, 31530, 31549, 31567, 
+        },
+        // 1Pet
+        { 
+            31588, 31589, 31615, 31641, 31664, 31684, 
+        },
+        // 2Pet
+        { 
+            31699, 31700, 31722, 31745, 
+        },
+        // 1John
+        { 
+            31764, 31765, 31776, 31806, 31831, 31853, 
+        },
+        // 2John
+        { 
+            31875, 31876, 
+        },
+        // 3John
+        { 
+            31890, 31891, 
+        },
+        // Jude
+        { 
+            31906, 31907, 
+        },
+        // Rev
+        { 
+            31933, 31934, 31955, 31985, 32008, 32020, 32035, 32053, 32071, 32085, 
+            32107, 32119, 32139, 32157, 32176, 32197, 32206, 32228, 32247, 32272, 
+            32294, 32310, 32338, 
+        },
+        // Sentinel
+        { 
+            32360, 
+        },
+    };
+}




More information about the jsword-svn mailing list