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/debug/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/ui/text-editor/src/debug/generate-content.js
/* eslint-disable no-underscore-dangle */

import { $isElementNode } from 'ui.lexical.core';
import {
	$getRoot,
	$getSelection,
	$isNodeSelection,
	$isRangeSelection,
	$isTextNode,
	type LexicalNode,
	type BaseSelection,
	type LexicalEditor,
} from 'ui.lexical.core';

import { $isTableSelection } from 'ui.lexical.table';
import { NON_SINGLE_WIDTH_CHARS_REGEX, SYMBOLS } from './constants';
import { printNode } from './print-node';
import { printNodeSelection } from './print-node-selection';
import { printRangeSelection } from './print-range-selection';
import { printTableSelection } from './print-table-selection';
import { visitTree } from './visit-tree';

import { type TextEditor } from '../text-editor';

export function generateContent(editor: TextEditor | LexicalEditor): string
{
	const editorState = editor.getEditorState();

	// if (exportDOM)
	// {
	// 	let htmlString = '';
	// 	editorState.read(() => {
	// 		htmlString = printPrettyHTML($generateHtmlFromNodes(editor));
	// 	});
	// 	return htmlString;
	// }

	let res = ' root\n';

	const selectionString = editorState.read(() => {
		const selection = $getSelection();
		visitTree($getRoot(), (node: LexicalNode, indent: Array<string>) => {
			const nodeKey = node.getKey();
			const nodeKeyDisplay = `(${nodeKey})`;
			const typeDisplay = node.getType() || '';
			const isSelected = node.isSelected();

			res += `${isSelected ? SYMBOLS.selectedLine : ' '} ${indent.join(
				' ',
			)} ${nodeKeyDisplay} ${typeDisplay} ${printNode(node)}\n`;

			res += printSelectedCharsLine({
				indent,
				isSelected,
				node,
				nodeKeyDisplay,
				selection,
				typeDisplay,
			});
		});

		if (selection === null)
		{
			return ': null';
		}

		if ($isRangeSelection(selection))
		{
			return printRangeSelection(selection);
		}

		if ($isTableSelection(selection))
		{
			return printTableSelection(selection);
		}

		return printNodeSelection(selection);
	});

	res += `\n selection${selectionString}`;

	return res;
}

function printSelectedCharsLine({
	indent,
	isSelected,
	node,
	nodeKeyDisplay,
	selection,
	typeDisplay,
}: {
	indent: Array<string>;
	isSelected: boolean;
	node: LexicalNode;
	nodeKeyDisplay: string;
	selection: BaseSelection | null;
	typeDisplay: string;
}): string
{
	// No selection or node is not selected.
	if (
		!$isTextNode(node)
		|| !$isRangeSelection(selection)
		|| !isSelected
		|| $isElementNode(node)
	)
	{
		return '';
	}

	// No selected characters.
	const anchor = selection.anchor;
	const focus = selection.focus;

	if (
		node.getTextContent() === ''
		|| (anchor.getNode() === selection.focus.getNode()
			&& anchor.offset === focus.offset)
	)
	{
		return '';
	}

	const [start, end] = $getSelectionStartEnd(node, selection);

	if (start === end)
	{
		return '';
	}

	const selectionLastIndent = (
		indent[indent.length - 1] === SYMBOLS.hasNextSibling
			? SYMBOLS.ancestorHasNextSibling
			: SYMBOLS.ancestorIsLastChild
	);

	const indentionChars = [...indent.slice(0, -1), selectionLastIndent];
	const unselectedChars = Array.from({ length: start + 1 }).fill(' ');
	const selectedChars = Array.from({ length: end - start }).fill(SYMBOLS.selectedChar);
	const paddingLength = typeDisplay.length + 3; // 2 for the spaces around + 1 for the double quote.
	const nodePrintSpaces = Array.from({ length: nodeKeyDisplay.length + paddingLength }).fill(' ');

	return (
		`${[
			SYMBOLS.selectedLine,
			indentionChars.join(' '),
			[...nodePrintSpaces, ...unselectedChars, ...selectedChars].join(''),
		].join(' ')}\n`
	);
}

function $getSelectionStartEnd(node: LexicalNode, selection: BaseSelection): [number, number]
{
	const anchorAndFocus = selection.getStartEndPoints();
	if ($isNodeSelection(selection) || anchorAndFocus === null)
	{
		return [-1, -1];
	}

	const [anchor, focus] = anchorAndFocus;
	const textContent = node.getTextContent();
	const textLength = textContent.length;

	let start = -1;
	let end = -1;

	// Only one node is being selected.
	if (anchor.type === 'text' && focus.type === 'text')
	{
		const anchorNode = anchor.getNode();
		const focusNode = focus.getNode();

		if (
			anchorNode === focusNode
			&& node === anchorNode
			&& anchor.offset !== focus.offset
		)
		{
			[start, end] = (
				anchor.offset < focus.offset
					? [anchor.offset, focus.offset]
					: [focus.offset, anchor.offset]
			);
		}
		else if (node === anchorNode)
		{
			[start, end] = anchorNode.isBefore(focusNode)
				? [anchor.offset, textLength]
				: [0, anchor.offset];
		}
		else if (node === focusNode)
		{
			[start, end] = focusNode.isBefore(anchorNode)
				? [focus.offset, textLength]
				: [0, focus.offset];
		}
		else
		{
			// Node is within selection but not the anchor nor focus.
			[start, end] = [0, textLength];
		}
	}

	// Account for non-single width characters.
	const numNonSingleWidthCharBeforeSelection = (
		textContent.slice(0, start).match(NON_SINGLE_WIDTH_CHARS_REGEX) || []
	).length;
	const numNonSingleWidthCharInSelection = (
		textContent.slice(start, end).match(NON_SINGLE_WIDTH_CHARS_REGEX) || []
	).length;

	return [
		start + numNonSingleWidthCharBeforeSelection,
		end + numNonSingleWidthCharBeforeSelection + numNonSingleWidthCharInSelection,
	];
}

Youez - 2016 - github.com/yon3zu
LinuXploit