1/** 2 * All the functions necessary to navigate a Bible 3 * @requires bible.BibleFormatter 4 * 5 * @author John Dyer (http://j.hn/) 6 */ 7 8bible.BibleNavigator = { 9 10 name: 'bible', 11 12 sectionSelector: 'div.chapter', 13 14 sectionIdAttr: 'data-osis', 15 16 fragmentSelector: 'span.verse', 17 18 fragmentIdAttr: 'data-osis', 19 20 getOptions: function() { 21 var html = '', 22 langCode, 23 language, 24 versionCode, 25 version; 26 27 for (langCode in bible.versions.versionData) { 28 language = bible.versions.versionData[langCode]; 29 30 html += '<optgroup label="' + language.languageName + '">'; 31 32 for (versionCode in language.versions) { 33 version = language.versions[versionCode]; 34 35 html += '<option value="' + versionCode + '" data-language="' + langCode + '" data-version=\'' + JSON.stringify(version) + '\'>' + version.abbreviation + ' - ' + version.name + '</option>'; 36 37 } 38 39 html += '</optgroup>'; 40 } 41 42 return html; 43 }, 44 45 formatNavigation: function(fragmentId, language) { 46 47 var reference = new bible.Reference(fragmentId); 48 reference.language = language; 49 50 return reference.toString(); 51 52 //return bible.BibleFormatter.verseCodeToReferenceString(fragmentId, 0); 53 }, 54 55 findFragment: function(fragmentId, content) { 56 return content.find('span.verse[data-osis="' + fragmentId + '"]'); 57 }, 58 59 parseString: function(input) { 60 var reference = new bible.Reference(input); 61 62 if (reference != null) { 63 // make sure the first verse is seleced 64 65 if (reference.verse1 < 1) { 66 reference.verse1 = 1; 67 } 68 return reference.toOsisVerse(); // not to chapter, to verse 69 } else { 70 return null; 71 } 72 }, 73 74 convertFragmentIdToSectionId: function(fragmentId) { 75 76 // 77 var parts = fragmentId.split('.'), 78 chapter = parts[0] + '.' + parts[1]; 79 80 81 return chapter; 82 }, 83 84 getNextSectionId: function(sectionId) { 85 var reference = new bible.Reference(sectionId), 86 nextChapterReference = reference.nextChapter(); 87 88 if (nextChapterReference !== null) { 89 return nextChapterReference.toOsisChapter(); 90 } else { 91 return null; 92 } 93 //return bible.BibleFormatter.getNextChapterCode(sectionId); 94 }, 95 96 getPrevSectionId: function(sectionId) { 97 var reference = new bible.Reference(sectionId), 98 prevChapterReference = reference.prevChapter(); 99 100 if (prevChapterReference !== null) { 101 return prevChapterReference.toOsisChapter(); 102 } else { 103 return null; 104 } 105 }, 106 107 setupNavigationList: function(document) { 108 document.navigationWindow.on('mouseleave', function() { 109 $(this).hide(); 110 }); 111 document.navigationWindow.html( 112 '<div class="book-list document-navigation-list"><h3>' + docs.Localizer.get('bible_navigator_books') + '</h3><div class="nav-scroller"><ul></ul></div></div>' + 113 '<div class="chapter-list document-navigation-list"><h3>' + docs.Localizer.get('bible_navigator_chapters') + '</h3><div class="nav-scroller"><ul></ul></div></div>' 114 ); 115 116 // events! 117 document.navigationWindow.on('click', '.book-list li', function() { 118 119 var li = $(this), 120 chapters = parseInt(li.attr('data-chapters'), 10), 121 chaptersHtml = ""; 122 123 for (var i= 0; i<chapters; i++) { 124 chaptersHtml += '<li>' + (i+1) + '</li>'; 125 } 126 127 document.navigationWindow.find('.chapter-list ul').html(chaptersHtml); 128 129 li.addClass('selected').siblings().removeClass('selected'); 130 }); 131 132 document.navigationWindow.on('click', '.chapter-list li', function() { 133 134 var li = $(this), 135 chapterNumber = parseInt(li.html(), 10), 136 bookOsis = li.closest('.document-navigation-window').find('.book-list li.selected').attr('data-osis'); 137 138 console.log(bookOsis + ' ' + chapterNumber); 139 140 document.navigateByString(bookOsis + ' ' + chapterNumber); 141 document.navigationWindow.hide(); 142 }); 143 }, 144 145 showNavigationList: function(document) { 146 147 // get books 148 var versionInfo = JSON.parse( document.selector.find('option:selected').attr('data-version') ); 149 booksHtml = ''; 150 151 for (var i in versionInfo.books) { 152 //books += '<li data-osis="' + bible.BOOK_DATA[ versionInfo.books[i] ].chapters.length + '">' + versionInfo.bookNames[i] + '</li>'; 153 booksHtml += '<li class="' + versionInfo.code.toLowerCase() + '" data-osis="' + versionInfo.books[i] + '" data-chapters="' + bible.BOOK_DATA[ versionInfo.books[i] ].chapters.length + '">' + 154 //versionInfo.bookNames[i] + 155 bible.BOOK_DATA[ versionInfo.books[i] ].names[versionInfo.language.toLowerCase()][0] + 156 '</li>'; 157 } 158 document.navigationWindow.find('.book-list ul').html(booksHtml); 159 160 161 // show 162 var inputPos = document.input.offset(), 163 inputHeight = document.input.outerHeight(); 164 165 document.navigationWindow.css({ 166 'top': (inputPos.top + inputHeight) + 'px', 167 'left': (inputPos.left) + 'px' 168 }) 169 .show(); 170 171 var reference = new bible.Reference(document.input.val()), 172 bookToSelect = document.navigationWindow.find('.book-list li[data-osis="' + reference.osisBookID + '"]'), 173 selectedBookOffset = bookToSelect.offset(), 174 scroller = document.navigationWindow.find('.book-list .nav-scroller'), 175 scrollerOffset = scroller.offset(); 176 177 scroller.scrollTop( selectedBookOffset.top - scrollerOffset.top - scroller.scrollTop() - 10); 178 179 bookToSelect.click(); 180 } 181 182};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.