code.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { useEffect, useState, createElement } 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 createElement("div", {
  36. dangerouslySetInnerHTML: { __html: codeResult },
  37. ...divProps,
  38. });
  39. }