2012-06-15 20 views
0

爲了本地化我的JavaScript中使用的字符串,我想掃描所有我的js文件中的這樣的字符串。JS Lexer來檢測函數調用

我使用的是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. 請問PHP codesniffer的JS詞法分析器可以幫助我解決我的問題?
  2. 如果是這樣,我該如何訪問該詞法分析器?
  3. 是否有任何其他的PHP庫可以幫助我找到t()的調用?

請不要建議獨立的正則表達式,因爲它們不可能完全解決我的問題。

預先感謝您。

回答

1

你所描述的基本上是一種編碼標準。當然,確保字符串本地化是許多項目標準的一部分。所以我認爲PHPCS是適合你的工具,但你需要爲它定製一個嗅探器,因爲沒有什麼東西可以完全滿足你的要求。

要做的最好的事情可能是從Github克隆PHPCS Git回購,然後在CodeSniffer/Standards下創建一個新目錄來包含您的自定義嗅探。假設你稱之爲MyStandard。確保你在它下面創建一個Sniffs目錄,然後創建一個子目錄來存放你的新嗅探。看看那裏的其他標準,看看它們是如何工作的。您還會發現從另一個標準複製現有的ruleset.xml文件更容易,只需更改適合您的cotent即可。如果你不想在任何地方包含任何其他嗅探(你只是想運行這個檢查你的代碼),那麼你可以指定一個名稱和描述,並留下其餘的空白。

有一個涵蓋的basic tutorial

在你的嗅探器中,你顯然希望它只檢查JS文件,所以確保你在supportedTokenizers成員var(也在文檔中)指定了它。這將確保PHP和CSS文件始終被忽略。

當您開始真正的檢查時,您將對文件的解析和標記內容有完全的低級訪問權限。有很多幫助函數可以檢查其他作用域內的代碼,或者幫助您在堆棧中前後移動以查找所需的代碼位。

提示:使用-v選項運行PHPCS以查看文件上的令牌輸出。它應該可以幫助你更容易地看到結構。

如果您想真正做到正確的事情,您甚至可以爲您的嗅探創建一個很好的單元測試,以確保它能夠持續運行。

這一切後,你會檢查你的代碼是這樣的: phpcs --standard=MyStandard /path/to/code

而且你可以使用大量的存在於內部的代碼編輯器PHPCS集成。

您可能決定爲標準添加更多嗅探來檢查其他事情,然後您可以使用ruleset.xml文件或編寫更多自定義嗅探類來輕鬆完成。

我希望能有所幫助。如果你決定寫自己的嗅覺,並需要幫助,請讓我知道。

+0

嘿感謝您的詳細想法。所以我必須通過'phpcs'運行嗅探?我可以不通過PHP函數調用直接調用它嗎?我仍然需要詳細瞭解你的想法。也是真的有必要爲此分叉phpcs嗎? –

+0

你絕對不需要爲此分叉PHPCS。只需要回購的本地克隆即可滿足您的所有需求。你實際上不會改變任何PHPCS文件本身。至於直接調用它,你當然可以放棄它。你可能想看看CodeSniffer/CLI.php文件,看看它如何調用各種函數,也可能是CodeSniffer/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php。即使它是PHP,它仍然顯示如何構造一個字符串並在其上調用核心標記器函數。可能是你需要的一切。 –