@opinly/next 0.1.25 → 1.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.cjs +16 -7
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +7 -2
- package/dist/config.d.ts +7 -2
- package/dist/config.js +16 -7
- package/dist/config.js.map +1 -1
- package/dist/index.cjs +33 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -6
- package/dist/index.d.ts +12 -6
- package/dist/index.js +26 -1
- package/dist/index.js.map +1 -1
- package/dist/json-ld.cjs +61 -0
- package/dist/json-ld.cjs.map +1 -0
- package/dist/json-ld.d.cts +17 -0
- package/dist/json-ld.d.ts +17 -0
- package/dist/json-ld.js +38 -0
- package/dist/json-ld.js.map +1 -0
- package/dist/utils/generate-metadata.cjs +23 -32
- package/dist/utils/generate-metadata.cjs.map +1 -1
- package/dist/utils/generate-metadata.d.cts +11 -2
- package/dist/utils/generate-metadata.d.ts +11 -2
- package/dist/utils/generate-metadata.js +23 -32
- package/dist/utils/generate-metadata.js.map +1 -1
- package/dist/utils/generate-sitemap-xml.cjs.map +1 -1
- package/dist/utils/generate-sitemap-xml.d.cts +5 -3
- package/dist/utils/generate-sitemap-xml.d.ts +5 -3
- package/dist/utils/generate-sitemap-xml.js.map +1 -1
- package/dist/utils/sdk-config.cjs +6 -2
- package/dist/utils/sdk-config.cjs.map +1 -1
- package/dist/utils/sdk-config.d.cts +4 -0
- package/dist/utils/sdk-config.d.ts +4 -0
- package/dist/utils/sdk-config.js +6 -2
- package/dist/utils/sdk-config.js.map +1 -1
- package/package.json +9 -23
- package/dist/components/author-page/_helpers/json-ld.cjs +0 -44
- package/dist/components/author-page/_helpers/json-ld.cjs.map +0 -1
- package/dist/components/author-page/_helpers/json-ld.d.cts +0 -8
- package/dist/components/author-page/_helpers/json-ld.d.ts +0 -8
- package/dist/components/author-page/_helpers/json-ld.js +0 -20
- package/dist/components/author-page/_helpers/json-ld.js.map +0 -1
- package/dist/components/author-page/index.cjs +0 -104
- package/dist/components/author-page/index.cjs.map +0 -1
- package/dist/components/author-page/index.d.cts +0 -10
- package/dist/components/author-page/index.d.ts +0 -10
- package/dist/components/author-page/index.js +0 -70
- package/dist/components/author-page/index.js.map +0 -1
- package/dist/components/authors-page/_helpers/json-ld.cjs +0 -53
- package/dist/components/authors-page/_helpers/json-ld.cjs.map +0 -1
- package/dist/components/authors-page/_helpers/json-ld.d.cts +0 -8
- package/dist/components/authors-page/_helpers/json-ld.d.ts +0 -8
- package/dist/components/authors-page/_helpers/json-ld.js +0 -29
- package/dist/components/authors-page/_helpers/json-ld.js.map +0 -1
- package/dist/components/authors-page/index.cjs +0 -121
- package/dist/components/authors-page/index.cjs.map +0 -1
- package/dist/components/authors-page/index.d.cts +0 -10
- package/dist/components/authors-page/index.d.ts +0 -10
- package/dist/components/authors-page/index.js +0 -87
- package/dist/components/authors-page/index.js.map +0 -1
- package/dist/components/blog-post/_components/content.cjs +0 -157
- package/dist/components/blog-post/_components/content.cjs.map +0 -1
- package/dist/components/blog-post/_components/content.d.cts +0 -10
- package/dist/components/blog-post/_components/content.d.ts +0 -10
- package/dist/components/blog-post/_components/content.js +0 -123
- package/dist/components/blog-post/_components/content.js.map +0 -1
- package/dist/components/blog-post/_components/faq.cjs +0 -39
- package/dist/components/blog-post/_components/faq.cjs.map +0 -1
- package/dist/components/blog-post/_components/faq.d.cts +0 -9
- package/dist/components/blog-post/_components/faq.d.ts +0 -9
- package/dist/components/blog-post/_components/faq.js +0 -15
- package/dist/components/blog-post/_components/faq.js.map +0 -1
- package/dist/components/blog-post/_components/share.cjs +0 -100
- package/dist/components/blog-post/_components/share.cjs.map +0 -1
- package/dist/components/blog-post/_components/share.d.cts +0 -9
- package/dist/components/blog-post/_components/share.d.ts +0 -9
- package/dist/components/blog-post/_components/share.js +0 -66
- package/dist/components/blog-post/_components/share.js.map +0 -1
- package/dist/components/blog-post/_components/table-of-contents.cjs +0 -111
- package/dist/components/blog-post/_components/table-of-contents.cjs.map +0 -1
- package/dist/components/blog-post/_components/table-of-contents.d.cts +0 -14
- package/dist/components/blog-post/_components/table-of-contents.d.ts +0 -14
- package/dist/components/blog-post/_components/table-of-contents.js +0 -77
- package/dist/components/blog-post/_components/table-of-contents.js.map +0 -1
- package/dist/components/blog-post/_helpers/calc-reading-time.cjs +0 -2
- package/dist/components/blog-post/_helpers/calc-reading-time.cjs.map +0 -1
- package/dist/components/blog-post/_helpers/calc-reading-time.d.cts +0 -2
- package/dist/components/blog-post/_helpers/calc-reading-time.d.ts +0 -2
- package/dist/components/blog-post/_helpers/calc-reading-time.js +0 -1
- package/dist/components/blog-post/_helpers/calc-reading-time.js.map +0 -1
- package/dist/components/blog-post/_helpers/extract-headings.cjs +0 -45
- package/dist/components/blog-post/_helpers/extract-headings.cjs.map +0 -1
- package/dist/components/blog-post/_helpers/extract-headings.d.cts +0 -9
- package/dist/components/blog-post/_helpers/extract-headings.d.ts +0 -9
- package/dist/components/blog-post/_helpers/extract-headings.js +0 -21
- package/dist/components/blog-post/_helpers/extract-headings.js.map +0 -1
- package/dist/components/blog-post/_helpers/json-ld.cjs +0 -162
- package/dist/components/blog-post/_helpers/json-ld.cjs.map +0 -1
- package/dist/components/blog-post/_helpers/json-ld.d.cts +0 -15
- package/dist/components/blog-post/_helpers/json-ld.d.ts +0 -15
- package/dist/components/blog-post/_helpers/json-ld.js +0 -135
- package/dist/components/blog-post/_helpers/json-ld.js.map +0 -1
- package/dist/components/blog-post/_helpers/reading-time.cjs +0 -50
- package/dist/components/blog-post/_helpers/reading-time.cjs.map +0 -1
- package/dist/components/blog-post/_helpers/reading-time.d.cts +0 -6
- package/dist/components/blog-post/_helpers/reading-time.d.ts +0 -6
- package/dist/components/blog-post/_helpers/reading-time.js +0 -25
- package/dist/components/blog-post/_helpers/reading-time.js.map +0 -1
- package/dist/components/blog-post/_types/blog-post.cjs +0 -17
- package/dist/components/blog-post/_types/blog-post.cjs.map +0 -1
- package/dist/components/blog-post/_types/blog-post.d.cts +0 -7
- package/dist/components/blog-post/_types/blog-post.d.ts +0 -7
- package/dist/components/blog-post/_types/blog-post.js +0 -1
- package/dist/components/blog-post/_types/blog-post.js.map +0 -1
- package/dist/components/blog-post/_types/class-names.cjs +0 -17
- package/dist/components/blog-post/_types/class-names.cjs.map +0 -1
- package/dist/components/blog-post/_types/class-names.d.cts +0 -12
- package/dist/components/blog-post/_types/class-names.d.ts +0 -12
- package/dist/components/blog-post/_types/class-names.js +0 -1
- package/dist/components/blog-post/_types/class-names.js.map +0 -1
- package/dist/components/blog-post/index.cjs +0 -134
- package/dist/components/blog-post/index.cjs.map +0 -1
- package/dist/components/blog-post/index.d.cts +0 -15
- package/dist/components/blog-post/index.d.ts +0 -15
- package/dist/components/blog-post/index.js +0 -100
- package/dist/components/blog-post/index.js.map +0 -1
- package/dist/components/bread-crumbs.cjs +0 -60
- package/dist/components/bread-crumbs.cjs.map +0 -1
- package/dist/components/bread-crumbs.d.cts +0 -10
- package/dist/components/bread-crumbs.d.ts +0 -10
- package/dist/components/bread-crumbs.js +0 -26
- package/dist/components/bread-crumbs.js.map +0 -1
- package/dist/components/folder-page/_helpers/json-ld.cjs +0 -43
- package/dist/components/folder-page/_helpers/json-ld.cjs.map +0 -1
- package/dist/components/folder-page/_helpers/json-ld.d.cts +0 -8
- package/dist/components/folder-page/_helpers/json-ld.d.ts +0 -8
- package/dist/components/folder-page/_helpers/json-ld.js +0 -19
- package/dist/components/folder-page/_helpers/json-ld.js.map +0 -1
- package/dist/components/folder-page/index.cjs +0 -84
- package/dist/components/folder-page/index.cjs.map +0 -1
- package/dist/components/folder-page/index.d.cts +0 -10
- package/dist/components/folder-page/index.d.ts +0 -10
- package/dist/components/folder-page/index.js +0 -60
- package/dist/components/folder-page/index.js.map +0 -1
- package/dist/components/home-page/_helpers/json-ld.cjs +0 -43
- package/dist/components/home-page/_helpers/json-ld.cjs.map +0 -1
- package/dist/components/home-page/_helpers/json-ld.d.cts +0 -3
- package/dist/components/home-page/_helpers/json-ld.d.ts +0 -3
- package/dist/components/home-page/_helpers/json-ld.js +0 -19
- package/dist/components/home-page/_helpers/json-ld.js.map +0 -1
- package/dist/components/home-page/folders.cjs +0 -108
- package/dist/components/home-page/folders.cjs.map +0 -1
- package/dist/components/home-page/folders.d.cts +0 -11
- package/dist/components/home-page/folders.d.ts +0 -11
- package/dist/components/home-page/folders.js +0 -73
- package/dist/components/home-page/folders.js.map +0 -1
- package/dist/components/home-page/index.cjs +0 -50
- package/dist/components/home-page/index.cjs.map +0 -1
- package/dist/components/home-page/index.d.cts +0 -14
- package/dist/components/home-page/index.d.ts +0 -14
- package/dist/components/home-page/index.js +0 -26
- package/dist/components/home-page/index.js.map +0 -1
- package/dist/components/home-page/pagination.cjs +0 -97
- package/dist/components/home-page/pagination.cjs.map +0 -1
- package/dist/components/home-page/pagination.d.cts +0 -9
- package/dist/components/home-page/pagination.d.ts +0 -9
- package/dist/components/home-page/pagination.js +0 -63
- package/dist/components/home-page/pagination.js.map +0 -1
- package/dist/components/home-page/top-posts.cjs +0 -35
- package/dist/components/home-page/top-posts.cjs.map +0 -1
- package/dist/components/home-page/top-posts.d.cts +0 -10
- package/dist/components/home-page/top-posts.d.ts +0 -10
- package/dist/components/home-page/top-posts.js +0 -11
- package/dist/components/home-page/top-posts.js.map +0 -1
- package/dist/components/json-ld.cjs +0 -92
- package/dist/components/json-ld.cjs.map +0 -1
- package/dist/components/json-ld.d.cts +0 -13
- package/dist/components/json-ld.d.ts +0 -13
- package/dist/components/json-ld.js +0 -57
- package/dist/components/json-ld.js.map +0 -1
- package/dist/components/opinly-blog.cjs +0 -59
- package/dist/components/opinly-blog.cjs.map +0 -1
- package/dist/components/opinly-blog.d.cts +0 -16
- package/dist/components/opinly-blog.d.ts +0 -16
- package/dist/components/opinly-blog.js +0 -35
- package/dist/components/opinly-blog.js.map +0 -1
- package/dist/components/post-preview.cjs +0 -114
- package/dist/components/post-preview.cjs.map +0 -1
- package/dist/components/post-preview.d.cts +0 -10
- package/dist/components/post-preview.d.ts +0 -10
- package/dist/components/post-preview.js +0 -79
- package/dist/components/post-preview.js.map +0 -1
- package/dist/pages/index.cjs +0 -23
- package/dist/pages/index.cjs.map +0 -1
- package/dist/pages/index.d.cts +0 -3
- package/dist/pages/index.d.ts +0 -3
- package/dist/pages/index.js +0 -2
- package/dist/pages/index.js.map +0 -1
- package/dist/pages/opinly-blog-pages.cjs +0 -127
- package/dist/pages/opinly-blog-pages.cjs.map +0 -1
- package/dist/pages/opinly-blog-pages.d.cts +0 -9
- package/dist/pages/opinly-blog-pages.d.ts +0 -9
- package/dist/pages/opinly-blog-pages.js +0 -103
- package/dist/pages/opinly-blog-pages.js.map +0 -1
- package/dist/utils/json-ld.cjs +0 -2
- package/dist/utils/json-ld.cjs.map +0 -1
- package/dist/utils/json-ld.d.cts +0 -2
- package/dist/utils/json-ld.d.ts +0 -2
- package/dist/utils/json-ld.js +0 -1
- package/dist/utils/json-ld.js.map +0 -1
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { cn } from "../../../utils/merge";
|
|
3
|
-
import Image from "next/image";
|
|
4
|
-
import { opinlyConfig } from "../../../utils/sdk-config";
|
|
5
|
-
import { extractHeadings } from "../_helpers/extract-headings";
|
|
6
|
-
import { Share } from "./share";
|
|
7
|
-
import Link from "next/link";
|
|
8
|
-
const headingColorMap = {
|
|
9
|
-
2: "text-op-heading",
|
|
10
|
-
3: "text-op-body"
|
|
11
|
-
};
|
|
12
|
-
const TableOfContents = ({
|
|
13
|
-
content,
|
|
14
|
-
author,
|
|
15
|
-
post,
|
|
16
|
-
cta
|
|
17
|
-
}) => {
|
|
18
|
-
return /* @__PURE__ */ jsxs("div", { className: cn("w-full flex flex-col space-y-4"), children: [
|
|
19
|
-
author && /* @__PURE__ */ jsxs("div", { className: "w-full flex flex-col space-y-2 mb-6 border p-4 rounded-md text-sm", children: [
|
|
20
|
-
author.fileKey && /* @__PURE__ */ jsx(
|
|
21
|
-
Image,
|
|
22
|
-
{
|
|
23
|
-
unoptimized: opinlyConfig.unoptimizedImages,
|
|
24
|
-
src: `${opinlyConfig.imagesPrefix}/${author.fileKey}`,
|
|
25
|
-
alt: author.name,
|
|
26
|
-
width: 48,
|
|
27
|
-
height: 48,
|
|
28
|
-
className: "rounded-full"
|
|
29
|
-
}
|
|
30
|
-
),
|
|
31
|
-
/* @__PURE__ */ jsxs("div", { className: "w-full flex flex-col space-y-2", children: [
|
|
32
|
-
/* @__PURE__ */ jsx(
|
|
33
|
-
Link,
|
|
34
|
-
{
|
|
35
|
-
href: `${opinlyConfig.blogPrefix}/authors/${author.slug}`,
|
|
36
|
-
className: "text-lg text-op-heading font-bold",
|
|
37
|
-
children: author.name
|
|
38
|
-
}
|
|
39
|
-
),
|
|
40
|
-
/* @__PURE__ */ jsxs("div", { className: "w-48 ", children: [
|
|
41
|
-
/* @__PURE__ */ jsx("span", { className: "text-op-muted text-sm w-56 break-words block md:hidden", children: author.bio && author.bio.length > 40 ? author.bio.slice(0, 40) + "..." : author.bio }),
|
|
42
|
-
/* @__PURE__ */ jsx("p", { className: "text-op-muted text-sm w-48 hidden md:block", children: author.bio })
|
|
43
|
-
] })
|
|
44
|
-
] })
|
|
45
|
-
] }),
|
|
46
|
-
/* @__PURE__ */ jsx(Share, { post }),
|
|
47
|
-
/* @__PURE__ */ jsxs("div", { className: "border-l-4 border-op-accent pl-4 mb-4", children: [
|
|
48
|
-
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold mb-2", children: "Table of Contents" }),
|
|
49
|
-
/* @__PURE__ */ jsx("ul", { className: "text-sm space-y-1", children: (extractHeadings(content) || []).map((heading) => /* @__PURE__ */ jsx(
|
|
50
|
-
"li",
|
|
51
|
-
{
|
|
52
|
-
className: cn(heading.level === 3 && "ml-2"),
|
|
53
|
-
children: /* @__PURE__ */ jsxs(
|
|
54
|
-
"a",
|
|
55
|
-
{
|
|
56
|
-
href: `#${heading.slug}`,
|
|
57
|
-
className: cn(
|
|
58
|
-
headingColorMap[heading.level]
|
|
59
|
-
),
|
|
60
|
-
children: [
|
|
61
|
-
heading.level === 3 && "-",
|
|
62
|
-
" ",
|
|
63
|
-
heading.text
|
|
64
|
-
]
|
|
65
|
-
}
|
|
66
|
-
)
|
|
67
|
-
},
|
|
68
|
-
heading.slug
|
|
69
|
-
)) })
|
|
70
|
-
] }),
|
|
71
|
-
cta
|
|
72
|
-
] });
|
|
73
|
-
};
|
|
74
|
-
export {
|
|
75
|
-
TableOfContents
|
|
76
|
-
};
|
|
77
|
-
//# sourceMappingURL=table-of-contents.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/blog-post/_components/table-of-contents.tsx"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { cn } from \"../../../utils/merge\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { extractHeadings } from \"../_helpers/extract-headings\";\nimport { Share } from \"./share\";\nimport Link from \"next/link\";\n\ntype TableOfContentsProps = {\n content: JSONContent;\n author: BlogPostRes[\"author\"] | null;\n post: BlogPostRes;\n cta?: React.ReactNode;\n};\n\nconst headingColorMap = {\n 2: \"text-op-heading\",\n 3: \"text-op-body\",\n};\n\nexport const TableOfContents = ({\n content,\n author,\n post,\n cta,\n}: TableOfContentsProps) => {\n return (\n <div className={cn(\"w-full flex flex-col space-y-4\")}>\n {author && (\n <div className=\"w-full flex flex-col space-y-2 mb-6 border p-4 rounded-md text-sm\">\n {author.fileKey && (\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${author.fileKey}`}\n alt={author.name}\n width={48}\n height={48}\n className=\"rounded-full\"\n />\n )}\n <div className=\"w-full flex flex-col space-y-2\">\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-lg text-op-heading font-bold\"\n >\n {author.name}\n </Link>\n <div className=\"w-48 \">\n {/* Mobile: show truncated bio */}\n <span className=\"text-op-muted text-sm w-56 break-words block md:hidden\">\n {author.bio && author.bio.length > 40\n ? author.bio.slice(0, 40) + \"...\"\n : author.bio}\n </span>\n {/* Desktop: show full bio */}\n <p className=\"text-op-muted text-sm w-48 hidden md:block\">\n {author.bio}\n </p>\n </div>\n </div>\n </div>\n )}\n <Share post={post} />\n <div className=\"border-l-4 border-op-accent pl-4 mb-4\">\n <h2 className=\"text-lg font-semibold mb-2\">Table of Contents</h2>\n <ul className=\"text-sm space-y-1\">\n {(extractHeadings(content) || []).map((heading) => (\n <li\n key={heading.slug}\n className={cn(heading.level === 3 && \"ml-2\")}\n >\n <a\n href={`#${heading.slug}`}\n className={cn(\n headingColorMap[heading.level as keyof typeof headingColorMap]\n )}\n >\n {heading.level === 3 && \"-\"} {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </div>\n {cta}\n </div>\n );\n};\n"],"mappings":"AAgCY,cAgBA,YAhBA;AA9BZ,SAAS,UAAU;AACnB,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,aAAa;AACtB,OAAO,UAAU;AASjB,MAAM,kBAAkB;AAAA,EACtB,GAAG;AAAA,EACH,GAAG;AACL;AAEO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,SACE,qBAAC,SAAI,WAAW,GAAG,gCAAgC,GAChD;AAAA,cACC,qBAAC,SAAI,WAAU,qEACZ;AAAA,aAAO,WACN;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,aAAa;AAAA,UAC1B,KAAK,GAAG,aAAa,YAAY,IAAI,OAAO,OAAO;AAAA,UACnD,KAAK,OAAO;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,qBAAC,SAAI,WAAU,kCACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,aAAa,UAAU,YAAY,OAAO,IAAI;AAAA,YACvD,WAAU;AAAA,YAET,iBAAO;AAAA;AAAA,QACV;AAAA,QACA,qBAAC,SAAI,WAAU,SAEb;AAAA,8BAAC,UAAK,WAAU,0DACb,iBAAO,OAAO,OAAO,IAAI,SAAS,KAC/B,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,QAC1B,OAAO,KACb;AAAA,UAEA,oBAAC,OAAE,WAAU,+CACV,iBAAO,KACV;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,IAEF,oBAAC,SAAM,MAAY;AAAA,IACnB,qBAAC,SAAI,WAAU,yCACb;AAAA,0BAAC,QAAG,WAAU,8BAA6B,+BAAiB;AAAA,MAC5D,oBAAC,QAAG,WAAU,qBACV,2BAAgB,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,YACrC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,GAAG,QAAQ,UAAU,KAAK,MAAM;AAAA,UAE3C;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,IAAI,QAAQ,IAAI;AAAA,cACtB,WAAW;AAAA,gBACT,gBAAgB,QAAQ,KAAqC;AAAA,cAC/D;AAAA,cAEC;AAAA,wBAAQ,UAAU,KAAK;AAAA,gBAAI;AAAA,gBAAE,QAAQ;AAAA;AAAA;AAAA,UACxC;AAAA;AAAA,QAVK,QAAQ;AAAA,MAWf,CACD,GACH;AAAA,OACF;AAAA,IACC;AAAA,KACH;AAEJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=calc-reading-time.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var extract_headings_exports = {};
|
|
20
|
-
__export(extract_headings_exports, {
|
|
21
|
-
extractHeadings: () => extractHeadings
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(extract_headings_exports);
|
|
24
|
-
function extractHeadings(content) {
|
|
25
|
-
const headings = [];
|
|
26
|
-
if (!content?.content) return headings;
|
|
27
|
-
const walk = (nodes) => {
|
|
28
|
-
for (const node of nodes) {
|
|
29
|
-
if (node.type === "heading" && node.content?.[0]?.text) {
|
|
30
|
-
const text = node.content[0].text;
|
|
31
|
-
const slug = text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
32
|
-
const level = node.attrs?.level;
|
|
33
|
-
headings.push({ text, slug, level });
|
|
34
|
-
}
|
|
35
|
-
if (node.content) walk(node.content);
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
walk(content.content);
|
|
39
|
-
return headings;
|
|
40
|
-
}
|
|
41
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
42
|
-
0 && (module.exports = {
|
|
43
|
-
extractHeadings
|
|
44
|
-
});
|
|
45
|
-
//# sourceMappingURL=extract-headings.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/blog-post/_helpers/extract-headings.ts"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\n\nexport function extractHeadings(\n content: JSONContent\n): { text: string; slug: string; level: number }[] {\n const headings: { text: string; slug: string; level: number }[] = [];\n if (!content?.content) return headings;\n\n const walk = (nodes: JSONContent[]) => {\n for (const node of nodes) {\n if (node.type === \"heading\" && node.content?.[0]?.text) {\n const text = node.content[0].text;\n const slug = text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\n const level = node.attrs?.level;\n headings.push({ text, slug, level });\n }\n if (node.content) walk(node.content);\n }\n };\n\n walk(content.content);\n return headings;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,gBACd,SACiD;AACjD,QAAM,WAA4D,CAAC;AACnE,MAAI,CAAC,SAAS,QAAS,QAAO;AAE9B,QAAM,OAAO,CAAC,UAAyB;AACrC,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,aAAa,KAAK,UAAU,CAAC,GAAG,MAAM;AACtD,cAAM,OAAO,KAAK,QAAQ,CAAC,EAAE;AAC7B,cAAM,OAAO,KACV,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAEzB,cAAM,QAAQ,KAAK,OAAO;AAC1B,iBAAS,KAAK,EAAE,MAAM,MAAM,MAAM,CAAC;AAAA,MACrC;AACA,UAAI,KAAK,QAAS,MAAK,KAAK,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,OAAK,QAAQ,OAAO;AACpB,SAAO;AACT;","names":[]}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
function extractHeadings(content) {
|
|
2
|
-
const headings = [];
|
|
3
|
-
if (!content?.content) return headings;
|
|
4
|
-
const walk = (nodes) => {
|
|
5
|
-
for (const node of nodes) {
|
|
6
|
-
if (node.type === "heading" && node.content?.[0]?.text) {
|
|
7
|
-
const text = node.content[0].text;
|
|
8
|
-
const slug = text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
9
|
-
const level = node.attrs?.level;
|
|
10
|
-
headings.push({ text, slug, level });
|
|
11
|
-
}
|
|
12
|
-
if (node.content) walk(node.content);
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
walk(content.content);
|
|
16
|
-
return headings;
|
|
17
|
-
}
|
|
18
|
-
export {
|
|
19
|
-
extractHeadings
|
|
20
|
-
};
|
|
21
|
-
//# sourceMappingURL=extract-headings.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/blog-post/_helpers/extract-headings.ts"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\n\nexport function extractHeadings(\n content: JSONContent\n): { text: string; slug: string; level: number }[] {\n const headings: { text: string; slug: string; level: number }[] = [];\n if (!content?.content) return headings;\n\n const walk = (nodes: JSONContent[]) => {\n for (const node of nodes) {\n if (node.type === \"heading\" && node.content?.[0]?.text) {\n const text = node.content[0].text;\n const slug = text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\n const level = node.attrs?.level;\n headings.push({ text, slug, level });\n }\n if (node.content) walk(node.content);\n }\n };\n\n walk(content.content);\n return headings;\n}\n"],"mappings":"AAEO,SAAS,gBACd,SACiD;AACjD,QAAM,WAA4D,CAAC;AACnE,MAAI,CAAC,SAAS,QAAS,QAAO;AAE9B,QAAM,OAAO,CAAC,UAAyB;AACrC,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,aAAa,KAAK,UAAU,CAAC,GAAG,MAAM;AACtD,cAAM,OAAO,KAAK,QAAQ,CAAC,EAAE;AAC7B,cAAM,OAAO,KACV,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAEzB,cAAM,QAAQ,KAAK,OAAO;AAC1B,iBAAS,KAAK,EAAE,MAAM,MAAM,MAAM,CAAC;AAAA,MACrC;AACA,UAAI,KAAK,QAAS,MAAK,KAAK,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,OAAK,QAAQ,OAAO;AACpB,SAAO;AACT;","names":[]}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var json_ld_exports = {};
|
|
20
|
-
__export(json_ld_exports, {
|
|
21
|
-
genBlogPostingJSONLD: () => genBlogPostingJSONLD,
|
|
22
|
-
genBreadcrumbJSONLD: () => genBreadcrumbJSONLD,
|
|
23
|
-
genFaqJSONLD: () => genFaqJSONLD,
|
|
24
|
-
generateArticleBodyHtml: () => generateArticleBodyHtml
|
|
25
|
-
});
|
|
26
|
-
module.exports = __toCommonJS(json_ld_exports);
|
|
27
|
-
var import_sdk_config = require("../../../utils/sdk-config");
|
|
28
|
-
function generateArticleBodyHtml(content) {
|
|
29
|
-
if (!content?.content) return "";
|
|
30
|
-
let htmlString = "";
|
|
31
|
-
content.content.forEach((node) => {
|
|
32
|
-
switch (node.type) {
|
|
33
|
-
case "paragraph":
|
|
34
|
-
htmlString += `<p>${generateChildrenHtml(node.content)}</p>`;
|
|
35
|
-
break;
|
|
36
|
-
case "heading":
|
|
37
|
-
const headingLevel = node.attrs?.level || 1;
|
|
38
|
-
htmlString += `<h${headingLevel}>${generateChildrenHtml(
|
|
39
|
-
node.content
|
|
40
|
-
)}</h${headingLevel}>`;
|
|
41
|
-
break;
|
|
42
|
-
case "bulletList":
|
|
43
|
-
htmlString += `<ul>${generateChildrenHtml(node.content)}</ul>`;
|
|
44
|
-
break;
|
|
45
|
-
case "orderedList":
|
|
46
|
-
htmlString += `<ol>${generateChildrenHtml(node.content)}</ol>`;
|
|
47
|
-
break;
|
|
48
|
-
case "listItem":
|
|
49
|
-
htmlString += `<li>${generateChildrenHtml(node.content)}</li>`;
|
|
50
|
-
break;
|
|
51
|
-
// Add other node types if they contain text content relevant for articleBody
|
|
52
|
-
// For images, you might just skip them or include an <img> tag if semantic
|
|
53
|
-
// For example:
|
|
54
|
-
// case "image":
|
|
55
|
-
// if (node.attrs?.src) {
|
|
56
|
-
// htmlString += `<img src="${replaceImageHostname(node.attrs.src, opinlyConfig.imagesPrefix)}" alt="${node.attrs?.alt || ''}" />`;
|
|
57
|
-
// }
|
|
58
|
-
// break;
|
|
59
|
-
default:
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
return htmlString;
|
|
64
|
-
}
|
|
65
|
-
function generateChildrenHtml(nodes) {
|
|
66
|
-
if (!nodes) return "";
|
|
67
|
-
let childrenHtml = "";
|
|
68
|
-
nodes.forEach((child) => {
|
|
69
|
-
if (child.type === "text") {
|
|
70
|
-
let text = child.text || "";
|
|
71
|
-
if (child.marks) {
|
|
72
|
-
child.marks.forEach((mark) => {
|
|
73
|
-
if (mark.type === "bold") text = `<strong>${text}</strong>`;
|
|
74
|
-
if (mark.type === "italic") text = `<em>${text}</em>`;
|
|
75
|
-
if (mark.type === "link" && mark.attrs?.href) {
|
|
76
|
-
text = `<a href="${mark.attrs.href}">${text}</a>`;
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
childrenHtml += text;
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
return childrenHtml;
|
|
84
|
-
}
|
|
85
|
-
const genFaqJSONLD = (faqs) => {
|
|
86
|
-
return {
|
|
87
|
-
"@context": "https://schema.org",
|
|
88
|
-
"@type": "FAQPage",
|
|
89
|
-
mainEntity: faqs.map((faq) => ({
|
|
90
|
-
"@type": "Question",
|
|
91
|
-
name: faq.question,
|
|
92
|
-
acceptedAnswer: {
|
|
93
|
-
"@type": "Answer",
|
|
94
|
-
text: faq.answer
|
|
95
|
-
}
|
|
96
|
-
}))
|
|
97
|
-
};
|
|
98
|
-
};
|
|
99
|
-
const genBlogPostingJSONLD = (post) => {
|
|
100
|
-
return {
|
|
101
|
-
"@context": "https://schema.org",
|
|
102
|
-
"@type": "BlogPosting",
|
|
103
|
-
headline: post.title,
|
|
104
|
-
description: post.description || void 0,
|
|
105
|
-
url: `${import_sdk_config.opinlyConfig.blogUrl}/${post.folder ? `${post.folder.slug + "/"}${post.slug}` : post.slug}`,
|
|
106
|
-
datePublished: post.firstPublishedAt || void 0,
|
|
107
|
-
dateModified: post.modifiedAt || void 0,
|
|
108
|
-
image: post.titleFile?.fileKey ? {
|
|
109
|
-
"@type": "ImageObject",
|
|
110
|
-
url: `${import_sdk_config.opinlyConfig.imagesUrl}/${post.titleFile.fileKey}`
|
|
111
|
-
} : void 0,
|
|
112
|
-
author: post.author ? {
|
|
113
|
-
"@type": "Person",
|
|
114
|
-
name: post.author.name,
|
|
115
|
-
url: `${import_sdk_config.opinlyConfig.blogUrl}/author/${post.author.slug}`,
|
|
116
|
-
description: post.author.bio || void 0
|
|
117
|
-
} : void 0,
|
|
118
|
-
isAccessibleForFree: true,
|
|
119
|
-
articleBody: generateArticleBodyHtml(post.content)
|
|
120
|
-
};
|
|
121
|
-
};
|
|
122
|
-
const genBreadcrumbJSONLD = (post) => {
|
|
123
|
-
const itemListElement = [
|
|
124
|
-
{
|
|
125
|
-
position: 1,
|
|
126
|
-
name: import_sdk_config.opinlyConfig.siteName,
|
|
127
|
-
item: import_sdk_config.opinlyConfig.siteUrl
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
position: 2,
|
|
131
|
-
name: post.folder?.name || "Blog",
|
|
132
|
-
item: `${import_sdk_config.opinlyConfig.blogUrl}/blog`
|
|
133
|
-
}
|
|
134
|
-
];
|
|
135
|
-
if (post.folder) {
|
|
136
|
-
itemListElement.push({
|
|
137
|
-
position: 3,
|
|
138
|
-
name: post.folder.name,
|
|
139
|
-
item: `${import_sdk_config.opinlyConfig.blogUrl}/blog/${post.folder.slug}`
|
|
140
|
-
});
|
|
141
|
-
itemListElement.push({
|
|
142
|
-
position: 4,
|
|
143
|
-
name: post.title,
|
|
144
|
-
item: `${import_sdk_config.opinlyConfig.blogUrl}/blog/${post.folder.slug}/${post.slug}`
|
|
145
|
-
});
|
|
146
|
-
} else {
|
|
147
|
-
itemListElement.push({
|
|
148
|
-
position: 3,
|
|
149
|
-
name: post.title,
|
|
150
|
-
item: `${import_sdk_config.opinlyConfig.blogUrl}/blog/${post.slug}`
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
return itemListElement;
|
|
154
|
-
};
|
|
155
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
156
|
-
0 && (module.exports = {
|
|
157
|
-
genBlogPostingJSONLD,
|
|
158
|
-
genBreadcrumbJSONLD,
|
|
159
|
-
genFaqJSONLD,
|
|
160
|
-
generateArticleBodyHtml
|
|
161
|
-
});
|
|
162
|
-
//# sourceMappingURL=json-ld.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/blog-post/_helpers/json-ld.ts"],"sourcesContent":["import {\n BlogPosting,\n BreadcrumbList,\n FAQPage,\n WithContext,\n ListItem,\n} from \"schema-dts\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { JSONContent } from \"@tiptap/core\";\n\n// Add this function somewhere in your BlogPost component file\nexport function generateArticleBodyHtml(content: JSONContent): string {\n if (!content?.content) return \"\";\n\n let htmlString = \"\";\n\n content.content.forEach((node) => {\n switch (node.type) {\n case \"paragraph\":\n htmlString += `<p>${generateChildrenHtml(node.content)}</p>`;\n break;\n case \"heading\":\n const headingLevel = node.attrs?.level || 1;\n htmlString += `<h${headingLevel}>${generateChildrenHtml(\n node.content\n )}</h${headingLevel}>`;\n break;\n case \"bulletList\":\n htmlString += `<ul>${generateChildrenHtml(node.content)}</ul>`;\n break;\n case \"orderedList\":\n htmlString += `<ol>${generateChildrenHtml(node.content)}</ol>`;\n break;\n case \"listItem\":\n htmlString += `<li>${generateChildrenHtml(node.content)}</li>`;\n break;\n // Add other node types if they contain text content relevant for articleBody\n // For images, you might just skip them or include an <img> tag if semantic\n // For example:\n // case \"image\":\n // if (node.attrs?.src) {\n // htmlString += `<img src=\"${replaceImageHostname(node.attrs.src, opinlyConfig.imagesPrefix)}\" alt=\"${node.attrs?.alt || ''}\" />`;\n // }\n // break;\n default:\n // Handle other block types or just ignore them for articleBody\n break;\n }\n });\n\n return htmlString;\n}\n\nfunction generateChildrenHtml(\n nodes: JSONContent[\"content\"] | undefined\n): string {\n if (!nodes) return \"\";\n\n let childrenHtml = \"\";\n nodes.forEach((child) => {\n if (child.type === \"text\") {\n let text = child.text || \"\";\n if (child.marks) {\n child.marks.forEach((mark) => {\n if (mark.type === \"bold\") text = `<strong>${text}</strong>`;\n if (mark.type === \"italic\") text = `<em>${text}</em>`;\n if (mark.type === \"link\" && mark.attrs?.href) {\n text = `<a href=\"${mark.attrs.href}\">${text}</a>`;\n }\n });\n }\n childrenHtml += text;\n }\n // If you have nested content within child nodes, you might need a recursive call here\n // For example, if a list item can contain paragraphs\n // if (child.content) {\n // childrenHtml += generateChildrenHtml(child.content);\n // }\n });\n return childrenHtml;\n}\n\nexport const genFaqJSONLD = (\n faqs: NonNullable<BlogPostRes[\"faqs\"]>\n): WithContext<FAQPage> => {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"FAQPage\",\n mainEntity: faqs.map((faq) => ({\n \"@type\": \"Question\",\n name: faq.question,\n acceptedAnswer: {\n \"@type\": \"Answer\",\n text: faq.answer,\n },\n })),\n };\n};\n\nexport const genBlogPostingJSONLD = (\n post: BlogPostRes\n): WithContext<BlogPosting> => {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BlogPosting\",\n headline: post.title,\n description: post.description || undefined,\n url: `${opinlyConfig.blogUrl}/${\n post.folder ? `${post.folder.slug + \"/\"}${post.slug}` : post.slug\n }`,\n datePublished: post.firstPublishedAt || undefined,\n dateModified: post.modifiedAt || undefined,\n image: post.titleFile?.fileKey\n ? {\n \"@type\": \"ImageObject\",\n url: `${opinlyConfig.imagesUrl}/${post.titleFile.fileKey}`,\n }\n : undefined,\n author: post.author\n ? {\n \"@type\": \"Person\",\n name: post.author.name,\n url: `${opinlyConfig.blogUrl}/author/${post.author.slug}`,\n description: post.author.bio || undefined,\n }\n : undefined,\n isAccessibleForFree: true,\n articleBody: generateArticleBodyHtml(post.content as JSONContent),\n };\n};\n\nexport const genBreadcrumbJSONLD = (post: BlogPostRes) => {\n const itemListElement = [\n {\n position: 1,\n name: opinlyConfig.siteName,\n item: opinlyConfig.siteUrl,\n },\n {\n position: 2,\n name: post.folder?.name || \"Blog\",\n item: `${opinlyConfig.blogUrl}/blog`,\n },\n ];\n\n if (post.folder) {\n itemListElement.push({\n position: 3,\n name: post.folder.name,\n item: `${opinlyConfig.blogUrl}/blog/${post.folder.slug}`,\n });\n\n itemListElement.push({\n position: 4,\n name: post.title,\n item: `${opinlyConfig.blogUrl}/blog/${post.folder.slug}/${post.slug}`,\n });\n } else {\n itemListElement.push({\n position: 3,\n name: post.title,\n item: `${opinlyConfig.blogUrl}/blog/${post.slug}`,\n });\n }\n\n return itemListElement;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { WithContext, FAQPage, BlogPosting } from 'schema-dts';
|
|
2
|
-
import { BlogPostRes } from '../_types/blog-post.cjs';
|
|
3
|
-
import { JSONContent } from '@tiptap/core';
|
|
4
|
-
import '@opinly/backend';
|
|
5
|
-
|
|
6
|
-
declare function generateArticleBodyHtml(content: JSONContent): string;
|
|
7
|
-
declare const genFaqJSONLD: (faqs: NonNullable<BlogPostRes["faqs"]>) => WithContext<FAQPage>;
|
|
8
|
-
declare const genBlogPostingJSONLD: (post: BlogPostRes) => WithContext<BlogPosting>;
|
|
9
|
-
declare const genBreadcrumbJSONLD: (post: BlogPostRes) => {
|
|
10
|
-
position: number;
|
|
11
|
-
name: string;
|
|
12
|
-
item: string;
|
|
13
|
-
}[];
|
|
14
|
-
|
|
15
|
-
export { genBlogPostingJSONLD, genBreadcrumbJSONLD, genFaqJSONLD, generateArticleBodyHtml };
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { WithContext, FAQPage, BlogPosting } from 'schema-dts';
|
|
2
|
-
import { BlogPostRes } from '../_types/blog-post.js';
|
|
3
|
-
import { JSONContent } from '@tiptap/core';
|
|
4
|
-
import '@opinly/backend';
|
|
5
|
-
|
|
6
|
-
declare function generateArticleBodyHtml(content: JSONContent): string;
|
|
7
|
-
declare const genFaqJSONLD: (faqs: NonNullable<BlogPostRes["faqs"]>) => WithContext<FAQPage>;
|
|
8
|
-
declare const genBlogPostingJSONLD: (post: BlogPostRes) => WithContext<BlogPosting>;
|
|
9
|
-
declare const genBreadcrumbJSONLD: (post: BlogPostRes) => {
|
|
10
|
-
position: number;
|
|
11
|
-
name: string;
|
|
12
|
-
item: string;
|
|
13
|
-
}[];
|
|
14
|
-
|
|
15
|
-
export { genBlogPostingJSONLD, genBreadcrumbJSONLD, genFaqJSONLD, generateArticleBodyHtml };
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { opinlyConfig } from "../../../utils/sdk-config";
|
|
2
|
-
function generateArticleBodyHtml(content) {
|
|
3
|
-
if (!content?.content) return "";
|
|
4
|
-
let htmlString = "";
|
|
5
|
-
content.content.forEach((node) => {
|
|
6
|
-
switch (node.type) {
|
|
7
|
-
case "paragraph":
|
|
8
|
-
htmlString += `<p>${generateChildrenHtml(node.content)}</p>`;
|
|
9
|
-
break;
|
|
10
|
-
case "heading":
|
|
11
|
-
const headingLevel = node.attrs?.level || 1;
|
|
12
|
-
htmlString += `<h${headingLevel}>${generateChildrenHtml(
|
|
13
|
-
node.content
|
|
14
|
-
)}</h${headingLevel}>`;
|
|
15
|
-
break;
|
|
16
|
-
case "bulletList":
|
|
17
|
-
htmlString += `<ul>${generateChildrenHtml(node.content)}</ul>`;
|
|
18
|
-
break;
|
|
19
|
-
case "orderedList":
|
|
20
|
-
htmlString += `<ol>${generateChildrenHtml(node.content)}</ol>`;
|
|
21
|
-
break;
|
|
22
|
-
case "listItem":
|
|
23
|
-
htmlString += `<li>${generateChildrenHtml(node.content)}</li>`;
|
|
24
|
-
break;
|
|
25
|
-
// Add other node types if they contain text content relevant for articleBody
|
|
26
|
-
// For images, you might just skip them or include an <img> tag if semantic
|
|
27
|
-
// For example:
|
|
28
|
-
// case "image":
|
|
29
|
-
// if (node.attrs?.src) {
|
|
30
|
-
// htmlString += `<img src="${replaceImageHostname(node.attrs.src, opinlyConfig.imagesPrefix)}" alt="${node.attrs?.alt || ''}" />`;
|
|
31
|
-
// }
|
|
32
|
-
// break;
|
|
33
|
-
default:
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
return htmlString;
|
|
38
|
-
}
|
|
39
|
-
function generateChildrenHtml(nodes) {
|
|
40
|
-
if (!nodes) return "";
|
|
41
|
-
let childrenHtml = "";
|
|
42
|
-
nodes.forEach((child) => {
|
|
43
|
-
if (child.type === "text") {
|
|
44
|
-
let text = child.text || "";
|
|
45
|
-
if (child.marks) {
|
|
46
|
-
child.marks.forEach((mark) => {
|
|
47
|
-
if (mark.type === "bold") text = `<strong>${text}</strong>`;
|
|
48
|
-
if (mark.type === "italic") text = `<em>${text}</em>`;
|
|
49
|
-
if (mark.type === "link" && mark.attrs?.href) {
|
|
50
|
-
text = `<a href="${mark.attrs.href}">${text}</a>`;
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
childrenHtml += text;
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
return childrenHtml;
|
|
58
|
-
}
|
|
59
|
-
const genFaqJSONLD = (faqs) => {
|
|
60
|
-
return {
|
|
61
|
-
"@context": "https://schema.org",
|
|
62
|
-
"@type": "FAQPage",
|
|
63
|
-
mainEntity: faqs.map((faq) => ({
|
|
64
|
-
"@type": "Question",
|
|
65
|
-
name: faq.question,
|
|
66
|
-
acceptedAnswer: {
|
|
67
|
-
"@type": "Answer",
|
|
68
|
-
text: faq.answer
|
|
69
|
-
}
|
|
70
|
-
}))
|
|
71
|
-
};
|
|
72
|
-
};
|
|
73
|
-
const genBlogPostingJSONLD = (post) => {
|
|
74
|
-
return {
|
|
75
|
-
"@context": "https://schema.org",
|
|
76
|
-
"@type": "BlogPosting",
|
|
77
|
-
headline: post.title,
|
|
78
|
-
description: post.description || void 0,
|
|
79
|
-
url: `${opinlyConfig.blogUrl}/${post.folder ? `${post.folder.slug + "/"}${post.slug}` : post.slug}`,
|
|
80
|
-
datePublished: post.firstPublishedAt || void 0,
|
|
81
|
-
dateModified: post.modifiedAt || void 0,
|
|
82
|
-
image: post.titleFile?.fileKey ? {
|
|
83
|
-
"@type": "ImageObject",
|
|
84
|
-
url: `${opinlyConfig.imagesUrl}/${post.titleFile.fileKey}`
|
|
85
|
-
} : void 0,
|
|
86
|
-
author: post.author ? {
|
|
87
|
-
"@type": "Person",
|
|
88
|
-
name: post.author.name,
|
|
89
|
-
url: `${opinlyConfig.blogUrl}/author/${post.author.slug}`,
|
|
90
|
-
description: post.author.bio || void 0
|
|
91
|
-
} : void 0,
|
|
92
|
-
isAccessibleForFree: true,
|
|
93
|
-
articleBody: generateArticleBodyHtml(post.content)
|
|
94
|
-
};
|
|
95
|
-
};
|
|
96
|
-
const genBreadcrumbJSONLD = (post) => {
|
|
97
|
-
const itemListElement = [
|
|
98
|
-
{
|
|
99
|
-
position: 1,
|
|
100
|
-
name: opinlyConfig.siteName,
|
|
101
|
-
item: opinlyConfig.siteUrl
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
position: 2,
|
|
105
|
-
name: post.folder?.name || "Blog",
|
|
106
|
-
item: `${opinlyConfig.blogUrl}/blog`
|
|
107
|
-
}
|
|
108
|
-
];
|
|
109
|
-
if (post.folder) {
|
|
110
|
-
itemListElement.push({
|
|
111
|
-
position: 3,
|
|
112
|
-
name: post.folder.name,
|
|
113
|
-
item: `${opinlyConfig.blogUrl}/blog/${post.folder.slug}`
|
|
114
|
-
});
|
|
115
|
-
itemListElement.push({
|
|
116
|
-
position: 4,
|
|
117
|
-
name: post.title,
|
|
118
|
-
item: `${opinlyConfig.blogUrl}/blog/${post.folder.slug}/${post.slug}`
|
|
119
|
-
});
|
|
120
|
-
} else {
|
|
121
|
-
itemListElement.push({
|
|
122
|
-
position: 3,
|
|
123
|
-
name: post.title,
|
|
124
|
-
item: `${opinlyConfig.blogUrl}/blog/${post.slug}`
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
return itemListElement;
|
|
128
|
-
};
|
|
129
|
-
export {
|
|
130
|
-
genBlogPostingJSONLD,
|
|
131
|
-
genBreadcrumbJSONLD,
|
|
132
|
-
genFaqJSONLD,
|
|
133
|
-
generateArticleBodyHtml
|
|
134
|
-
};
|
|
135
|
-
//# sourceMappingURL=json-ld.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/blog-post/_helpers/json-ld.ts"],"sourcesContent":["import {\n BlogPosting,\n BreadcrumbList,\n FAQPage,\n WithContext,\n ListItem,\n} from \"schema-dts\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { JSONContent } from \"@tiptap/core\";\n\n// Add this function somewhere in your BlogPost component file\nexport function generateArticleBodyHtml(content: JSONContent): string {\n if (!content?.content) return \"\";\n\n let htmlString = \"\";\n\n content.content.forEach((node) => {\n switch (node.type) {\n case \"paragraph\":\n htmlString += `<p>${generateChildrenHtml(node.content)}</p>`;\n break;\n case \"heading\":\n const headingLevel = node.attrs?.level || 1;\n htmlString += `<h${headingLevel}>${generateChildrenHtml(\n node.content\n )}</h${headingLevel}>`;\n break;\n case \"bulletList\":\n htmlString += `<ul>${generateChildrenHtml(node.content)}</ul>`;\n break;\n case \"orderedList\":\n htmlString += `<ol>${generateChildrenHtml(node.content)}</ol>`;\n break;\n case \"listItem\":\n htmlString += `<li>${generateChildrenHtml(node.content)}</li>`;\n break;\n // Add other node types if they contain text content relevant for articleBody\n // For images, you might just skip them or include an <img> tag if semantic\n // For example:\n // case \"image\":\n // if (node.attrs?.src) {\n // htmlString += `<img src=\"${replaceImageHostname(node.attrs.src, opinlyConfig.imagesPrefix)}\" alt=\"${node.attrs?.alt || ''}\" />`;\n // }\n // break;\n default:\n // Handle other block types or just ignore them for articleBody\n break;\n }\n });\n\n return htmlString;\n}\n\nfunction generateChildrenHtml(\n nodes: JSONContent[\"content\"] | undefined\n): string {\n if (!nodes) return \"\";\n\n let childrenHtml = \"\";\n nodes.forEach((child) => {\n if (child.type === \"text\") {\n let text = child.text || \"\";\n if (child.marks) {\n child.marks.forEach((mark) => {\n if (mark.type === \"bold\") text = `<strong>${text}</strong>`;\n if (mark.type === \"italic\") text = `<em>${text}</em>`;\n if (mark.type === \"link\" && mark.attrs?.href) {\n text = `<a href=\"${mark.attrs.href}\">${text}</a>`;\n }\n });\n }\n childrenHtml += text;\n }\n // If you have nested content within child nodes, you might need a recursive call here\n // For example, if a list item can contain paragraphs\n // if (child.content) {\n // childrenHtml += generateChildrenHtml(child.content);\n // }\n });\n return childrenHtml;\n}\n\nexport const genFaqJSONLD = (\n faqs: NonNullable<BlogPostRes[\"faqs\"]>\n): WithContext<FAQPage> => {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"FAQPage\",\n mainEntity: faqs.map((faq) => ({\n \"@type\": \"Question\",\n name: faq.question,\n acceptedAnswer: {\n \"@type\": \"Answer\",\n text: faq.answer,\n },\n })),\n };\n};\n\nexport const genBlogPostingJSONLD = (\n post: BlogPostRes\n): WithContext<BlogPosting> => {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BlogPosting\",\n headline: post.title,\n description: post.description || undefined,\n url: `${opinlyConfig.blogUrl}/${\n post.folder ? `${post.folder.slug + \"/\"}${post.slug}` : post.slug\n }`,\n datePublished: post.firstPublishedAt || undefined,\n dateModified: post.modifiedAt || undefined,\n image: post.titleFile?.fileKey\n ? {\n \"@type\": \"ImageObject\",\n url: `${opinlyConfig.imagesUrl}/${post.titleFile.fileKey}`,\n }\n : undefined,\n author: post.author\n ? {\n \"@type\": \"Person\",\n name: post.author.name,\n url: `${opinlyConfig.blogUrl}/author/${post.author.slug}`,\n description: post.author.bio || undefined,\n }\n : undefined,\n isAccessibleForFree: true,\n articleBody: generateArticleBodyHtml(post.content as JSONContent),\n };\n};\n\nexport const genBreadcrumbJSONLD = (post: BlogPostRes) => {\n const itemListElement = [\n {\n position: 1,\n name: opinlyConfig.siteName,\n item: opinlyConfig.siteUrl,\n },\n {\n position: 2,\n name: post.folder?.name || \"Blog\",\n item: `${opinlyConfig.blogUrl}/blog`,\n },\n ];\n\n if (post.folder) {\n itemListElement.push({\n position: 3,\n name: post.folder.name,\n item: `${opinlyConfig.blogUrl}/blog/${post.folder.slug}`,\n });\n\n itemListElement.push({\n position: 4,\n name: post.title,\n item: `${opinlyConfig.blogUrl}/blog/${post.folder.slug}/${post.slug}`,\n });\n } else {\n itemListElement.push({\n position: 3,\n name: post.title,\n item: `${opinlyConfig.blogUrl}/blog/${post.slug}`,\n });\n }\n\n return itemListElement;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var reading_time_exports = {};
|
|
20
|
-
__export(reading_time_exports, {
|
|
21
|
-
calculateReadingTime: () => calculateReadingTime,
|
|
22
|
-
countWords: () => countWords
|
|
23
|
-
});
|
|
24
|
-
module.exports = __toCommonJS(reading_time_exports);
|
|
25
|
-
const countWords = (content) => {
|
|
26
|
-
if (!content?.content) return 0;
|
|
27
|
-
let wordCount = 0;
|
|
28
|
-
const countWords2 = (nodes) => {
|
|
29
|
-
for (const node of nodes) {
|
|
30
|
-
if (node.type === "text" && node.text) {
|
|
31
|
-
const words = node.text.trim().split(/\s+/).filter(Boolean);
|
|
32
|
-
wordCount += words.length;
|
|
33
|
-
}
|
|
34
|
-
if (node.content) countWords2(node.content);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
countWords2(content.content);
|
|
38
|
-
return wordCount;
|
|
39
|
-
};
|
|
40
|
-
function calculateReadingTime(content) {
|
|
41
|
-
const wordCount = countWords(content);
|
|
42
|
-
const readingTimeMinutes = Math.ceil(wordCount / 200);
|
|
43
|
-
return readingTimeMinutes;
|
|
44
|
-
}
|
|
45
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
46
|
-
0 && (module.exports = {
|
|
47
|
-
calculateReadingTime,
|
|
48
|
-
countWords
|
|
49
|
-
});
|
|
50
|
-
//# sourceMappingURL=reading-time.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/blog-post/_helpers/reading-time.ts"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\n\nexport const countWords = (content: JSONContent | undefined): number => {\n if (!content?.content) return 0;\n\n let wordCount = 0;\n\n const countWords = (nodes: any[]) => {\n for (const node of nodes) {\n if (node.type === \"text\" && node.text) {\n const words = node.text.trim().split(/\\s+/).filter(Boolean);\n wordCount += words.length;\n }\n if (node.content) countWords(node.content);\n }\n };\n\n countWords(content.content);\n\n return wordCount;\n};\n\nexport function calculateReadingTime(content: JSONContent): number {\n const wordCount = countWords(content);\n\n const readingTimeMinutes = Math.ceil(wordCount / 200);\n return readingTimeMinutes;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,aAAa,CAAC,YAA6C;AACtE,MAAI,CAAC,SAAS,QAAS,QAAO;AAE9B,MAAI,YAAY;AAEhB,QAAMA,cAAa,CAAC,UAAiB;AACnC,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,UAAU,KAAK,MAAM;AACrC,cAAM,QAAQ,KAAK,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AAC1D,qBAAa,MAAM;AAAA,MACrB;AACA,UAAI,KAAK,QAAS,CAAAA,YAAW,KAAK,OAAO;AAAA,IAC3C;AAAA,EACF;AAEA,EAAAA,YAAW,QAAQ,OAAO;AAE1B,SAAO;AACT;AAEO,SAAS,qBAAqB,SAA8B;AACjE,QAAM,YAAY,WAAW,OAAO;AAEpC,QAAM,qBAAqB,KAAK,KAAK,YAAY,GAAG;AACpD,SAAO;AACT;","names":["countWords"]}
|