const GOofishDesktopBase = 'https://www.goofish.com/item'; const GOofishMobileBase = 'https://h5.m.goofish.com/item'; export function normalizeItemId(value = '') { const text = String(value || '').trim(); if (!text) return ''; const queryMatch = text.match(/[?&](?:id|itemId)=([0-9]+)/i); if (queryMatch) return queryMatch[1]; const pathMatch = text.match(/(?:item|itemId)[=/]([0-9]+)/i); if (pathMatch) return pathMatch[1]; const digits = text.match(/\b([0-9]{8,})\b/); return digits ? digits[1] : ''; } export function buildItemLinks(itemOrId = {}) { const raw = typeof itemOrId === 'object' && itemOrId !== null ? itemOrId : { id: itemOrId }; const id = normalizeItemId(raw.id || raw.itemId || raw.href || raw.url || raw.detailUrl || raw.originalHref || raw.shareUrl); const source = String(raw.href || raw.url || raw.detailUrl || raw.originalHref || raw.shareUrl || '').trim(); let categoryId = String(raw.categoryId || '').trim(); if (!categoryId && source) { const m = source.match(/[?&]categoryId=([^&#]+)/i); if (m) categoryId = decodeURIComponent(m[1]); } if (!id) { return { id: '', desktopUrl: source, mobileUrl: source, webUrl: source, primaryUrl: source, markdownUrl: source, }; } const categoryQuery = categoryId ? `&categoryId=${encodeURIComponent(categoryId)}` : ''; const desktopUrl = `${GOofishDesktopBase}?id=${encodeURIComponent(id)}${categoryQuery}`; const mobileUrl = `${GOofishMobileBase}?id=${encodeURIComponent(id)}`; return { id, desktopUrl, mobileUrl, webUrl: desktopUrl, primaryUrl: mobileUrl, markdownUrl: mobileUrl, }; } export function enrichItemLinks(item = {}) { const links = buildItemLinks(item); if (!links.id && !links.primaryUrl) return item; return { ...item, id: item.id || links.id, href: links.primaryUrl || item.href || item.url || '', mobileHref: links.mobileUrl || item.mobileHref || '', webHref: links.desktopUrl || item.webHref || '', originalHref: item.originalHref || item.href || item.url || '', }; } export function displayItemUrl(itemOrId = {}) { return buildItemLinks(itemOrId).primaryUrl || ''; }