import rangeParser from "parse-numeric-range"; import { PrismLight as SyntaxHighlighter } from "react-syntax-highlighter"; import tsx from "react-syntax-highlighter/dist/cjs/languages/prism/tsx"; import typescript from "react-syntax-highlighter/dist/cjs/languages/prism/typescript"; import scss from "react-syntax-highlighter/dist/cjs/languages/prism/scss"; import bash from "react-syntax-highlighter/dist/cjs/languages/prism/bash"; import markdown from "react-syntax-highlighter/dist/cjs/languages/prism/markdown"; import json from "react-syntax-highlighter/dist/cjs/languages/prism/json"; import { coldarkDark as defaulttheme } from "react-syntax-highlighter/dist/cjs/styles/prism"; import { BiCopy } from "react-icons/bi"; import { Components } from "react-markdown"; import { generateSlug } from "../utils/general"; import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import remarkTypograf from "@mavrin/remark-typograf"; import smartypants from "remark-smartypants"; import rehypeRaw from "rehype-raw"; import emoji from "remark-emoji"; import oembed from "@agentofuser/remark-oembed"; import remarkDirective from 'remark-directive' import remarkDirectiveRehype from 'remark-directive-rehype' import { YouTubeVideo } from "./Youtube"; import { ImageSlide } from "./ImageSlide"; //import rehypeSanitize from "rehype-sanitize"; SyntaxHighlighter.registerLanguage("tsx", tsx); SyntaxHighlighter.registerLanguage("typescript", typescript); SyntaxHighlighter.registerLanguage("scss", scss); SyntaxHighlighter.registerLanguage("bash", bash); SyntaxHighlighter.registerLanguage("markdown", markdown); SyntaxHighlighter.registerLanguage("json", json); export const StyledMarkdown = ({ html }: { html: string }) => { const MarkdownComponents: Components = { h1: (props: any) => { const arr = props.children; let heading = ""; for (let i = 0; i < arr.length; i++) { if (arr[i]?.type !== undefined) { for (let j = 0; j < arr[i].props.children.length; j++) { heading += arr[i]?.props?.children[0]; } } else heading += arr[i]; } const slug = generateSlug(heading); return (

); }, h2: (props: any) => { const arr = props.children; let heading = ""; for (let i = 0; i < arr.length; i++) { if (arr[i]?.type !== undefined) { for (let j = 0; j < arr[i].props.children.length; j++) { heading += arr[i]?.props?.children[0]; } } else heading += arr[i]; } const slug = generateSlug(heading); return (

); }, h3: (props: any) => { const arr = props.children; let heading = ""; for (let i = 0; i < arr.length; i++) { if (arr[i]?.type !== undefined) { for (let j = 0; j < arr[i].props.children.length; j++) { heading += arr[i]?.props?.children[0]; } } else heading += arr[i]; } const slug = generateSlug(heading); return (

); }, h4: (props: any) => { const arr = props.children; let heading = ""; for (let i = 0; i < arr.length; i++) { if (arr[i]?.type !== undefined) { for (let j = 0; j < arr[i].props.children.length; j++) { heading += arr[i]?.props?.children[0]; } } else heading += arr[i]; } const slug = generateSlug(heading); return (

); }, code({ node, inline, className, ...props }: any) { const match = /language-(\w+)/.exec(className || ""); const hasMeta = node?.data?.meta; const applyHighlights: object = (applyHighlights: number) => { if (hasMeta) { const RE = /{([\d,-]+)}/; const metadata = node.data.meta?.replace(/\s/g, ""); const strlineNumbers = RE?.test(metadata) ? // @ts-ignore RE?.exec(metadata)[1] : "0"; const highlightLines = rangeParser(strlineNumbers); const highlight = highlightLines; const data = highlight.includes(applyHighlights) ? "highlight" : null; return { data }; } else { return {}; } }; const applyStartingNumber = () => { if (hasMeta) { const metadata = node.data.meta?.replace(/\s/g, ""); const RE = /line=(\d+)/; const start = RE?.test(metadata) && RE.exec(metadata); return start ? +start[1] : 1; } else { return 1; } }; const getTitle = () => { if (hasMeta) { const metadata = node.data.meta; const RE = /title=\"(.*)\"/; const title = RE?.test(metadata) && RE.exec(metadata); return title ? title[1] : "Code"; } return "Code"; }; return match ? (
{
{getTitle()}
}
) : ( ); }, //custom directives //@ts-ignore 'yt': YouTubeVideo, 'img-slide': ImageSlide, }; return (
); };