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

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/ui/text-editor/src/bbcode/export-to-bbcode.js
/* eslint-disable @bitrix24/bitrix24-rules/no-native-dom-methods */

import { Type } from 'main.core';
import type {
	BBCodeScheme,
	BBCodeRootNode,
	BBCodeFragmentNode,
	BBCodeTextNode,
} from 'ui.bbcode.model';

import { TextEditor } from 'ui.text-editor';

import {
	$isElementNode,
	$isTextNode,
	$isLineBreakNode,
	$isTabNode,
	type LexicalNode, ElementNode,
} from 'ui.lexical.core';

import { trimEmptyParagraphs } from './trim-empty-paragraphs';

import type { BBCodeExportOutput, BBCodeExportMap, BBCodeExportFn } from './types';

export function $exportToBBCode(lexicalNode: LexicalNode | ElementNode, editor: TextEditor): BBCodeRootNode
{
	const scheme: BBCodeScheme = editor.getBBCodeScheme();
	const root: BBCodeRootNode = scheme.createRoot();
	const topLevelChildren = trimEmptyParagraphs(lexicalNode.getChildren());

	for (const topLevelNode of topLevelChildren)
	{
		$appendNodesToBBCode(topLevelNode, root, editor);
		// root.appendChild(scheme.createNewLine());
	}

	return root;
}

function $appendNodesToBBCode(currentNode: LexicalNode | ElementNode, parentNode: Node, editor: TextEditor): void
{
	const { node, after }: BBCodeExportOutput = getExportFunction(currentNode, editor);
	if (!node)
	{
		return;
	}

	const scheme: BBCodeScheme = editor.getBBCodeScheme();
	const fragment: BBCodeFragmentNode = scheme.createFragment();
	const children = $isElementNode(currentNode) ? currentNode.getChildren() : [];
	for (const childNode of children)
	{
		$appendNodesToBBCode(childNode, fragment, editor);
	}

	node.appendChild(fragment);
	parentNode.appendChild(node);

	if (Type.isFunction(after))
	{
		const newElement = after.call(currentNode, node);
		if (newElement)
		{
			node.getParent().replaceChild(node, newElement);
		}
	}
}

const formats = [
	'bold',
	'italic',
	'strikethrough',
	'underline',
];

function getExportFunction(lexicalNode: LexicalNode, editor: TextEditor): BBCodeExportOutput
{
	const type = lexicalNode.getType();
	const exportMap: BBCodeExportMap = editor.getBBCodeExportMap();
	const exportFn: BBCodeExportFn = exportMap.get(type);
	if (Type.isFunction(exportFn))
	{
		return exportFn(lexicalNode);
	}

	const scheme: BBCodeScheme = editor.getBBCodeScheme();
	if ($isTextNode(lexicalNode) && lexicalNode.getType() === 'text')
	{
		const node: BBCodeTextNode = scheme.createText({
			encode: false,
			content: lexicalNode.getTextContent(),
		});

		if (lexicalNode.getFormat() === 0)
		{
			return { node };
		}

		let currentNode: BBCodeTextNode = node;
		formats.forEach((format: string): void => {
			const formatFn: BBCodeExportFn = exportMap.get(`text:${format}`);
			if (Type.isFunction(formatFn))
			{
				currentNode = formatFn(lexicalNode, currentNode) || currentNode;
			}
		});

		return {
			node: currentNode,
		};
	}

	if ($isLineBreakNode(lexicalNode))
	{
		return {
			node: scheme.createNewLine(),
		};
	}

	if ($isTabNode(lexicalNode))
	{
		return {
			node: scheme.createTab(),
		};
	}

	if ($isTextNode(lexicalNode) || $isElementNode(lexicalNode))
	{
		const node: BBCodeTextNode = scheme.createText({
			encode: false,
			content: lexicalNode.getTextContent(),
		});

		return { node };
	}

	return { node: null };
}

Youez - 2016 - github.com/yon3zu
LinuXploit