Opened 5 months ago

Closed 3 months ago

#696 closed улучшение (готово)

Улучшение диагностики регулярных выражений плат VE-*

Reported by: alx Owned by: alx
Priority: средний Milestone: 2 очередь
Component: sw Keywords:
Cc: san

Description

В платах VE-01/VE-02/VE-12 широко используются регулярные выражения (в том числе с подстановками). Иногда (в некоторых сложных или "хитрых" случаях) бывает трудно составить их правильно, легко ошибиться. Кроме этого, в платах используется сразу две альтернативные реализации регулярных выражений (libpcre и libpcre2), не совсем совместимые друг с другом по синтаксису.

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

  1. При использовании рег. выражений с заменой ссылки на группы захвата в строке замены имеют вид \1, \2 и т.д. в случае PCRE и $1, $2 и т.д. в случае PCRE2. Предлагается при наличии в строке замены ссылок в синтаксисе PCRE автоматически выделять их желтым цветом, если режим PCRE "авто" (чтобы пользователь видел, что будет использоваться синтаксис PCRE) и красным если режим PCRE "PCRE2".
  1. Собственно регулярное выражение в процессе его ввода отправлять на сервер для валидации (и там их компилировать). В случае ошибки компиляции выделять красным тот символ, на котором возникла ошибка компиляции (или даже от этого символа до конца строки).
  1. Добавить дополнительную функцию теста регулярных выражений - какая-нибудь специальная иконка рядом со строкой ввода, при клике которой появляется новый диалог. В этом диалоге должна быть копия строки ввода соответствующего выражения, а ниже несколько строк для ввода тестового текста. Эти тестовые строки вместе с рег. выражением должны передаваться на сервер и там матчиться (опционально с заменой), а результаты должны отображаться в диалоге (примерно как в Zabbix можно протестировать применение javascript-аплетов). Это позволит пользователю сразу видеть результат применения рег. выражения (и замены) для всех интересующих его случаев.

Change History (8)

comment:1 by alx, 5 months ago

In 2392/sw:

Новая команда API testPCRE.
В веб-интерфейсе реализовано кастомное поле ввода textInput.
При использовании его для ввода рег. выражений выполняется
автоматические выделение ошибок рег. выражений и ссылок на
группы захвата в строках замены в стиле PCRE. See #696.

comment:2 by alx, 5 months ago

Cc: san added

На данный момент частично реализовано предложение 1 (только ссылки в стиле PCRE) и предложение 2 полностью.

По предложению 1: ссылки в стиле PCRE2 могут быть сложными (учитывая расширенный режим замены, когда поддерживаются выражения в стиле переменных bash, типа ${12:+123:-456}), я затрудняюсь написать регулярное выражение для их нахождения. Но и, наверное, как раз ссылки PCRE2 выделять не очень-то и надо. Но если кто-то поможет с рег. выражением, я, возможно, добавлю выделение ссылок PCRE2...

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

Что сделано:

  • шрифт вводимого тексте сделан моноширинным (так удобнее видеть выделение);
  • в строке замены выделяется ссылка в стиле PCRE (желтым в режиме "авто" и красным (точнее, скорее розовым) в режиме PCRE2) - локально в браузере;
  • строка замены ищется только при наличии у поля класса replace, иначе текст всегда трактуется и проверяется как рег. выражение (строки типа блокировок вызовов, где нет замен).
  • собственно рег. выражение отправляется для проверки на сервер (при отсутствии нового ввода в течение 300 мс);
  • ответы от сервера (результаты проверки) кэшируются на странице;
  • Ошибка отображается в зависимости от установленного режима (в режиме "PCRE" - ошибки libpcre, в режиме "PCRE2" - ошибки libpcre2, в режиме "авто" - libpcre если в строке замены есть ссылки в стиле PCRE и libpcre2 в противном случае), ошибка выделяется желтым если ее вернула libpcre2, и при этом libpcre скомпилировал это же выражение без ошибок (не проверялось - я не смог найти такого выражения), в противном случае выделение красным;
  • при наведении курсора на отмеченную ошибку отображается tooltip с текстом ошибки;
  • при разметке сохраняется позиция выделения и курсора.

Сейчас в блоке "Нижний Самурай" можно посмотреть текущую реализацию предложений тикета в диалоге конфигурации канального окончания FXS в параметре "Рег. выражение набора" (и только там) плат VE-01/VE-02. Так как нативное поле ввода не позволяет размечать вводимый текст, пришлось делать собственный аналог поля ввода (этакий закат солнца вручную), чтоы он был максимально похож на нативное поле. Если возможно, прошу поиграть с ним и обратить внимание на возможные странности в поведении (изменение ширины, неожиданные перемещения курсора, перепутывание символов и т.п.).

comment:3 by alx, 5 months ago

In 2393/sw:

В веб-интерфейсе все поля ввода регулярных выражений
сделаны элементами '<div class="textInput"/>.
See #696.

comment:4 by alx, 5 months ago

Известные проблемы на текущий момент:

  • Safari не показывает первоначальную раскраску (не подсвечивает ошибки в строках в момент открытия диалога). При интерактивном вводе подсвечивает.
  • При открытии диалога факус почему-то оказывается на поле <div class="textInput"/> (вероятно, это связано с функцией восстановления текущего выделения restorePosition()).
  • В элемент <div class="textInput"/> можно встаыить текст с переводом строки, (а в Firefox вообще любой RTF, так как Mozilla не поддерживает значение plaintext-only атрибута contenteditable). Элемент при этом становится многострочным...
Version 2, edited 5 months ago by alx (previous) (next) (diff)

comment:5 by alx, 5 months ago

Захват фокуса устранен в r2394.

comment:6 by alx, 5 months ago

In 2395/sw:

В веб-интерфейе paste в элемент <div class="textInput"/>
выполняется в виде текста и в одну строку. See #696.

comment:7 by alx, 5 months ago

In 2396/sw:

В веб-интерфейсе исправлена ошибка, из-аз которой Safari
не подсвечивал ошибки в рег. выражениях при открытии диалога.
Проблема была в том, что если элемент не имеет фокуса,
внутри savePosition() возникала ошибка. See #696.

comment:8 by alx, 3 months ago

Resolution: готово
Status: newclosed

Полностью реализовано в r2412.

Note: See TracTickets for help on using tickets.