fix: og image generation

This commit is contained in:
gosangam
2026-05-06 01:45:47 +05:30
parent de374eab8b
commit 7361f9c14a
28 changed files with 221 additions and 45 deletions
+25 -3
View File
@@ -6,7 +6,7 @@
*/
import { BOOK_NAMES, CC_LILAS } from "@/lib/constants";
import { decodeTextFragment } from "@/lib/text-highlight";
import { decodeTextFragment, extractMatchedText } from "@/lib/text-highlight";
const SITE_URL =
process.env.NEXT_PUBLIC_SITE_URL || "https://prabhupadasays.org";
@@ -305,13 +305,18 @@ export function ogForLettersByLocation(location: string, count: number) {
/**
* Extract a display quote from the `?hl=` search param.
*
* The `hl` param encodes `prefix,suffix,length`. We reconstruct a readable
* snippet from the prefix + suffix: "first few words ... last few words"
* When `paragraphs` are provided (from the database), the full matched text
* is extracted by searching the content — giving the OG image the actual
* selected quote, not just the prefix/suffix.
*
* When `paragraphs` are not provided, falls back to reconstructing a
* readable snippet from prefix + suffix: "first few words ... last few words"
*
* Returns null if hl is missing or invalid.
*/
export function extractQuoteFromHl(
searchParams: Record<string, string | string[] | undefined> | URLSearchParams,
paragraphs?: string[],
): string | null {
const raw =
searchParams instanceof URLSearchParams
@@ -325,6 +330,23 @@ export function extractQuoteFromHl(
const fragment = decodeTextFragment(raw);
if (!fragment) return null;
// If paragraphs are available, extract the full matched text
if (paragraphs && paragraphs.length > 0) {
const fullMatch = extractMatchedText(fragment, paragraphs);
if (fullMatch) {
// Truncate at word boundary if too long for OG image
if (fullMatch.length > 280) {
const truncated = fullMatch.slice(0, 277);
const lastSpace = truncated.lastIndexOf(" ");
return (
(lastSpace > 200 ? truncated.slice(0, lastSpace) : truncated) + "..."
);
}
return fullMatch;
}
}
// Fallback: reconstruct from prefix + suffix
const { prefix, suffix } = fragment;
if (!prefix) return null;