string editverse_index (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; bool touch = request->session_logic ()->touchEnabled (); if (request->query.count ("switchbook") && request->query.count ("switchchapter")) { int switchbook = convert_to_int (request->query ["switchbook"]); int switchchapter = convert_to_int (request->query ["switchchapter"]); Ipc_Focus::set (request, switchbook, switchchapter, 1); Navigation_Passage::recordHistory (request, switchbook, switchchapter, 1); } string page; Assets_Header header = Assets_Header (translate("Edit USFM"), request); header.setNavigator (); if (touch) header.jQueryTouchOn (); header.notifItOn (); header.addBreadCrumb (menu_logic_translate_menu (), menu_logic_translate_text ()); page = header.run (); Assets_View view; if (request->query.count ("changebible")) { string changebible = request->query ["changebible"]; if (changebible == "") { Dialog_List dialog_list = Dialog_List ("index", translate("Select which Bible to open in the editor"), "", ""); vector <string> bibles = access_bible_bibles (request); for (auto bible : bibles) { dialog_list.add_row (bible, "changebible", bible); } page += dialog_list.run(); return page; } else { request->database_config_user()->setBible (changebible); } } // Get active Bible, and check read access to it. // If needed, change Bible to one it has read access to. string bible = access_bible_clamp (request, request->database_config_user()->getBible ()); if (request->query.count ("bible")) bible = access_bible_clamp (request, request->query ["bible"]); view.set_variable ("bible", bible); // Store the active Bible in the page's javascript. view.set_variable ("navigationCode", Navigation_Passage::code (bible)); string chapterLoaded = locale_logic_text_loaded (); string chapterSaving = locale_logic_text_saving (); string chapterSaved = locale_logic_text_saved (); string chapterRetrying = locale_logic_text_retrying (); string script = "var verseEditorVerseLoaded = '" + chapterLoaded + "';\n" "var verseEditorVerseSaving = '" + chapterSaving + "';\n" "var verseEditorVerseSaved = '" + chapterSaved + "';\n" "var verseEditorChapterRetrying = '" + chapterRetrying + "';\n" "var verseEditorWriteAccess = true;" "var unsentBibleDataTimeoutWarning = '" + bible_logic_unsent_unreceived_data_warning (false) + "';\n"; config_logic_swipe_enabled (webserver_request, script); view.set_variable ("script", script); string cls = Filter_Css::getClass (bible); string font = Fonts_Logic::getTextFont (bible); int direction = Database_Config_Bible::getTextDirection (bible); int lineheight = Database_Config_Bible::getLineHeight (bible); int letterspacing = Database_Config_Bible::getLetterSpacing (bible); view.set_variable ("custom_class", cls); view.set_variable ("custom_css", Filter_Css::getCss (cls, Fonts_Logic::getFontPath (font), direction, lineheight, letterspacing)); // Whether to enable fast Bible editor switching. if (request->database_config_user ()->getFastEditorSwitchingAvailable ()) { view.enable_zone ("fastswitcheditor"); } page += view.render ("editverse", "index"); page += Assets_Page::footer (); return page; }
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 edit_index (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; bool touch = request->session_logic ()->touchEnabled (); if (request->query.count ("switchbook") && request->query.count ("switchchapter")) { int switchbook = convert_to_int (request->query ["switchbook"]); int switchchapter = convert_to_int (request->query ["switchchapter"]); int switchverse = 1; if (request->query.count ("switchverse")) switchverse = convert_to_int (request->query ["switchverse"]); Ipc_Focus::set (request, switchbook, switchchapter, switchverse); Navigation_Passage::recordHistory (request, switchbook, switchchapter, switchverse); } string page; Assets_Header header = Assets_Header (translate("Edit"), request); header.setNavigator (); header.setEditorStylesheet (); if (touch) header.jQueryTouchOn (); header.notifItOn (); header.addBreadCrumb (menu_logic_translate_menu (), menu_logic_translate_text ()); page = header.run (); if (request->query.count ("changebible")) { string changebible = request->query ["changebible"]; if (changebible == "") { Dialog_List dialog_list = Dialog_List ("index", translate("Select which Bible to open in the editor"), "", ""); vector <string> bibles = access_bible_bibles (request); for (auto & bible : bibles) { dialog_list.add_row (bible, "changebible", bible); } page += dialog_list.run(); return page; } else { request->database_config_user()->setBible (changebible); // Going to another Bible, ensure that the focused book exists there. int book = Ipc_Focus::getBook (request); vector <int> books = request->database_bibles()->getBooks (changebible); if (find (books.begin(), books.end(), book) == books.end()) { if (!books.empty ()) book = books [0]; else book = 0; Ipc_Focus::set (request, book, 1, 1); } } } Assets_View view; // Active Bible, and check access. string bible = access_bible_clamp (request, request->database_config_user()->getBible ()); if (request->query.count ("bible")) bible = access_bible_clamp (request, request->query ["bible"]); view.set_variable ("bible", bible); // Store the active Bible in the page's javascript. view.set_variable ("navigationCode", Navigation_Passage::code (bible)); int verticalCaretPosition = request->database_config_user ()->getVerticalCaretPosition (); string script = "var editorChapterLoaded = '" + locale_logic_text_loaded () + "';\n" "var editorChapterSaving = '" + locale_logic_text_saving () + "';\n" "var editorChapterSaved = '" + locale_logic_text_saved () + "';\n" "var editorChapterRetrying = '" + locale_logic_text_retrying () + "';\n" "var editorChapterReformat = '" + locale_logic_text_reformat () + "';\n" "var editorWriteAccess = true;\n" "var verticalCaretPosition = " + convert_to_string (verticalCaretPosition) + ";\n" "var unsentBibleDataTimeoutWarning = '" + bible_logic_unsent_unreceived_data_warning (false) + "';\n"; config_logic_swipe_enabled (webserver_request, script); view.set_variable ("script", script); string clss = Filter_Css::getClass (bible); string font = Fonts_Logic::getTextFont (bible); int direction = Database_Config_Bible::getTextDirection (bible); int lineheight = Database_Config_Bible::getLineHeight (bible); int letterspacing = Database_Config_Bible::getLetterSpacing (bible); view.set_variable ("custom_class", clss); view.set_variable ("custom_css", Filter_Css::getCss (clss, Fonts_Logic::getFontPath (font), direction, lineheight, letterspacing)); // In basic mode the editor has no controls and fewer indicators. // In basic mode, the user can just edit text, and cannot style it. bool basic_mode = config_logic_basic_mode (webserver_request); if (!basic_mode) view.enable_zone ("advancedmode"); // Whether to enable fast Bible editor switching. if (!basic_mode && request->database_config_user ()->getFastEditorSwitchingAvailable ()) { view.enable_zone ("fastswitcheditor"); } // Whether to enable the styles button. if (request->database_config_user ()->getEnableStylesButtonVisualEditors ()) { view.enable_zone ("stylesbutton"); } page += view.render ("edit", "index"); page += Assets_Page::footer (); return page; }