403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/ui/text-editor/src/plugins/image/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/ui/text-editor/src/plugins/image/image-node.js
/* eslint-disable no-underscore-dangle, @bitrix24/bitrix24-rules/no-pseudo-private */

import { Type } from 'main.core';
import { validateImageUrl } from '../../helpers/validate-image-url';
import type { DecoratorOptions } from '../../types/decorator-options';
import ImageComponent from './image-component';

import {
	DecoratorNode,
	$applyNodeReplacement,
	type DOMConversionMap,
	type DOMConversionOutput,
	type DOMExportOutput,
	type EditorConfig,
	type LexicalNode,
	type LexicalEditor,
	type NodeKey,
	type SerializedLexicalNode,
} from 'ui.lexical.core';

export interface ImagePayload {
	src: string;
	width?: number;
	height?: number;
	maxWidth?: number;
	key?: NodeKey;
}

export type SerializedImageNode = SerializedLexicalNode & {
	src: string;
	width?: number;
	height?: number;
	maxWidth?: number;
};

export class ImageNode extends DecoratorNode
{
	__src: string;
	__width: 'inherit' | number = 'inherit';
	__height: 'inherit' | number = 'inherit';
	__maxWidth: number = 'none';

	constructor(
		src: string,
		width?: 'inherit' | number,
		height?: 'inherit' | number,
		maxWidth?: number,
		key?: NodeKey,
	)
	{
		super(key);

		if (validateImageUrl(src))
		{
			this.__src = src;
		}
		else
		{
			this.__src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
		}

		if (Type.isNumber(width))
		{
			this.__width = Math.round(width);
		}

		if (Type.isNumber(height))
		{
			this.__height = Math.round(height);
		}

		if (Type.isNumber(maxWidth))
		{
			this.__maxWidth = Math.round(maxWidth);
		}
	}

	static useDecoratorComponent = true;

	static getType(): string
	{
		return 'image';
	}

	static clone(node: ImageNode): ImageNode
	{
		return new ImageNode(
			node.__src,
			node.__width,
			node.__height,
			node.__maxWidth,
			node.__key,
		);
	}

	static importJSON(serializedNode: SerializedImageNode): ImageNode
	{
		const { width, height, src, maxWidth } = serializedNode;

		return $createImageNode({ src, width, height, maxWidth });
	}

	exportDOM(): DOMExportOutput
	{
		const element = document.createElement('img');
		element.setAttribute('src', this.__src);
		element.setAttribute('width', this.__width.toString());
		element.setAttribute('height', this.__height.toString());

		return { element };
	}

	static importDOM(): DOMConversionMap | null
	{
		return {
			img: (node: Node) => ({
				conversion: (domNode: HTMLImageElement): null | DOMConversionOutput => {
					if (domNode instanceof HTMLImageElement && validateImageUrl(domNode.src))
					{
						const { src, width, height } = domNode;
						const imageNode = $createImageNode({ src, width, height });

						return { node: imageNode };
					}

					return null;
				},
				priority: 0,
			}),
		};
	}

	exportJSON(): SerializedImageNode
	{
		return {
			src: this.getSrc(),
			width: this.getWidth(),
			height: this.getHeight(),
			maxWidth: this.getMaxWidth(),
			type: 'image',
			version: 1,
		};
	}

	setWidthAndHeight(width: 'inherit' | number, height: 'inherit' | number): void
	{
		const writable = this.getWritable();
		if (Type.isNumber(width))
		{
			writable.__width = Math.round(width);
		}
		else if (width === 'inherit')
		{
			writable.__width = width;
		}

		if (Type.isNumber(height))
		{
			writable.__height = Math.round(height);
		}
		else if (height === 'inherit')
		{
			writable.__height = height;
		}
	}

	setMaxWidth(maxWidth: number | 'none'): void
	{
		if (Type.isNumber(maxWidth) || maxWidth === 'none')
		{
			const writable = this.getWritable();
			writable.__maxWidth = Type.isNumber(maxWidth) ? Math.round(maxWidth) : maxWidth;
		}
	}

	createDOM(config: EditorConfig): HTMLElement
	{
		const span = document.createElement('span');
		const theme = config.theme;
		const className = theme?.image?.container;
		if (className !== undefined)
		{
			span.className = className;
		}

		return span;
	}

	updateDOM(): false
	{
		return false;
	}

	getSrc(): string
	{
		return this.__src;
	}

	getWidth(): 'inherit' | number
	{
		const self = this.getLatest();

		return self.__width;
	}

	getHeight(): 'inherit' | number
	{
		const self = this.getLatest();

		return self.__height;
	}

	getMaxWidth(): 'none' | number
	{
		const self = this.getLatest();

		return self.__maxWidth;
	}

	decorate(editor: LexicalEditor, config: EditorConfig): DecoratorOptions
	{
		return {
			componentClass: ImageComponent,
			options: {
				src: this.getSrc(),
				width: this.getWidth(),
				height: this.getHeight(),
				maxWidth: this.getMaxWidth(),
				config,
			},
		};
	}

	isInline(): true
	{
		return true;
	}
}

export function $createImageNode({ src, width, height, maxWidth, key }): ImageNode
{
	return $applyNodeReplacement(new ImageNode(src, width, height, maxWidth, key));
}

export function $isImageNode(node: LexicalNode | null | undefined): boolean
{
	return node instanceof ImageNode;
}

Youez - 2016 - github.com/yon3zu
LinuXploit