// Prepares a sample Bible. // The output of this is supposed to be manually put into the source tree, folder "samples". // This will be used to quickly create a sample Bible, that is fast, even on mobile devices. void demo_prepare_sample_bible () { Database_Bibles database_bibles; // Remove the Bible to remove all stuff that might have been in it. database_bibles.deleteBible (demo_sample_bible_name ()); search_logic_delete_bible (demo_sample_bible_name ()); // Create a new one. database_bibles.createBible (demo_sample_bible_name ()); // Location of the USFM files for the sample Bible. string directory = filter_url_create_root_path ("demo"); vector <string> files = filter_url_scandir (directory); for (auto file : files) { // Only process the USFM files. if (filter_url_get_extension (file) == "usfm") { cout << file << endl; // Read the USFM. file = filter_url_create_path (directory, file); string usfm = filter_url_file_get_contents (file); usfm = filter_string_str_replace (" ", " ", usfm); // Import the USFM into the Bible. vector <BookChapterData> book_chapter_data = usfm_import (usfm, styles_logic_standard_sheet ()); for (auto data : book_chapter_data) { Bible_Logic::storeChapter (demo_sample_bible_name (), data.book, data.chapter, data.data); } } } // Clean the destination location for the Bible. string destination = sample_bible_bible_path (); filter_url_rmdir (destination); // Copy the Bible data to the destination. string source = database_bibles.bibleFolder (demo_sample_bible_name ()); filter_url_dir_cp (source, destination); // Clean the destination location for the Bible search index. destination = sample_bible_index_path (); filter_url_rmdir (destination); // Create destination location. filter_url_mkdir (destination); // Copy the index files over to the destination. source = search_logic_index_folder (); files = filter_url_scandir (source); for (auto file : files) { if (file.find (demo_sample_bible_name ()) != string::npos) { string source_file = filter_url_create_path (source, file); string destination_file = filter_url_create_path (destination, file); filter_url_file_cp (source_file, destination_file); } } }
// Import the USFM in $data into $bible. void bible_import_usfm (string data, string bible, int book, int chapter) { if (book && chapter) {} string stylesheet = styles_logic_standard_sheet (); vector <BookChapterData> book_chapter_text = usfm_import (data, stylesheet); for (auto & data : book_chapter_text) { int book_number = data.book; int chapter_number = data.chapter; string chapter_data = data.data; if (book_number > 0) { bible_logic_store_chapter (bible, book_number, chapter_number, chapter_data); string book_name = Database_Books::getUsfmFromId (book_number); Database_Logs::log ("Imported " + book_name + " " + convert_to_string (chapter_number)); } else { Database_Logs::log ("Could not import this data: " + chapter_data.substr (0, 1000)); } } }
// This runs on the server. // It gets the html or text contents for a $resource for serving it to a client. string resource_logic_get_contents_for_client (string resource, int book, int chapter, int verse) { // Lists of the various types of resources. Database_UsfmResources database_usfmresources; vector <string> externals = resource_external_names (); vector <string> usfms = database_usfmresources.getResources (); // Possible SWORD details in case the client requests a SWORD resource. string sword_module = sword_logic_get_remote_module (resource); string sword_source = sword_logic_get_source (resource); // Determine the type of the current resource. bool isExternal = in_array (resource, externals); bool isUsfm = in_array (resource, usfms); bool isSword = (!sword_source.empty () && !sword_module.empty ()); if (isExternal) { // The server fetches it from the web. return resource_external_cloud_fetch_cache_extract (resource, book, chapter, verse); } if (isUsfm) { // Fetch from database and convert to html. string chapter_usfm = database_usfmresources.getUsfm (resource, book, chapter); string verse_usfm = usfm_get_verse_text (chapter_usfm, verse); string stylesheet = styles_logic_standard_sheet (); Filter_Text filter_text = Filter_Text (resource); filter_text.html_text_standard = new Html_Text (""); filter_text.addUsfmCode (verse_usfm); filter_text.run (stylesheet); return filter_text.html_text_standard->getInnerHtml (); } if (isSword) { // Fetch it from a SWORD module. return sword_logic_get_text (sword_source, sword_module, book, chapter, verse); } // Nothing found. return "Bibledit Cloud could not localize this resource"; }
string styles_indexm (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("Styles"), webserver_request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); header.addBreadCrumb (menu_logic_settings_styles_menu (), menu_logic_styles_text ()); page = header.run (); Assets_View view; Database_Styles database_styles; string username = request->session_logic ()->currentUser (); int userlevel = request->session_logic ()->currentLevel (); if (request->post.count ("new")) { string name = request->post["entry"]; // Remove spaces at the ends of the name for the new stylesheet. // Because predictive keyboards can add a space to the name, // and the stylesheet system is not built for whitespace at the start / end of the name of the stylesheet. name = filter_string_trim (name); vector <string> existing = database_styles.getSheets (); if (find (existing.begin(), existing.end (), name) != existing.end ()) { page += Assets_Page::error (translate("This stylesheet already exists")); } else { database_styles.createSheet (name); database_styles.grantWriteAccess (username, name); styles_sheets_create_all (); page += Assets_Page::success (translate("The stylesheet has been created")); } } if (request->query.count ("new")) { Dialog_Entry dialog_entry = Dialog_Entry ("indexm", translate("Please enter the name for the new stylesheet"), "", "new", ""); page += dialog_entry.run(); return page; } if (request->query.count ("delete")) { string del = request->query ["delete"]; if (del != "") { string confirm = request->query ["confirm"]; if (confirm == "yes") { bool write = database_styles.hasWriteAccess (username, del); if (userlevel >= Filter_Roles::admin ()) write = true; if (write) { database_styles.deleteSheet (del); database_styles.revokeWriteAccess ("", del); page += Assets_Page::success (translate("The stylesheet has been deleted")); } } if (confirm == "") { Dialog_Yes dialog_yes = Dialog_Yes ("indexm", translate("Would you like to delete this stylesheet?")); dialog_yes.add_query ("delete", del); page += dialog_yes.run (); return page; } } } // Delete empty sheet that may have been there. database_styles.deleteSheet (""); vector <string> sheets = database_styles.getSheets(); vector <string> sheetblock; for (auto & sheet : sheets) { sheetblock.push_back ("<p>"); sheetblock.push_back (sheet); bool editable = database_styles.hasWriteAccess (username, sheet); if (userlevel >= Filter_Roles::admin ()) editable = true; // Cannot edit the Standard stylesheet. if (sheet == styles_logic_standard_sheet ()) editable = false; if (editable) { sheetblock.push_back ("<a href=\"sheetm?name=" + sheet + "\">[" + translate("edit") + "]</a>"); } sheetblock.push_back ("</p>"); } view.set_variable ("sheetblock", filter_string_implode (sheetblock, "\n")); page += view.render ("styles", "indexm"); page += Assets_Page::footer (); return page; }
// Cleans and resets the data in the Bibledit installation. void demo_clean_data () { Database_Logs::log ("Cleaning up the demo data"); Webserver_Request request; // Set user to the demo credentials (admin) as this is the user who is always logged-in in a demo installation. request.session_logic ()->setUsername (session_admin_credentials ()); // Delete empty stylesheet that may have been there. request.database_styles()->revokeWriteAccess ("", styles_logic_standard_sheet ()); request.database_styles()->deleteSheet (""); styles_sheets_create_all (); // Set the export stylesheet to "Standard" for all Bibles and the admin. vector <string> bibles = request.database_bibles()->getBibles (); for (auto & bible : bibles) { Database_Config_Bible::setExportStylesheet (bible, styles_logic_standard_sheet ()); } request.database_config_user()->setStylesheet (styles_logic_standard_sheet ()); // Set the site language to "Default" Database_Config_General::setSiteLanguage (""); // Ensure the default users are there. map <string, int> users = { make_pair ("guest", Filter_Roles::guest ()), make_pair ("member", Filter_Roles::member ()), make_pair ("consultant", Filter_Roles::consultant ()), make_pair ("translator", Filter_Roles::translator ()), make_pair ("manager", Filter_Roles::manager ()), make_pair (session_admin_credentials (), Filter_Roles::admin ()) }; for (auto & element : users) { if (!request.database_users ()->usernameExists (element.first)) { request.database_users ()->addNewUser(element.first, element.first, element.second, ""); } request.database_users ()->updateUserLevel (element.first, element.second); } // Create / update sample Bible. demo_create_sample_bible (); // Create sample notes. demo_create_sample_notes (&request); // Create samples for the workbenches. demo_create_sample_workbenches (&request); // Set navigator to John 3:16. Ipc_Focus::set (&request, 43, 3, 16); // Set and/or trim resources to display. // Too many resources crash the demo: Limit the amount. vector <string> resources = request.database_config_user()->getActiveResources (); bool reset_resources = false; if (resources.size () > 25) reset_resources = true; vector <string> defaults = demo_logic_default_resources (); for (auto & name : defaults) { if (!in_array (name, resources)) reset_resources = true; } if (reset_resources) { resources = demo_logic_default_resources (); request.database_config_user()->setActiveResources (resources); } // No flipped basic <> advanded mode. request.database_config_user ()->setFlipInterfaceMode (false); }
// This is the most basic version that fetches the text of a $resource. // It works on server and on client. // It uses the cache. string resource_logic_get_verse (void * webserver_request, string resource, int book, int chapter, int verse) { Webserver_Request * request = (Webserver_Request *) webserver_request; string data; Database_UsfmResources database_usfmresources; Database_ImageResources database_imageresources; // Lists of the various types of resources. // As from February 2016 a client no longer automatically downloads USFM resources from the Cloud. // But a client takes in account existing USFM resources it has downloaded before. vector <string> bibles = request->database_bibles()->getBibles (); vector <string> local_usfms = database_usfmresources.getResources (); vector <string> remote_usfms; if (config_logic_client_prepared ()) { remote_usfms = client_logic_usfm_resources_get (); } vector <string> externals = resource_external_names (); vector <string> images = database_imageresources.names (); vector <string> lexicons = lexicon_logic_resource_names (); // Possible SWORD details. string sword_module = sword_logic_get_remote_module (resource); string sword_source = sword_logic_get_source (resource); // Determine the type of the current resource. bool isBible = in_array (resource, bibles); bool isLocalUsfm = in_array (resource, local_usfms); bool isRemoteUsfm = in_array (resource, remote_usfms); bool isExternal = in_array (resource, externals); bool isImage = in_array (resource, images); bool isLexicon = in_array (resource, lexicons); bool isSword = (!sword_source.empty () && !sword_module.empty ()); if (isBible || isLocalUsfm) { string chapter_usfm; if (isBible) chapter_usfm = request->database_bibles()->getChapter (resource, book, chapter); if (isLocalUsfm) chapter_usfm = database_usfmresources.getUsfm (resource, book, chapter); string verse_usfm = usfm_get_verse_text (chapter_usfm, verse); string stylesheet = styles_logic_standard_sheet (); Filter_Text filter_text = Filter_Text (resource); filter_text.html_text_standard = new Html_Text (""); filter_text.addUsfmCode (verse_usfm); filter_text.run (stylesheet); data = filter_text.html_text_standard->getInnerHtml (); } else if (isRemoteUsfm) { data = resource_logic_client_fetch_cache_from_cloud (resource, book, chapter, verse); } else if (isExternal) { if (config_logic_client_prepared ()) { // A client fetches it from the cache or from the Cloud, // or, for older versions, from the offline resources database. // As of 12 December 2015, the offline resources database is not needed anymore. // It can be removed after a year or so. Database_OfflineResources database_offlineresources; if (database_offlineresources.exists (resource, book, chapter, verse)) { data = database_offlineresources.get (resource, book, chapter, verse); } else { data = resource_logic_client_fetch_cache_from_cloud (resource, book, chapter, verse); } } else { // The server fetches it from the web, via the http cache. data.append (resource_external_cloud_fetch_cache_extract (resource, book, chapter, verse)); } } else if (isImage) { vector <string> images = database_imageresources.get (resource, book, chapter, verse); for (auto & image : images) { data.append ("<div><img src=\"/resource/imagefetch?name=" + resource + "&image=" + image + "\" alt=\"Image resource\" style=\"width:100%\"></div>"); } } else if (isLexicon) { data = lexicon_logic_get_html (request, resource, book, chapter, verse); } else if (isSword) { data = sword_logic_get_text (sword_source, sword_module, book, chapter, verse); } else { // Nothing found. } // Any font size given in a paragraph style may interfere with the font size setting for the resources // as given in Bibledit. For that reason remove the class name from a paragraph style. for (unsigned int i = 0; i < 5; i++) { string fragment = "p class=\""; size_t pos = data.find (fragment); if (pos != string::npos) { size_t pos2 = data.find ("\"", pos + fragment.length () + 1); if (pos2 != string::npos) { data.erase (pos + 1, pos2 - pos + 1); } } } // NET Bible updates. data = filter_string_str_replace ("<span class=\"s ", "<span class=\"", data); return data; }
string Database_Config_Bible::getExportStylesheet (string bible) { return getValue (bible, "export-stylesheet", styles_logic_standard_sheet ().c_str()); }