Skip to content

Commit ad03230

Browse files
vladKrkvladkrk
and
vladkrk
authored
feat(view): added option to control HTML block runtimes (#674)
Co-authored-by: vladkrk <[email protected]>
1 parent a4ad9b0 commit ad03230

File tree

10 files changed

+41
-12
lines changed

10 files changed

+41
-12
lines changed

demo/components/Playground.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {type CSSProperties, memo, useCallback, useEffect, useMemo, 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

@@ -77,6 +78,7 @@ export type PlaygroundProps = {
7778
onChangeEditorType?: (mode: MarkdownEditorMode) => void;
7879
onChangeSplitModeEnabled?: (splitModeEnabled: boolean) => void;
7980
directiveSyntax?: DirectiveSyntaxValue;
81+
disabledHTMLBlockModes?: EmbeddingMode[];
8082
} & Pick<UseMarkdownEditorProps, 'experimental' | 'wysiwygConfig'> &
8183
Pick<
8284
MarkdownEditorViewProps,
@@ -125,6 +127,7 @@ export const Playground = memo<PlaygroundProps>((props) => {
125127
hidePreviewAfterSubmit,
126128
experimental,
127129
directiveSyntax,
130+
disabledHTMLBlockModes,
128131
} = props;
129132
const [editorMode, setEditorMode] = useState<MarkdownEditorMode>(initialEditor ?? 'wysiwyg');
130133
const [mdRaw, setMdRaw] = useState<MarkupString>(initial || '');
@@ -143,9 +146,10 @@ export const Playground = memo<PlaygroundProps>((props) => {
143146
breaks={md.breaks}
144147
needToSanitizeHtml={sanitizeHtml}
145148
plugins={getPlugins({directiveSyntax})}
149+
htmlRuntimeConfig={{disabledModes: disabledHTMLBlockModes}}
146150
/>
147151
),
148-
[sanitizeHtml],
152+
[sanitizeHtml, disabledHTMLBlockModes],
149153
);
150154

151155
const logger = useMemo(() => new Logger2().nested({env: 'playground'}), []);

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 = memo<PlaygroundMiniProps>(

demo/components/SplitModePreview.tsx

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {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
import type MarkdownIt from 'markdown-it';
@@ -31,10 +32,20 @@ export type SplitModePreviewProps = {
3132
linkify?: boolean;
3233
linkifyTlds?: string | string[];
3334
needToSanitizeHtml?: boolean;
35+
htmlRuntimeConfig?: HTMLRuntimeConfig;
3436
};
3537

3638
export const SplitModePreview: React.FC<SplitModePreviewProps> = (props) => {
37-
const {plugins, getValue, allowHTML, breaks, linkify, linkifyTlds, needToSanitizeHtml} = props;
39+
const {
40+
plugins,
41+
getValue,
42+
allowHTML,
43+
breaks,
44+
linkify,
45+
linkifyTlds,
46+
needToSanitizeHtml,
47+
htmlRuntimeConfig,
48+
} = props;
3849
const [html, setHtml] = useState('');
3950
const [meta, setMeta] = useState<object | undefined>({});
4051
const divRef = useRef<HTMLDivElement>(null);
@@ -74,6 +85,7 @@ export const SplitModePreview: React.FC<SplitModePreviewProps> = (props) => {
7485
noListReset
7586
mermaidConfig={mermaidConfig}
7687
yfmHtmlBlockConfig={yfmHtmlBlockConfig}
88+
htmlRuntimeConfig={htmlRuntimeConfig}
7789
className="demo-preview"
7890
/>
7991
);

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@
210210
"devDependencies": {
211211
"@diplodoc/cut-extension": "^0.6.1",
212212
"@diplodoc/folding-headings-extension": "0.1.0",
213-
"@diplodoc/html-extension": "^2.5.0",
213+
"@diplodoc/html-extension": "2.7.1",
214214
"@diplodoc/latex-extension": "1.0.3",
215215
"@diplodoc/mermaid-extension": "1.2.1",
216216
"@diplodoc/tabs-extension": "^3.5.1",
@@ -295,8 +295,8 @@
295295
},
296296
"peerDependencies": {
297297
"@diplodoc/cut-extension": "^0.5.0 || ^0.6.1 || ^0.7.1",
298-
"@diplodoc/folding-headings-extension": "^0.1.0",
299298
"@diplodoc/file-extension": "^0.2.1",
299+
"@diplodoc/folding-headings-extension": "^0.1.0",
300300
"@diplodoc/html-extension": "^2.3.2",
301301
"@diplodoc/latex-extension": "^1.0.3",
302302
"@diplodoc/mermaid-extension": "^1.0.0",

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

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

277-
const resultHtml = sanitize ? sanitize(html) : html;
277+
const sanitizeFunction = typeof sanitize === 'function' ? sanitize : sanitize?.body;
278+
279+
const resultHtml = sanitizeFunction ? sanitizeFunction(html) : html;
278280

279281
return (
280282
<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 {type ComponentType, type RefAttributes, forwardRef, useEffect} from 'react';
22

3+
import type {HTMLRuntimeConfig} from '@diplodoc/html-extension';
34
import {useDiplodocEmbeddedContentController} from '@diplodoc/html-extension/react';
45
import type {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)