import { resolvePublicRequestOrigin } from '../mindspace-public-page-context.mjs'; import { extractCoverSignals } from '../mindspace-thumbnails.mjs'; function escapePublicHtml(value) { return String(value ?? '') .replaceAll('&', '&') .replaceAll('<', '<') .replaceAll('>', '>') .replaceAll('"', '"') .replaceAll("'", '''); } export function extractOgImageUrl(html) { return ( String(html ?? '').match(/]+property=["']og:image["'][^>]+content=["']([^"']+)["']/i)?.[1] || String(html ?? '').match(/]+content=["']([^"']+)["'][^>]+property=["']og:image["']/i)?.[1] || '' ); } export function extractShareMetaFromPageHtml(html) { const signals = extractCoverSignals(String(html ?? '')); return { title: detectPublishedPageTitle(html), subtitle: signals.subtitle, }; } export function appendQueryParam(url, key, value) { const separator = url.includes('?') ? '&' : '?'; return `${url}${separator}${encodeURIComponent(key)}=${encodeURIComponent(value)}`; } export function removeQueryParam(url, key) { if (!url || !url.includes('?')) return url; const [base, queryAndHash] = url.split('?', 2); const [query, hash = ''] = queryAndHash.split('#', 2); const params = new URLSearchParams(query); params.delete(key); const nextQuery = params.toString(); return `${base}${nextQuery ? `?${nextQuery}` : ''}${hash ? `#${hash}` : ''}`; } export function resolveRequestOrigin(req) { return resolvePublicRequestOrigin({ hostHeader: req.headers['x-forwarded-host'] || req.headers.host || '', forwardedProto: req.headers['x-forwarded-proto'] || '', protocol: req.protocol, }); } export function detectPublishedPageTitle(html) { const match = String(html ?? '').match(/]*>([^<]+)<\/title>/i); return match?.[1]?.replace(/\s+/g, ' ').trim() || 'MindSpace 页面'; } export function publishedPageShellHtml({ iframeUrl, shareUrl, title, longImageUrl }) { const iframeSrc = escapePublicHtml(iframeUrl); const safeShareUrl = escapePublicHtml(shareUrl); const safeTitle = escapePublicHtml(title); const serializedShareUrl = JSON.stringify(shareUrl).replace(/ ${safeTitle}
`; }