Skriptfunktion für erstes nicht leeres Feld

Der angezeigte Feldinhalt einer meiner nutzerdefinierten Spalten ist ein Häkchen, wenn wenigstens eines der Felder einen Wert hat. Dazu verwende ich einfach $if($or(%field1%,%field2%,…),✔,).

Für die Sortierung nach dieser Spalte würde ich gerne das jeweils erste vorhandene und nicht leere Tagfeld aus dieser Liste verwenden. Das geht mit Verschachtelung von Funktionen $if2(%field1%,$if2(%field2,…)) und vielleicht auch mit eckigen Klammern [[[%field1%]%field2%]…].

Das wird allerdings schnell unübersichtlich. Daher wünsche ich mir eine neue Skriptfunktion, die den Wert des ersten ihr übergebenen Arguments zurückgibt, der nicht leer, falsch oder Null ist, und den Rest verwirft. In manchen Sprachen funktionieren ODER-Ausdrücke so, aber ich denke nicht, dass es sinnvoll wäre, $or() oder $if2() derart anzupassen.


Bei dieser Gelegenheit wünsche ich mir außerdem, dass in der Dokumentation explizit erklärt wird, was in den Skriptfunktionen als true/false gilt und was in Formatierungsstrings als found oder filled gilt. Manche Platzhalter, insbesondere technische Informationen, haben ja immer einen Wert, aber manche sind Textstrings, andere Zahlenwerte, andere Platzhalter können einfach fehlen (~ null) oder nicht zutreffen und als Rückgabe von Funktionen gibt es auch boolesche Werte.

PS: Ich glaube, auch eine $isempty()-Funktion könnte manchmal hilfreich sein, vor allem, wenn sie auch dann true zurückgibt, wenn ein Stringargument nur Leerzeichen enthält oder ein Zahlenargument 0 entspricht.

Ich vermute, dass die Lösung mit eckigen Klammern am einfachsten ist.
Da würde allerdings genügen:
[%feld1%][%feld2%][%feld3%]

dann wäre ja weder der String noch die Zahl leer - und ein $isempty() würde das Ergebnis false liefern.
Wenn das für dich zu ignorierende Werte sind, müsstest du auf diese Bedingung testen und die Leerzeichen löschen, z.B. $trim() und die 0 mit einem Vergleich (größer, kleiner, etc.).

Die eckigen Klammern hatte ich verschachtelt, um nur den ersten Feldwert und nicht alle zu erhalten, aber das kann so gar nicht funktionieren.

Ja, $isempty() ist für die beschriebene, pragmatische Funktionsweise nicht der optimale Name.

Die eckigen Klammern tun eigentlich genau das: die bauen einen String zusammen, der aus dem Inhalt der vorhandenen, in den eckigen Klammern genannten Feldern besteht. Und den trage ich in der Spaltendefinition bei "Sortieren nach" ein.
Wenn ich also
Feld1 = Abba
Feld2 = Beatles
Feld3 = Creedence Clearwater Revival
habe, würde
AbbaBeatlesCreedence Clearwater Revival entstehen und nach Ab.. sortiert.
Fällt Feld2 weg, wäre es immer noch gut genug mit
AbbaCreedence Clearwater Revival
inwieweit ich dann die unterschiedlichen Sortierergebnisse sinnvoll finde, steht auf einem anderen Blatt.

Bei benutzerdefinierten Listen wirst du immer die vollständige Liste, so unübersichtlich die am Ende auf werden mag, pflegen müssen.

Dass eine Logik-Funktion abbricht, sobald die erste Bedingung wahr geworden ist, mag die Laufzeit verkürzen. Ich bezweifele aber, dass dies hier in der Bearbeitung durch MP3tag zu Buche schlägt. Derzeit sind alle Logik-Funktionen ohne damit verbundene Ausgabe, so dass du auch mit $isempty() alle Variablen abfragen müsstest und dann eine zugehörige Reaktion definieren.

Deswegen schlage ich genau dafür ja eine neue Funktion vor, bspw. $try(%field1%,%field2%,…), $if3(%field1%,%field2%,…) oder $first(%field1%,%field2%,…).

Um ehrlich zu sein: ich verstehe die Begründung nicht.
Während mit

eine Liste gegeben werden muss, ist die doch bei einer Funktion wie

doch genauso nötig.
Die Funktion mit den eckigen Klammern gibt es schon, die aus dem Vorschlag müsste hinzuentwickelt werden, ohne dass ich im Moment einen echten Nutzen sehen kann. Aber vielleicht bin ich auch einfach zu engstirnig und es fehlt mir die Weitsicht auf einen Anwendungsfall, in dem die eckigen Klammern nicht sinnvoll sind.

Beim Sortieren mag es akzeptabel sein, mehrere Werte hintereinander zu erhalten, aber beim Umbenennen ist es z.B. nicht sinnvoll und manchmal wären sogar eckige Klammern in dieser Funktion hilfreich:

$if($eql(%compilation%,1),#,$try(%albumartistsort%,%albumartist%,%artistsort%,%artist%))$try([\%albumsort%\],[\%album%\],\)[$num(%discnumber%,1).]$num(%track%,2) $try(%titlesort%,%title%[, %subtitle%])[ (%mixartist%)]

$if($eql(%itunesmediatype%,TV Show),Serien\$try(%tvshowsort%,%tvshow%,%albumsort%,%album%)\$try($if2(%tvepisodeid%,[%tvseason%.]%tvepisode%),#%track%) ,Filme\)$try(%titlesort%,%title%)[ (%subtitle%)]

Wenn ich die Funktion richtig verstehe, soll also aus einer Liste von Feldern der erste gefundene Wert genommen werden, weil anscheinend nicht klar ist, welches der Felder gefüllt sein kann.
Ist das so richtig?

Mit folgendem Ausdruck bekommst Du jeweils das 1. gefüllte Feld ausgegeben:
$regexp('==%feld1%==%feld2%==%feld3%==',=*(.+?)==.*,$1)

Ich persönlich nutze gerne reguläre Ausdrücke, aber das finde ich hier schon sehr unelegant. Ich kann mir das wie gesagt auch mit $if2() bauen, aber der Wunsch nach einer schönen, lesbaren Lösung ist halt doch da.

Ich gebe dir Recht, dass es

recht unelegant ist, speziell, weil du ja aufpassen musst, nach dem ersten Treffer alle weiteren, die dann ggf. noch kommen können, zu ignorieren oder zu löschen, was dann ggf. weitere $if-Konstruktionen nach sich zieht.

Hast du meinen Vorschlag überhaupt ausprobiert?