【问题标题】:JS Lexer to detect function callsJS Lexer 检测函数调用
【发布时间】:2012-06-15 00:18:24
【问题描述】:

为了本地化我的 javascript 中使用的字符串,我想扫描我所有的 js 文件以查找此类字符串。

我正在使用t() 函数来请求字符串翻译,如下所示:

t("Hello world");

或动态部分:

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

我想检测对 t() 函数的所有调用,从而收集 php“构建”脚本中第一个参数中包含的字符串,但跳过以下内容:

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. php 代码嗅探器的 js 词法分析器能帮我解决我的问题吗?
  2. 如果是这样,我如何访问该词法分析器?
  3. 还有其他 php 库可以帮助我找到对 t() 的调用吗?

请不要建议独立的正则表达式,因为它们不可能完全解决我的问题。

提前谢谢你。

【问题讨论】:

    标签: php javascript localization lexer codesniffer


    【解决方案1】:

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

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

    有一个 basic tutorial 涵盖了这一点。

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

    当您开始进行实际检查时,您将拥有对文件的已解析和标记化内容的完全低级访问权限。有很多辅助函数可以检查代码是否在其他范围内,或者帮助您在堆栈中前后移动以查找所需的代码。

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

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

    在这一切之后,您将像这样检查您的代码: phpcs --standard=MyStandard /path/to/code

    您可以在代码编辑器中使用许多 PHPCS 的集成。

    您可能决定向标准添加新的更多嗅探以检查其他内容,然后您可以使用您的 ruleset.xml 文件或编写更多自定义嗅探类轻松完成。

    我希望这会有所帮助。如果您决定编写自己的嗅探器并需要帮助,请告诉我。

    【讨论】:

    • 嘿,感谢您提供详细的想法。所以我必须通过phpcs 进行嗅探?我不能直接通过 php 函数调用来调用它吗?我仍然需要详细介绍您的想法。另外真的有必要为此分叉phpcs吗?
    • 您绝对不需要为此分叉 PHPCS。您只需要一个本地的 repo 克隆。您实际上不会更改任何 PHPCS 文件本身。至于直接调用它,你当然可以试一试。您可能想查看 CodeSniffer/CLI.php 文件以了解它如何调用各种函数,也许还有 CodeSniffer/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php。即使是 PHP,它仍然展示了如何构造字符串并在其上调用核心标记器函数。可能就是你所需要的。
    猜你喜欢
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多