JS Lexer检测函数调用

时间:2012-06-15 00:18:25

标签: php javascript localization lexer codesniffer

为了本地化我的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 lexer进行较低级别的访问。

我的问题是:

  1. php codeniffer的js lexer能帮我解决问题吗?
  2. 如果是这样,我如何访问该词法分析器?
  3. 有没有其他的php库可以帮助我找到t()的电话?
  4. 请不要建议独立的正则表达式,因为它们不可能完全解决我的问题。

    提前谢谢。

1 个答案:

答案 0 :(得分:1)

您所描述的基本上是编码标准。当然,确保字符串正确本地化是许多项目标准的一部分。所以我认为PHPCS对你来说是正确的工具,但是你需要为它编写一个自定义的嗅探器,因为没有什么可以完全按照你的目的去做。

最好的办法是从Github克隆PHPCS Git repo,然后在CodeSniffer / Standards下创建一个新目录来包含你的自定义嗅探。假设你称之为MyStandard。确保在其下创建一个Sniffs目录,然后在子目录中创建一个新的嗅探器。看看那里的其他标准,看看它们是如何工作的。您还会发现从另一个标准复制现有的ruleset.xml文件更容易,只需更改适合您的效果。如果你不想在任何地方包含任何其他的嗅探(你只想运行这个嗅探检查你的代码),那么你可以只指定一个名称和描述,并将其余部分留空。

basic tutorial涵盖了这一点。

在你的嗅探中,你显然希望它只检查JS文件,因此请确保在supportedTokenizers成员var(也在文档中)中指定它。这将确保始终忽略PHP和CSS文件。

当您进行实际检查时,您将完全低级访问文件的已解析和标记化内容。有许多辅助函数可以检查其他作用域内的代码,或者帮助您在堆栈中前后移动以查找所需的代码。

提示:使用-v选项运行PHPCS以查看文件上的令牌输出。它应该可以帮助您更轻松地看到结构。

如果你想真正做好事,你甚至可以为你的嗅探创建一个不错的单元测试,以确保它随着时间的推移而持续运行。

毕竟,你要检查你的代码: phpcs --standard=MyStandard /path/to/code

您可以在代码编辑器中使用PHPCS存在的大量集成。

您可能决定在标准中添加新的更多嗅探以检查其他内容,然后您可以使用ruleset.xml文件或编写更多自定义嗅探类轻松地执行这些操作。

我希望有所帮助。如果你决定写自己的嗅闻并需要帮助,请告诉我。