ТОМ2 - платформа для парсерных игр

Объявление

Открыт сайт tom2-game.ru.


Последнюю версию платформы можно скачать здесь.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Плагин - Генератор лексем

Сообщений 1 страница 30 из 70

1

Появился плагин, который должен самостоятельно генерировать лексемы. Но в связи с практически полным отсутствием свободного времени он делался крайне некачественно и сейчас выглядит больше как пробная болванка для тестирования системы плагинов ТОМ, чем генератора. В нормальных условиях я бы и не подумал выкладывать его, но сейчас я не уверен даже, что он запустится у других. Поэтому прошу, если у кого есть свободное время и трафик, протестировать плагин на корректный запуск и выгрузку. Даже у меня модуль генерации лексем не всегда корректно загружается (ни как не могу найти причину, больше похоже на проблемы с железом). Если у других будет загружаться нормально, то можно продолжить корректировать генерацию, иначе надо будет искать проблему с загрузкой.
Вот плагин, но он довольно редко правильно генерирует лексемы. Главное, что нужно проверить: при запуске ТОМа должно появляться окно "Загружено". При закрытии - "Выгружено". А так-же во время работы есть функции: "гл" и "gl", которые значат одно и то-же и генерируют лексему. Т.е. если набрать "гл ложка", то он сгенерирует лексему для ложки (ну или попытается сгенерировать). Пока есть только один шаблон "сущ" и функция автоопределения шаблона не сделана, поэтому даже добавление других шаблонов не изменит погоду - всегда будет использоваться "сущ" для генерации существительных.
А сейчас о размере: плагин сейчас очень много весит. Даже сама dll занимает больше мегабайта, что очень сурово для плагина. Но это временно, dll можно уменьшить, а вот словарь навряд-ли.
В связи с небольшими модификациями модуля генератор довольно долго грузится (около 2х секунд), поэтому ТОМ при запуске может ненадолго входить в ступор.
Если плагин пройдёт тесты на других компьютерах и будет свободное время, то вскоре возможно будет писать лексемы совсем по иному:

Код:
// Без применения плагина:
title = "ви%;; МрЕч3лНв;
    МрЕчПв=дел;   ЖрЕчПв=дела;   СрЕчПв=дело; МчПв=дели; //прошедшее время
    ТыЕч1лНв=жу;  ТыЕч2лНв=дишь; ТыЕч3лНв=дит; //настоящее время на ты
    ВыЕч1лНв=жу;  ВыЕч2лНв=дите; ВыЕч3лНв=дит; //настоящее время на вы
    МыЕч1лНв=дим; МыЕч2лНв=дите; МыЕч3лНв=дят; //настоящее время на мы
    Мч1лНв=дим;   Мч2лНв=дите;   Мч3лНв=дят;"
// То-же самое с плагином:
title = gl("видел")

// Без плагина:
title = "обычн%; Пи; МрЕчИп;
    МрЕчИп=ый; МрЕчРп=ого; МрЕчДп=ому; МрЕчВпОд=ого; МрЕчВпНд=ый; МрЕчТп=ым; МрЕчПп=ом;
    ЖрЕчИп=ая; ЖрЕчРп=ой;  ЖрЕчДп=ой;         ЖрЕчВп=ую;          ЖрЕчТп=ой; ЖрЕчПп=ой;
    СрЕчИп=ое; СрЕчРп=ого; СрЕчДп=ому;        СрЕчВп=ое;          СрЕчТп=ым; СрЕчПп=ом;
    МчИп=ые;   МчРп=ых;    МчДп=ым;    МчВпОд=ых;    МчВпНд=ые;   МчТп=ыми;  МчПп=ых;"
// С плагином:
title = гл("обычный")

// И ещё примерчик:
title="мышин% домик%; НдЕчМр; Ип; Ип=ый,; Рп=ого,а; Дп=ому,у; Вп=ый,; Тп=ым,ом; Пп=ом,е"

title = гл("мышиный домик")

ПыЗы: ещё технический вопросик. Ведь строки, которые передаются из плагина в tom.dll - это ведь всего-лишь указатели на строки. А кто должен выгружать их из памяти? Это делается на стороне ТОМа? Не происходит ли тут утечек памяти?

2

Если положить в папку plugins, то не запускается, выдаёт ошибки и ругается на невозможность загрузить dic.dat.
Если положить рядом с tom.dll то запускается без ошибок, показывает "Загружено", при закрытии - "Выгружено". Но при закрытии выдаёт ошибку.
Функция gl работает!

3

Alexandr написал(а):

ПыЗы: ещё технический вопросик. Ведь строки, которые передаются из плагина в tom.dll - это ведь всего-лишь указатели на строки. А кто должен выгружать их из памяти? Это делается на стороне ТОМа? Не происходит ли тут утечек памяти?

Нет, ТОМ ничего не удаляет, т.к. не знает природу переданного указателя - это же может быть и константа, и глобальный символьный массив, совсем не обязательно куча.
Если плагин выделяет память в куче под строку то и удалять ее он должен самостоятельно - при следующем вызове функции или при выгрузке плагина.

4

ASBer написал(а):

Но при закрытии выдаёт ошибку.

А как выглядит эта ошибка?

ASBer написал(а):

Если плагин выделяет память в куче под строку то и удалять ее он должен самостоятельно - при следующем вызове функции или при выгрузке плагина.

Будет сделано. :blush:

5

Alexandr написал(а):

А как выглядит эта ошибка?

Вот так:

6

Alexandr написал(а):

А как выглядит эта ошибка?

Отбой, это ошибка от плагина speech.plg.dll - я с ней сейчас разбираюсь.
Извиняюсь, что ввел в заблуждение.  :dontknow:

7

Версия 0.7
Словарь к плагину (отдельно, потому-что редко меняется, а вкладывать почти 2 Мб в каждую версию плагина как-то не круто)

Описывать не буду, т.к. всё-равно всем пофиг.

8

Не запускается :(
Видимо dll плагина скомпилирована в отладочном режиме...

9

o.O Действительно! Скомпилирована в релизном режиме, но вот менеджер памяти отключить забыл. Торопился в час ночи. Прошу прощения.
Перезалил (прежняя ссылка). 2 раза проверил, потом залил, скачал и опять перепроверил. Должно работать. :) Если не работает, пните меня за криворукость. :canthearyou:

Кстати, он реально за 2 секунды начал загружаться. Неужели менеджер памяти так процессор кушает. :|

10

Супер! Всё работает! Код действительно стал меньше и без "страшных" для "новичков" лексем  :D

Alexandr написал(а):

Описывать не буду, т.к. всё-равно всем пофиг.

Ну мне и так по коду всё понятно, а для других всё-же лучше описать :)

11

ASBer написал(а):

Всё работает!

Ну это на первый взгляд. На самом деле есть ещё узкие места, но о них ниже.

ASBer написал(а):

для других всё-же лучше описать

Напишу о сделанных изменениях. Первым изменением было вычёркивание задумки с шаблонами (файл Шаблоны.txt). Они требовали хорошего продумывания и сложной реализации плагина. А плюсы от них - только гибкость без перекомпиляции плагина. Но т.к. вряд-ли кто-нибудь кроме меня стал бы добавлять или расширять функциональность плагина редактированием файла шаблонов, то зачем же всё усложнять? Сейчас вся генерация жёстко зашита в dll.
Вторым изменением было разделение всего кода на 2 части: генерация отдельных слов и генерация словосочетаний. Блин... опять я ухожу в подробности. Пропустим.
В-третьих было добавлено много всяких мелочей: сохранение регистра слов, нечувствительность к знакам препинания, загрузка из папки plugins и др.

А сейчас об основной проблеме: некоторые лексемы не генерируются из-за неоднозначности слов. Яркими примерами могут послужить глагол "стоит" и существительное "кошка". В первом примере неоднозначность в ударении "он стоит в углу" и "эта машина стоит дорого". В зависимости от смысла лексемы получаются совершенно разные. Во втором примере безобидная кошка может быть "пушистой кошкой" и "кошкой - приспособлением для лазания по столбам". Хоть лексемы и получаются совершенно одинаковыми, но одушевлённость же разная (да-да, плагин ведь автоматом подставляет одушевлённость существительного в постоянные свойства, если вы не заметили). Вот такие пироги. Хочу решить эту проблему задействованием дополнительного параметра (сейчас он понимает только "инфинитив") для разрешения таких спорных ситуаций. Например, как-нибудь так:

Код:
агл("стоит", "Пв=стоял")
агл("кошка", "Од")

Ещё одна "проблемка" - плагин генерирует избыточную лексему: вместо окончаний подставляются все слова полностью, вместо нужных морфкодов подставляются все морфкоды (даже присутствующие в постоянных свойствах лексемы). Но я так понял, что на это ТОМу категорически наплевать. :yep:

И ещё вопросик по доработке: нужно ли подставлять ударения ко всем генерируемым лексемам?

12

Ах да, на счёт размера. Уменьшить размер плагина оказалось не так просто. Лично я всегда задумывался о размере программы в последнюю очередь, т.к. в наш век не считаю это проблемой. Но факт, что этот плагин весит в 3,5 раза больше, чем сам ТОМ, немного смущает. Если кто-то против, то прошу высказывать здесь и сейчас, иначе оставляем всё как есть и больше не трогаем размер.

В конце концов, есть задумка сделать некий компилятор, который будет автоматически "откреплять" плагин перед релизом квеста. Но это в долгосрочных планах.

13

Alexandr написал(а):

вместо окончаний подставляются все слова полностью, вместо нужных морфкодов подставляются все морфкоды (даже присутствующие в постоянных свойствах лексемы). Но я так понял, что на это ТОМу категорически наплевать.

Если не брать в расчёт время, необходимое на обработку лексем, то без разницы.

Alexandr написал(а):

И ещё вопросик по доработке: нужно ли подставлять ударения ко всем генерируемым лексемам?

От ударения хуже не будет ;)

14

Ожидается в версии 0.8:
* Причёсывание готовой лексемы (сделано)
* Расставление ударений (сделано)
* Параметр-корректор (в разработке)

1. Сделан постпроцессор, который парсит уже готовую лексему и убирает избыточную информацию из него. На выходе получается красивая и ухоженная лексема, эквивалентная исходной :)
2. Ударения подставляются непосредственно после генерации отдельных словоформ, т.е. сам знак ударения не влияет на составление и причёсывание лексемы. Может оказаться как в основе, так и в модификаторах.
3. Параметр-корректор нужен для устранения неоднозначностей при генерации некоторых лексем. Будет помещён в препроцессор, который отсеивает лишние словоформы из списка найденных.

Еще плагин довольно медленно генерирует лексемы. По старым замерам примерно 9-20 лексем в секунду. Думаю, что сейчас не намного быстрее. Это связано с тем, что морфолог оптимизировался под сокращение размера словаря и быструю загрузку. Оптимизация поиска будет произведена в последнюю очередь, т.к. это повлечёт серьёзный удар по читаемости кода.
Можно подумать, что и этой скорости вполне достаточно, но это не так: если проект довольно большой и содержит, например, 200 лексем, то плагин прибавит 10 секунд к загрузке игры, что очень ощутимо.

Небольшое описание
Плагин генерирует лексемы для существительных, прилагательных, глаголов и словосочетаний прилагательное-существительное (одно сущ. и одно или несколько прил.).
Библиотека GenLex.tml содержит функции-надстройки над плагином. Крайне рекомендуется использовать при генерации только функции из библиотеки GenLex. Так-же не рекомендуется изменять эту библиотеку.

Доработка библиотеки GenLex.tml
Как видно из кода библиотеки, удалось полностью заменить создание мыслимого-глагола на вызов функции create_ment_gl. Например, вместо

Код:
мыслимое радуется
{ this.инфинитив = "радоваться"
 title = "рад%; ; МрЕчТы3лНв;
   ТыМрЕчПв=овался; ТыЖрЕчПв=овалась; ТыСрЕчПв=овалось; ВыЕчПв=овались; МыЕчПв=овались; МчПв=овались; //прошедшее время
   ТыЕч1лНв=уюсь;  ТыЕч2лНв=уешься; ТыЕч3лНв=уется; //настоящее время на ты
   ВыЕч1лНв=уюсь;  ВыЕч2лНв=уетесь; ВыЕч3лНв=уется; //настоящее время на вы
   МыЕч1лНв=уемся; МыЕч2лНв=уетесь; МыЕч3лНв=уются; //настоящее время на мы
   Мч1лНв=уемся;   Мч2лНв=уетесь;   Мч3лНв=уются"
}

теперь достаточно написать

Код:
create_ment_gl("радуется")

Здесь есть некоторые подводные камни. Например, плагин сейчас прошедшее время генерирует в несовершенном виде, хотя чаще требуется совершенный (вместо "надел" он генерирует "надевал").
По аналогии можно сделать генерацию мыслимого-прилагательного и др., если потребуется.

Ещё хочется сократить описание синонимов при описании объектов. Вот яркий пример:

Код:
unique cloak
{ cls = предмет
  title="бархатн% плащ%; МрЕчНдСи; Ип; Ип=ый,; Рп=ого,а; Дп=ому,у; Вп=ый,; Тп=ым,ом; Пп=ом,е"
  this.плащ = "плащ%; МрЕчНдСи; Ип; Ип=; Рп=а; Дп=у; Вп=; Тп=ом; Пп=е"
  this.бархат = "бархат%; МрЕчНдСи; Ип; Ип=; Рп=а; Дп=у; Вп=; Тп=ом; Пп=е"
  this.атлас = "атлас%;  МрЕчНдСи; Ип; Ип=; Рп=а; Дп=у; Вп=; Тп=ом; Пп=е"
  this.бархатный = "бархатн%; МрЕчНдПи; Ип; Ип=ый; Рп=ого; Дп=ому; Вп=ый; Тп=ым; Пп=ом;"
  this.красивый = "красив%; МрЕчНдПи; Ип; Ип=ый; Рп=ого; Дп=ому; Вп=ый; Тп=ым; Пп=ом;"
  this.черный = "чёрн%; МрЕчНдПи; Ип; Ип=ый; Рп=ого; Дп=ому; Вп=ый; Тп=ым; Пп=ом;"
  this.темный = "тёмн%; МрЕчНдПи; Ип; Ип=ый; Рп=ого; Дп=ому; Вп=ый; Тп=ым; Пп=ом;"
}

Сколько лишних описаний! Даже после применения плагина:

Код:
unique cloak
{ cls = предмет
  title=агл("бархатный плащ")
  this.плащ = агл("плащ")
  this.бархат = агл("бархат")
  this.атлас = агл("атлас")
  this.бархатный = агл("бархатный")
  this.красивый = агл("красивый")
  this.черный = агл("чёрный")
  this.темный = агл("тёмный")
}

становится не намного лучше. ASBer, нельзя-ли добавить в GenLex.tml функцию, которая позволит описывать это как-нибудь так:

Код:
unique cloak
{ cls = предмет
  create_obj(this, "бархатный плащ", "плащ", "бархат", "атлас", "бархатный", "красивый", "чёрный", "тёмный")
}

Я не нашёл в ТОМе, как создавать в ран-тайме свойства объекта. Ведь для такой генерации надо создать в ран-тайме "this.бархатный = агл("бархатный")", не зная слова "бархатный" на этапе разработки.

15

Alexandr написал(а):

Я не нашёл в ТОМе, как создавать в ран-тайме свойства объекта. Ведь для такой генерации надо создать в ран-тайме "this.бархатный = агл("бархатный")", не зная слова "бархатный" на этапе разработки.

Для парсера можно присваивать всё любому одному свойству. Лексема привязывается к объекту и при переназначении свойства не удаляется (требуется проверить).
А вот если где-то нужно будет вывести {cloak:бархатный*Вп} без свойства "бархатный" никак не обойтись...

16

ASBer написал(а):

Для парсера можно присваивать всё любому одному свойству

Поправка:
В стандартной библиотеке часто используется имя свойства лексемы (аспект), возвращаемое парсером.
Если мы все лексемы привяжем к одному свойству, все генерируемые сообщения будут включать последнюю лексему, присвоеную этому свойству, независимо от слова, введенного игроком.
При этом возможны несостыковки по свойствам лексем...
Вобщем не вариант. :(

17

Alexandr написал(а):

Я не нашёл в ТОМе, как создавать в ран-тайме свойства объекта.

А оно там есть :)

Код:
unique A
A.test1 = 1
%A.test1 = {A.test1}

A."test2" = 2
%A.test2 = {A.test2}

var ИмяСвойства = "test3"
A.(ИмяСвойства) = 3
%A.test3 = {A.test3}

Вот вам код для анализа :)

18

Функция, добавляющая к объекту до 10 лексем, может быть такой:

Код:
add_lex(Obj,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10)
{ if(!Obj) return
  if(L1) Obj.(L1) = gl(L1)
  if(L2) Obj.(L2) = gl(L2)
  if(L3) Obj.(L3) = gl(L3)
  if(L4) Obj.(L4) = gl(L4)
  if(L5) Obj.(L5) = gl(L5)
  if(L6) Obj.(L6) = gl(L6)
  if(L7) Obj.(L7) = gl(L7)
  if(L8) Obj.(L8) = gl(L8)
  if(L9) Obj.(L9) = gl(L9)
  if(L10) Obj.(L10) = gl(L10)
}

19

Alexandr написал(а):

* Параметр-корректор (в разработке)

Очень жду! без него пользоваться генератором в полной мере не получается...  :hobo:

20

ASBer написал(а):

if(L1) Obj.(L1) = gl(L1)

Лучше всё-таки использовать функцию agl, чтобы при ошибках генерации отображалась ошибка красным цветом.

21

ASBer написал(а):

без него пользоваться генератором в полной мере не получается...

Буду благодарен, если напишешь замеченные слова, которые сейчас не генерируются плагином. Есть ли среди них прилагательные?
Это поможет в доработке.

22

Alexandr написал(а):

Лучше всё-таки использовать функцию agl

Согласен :)

Alexandr написал(а):

Буду благодарен, если напишешь замеченные слова, которые сейчас не генерируются плагином.

- норка (неоднозначное слово)

23

Еще есть накладка при генерации кличек по неодушевлённым предметам

Код:
unique разбойник_топор
{ cls = разбойник
  title = agl("Топор")
}

>осмотри Топора
'Топора' - слово в неверной форме

24

ASBer написал(а):

>осмотри Топора

Дык в словаре нету Топора-человека, вот и генерируется предмет, который Неодушевлённый и в винительном падеже имеет форму "Топор". Плагин и не будет обрабатывать такие ситуации, как и несуществующие слова. Этот генератор - для упрощения описания большинства лексем. Все лексемы не получится автоматизировать, как бы мы этого не хотели. :surprise:
Но если есть идеи, как можно упростить эту ситуацию, выкладывай. Я лично не знаю, кроме как с подключением пользовательского словаря. А толку его подключать, если придётся описывать те-же самые лексемы, пусть и в отдельном файле.

25

Alexandr написал(а):

Дык в словаре нету Топора-человека, вот и генерируется предмет, который Неодушевлённый и в винительном падеже имеет форму "Топор".

Да, видимо можно не заморачиваться и оставить как есть.
Одушевлённость подменить допустим получится черед доп.параметр, а вот форму винительного падежа изменить уже труднее...

26

Код:
include "GenLex.tml"    // генератор лексем

menu_item("добавить лексему")
{ var Слово = input("Введите слово или словосочетание > ")
  global.(Слово) = agl(Слово)
  %{menu()}
}
%{menu()}

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

27

Мдя... Версия 0.8 задерживается. Всё готово, но при тестировании новых функций на Sample.tom ТОМ упорно отказывается принимать этот плагин. Появляются всё новые и новые нюансы и недочёты. Разгребаю... :mybb:

28

Ладно, вот нестабильная версия 0.8. Содержит ошибки и вырезанные функции. Только для тестирования.
Словарь тот-же.

Сделано:
* Причёсывание готовой лексемы
* Расставление ударений
Сделано, но после тестирования пришлось вырезать.

ASBer написал(а):

От ударения хуже не будет

Как оказалось, хуже будет. Парсер ТОМа просто отказывается понимать лексемы с ударениями. ("осм норку" не работает, если норка задана с ударением.)
* Параметр-корректор
Есть 3 способа отфильтровать неоднозначные слова. В версии 0.8 реализованы 2 из них.
Первый и самый простой способ - это подставить ударение в слово. Для этого даже не нужно использовать параметр-корректор. Используется так:

Код:
title = агл("стои`т")    // если машина стоит в гараже
title = агл("сто`ит")    // если машина стоит дорого

Не обязательно подставлять ударение в каждое слово. Рекомендуется использовать только при возникновении неоднозначностей.
Второй способ: использовать параметр корректор на постоянные свойства лексемы. Например так:

Код:
title = агл("кошка", "Од")
title = агл("норка", "Нд")

Теоретически можно использовать не только одушевлённость, но и другие свойства и даже части речи (Си, Ги, Пи). Но на практике не встречалось и не тестировалось.
Третий способ: задать какую-нибудь словоформу не в начальной форме. Например title = агл("стоит", "Пв=стоял"). В версии 0.8 не реализовано, т.к. предыдущие 2 способа полностью покрывают встреченные неоднозначности. Если понадобится, то будет сделано в следующих версиях.

Встреченные проблемы:
* Ударения влияют на парсинг
* Непонятная проблема при генерации некоторых прилагательных:

Код:
mental старый
{
  title = "стар%; Пи; ИпЕч;
    ИпМрЕч=ый; РпМрЕч=ого; ДпМрЕч=ому; ВпМрЕчНд=ый; ВпМрЕчОд=ого; ТпМрЕч=ым; ПпМрЕч=ом;
    ИпЖрЕч=ая; РпЖрЕч=ой; ДпЖрЕч=ой; ВпЖрЕч=ую; ТпЖрЕч=ой; ПпЖрЕч=ой; 
    ИпСрЕч=ое; РпСрЕч=ого; ДпСрЕч=ому; ВпСрЕч=ое; ТпСрЕч=ым; ПпСрЕч=ом; 
    ИпМч=ые; РпМч=ых; ДпМч=ым; ВпМчНд=ые; ВпМчОд=ых; ТпМч=ыми; ПпМч=ых"
}
unique окно
  { cls = декорация
    title = агл("окно")
    полное_описание = "{this} без штор. {старый*this}, с двойными стёклами"
    описание = "Обычное {this} с двойными стеклами"
}

Появляется ошибка "object.form старый:title*1*НдСрСиИпЕч - лексема не подходит по свойствам!"
Так и не понял, что ему не нравится. Да и копать глубоко не стал. И без того ошибок много было.
* При закрытии ТОМа иногда вылетает ошибка неизвестного происхождения. Непонятно откуда и почему. Я вроде ничего такого не добавил, чтобы ошибки такого типа вылетали (может это в ТОМе дело?). Так и не устранил. Плагин от этого не перестал нормально работать, просто ошибка при выходе (иногда).

29

Ожидается в версии 0.9:
* Ошибка-подсказка при неоднозначности
Сейчас при неоднозначности лексемы выдаётся ошибка "Слово "кошка" не однозначно". Хотелось бы что-то более подробное. Будет выдаваться ошибка, все встреченные неоднозначности и советы по устранению (какие корректоры лучше всего употребить, чтобы убрать неоднозначность).
* Более привередливый поиск нужной словоформы (неоднозначные морфкоды)
Сейчас при выборе словоформы из словаря берётся первое подходящее. Довольно часто в словаре попадаются словоформы с абсолютно одинаковыми или очень похожими свойствами. Это может привести к неправильной генерации лексем. Пока этого не видно, но теоретически возможно. Например, вместо "маминого стола" будет сгенерировано "мамина стола", вместо "ложкой" - "ложкою".
* Быстрый поиск и генерация
Ускорить поиск в морфологическом модуле.
* Попытаюсь разобраться с "Топором-разбойником"
См. пост выше
* Препарсер приставок
Перед поиском слова в словаре нужно отделять от него заранее известные приставки, а после генерации подставлять обратно. Это позволит генерировать слова, отсутствующие в словаре. Например "антикот", "супермегатопор".
* Файл настроек
Сделать файл настроек для плагина, в котором можно будет изменять некоторые настройки (например, знак ударения).
* Почистить словарик от ненужных частей речи и слов (сделать словарь Lite)
Собрать облегчённую версию словарика. Оставить в нём только существительные, прилагательные и глаголы. Так-же можно удалить все имена, фамилии и отчества (они занимают чуть-ли не пол словаря :D )

Что будем делать с совершенным-несовершенным видом в глаголах? Надо ведь что-то придумать. Так-же формат глаголов нужно немного расширить.
Может ещё нужно какие-то части речи?

Если есть какие-то предложения по добавлению функционала, то сейчас самое время говорить о них. После выхода версии 0.9 будет глобальное тестирование, рефакторинг и выход 1.0. Всё что не войдёт в 0.9 вряд-ли будет в 1.0. Долго мусолить плагин я не буду, есть ведь и другие дела. :rain:

30

Супер! щас потееестим  :cool: