diff --git a/package.json b/package.json index 9818682..13a0c7e 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "dev": "astro dev", "start": "astro dev", "check": "astro check", - "build": "astro build --verbose && pagefind --site dist", + "build": "astro build --verbose && node scripts/rewrite-built-image-links.js && pagefind --site dist", "preview": "astro preview", "astro": "astro", "type-check": "tsc --noEmit --isolatedDeclarations", diff --git a/scripts/rewrite-built-image-links.js b/scripts/rewrite-built-image-links.js new file mode 100644 index 0000000..888d76f --- /dev/null +++ b/scripts/rewrite-built-image-links.js @@ -0,0 +1,70 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +const DIST_DIR = path.resolve("dist"); +const REMOTE_RAW_ORIGIN = "https://cnb.cool/CLN-Grated/blog-fuwari/-/git/raw/main/public"; +const TEXT_FILE_EXTENSIONS = new Set([".html", ".xml", ".json", ".js", ".css", ".txt"]); +const PIC_PATH_PATTERN = /(?:https:\/\/blog\.adclosenn\.top)?\/pic\/([^"'\s)<>]+)/g; + +async function walk(dir) { + const entries = await fs.readdir(dir, { withFileTypes: true }); + const files = await Promise.all( + entries.map(async (entry) => { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + return walk(fullPath); + } + return [fullPath]; + }), + ); + + return files.flat(); +} + +async function rewriteFile(filePath) { + const ext = path.extname(filePath).toLowerCase(); + if (!TEXT_FILE_EXTENSIONS.has(ext)) { + return 0; + } + + const original = await fs.readFile(filePath, "utf8"); + let replacements = 0; + const rewritten = original.replace(PIC_PATH_PATTERN, (_match, rest) => { + replacements += 1; + return `${REMOTE_RAW_ORIGIN}/pic/${rest}`; + }); + + if (rewritten === original) { + return 0; + } + + await fs.writeFile(filePath, rewritten, "utf8"); + return replacements; +} + +async function main() { + try { + await fs.access(DIST_DIR); + } catch { + console.error(`[rewrite-built-image-links] dist directory not found: ${DIST_DIR}`); + process.exit(1); + } + + const files = await walk(DIST_DIR); + let touchedFiles = 0; + let totalReplacements = 0; + + for (const filePath of files) { + const replacements = await rewriteFile(filePath); + if (replacements > 0) { + touchedFiles += 1; + totalReplacements += replacements; + } + } + + console.log( + `[rewrite-built-image-links] Replaced ${totalReplacements} link(s) in ${touchedFiles} file(s).`, + ); +} + +await main();