code.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { useEffect, useState } from "react";
  2. import { codeToHtml } from "shiki";
  3. /**
  4. * Code component that uses Shiki to convert code to HTML and render it.
  5. *
  6. * @param code - The code to be highlighted.
  7. * @param theme - The theme to be used for highlighting.
  8. * @param language - The language of the code.
  9. * @param transformers - The transformers to be applied to the code.
  10. * @param decorations - The decorations to be applied to the code.
  11. * @param divProps - Additional properties to be passed to the div element.
  12. * @returns The rendered code block.
  13. */
  14. export function Code({
  15. code,
  16. theme,
  17. language,
  18. transformers,
  19. decorations,
  20. ...divProps
  21. }) {
  22. const [codeResult, setCodeResult] = useState("");
  23. useEffect(() => {
  24. async function fetchCode() {
  25. const result = await codeToHtml(code, {
  26. lang: language,
  27. theme,
  28. transformers,
  29. decorations,
  30. });
  31. setCodeResult(result);
  32. }
  33. fetchCode();
  34. }, [code, language, theme, transformers, decorations]);
  35. return (
  36. <div dangerouslySetInnerHTML={{ __html: codeResult }} {...divProps}></div>
  37. );
  38. }