Metadata-Version: 2.1
Name: pyrutext
Version: 0.7.0
Summary: A Russian text generator based on templating texts and word picking
Author-email: Belreau Cohen <nuu.chah.nulth@disroot.org>
Description-Content-Type: text/markdown
Classifier: License :: OSI Approved :: MIT License
Requires-Dist: pyyaml ~=6.0
Project-URL: Home, https://github.com/Belstowe/py-rutext.git

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

## Введение

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

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

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

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

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

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

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

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

### Ввод слов

Программой предлагается сначала ввести новые слова в список.

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

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

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

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

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

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

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

### Ввод текстов

Когда Вы закончите вводить слова, просто нажмите Enter. Вы перейдёте к следующему этапу *ввода текстов*. Вводимый текст заканчивается на пустой строке. Чтобы выйти из этого этапа, нажмите Enter в начале.

Пример простого текста-шаблона:
```
Привет, я съел --сущ. в.п.--.
```

Пример текста-шаблона с запоминанием вставок:
```
1=сущ. еда
2 = сущ. юзер
\
Привет, --2--. Я съел --1 в.п.--.
А тебе, -- 2 д.п. --, ничего не досталось.
```
Т.е. указатели на слова через синтаксис `{id} = {tag1 tag2 ...}` вводятся перед знаком `\`, а внутри текста эти указатели вставляются через выражение `--{id} {form1 form2 ...}--`.
