fix(products): extract lexical AST and JSON-LD data correctly from productTabs block
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 10s
Build & Deploy / 🧪 QA (push) Failing after 52s
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 2s

This commit is contained in:
2026-08-07 17:12:55 +02:00
parent 4ae45b1aa7
commit 0554460153
3 changed files with 124 additions and 13 deletions

View File

@@ -17,6 +17,7 @@ import Link from 'next/link';
import { notFound, redirect } from 'next/navigation';
import ProductEngagementTracker from '@/components/analytics/ProductEngagementTracker';
import MDXContent from '@/components/MDXContent';
import { lexicalToMarkdown } from '@/lib/mdx-utils';
interface ProductPageProps {
params: Promise<{
@@ -266,18 +267,7 @@ export default async function ProductPage({ params }: ProductPageProps) {
notFound();
}
let technicalItems = [];
try {
const tabMatch =
typeof product.content === 'string' &&
product.content.match(/<Block type="productTabs" data={({.*?})}\s*\/>/s);
if (tabMatch && tabMatch[1]) {
const data = JSON.parse(tabMatch[1]);
technicalItems = data.technicalItems || [];
}
} catch (e) {
// Ignore JSON parse errors for AST
}
let technicalItems: any[] = [];
const datasheetPath = getDatasheetPath(productSlug, locale);
const isFallback = (product.frontmatter as any).isFallback;
@@ -296,8 +286,24 @@ export default async function ProductPage({ params }: ProductPageProps) {
if (typeof product.content === 'string') {
const tabBlockMatch = product.content.match(/<Block type="productTabs".*?\/>/s);
if (tabBlockMatch) {
descriptionContent = product.content.replace(tabBlockMatch[0], '');
technicalContent = tabBlockMatch[0];
descriptionContent = product.content.replace(tabBlockMatch[0], '');
const dataMatch =
technicalContent.match(/data="({.*?})"/s) || technicalContent.match(/data={({.*?})}/s);
if (dataMatch && dataMatch[1]) {
try {
const rawJsonStr = dataMatch[1].replace(/&quot;/g, '"');
const data = JSON.parse(rawJsonStr);
technicalItems = data.technicalItems || [];
if (data.content?.root && descriptionContent.trim() === '') {
descriptionContent = lexicalToMarkdown(data.content.root);
}
} catch (e) {
console.error('Failed to parse productTabs data for page:', e);
}
}
}
}