Skip to content

Commit 526074d

Browse files
authored
feat(ImgSize, markup): rework image styling to get more control (#451)
1 parent 720215b commit 526074d

File tree

27 files changed

+234
-200
lines changed

27 files changed

+234
-200
lines changed

demo/constants/md-plugins.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const defaultPlugins: PluginWithParams[] = [
3636
yfmCut({bundle: false}) as PluginWithParams,
3737
deflist,
3838
file,
39-
imsize,
39+
(md) => md.use(imsize, {enableInlineStyling: true}),
4040
meta,
4141
monospace,
4242
notes,

demo/playground/Playground.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export type PlaygroundProps = {
9393
| 'extraExtensions'
9494
| 'renderPreview'
9595
| 'extensionOptions'
96+
| 'experimental'
9697
> &
9798
Pick<
9899
MarkdownEditorViewProps,
@@ -136,6 +137,7 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
136137
enableSubmitInPreview,
137138
hidePreviewAfterSubmit,
138139
needToSetDimensionsForUploadedImages,
140+
experimental,
139141
} = props;
140142
const [editorMode, setEditorMode] = React.useState<MarkdownEditorMode>(
141143
initialEditor ?? 'wysiwyg',
@@ -176,6 +178,7 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
176178
needToSetDimensionsForUploadedImages,
177179
renderPreview: renderPreviewDefined ? renderPreview : undefined,
178180
fileUploadHandler,
181+
experimental,
179182
prepareRawMarkup: prepareRawMarkup
180183
? (value) => '**prepare raw markup**\n\n' + value
181184
: undefined,
@@ -238,6 +241,10 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
238241
extraExtensions,
239242
needToSetDimensionsForUploadedImages,
240243
initial,
244+
experimental?.enableNewImageSizeCalculation,
245+
experimental?.needToSetDimensionsForUploadedImages,
246+
experimental?.beforeEditorModeChange,
247+
experimental?.prepareRawMarkup,
241248
],
242249
);
243250

package-lock.json

Lines changed: 5 additions & 112 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@
207207
"@diplodoc/latex-extension": "1.0.3",
208208
"@diplodoc/mermaid-extension": "1.2.1",
209209
"@diplodoc/tabs-extension": "^3.5.1",
210-
"@diplodoc/transform": "^4.33.0",
210+
"@diplodoc/transform": "^4.36.0",
211211
"@gravity-ui/components": "3.0.0",
212212
"@gravity-ui/eslint-config": "3.1.1",
213213
"@gravity-ui/prettier-config": "1.1.0",

src/bundle/Editor.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@ import {
1414
import {ReactRenderStorage, type RenderStorage} from '../extensions';
1515
import {i18n} from '../i18n/bundle';
1616
import {logger} from '../logger';
17-
import {createCodemirror} from '../markup/codemirror';
17+
import {createCodemirror} from '../markup';
1818
import {type CodeEditor, Editor as MarkupEditor} from '../markup/editor';
19-
import {type Emitter, type Receiver, SafeEventEmitter} from '../utils/event-emitter';
20-
import type {FileUploadHandler} from '../utils/upload';
19+
import {type Emitter, FileUploadHandler, type Receiver, SafeEventEmitter} from '../utils';
2120

2221
import type {
2322
MarkdownEditorMode as EditorMode,
@@ -143,6 +142,7 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
143142
#fileUploadHandler?: FileUploadHandler;
144143
#parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;
145144
#needToSetDimensionsForUploadedImages: boolean;
145+
#enableNewImageSizeCalculation: boolean;
146146
#prepareRawMarkup?: (value: MarkupString) => MarkupString;
147147
#beforeEditorModeChange?: (
148148
options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,
@@ -264,7 +264,8 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
264264
reactRenderer: this.#renderStorage,
265265
uploadHandler: this.fileUploadHandler,
266266
parseInsertedUrlAsImage: this.parseInsertedUrlAsImage,
267-
needImgDimms: this.needToSetDimensionsForUploadedImages,
267+
needImageDimensions: this.needToSetDimensionsForUploadedImages,
268+
enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
268269
extensions: this.#markupConfig.extensions,
269270
disabledExtensions: this.#markupConfig.disabledExtensions,
270271
keymaps: this.#markupConfig.keymaps,
@@ -293,6 +294,10 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
293294
return this.#needToSetDimensionsForUploadedImages;
294295
}
295296

297+
get enableNewImageSizeCalculation(): boolean {
298+
return this.#enableNewImageSizeCalculation;
299+
}
300+
296301
constructor(opts: EditorOptions) {
297302
super({onError: logger.error.bind(logger)});
298303

@@ -324,6 +329,7 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
324329
this.#needToSetDimensionsForUploadedImages = Boolean(
325330
experimental.needToSetDimensionsForUploadedImages,
326331
);
332+
this.#enableNewImageSizeCalculation = Boolean(experimental.enableNewImageSizeCalculation);
327333
this.#prepareRawMarkup = experimental.prepareRawMarkup;
328334
this.#escapeConfig = wysiwygConfig.escapeConfig;
329335
this.#beforeEditorModeChange = experimental.beforeEditorModeChange;

src/bundle/toolbar/markup/MToolbarImagePopup.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@ import React, {RefObject} from 'react';
22

33
import isNumber from 'is-number';
44

5-
import {IMG_MAX_HEIGHT, getImageDimensions} from '../../../markup';
6-
import {ImageItem, insertImages} from '../../../markup/commands';
7-
import type {CodeEditor} from '../../../markup/editor';
5+
import {IMG_MAX_HEIGHT, ImageItem, getImageDimensions, insertImages} from '../../../markup';
6+
import type {CodeEditor} from '../../../markup';
87
import type {ToolbarBaseProps} from '../../../toolbar';
9-
import type {UploadSuccessItem} from '../../../utils/upload';
8+
import type {UploadSuccessItem} from '../../../utils';
109
import {ToolbarImagePopup} from '../custom/ToolbarImagePopup';
1110

1211
import {useMarkupToolbarContext} from './context';
1312

14-
const noop = (err: any) => {
13+
const noop = (err: unknown) => {
1514
console.error(err);
1615
};
1716

@@ -62,7 +61,7 @@ export const MToolbarImagePopup: React.FC<MToolbarImagePopupProps> = ({
6261

6362
async function toImageItems(
6463
items: readonly UploadSuccessItem[],
65-
withDimmensions: boolean,
64+
withDimensions: boolean,
6665
): Promise<ImageItem[]> {
6766
const imgItems: ImageItem[] = [];
6867

@@ -71,7 +70,7 @@ async function toImageItems(
7170
const imgItem: ImageItem = {url: result.url, alt: result.name ?? file.name};
7271
imgItems.push(imgItem);
7372

74-
if (withDimmensions) {
73+
if (withDimensions) {
7574
return getImageDimensions(file).then(({height}) => {
7675
imgItem.height = String(Math.min(height, IMG_MAX_HEIGHT));
7776
}, noop);

src/bundle/types.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import type {ReactNode} from 'react';
44

55
import type {MarkupString} from '../common';
66
import type {EscapeConfig, Extension} from '../core';
7-
import type {CreateCodemirrorParams, YfmLangOptions} from '../markup/codemirror';
8-
import type {FileUploadHandler} from '../utils/upload';
7+
import type {CreateCodemirrorParams, YfmLangOptions} from '../markup';
8+
import type {FileUploadHandler} from '../utils';
99

1010
import type {ChangeEditorModeOptions} from './Editor';
1111
import type {ExtensionsOptions as WysiwygPresetExtensionsOptions} from './wysiwyg-preset';
@@ -57,6 +57,12 @@ export type MarkdownEditorExperimentalOptions = {
5757
* @default false
5858
*/
5959
needToSetDimensionsForUploadedImages?: boolean;
60+
/**
61+
* If we need to enable new image size calculations
62+
*
63+
* @default false
64+
*/
65+
enableNewImageSizeCalculation?: boolean;
6066
/**
6167
* Called before switching from the markup editor to the wysiwyg editor.
6268
* You can use it to pre-process the value from the markup editor before it gets into the wysiwyg editor.

src/bundle/useMarkdownEditor.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export function useMarkdownEditor<T extends object = {}>(
3838
const needToSetDimensionsForUploadedImages =
3939
experimental.needToSetDimensionsForUploadedImages ??
4040
props.needToSetDimensionsForUploadedImages;
41+
const enableNewImageSizeCalculation = experimental.enableNewImageSizeCalculation;
4142

4243
const extensions: Extension = (builder) => {
4344
const extensionOptions = wysiwygConfig.extensionOptions ?? props.extensionOptions;
@@ -57,6 +58,7 @@ export function useMarkdownEditor<T extends object = {}>(
5758
mdBreaks: breaks,
5859
fileUploadHandler: uploadFile,
5960
needToSetDimensionsForUploadedImages,
61+
enableNewImageSizeCalculation,
6062
});
6163
{
6264
const extraExtensions = wysiwygConfig.extensions || props.extraExtensions;
@@ -90,6 +92,7 @@ export function useMarkdownEditor<T extends object = {}>(
9092
experimental: {
9193
...experimental,
9294
needToSetDimensionsForUploadedImages,
95+
enableNewImageSizeCalculation,
9396
prepareRawMarkup: experimental.prepareRawMarkup ?? props.prepareRawMarkup,
9497
beforeEditorModeChange:
9598
experimental.beforeEditorModeChange ??

src/bundle/wysiwyg-preset.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export type BundlePresetOptions = ExtensionsOptions &
3232
* @default false
3333
*/
3434
needToSetDimensionsForUploadedImages?: boolean;
35+
enableNewImageSizeCalculation?: boolean;
3536
};
3637

3738
export const BundlePreset: ExtensionAuto<BundlePresetOptions> = (builder, opts) => {
@@ -101,6 +102,7 @@ export const BundlePreset: ExtensionAuto<BundlePresetOptions> = (builder, opts)
101102
imgSize: {
102103
imageUploadHandler: opts.fileUploadHandler,
103104
needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,
105+
enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,
104106
...opts.imgSize,
105107
},
106108
checkbox: {checkboxLabelPlaceholder: () => i18nPlaceholder('checkbox'), ...opts.checkbox},

0 commit comments

Comments
 (0)