# Python Rutext: русскоязычный генератор текста

## Введение

Данный проект был вдохновлён одним любительским локальным Discord-ботом. В него добавили новую функцию, генерирующую случайные истории, используя шаблоны текста и случайные вставки.

Получился забавный модуль, но не без недостатков. Так что я захотел сделать свою версию, чтобы если что, помочь таким образом реализовать какие-то фишки, которые предложил я. 🤔

## Что реализовано

1. Ручной ввод форм;
2. Отсеивание избыточных форм;
3. Относительный формат слов (на основе базы и формата строится форма), позволяющий сократить занимаемую память;
4. Ввод/вывод в YAML (используя кэш, достигается минимум затрат в плане заливов на диск); при этом разработчик может использовать собственный I/O;
5. Ссылки на уже определённые слова, что позволяет дополнительно сжимать YAML и сохранить нервы пользователям.

## Чего не хватает

1. Шаблоны текстов;
2. Отказоустойчивость;
3. Discord API;
4. Использование Redis вместо YAML.

## Использование

Точка входа: `pyrutext.py`.

Программой предлагается сначала ввести новые слова в список, а затем через *теги*, ограничивая диапазон слов и используя *формы*, добывается необходимое слово.

**Ссылки** – теги, начинающиеся с `&` и отсылающие к уже определённым словам. Ссылка может быть только одна. Если других тегов нет, они берутся из слова-отсылки, и наоборот: теги по ссылке не извлекаются (а только формы), если пользователь определил другие.

Примеры вводов:
- `ЭСТ сущ. абр ж.р.`
- `любить гл. несов.`
- `очки сущ. безл. неодуш. мн.ч.`
- `хорошо нар. сост.`
- `ремонт сущ. м.р. ед.ч.`
- `ступор &ремонт`

Формы могут быть указаны через *относительный формат*.
* Если ввод начинается с `-`, от слова в конце отнимается окончание; остальной ввод добавляется в конец слова.
  * Число минусов `-` в начале указывает на то, сколько букв будет отнято у окончания.
  * Примеры: `'мирный', '--ая' > 'мирная'`; `'любить', '-' > 'любит'`.
* Если ввод начинается с `+`, оригинальное слово вставляется целиком; остальной ввод добавляется в конец слова.
  * Примеры: `'буква', '+' > 'буква'`; `'буква', '+ми' > 'буквами'`.
* Если ввод заканчивается на `+`, оригинальное слово вставляется целиком; остальной ввод добавляется в *начало* слова.
  * Примеры: `'лить', 'будешь +' > 'будешь лить'`.

В модуле определены следующие части речи:
* **Глагол:** `гл. {несов.|сов.} [1л|2л|3л] [п.в.|н.в.|б.в.] [ед.ч.|мн.ч.] [м.р.|ж.р.|с.р.] [пов.] [инф.]`
* **Прилагательное:** `пр. [ед.ч.|мн.ч.] [м.р.|ж.р.|с.р.] [и.п.|р.п.|д.п.|в.п.|т.п.|п.п.] [одуш.|неодуш.]`
* **Существительное:** `сущ. {м.р.|ж.р.|с.р.|безл.} (ед.ч.|мн.ч.) (нескл.) (абр) (пинг) (перс) [и.п.|р.п.|д.п.|в.п.|т.п.|п.п.] [ед.ч.|мн.ч.]`

В фигурных скобках – обязательные теги, в круглых – необязательные. В квадратных скобках – формы, которые не влияют на подбор слов. Порядок можно менять.

Для остальных (неизменяемых) частей речи (как наречия) форм нет, однако требуется указывать как минимум один тег: например, `хорошо нар.`

Тег может быть *любым*, но крайне желательно использовать уже существующие категории.