index.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import BaseFoundation, { DefaultAdapter } from '../base/foundation';
  2. import Prism from 'prismjs';
  3. import cls from "classnames";
  4. import "prismjs/plugins/line-numbers/prism-line-numbers.min.js";
  5. Prism.manual = true;
  6. export interface CodeHighlightBaseProps {
  7. code: string;
  8. language: string;
  9. lineNumber: boolean
  10. }
  11. export interface CodeHighlightBaseState {
  12. }
  13. export interface CodeHighlightAdapter<P = Record<string, any>, S = Record<string, any>> extends DefaultAdapter<P, S> {
  14. }
  15. class CodeHighlightFoundation<P = Record<string, any>, S = Record<string, any>> extends BaseFoundation<CodeHighlightAdapter<P, S>, P, S> {
  16. constructor(adapter: CodeHighlightAdapter<P, S>) {
  17. super({ ...adapter });
  18. }
  19. highlightCode = (ele: HTMLElement, language: string) => {
  20. let className = ele.className;
  21. const languageClassName = `language-${language}`;
  22. if (!className.includes(languageClassName)) {
  23. className = cls(className, languageClassName);
  24. }
  25. if (this.getProp("lineNumber")) {
  26. className = cls(className, "line-numbers");
  27. }
  28. ele.className = className;
  29. Prism.highlightElement(ele, false);
  30. }
  31. }
  32. export default CodeHighlightFoundation;