タスク
私の仕事は、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>