// nuxt-og-image caps the encoded URL segment at 200 chars.// Fixed overhead (component name, param keys, path encoding) is ~50 chars,// leaving a ~150-char budget for title + description combined.const OG_BUDGET = 150 /** * Trims description to fit within the nuxt-og-image 200-char URL segment limit, * accounting for the title length and trying to cut at the last sentence boundary. */export function formatOgDescription(title: string | undefined, description: string | undefined): string | undefined { if (!description) return undefined const titleLen = Math.min(title?.length ?? 0, 60) const maxLen = OG_BUDGET - titleLen if (maxLen <= 0) return undefined const cleaned = description.replace(/,/g, '') if (cleaned.length <= maxLen) return cleaned const truncated = cleaned.slice(0, maxLen) const lastDot = truncated.lastIndexOf('.') return lastDot > 0 ? truncated.slice(0, lastDot + 1) : truncated}
// nuxt-og-image caps the encoded URL segment at 200 chars.
// Fixed overhead (component name, param keys, path encoding) is ~50 chars,
// leaving a ~150-char budget for title + description combined.
const OG_BUDGET = 150
/**
* Trims description to fit within the nuxt-og-image 200-char URL segment limit,
* accounting for the title length and trying to cut at the last sentence boundary.
*/
export function formatOgDescription(title: string | undefined, description: string | undefined): string | undefined {
if (!description) return undefined
const titleLen = Math.min(title?.length ?? 0, 60)
const maxLen = OG_BUDGET - titleLen
if (maxLen <= 0) return undefined
const cleaned = description.replace(/,/g, '')
if (cleaned.length <= maxLen) return cleaned
const truncated = cleaned.slice(0, maxLen)
const lastDot = truncated.lastIndexOf('.')
return lastDot > 0 ? truncated.slice(0, lastDot + 1) : truncated
}