0) { $ch = $content[$i]; $next = ($i + 1 < $len) ? $content[$i + 1] : ''; if ($in_line_comment) { if ($ch === "\n") $in_line_comment = false; $i++; continue; } if ($in_block_comment) { if ($ch === '*' && $next === '/') { $in_block_comment = false; $i += 2; continue; } $i++; continue; } if ($in_string_single) { if ($ch === '\\') { $i += 2; continue; } if ($ch === "'") $in_string_single = false; $i++; continue; } if ($in_string_double) { if ($ch === '\\') { $i += 2; continue; } if ($ch === '"') $in_string_double = false; $i++; continue; } if ($ch === '/' && $next === '/') { $in_line_comment = true; $i += 2; continue; } if ($ch === '/' && $next === '*') { $in_block_comment = true; $i += 2; continue; } if ($ch === "'") { $in_string_single = true; $i++; continue; } if ($ch === '"') { $in_string_double = true; $i++; continue; } if ($ch === '{') $depth++; elseif ($ch === '}') $depth--; $i++; } if ($depth !== 0) { echo "WARNING: Could not find matching closing brace for: $signature\n"; return $content; } $close_brace = $i - 1; // Get indentation of the method $line_start = strrpos(substr($content, 0, $pos), "\n"); if ($line_start === false) $line_start = 0; else $line_start++; $indent = ''; for ($j = $line_start; $j < $pos; $j++) { if ($content[$j] === ' ' || $content[$j] === "\t") $indent .= $content[$j]; else break; } // Replace from open_brace to close_brace (inclusive) $replacement = "{\n" . $indent . " " . $body . "\n" . $indent . "}"; $content = substr($content, 0, $open_brace) . $replacement . substr($content, $close_brace + 1); return $content; } // --- DRAFT SERVICE METHODS --- $content = replace_method($content, 'public function publish_draft(int $user_id, int $draft_id, array $data)', 'return $this->draft_service()->publish_draft($user_id, $draft_id, $data);'); $content = replace_method($content, 'public function ajax_delete_draft(): void', '$this->draft_service()->ajax_delete_draft();'); $content = replace_method($content, 'public function ajax_load_draft(): void', '$this->draft_service()->ajax_load_draft();'); $content = replace_method($content, 'public function ajax_save_draft(): void', '$this->draft_service()->ajax_save_draft();'); $content = replace_method($content, 'public function load_draft_data(int $user_id, int $draft_id): ?array', 'return $this->draft_service()->load_draft_data($user_id, $draft_id);'); $content = replace_method($content, 'public function delete_draft(int $user_id, int $draft_id): bool', 'return $this->draft_service()->delete_draft($user_id, $draft_id);'); $content = replace_method($content, 'public function get_user_drafts(int $user_id, int $limit = 20): array', 'return $this->draft_service()->get_user_drafts($user_id, $limit);'); $content = replace_method($content, 'public function get_user_draft_count(int $user_id): int', 'return $this->draft_service()->get_user_draft_count($user_id);'); $content = replace_method($content, 'public function save_draft(int $user_id, array $data)', 'return $this->draft_service()->save_draft($user_id, $data);'); // --- COMMENT SERVICE METHODS --- $content = replace_method($content, 'public function get_commenter_badge(int $user_id, int $topic_id): ?array', 'return $this->comment_service()->get_commenter_badge($user_id, $topic_id);'); $content = replace_method($content, 'public function is_hot_comment(int $comment_id): bool', 'return $this->comment_service()->is_hot_comment($comment_id);'); $content = replace_method($content, 'public function maybe_mark_hot_comment(int $comment_id): bool', 'return $this->comment_service()->maybe_mark_hot_comment($comment_id);'); $content = replace_method($content, 'public function set_comment_topping(int $comment_id, int $level): bool', 'return $this->comment_service()->set_comment_topping($comment_id, $level);'); $sig_forum_comments = "public function get_forum_comments(int \$topic_id, string \$sort = 'newest', bool \$author_only = false, int \$page = 1, int \$per_page = 30): array"; $content = replace_method($content, $sig_forum_comments, 'return $this->comment_service()->get_forum_comments($topic_id, $sort, $author_only, $page, $per_page);'); $content = replace_method($content, 'public function get_adopted_comment_id(int $topic_id): int', 'return $this->comment_service()->get_adopted_comment_id($topic_id);'); $content = replace_method($content, 'public function adopt_answer(int $topic_id, int $comment_id, int $operator_id)', 'return $this->comment_service()->adopt_answer($topic_id, $comment_id, $operator_id);'); $content = replace_method($content, 'public function render_forum_comments(array $comments, int $topic_id, int $adopted_id = 0): void', '$this->comment_service()->render_forum_comments($comments, $topic_id, $adopted_id);'); $content = replace_method($content, 'public function ajax_comment_topping(): void', '$this->comment_service()->ajax_comment_topping();'); $content = replace_method($content, 'public function ajax_forum_comments(): void', '$this->comment_service()->ajax_forum_comments();'); // --- SCORE/NOTIFICATION SERVICE METHODS --- $content = replace_method($content, 'public function on_forum_comment_posted(int $comment_id, $approved, array $commentdata = []): void', '$this->score_service()->on_forum_comment_posted($comment_id, $approved, $commentdata);'); $content = replace_method($content, 'public function notify_topic_scored(int $topic_id, int $scorer_id, int $amount): void', '$this->score_service()->notify_topic_scored($topic_id, $scorer_id, $amount);'); $content = replace_method($content, 'public function notify_topic_reply(int $topic_id, int $commenter_id): void', '$this->score_service()->notify_topic_reply($topic_id, $commenter_id);'); $content = replace_method($content, 'public function notify_moderation_result(int $topic_id, string $action, int $operator_id): void', '$this->score_service()->notify_moderation_result($topic_id, $action, $operator_id);'); $content = replace_method($content, 'public function notify_topic_pending(int $topic_id, int $author_id): void', '$this->score_service()->notify_topic_pending($topic_id, $author_id);'); $content = replace_method($content, 'private function notify(int $user_id, string $type, string $content, array $data = []): void', '$this->score_service()->notify($user_id, $type, $content, $data);'); // --- Write result --- $result = file_put_contents($file, $content); if ($result === false) { echo "ERROR: Cannot write file\n"; exit(1); } echo "SUCCESS: File updated. New size: " . strlen($content) . " bytes\n"; echo "Line count: " . (substr_count($content, "\n") + 1) . "\n";