DecodeCSS

FileMaker [GetAsCSS]で変換された文字を元に戻す TAGはそのまま

サンプルファイルは、最下部。

(DecodeCSS.fp7)

スクリプト名[GetString(CSS)]

{

#[GetAsCSS]で変換された文字をデコード TAGはそのまま

変数を設定 [$CSS; 値:Get(スクリプト引数)]

Loop # 変数を設定 [$P; 値:Position ( $CSS ; "&#" ; 1 ; 1 )]

If [$P = 0]

変数を設定 [$Result; 値:$Result & $CSS]

変数を設定 [$CSS; 値:""]

Else

変数を設定 [$Result; 値:$Result&Left ( $CSS ; $P-1 )]

変数を設定 [$CSS; 値:Middle ( $CSS ; $P ; Length ( $CSS )-$P+1 )]

End If # If [Left ($CSS ; 2 ) = "&#"]

変数を設定 [$CSScode; 値:Middle ( $CSS ; 3 ; 5 )]

変数を設定 [$String; 値:Char ( $CSScode )]

#

変数を設定 [$Result; 値:$Result & $String]

#

変数を設定 [$CSS; 値:Middle ( $CSS ; 9 ; Length ( $CSS )-8 )]

End If

Exit Loop If [IsEmpty ( $CSS )] End Loop

現在のスクリプト終了 [結果: $Result]

 Hiroさん作:Max2万文字位まで生ける負荷分散した再帰式

Let([  $prm="CSSエンコードテキスト";  $m=150; /*再帰分割単位数(最適値指定)*/  $all=PatternCount($prm;"&#");  $n[1]=0;  $n[2]=Div($all-1;$m);  $res[1]="";  /*再帰計算限界回避の分割・分散処理*/  $fnc[1]="Case(    $n[1]>$n[2]; $res[1] & $prm;    Let([     $i[1]=$m*$n[1];     $i[2]=$i[1]+Min($all-$m*$n[1]; $m);     $pos=Position($prm;\"&#\";1;1);     $res[2]=\"\";     $res[1]=$res[1] & Evaluate($fnc[2]);     $n[1]=$n[1]+1    ]; Evaluate($fnc[1]))   )";  /*主要式*/  $fnc[2]="Case(   $pos=0 or $i[1]=$i[2]; $res[2];   Let([     $i[1]=$i[1]+1;     $res[2]=$res[2] & Left($prm;$pos-1);     $prm=Middle($prm;$pos;Length($prm));     $p=Position($prm;\";\";1;1);     $chr=Left($prm;$p);     $chr=Char(Substitute($chr;[\"&#\";\"\"];[\";\";\"\"]));     $prm=Middle($prm;$p+1;Length($prm));     $res[2]=$res[2] & $chr;     $pos=Position($prm;\"&#\";1;1)    ]; Evaluate($fnc[2]))   )" ];  Evaluate($fnc[1]) )

 Hiroさん作:再帰計算式

DecodeCSSスクリプトを再帰計算式へ替えてみました。

式は、許容復号文字数を250字以下に制限した限定簡略式でサボってます。

Let([

$prm="CSSエンコードテキスト";

$pos=Position($prm;"&#";1;1);

$res="";

$fnc="Case(

PatternCount($prm;\"&#\")>250; \"エラー:許容復号文字数250を超過\";

$pos=0; $res & $prm;

Let([

$res=$res & Left($prm;$pos-1);

$prm=Middle($prm;$pos;Length($prm));

$p=Position($prm;\";\";1;1);

$chr=Left($prm;$p);

$chr=Char(Substitute($chr;[\"&#\";\"\"];[\";\";\"\"]));

$prm=Middle($prm;$p+1;Length($prm));

$res=$res & $chr;

$pos=Position($prm;\"&#\";1;1)

]; Evaluate($fnc))

)"

];

Evaluate($fnc)

)