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