この質問では、式言語のサポートについて質問し、Javascript のアイデアをうまく使用しました。シンプルな式言語を Java に入れる
しかし、必要な Javascript 式は非常に冗長になり、ScriptEngine を使用して式で参照できる JavaScript 関数を作成し、式を短くする方法を見つけようとしています。
これまでのところ、ユーザーが入力した文字列に reexp を使用してソリューションをハックしました。これには、ifempty という疑似関数を含めることができ、スクリプト エンジンに渡す前に JavaScript に変換します。
public final String formatFromMask(String mask,Song exampleSong)
{
mask = convertPsuedoFunctions(mask);
try
{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
for(SongFieldName next:SongFieldName.values())
{
engine.put(next.getScriptVar(),exampleSong.getFieldValueOrEmptyString(next.getSongFieldKey()));
}
Object result = engine.eval(mask);
return (String)result;
}
catch(ScriptException se)
{
se.printStackTrace();
}
return "";
}
private String convertPsuedoFunctions(String mask)
{
//i.e ifnotempty(artist,' - ') -> (artist.length>0 ? artist + ' - ' : '')
mask=mask.replaceAll("ifnotempty\\(([a-z]*)\\,('.*')\\)",
"($1.length>0 ? $1 + $2 : '')");
return mask;
}
次のような式を解析できます
ifnotempty(album,'/')
+ ifnotempty(artist,' - ')
+ ifnotempty(album,' - ')
+ ifnotempty(track,' - ')
+ ifnotempty(title,'')
しかし、実際のJavaScript関数を実際に作成する適切な解決策について疑問に思っていました。