diff --git a/src/app/actions.ts b/src/app/actions.ts index a855b4c..9a792ce 100644 --- a/src/app/actions.ts +++ b/src/app/actions.ts @@ -57,12 +57,15 @@ export async function extractMetaData(url: string, keyword?: string) { const image = $('meta[property="og:image"]').attr("content") || null; const faqData: FaqItem[] = []; + const schemaData: any[] = []; $('script[type="application/ld+json"]').each((i, el) => { const jsonContent = $(el).html(); if (!jsonContent) return; try { const data = JSON.parse(jsonContent); + schemaData.push(data); + const graph = data["@graph"] || [data]; for (const item of graph) { @@ -171,6 +174,7 @@ export async function extractMetaData(url: string, keyword?: string) { description, image, faq: faqData.length > 0 ? faqData : null, + schema: schemaData.length > 0 ? schemaData : null, headlines: headlines.length > 0 ? headlines : null, keyword: trimmedKeyword || null, keywordCount, diff --git a/src/components/meta-form.tsx b/src/components/meta-form.tsx index 3668797..5f0c226 100644 --- a/src/components/meta-form.tsx +++ b/src/components/meta-form.tsx @@ -30,12 +30,14 @@ import { ImageAltDisplay } from "./image-alt-display"; import { TabIndicator } from "./tab-indicator"; import { getLengthIndicatorColor, type IndicatorColor } from "@/lib/analysis"; import { KeywordHighlighter } from "./keyword-highlighter"; +import { SchemaDisplay } from "./schema-display"; interface MetaData { title: string; description: string; image?: string | null; faq?: { question: string; answer: string }[] | null; + schema?: any[] | null; headlines?: HeadlineNode[] | null; keyword?: string | null; keywordCount?: number | null; @@ -123,11 +125,18 @@ export function MetaForm() { faqColor = "green"; } + // Schema Tab + let schemaColor: IndicatorColor = "gray"; + if (metaData.schema && metaData.schema.length > 0) { + schemaColor = "green"; + } + return { analysis: analysisColor, headlines: headlinesColor, images: imagesColor, faq: faqColor, + schema: schemaColor, }; }, [metaData, editableTitle, editableDescription]); @@ -245,6 +254,12 @@ export function MetaForm() { FAQ )} + {metaData.schema && metaData.schema.length > 0 && ( + + {tabColors && } + Schema + + )} @@ -468,6 +483,16 @@ export function MetaForm() { )} + + {metaData.schema && metaData.schema.length > 0 && ( + + + + + + + + )} )} diff --git a/src/components/schema-display.tsx b/src/components/schema-display.tsx new file mode 100644 index 0000000..1d3e205 --- /dev/null +++ b/src/components/schema-display.tsx @@ -0,0 +1,40 @@ +"use client"; + +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { CopyButton } from "./copy-button"; + +interface SchemaDisplayProps { + schemas: any[]; +} + +export function SchemaDisplay({ schemas }: SchemaDisplayProps) { + return ( + + {schemas.map((schema, index) => { + const schemaType = schema["@type"] || `Schema Block ${index + 1}`; + const schemaJson = JSON.stringify(schema, null, 2); + + return ( + + {schemaType} + +
+
+ +
+
+                  {schemaJson}
+                
+
+
+
+ ); + })} +
+ ); +} \ No newline at end of file