0

この素晴らしいガントスクリプトをhttp://blog.armbruster-it.de/2010/07/getting-a-list-of-all-i18n-properties-used-in-a-grails-application/で見つけました。ありがとうStefan !!

説明:Groovyコードとgspテンプレートで使用されるすべてのi18nプロパティのリストを作成します

def properties = []

new File(".").eachFileRecurse {
    if (it.file) {
        switch (it) {
            case ~/.*\.groovy/:
                def matcher = it.text =~ /code:\s*["'](.*?)["']/
                matcher.each { properties << it[1] }
                break
            case ~/.*\.gsp/:
                def matcher = it.text =~ /code=["'](.*?)["']/
                matcher.each { properties << it[1] }
                break
        }
    }
}
println properties.sort().unique().join("\n")

私はそれを次のように拡張しようとしました。次のようなsoemメッセージプロパティがあるとします。

message(code: 'product.label', default: 'Product')

スクリプトの出力として次のようなものが必要です。

product.label=Product

正規表現にいくつかの条件を追加しようとしました:

def matcher = it.text =~ /code=["'](.*?)["'] | default=\s*["'](.*?)["']/

そしてそれをプロパティに入力します。ただし、正規表現では「コードとデフォルト」のペアが見つからないため、これは機能しません。

これを行うために正規表現またはスクリプト全体を変更する方法はありますか?

4

4 に答える 4

2

正規表現が正しくありません。次のメッセージメソッド呼び出しの場合:

message(code: 'product.label', default: 'Product')

次のようになります。

def properties = [:]
def txt = "message(code: 'product.label', default: 'Product')"
def matcher = txt =~ /code:\s*["'](.*?)["'].*default:\s*["'](.*?)["']/
matcher.each{ properties[it[1]] = it[2] }
assert properties == ['product.label':'Product']
于 2011-04-19T18:44:41.110 に答える
1

ホオジロのようにより良い正規表現を提供する以外に、私は非常に便利なGrailsプラグインを見つけました:message-reports

于 2011-04-19T20:39:48.503 に答える
0

このスクリプトを少し使ってみたところ、注意が必要な詳細がいくつか見つかりました。デフォルトが定義されているメッセージと定義されていないメッセージを検索したいのですが、タグ以外のバージョン(つまり${g.message(code:"the.code", default:"the.default"})も検索したいと思います。

ファイルの内容を調べずに、1行ずつ解析するのは良いことのようです。これは、i行にコードがある場合、(2番目のステップで)デフォルトがあるかどうかを確認するためです。ただし、ファイル全体を2回解析する必要はありません。

def properties = [:]

new File(".").eachFileRecurse { file ->
    if (file.file) {
        switch (file) {
            case ~/.*\.groovy/:
                file.eachLine {line ->
                    // check if there is a message in the current line
                    def matcherNoDefault = line =~ /code:\s*["'](.*?)["']/
                    // if there is one, check if it has a default
                    if (matcherNoDefault.getCount() > 0) {
                        def matcher = line =~ /code:\s*["'](.*?)["'].*default:\s*["'](.*?)["']/
                        if (matcher.getCount() > 0) {
                            matcher.each{ properties[it[1]] = it[2] }
                        } else {
                            matcherNoDefault.each{ properties[it[1]] = "NO_DEFAULT" }
                        }
                    }
                }
                break
            case ~/.*\.gsp/:
                file.eachLine {line ->
                    // check if there is a message in the current line (as a g.message(...) function)
                    def matcherNoDefault = line =~ /code:\s*["'](.*?)["']/
                    // if there is one, check if it has a default
                    if (matcherNoDefault.getCount() > 0) {
                        def matcher = line =~ /code:\s*["'](.*?)["'].*default:\s*["'](.*?)["']/
                        if (matcher.getCount() > 0) {
                            matcher.each{ properties[it[1]] = it[2] }
                        } else {
                            matcherNoDefault.each{ properties[it[1]] = "NO_DEFAULT" }
                        }
                    }

                    // check if there is a message in the current line (in tag form)
                    matcherNoDefault = line =~ /code=["'](.*?)["']/
                    // if there is one, check if it has a default
                    if (matcherNoDefault.getCount() > 0) {
                        def matcher = line =~ /code=["'](.*?)["'].*default=["'](.*?)["']/
                        if (matcher.getCount() > 0) {
                            matcher.each{ properties[it[1]] = it[2] }
                        } else {
                            matcherNoDefault.each{ properties[it[1]] = "NO_DEFAULT" }
                        }
                    }
                }
        }
    }
}
println properties.each {k, v ->
    println("${k}=${v}")
}

このように、デフォルトのあるメッセージとないメッセージを1行に混在させることはできません。私は今のところそれと一緒に暮らすことができます。

楽しむ!

于 2013-03-11T11:22:10.423 に答える
0

それを解決するためのより良い正規表現は次のとおりです。

/code=["'](.*?)["'].*default=\s*["'](.*?)["']/

出力形式は次のようになります

properties << it[1]+"="+it[2]

結果

product.label=Product
于 2011-04-20T09:16:18.103 に答える