public static function finishLookingForPhraseTitles($addOnPhrases, XenForo_Model_Phrase $phraseModel) { static $whitelistedPrefixes = array('admin_navigation_', 'admin_permission_', 'cron_entry_', 'option_', 'permission_', 'style_property_'); $foundPhraseTitles = DevHelper_Helper_Phrase::getFoundPhraseTitles(); $usedPhraseTitles = array(); $foundButUnusedPhraseTitles = array(); foreach ($addOnPhrases as $phrase) { $used = in_array($phrase['title'], $foundPhraseTitles); if (!$used) { foreach ($whitelistedPrefixes as $prefix) { if (strpos($phrase['title'], $prefix) === 0) { $used = true; break; } } } if (!$used) { echo "Add-on phrase not used: <span style='color: red'>{$phrase['title']}</span>\n"; } else { $usedPhraseTitles[] = $phrase['title']; } } foreach ($foundPhraseTitles as $phraseTitle) { if (!in_array($phraseTitle, $usedPhraseTitles)) { $foundButUnusedPhraseTitles[] = $phraseTitle; } } if (!empty($foundButUnusedPhraseTitles)) { $foundButUnusedPhrases = $phraseModel->getPhrasesInLanguageByTitles($foundButUnusedPhraseTitles); foreach ($foundButUnusedPhraseTitles as $phraseTitle) { $good = true; if (empty($foundButUnusedPhrases[$phraseTitle])) { echo "Phrase not found: <span style='color: red'>{$phraseTitle}</span>\n"; $good = false; } if ($good) { $foundButUnusedPhrase = $foundButUnusedPhrases[$phraseTitle]; if (!empty($foundButUnusedPhrase['addon_id']) and $foundButUnusedPhrase['addon_id'] !== 'XenForo') { echo "Phrase from another add-on: <span style='color: red'>{$phraseTitle}</span> ({$foundButUnusedPhrase['addon_id']})\n"; $good = false; } } if (!$good) { $phraseUsages = self::getPhraseUsages($phraseTitle); foreach ($phraseUsages as $phraseUsagePath => $phraseUsageLine) { echo " <span style='color: #ddd'>Used in {$phraseUsagePath}:{$phraseUsageLine}</span>\n"; } } } } }
public function actionFileExport() { $addOnId = $this->_input->filterSingle('addon_id', XenForo_Input::STRING); $addOn = $this->_getAddOnOrError($addOnId); $config = $this->_getConfigModel()->loadAddOnConfig($addOn); $exportPath = $config->getExportPath(); if ($exportPath === false) { return $this->responseNoPermission(); } DevHelper_Helper_Phrase::startLookingForPhraseTitles(); DevHelper_Helper_Xfcp::startLookingForXfcpClasses(); echo '<pre>'; DevHelper_Generator_File::fileExport($addOn, $config, $exportPath); /** @var XenForo_Model_Template $templateModel */ $templateModel = $this->getModelFromCache('XenForo_Model_Template'); $templates = $templateModel->getMasterTemplatesInAddOn($addOn['addon_id']); foreach ($templates as $template) { /** @var DevHelper_XenForo_DataWriter_Template $dw */ $dw = XenForo_DataWriter::create('XenForo_DataWriter_Template'); $dw->setExistingData($template, true); if ($dw->DevHelper_saveTemplate()) { echo "Saved template {$template['title']}\n"; } } /** @var XenForo_Model_Phrase $phraseModel */ $phraseModel = $this->getModelFromCache('XenForo_Model_Phrase'); $phrases = $phraseModel->getMasterPhrasesInAddOn($addOnId); DevHelper_Helper_Phrase::finishLookingForPhraseTitles($phrases, $phraseModel); DevHelper_Helper_Xfcp::finishLookingForXfcpClasses($addOn, $config); echo '</pre>'; DevHelper_Generator_Code_XenForoConfig::updateConfig('development.default_addon', $addOn['addon_id']); die('Done'); }
protected static function _fileExport($entry, &$exportPath, &$rootPath, $options) { if (empty($entry)) { return; } $relativePath = trim(str_replace($rootPath, '', $entry), '/'); if (in_array($relativePath, $options['excludes'])) { echo "<span style='color: #ddd'>Excluded {$relativePath}</span>\n"; return; } foreach ($options['excludeRegExs'] as $excludeRegEx) { if (preg_match($excludeRegEx, $relativePath)) { echo "<span style='color: #ddd'>RegExcluded {$relativePath}</span>\n"; return; } } if (is_dir($entry)) { echo "<span style='color: #ddd'>Browsing {$relativePath}</span>\n"; $children = array(); $dh = opendir($entry); while ($child = readdir($dh)) { if (substr($child, 0, 1) === '.') { // ignore . (current directory) // ignore .. (parent directory) // ignore hidden files (dot files/directories) continue; } $children[] = $child; } foreach ($children as $child) { if (!empty($options['force'])) { $options['force'] = false; } // reset `force` option for children self::_fileExport($entry . '/' . $child, $exportPath, $rootPath, $options); } } elseif (is_file($entry)) { $ext = XenForo_Helper_File::getFileExtension($entry); if (!empty($options['force']) || in_array($ext, $options['extensions']) && strpos(basename($entry), '.') !== 0 || in_array(strtolower(basename($entry)), $options['filenames_lowercase'])) { if ($options['addon_id'] == 'devHelper') { $isDevHelper = strpos($entry, 'DevHelper/DevHelper') !== false; } else { $isDevHelper = strpos($entry, 'DevHelper') !== false; } if (!$isDevHelper) { $entryExportPath = $exportPath . '/' . $relativePath; if ($ext === 'php') { DevHelper_Helper_ShippableHelper::checkForUpdate($entry); } $contents = self::fileGetContents($entry); if (!empty($contents)) { if ($ext === 'php') { DevHelper_Helper_Phrase::parsePhpForPhraseTracking($relativePath, $contents); DevHelper_Helper_Xfcp::parsePhpForXfcpClass($relativePath, $contents); } $result = self::writeFile($entryExportPath, $contents, false, false); if ($result === true) { echo "Exporting {$relativePath} OK\n"; } elseif ($result === 'skip') { echo "<span style='color: #ddd'>Exporting {$relativePath} SKIPPED</span>\n"; } } } } } }