| Server IP : 35.80.110.71 / Your IP : 216.73.216.221 Web Server : Apache/2.4.58 (Ubuntu) System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64 User : ubuntu ( 1000) PHP Version : 8.3.31 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /proc/2798582/cwd/scripts/analysis/ |
Upload File : |
<?php
/**
* Blog Content Analysis Script
*
* Analyzes blog posts for code-to-prose ratio and identifies
* posts that need more textual context around code blocks.
*
* Usage: php scripts/analysis/analyze-blog-content.php [--verbose] [--json]
*/
$blogDir = __DIR__.'/../database/seeders/Content/blog';
$verbose = in_array('--verbose', $argv);
$jsonOutput = in_array('--json', $argv);
$results = [];
// Get all blog files 01-100
$files = glob($blogDir.'/*.md');
$targetFiles = [];
foreach ($files as $file) {
$basename = basename($file);
// Extract number from filename (e.g., "01-laravel-12-whats-new.md" -> 1)
if (preg_match('/^(\d+)-/', $basename, $matches)) {
$num = (int) $matches[1];
if ($num >= 1 && $num <= 100) {
$targetFiles[$num] = $file;
}
}
}
ksort($targetFiles);
foreach ($targetFiles as $num => $file) {
$content = file_get_contents($file);
$lines = explode("\n", $content);
$totalLines = count($lines);
$codeLines = 0;
$proseLines = 0;
$inCodeBlock = false;
$codeBlocks = [];
$currentCodeBlock = [];
$consecutiveCodeBlocks = 0;
$maxConsecutiveCodeBlocks = 0;
$lastWasCode = false;
$proseBetweenBlocks = 0;
foreach ($lines as $lineNum => $line) {
$trimmed = trim($line);
// Check for code block markers
if (preg_match('/^```/', $trimmed)) {
if (! $inCodeBlock) {
// Starting a code block
$inCodeBlock = true;
$currentCodeBlock = ['start' => $lineNum, 'lines' => 0];
if ($lastWasCode && $proseBetweenBlocks < 2) {
$consecutiveCodeBlocks++;
} else {
$maxConsecutiveCodeBlocks = max($maxConsecutiveCodeBlocks, $consecutiveCodeBlocks);
$consecutiveCodeBlocks = 1;
}
$proseBetweenBlocks = 0;
} else {
// Ending a code block
$inCodeBlock = false;
$currentCodeBlock['end'] = $lineNum;
$codeBlocks[] = $currentCodeBlock;
$lastWasCode = true;
}
continue;
}
if ($inCodeBlock) {
$codeLines++;
$currentCodeBlock['lines']++;
} else {
// Count non-empty prose lines
if (! empty($trimmed) && ! preg_match('/^#{1,6}\s/', $trimmed)) {
$proseLines++;
if ($lastWasCode) {
$proseBetweenBlocks++;
}
}
// Reset lastWasCode after significant prose
if ($proseBetweenBlocks >= 3) {
$lastWasCode = false;
}
}
}
$maxConsecutiveCodeBlocks = max($maxConsecutiveCodeBlocks, $consecutiveCodeBlocks);
// Calculate metrics
$totalContent = $codeLines + $proseLines;
$codeRatio = $totalContent > 0 ? round(($codeLines / $totalContent) * 100, 1) : 0;
// Determine severity
$severity = 'OK';
$issues = [];
if ($codeRatio > 70) {
$severity = 'MAJOR';
$issues[] = "Code ratio {$codeRatio}% (>70%)";
} elseif ($codeRatio > 60) {
$severity = 'MODERATE';
$issues[] = "Code ratio {$codeRatio}% (>60%)";
}
if ($maxConsecutiveCodeBlocks >= 3) {
if ($severity === 'OK') {
$severity = 'MODERATE';
}
$issues[] = "{$maxConsecutiveCodeBlocks} consecutive code blocks";
} elseif ($maxConsecutiveCodeBlocks >= 2) {
$issues[] = "{$maxConsecutiveCodeBlocks} consecutive code blocks (minor)";
}
// Check for large code blocks with no surrounding prose
$largeCodeBlocks = array_filter($codeBlocks, fn ($b) => $b['lines'] > 20);
if (count($largeCodeBlocks) >= 3) {
if ($severity === 'OK') {
$severity = 'MINOR';
}
$issues[] = count($largeCodeBlocks).' large code blocks (>20 lines)';
}
$results[] = [
'file' => basename($file),
'number' => $num,
'total_lines' => $totalLines,
'code_lines' => $codeLines,
'prose_lines' => $proseLines,
'code_ratio' => $codeRatio,
'code_blocks' => count($codeBlocks),
'max_consecutive' => $maxConsecutiveCodeBlocks,
'severity' => $severity,
'issues' => $issues,
];
}
// Output results
if ($jsonOutput) {
echo json_encode($results, JSON_PRETTY_PRINT)."\n";
} else {
// Summary
$major = array_filter($results, fn ($r) => $r['severity'] === 'MAJOR');
$moderate = array_filter($results, fn ($r) => $r['severity'] === 'MODERATE');
$minor = array_filter($results, fn ($r) => $r['severity'] === 'MINOR');
$ok = array_filter($results, fn ($r) => $r['severity'] === 'OK');
echo "=== Blog Content Analysis Report ===\n\n";
echo "Summary:\n";
echo ' MAJOR enhancement needed: '.count($major)."\n";
echo ' MODERATE enhancement needed: '.count($moderate)."\n";
echo ' MINOR tweaks needed: '.count($minor)."\n";
echo ' OK (no changes needed): '.count($ok)."\n";
echo "\n";
// List blogs needing work
if (count($major) > 0) {
echo "=== MAJOR (Code ratio >70%) ===\n";
foreach ($major as $r) {
printf(" %03d: %s\n", $r['number'], $r['file']);
printf(" Code: %d%% | Blocks: %d | Issues: %s\n",
$r['code_ratio'], $r['code_blocks'], implode(', ', $r['issues']));
}
echo "\n";
}
if (count($moderate) > 0) {
echo "=== MODERATE (Code ratio >60% or 3+ consecutive blocks) ===\n";
foreach ($moderate as $r) {
printf(" %03d: %s\n", $r['number'], $r['file']);
printf(" Code: %d%% | Blocks: %d | Issues: %s\n",
$r['code_ratio'], $r['code_blocks'], implode(', ', $r['issues']));
}
echo "\n";
}
if ($verbose && count($minor) > 0) {
echo "=== MINOR ===\n";
foreach ($minor as $r) {
printf(" %03d: %s\n", $r['number'], $r['file']);
printf(" Code: %d%% | Issues: %s\n",
$r['code_ratio'], implode(', ', $r['issues']));
}
echo "\n";
}
if ($verbose) {
echo "=== OK (No changes needed) ===\n";
foreach ($ok as $r) {
printf(" %03d: %s (Code: %d%%)\n", $r['number'], $r['file'], $r['code_ratio']);
}
}
}