nerevar / jmc

JMC - Jaba Mud Client
25 stars 15 forks source link

Цветные триггеры #53

Open konelav opened 8 years ago

konelav commented 8 years ago

Очень давняя тема: возможность учитывать в триггерах цвет текста/фона. Весь вопрос в механизме реализации. На мой взгляд, правильнее сделать это отдельной сущностью (типа #caction): во-первых, ради полной обратной совместимости, во-вторых ради, собственно, простоты реализации и применения. Далее, самый простой вариант: проверять цветные триггеры до удаления ansi-команд из строки. Это легко сделать, но, очевидно, возникает проблема правильного (байт-в-байт) ввода, и нет простого механизма это сделать (видимо, писать лог и копипастить нужные строки из него). Предлагается сделать механизм преобразования цветовых ansi-команд такой, чтобы одинаково выглядящие строки транслировались в ровно идентичные байтовые представления (например, удаление команд не имеющих эффекта: дублирующих предыдущие цвет-фон или после которых до следующей команды нет текста). При этом можно заменить сами команды чем-то более легко читаемым/печатаемым (как, например, в ROM "{" или в SMAUG "&" "^*").

konelav commented 8 years ago

Пока остановился на таком варианте:

action [text|raw|ansi|smaug|sow] pattern command [priority] [group]

первый параметр -- тип, по умолчанию text, т.е. как сейчас (все esc-последовательности удалены). raw: строка проверяется "как есть", без обработки ansi: в строке остаются ansi-команды цвета текста, при этом "лишние" команды (дублирующие или после которых нет текста) удаляются, команды сдвинуты максимально вправо (т.е. после пробельных символов) и всегда указывают режим яркости (т.е. возможны лишь варианты ESC[0;30m .. ESC[0;37m], ESC[1;30m .. ESC[1;37m) smaug: команды управления цветом заменяются на используемые в движке SMAUG (&w, &R и т.п.) sow: команды управления цветом заменяются на используемые в движке SOW ([0], {1} и т.п.)

т.е., например, на красную строку "... убит" будет так:

action smaug {/^&R[^&]*(.+) убит/} {say %0 убит!}