foundation.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import BaseFoundation, { DefaultAdapter } from '../base/foundation';
  2. import { CompileOptions, evaluate, compile, EvaluateOptions, evaluateSync, RunOptions } from '@mdx-js/mdx';
  3. import { MDXProps } from 'mdx/types';
  4. import remarkGfm from 'remark-gfm';
  5. import { type PluggableList } from "@mdx-js/mdx/lib/core";
  6. export interface MarkdownRenderAdapter <P = Record<string, any>, S = Record<string, any>> extends DefaultAdapter<P, S> {
  7. getRuntime: () => any
  8. }
  9. export interface MarkdownRenderBaseProps{
  10. raw: string;
  11. components: MDXProps['components'];
  12. format: "md"|"mdx";
  13. remarkPlugins?: PluggableList;
  14. rehypePlugins?: PluggableList;
  15. remarkGfm?: boolean
  16. }
  17. export interface MarkdownRenderBaseState{
  18. MDXContentComponent: any
  19. }
  20. class MarkdownRenderFoundation extends BaseFoundation<MarkdownRenderAdapter> {
  21. private getOptions = () => {
  22. const enableRemarkGfm = this._adapter.getProp("remarkGfm");
  23. const remarkPlugins = [...(this.getProp("remarkPlugins") ?? [])];
  24. if (enableRemarkGfm) {
  25. remarkPlugins.unshift(remarkGfm);
  26. }
  27. return {
  28. evaluateOptions: {
  29. remarkPlugins: remarkPlugins,
  30. rehypePlugins: this.getProp("rehypePlugins") ?? [],
  31. format: this.getProp("format")
  32. },
  33. compileOptions: {
  34. format: this.getProp("format"),
  35. remarkPlugins: remarkPlugins,
  36. rehypePlugins: this.getProp("rehypePlugins") ?? [],
  37. },
  38. runOptions: {
  39. }
  40. } as {
  41. evaluateOptions: EvaluateOptions;
  42. compileOptions: CompileOptions;
  43. runOptions: RunOptions
  44. };
  45. }
  46. compile = async (mdxRaw: string) => {
  47. return await compile(mdxRaw, this.getOptions().compileOptions);
  48. }
  49. evaluate = async (mdxRaw: string) => {
  50. return (await evaluate(mdxRaw, {
  51. ...this.getOptions().runOptions,
  52. ...this.getOptions().evaluateOptions,
  53. ...this._adapter.getRuntime()
  54. })).default;
  55. }
  56. evaluateSync = (mdxRaw: string) => {
  57. return ( evaluateSync(mdxRaw, {
  58. ...this.getOptions().runOptions,
  59. ...this.getOptions().evaluateOptions,
  60. ...this._adapter.getRuntime()
  61. })).default;
  62. }
  63. }
  64. export default MarkdownRenderFoundation;