setProperties([ 'id' => 'phpheader', 'name' => __('Fix PHP header'), 'desc' => __('Add or remove phpdoc header bloc from php file'), 'priority' => 340, 'config' => true, 'types' => ['plugin', 'theme'] ]); $this->action_bloc = [ __('Do nothing') => 0, __('Add bloc if it does not exist') => 'create', __('Add and overwrite bloc') => 'overwrite' , __('Overwrite bloc only if it exists') => 'replace', __('Remove existing bloc header') => 'remove' ]; return true; } public function isConfigured(): bool { return !empty($this->getPreference('bloc_action')) || !empty($this->getPreference('remove_old')); } public function configure($url): ?string { if (!empty($_POST['save'])) { $this->setPreferences([ 'bloc_action' => !empty($_POST['bloc_action']) ? $_POST['bloc_action'] : '', 'bloc_content' => !empty($_POST['bloc_content']) ? $_POST['bloc_content'] : '', 'remove_old' => !empty($_POST['remove_old']), 'exclude_locales' => !empty($_POST['exclude_locales']) ]); $this->redirect($url); } return '

' . form::combo('bloc_action', $this->action_bloc, $this->getPreference('bloc_action')) . '

' . __('Bloc content:') . '

' . form::textarea('bloc_content', 50, 10, html::escapeHTML($this->getPreference('bloc_content'))) . '

' . sprintf( __('You can use wildcards %s') , '%year%, %module_id%, %module_name%, %module_author%, %module_type%, %user_cn%, %user_name%, %user_email%, %user_url%' ) . '
' . __('Do not put structural elements to the begining of lines.') . '

' . '

' . __('Exemple') .'

' . self::$exemple . '
'; } public function openModule(string $module_type, array $module_info): ?bool { $this->type = $module_type; $this->module = $module_info; $this->replaceInfo(); return null; } public function openDirectory(string $path): ?bool { $this->stop_scan = false; if (!empty($this->getPreference('exclude_locales')) && preg_match('/\/(locales|libs)(\/.*?|)$/', $path)) { $this->stop_scan = true; } return null; } public function readFile($path, $extension, &$content): ?bool { if ($this->stop_scan || $extension !='php' || self::hasNotice()) { return null; } if (!empty($this->getPreference('remove_old'))) { $content = $this->deleteOldBloc($content); } if (empty($this->getPreference('bloc_action'))) { return null; } $clean = $this->deleteDocBloc($content); if ($this->getPreference('bloc_action') == 'remove') { $content = $clean; return null; } if ($content != $clean && $this->getPreference('bloc_action') == 'create') { return null; } if ($content == $clean && $this->getPreference('bloc_action') == 'replace') { return null; } $content = $this->writeDocBloc($clean); return true; } private function replaceInfo() { $bloc = trim($this->getPreference('bloc_content')); if (empty($bloc)) { self::notice(__('bloc is empty'), false); return null; } $bloc = trim(str_replace("\r\n", "\n", $bloc)); try { $this->bloc = preg_replace_callback( // use \u in bloc content for first_upper_case '/(\\\u([a-z]{1}))/', function($str) { return ucfirst($str[2]); }, str_replace( $this->bloc_wildcards, [ date('Y'), $this->module['id'], $this->module['name'], $this->module['author'], $this->module['type'], $this->core->auth->getInfo('user_cn'), $this->core->auth->getinfo('user_name'), $this->core->auth->getInfo('user_email'), $this->core->auth->getInfo('user_url') ], $bloc ) ); } catch (Exception $e) { self::notice(__('failed to parse bloc')); return null; } } private function writeDocBloc($content) { return preg_replace( '/^(\<\?php[\n|\r\n]+)/', 'bloc)) . "\n */\n\n", $content, 1 ); } private function deleteDocBloc($content) { return preg_replace( '/^(\<\?php\s*[\n|\r\n]{0,1}\s*\/\*\*.*?\s*\*\/\s*[\n|\r\n]+)/msi', "