UNPKG

umbot

Version:

Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф

269 lines (268 loc) 11.1 kB
/** * Модуль для работы с текстом * * Предоставляет набор утилит для: * - Обработки и форматирования текста * - Поиска совпадений в тексте * - Проверки схожести текстов * - Работы с окончаниями слов */ import { TPatternRegExp as PatternItem } from './RegExp'; /** * Тип для поиска совпадений в тексте. * Может быть строкой или массивом строк. * * @example * ```ts * const pattern: TPattern = 'привет'; * const patterns: TPattern = ['привет', 'здравствуйте']; * ``` */ export type TPattern = string | readonly string[]; /** * Тип для поиска совпадений в тексте с учетом регулярных выражений. * Может быть строкой или массивом строк. * * @example * ```ts * const pattern: TPattern = /привет/; * const patterns: TPattern = ['привет', /здравствуйте/]; * ``` */ export type TPatternReg = PatternItem | readonly PatternItem[]; /** * Интерфейс результата проверки схожести текстов * * @example * ```ts * const result: ITextSimilarity = { * status: true, * index: 0, * percent: 100, * text: 'привет' * }; * ``` */ export interface ITextSimilarity { /** * Статус успешности сравнения текстов * true - если процент схожести превышает пороговое значение */ status: boolean; /** * Индекс совпавшего текста в массиве или null для строки. * Используется при сравнении с массивом текстов */ index: number | null; /** * Процент схожести текстов (от 0 до 100) * 100% означает полное совпадение */ percent: number; /** * Совпавший текст или null, если совпадений нет. * Содержит оригинальный текст из массива сравнения */ text?: string | null; } /** * Класс для работы с текстом и текстовыми операциями * * @remarks * Класс предоставляет статические методы для: * - Обрезки текста * - Проверки URL * - Определения согласия/отрицания * - Поиска совпадений * - Работы с окончаниями слов * - Проверки схожести текстов * * @example * ```ts * // Обрезка текста * Text.resize('Длинный текст', 5); // -> 'Длин...' * * // Проверка URL * Text.isUrl('http://localhost'); // -> true * * // Определение согласия * Text.isSayTrue('да, согласен'); // -> true * * // Поиск совпадений * Text.isSayText(['привет', 'здравствуйте'], 'привет мир'); // -> true * * // Работа с окончаниями * Text.getEnding(5, ['яблоко', 'яблока', 'яблок']); // -> 'яблок' * * // Проверка схожести * Text.textSimilarity('привет', 'привт', 80); // -> { status: true, percent: 90, ... } * ``` */ export declare class Text { #private; /** * Обрезает текст до указанной длины * * @param {string | null} text - Исходный текст * @param {number} [size=950] - Максимальная длина результата * @param {boolean} [isEllipsis=true] - Добавлять ли многоточие в конце * @returns {string} Обрезанный текст * * @example * ```ts * Text.resize('Длинный текст', 6); // -> 'Дли...' * Text.resize('Длинный текст', 6, false); // -> 'Длинны' * ``` */ static resize(text: string | null, size?: number, isEllipsis?: boolean): string; /** * Проверяет, является ли строка URL-адресом * * @param {string} link - Проверяемая строка * @returns {boolean} true, если строка является URL-адресом * * @example * ```ts * Text.isUrl('http://localhost'); // -> true * Text.isUrl('не url'); // -> false * ``` */ static isUrl(link: string): boolean; /** * Определяет наличие в тексте согласия пользователя * * @param {string} text - Проверяемый текст * @returns {boolean} true, если найдено подтверждение * * @remarks * Распознает следующие паттерны: * - "да" * - "конечно" * - "согласен"/"согласна" * - "подтверждаю"/"подтверждаю" * * @example * ```ts * Text.isSayTrue('да, согласен'); // -> true * Text.isSayTrue('нет, не согласен'); // -> false * ``` */ static isSayTrue(text: string): boolean; /** * Определяет наличие в тексте отрицания пользователя * * @param {string} text - Проверяемый текст * @returns {boolean} true, если найдено отрицание * * @remarks * Распознает следующие паттерны: * - "нет" * - "неа" * - "не" * * @example * ```ts * Text.isSayFalse('нет, не хочу'); // -> true * Text.isSayFalse('да, хочу'); // -> false * ``` */ static isSayFalse(text: string): boolean; /** * Проверяет наличие совпадений в тексте * * @param {TPatternReg} find - Искомый текст или массив текстов * @param {string} text - Исходный текст для поиска * @param {boolean} [isPattern=false] - Использовать ли регулярные выражения * @param {boolean} [useDirectRegExp=false] - Использовать исходные RegExp напрямую без нормализации и кэширования. Стоит использовать только в крайних случаях. * @param {RegExpConstructor} [customReg=undefined] - Произвольная реализация для обработки регулярных выражений * @returns {boolean} true, если найдено совпадение * * @example * ```ts * // Поиск подстроки * Text.isSayText('привет', 'привет мир'); // -> true * * // Поиск одной из подстрок * Text.isSayText(['привет', 'здравствуйте'], 'привет мир'); // -> true * * // Поиск по регулярному выражению * Text.isSayText(['\\bпривет\\b', '\\bмир\\b'], 'привет мир', true); // -> true * ``` */ static isSayText(find: TPatternReg, text: string, isPattern?: boolean, useDirectRegExp?: boolean, customReg?: RegExpConstructor | undefined): boolean; /** * Очищает кэш регулярных выражений. * Стоит вызывать только в крайних случаях */ static clearCache(): void; /** * Возвращает случайную строку из массива или исходную строку * * @param {TPattern} str - Строка или массив строк * @returns {string} Выбранная строка * * @example * ```ts * Text.getText('привет'); // -> 'привет' * Text.getText(['привет', 'здравствуйте']); // -> случайная строка из массива * ``` */ static getText(str?: TPattern): string; /** * Заменяет ключ в тексте на значение * @param {string} key - Ключ для замены * @param {string | string[]} value - Значение для замены * @param {string} text - Исходный текст */ static textReplace(key: string, value: string | string[], text: string): string; /** * Возвращает правильное окончание слова в зависимости от числа * * @param {number} num - Число для определения окончания * @param {readonly string[]} titles - Варианты окончаний ['один', 'два-четыре', 'пять-десять'] * @param {number | null} [index=null] - Принудительный индекс варианта окончания * @returns {string | null} Выбранное окончание или null, если не найдено * * @example * ```ts * const titles = ['яблоко', 'яблока', 'яблок']; * Text.getEnding(1, titles); // -> 'яблоко' * Text.getEnding(2, titles); // -> 'яблока' * Text.getEnding(5, titles); // -> 'яблок' * * // Принудительный выбор формы * Text.getEnding(5, titles, 0); // -> 'яблоко' * ``` */ static getEnding(num: number, titles: readonly string[], index?: number | null): string | null; /** * Проверяет схожесть текстов и возвращает результат сравнения * * @param {string} origText - Оригинальный текст для сравнения * @param {TPattern} compareText - Текст или массив текстов для сравнения * @param {number} [threshold=80] - Минимальный процент схожести для положительного результата * @returns {ITextSimilarity} Результат сравнения текстов * * @example * ```ts * // Сравнение с одним текстом * Text.textSimilarity('привет', 'привт', 80); * // -> { * // status: true, * // index: 0, * // percent: 90, * // text: 'привт' * // } * * // Сравнение с массивом текстов * Text.textSimilarity('привет', ['привт', 'здравствуйте'], 80); * // -> { * // status: true, * // index: 0, * // percent: 90, * // text: 'привт' * // } * ``` */ static textSimilarity(origText: string, compareText: TPattern, threshold?: number): ITextSimilarity; }