string bible_abbreviations (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("Abbreviations"), webserver_request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); header.addBreadCrumb (bible_manage_url (), menu_logic_bible_manage_text ()); page = header.run (); Assets_View view; string success_message; string error_message; // The name of the Bible. string bible = access_bible_clamp (request, request->query ["bible"]); view.set_variable ("bible", filter_string_sanitize_html (bible)); // Data submission. if (request->post.count ("submit")) { string data = request->post ["data"]; data = filter_string_trim (data); if (data != "") { if (unicode_string_is_valid (data)) { Database_Config_Bible::setBookAbbreviations (bible, data); success_message = translate("The abbreviations were saved."); } else { error_message = translate("Please supply valid Unicode UTF-8 text."); } } else { success_message = translate("Nothing was saved."); } } string data = Database_Config_Bible::getBookAbbreviations (bible); data = filter_abbreviations_display (data); view.set_variable ("data", data); view.set_variable ("success_message", success_message); view.set_variable ("error_message", error_message); page += view.render ("bible", "abbreviations"); page += Assets_Page::footer (); return page; }
void bible_import_run (string location, string bible, int book, int chapter) { Database_Logs::log ("Importing Bible data from location " + location + " into Bible " + bible); string folder = filter_archive_uncompress (location); if (!folder.empty ()) location = folder; vector <string> files; if (filter_url_is_dir (location)) { filter_url_recursive_scandir (location, files); } else { files.push_back (location); } for (auto & file : files) { if (filter_url_is_dir (file)) continue; Database_Logs::log ("Examining file for import: " + file); string success_message = ""; string error_message = ""; string data = filter_url_file_get_contents (file); if (data != "") { if (unicode_string_is_valid (data)) { // Check whether this is USFM data. bool id = data.find ("\\id ") != string::npos; bool c = data.find ("\\c ") != string::npos; if (id || c) { bible_import_usfm (data, bible, book, chapter); } else { bible_import_text (data, bible, book, chapter); } } else { Database_Logs::log ("The file does not contain valid Unicode UTF-8 text.", true); } } else { Database_Logs::log ("Nothing was imported.", true); } } Database_Logs::log ("Import Bible data has finished"); }
string editusfm_save (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string bible = request->post["bible"]; int book = convert_to_int (request->post["book"]); int chapter = convert_to_int (request->post["chapter"]); string usfm = request->post["usfm"]; string checksum = request->post["checksum"]; if (request->post.count ("bible") && request->post.count ("book") && request->post.count ("chapter") && request->post.count ("usfm")) { if (Checksum_Logic::get (usfm) == checksum) { usfm = filter_url_tag_to_plus (usfm); usfm = filter_string_trim (usfm); if (usfm != "") { if (unicode_string_is_valid (usfm)) { string stylesheet = request->database_config_user()->getStylesheet(); vector <BookChapterData> book_chapter_text = usfm_import (usfm, stylesheet); for (BookChapterData & data : book_chapter_text) { int book_number = data.book; int chapter_number = data.chapter; string chapter_data_to_save = data.data; if (((book_number == book) || (book_number == 0)) && (chapter_number == chapter)) { string ancestor_usfm = getLoadedUsfm (webserver_request, bible, book, chapter, "editusfm"); // Collect some data about the changes for this user. string username = request->session_logic()->currentUser (); int oldID = request->database_bibles()->getChapterId (bible, book, chapter); string oldText = ancestor_usfm; string newText = chapter_data_to_save; // Merge if the ancestor is there and differs from what's in the database. if (!ancestor_usfm.empty ()) { string server_usfm = request->database_bibles ()->getChapter (bible, book, chapter); if (server_usfm != ancestor_usfm) { // Prioritize the USFM to save. chapter_data_to_save = filter_merge_run (ancestor_usfm, server_usfm, chapter_data_to_save); Database_Logs::log (translate ("Merging and saving chapter.")); } } // Check on write access. if (access_bible_book_write (request, "", bible, book)) { // Safely store the chapter. string message = usfm_safely_store_chapter (request, bible, book, chapter, chapter_data_to_save); if (message.empty()) { #ifndef CLIENT_PREPARED // Server configuration: Store details for the user's changes. int newID = request->database_bibles()->getChapterId (bible, book, chapter); Database_Modifications database_modifications; database_modifications.recordUserSave (username, bible, book, chapter, oldID, oldText, newID, newText); Database_Git::store_chapter (username, bible, book, chapter, oldText, newText); #endif // Store a copy of the USFM loaded in the editor for later reference. storeLoadedUsfm (webserver_request, bible, book, chapter, "editusfm"); return locale_logic_text_saved (); } return message; } else { return translate("No write access"); } } else { Database_Logs::log ("The following data could not be saved and was discarded: " + chapter_data_to_save); return translate("Passage mismatch"); } } } else { Database_Logs::log ("The text was not valid Unicode UTF-8. The chapter could not saved and has been reverted to the last good version."); return translate("Needs Unicode"); } } else { Database_Logs::log ("There was no text. Nothing was saved. The original text of the chapter was reloaded."); return translate("Nothing to save"); } } else { request->response_code = 409; return translate("Checksum error"); } } else { return translate("Nothing to save"); } return translate ("Confusing data"); }
string bible_import_usfm (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; page = Assets_Page::header (translate ("Import USFM"), webserver_request, ""); Assets_View view = Assets_View (); string success_message; string error_message; // The name of the Bible. string bible = access_bible_clamp (request, request->query["bible"]); view.set_variable ("bible", filter_string_sanitize_html (bible)); // Whether the user has write access to this Bible. bool write_access = access_bible_write (request, bible); if (write_access) view.enable_zone ("write_access"); // USFM data submission. if (request->post.count ("submit")) { // Submission may take long if there's a lot of data or the network is slow. string data = request->post ["data"]; data = filter_url_tag_to_plus (data); data = filter_string_trim (data); if (data != "") { if (unicode_string_is_valid (data)) { string datafile = filter_url_tempfile (); filter_url_file_put_contents (datafile, data); success_message = translate("Import has started. See Journal for progress."); tasks_logic_queue (IMPORTUSFM, { datafile, bible }); } else { error_message = translate("Please supply valid Unicode UTF-8 text."); } } else { success_message = translate("Nothing was imported."); } } // File upload. if (request->post.count ("upload")) { string datafile = filter_url_tempfile () + request->post ["filename"]; string data = request->post ["data"]; if (!data.empty ()) { filter_url_file_put_contents (datafile, data); success_message = translate("Import has started. See Journal for progress."); tasks_logic_queue (IMPORTUSFM, { datafile, bible }); } else { error_message = translate ("Nothing was uploaded"); } } view.set_variable ("success_message", success_message); view.set_variable ("error_message", error_message); page += view.render ("bible", "import_usfm"); page += Assets_Page::footer (); return page; }
string bible_import (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("Import"), webserver_request); header.setNavigator (); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); header.addBreadCrumb (bible_manage_url (), menu_logic_bible_manage_text ()); page = header.run (); Assets_View view; string success_message; string error_message; // The name of the Bible. string bible = access_bible_clamp (request, request->query["bible"]); view.set_variable ("bible", filter_string_sanitize_html (bible)); int book = Ipc_Focus::getBook (webserver_request); int chapter = Ipc_Focus::getChapter (webserver_request); // Whether the user has write access to this Bible. bool write_access = access_bible_write (request, bible); if (write_access) view.enable_zone ("write_access"); // USFM data submission. if (request->post.count ("submit")) { // Submission may take long if there's a lot of data or the network is slow. string data = request->post ["data"]; data = filter_url_tag_to_plus (data); data = filter_string_trim (data); if (data != "") { if (unicode_string_is_valid (data)) { string datafile = filter_url_tempfile (); filter_url_file_put_contents (datafile, data); success_message = translate("Import has started. See Journal for progress."); tasks_logic_queue (IMPORTBIBLE, { datafile, bible, convert_to_string (book), convert_to_string (chapter) }); } else { error_message = translate("Please supply valid Unicode UTF-8 text."); } } else { success_message = translate("Nothing was imported."); } // User imported something into this Bible: Set it as the default Bible. request->database_config_user()->setBible (bible); } // File upload. if (request->post.count ("upload")) { string datafile = filter_url_tempfile () + request->post ["filename"]; string data = request->post ["data"]; if (!data.empty ()) { filter_url_file_put_contents (datafile, data); success_message = translate("Import has started. See Journal for progress."); tasks_logic_queue (IMPORTBIBLE, { datafile, bible, convert_to_string (book), convert_to_string (chapter) }); } else { error_message = translate ("Nothing was uploaded"); } // User imported something into this Bible: Set it as the default Bible. request->database_config_user()->setBible (bible); } #ifdef HAVE_UPLOAD view.enable_zone ("enable_upload"); #else view.enable_zone ("disable_upload"); #endif view.set_variable ("success_message", success_message); view.set_variable ("error_message", error_message); page += view.render ("bible", "import"); page += Assets_Page::footer (); return page; }