slide-viewer-renderer.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import * as refsGrowiDirective from '@growi/remark-attachment-refs/dist/client';
  2. import * as drawio from '@growi/remark-drawio';
  3. // eslint-disable-next-line import/extensions
  4. import * as lsxGrowiDirective from '@growi/remark-lsx/dist/client';
  5. import katex from 'rehype-katex';
  6. import sanitize from 'rehype-sanitize';
  7. import math from 'remark-math';
  8. import deepmerge from 'ts-deepmerge';
  9. import type { Pluggable } from 'unified';
  10. import { LightBox } from '~/components/ReactMarkdownComponents/LightBox';
  11. import { RichAttachment } from '~/components/ReactMarkdownComponents/RichAttachment';
  12. import * as mermaid from '~/features/mermaid';
  13. import { RehypeSanitizeOption } from '~/interfaces/rehype';
  14. import type { RendererOptions } from '~/interfaces/renderer-options';
  15. import type { RendererConfig } from '~/interfaces/services/renderer';
  16. import * as addLineNumberAttribute from '~/services/renderer/rehype-plugins/add-line-number-attribute';
  17. import * as attachment from '~/services/renderer/remark-plugins/attachment';
  18. import * as plantuml from '~/services/renderer/remark-plugins/plantuml';
  19. import * as xsvToTable from '~/services/renderer/remark-plugins/xsv-to-table';
  20. import {
  21. commonSanitizeOption, generateCommonOptions, injectCustomSanitizeOption, verifySanitizePlugin,
  22. } from '~/services/renderer/renderer';
  23. export const generatePresentationViewOptions = (
  24. config: RendererConfig,
  25. pagePath: string,
  26. ): RendererOptions => {
  27. const options = generateCommonOptions(pagePath);
  28. const { remarkPlugins, rehypePlugins, components } = options;
  29. // add remark plugins
  30. remarkPlugins.push(
  31. math,
  32. [plantuml.remarkPlugin, { plantumlUri: config.plantumlUri }],
  33. drawio.remarkPlugin,
  34. mermaid.remarkPlugin,
  35. xsvToTable.remarkPlugin,
  36. [attachment.remarkPlugin, { isSharedPage: config.isSharedPage }],
  37. lsxGrowiDirective.remarkPlugin,
  38. refsGrowiDirective.remarkPlugin,
  39. );
  40. if (config.xssOption === RehypeSanitizeOption.CUSTOM) {
  41. injectCustomSanitizeOption(config);
  42. }
  43. const rehypeSanitizePlugin: Pluggable<any[]> | (() => void) = config.isEnabledXssPrevention
  44. ? [sanitize, deepmerge(
  45. commonSanitizeOption,
  46. drawio.sanitizeOption,
  47. mermaid.sanitizeOption,
  48. attachment.sanitizeOption,
  49. lsxGrowiDirective.sanitizeOption,
  50. refsGrowiDirective.sanitizeOption,
  51. addLineNumberAttribute.sanitizeOption,
  52. )]
  53. : () => {};
  54. // add rehype plugins
  55. rehypePlugins.push(
  56. [lsxGrowiDirective.rehypePlugin, { pagePath, isSharedPage: config.isSharedPage }],
  57. [refsGrowiDirective.rehypePlugin, { pagePath }],
  58. rehypeSanitizePlugin,
  59. addLineNumberAttribute.rehypePlugin,
  60. katex,
  61. );
  62. // add components
  63. if (components != null) {
  64. components.lsx = lsxGrowiDirective.LsxImmutable;
  65. components.ref = refsGrowiDirective.RefImmutable;
  66. components.refs = refsGrowiDirective.RefsImmutable;
  67. components.refimg = refsGrowiDirective.RefImgImmutable;
  68. components.refsimg = refsGrowiDirective.RefsImgImmutable;
  69. components.gallery = refsGrowiDirective.GalleryImmutable;
  70. components.drawio = drawio.DrawioViewer;
  71. components.mermaid = mermaid.MermaidViewer;
  72. components.attachment = RichAttachment;
  73. components.img = LightBox;
  74. }
  75. if (config.isEnabledXssPrevention) {
  76. verifySanitizePlugin(options, false);
  77. }
  78. return options;
  79. };