Skip to content

Commit c6b4803

Browse files
vladkrkmakhnatkin
vladkrk
authored andcommitted
feat(withYfmHtml): add setup for runtime config
1 parent 141bd54 commit c6b4803

File tree

10 files changed

+40
-11
lines changed

10 files changed

+40
-11
lines changed

demo/components/Playground.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, {CSSProperties, useCallback, useEffect, useState} from 'react';
22

3+
import type {EmbeddingMode} from '@diplodoc/html-extension';
34
import {defaultOptions} from '@diplodoc/transform/lib/sanitize';
45
import {Button, DropdownMenu} from '@gravity-ui/uikit';
56
import {toaster} from '@gravity-ui/uikit/toaster-singleton-react-18';
@@ -75,6 +76,7 @@ export type PlaygroundProps = {
7576
onChangeEditorType?: (mode: MarkdownEditorMode) => void;
7677
onChangeSplitModeEnabled?: (splitModeEnabled: boolean) => void;
7778
directiveSyntax?: DirectiveSyntaxValue;
79+
disabledHTMLBlockModes?: EmbeddingMode[];
7880
} & Pick<
7981
UseMarkdownEditorProps,
8082
| 'needToSetDimensionsForUploadedImages'
@@ -129,6 +131,7 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
129131
needToSetDimensionsForUploadedImages,
130132
experimental,
131133
directiveSyntax,
134+
disabledHTMLBlockModes,
132135
} = props;
133136
const [editorMode, setEditorMode] = React.useState<MarkdownEditorMode>(
134137
initialEditor ?? 'wysiwyg',
@@ -149,9 +152,10 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
149152
breaks={md.breaks}
150153
needToSanitizeHtml={sanitizeHtml}
151154
plugins={getPlugins({directiveSyntax})}
155+
htmlRuntimeConfig={{disabledModes: disabledHTMLBlockModes}}
152156
/>
153157
),
154-
[sanitizeHtml],
158+
[sanitizeHtml, disabledHTMLBlockModes],
155159
);
156160

157161
const mdEditor = useMarkdownEditor(

demo/components/PlaygroundMini.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export type PlaygroundMiniProps = Pick<
2323
| 'onChangeEditorType'
2424
| 'onChangeSplitModeEnabled'
2525
| 'directiveSyntax'
26+
| 'disabledHTMLBlockModes'
2627
> & {withDefaultInitialContent?: boolean};
2728

2829
export const PlaygroundMini = React.memo<PlaygroundMiniProps>(

demo/components/SplitModePreview.tsx

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, {useEffect, useMemo, useRef, useState} from 'react';
22

3+
import type {HTMLRuntimeConfig} from '@diplodoc/html-extension';
34
import transform from '@diplodoc/transform';
45
import {useThemeValue} from '@gravity-ui/uikit';
56

@@ -29,10 +30,20 @@ export type SplitModePreviewProps = {
2930
linkify?: boolean;
3031
linkifyTlds?: string | string[];
3132
needToSanitizeHtml?: boolean;
33+
htmlRuntimeConfig?: HTMLRuntimeConfig;
3234
};
3335

3436
export const SplitModePreview: React.FC<SplitModePreviewProps> = (props) => {
35-
const {plugins, getValue, allowHTML, breaks, linkify, linkifyTlds, needToSanitizeHtml} = props;
37+
const {
38+
plugins,
39+
getValue,
40+
allowHTML,
41+
breaks,
42+
linkify,
43+
linkifyTlds,
44+
needToSanitizeHtml,
45+
htmlRuntimeConfig,
46+
} = props;
3647
const [html, setHtml] = useState('');
3748
const [meta, setMeta] = useState<object | undefined>({});
3849
const divRef = useRef<HTMLDivElement>(null);
@@ -72,6 +83,7 @@ export const SplitModePreview: React.FC<SplitModePreviewProps> = (props) => {
7283
noListReset
7384
mermaidConfig={mermaidConfig}
7485
yfmHtmlBlockConfig={yfmHtmlBlockConfig}
86+
htmlRuntimeConfig={htmlRuntimeConfig}
7587
className="demo-preview"
7688
/>
7789
);

demo/defaults/args.ts

+1
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ export const args: Meta<PlaygroundMiniProps>['args'] = {
1717
renderPreviewDefined: true,
1818
height: 'initial',
1919
directiveSyntax: 'disabled',
20+
disabledHTMLBlockModes: [],
2021
};

demo/stories/yfm/content.ts

+2
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ html, body {
102102
103103
Simple text again
104104
105+
<div data-yfm-sandbox-mode='shadow' data-yfm-sandbox-content='This is shadow html block content that injected in html by runtime'>This is initial shadow html block content</div>
106+
105107
## Next is another YFM HTML block with styles
106108
107109
::: html

package-lock.json

+5-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@
206206
"devDependencies": {
207207
"@diplodoc/cut-extension": "^0.6.1",
208208
"@diplodoc/folding-headings-extension": "0.1.0",
209-
"@diplodoc/html-extension": "^2.5.0",
209+
"@diplodoc/html-extension": "2.7.1",
210210
"@diplodoc/latex-extension": "1.0.3",
211211
"@diplodoc/mermaid-extension": "1.2.1",
212212
"@diplodoc/tabs-extension": "^3.5.1",

src/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,9 @@ export const YfmHtmlBlockView: React.FC<{
278278
const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;
279279
const html = `<!DOCTYPE html><html>${head}${body}</html>`;
280280

281-
const resultHtml = sanitize ? sanitize(html) : html;
281+
const sanitizeFunction = typeof sanitize === 'function' ? sanitize : sanitize?.body;
282+
283+
const resultHtml = sanitizeFunction ? sanitizeFunction(html) : html;
282284

283285
return (
284286
<div className={b()} onDoubleClick={setEditing}>

src/view/hocs/withYfmHtml/index.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, {ComponentType, RefAttributes, forwardRef, useEffect} from 'react';
22

3+
import type {HTMLRuntimeConfig} from '@diplodoc/html-extension';
34
import {useDiplodocEmbeddedContentController} from '@diplodoc/html-extension/react';
45
import {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';
56

@@ -14,16 +15,17 @@ export type WithYfmHtmlBlockOptions = {
1415
export type WithYfmHtmlBlockProps = {
1516
meta: TransformMeta;
1617
yfmHtmlBlockConfig?: IHTMLIFrameElementConfig;
18+
htmlRuntimeConfig?: HTMLRuntimeConfig;
1719
};
1820

1921
export function withYfmHtmlBlock(opts: WithYfmHtmlBlockOptions) {
2022
return <T extends {html: string}>(
2123
Component: ComponentType<T & RefAttributes<HTMLDivElement>>,
2224
) =>
2325
forwardRef<HTMLDivElement, T & WithYfmHtmlBlockProps>(function WithYfmHtml(props, ref) {
24-
const {meta, html, yfmHtmlBlockConfig} = props;
26+
const {meta, html, yfmHtmlBlockConfig, htmlRuntimeConfig} = props;
2527

26-
useYfmHtmlBlockRuntime(meta, opts.runtime);
28+
useYfmHtmlBlockRuntime(meta, opts.runtime, htmlRuntimeConfig);
2729

2830
const yfmHtmlBlock = useDiplodocEmbeddedContentController();
2931

Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1+
import type {HTMLRuntimeConfig} from '@diplodoc/html-extension';
2+
import {setupRuntimeConfig} from '@diplodoc/html-extension/utils';
3+
14
import type {PluginRuntime, TransformMeta} from './types';
25

36
/** @internal */
47
export function useYfmHtmlBlockRuntime(
58
meta: TransformMeta,
69
runtime: PluginRuntime = '_assets/html-extension.js',
10+
htmlRuntimeConfig: HTMLRuntimeConfig = {},
711
) {
812
if (meta?.script?.includes(runtime)) {
13+
setupRuntimeConfig(htmlRuntimeConfig);
914
import(/* webpackChunkName: "yfm-html-runtime" */ '@diplodoc/html-extension/runtime');
1015
}
1116
}

0 commit comments

Comments
 (0)