diff --git a/apps/web/lib/scrape.test.ts b/apps/web/lib/scrape.test.ts index d0202a4..2bc40d1 100644 --- a/apps/web/lib/scrape.test.ts +++ b/apps/web/lib/scrape.test.ts @@ -60,7 +60,25 @@ describe("scrapeUrl redirect guard", () => { const post = await scrapeUrl("https://example.com/post"); - expect(post.title).toBe("AI's ’test—case"); + expect(post.title).toBe("AI's \u2019test\u2014case"); expect(post.body).toBe("Tom & Jerry check"); }); + + it("reads valid meta tags with spaced attribute assignments", async () => { + const fetchMock = vi.fn(async () => + new Response( + `
+ + + `, + { status: 200, headers: { "content-type": "text/html" } }, + ), + ); + vi.stubGlobal("fetch", fetchMock); + + const post = await scrapeUrl("https://example.com/post"); + + expect(post.title).toBe("Spaced title"); + expect(post.body).toBe("Spaced description"); + }); }); diff --git a/apps/web/lib/scrape.ts b/apps/web/lib/scrape.ts index a8432ea..b1aa78b 100644 --- a/apps/web/lib/scrape.ts +++ b/apps/web/lib/scrape.ts @@ -67,8 +67,8 @@ function stripTags(html: string): string { function metaContent(html: string, prop: string): string | null { const patterns = [ - new RegExp(`]+(?:property|name)=["']${prop}["'][^>]*content=["']([^"']*)["']`, "i"), - new RegExp(`]+content=["']([^"']*)["'][^>]*(?:property|name)=["']${prop}["']`, "i"), + new RegExp(`]+(?:property|name)\\s*=\\s*["']${prop}["'][^>]*content\\s*=\\s*["']([^"']*)["']`, "i"), + new RegExp(`]+content\\s*=\\s*["']([^"']*)["'][^>]*(?:property|name)\\s*=\\s*["']${prop}["']`, "i"), ]; for (const re of patterns) { const m = html.match(re);