// Imports the file at $path into $resource. void resource_logic_import_images (string resource, string path) { Database_ImageResources database_imageresources; Database_Logs::log ("Importing: " + filter_url_basename (path)); // To begin with, add the path to the main file to the list of paths to be processed. vector <string> paths = {path}; while (!paths.empty ()) { // Take and remove the first path from the container. path = paths[0]; paths.erase (paths.begin()); string basename = filter_url_basename (path); string extension = filter_url_get_extension (path); extension = unicode_string_casefold (extension); if (extension == "pdf") { Database_Logs::log ("Processing PDF: " + basename); // Retrieve PDF information. filter_shell_run ("", "pdfinfo", {path}, NULL, NULL); // Convert the PDF file to separate images. string folder = filter_url_tempfile (); filter_url_mkdir (folder); filter_shell_run (folder, "pdftocairo", {"-jpeg", path}, NULL, NULL); // Add the images to the ones to be processed. filter_url_recursive_scandir (folder, paths); } else if (filter_archive_is_archive (path)) { Database_Logs::log ("Unpacking archive: " + basename); string folder = filter_archive_uncompress (path); filter_url_recursive_scandir (folder, paths); } else { if (!extension.empty ()) { basename = database_imageresources.store (resource, path); Database_Logs::log ("Storing image " + basename ); } } } Database_Logs::log ("Ready importing images"); }
// Copies the search index of Bible $original to Bible $destination. void search_logic_copy_bible (string original, string destination) { string original_fragment = search_logic_bible_fragment (original); original_fragment = filter_url_basename (original_fragment); string destination_fragment = search_logic_bible_fragment (destination); destination_fragment = filter_url_basename (destination_fragment); vector <string> files = filter_url_scandir (search_logic_index_folder ()); for (auto & file : files) { if (file.find (original_fragment) == 0) { string original_path = filter_url_create_path (search_logic_index_folder (), file); string destination_file = destination_fragment + file.substr (original_fragment.length ()); string destination_path = filter_url_create_path (search_logic_index_folder (), destination_file); filter_url_file_cp (original_path, destination_path); } } }
void search_logic_delete_chapter (string bible, int book, int chapter) { string fragment = search_logic_chapter_file (bible, book, chapter); fragment = filter_url_basename (fragment); vector <string> files = filter_url_scandir (search_logic_index_folder ()); for (auto & file : files) { if (file.find (fragment) == 0) { string path = filter_url_create_path (search_logic_index_folder (), file); filter_url_unlink (path); } } }
// Compresses a file identified by $filename into gzipped tar format. // Returns the path to the compressed archive it created. string filter_archive_tar_gzip_file (string filename) { string tarball = filter_url_tempfile () + ".tar.gz"; string dirname = filter_url_escape_shell_argument (filter_url_dirname (filename)); string basename = filter_url_escape_shell_argument (filter_url_basename (filename)); string logfile = filter_url_tempfile () + ".log"; string command = "cd " + dirname + " && tar -czf " + tarball + " " + basename + " > " + logfile + " 2>&1"; int return_var = system (command.c_str()); if (return_var != 0) { filter_url_unlink (tarball); tarball.clear(); string errors = filter_url_file_get_contents (logfile); Database_Logs::log (errors); } return tarball; }
// Compresses a file identified by $filename into zip format. // Returns the path to the zipfile it created. string filter_archive_zip_file (string filename) { if (!file_or_dir_exists (filename)) return ""; string zippedfile = filter_url_tempfile () + ".zip"; string logfile = filter_url_tempfile () + ".log"; string dirname = filter_url_escape_shell_argument (filter_url_dirname (filename)); string basename = filter_url_escape_shell_argument (filter_url_basename (filename)); string command = "cd " + dirname + " && zip " + zippedfile + " " + basename + " > " + logfile + " 2>&1"; int return_var = system (command.c_str()); if (return_var != 0) { filter_url_unlink (zippedfile); zippedfile.clear(); string errors = filter_url_file_get_contents (logfile); Database_Logs::log (errors); } return zippedfile; }
string Fonts_Logic::getFontPath (string font) { // Case of no font. if (font == "") return ""; // Case when the font exists within Bibledit. if (fontExists (font)) { return filter_url_create_path ("", "fonts", font); } // Case when the font is avaiable from the browser independent of Bibledit. if (filter_url_basename (font) == font) { return font; } // Font is on external location. return font; }
// This function produces CSS based on input. // class: The class for the CSS. // font: The name or URL of the font to use. It may be empty. // directionvalue: The value for the text direction. // $lineheigh: Value in percents. // $letterspacing: Value multiplied by 10, in pixels. string Filter_Css::getCss (string class_, string font, int directionvalue, int lineheight, int letterspacing) { vector <string> css; // If the font has a URL, then it is a web font. if ((font != filter_url_basename (font)) && !font.empty()) { css.push_back ("@font-face"); css.push_back ("{"); css.push_back ("font-family: " + class_ + ";"); css.push_back ("src: url(" + font + ");"); css.push_back ("}"); // Below, properly reference the above web font as the class. font = class_; } css.push_back ("." + class_); css.push_back ("{"); if (font != "") { css.push_back ("font-family: " + font + ";"); } int direction = directionvalue % 10; if (direction > 0) { string line = "direction: "; if (direction == 2) line += rtl (); else line += ltr (); line += ";"; css.push_back (line); } int mode = (int) (directionvalue / 10); mode = mode % 10; if (mode > 0) { string line = "writing-mode: "; switch (mode) { case 1: line += tb_lr (); break; case 2: line += tb_rl (); break; case 3: line += bt_lr (); break; case 4: line += bt_rl (); break; default: line += tb_lr (); break; } line += ";"; css.push_back (line); } if (lineheight != 100) { string line = "line-height: " + convert_to_string (lineheight) + "%;"; css.push_back (line); } if (letterspacing != 0) { float value = letterspacing / 10; string line = "letter-spacing: " + convert_to_string (value) + "px;"; css.push_back (line); } css.push_back ("}"); return filter_string_implode (css, "\n"); }
string manage_index (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("Manage"), webserver_request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); page = header.run (); Assets_View view; string success; string error; // Force re-index Bibles. if (request->query ["reindex"] == "bibles") { Database_Config_General::setIndexBibles (true); tasks_logic_queue (REINDEXBIBLES, {"1"}); redirect_browser (request, journal_index_url ()); return ""; } // Re-index consultation notes. if (request->query ["reindex"] == "notes") { Database_Config_General::setIndexNotes (true); tasks_logic_queue (REINDEXNOTES); redirect_browser (request, journal_index_url ()); return ""; } // Delete a font. string deletefont = request->query ["deletefont"]; if (!deletefont.empty ()) { string font = filter_url_basename (deletefont); bool font_in_use = false; vector <string> bibles = request->database_bibles ()->getBibles (); for (auto & bible : bibles) { if (font == Fonts_Logic::getTextFont (bible)) font_in_use = true; } if (!font_in_use) { // Only delete a font when it is not in use. Fonts_Logic::erase (font); } else { error = translate("The font could not be deleted because it is in use"); } } // Upload a font. if (request->post.count ("uploadfont")) { string filename = request->post ["filename"]; string path = filter_url_create_root_path ("fonts", filename); string fontdata = request->post ["fontdata"]; filter_url_file_put_contents (path, fontdata); success = translate("The font has been uploaded."); } // Assemble the font block html. vector <string> fonts = Fonts_Logic::getFonts (); vector <string> fontsblock; for (auto & font : fonts) { fontsblock.push_back ("<p>"); #ifndef CLIENT_PREPARED fontsblock.push_back ("<a href=\"?deletefont=" + font+ "\" title=\"" + translate("Delete font") + "\"> ✗ </a>"); #endif fontsblock.push_back (font); fontsblock.push_back ("</p>"); } view.set_variable ("fontsblock", filter_string_implode (fontsblock, "\n")); #ifdef CLIENT_PREPARED view.enable_zone ("client"); view.set_variable ("cloudlink", client_logic_link_to_cloud (manage_index_url (), "")); #else view.enable_zone ("server"); #endif view.set_variable ("success", success); view.set_variable ("error", error); page += view.render ("manage", "index"); page += Assets_Page::footer (); return page; }