# W5: shorten titles >65 chars; guarantee unique meta descriptions across the corpus $repo = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) $excludePattern = '\\(\.git|node_modules|seo-audit-2026-05-27|website|directory)\\' $files = Get-ChildItem $repo -Recurse -Filter index.html -File -ErrorAction SilentlyContinue | Where-Object { $_.FullName -notmatch $excludePattern } function ToTitle([string]$slug) { $s = $slug -replace '-', ' ' $s = (Get-Culture).TextInfo.ToTitleCase($s.ToLower()) $s = $s -replace '\bOdoo\b','Odoo' $s = $s -replace '\bAi\b','AI' $s = $s -replace '\bErp\b','ERP' $s = $s -replace '\bIa\b','IA' $s = $s -replace '\bAws\b','AWS' $s = $s -replace '\bGcp\b','GCP' $s = $s -replace '\bVps\b','VPS' $s = $s -replace '\bSh\b','SH' $s = $s -replace '\bUk\b','UK' $s = $s -replace '\bUsa\b','USA' $s = $s -replace '\bSaas\b','SaaS' return $s } function PathLang([string]$fullPath, [string]$repo) { $rel = $fullPath.Substring($repo.Length).TrimStart('\','/') $parts = $rel -split '[\\/]' if ($parts.Count -ge 1 -and ($parts[0] -in @('en','de','fr','pt','ar'))) { return $parts[0] } return 'es' } # First pass — collect existing meta description counts (informational only) $metaCounts = @{} foreach ($file in $files) { $c = [System.IO.File]::ReadAllText($file.FullName) if (-not $c) { continue } $m = [regex]::Match($c, '65 chars) $tm = [regex]::Match($c, '