umbot
Version:
Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф
269 lines (268 loc) • 11.1 kB
TypeScript
/**
* Модуль для работы с текстом
*
* Предоставляет набор утилит для:
* - Обработки и форматирования текста
* - Поиска совпадений в тексте
* - Проверки схожести текстов
* - Работы с окончаниями слов
*/
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;
}