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)
)