JS Lexer для обнаружения вызовов функций

Чтобы локализовать строки, используемые в моем javascript, я хочу просканировать все мои js-файлы на наличие таких строк.

Я использую t() функция для запроса перевода строки следующим образом:

t("Hello world");

или с динамическими порциями:

t("Hello @user", {"@user": "d_inevitable"});

Я хочу обнаружить все звонки на t() и, таким образом, собирает строки, содержащиеся в первом аргументе в php-скрипте "build", но пропускает следующее:

function foo(t) {
   t("This is not the real t, do not localize this!");
}

function bar() {
    var t = function(){}; //not the real t either...
}

function zoo() {
    function t() {
       //This also isn't the real t() function.
    }
}

t("Translate this string, because this is the real t() in its global scope");

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

Как правило, динамические данные времени выполнения в качестве первого аргумента не допускаются. Первый аргумент t() всегда должна быть константной литеральной строкой.

Я думаю, что php codesniffer поможет мне сделать это, однако вся документация, которую я смог найти, касается обеспечения соблюдения кода (или выявления нарушений). Мне нужен более низкий уровень доступа к JS-лексеру.

Мой вопрос:

  1. Сможет ли js-лексер php codesniffer помочь мне решить мою проблему?
  2. Если да, то как мне получить доступ к этому лексеру?
  3. Существуют ли другие php-библиотеки, которые могут помочь мне найти звонки t()?

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

Заранее спасибо.

1 ответ

Решение

То, что вы описываете, в основном является стандартом кодирования. Конечно, обеспечение правильной локализации строк является частью многих стандартов проекта. Поэтому я думаю, что PHPCS - правильный инструмент для вас, но вам нужно будет написать собственный анализатор, потому что ничего не существует, чтобы делать то, что вам нужно.

Лучше всего клонировать репозиторий PHPCS Git от Github, а затем создать новый каталог в CodeSniffer/Standards для хранения вашего пользовательского сниффа. Допустим, вы называете это MyStandard. Убедитесь, что вы создали каталог Sniffs под ним, а затем подкаталог для размещения вашего нового сниффа. Посмотрите на другие стандарты, чтобы увидеть, как они работают. Вам также будет проще скопировать существующий файл ruleset.xml из другого стандарта и просто изменить его на подходящий вам. если вы не хотите включать какие-либо другие сниффы откуда-либо (вы просто хотите выполнить эту проверку кода), вы можете просто указать имя и описание и оставить все пустым.

Существует базовый учебник, который охватывает это.

Внутри вашего сниффа вы, очевидно, захотите, чтобы он проверял только файлы JS, поэтому убедитесь, что вы указали это в элементе supportTokenizer var (также в документации). Это гарантирует, что файлы PHP и CSS всегда игнорируются.

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

СОВЕТ: запустите PHPCS, используя опцию -v, чтобы увидеть вывод токена в вашем файле. Это должно помочь вам увидеть структуру легче.

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

После всего этого вы проверите свой код следующим образом:phpcs --standard=MyStandard /path/to/code

И вы можете использовать множество интеграций, которые существуют для PHPCS внутри редакторов кода.

Вы можете решить добавить новые дополнительные сниффы в стандарт, чтобы проверить другие вещи, которые вы можете легко сделать, используя свой файл ruleset.xml или написав больше пользовательских классов сниффа.

Я надеюсь, что это немного помогает. Если вы решили написать свой собственный анализ и вам нужна помощь, просто дайте мне знать.

Другие вопросы по тегам