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-лексеру.
Мой вопрос:
- Сможет ли js-лексер php codesniffer помочь мне решить мою проблему?
- Если да, то как мне получить доступ к этому лексеру?
- Существуют ли другие 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 или написав больше пользовательских классов сниффа.
Я надеюсь, что это немного помогает. Если вы решили написать свой собственный анализ и вам нужна помощь, просто дайте мне знать.