/** * This filter produces files in USFM, html and text format. * The text files are to be used for showing the differences between them. * The files contain all verses that differ. * $bible: The Bible to go through. * $directory: The existing directory where to put the files. * Two files are created: verses_old.usfm and verses_new.usfm. * The book chapter.verse precede each verse. */ public static function produceVerseLevel($bible, $directory) { $database_bibles = Database_Bibles::getInstance(); $database_modifications = Database_Modifications::getInstance(); $database_books = Database_Books::getInstance(); $database_config_bible = Database_Config_Bible::getInstance(); $stylesheet = $database_config_bible->getExportStylesheet($bible); $old_vs_usfm = array(); $new_vs_usfm = array(); $filter_text_old = new Filter_Text($bible); $filter_text_old->html_text_standard = new Html_Text(Locale_Translate::_("Bible")); $filter_text_old->text_text = new Text_Text(); $filter_text_new = new Filter_Text($bible); $filter_text_new->html_text_standard = new Html_Text(Locale_Translate::_("Bible")); $filter_text_new->text_text = new Text_Text(); $books = $database_modifications->getTeamDiffBooks($bible); foreach ($books as $book) { $bookname = $database_books->getEnglishFromId($book); $chapters = $database_modifications->getTeamDiffChapters($bible, $book); foreach ($chapters as $chapter) { // Go through the combined verse numbers in the old and new chapter. $old_chapter_usfm = $database_modifications->getTeamDiff($bible, $book, $chapter); $new_chapter_usfm = $database_bibles->getChapter($bible, $book, $chapter); $old_verse_numbers = Filter_Usfm::getVerseNumbers($old_chapter_usfm); $new_verse_numbers = Filter_Usfm::getVerseNumbers($new_chapter_usfm); $verses = array_merge($old_verse_numbers, $new_verse_numbers); $verses = array_unique($verses); sort($verses, SORT_NUMERIC); foreach ($verses as $verse) { $old_verse_text = Filter_Usfm::getVerseText($old_chapter_usfm, $verse); $new_verse_text = Filter_Usfm::getVerseText($new_chapter_usfm, $verse); if ($old_verse_text != $new_verse_text) { $usfmCode = "\\p {$bookname} {$chapter}.{$verse} {$old_verse_text}"; $old_vs_usfm[] = $usfmCode; $filter_text_old->addUsfmCode($usfmCode); $usfmCode = "\\p {$bookname} {$chapter}.{$verse} {$new_verse_text}"; $new_vs_usfm[] = $usfmCode; $filter_text_new->addUsfmCode($usfmCode); } } } } file_put_contents("{$directory}/verses_old.usfm", implode("\n", $old_vs_usfm)); file_put_contents("{$directory}/verses_new.usfm", implode("\n", $new_vs_usfm)); $filter_text_old->run($stylesheet); $filter_text_new->run($stylesheet); $filter_text_old->html_text_standard->save("{$directory}/verses_old.html"); $filter_text_new->html_text_standard->save("{$directory}/verses_new.html"); $filter_text_old->text_text->save("{$directory}/verses_old.txt"); $filter_text_new->text_text->save("{$directory}/verses_new.txt"); }
die; } // Check there's anything to save at all. $usfm = trim($usfm); if ($usfm == "") { echo Locale_Translate::_("Nothing to save"); die; } // Check on valid UTF-8. if (!Validate_Utf8::valid($usfm)) { echo Locale_Translate::_("Cannot save: Needs Unicode"); die; } // Get the old chapter USFM into an array of verse => USFM fragment. $usfmString = $database_bibles->getChapter($bible, $book, $chapter); $verses = Filter_Usfm::getVerseNumbers($usfmString); $verses = array_unique($verses); sort($verses, SORT_NUMERIC); $usfmArray = array(); foreach ($verses as $vs) { $usfmArray[$vs] = Filter_Usfm::getVerseText($usfmString, $vs); } // Store the verse USFM in the array. $usfmArray[$verse] = $usfm; // Create the updated chapter USFM as a string. $usfm = implode("\n", $usfmArray); $stylesheet = $database_config_user->getStylesheet(); $book_chapter_text = Filter_Usfm::import($usfm, $stylesheet); foreach ($book_chapter_text as $data) { $book_number = $data[0]; $chapter_number = $data[1];
public function testGetVerseNumbersTwo() { $usfm = <<<'EOD' \c 80 \s Umkhuleko wokusizwa kukaIsrayeli \d Kumqondisi wokuhlabelela. NgeShoshanimi. Ubufakazi. Isihlabelelo sikaAsafi \p \v 1 Melusi kaIsrayeli, beka indlebe, okhokhela uJosefa\x + Hlab. 81.5.\x* njengomhlambi\x + Gen. 48.15. 49.24. Hlab. 77.20. Hlab. 95.7.\x*, ohlezi \add phakathi\add* \w kwamakherubhi\w**\x + Hlab. 99.1. Eks. 25.22.\x*, khanyisa\x + Hlab. 50.2.\x*. \v 2 Phambi kukaEfrayimi loBhenjamini loManase\x + Nani 2.18-23.\x* vusa amandla akho, uze ube lusindiso lwethu\x + Hlab. 35.23.\x*. \p \v 3 Siphendule, Nkulunkulu\x + 80.7,14,19. Hlab. 60.1. 85.4. Lilo 5.21.\x*, wenze ubuso bakho bukhanye, ngakho sizasindiswa\x + Nani 6.25. Hlab. 4.6.\x*. \p \v 4 N\nd kosi\nd* Nkulunkulu wamabandla\x + Ps 59.5. 84.8.\x*, koze kube nini uthukuthelela umkhuleko wabantu bakho\x + Hlab. 74.10.\x*? \v 5 Ubenze badla isinkwa sezinyembezi\x + Hlab. 42.3. Hlab. 102.9.\x*, wabanathisa izinyembezi ngesilinganiso\x + Isa. 40.12.\x*. \v 6 Usenza sibe yingxabano kubomakhelwane bethu, lezitha zethu ziyahlekisana \add ngathi\x + Hlab. 44.13. 79.4.\x*\add*. \p \v 7 Siphendule, Nkulunkulu wamabandla, wenze ubuso bakho bukhanye, ngakho sizasindiswa\x + 80.7,14,19. Hlab. 60.1. 85.4. Lilo 5.21.\x*. \p \v 8 Waliletha ivini livela eGibhithe\x + Isa. 5.1-7. 27.2. Jer. 2.21. 12.10. Hez. 15.6. 17.6. 19.10. Mat. 21.33. Mark. 12.1. Luka 20.9. Joha. 15.1-6.\x*, wazixotsha izizwe\x + Hlab. 78.55.\x*, walihlanyela lona\x + Hlab. 44.2.\x*. \v 9 Walungisa \add indawo\add* phambi kwalo\x + Gen. 24.31. Josh. 24.12.\x*, wagxilisa impande zalo, laze lagcwala umhlaba. \v 10 Izintaba zembeswa ngomthunzi walo, lezingatsha zalo zi\add njenge\add*misedari kaNkulunkulu. \v 11 Lanabisela ingatsha zalo elwandle\x + Jobe 14.9.\x*, lamahlumela alo\x + Jobe 8.16.\x* emfuleni\x + Hlab. 72.8.\x*. \v 12 Uyibhobozeleni imiduli yalo\x + Hlab. 89.40,41. Isa. 5.5.\x*, ukuze balikhe bonke abadlula ngendlela\x + Hlab. 89.40,41. Isa. 5.5.\x*? \v 13 Ingulube yasehlathini iyalihlikiza\x + Jer. 5.6.\x*, lenyamazana yeganga iyalidla\x + Hlab. 50.11.\x*. \p \v 14 Nkulunkulu wamabandla, akubuyele\x + 80.3.\x*, ukhangele phansi usemazulwini\x + Isa. 63.15.\x*, ubone, wethekelele lelivini\x + Hlab. 84.9.\x*, \v 15 ngitsho isivini isandla sakho sokunene esasihlanyelayo, lendodana\x + Gen. 49.22.\x* \add o\add*waziqinisela \add yona\x + 80.17. Isa.44.14.\x*\add*. \v 16 Sitshisiwe ngomlilo\x + Isa. 33.12.\x*, saqunyelwa phansi\x + Isa. 33.12.\x*; bayabhubha ngokukhuza kobuso bakho\x + Hlab. 76.6. Hlab. 39.11.\x*. \v 17 Isandla sakho kasibe phezu komuntu\x + Hlab. 89.21. Luka 1.66.\x* wesandla sakho sokunene\x + 80.15.\x*, phezu kwendodana yomuntu\x + Hlab. 8.4,5.\x*, \add o\add*ziqinisele \add yona\x + 80.17. Isa. 44.14.\x*\x + Hlab. 89.21. Luka 1.66.\x*\add*. \v 18 Ngakho kasiyikubuyela emuva sisuke kuwe; sivuselele, khona sizabiza ibizo lakho\x + Hlab. 71.20.\x*. \p \v 19 N\nd kosi\nd*, Nkulunkulu wamabandla, siphendule, wenze ubuso bakho bukhanye, ngakho sizasindiswa\x + 80.3,7.\x*. EOD; $this->assertEquals(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19), Filter_Usfm::getVerseNumbers($usfm)); }
public function updateSearchFields($name, $book, $chapter) { $database_bibles = Database_Bibles::getInstance(); $database_config_bible = Database_Config_Bible::getInstance(); $usfm = $database_bibles->getChapter($name, $book, $chapter); $stylesheet = $database_config_bible->getExportStylesheet($name); // Data to store. $usfmraw = array(); $usfmlower = array(); $plainraw = array(); $plainlower = array(); // Get the verses in the chapter. $verses = Filter_Usfm::getVerseNumbers($usfm); $verses = array_unique($verses); sort($verses, SORT_NUMERIC); // One column contains the raw USFM as it is, and another one the lowercase text. foreach ($verses as $verse) { $raw = Filter_Usfm::getVerseText($usfm, $verse); $lower = mb_convert_case($raw, MB_CASE_LOWER); $usfmraw[$verse] = $raw; $usfmlower[$verse] = $lower; } // Text filter for getting the plain text. $filter_text = new Filter_Text($name); $filter_text->text_text = new Text_Text(); $filter_text->initializeHeadingsAndTextPerVerse(); $filter_text->addUsfmCode($usfm); $filter_text->run($stylesheet); // Get the clean verse texts. $texts = $filter_text->getVersesText(); foreach ($texts as $verse => $text) { if (!isset($plainraw[$verse])) { $plainraw[$verse] = ""; } $plainraw[$verse] .= "{$text}\n"; } // Add any clean headings. $headings = $filter_text->verses_headings; foreach ($headings as $verse => $heading) { if (!isset($plainraw[$verse])) { $plainraw[$verse] = ""; } $plainraw[$verse] .= "{$heading}\n"; } // Create the lower case plain text. foreach ($plainraw as $verse => $raw) { $plainlower[$verse] = mb_convert_case($raw, MB_CASE_LOWER); } // Get all possible verses. $allverses = array_merge(array_keys($usfmraw), array_keys($plainraw)); $allverses = array_unique($allverses); // Store everything. Database_SQLite::exec($this->db, "BEGIN;"); $name = Database_SQLiteInjection::no($name); $book = Database_SQLiteInjection::no($book); $chapter = Database_SQLiteInjection::no($chapter); $query = "DELETE FROM bibles WHERE bible = '{$name}' AND book = {$book} AND chapter = {$chapter};"; Database_SQLite::exec($this->db, $query); foreach ($allverses as $verse) { if ($verse == "") { $verse = 0; } $verse = (int) $verse; @($ur = Database_SQLiteInjection::no($usfmraw[$verse])); @($ul = Database_SQLiteInjection::no($usfmlower[$verse])); @($pr = Database_SQLiteInjection::no($plainraw[$verse])); @($pl = Database_SQLiteInjection::no($plainlower[$verse])); $query = "INSERT INTO bibles (bible, book, chapter, verse, usfmraw, usfmlower, plainraw, plainlower) VALUES ('{$name}', {$book}, {$chapter}, {$verse}, '{$ur}', '{$ul}', '{$pr}', '{$pl}');"; Database_SQLite::exec($this->db, $query); } Database_SQLite::exec($this->db, "COMMIT;"); }
$check_patterns = $database_config_bible->getCheckPatterns($bible); $checking_patterns = $database_config_bible->getCheckingPatterns($bible); $checking_patterns = Filter_String::string2array($checking_patterns); $checking_patterns = array_filter($checking_patterns, 'strlen'); $books = $database_bibles->getBooks($bible); if ($check_versification) { Checks_Versification::books($bible, $books); } foreach ($books as $book) { $chapters = $database_bibles->getChapters($bible, $book); if ($check_versification) { Checks_Versification::chapters($bible, $book, $chapters); } foreach ($chapters as $chapter) { $chapterUsfm = $database_bibles->getChapter($bible, $book, $chapter); $verses = Filter_Usfm::getVerseNumbers($chapterUsfm); if ($check_versification) { Checks_Versification::verses($bible, $book, $chapter, $verses); } foreach ($verses as $verse) { $verseUsfm = Filter_Usfm::getVerseText($chapterUsfm, $verse); if ($check_double_spaces_usfm) { Checks_Space::doubleSpaceUsfm($bible, $book, $chapter, $verse, $verseUsfm); } } $filter_text = new Filter_Text($bible); $filter_text->initializeHeadingsAndTextPerVerse(); $filter_text->addUsfmCode($chapterUsfm); $filter_text->run($stylesheet); $verses_headings = $filter_text->verses_headings; $verses_text = $filter_text->getVersesText();
function processIdentifiers($user, $bible, $book, $chapter, $oldId, $newId, &$email) { if ($oldId != 0) { $database_modifications = Database_Modifications::getInstance(); $database_config_user = Database_Config_User::getInstance(); $database_config_bible = Database_Config_Bible::getInstance(); $database_bibles = Database_Bibles::getInstance(); $database_history = Database_History::getInstance(); $stylesheet = $database_config_bible->getExportStylesheet($bible); $old_chapter_usfm = $database_modifications->getUserChapter($user, $bible, $book, $chapter, $oldId); $old_chapter_usfm = $old_chapter_usfm['oldtext']; $new_chapter_usfm = $database_modifications->getUserChapter($user, $bible, $book, $chapter, $newId); $new_chapter_usfm = $new_chapter_usfm['newtext']; $timestamp = $database_modifications->getUserTimestamp($user, $bible, $book, $chapter, $newId); $old_verse_numbers = Filter_Usfm::getVerseNumbers($old_chapter_usfm); $new_verse_numbers = Filter_Usfm::getVerseNumbers($new_chapter_usfm); $verses = array_merge($old_verse_numbers, $new_verse_numbers); $verses = array_unique($verses); sort($verses, SORT_NUMERIC); foreach ($verses as $verse) { $old_verse_usfm = Filter_Usfm::getVerseText($old_chapter_usfm, $verse); $new_verse_usfm = Filter_Usfm::getVerseText($new_chapter_usfm, $verse); if ($old_verse_usfm != $new_verse_usfm) { $filter_text_old = new Filter_Text($bible); $filter_text_new = new Filter_Text($bible); $filter_text_old->html_text_standard = new Html_Text(Locale_Translate::_("Bible")); $filter_text_new->html_text_standard = new Html_Text(Locale_Translate::_("Bible")); $filter_text_old->text_text = new Text_Text(); $filter_text_new->text_text = new Text_Text(); $filter_text_old->addUsfmCode($old_verse_usfm); $filter_text_new->addUsfmCode($new_verse_usfm); $filter_text_old->run($stylesheet); $filter_text_new->run($stylesheet); $old_html = $filter_text_old->html_text_standard->getInnerHtml(); $new_html = $filter_text_new->html_text_standard->getInnerHtml(); $old_text = $filter_text_old->text_text->get(); $new_text = $filter_text_new->text_text->get(); if ($old_text != $new_text) { $modification = Filter_Diff::diff($old_text, $new_text); $email .= "<div>"; $email .= Filter_Books::passageDisplay($book, $chapter, $verse); $email .= " "; $email .= $modification; $email .= "</div>"; if ($database_config_user->getUserUserChangesNotificationsOnline($user)) { $changeNotificationUsers = array($user); $database_modifications->recordNotification($changeNotificationUsers, "☺", $bible, $book, $chapter, $verse, $old_html, $modification, $new_html); } $database_history->record($timestamp, $user, $bible, $book, $chapter, $verse, $old_html, $modification, $new_html); } } } } }
private static function getPreviousVerse($bible, $book, $chapter, $verse) { $verse--; if ($bible != "") { $database_bibles = Database_Bibles::getInstance(); $verses = Filter_Usfm::getVerseNumbers($database_bibles->getChapter($bible, $book, $chapter)); if (!in_array($verse, $verses)) { $verse = array_shift($verses); } } $passage = array($book, $chapter, $verse); return $passage; }
} } } } // Updating the search indexes if there's a difference with the data in the Bibles. // There's a difference if the raw USFM differs. // When the raw USFM matches for a chapter, than this chapter is considered okay. $bibles = $database_bibles->getBibles(); foreach ($bibles as $bible) { $database_logs->log("Updating search index for Bible {$bible}", Filter_Roles::MANAGER_LEVEL); $books = $database_bibles->getBooks($bible); foreach ($books as $book) { $chapters = $database_bibles->getChapters($bible, $book); foreach ($chapters as $chapter) { $usfm = $database_bibles->getChapter($bible, $book, $chapter); $verses = Filter_Usfm::getVerseNumbers($usfm); $updateChapter = false; foreach ($verses as $verse) { if (!$updateChapter) { $verseUSFM = Filter_Usfm::getVerseText($usfm, $verse); $searchUSFM = $database_search->getBibleVerseUsfm($bible, $book, $chapter, $verse); if ($searchUSFM != $verseUSFM) { $updateChapter = true; } } } if ($updateChapter) { $database_search->updateSearchFields($bible, $book, $chapter); } } }
foreach ($chapters as $chapter) { if (!in_array($chapter, $bibleChapters)) { $absent[] = Locale_Translate::_("Bible") . " " . $bible . " " . Locale_Translate::_("does not contain") . " {$bookName} {$chapter}."; continue; } if (!in_array($chapter, $compareChapters) && !in_array($chapter, $resourceChapters)) { $absent[] = Locale_Translate::_("Bible/Resource") . " " . $compare . " " . Locale_Translate::_("does not contain") . " {$bookName} {$chapter}."; continue; } $bible_chapter_usfm = $database_bibles->getChapter($bible, $book, $chapter); $compare_chapter_usfm = $database_bibles->getChapter($compare, $book, $chapter); if ($compare_chapter_usfm == "") { $compare_chapter_usfm = $database_usfmresources->getUsfm($compare, $book, $chapter); } $bible_verse_numbers = Filter_Usfm::getVerseNumbers($bible_chapter_usfm); $compare_verse_numbers = Filter_Usfm::getVerseNumbers($compare_chapter_usfm); $verses = array_merge($bible_verse_numbers, $compare_verse_numbers); $verses = array_unique($verses); sort($verses, SORT_NUMERIC); foreach ($verses as $verse) { $bible_verse_usfm = Filter_Usfm::getVerseText($bible_chapter_usfm, $verse); $compare_verse_usfm = Filter_Usfm::getVerseText($compare_chapter_usfm, $verse); if ($bible_verse_usfm != $compare_verse_usfm) { $filter_text_bible = new Filter_Text($bible); $filter_text_compare = new Filter_Text($compare); $filter_text_bible->html_text_standard = new Html_Text(""); $filter_text_compare->html_text_standard = new Html_Text(""); $filter_text_bible->text_text = new Text_Text(); $filter_text_compare->text_text = new Text_Text(); $filter_text_bible->addUsfmCode($bible_verse_usfm); $filter_text_compare->addUsfmCode($compare_verse_usfm);
public static function verseNumber2offset($usfm, $verse) { // Verse number 0 starts at offset 0. if ($verse == 0) { return 0; } $totalOffset = 0; $lines = explode("\n", $usfm); foreach ($lines as $line) { $verses = Filter_Usfm::getVerseNumbers($line); @($v = $verses[1]); if ($v == $verse) { return $totalOffset; } $totalOffset += mb_strlen($line); // Add 1 for new line. $totalOffset += 1; } return mb_strlen($usfm); }
$author = Filter_Git::committer($directory, $sha1); $timestamp = Filter_Git::timestamp($directory, $sha1); $datetime = date('j F Y g:i:s a', $timestamp); $database_logs->log("{$history} {$author} {$datetime} {$bible} {$sha1}", Filter_Roles::MANAGER_LEVEL); $files = Filter_Git::files($directory, $sha1); foreach ($files as $path) { $database_logs->log("{$history} {$path}", Filter_Roles::MANAGER_LEVEL); $data = Filter_Git::explodePath($path); if ($data) { $book = $data['book']; $chapter = $data['chapter']; $data = Filter_Git::changes($directory, $sha1, $path); $oldusfm = $data['old']; $newusfm = $data['new']; $oldverses = Filter_Usfm::getVerseNumbers($oldusfm); $newverses = Filter_Usfm::getVerseNumbers($newusfm); $verses = array_merge($oldverses, $newverses); $verses = array_unique($verses); sort($verses, SORT_NUMERIC); foreach ($verses as $verse) { $old_verse_usfm = Filter_Usfm::getVerseText($oldusfm, $verse); $new_verse_usfm = Filter_Usfm::getVerseText($newusfm, $verse); if ($old_verse_usfm != $new_verse_usfm) { $filter_text_old = new Filter_Text($bible); $filter_text_new = new Filter_Text($bible); $filter_text_old->html_text_standard = new Html_Text(""); $filter_text_new->html_text_standard = new Html_Text(""); $filter_text_old->text_text = new Text_Text(); $filter_text_new->text_text = new Text_Text(); $filter_text_old->addUsfmCode($old_verse_usfm); $filter_text_new->addUsfmCode($new_verse_usfm);