diff --git a/packages/baoyu-md/src/images.test.ts b/packages/baoyu-md/src/images.test.ts index 625996c..f3eca2a 100644 --- a/packages/baoyu-md/src/images.test.ts +++ b/packages/baoyu-md/src/images.test.ts @@ -45,6 +45,20 @@ test("image extension and local fallback resolution handle common path variants" assert.equal(resolved, path.join(baseDir, "figure.webp")); }); +test("resolveImagePath decodes URL-encoded filenames with spaces", async (t) => { + const root = await makeTempDir("baoyu-md-urlencoded-"); + t.after(() => fs.rm(root, { recursive: true, force: true })); + + const baseDir = path.join(root, "article"); + const tempDir = path.join(root, "tmp"); + await fs.mkdir(baseDir, { recursive: true }); + await fs.mkdir(tempDir, { recursive: true }); + await fs.writeFile(path.join(baseDir, "Pasted image 20260524.png"), "png"); + + const resolved = await resolveImagePath("Pasted%20image%2020260524.png", baseDir, tempDir, "test"); + assert.equal(resolved, path.join(baseDir, "Pasted image 20260524.png")); +}); + test("resolveContentImages resolves image placeholders against the content directory", async (t) => { const root = await makeTempDir("baoyu-md-content-images-"); t.after(() => fs.rm(root, { recursive: true, force: true })); diff --git a/packages/baoyu-md/src/images.ts b/packages/baoyu-md/src/images.ts index b28f041..667fa89 100644 --- a/packages/baoyu-md/src/images.ts +++ b/packages/baoyu-md/src/images.ts @@ -103,9 +103,10 @@ export async function resolveImagePath( return localPath; } - const resolved = path.isAbsolute(imagePath) - ? imagePath - : path.resolve(baseDir, imagePath); + const decoded = decodeURIComponent(imagePath); + const resolved = path.isAbsolute(decoded) + ? decoded + : path.resolve(baseDir, decoded); return resolveLocalWithFallback(resolved, logLabel); } diff --git a/skills/baoyu-post-to-x/scripts/md-to-html.ts b/skills/baoyu-post-to-x/scripts/md-to-html.ts index 7ee6ce1..9b2fbc9 100644 --- a/skills/baoyu-post-to-x/scripts/md-to-html.ts +++ b/skills/baoyu-post-to-x/scripts/md-to-html.ts @@ -181,11 +181,12 @@ async function resolveImagePath(imagePath: string, baseDir: string, tempDir: str return localPath; } - if (path.isAbsolute(imagePath)) { - return imagePath; + const decoded = decodeURIComponent(imagePath); + if (path.isAbsolute(decoded)) { + return decoded; } - return path.resolve(baseDir, imagePath); + return path.resolve(baseDir, decoded); } function escapeHtml(text: string): string {