Pull to refresh

Смена регистра букв при автозамене в NetBeans

Reading time 3 min
Views 2.1K
Всем привет! Хочу поделиться решением одной проблемы, связанной с авто-заменой по регулярному выражению в NetBeans.

Описание проблемы


При реализации многих проектов программисту приходится решать проблему локализации, а в частности реализации многоязычной поддержки пользовательского интерфейса. Я часто сталкивался с этой задачей и раньше использовал для этого список(массив) лексем, которые в нужном месте вызывались по ключу (здесь и далее речь пойдет о проектах на PHP, но статья поможет любым разработчикам, которые используют IDE NetBeans):


<?php

$_CONFIG['errors'] = array();

$_CONFIG['errors']['db_connection'] = "Database connection error:";
$_CONFIG['errors']['no_user'] = "No user with this e-mail and password.";
$_CONFIG['errors']['wrong_user_data'] = "Wrong user data.";

...

?>

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

Постановка задачи


Для решения описанной выше задачи декомпозируем ее на подзадачи, согласно описанным проблемам:
  1. реализовать возможность быстрого перехода на значение лексемы из любой части кода в среде разработки;
  2. выделить основные типы лексем и построить максимально удобную и понятную структуру их представления (в крупных проектах количество лексем может достигать нескольких тысяч)
  3. использовать константы вместо переменных;

Таким образом удобнее всего решить эту задачу с помощью классов констант:
<?php

class __ERRORS {
/**
* Database errors
*/
const DB_CONNECTION = "Database connection error:";
const NO_USER = "No user with this e-mail and password.";
const WRONG_USER_DATA = "Wrong user data.";

/**
* Forms validation errors
*/
const WRONG_CAPTCHA = "Wrong captcha code";

.....

?>


Такой подход позволит разбить лексемы на необходимые классы. Просто можно создать классы __TIPS, __MESSAGES, __WARNINGS и т.д. Также при клике по константе класса в любой части кода в IDE с нажатым Ctrl мы сразу переходим на ее декларацию, что очень ускоряет процесс разработки.

Проблема с которой я столкнулся


Но все-таки остается одна проблема, что делать если мы уже имеем огромный файл с лексемами в массивах. Многие системы написаны именно с таким подходом к локализации. Лексем очень много, естественно перебивать их в новую структуру зачастую очень сложно и долго. Логичным решением представляется автозамена в самой IDE.

Вот мы и подошли к тому, из-за чего я пишу статью. Первым делом для того чтобы изменить структуру хранения лексем я воспользовался автозаменой в NetBeans по регулярному выражению \$\_CONFIG\['errors'\]\['(.+)'\].

image

Далее мне было нужно переименовать все константы в верхний регистр и тут то я зашел в тупик. Начал искать как это можно сделать в NetBeans. И даже на официальных источниках. Оказалось что автозаменой этого сделать нельзя. Тут я вспомнил про макросы. Осталось только написать еще одно регулярное выражение для поиска в коде имен констант и написать макрос, который будет переводить найденные имена констант в верхний регистр.

Для этого идем в Edit -> Start Macro Recording и ищем по регулярному выражению ([a-z]{1}[a-z_]*) =

image

Останавливаем запись макроса Edit -> Stop Macro Recording и даем ему имя.
Идем в панель управления макросами Tools -> Options -> Editor -> Macros и находим наш макрос.

image

Дописываем команду перевода в верхний регистр to-upper-case и назначаем комбинацию клавиш для быстрого вызова макроса. Теперь мы имеем возможность быстро выполнить рефакторинг нашего кода.

image

Заключение


В данной статье рассматривается решение конкретной практической задачи. Но она выбрана просто как пример, скорее даже так исторически сложилось, она была толчком для поиска такого решения. Но описанные выше действия могут помочь при решении многих подобных задач, связанных с необходимостью быстрого поиска и замены большого количества кода в IDE NetBeans. Надеюсь что эта статья кому-то поможет.

Литература


P.S. Автору статьи просто необходим инвайт.

UPD Автор dzarezenko получил инвайт. Огромное спасибо!
Tags:
Hubs:
+3
Comments 3
Comments Comments 3

Articles