0

タスク

私の仕事は、php i18n 言語ファイルを取得して ColdFusion 構造体に変換することでした。ここに入力の一部があります

...
"ASK_DELETE"                =>  "<em>D</em>elete", // 'd' is the accesskey identifier
"BACKUP_OF"                 =>  'Backup of',
"PAGE_TITLE"                =>  "Page Title",
...

現在の変換試行

以下のコード、私が受け取った php 言語ファイルで機能します。問題は、コードがスパゲッティ コードの始まりのように見えることです。私が好きではないもののいくつかは

  • ストリングパターンがもう1つ来ると、クラッシュします
  • 「値」という変数があります
  • ミッドストリングベースのチョッピングがたくさん。

コードは、スパゲッティ コードの始まりのように見えます。これについてどのようなことを行う必要がありますか?

    <cffunction name="readPropertiesFile" returnType="Struct" hint="Read a properties file and return a structure">
    <cfargument name="propertiesFile" type="string" required="true" hint="path to properties file">


    <cfscript>
        VAR stProperties = {};
        VAR phpText = "";
        VAR key = "";
        VAR value = "";
        VAR line = "";

       var propertiesFilePath = "#GetDirectoryFromPath(GetBaseTemplatePath())##arguments.propertiesfile#";


       if (NOT FileExists(propertiesFilePath))

        return stProperties;

     </cfscript>




    <!--- read props file --->
    <cffile action="read" file="#propertiesFilePath#" variable="phpText">



    <!--- remove any whitespace at top and tail --->
    <cfset phpText = trim(phpText)>

    <!--- remove comments and blank lines --->
    <cfset phpText = ReReplace(phpText,"(?m)\##.*?$", "","all")>
    <cfset phpText = ReReplace(phpText,"[#Chr(10)#]{2,}", "#Chr(10)#","all")>
    <cfset phpText = ReplaceList(phpText, '",', '"')>


    <!--- loop over each line, ignore comments (#...) and insert keys/values into return struct --->
    <cfloop list="#phpText#" index="line" delimiters="#CHR(10)#">
    <cfscript>

    line = trim(line);
    splitAt = Find("=>", line);
    CommentAt = Find("//", line);

    if (splitAt != 0)   {

        key =  replacelist(trim(Left(line, splitAt - 1)), '"', "");

        if (CommentAt == 0)
    value = replacelist(trim(Mid(line, splitAt + 2, 1000)), '"', '');
        else
            value = replacelist(trim(Mid(line, splitAt + 2, CommentAt - (splitAt + 2))), '"', '');

        //  Remove trailing , 
    if (right(value, 1) == ",")
            value = mid(value, 1, len(value) - 1);


    if (right(value, 1) == "'")
        value = mid(value, 1, len(value) - 1);


    if (left(value, 1) == "'")
        value = mid(value, 2, 1000);



        stProperties[key] = value;
        } // end if
    </cfscript>
</cfloop>

<cfreturn stProperties>

4

1 に答える 1

1

これが私のアプローチになります。もちろん、これをより回復力のあるものにするか、エラー トラップを追加して、一貫性のないファイル解析をキャッチすることができます。キー値に引用符がないと仮定しています。

<!--- Going on the Assumption there isn't commas or quotations inside the values of the key --->
<cfsavecontent variable="fileData">

"ASK_DELETE"                =>  "<em>D</em>elete", // 'd' is the accesskey identifier
"BACKUP_OF"                 =>  'Backup of',

"PAGE_TITLE"                =>  "Page Title"

</cfsavecontent>

<cfset i18n = structNew()>
<!--- Remove // Comments --->
<cfset fileData = REReplace(fileData,"//.*?\n","","ALL")>
<!--- Simplify Delimiter --->
<cfset fileData = Replace(fileData,"=>","|","ALL")>

<cfloop list="#fileData#" delimiters="," index="thisEntry">
    <!--- Strip Quotes and Pull Entries --->
    <cfset key = REReplace(ListFirst(thisEntry,"|"),"[""']","","ALL")>
    <cfset value = REReplace(ListLast(thisEntry,"|"),"[""']","","ALL")>
    <cfset structInsert(i18n,trim(key),trim(value))>
</cfloop>

<cfdump var="#i18n#">
于 2012-12-12T08:05:02.207 に答える