function shellEncode($str) { // Encodes shell command according to current system $os = detectOS(); if ($os === 1) { $str = strtr($str, ['&' => '^&', '|' => '^|', '^|' => '^^']); } else { $str = strtr($str, ['&' => '\\&', "\\" => "\\\\", '|' => '\\|', '^|' => '^^']); } // escape other system characters return $str; }
function showPreferencesDialog() { global $dialogPreferences, $config, $radioGroup, $i18n, $langList, $gui; $dialogPreferences = new GladeXML(gtTranslateGlade('dialogPreferences')); $_btnSave = $dialogPreferences->get_widget('_btnSave'); $_btnCancel = $dialogPreferences->get_widget('_btnCancel'); $_btnRecognizeInkscape = $dialogPreferences->get_widget('_btnRecognizeInkscape'); $_noticeLabel = $dialogPreferences->get_widget('_noticeLabel'); $_prefDisplayPreview = $dialogPreferences->get_widget('_prefDisplayPreview'); $_prefLanguageSelect = $dialogPreferences->get_widget('_prefLanguageSelect'); $_prefUploadEnable = $dialogPreferences->get_widget('_prefUploadEnable'); $_prefUploadTable = $dialogPreferences->get_widget('_prefUploadTable'); $_prefInkscapePath = $dialogPreferences->get_widget('_prefInkscapePath'); $_btnCancel->connect_simple('clicked', 'cancelPreferencesDialog'); $_btnSave->connect_simple('clicked', 'savePreferencesDialog'); $_btnRecognizeInkscape->connect_simple('clicked', 'recognizeInkscape'); $_prefDisplayPreview->connect('toggled', 'setDisplayPreview'); $_prefUploadEnable->connect_simple('toggled', 'gtToggler', $_prefUploadEnable, $_prefUploadTable); $dialogPreferences->get_widget('_prefUploadGetKey')->connect_simple('clicked', 'openURL', 'https://openclipart.org/manage/profile'); gtIcon($_btnSave, Gtk::STOCK_SAVE); gtIcon($_btnCancel, Gtk::STOCK_CANCEL); gtIcon($_btnRecognizeInkscape, Gtk::STOCK_FIND); gtColor($_noticeLabel, 'fg', $gui['CNoticeBarFG']); gtFont($_noticeLabel, $gui['SNoticeBar']); gtFont($dialogPreferences->get_widget('_prefUploadGetKeyLBottom'), $gui['XSmallNote']); gtFont($dialogPreferences->get_widget('_prefUploadAPIWarn'), $gui['XSmallNote']); // Setting states/strings basing on config variable if ($config['firstTime']) { setPreferencesNoticeBox($i18n->_('prefNoticeFirstTime')); } // First time, autorun of preferences dialog $dialogPreferences->get_widget('_prefDisplayInfobar')->set_active($config['displayInfobar']); $dialogPreferences->get_widget('_prefDisplayNavbar')->set_active($config['displayNavbar']); $_prefDisplayPreview->set_active($config['displayPreview']); $dialogPreferences->get_widget('_prefPreviewAreaBox')->set_sensitive($config['displayPreview']); $dialogPreferences->get_widget($radioGroup['toolbarStyle'][$config['toolbarStyle']])->set_active(true); $dialogPreferences->get_widget($radioGroup['previewArea'][$config['previewArea']])->set_active(true); $_prefUploadEnable->set_active($config['enableUpload']); $dialogPreferences->get_widget('_prefUploadNSFW')->set_active($config['NSFWTagToFlag']); $_prefUploadTable->set_sensitive($config['enableUpload']); gtSetText($dialogPreferences->get_widget('_prefUploadUsername'), $config['uploadUsername']); gtSetText($dialogPreferences->get_widget('_prefUploadAPIKey'), $config['uploadAPIKey']); $dialogPreferences->get_widget('_prefTempPath')->select_uri($config['tempDirectory']); if ($config['inkscapePath']) { $_prefInkscapePath->select_uri($config['inkscapePath']); } else { $_prefInkscapePath->unselect_all(); } // setting language combobox $comboIndex = 0; foreach ($langList as $code => $name) { $comboStr = "{$name} ({$code})"; $_prefLanguageSelect->append_text($comboStr); if ($config['language'] === $code) { $_prefLanguageSelect->set_active($comboIndex); } $comboIndex++; } // signals that displays infobar notices; they have to be set after widget setup $_prefDisplayPreview->connect('toggled', 'setDisplayPreview'); $dialogPreferences->get_widget('_prefPreviewPage')->connect_simple('toggled', 'setPreferencesNoticeBox', $i18n->_('prefNoticeRefresh')); $dialogPreferences->get_widget('_prefPreviewDrawing')->connect_simple('toggled', 'setPreferencesNoticeBox', $i18n->_('prefNoticeDrawingArea') . "\n" . $i18n->_('prefNoticeRefresh'), $gui['CNoticeBarWarnBG']); if (detectOS(HK_OS_WINDOWS)) { $_prefInkscapePath->connect_simple('file-set', 'checkInkscapePath'); } }
function readSVG($file) { global $fields, $config, $timerSpin, $_navName, $_navIndex, $_btnNav, $fileList, $_btnNavRefresh, $i18n; if (is_dir($file)) { setTopBar($i18n->_('loadProblemsDir', basename($file)), Gtk::STOCK_DIALOG_WARNING); return; } if (!file_exists($file)) { setTopBar($i18n->_('loadProblems', basename($file)), Gtk::STOCK_DIALOG_WARNING); return; } resetFields(); $_btnNavRefresh->set_sensitive(true); // Enable refresh button with first (and every other) reading file // Set navigation bar - it's done everytime file is loading to refresh directory, which could change meanwhile $fileList['directory'] = dirname($file); $fileList['currentFile'] = $file; $fileList['globFix'] = strtr($fileList['directory'], ['[' => '[[]', ']' => '[]]']); $fileList['list'] = glob($fileList['globFix'] . DIRECTORY_SEPARATOR . "*.[Ss][Vv][Gg]"); $fileList['total'] = count($fileList['list']); $fileList['current'] = intval(array_search($file, $fileList['list'])) + 1; $fileList['isLast'] = $fileList['current'] === $fileList['total']; $fileList['isFirst'] = $fileList['current'] === 1; // As index is set during loading, the destination files for nav buttons are set same time, to avoid weird behavior on directory change if (!$fileList['isFirst']) { $fileList['nav'][-2] = $fileList['list'][0]; $fileList['nav'][-1] = $fileList['list'][$fileList['current'] - 2]; } if (!$fileList['isLast']) { $fileList['nav'][1] = $fileList['list'][$fileList['current']]; $fileList['nav'][2] = $fileList['list'][$fileList['total'] - 1]; } // For now navigation buttons don't loop, so turn off unusable and on usable $_btnNav[-2]->set_sensitive(!$fileList['isFirst']); $_btnNav[-1]->set_sensitive(!$fileList['isFirst']); $_btnNav[1]->set_sensitive(!$fileList['isLast']); $_btnNav[2]->set_sensitive(!$fileList['isLast']); gtSetText($_navName, basename($file)); gtSetText($_navIndex, $fileList['current'] . '/' . $fileList['total']); // That's to be changed, as SVG with embedded raster files aren't recognized as image/svg+xml if (mime_content_type($file) === 'image/svg+xml') { $fileList['properSVG'] = true; if ($config['displayPreview']) { // display preview only when it's visible, so people without Inkscape won't get errors // Generate preview $outputFile = $config['tempDirectory'] . DIRECTORY_SEPARATOR . uniqid('preview', true) . '.png'; $previewArea = ['page', 'drawing']; $cmdPreview = '--export-area-' . $previewArea[$config['previewArea']]; if (!empty($timerSpin)) { Gtk::timeout_remove($timerSpin); } // needed for navigating to other file before preview is done $timerSpin = Gtk::timeout_add(250, 'timerSpin', $outputFile); // checking for Inkscape preview to be done spinnerToggle(true); // This command runs asynchronously two synchronous commands, so _after_ Inkscape is done it // creates an empty file, so app would know when file is ready. $asynchFix = detectOS(HK_OS_WINDOWS) ? "& type nul >>\"{$outputFile}.nul\"" : "&& touch \"{$outputFile}.nul\""; execQuiet("\"{$config['inkscapePath']}\" --file=\"{$file}\" -w=200 {$cmdPreview} --export-png=\"{$outputFile}\" {$asynchFix}", true); } // Get SVG metadata $meta = getSVGMetadata($file); if (!$meta) { // Parsing metadata error setTopBar(sprintf(_('%s metadata not found'), basename($file)), Gtk::STOCK_CAPS_LOCK_WARNING); return; } // Parsing metadata ok foreach ($fields as $id) { gtSetText("_entry{$id}", $meta[$id]); } setTopBar(sprintf(_('%s parsed'), basename($file)), Gtk::STOCK_APPLY); } else { // Not SVG file $fileList['properSVG'] = false; setTopBar($i18n->_('loadIncorrectSVG', basename($file)), Gtk::STOCK_DIALOG_WARNING); } $fileList['loadedFile'] = true; }