<#
Nama Script : TextScriptFilesToFolder.ps1
 
Deskripsi :
Scan file text / scripting populer (whitelist) di folder target.
 
Workflow:
1. User input folder
2. Pilih mode extension:
   - Enter / 1 = All whitelist
   - 2 = Manual pilih extension
   - langsung ketik .md atau .ts,.js
3. Script membuat folder sesuai nama file
4. File dipindahkan ke folder tersebut
5. Opsi membuat file tambahan:
   i = index.md
   y = file dengan nama sama seperti folder
   default = tidak membuat file
 
Aman:
Hanya memproses extension whitelist
Binary files tidak tersentuh
#>
 
# =============================
# EXTENSION WHITELIST
# =============================
 
$allowedExtensions = @(
".md",".mdx",".txt",
".js",".mjs",".cjs",
".ts",".tsx",
".php",".py",".rb",
".rs",".go",
".html",".css",".scss",
".json",".yaml",".yml",".toml",
".sh",".ps1",".bat",
".csv"
)
 
# =============================
# INPUT TARGET FOLDER
# =============================
 
do {
 
    $targetFolder = Read-Host "📂 Masukkan path folder target"
 
    if (-not (Test-Path $targetFolder)) {
 
        Write-Host "`n❌ Path tidak ditemukan." -ForegroundColor Red
        $retry = $true
 
    } else {
 
        $retry = $false
    }
 
} while ($retry)
 
# =============================
# MODE SELECTION
# =============================
 
Write-Host ""
Write-Host "Mode pemrosesan:"
Write-Host "1. All (default) → semua extension whitelist"
Write-Host "2. Manual pilih extension"
Write-Host "atau langsung tulis extension contoh: .md atau .md,.ts"
 
$mode = Read-Host "Masukkan pilihan (Enter = default)"
 
if ([string]::IsNullOrWhiteSpace($mode) -or $mode -eq "1") {
 
    $extensions = $allowedExtensions
}
 
elseif ($mode -eq "2") {
 
    Write-Host ""
    Write-Host "Extension tersedia:"
    Write-Host ($allowedExtensions -join ", ")
 
    $inputExt = Read-Host "Masukkan extension dipisah koma (contoh: .md,.ts)"
 
    $extensions = $inputExt.Split(",") | ForEach-Object {
        $_.Trim().ToLower()
    }
 
}
 
elseif ($mode.StartsWith(".")) {
 
    $extensions = $mode.Split(",") | ForEach-Object {
        $_.Trim().ToLower()
    }
 
}
 
else {
 
    Write-Host "❌ Input tidak valid."
    exit
}
 
# =============================
# VALIDATE EXTENSION
# =============================
 
$extensions = $extensions | Where-Object {
    $allowedExtensions -contains $_
}
 
if ($extensions.Count -eq 0) {
 
    Write-Host "❌ Tidak ada extension valid." -ForegroundColor Red
    exit
}
 
# =============================
# SCAN FILES
# =============================
 
$files = Get-ChildItem -Path $targetFolder -File | Where-Object {
    $extensions -contains $_.Extension.ToLower()
}
 
if ($files.Count -eq 0) {
 
    Write-Host "`n⚠️ Tidak ada file cocok ditemukan." -ForegroundColor Yellow
    exit
}
 
Write-Host ""
Write-Host "📄 File ditemukan:" -ForegroundColor Cyan
 
foreach ($f in $files) {
 
    Write-Host " - $($f.Name)"
}
 
# =============================
# FILE CREATION OPTION
# =============================
 
Write-Host ""
Write-Host "Buat file tambahan di dalam folder?"
Write-Host "i = index.md"
Write-Host "y = file dengan nama sama seperti folder"
Write-Host "Enter = No (default)"
 
$fileOption = Read-Host "Pilihan"
 
$fileOption = $fileOption.Trim().ToLower()
 
# =============================
# CONFIRMATION
# =============================
 
$confirm = Read-Host "`nLanjutkan proses? (Y/N)"
 
if ($confirm.Trim().ToLower() -ne "y") {
 
    Write-Host "❌ Operasi dibatalkan."
    exit
}
 
# =============================
# PROCESS FILES
# =============================
 
Write-Host ""
Write-Host "⚙️ Memproses..." -ForegroundColor Green
 
foreach ($file in $files) {
 
    $name = [System.IO.Path]::GetFileNameWithoutExtension($file.Name)
 
    $folderPath = Join-Path $targetFolder $name
 
    if (-not (Test-Path $folderPath)) {
 
        New-Item -ItemType Directory -Path $folderPath | Out-Null
    }
 
    $destination = Join-Path $folderPath $file.Name
 
    Move-Item $file.FullName $destination
 
    if ($fileOption -eq "i") {
 
        $indexFile = Join-Path $folderPath "index.md"
 
        if (-not (Test-Path $indexFile)) {
 
            New-Item -ItemType File -Path $indexFile | Out-Null
        }
 
    }
    elseif ($fileOption -eq "y") {
 
        $sameNameFile = Join-Path $folderPath ($name + ".md")
 
        if (-not (Test-Path $sameNameFile)) {
 
            New-Item -ItemType File -Path $sameNameFile | Out-Null
        }
    }
 
    Write-Host "✔ $($file.Name)$name\"
}
 
Write-Host ""
Write-Host "✅ Selesai."