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/bbcode/model/src/scheme/ |
Upload File : |
import { Type } from 'main.core'; import type { BBCodeToStringOptions } from '../nodes/root-node'; import { BBCodeScheme } from './bbcode-scheme'; import { BBCodeTagScheme } from './node-schemes/tag-scheme'; import { type BBCodeContentNode, BBCodeNode } from '../nodes/node'; import { typeof BBCodeElementNode } from '../nodes/element-node'; import type { BBCodeSchemeOptions } from './bbcode-scheme'; export type DefaultBBCodeSchemeOptions = BBCodeSchemeOptions & { fileTag: 'disk' | 'file' | 'none', }; export class DefaultBBCodeScheme extends BBCodeScheme { constructor(options: DefaultBBCodeSchemeOptions = {}) { const tagSchemes = [ new BBCodeTagScheme({ name: ['b', 'u', 'i', 's'], group: ['#inline', '#format'], allowedChildren: ['#text', '#linebreak', '#inline'], canBeEmpty: false, }), new BBCodeTagScheme({ name: ['img'], group: ['#inlineBlock'], allowedChildren: ['#text'], canBeEmpty: false, }), new BBCodeTagScheme({ name: ['url'], group: ['#inline'], allowedChildren: ['#text', '#format', 'img'], canBeEmpty: false, stringify(node: BBCodeElementNode): BBCodeElementNode { const openingTag = node.getOpeningTag(); const closingTag = node.getClosingTag(); const content = node.getContent(); return `${openingTag}${content}${closingTag}`; }, }), new BBCodeTagScheme({ name: 'p', group: ['#block'], allowedChildren: ['#text', '#linebreak', '#inline', '#inlineBlock'], stringify: BBCodeTagScheme.defaultBlockStringifier, onParse: BBCodeTagScheme.defaultOnBlockParseHandler, allowedIn: ['#root', '#shadowRoot'], }), new BBCodeTagScheme({ name: 'list', group: ['#block'], allowedChildren: ['*'], stringify: BBCodeTagScheme.defaultBlockStringifier, onParse: BBCodeTagScheme.defaultOnBlockParseHandler, allowedIn: ['#root', '#shadowRoot'], canBeEmpty: false, onNotAllowedChildren: ({ node, children }): BBCodeElementNode => { const notAllowedChildren: Set<string> = new Set(['#tab', '#linebreak']); const bePropagated: Array<BBCodeContentNode> = []; children.forEach((child: BBCodeContentNode) => { if ( notAllowedChildren.has(child.getName()) || ( child.getName() === '#text' && /^\s+$/.test(child.getContent()) ) ) { child.remove(); } else { bePropagated.push(child); } }); node.propagateChild(...bePropagated); }, }), new BBCodeTagScheme({ name: ['*'], allowedChildren: ['#text', '#linebreak', '#inline', '#inlineBlock'], stringify: (node: BBCodeElementNode, scheme: BBCodeScheme, toStringOptions: BBCodeToStringOptions) => { const openingTag: string = node.getOpeningTag(); const content: string = node.getContent(toStringOptions).trim(); return `${openingTag}${content}`; }, allowedIn: ['list'], onNotAllowedChildren: ({ node, children }): BBCodeElementNode => { const bePropagated: Array<BBCodeContentNode> = []; children.forEach((child: BBCodeContentNode) => { if (child.getName() === '#tab') { child.remove(); } else { bePropagated.push(child); } }); node.propagateChild(...bePropagated); }, }), new BBCodeTagScheme({ name: 'table', group: ['#block'], allowedChildren: ['tr'], stringify: BBCodeTagScheme.defaultBlockStringifier, onParse: BBCodeTagScheme.defaultOnBlockParseHandler, allowedIn: ['#root', 'td', 'th', 'quote', 'spoiler'], canBeEmpty: false, }), new BBCodeTagScheme({ name: 'tr', allowedChildren: ['th', 'td'], allowedIn: ['table'], canBeEmpty: false, }), new BBCodeTagScheme({ name: ['th', 'td'], group: ['#shadowRoot'], allowedChildren: ['#text', '#linebreak', '#inline', '#inlineBlock', '#block'], allowedIn: ['tr'], }), new BBCodeTagScheme({ name: 'quote', group: ['#block', '#shadowRoot'], allowedChildren: ['#text', '#linebreak', '#inline', '#inlineBlock', '#block'], allowedIn: ['#root', '#shadowRoot'], }), new BBCodeTagScheme({ name: 'code', group: ['#block'], stringify: BBCodeTagScheme.defaultBlockStringifier, onParse: BBCodeTagScheme.defaultOnBlockParseHandler, allowedChildren: ['#text', '#linebreak', '#tab'], allowedIn: ['#root', '#shadowRoot'], convertChild: ( child: BBCodeContentNode, scheme: BBCodeScheme, toStringOptions: BBCodeToStringOptions, ): BBCodeContentNode => { if (['#linebreak', '#tab', '#text'].includes(child.getName())) { return child; } return scheme.createText(child.toString(toStringOptions)); }, }), new BBCodeTagScheme({ name: 'video', group: ['#inlineBlock'], allowedChildren: ['#text'], allowedIn: ['#root', '#shadowRoot', 'p'], canBeEmpty: false, }), new BBCodeTagScheme({ name: 'spoiler', group: ['#block', '#shadowRoot'], allowedChildren: ['#text', '#linebreak', '#inline', '#inlineBlock', '#block'], allowedIn: ['#root', '#shadowRoot'], }), new BBCodeTagScheme({ name: ['user', 'project', 'department'], group: ['#inline', '#mention'], allowedChildren: ['#text', '#format'], canBeEmpty: false, }), new BBCodeTagScheme({ name: ['#root'], }), new BBCodeTagScheme({ name: ['#fragment'], }), new BBCodeTagScheme({ name: ['#text'], }), new BBCodeTagScheme({ name: ['#linebreak'], }), new BBCodeTagScheme({ name: ['#tab'], stringify: () => { return ''; }, }), ]; if (options?.fileTag !== 'none') { tagSchemes.push( new BBCodeTagScheme({ name: options?.fileTag === 'file' ? 'file' : 'disk', group: ['#inline'], void: true, }), ); } super({ tagSchemes, outputTagCase: BBCodeScheme.Case.LOWER, unresolvedNodesHoisting: true, }); if (Type.isPlainObject(options)) { this.setTagSchemes(options.tagSchemes); this.setOutputTagCase(options.outputTagCase); this.setUnresolvedNodesHoisting(options.unresolvedNodesHoisting); } } }