import type { ComponentProps, ParentComponent } from "solid-js"; import { createEffect, createMemo, For, mergeProps, on, splitProps, } from "solid-js"; import { clipboard } from "solid-heroicons/solid"; import { Icon } from "solid-heroicons"; import * as Prismjs from "prismjs"; import toast from "solid-toast"; import clsx from "clsx"; type Props = { language: string; class?: string; dark?: boolean; withLineNumbers?: boolean; } & ComponentProps<"code">; export const Highlight: ParentComponent = (_props) => { const props = mergeProps({ language: "javascript" }, _props); const [, rest] = splitProps(props, [ "language", "children", "class", "innerHTML", ]); const languageClass = createMemo(() => `language-${props.language}`); const highlightedCode = createMemo(() => { const childrenString = props.children?.toString(); if (!childrenString) return; const grammar = Prismjs.languages[props.language]; if (!grammar) return; const result = Prismjs.highlight(childrenString, grammar, props.language); return result; }); createEffect( on([languageClass, highlightedCode], () => { Prismjs.highlightAll(); }), ); const handleCopyToClipboard = () => { if (props.innerHTML) { navigator.clipboard.writeText(props.innerHTML); } else if (props.children) { navigator.clipboard.writeText(props.children.toString()); } toast.success("CopiƩ dans le presse-papier", { duration: 2000, position: "top-right", }); }; return (
{props.withLineNumbers && props.children?.toString() && ( )}
				
					{props.children}
				
			
); };