#!/usr/bin/php $endToken) { if (preg_match('/\b' . $startToken . '\b/', $line)) { $startRestoring = true; $restoreTokenPair = [$startToken, $endToken]; break; } } foreach ($tokens as $startToken => $endToken) { if (preg_match('/\b' . $endToken . '\b/', $line)) { $startRestoring = false; $saveLine = false; break; } } if ($startRestoring) { $startToken = $restoreTokenPair[0]; $endToken = $restoreTokenPair[1]; $startIndex = getIndex($startToken, $saved); $endIndex = getIndex($endToken, $saved); if ($startIndex === false || $endIndex === false) { echo "Could not find data to be restored : startIndex = " . $startIndex . ", endIndex = " . $endIndex; echo "Restore token pair = "; print_r($restoreTokenPair); $saveLine = true; } else { $restored = array_splice($saved, $startIndex, ($endIndex - $startIndex + 1)); $merged = array_merge($merged, $restored); $saveLine = false; } } if ($saveLine) { array_push($merged, $line); } else { $saveLine = true; } } fclose($fh); file_put_contents($file, $merged); } function install_method_templates($file) { $fn = fopen($file, "r"); $saveLine = true; $methods = []; $saveMethod = false; $lines = []; while (!feof($fn)) { $line = fgets($fn); /** * if exiting an options definition block - stop saving that definition */ if (preg_match('/\bSTATIC_METHODS_END\b/', $line)) { $saveMethod = false; } /** * if exiting an method mplementation block - save the line for later */ if (preg_match('/\bSTATIC_METHODS_DEFINITION_END\b/', $line)) { $saveLine = true; } /** * Now save the line */ if ($saveLine) { array_push($lines, $line); } /** * if entering an options implementation block - do not save the line for later */ if (preg_match('/\bSTATIC_METHODS_DEFINITION_START\b/', $line)) { $saveLine = false; } if ($saveMethod) { $line = trim($line); array_push($methods, $line); } /** * If entering an options definition block - start saving that definition */ if (preg_match('/\bSTATIC_METHODS_START\b/', $line)) { $saveMethod = true; } } fclose($fn); file_put_contents($file, $lines); /** * Process the methods */ if (sizeof($methods) > 0) { $template = file_get_contents('src/templates/static_method.template'); $newOptions = ''; foreach ($methods as $method) { $updated = str_replace('METHOD_NAME_UPPERCASE', strtoupper($method), $template); $updated = str_replace('METHOD_NAME', $method, $updated); $newOptions .= $updated; } $contents = file_get_contents($file); $contents = preg_replace( '/\/\/\bSTATIC_METHODS_DEFINITION_START\b.*?\/\/\bSTATIC_METHODS_DEFINITION_END\b/s', "//STATIC_METHODS_DEFINITION_START\n" . $newOptions . "\t\t//STATIC_METHODS_DEFINITION_END", $contents ); file_put_contents($file, $contents); } } global $files; foreach ($files as $file) { $tokens = [ 'OPTIONS_START' => 'OPTIONS_END', 'INSTANCE_OPTIONS_MAPPING_START' => 'INSTANCE_OPTIONS_MAPPING_END', 'LINKED_OBJECTS_START' => 'LINKED_OBJECTS_END', 'STATIC_METHODS_START' => 'STATIC_METHODS_END', 'EXCLUDED_FROM_INSTANCE_OPTIONS_START' => 'EXCLUDED_FROM_INSTANCE_OPTIONS_END', 'CUSTOM_OPTIONS_INIT_START' => 'CUSTOM_OPTIONS_INIT_END', 'CUSTOM_BEFORE_INIT_START' => 'CUSTOM_BEFORE_INIT_END', 'CUSTOM_CREATE_INSTANCE_START' => 'CUSTOM_CREATE_INSTANCE_END', 'CUSTOM_UPDATE_INSTANCE_START' => 'CUSTOM_UPDATE_INSTANCE_END', 'CUSTOM_UPDATE_FROM_INSTANCE_START' => 'CUSTOM_UPDATE_FROM_INSTANCE_END', 'CUSTOM_DISPOSE_START' => 'CUSTOM_DISPOSE_END', 'CUSTOM_DISPOSE_INSTANCE_START' => 'CUSTOM_DISPOSE_INSTANCE_END', 'CUSTOM_IMPLEMENTATION_START' => 'CUSTOM_IMPLEMENTATION_END', 'CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START' => 'CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END', 'CUSTOM_START_METHOD_START' => 'CUSTOM_START_METHOD_END', 'CUSTOM_STOP_METHOD_START' => 'CUSTOM_STOP_METHOD_END' ]; if ($argv[2] == 'save') { echo "saving file " . $file . "\n"; $saved = []; $startSaving = false; $fn = fopen($file, "r"); while (!feof($fn)) { $line = fgets($fn); foreach ($tokens as $startToken => $endToken) { if (preg_match('/\b' . $startToken . '\b/', $line)) { $startSaving = true; break; } } if ($startSaving) { array_push($saved, $line); } foreach ($tokens as $startToken => $endToken) { if (preg_match('/\b' . $endToken . '\b/', $line)) { $startSaving = false; break; } } } fclose($fn); file_put_contents($file . '.saved', $saved); echo "saved file " . $file . ".saved\n"; } else if ($argv[2] == 'restore') { $saved = loadSavedData($file); restore($file, $tokens, $saved); /** * At this point - we restored the headers but the method definitions are not installed * We can't restore them until we have expanded what those definitions are * i.e. - * 1. we need to update_methods.php (to define the placeholders) * 2. then we meed to restore those methods from saved[] */ install_method_templates($file); $methodTokens = [ "CUSTOM_START_METHOD_START" => "CUSTOM_START_METHOD_END", "CUSTOM_STOP_METHOD_START" => "CUSTOM_STOP_METHOD_END" ]; restore($file, $methodTokens, $saved); echo "Restored file " . $file; // unlink($saveFile); } else if ($argv[2] == 'install-methods') { install_method_templates($file); echo "Installed method templates for file " . $file; // unlink($saveFile); } } exit(0); ?>