# SortWords

SortWords ist ein Bash-Skript, dass eine Liste von Wörtern nach ihren auftretenden Buchstaben sortiert. Damit können Buchstaben in KTouch-Lektionen der Reihe nach eingeführt werden und in jeder Stufe nur die Wörter abgefragt werden, deren Buchstaben bereits bekannt sind.

Die [Lektion](KTouchFuerNeoEinrichten.md#lektionen) *Deutsch (Neo2 10.000 Wörter)* wurde mit diesem Skript erstellt.

## Download
Alle Dateien befinden sich im Repository unter [ktouch/tools/sortWords](https://git.neo-layout.org/neo/neo-layout/src/branch/master/ktouch/tools/sortWords). Dabei sind nur folgende Dateien zum Ausführen notwendig:

 * [in.txt](https://git.neo-layout.org/neo/neo-layout/raw/branch/master/ktouch/tools/sortWords/in.txt) - Eine beliebige Textdatei mit den zu sortierenden Wörtern.
 * [key.conf](https://git.neo-layout.org/neo/neo-layout/raw/branch/master/ktouch/tools/sortWords/key.conf) - Konfigurationsdatei mit der Reihenfolge der Buchstaben
 * [sortWords.sh](https://git.neo-layout.org/neo/neo-layout/raw/branch/master/ktouch/tools/sortWords/sortWords.sh) - Das Skript selbst

Die beiden `out`-Dateien sind Beispiel-Ausgaben.

## Einrichten
### in.txt
Zum Einrichten lässt sich einerseits die Eingabedatei `in.txt` beliebig wählen. Sie enthält die zu sortierenden Wörter und muss UTF-8 kodiert sein. Die Wörter müssen durch eine beliebige Anzahl von Whitespacezeichen (also Windows-Zeilentrennzeichen, Linux-Zeilentrennzeichen, Leerzeichen, Tabulator, ...) von einander getrennt sein. Die Datei im Repository enthält die 10.000 häufigsten Wörter der deutschen Sprache.  
Quelle: <http://wortschatz.uni-leipzig.de/html/wliste.html>

### key.conf
Zum anderen lässt sich über die Datei `key.conf` die Reihenfolge der in der KTouch-Lektion zu erlernenden Buchstaben festlegen. Zum editieren der Datei sind in ihr einige Kommentare als Hilfe gestellt. Die vorgegebene Datei ist auf die [1.Ebene](https://neo-layout.org/grafik/tastatur3d/tastatur_neo_Ebene1.png) der Neo2-Tastaturbelegung eingestellt.

## Syntax
Nach dem Download lässt sich die Syntax über den Befehl
```
./sortWords.sh --help
```
einblenden:
```
Usage: ./sortWords.sh [OPTIONEN]
Liest aus der Datei "in.txt" alle Wörter ein und gibt diese sortiert nach der in
der Datei "key.conf" festgelegten Reihenfolge weider aus.
Sie werden einmal in eine Klartextdatei "out.txt" und in eine KTouch-Lektion
"out.ktouch.xml" geschrieben.
Dabei ist egal, wie die Worte in "in.txt" voneinander getrennt sind.
(Windows-Zeilentrennzeichen, Linux-Zeilentrennzeichen, Leerzeichen, Tabulator, ...)

  -k  berücksichtige nur komplett klein geschriebene Worte
  -w  wandle alle Worte in klein-schreibeise um. Setzt automatisch die Option '-k'
  -e  entfernt doppelt vorkommende Worte und sortiert dabei die Ergebnisliste nach
      dem Alphabet. Empfehlenswert in Verbindung mit der Option '-w', da hierbei zwei
      gleiche Worte auftreten können, die sich zuvor durch Groß/kleinschreibung
      unterschieden haben
  -f:<SPALTEN>  faltet die Ausgabedatei "out.txt" nach der angegebenen Anzahl von
                Spalten. Standard=80
  -z:<ZEILEN>   maximale Anzahl an Zeilen pro Trainings-Lektion-Stufe.
                (WARNUNG: Ausführung dauert sehr lange!)

Beispiel: ./sortWords.sh -w -e -z:4
```

Bei den Optionen ist zu beachten:

 * `-f` bestimmt die maximale Zeilenlänge in jeder Stufe. Sofern `-f` nicht angegeben ist, wird das Skript mit dem Standardwert `-f:80` ausgeführt
 * Ohne der Option `-z` wird pro Stufe genau ein neuer Buchstabe eingeführt. Dadurch kann aber bei einer Eingabeliste von vielen Tausend Wörtern schnelle eine Stufe der Lektion aus mehreren Hundert Wörtern bestehen. Mit `-z:<ZEILE>` wird die maximale Anzahl an Zeilen pro Stufe begrenzt auf `<ZEILE>`. Die Ausführung des Skriptes dauert mit dieser Option unverhältnismäßig lange, da sie schlecht implementiert ist (ich habe es halt nicht besser hinbekommmen ;-) )

## Ausführen
Es wird der in der Hilfe angegebene Beispiel-Aufruf ausgeführt:
```
Beispiel: ./sortWords.sh -w -e -z:4
```
mit den Logmeldungen:
```
Zeichenreihenfolge wird geladen: Aus Datei "key.conf"...OK
Quelldatei "in.txt" wird eingelesen...OK
Wörter gesamt = 10170
Formatiere den Quelltext...OK
Nach dem Filtern bleiben 9204 Wörter übrig.

Buchstaben | Anzahl der neuen Wörter
=====================================
en | 3
ar | 9
ud | 54
it | 141
l | 109
g | 281
c | 10
h | 318
o | 180
s | 926
w | 376
k | 476
p | 367
m | 803
z | 492
b | 1163
ä | 441
, | 0
v | 653
f | 1109
ö | 245
. | 0
x | 51
q | 22
ü | 514
j | 165
ß | 216
y | 80

Falte die Datei "out.txt" nach spätestens 80 Spalten...OK
Trainings-Lektions-Stufen werden auf 4 Zeilen begrenzt............................OK
Erstelle KTouch-Lektion "out.ktouch.xml"...OK
```

In Verbindung mit den beiden vorgegebenen Dateien `in.txt` und `key.conf` erstellt das Skript die bereits im Repository hinterlegten Ausgabedateien:

 * [out.txt](https://git.neo-layout.org/neo/neo-layout/raw/branch/master/ktouch/tools/sortWords/out.txt) - Die sortierten Wörter in einem Klartextformat
 * [out.ktouch.xml](https://git.neo-layout.org/neo/neo-layout/raw/branch/master/ktouch/tools/sortWords/out.ktouch.xml) - Die sortierten Wörter als KTouch-Lektion

Dabei bewirkten die verwendeten Optionen:

  * Durch die Option `-w` wurden alle Wörter in kleinschreibweise umgewandelt, damit zum vereinfachten Lernen von Neo2 der Fokus auf den neu positionierten Buchstaben liegt.
  * Die Eingabeliste `in.txt` ist nicht besonders gut bearbeitet. Es wiederholen sich ständig Wörter. Mit der Option `-e` werden die doppelten Einträge entfernt und die Liste (als Nebeneffekt) nach dem Alphabet sortiert. Dadurch werden Worte mit ähnlichem Anfang direkt hintereinander getippt. Beispiel:
  ```
  trage tragen training traurig
  ```
  Als Vorteil prägt man sich beim Schreiben die zu tippende Buchstabenfolge besser ein.  
  
  * Mit der Option `-z:4` wird verhindert, dass eine Stufe aus mehreren Hundert Wörtern bestehen kann. Pro Stufe sind also 4 Zeilen zu je höchstens 80 Zeichen erlaubt. Das bläht die Lektion auf annährend 300 Stufen auf.
