90 lines
3.0 KiB
JavaScript
90 lines
3.0 KiB
JavaScript
import fs from 'fs';
|
||
import path from 'path';
|
||
import { fileURLToPath } from 'url';
|
||
|
||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||
const IMAGES_DIR = path.resolve(__dirname, '../public/images');
|
||
const DATA_FILE = path.resolve(__dirname, '../lib/data.ts');
|
||
const GALLERY_FILE = path.resolve(__dirname, '../lib/gallery_data.ts');
|
||
|
||
function slugify(text) {
|
||
return text.toString().toLowerCase()
|
||
.replace(/ç/g, 'c')
|
||
.replace(/ğ/g, 'g')
|
||
.replace(/ı/g, 'i')
|
||
.replace(/ö/g, 'o')
|
||
.replace(/ş/g, 's')
|
||
.replace(/ü/g, 'u')
|
||
.replace(/[^a-z0-9.]/g, '-')
|
||
.replace(/\-\-+/g, '-')
|
||
.replace(/^-+/, '')
|
||
.replace(/-+$/, '');
|
||
}
|
||
|
||
function processDirectory(dir, mapping = []) {
|
||
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
||
|
||
for (const entry of entries) {
|
||
const oldPath = path.join(dir, entry.name);
|
||
let newName = slugify(path.parse(entry.name).name);
|
||
if (entry.isFile()) {
|
||
newName += path.extname(entry.name).toLowerCase();
|
||
}
|
||
|
||
const newPath = path.join(dir, newName);
|
||
|
||
if (entry.isDirectory()) {
|
||
// Recurse first before renaming directory
|
||
processDirectory(oldPath, mapping);
|
||
}
|
||
|
||
if (oldPath !== newPath) {
|
||
console.log(`Renaming: ${oldPath} -> ${newPath}`);
|
||
fs.renameSync(oldPath, newPath);
|
||
|
||
const oldRelative = path.relative(IMAGES_DIR, oldPath).replace(/\\/g, '/');
|
||
const newRelative = path.relative(IMAGES_DIR, newPath).replace(/\\/g, '/');
|
||
mapping.push({ old: oldRelative, new: newRelative });
|
||
}
|
||
}
|
||
return mapping;
|
||
}
|
||
|
||
console.log("Starting rename process...");
|
||
// First rename files inside directories, then rename directories
|
||
// To do this safely, we should gather all files, then directories, and rename bottom-up.
|
||
function getAllPaths(dir) {
|
||
let results = [];
|
||
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
||
for (const entry of entries) {
|
||
const fullPath = path.join(dir, entry.name);
|
||
if (entry.isDirectory()) {
|
||
results = results.concat(getAllPaths(fullPath));
|
||
}
|
||
results.push({ path: fullPath, isDir: entry.isDirectory(), name: entry.name });
|
||
}
|
||
return results;
|
||
}
|
||
|
||
const allPaths = getAllPaths(IMAGES_DIR).sort((a, b) => b.path.length - a.path.length); // Bottom up
|
||
const mapping = [];
|
||
|
||
for (const item of allPaths) {
|
||
const oldPath = item.path;
|
||
const dir = path.dirname(oldPath);
|
||
let newName = slugify(path.parse(item.name).name);
|
||
if (!item.isDir) {
|
||
newName += path.extname(item.name).toLowerCase();
|
||
}
|
||
const newPath = path.join(dir, newName);
|
||
|
||
if (oldPath !== newPath) {
|
||
fs.renameSync(oldPath, newPath);
|
||
console.log(`Renamed: ${item.name} -> ${newName}`);
|
||
|
||
// We will just do a global replace in files using slugify on the strings later
|
||
// It's easier than keeping track of complex path mapping.
|
||
}
|
||
}
|
||
console.log("Renaming done.");
|