RegEx, Arrays, formatierte Ausgabe - 3 verschiedene Fragen für mein neues Tasker-Projekt

D

dafunkydroid

Erfahrenes Mitglied
46
Hallo Tasker-Gemeinde!
Ich habe mir da ein etwas komplexes Thema vorgenommen: Es gibt eine ziemlich gute Sprachlern-App (Ankidroid) auf SQL-Basis, die man selbst befüllen kann.

Was mir aber sehr fehlt, ist eine intuitive Nachschlage-Option. Die möchte ich jetzt selbst basteln :-D
Aus der DB wird die relevante Spalte ("Sprache1 - Sprache2") von Tasker ausgelesen.
Jetzt geht es darum, eine Volltext-Suche zu machen, und alle Ergebnisse in einer Scene auszuspucken. Mit Hilfe eines Codeschnipsels habe ich das auch rudimentär hinbekommen, hänge aber an einigen Stellen... Wo sind die Tasker-Cracks? :)

1) RegEx-Suchstring anpassen
Die Suche ist derzeit eine RegEx-Suche (vermute ich, hab den Schnipsel geklaut aber nicht gecheckt :p). Wenn ich nach 'apple' suche, wird auch 'pineapple' ausgespuckt. Kann mir jemand helfen, den Syntax so zu ändern, dass 'pineapple' nicht mehr gefunden wird?
Variable Set %index to %sql(#?*SUCHSTRING*)

2) Suchergebnisse
Das Ergebnis in %index sind übrigens die IDs der einzelnen Zeilen, als z.B. "2,3,6,11,25" Das wird dann mit "Split Variable" zerlegt. Die Suchergebnisse bekomme ich dann nacheinander mit
%sql(%index1)
%sql(%index2)
%sql(%index3)
usw. angezeigt.
Zum einen bin ich aber recht sicher, dass ich die einzelnen Ergebnisse dann später nochmal separat splitten muss (siehe Frage 3 - Tabellarische Anzeige). Zum anderen habe ich das Problem, dass ich das grad noch hard gecoded habe. Entweder es gibt mehr Suchergebnisse als ich hinterlegt habe, oder es werden leere Variablen angezeigt.
Wie kann ich das in den Griff kriegen?

3) Suchergebnisse in Scene Tabellenformat anzeigen
Im scrollbaren Text-Ergebnisfeld werden die Ergebnisse aktuell zentriert und Zeile für Zeile ausgegeben.
Das ist sehr unübersichtlich, vor allem wenn die Zeilenbreite nicht reicht - was es bräuchte, wäre eine Art unsichtbare Tabelle, damit Sprache1 und Sprache2 gegenüberstehen, aber Sprache2 (in der zweiten Hälfte des Textfelds) bündig dargestellt werden. Könnt ihr mir nen Tipp geben, wie ich das erreichen könnte?
Eine sehr basic HTML-Tabelle habe ich versucht, aber da wird wohl keine Formatierung übernommen, sondern nur der Inhalt.
Zwei separate (scrollbare) Textfelder fällt aus, da ja die Zeilen (Sprache1/Sprache2) syncron bleiben müssen.


Uff. Viele Fragen. Aber ich habe echt Spaß an dem Projekt, und würd mich echt freuen wenn das vorzeigbar würde. Dann würde ich das auch sehr gerne auf der Seite des Programm (Ankidroid, falls es jemanden interessiert) posten, und natürlich auch hier. Aktuell ists noch ne totale Baustelle ;-)

Danke euch für jeden Input und Lösungen! :)
 
Kannst du dein Projekt exportieren und mit der Datenbank als .zip hier hochladen, damit wir deine Baustelle genauer anschauen können.
 
  • Danke
Reaktionen: dafunkydroid
Ja sicher, sehr gerne!
Ich dachte nur, es ist höflicher und besser wenn ich konkrete Fragen stelle, statt dass sich jemand durch Baustellen & Stümpercode gräbt ;-) Achja, da ja noch nicht mal der Unterbau steht, nicht vom grafisch aufhalten lassen bitte ;-)

Im Anhang das Projekt. Kurze Erläuterungen:
collection.anki2 ist die SQL-Datenbank der Ankidroid-App. Die relevante Spalte ist in der Tabelle 'notes', in der Spalte 'flds'

Das Tasker-Projekt besteht derzeit aus 2 Tasks und einer Scene.
Der Task "Run "AnkidroidHelper_Main" öffnet die entsprechende Scene. Hier wird nur der Suchbegriff eingegeben, und als %par1 an den Task "Run Search" weitergegeben. Das Suchergebnis wiederrum wird dann an die Scene weitergegeben.

Danke für alle Tipps! Und mir hilft es schon sehr, wenn ihr mich bei den konkreten Fragen in die richtige Richtung schubsen könnt... Viele Grüße :)

Edit: Ergänzung: Wer sich die SQL nicht anschauen möchte: Das Ergebnis der relevanten Spalte ist im Format "Sprache1[TAB]Sprache2"
 

Anhänge

  • Ankidroid Helper.zip
    96,9 KB · Aufrufe: 76
  • Danke
Reaktionen: Mathens
1) Der RegEx-Suchstring den du brauchst ist (?i)\b%search\b . Wenn zwischen Gross- und Kleinschreibung auch unterschieden werden soll, muss das (?i) weggelassen werden.
Jedoch lässt er sich so nicht verwenden wie bisher.
Um ihn zu verwenden brauchst du eine FOR-Schleife und ein IF-Abfrage.
Bei der IF-Abfrage musst du Matches Regex auswählen(~R).
A1: For [ Variable:%index Items: 0:%anki(#) ]
A2: If [ %anki(%index) ~R (?i)\b%search\b ]
A3: Variable Set [ Name:%Ergebnisse To:%anki(%index)
Recurse Variables:Off Do Maths:Off Append:On ]
A4: End If
A5: End For

2) Das erreichst du, wenn du die Ergebnisse der For-Schleife in einer einzelnen Variable schreibst. Dazu musst du bei Variable Set den Haken bei Append setzen.

3) Dazu habe ich dir leider noch keine Lösung
 
Zuletzt bearbeitet:
Bearbeitet von: Mathens - Grund: Fehler im Suchstring behoben
  • Danke
Reaktionen: dafunkydroid
Wow, Wahnsinn!!! Ich kann es heute nicht mehr checken, aber ich meld mich zurück sobald ichs angefasst habe! Liest sich aber sehr schlüssig (verdammt, ich muss mir wirklich mal For und RegEx anschauen bzw. draufschaffen).

Das mit der formatierten Ausgabe... ich horch mich mal um. Was natürlich eine heidenarbeit ist, ist das zu Fuß zu machen - lauter einzelne Textfelder, und einer vorwärts/rückwärts Blätterfunktion und Array Rotate... Aber das möcht ich eigentlich um jeden Preis vermeiden, das gibt garantiert Spaghetti. Naja, ich schau mal. Und vielleicht gibts ja noch nen heißen Ansatz hier von anderen.

Jedenfalls ganz großes Dankeschön dir!! Das ist großes Kino. Ich gebe bald Rückmeldung!

Viele Grüße!
 
Der Suchstring hatte noch einen Fehler.
Der korrekte ist (?i)\b%search\b
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: dafunkydroid
Echt Wahnsinn. Das funktioniert einwandfrei!! Vielen vielen Dank dir nochmal! :thumbsup:

Für 3) habe ich übrigens auch einen recht vielversprechenden, oder zumindest zielführenden Ansatz gefunden: Das Suchergebnis kann mit Search/Replace zu einer HTML-Tabelle umgebastelt werden. Ich kann ein Element WebView erstellen, in diesem kann eine HTML-Datei angezeigt werden.
Leider muss ich (aktuell) einen Umweg über eine Datei machen, lokale Variablen scheint Tasker als Quelle nicht verarbeiten zu können (wenngleich die Option angeboten wird). Aber da kann ich mich mal durchwurschteln, ggf. nachfragen wie ich das ohne Umweg über eine Temp-Datei hinbekomme...

Kleiner Schritt für große Profis, großer Schritt für kleine Amateure :biggrin:
 
Auf die Lösung mit einer HTML-Tabelle und einer zusätzlichen Datei bin ich auch gekommen.
Habe es gerade noch mit einer Variable versucht und bei mir hats geklappt.
Lade dir sobald ich mehr Zeit habe den Task hier hoch.

Wie hast du es mit dem splitten der zwei Sprachen gelöst?
 
  • Danke
Reaktionen: dafunkydroid
Mathens schrieb:
Wie hast du es mit dem splitten der zwei Sprachen gelöst?

Eigentlich ist es gar kein richtiges splitten und auch nicht sehr sauber :p
Bei jedem Fund in der Schleife stelle ich <td> voran und Ende mit </td>
Dann suche ich zum Schluss nach [TAB] und ersetze es durch
HTML:
</td>
<td>

Ohne den Umweg über eine Datei muss ich nochmal schauen - vielleicht liegt es daran dass es keine globale Variable war...
 
Bei mir habe ich in den Variablen keinen [TAB].
Sondern es sieht so aus
Screenshot_20180517-165925-01.jpeg

dafunkydroid schrieb:
Ohne den Umweg über eine Datei muss ich nochmal schauen - vielleicht liegt es daran dass es keine globale Variable war...
Mit einer globalen Variable ist es einfacher. Geht aber auch mit einer lokalen Variable wenn du am Ende von Task die Aktion "Return" einfügst und so die Variable an die Scene weitergibst.
In der Scene musst du noch bei der Aktion "Perform Task" bei Punkt "Return Value Variable" die Variable angeben
 
Mhmm, das ist seltsam. Bei mir wirds als Tab formatiert angezeigt und ausgegeben... Meine Systemsprache ist Englisch, vielleicht deswegen?
Du könntest auch mal versuchen, das Zeichen einfach zu kopieren, und als Replace-Wert einzusetzen...?

Das mit der Variable versuch ich dann gleich mal, Super! :)

PS: Jetzt wo wir so nett am reden sind... :biggrin: Ich würde gerne überprüfen, ob das Suchfeld leer ist. Das Problem dabei: "If Variable Set" greift nicht, da %new_val nicht gelöscht wird, sondern nur eben leer ist... Wenn ich überprüfen wollte "If Variable matches", kann ich den Wert nicht leer lassen :confused2:
 
Moin
Eine Variable kann nicht leer sein.
Eine Variable ohne Inhalt ist per Definition "not set"
 
Also, das ist reproduzierbar, auch in einer Neuen Szene:
Text Input Feld und ein Button. Der Button ist so konfiguriert: Flash "HUHU" if %val_new !Set

Wenn ich ein paar Buchstaben tippe, dann alles wieder weglösche, und den Button drücke, passiert - nix :tongue:
 
Kann ich bestätigen.

Wenn du %new_val vor der Abfrage in einer anderen Variable speicherst, kannst du mit dieser die Abfrage machen.
Diese Variable hat den Wert "%new_val" wenn %new_val nicht gesetzt ist.
Mit ~ \%new_val kannst du diese dann abfragen.
 
  • Danke
Reaktionen: dafunkydroid
Moin
Dein Button hat keinen Zugriff auf %val_new. Die Variable ist eine lokale Variable für dein Textfeld.
Du musst in dem Fall, den von Mathens beschriebenen Weg gehen.
 
Da muss ich dir wieder widersprechen :biggrin:
Wenn ich auf den Button Flash %new_val setze, passiert genau das ;-)

Aber der Workaround von Mathens klappt, Merci!
Es wird immer mehr :cool2:
 

Ähnliche Themen

holms
Antworten
1
Aufrufe
88
Mathens
Mathens
J
Antworten
4
Aufrufe
147
rtwl
rtwl
H
  • Hastenichgesehen
Antworten
2
Aufrufe
165
Hastenichgesehen
H
Zurück
Oben Unten