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/smiley/src/ |
Upload File : |
import { TextParser, isDelimiter, TokenTree } from 'ui.text-parser'; import { type Smiley } from './smiley'; export class SmileyParser { #splitOffsets: Array<{ start: number, end: number }> = []; #tokenTree: TokenTree = null; #textParser: TextParser = null; constructor(smileys: Smiley[]) { this.#tokenTree = new TokenTree(); smileys.forEach((smiley: Smiley) => { this.#tokenTree.addToken(smiley.getTyping()); }); } parse(text: string): Array<{ start: number, end: number }> { this.#splitOffsets = []; this.#textParser = new TextParser(text); while (this.#textParser.hasNext()) { let success = false; success = success || this.#parseEmoji(); success = success || this.#parseSmileys(); success = success || this.#textParser.consumeText(); } return this.#splitOffsets; } #parseSmileys(): boolean { if (this.#isWordBoundary()) { return this.#textParser.tryChangePosition(() => { const currentPosition = this.#textParser.getCurrentPosition(); if (this.#consumeSmiley() && this.#isNextWordBoundary()) { this.#splitOffsets.push({ start: currentPosition, end: this.#textParser.getCurrentPosition(), }); this.#textParser.flushText(); return true; } return false; }); } return false; } #consumeSmiley(): boolean { return this.#textParser.consumeTree(this.#tokenTree.getTreeIndex()); } #isWordBoundary(): boolean { if (!this.#textParser.hasPendingText()) { const last = this.#splitOffsets.at(-1); if (last && last.end === this.#textParser.getCurrentPosition()) { return true; } } return this.#textParser.isWordBoundary(); } #isNextWordBoundary(): boolean { let isSmileyNext = false; this.#textParser.tryChangePosition(() => { if (this.#consumeSmiley()) { isSmileyNext = true; } return false; }); if (isSmileyNext) { return true; } return isDelimiter(this.#textParser.peek()); } #parseEmoji(): boolean { return false; } }