Crear una lectura para KTouch con una lista de palabras

domingo 12 septiembre 2010 | In English

Debido a que no encontré ninguna lectura que me gustara para KTouch, al menos no una que me permitiera practicar con un gran número de palabras, pensé que sería útil crear una basada en palabras al azar tomadas de una de las listas de palabras usualmente localizadas en /usr/share/dict, aunque este mismo procedimiento puede usarse con cualquier lista de palabras. No me tomó mucho tiempo hacerlo, pero aún así fue interesante.

Al final incluyo la lectura que resulta de este procedimiento, así como una lectura basada en las palabras del libro Las Aventuras de Sherlock Holmes.

Temas
La estructura de una lectura de KTouch
Creando la lectura de KTouch
Una breve explicación de algunos de los parámetros utilizados aquí
Descarga las lecturas para KTouch
Una pequeña nota al pie

La estructura de una lectura de KTouch

Antes que nada, las lecturas en KTouch son solo archivos XML. Estos archivos XML contienen texto dividido en lineas y lineas agrupadas en niveles. Esto es como las lecturas en KTouch están organizadas:

<KTouchLecture>
  <Title>The title of the lecture</Title>
  <Comment>The comment of the lecture</Comment>
  <FontSuggestions>Monospace</FontSuggestions>
  <Levels>
    <Level>
      <LevelComment>A comment for the level</LevelComment>
      <NewCharacters>The new characters of the level</NewCharacters>
      <Line>A line of text that will appear in KTouch</Line>
      <Line>Another line of text that will appaer in KTouch</Line>
      <Line>One last line that will appear in KTouch</Line>
    </Level>
  </Levels>
</KtouchLecture>

Ahora que sabemos a lo que queremos llegar, vamos a ver como esta organizada la lista de palabras en el archivo del diccionario, viendo las primeras lineas de él (en este ejemplo usaremos al archivo spanish):

A
A's
AOL
AOL's
Aachen
Aachen's
Aaliyah
Aaliyah's
Aaron

Creando la lectura de KTouch

Lo que haremos para obtener una lectura utilizable para KTouch es lo siguiente:

  1. Revolver la lista de palabras.
  2. Eliminar los saltos de linea para obtener una sola (y larga) linea de palabras.
  3. Dividir esta linea de palabras en lineas más cortas que contengan varias palabras cada una.
  4. Agregar las etiquetas necesarias a las lineas.

Recomiendo crear una carpeta temporal donde realizemos este procedimiento, de otra manera los archivos serán creados en la carpeta donde estás actualmente. El primer paso es solamente revolver el orden en el que están presentadas las palabras, y guardar los resultados en un nuevo archivo, que utilizaremos en el siguiente paso:

sort -R /usr/share/dict/spanish > palabras-revueltas.txt

Ahora, convertiremos el archivo en una sola linea, para esto utilizaremos tr para borrar los saltos de linea en el archivo:

tr '\n' ' ' < palabras-revueltas.txt > una-linea.txt

Después de esto, necesitamos dividir esta linea en varias lineas más pequeñas, pero sin cortar las palabras, en mi ejemplo utilizaré una longitud máxima de 80 caracteres por linea:

fold -sw 80 una-linea.txt > multiples-lineas.txt

El valor por default de fold ya es de 80 caracteres, aquí lo especifico para que lo puedas cambiar a cualquier longitud que desees.

Una vez hecho esto, comenzaremos a generar el archivo XML, haré esto como comandos de una linea para facilitar el copiado y pegado, comenzamos por imprimir la cabeza del archivo:

echo -e "<KTouchLecture>\n  <Title>La lista entera de palabras en español</Title>\n  <Comment>La lista entera de palabras en español</Comment>\n  <FontSuggestions>Monospace</FontSuggestions>\n  <Levels>\n    <Level>\n      <LevelComment>Esto muestra las lineas de palabras de la 1 a la 20</LevelComment>\n      <NewCharacters>Lineas: 1-20</NewCharacters>" > final.xml

Después utilizamos awk para leer los contenidos del archivo y agregar las etiquetas necesarias:

awk '{ print "      <Line>" $0 "</Line>"
if(NR %20 == 0 )
print "    </Level>\n    <Level>\n      <LevelComment>Esto muestra las lineas de palabras de la " (NR + 1) " a la " (NR + 20) "</LevelComment>\n      <NewCharacters>Lineas: " (NR+1) "-" (NR+20) "</NewCharacters>" }' multiples-lineas.txt >> final.xml

Agregamos el pie del archivo:

echo -e "    </Level>\n  </Levels>\n</KTouchLecture>" >> final.xml

Y finalmente borramos los archivos transitorios, si estás en la carpeta temporal que sugerí hacer al principio puedes usar *.txt:

rm multiples-lineas.txt palabras-revueltas.txt una-linea.txt

El resultado final se verá algo así, solo mucho más largo:

<KTouchLecture>
  <Title>La lista entera de palabras en español </Title>
  <Comment>La lista entera de palabras en español </Comment>
  <FontSuggestions>Monospace</FontSuggestions>
  <Levels>
    <Level>
      <LevelComment>Esto muestra las lineas de palabras de la 1 a la 20 </LevelComment>
      <NewCharacters>Lineas: 1-20</NewCharacters>
      <Line>matorralejo maitines retribuente alcalareña librepensador rarefacta glose </Line>
      <Line>húmida frecuentar picaposte ahorcar ancianidad tresquilar rocho cateramba </Line>
    </Level>
  </Levels>
</KtouchLecture>

Una breve explicación de algunos de los parámetros utilizados aquí

En fold, el parámetro -s indica que los espacios son lo que está separando las palabras, y el parámetro -w indica el máximo de caracteres por linea.

En echo, usamos el parámetro -e para habilitar la interpretación de las diagonales invertidas como caracteres de escape, de otra manera estaríamos imprimiendo \n en el archivo en vez de obtener un salto de linea.

Awk es muy extenso para explicarlo aquí ya que básicamente es un lenguaje de programación, las partes notables a explicar es que lo que tenemos entre { y } será ejecutado una vez por cada linea que tenemos, NR representa el número de linea, y utilizamos $0 para imprimir la linea en la que estamos trabajando actualmente, creo que el resto se explica solo para alguien con conocimientos de programación.

Descarga las lecturas para KTouch

Noté que mucha gente llega buscando lecturas para descargar y no un método para hacerlas, así que decidí poner en línea los resultados de este procedimiento. Adicionalmente, debido a que esta lectura es la lista de palabras en español sin ningún filtro, y que por lo tanto podría contener palabras que afecten la sensibilidad de alguien, sin mencionar que no es segura para niños, decidí tomar un libro del dominio público, Las Aventuras de Sherlock Holmes, y convertirlo en la lista de palabras únicas que aparecen en el libro, después hacer este procedimiento, y hacer el resultado disponible para descargar.

Descargar la lectura para KTouch con la lista completa de palabras en español:
lectura_ktouch_palabras_espanol.tar.gz
md5sum: b56a97320153e206502adc1d7703fbf6

Descargar la lectura para KTouch con las palabras de Las Aventuras de Sherlock Holmes:
lectura_ktouch_palabras_sherlock.tar.gz
md5sum: 99b3c040423f7c38b31153e9ae4913b3

Una pequeña nota al pie

Cuando hice esto originalmente estaba dentro de ViM y trate de usar:

:set tw=80
V
gq

Sin embargo hay un problema haciendo esto en Vim, debido a como maneja las lineas, y ya que aquí hay una sola linea enorme, se alentará mucho y consumirá una gran cantidad de memoria haciendo esta operación, sin mencionar que usar fold es el método más conveniente para hacer esto, de hecho, claramente Vim no es necesario para nada de esto que hicimos, solo sucedió que estaba dentro y accidentalmente me tope con esto.

Categorías: Comandos, FOSS, KDE, Linux, Manipulación de Texto