Skip to content

Commit a4ad5cd

Browse files
authored
fix(yfmHtmlBlock): added sanitize prop to YfmHtmlBlockView (#307)
1 parent 712c71f commit a4ad5cd

File tree

3 files changed

+15
-12
lines changed

3 files changed

+15
-12
lines changed

demo/Playground.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, {CSSProperties, useCallback, useEffect} from 'react';
22

3+
import sanitize from '@diplodoc/transform/lib/sanitize';
34
import {Button, DropdownMenu} from '@gravity-ui/uikit';
45
import {toaster} from '@gravity-ui/uikit/toaster-singleton-react-18';
56

@@ -161,6 +162,7 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
161162
})
162163
.use(YfmHtmlBlock, {
163164
useConfig: useYfmHtmlBlockStyles,
165+
sanitize,
164166
}),
165167
});
166168

src/extensions/yfm/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,12 @@ export class WYfmHtmlBlockNodeView implements NodeView {
9595
private renderYfmHtmlBlock() {
9696
return createPortal(
9797
<YfmHtmlBlockView
98+
getPos={this.getPos}
99+
node={this.node}
100+
onChange={this.onChange.bind(this)}
101+
sanitize={this.options.sanitize}
98102
useConfig={this.options.useConfig}
99103
view={this.view}
100-
onChange={this.onChange.bind(this)}
101-
node={this.node}
102-
getPos={this.getPos}
103104
/>,
104105
this.dom,
105106
);

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,13 @@ const CodeEditMode: React.FC<{
199199
};
200200

201201
export const YfmHtmlBlockView: React.FC<{
202-
view: EditorView;
203-
onChange: (attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) => void;
204-
node: Node;
205202
getPos: () => number | undefined;
203+
node: Node;
204+
onChange: (attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) => void;
205+
sanitize?: (dirtyHtml: string) => string;
206206
useConfig?: () => IHTMLIFrameElementConfig | undefined;
207-
}> = ({onChange, node, getPos, view, useConfig}) => {
207+
view: EditorView;
208+
}> = ({onChange, node, getPos, view, useConfig, sanitize}) => {
208209
const [editing, setEditing, unsetEditing, toggleEditing] = useBooleanState(
209210
Boolean(node.attrs[YfmHtmlBlockConsts.NodeAttrs.newCreated]),
210211
);
@@ -231,16 +232,15 @@ export const YfmHtmlBlockView: React.FC<{
231232
);
232233
}
233234

235+
const dirtyHtml = node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc];
236+
const html = sanitize ? sanitize(dirtyHtml) : dirtyHtml;
237+
234238
return (
235239
<div className={b()} onDoubleClick={setEditing}>
236240
<Label className={b('label')} icon={<Icon size={16} data={Eye} />}>
237241
{i18n('preview')}
238242
</Label>
239-
<YfmHtmlBlockPreview
240-
html={node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]}
241-
onСlick={handleClick}
242-
config={config}
243-
/>
243+
<YfmHtmlBlockPreview html={html} onСlick={handleClick} config={config} />
244244

245245
<div className={b('menu')}>
246246
<Button

0 commit comments

Comments
 (0)