jueves, 27 de marzo de 2008

El programita de ruby, paso a paso...

Como mucha gente no pudo seguirle el hilo por la sintaxis, vamos a partirlo en cachitos y explicando paso a paso, para que vean que es una boludez, solo que inentendible sin identacion y colorcitos :p


Acá va:

File.open($*[0],"r+") do |f|
lines = f.readlines
delay = $*[1]

En la primer linea, abro el archivo. El "$*[0]" es el equivalente al argv, es el primer parámetro pasado por linea de comando. El "do |f|" hace que el archivo abierto sea contenido en la variable "f".
La segunda linea ubica en la variable "lines" (a partir de ahora un array) todas las lineas del archivo abierto.
"Delay" es un parámetro de entrada para el tiempo que queres correr el subtitulo.

j = 1
i = 0
while(i < lines.length)

"j" es la variable que va guardando por que parlamento del subtitulo va. "i" es un contador sobre las lineas del subtitulo.
El while es el clasico, que itera hasta el final de las lineas.

if(lines[i].to_i.eql? j)

i = i+1

prin, fin = lines[i].chomp.split(/-->/)

Si la linea en la que estoy es igual a el numero de parlamento que espero, entonces la siguiente linea es la que quiero modificar.
Con el "prin, fin = lines[i].chomp.split(/-->/)", ubico en la variable prin el principio del split y en fin la segunda parte del split. Aca spliteo por -->, utilizando los caracteres de escape.

El siguiente codigo se repite 2 veces, pero voy a explicarlo solo una.

h,min,seg = prin.chomp.split(/:/)
seg2,dec = seg.chomp.split(/,/)
seg2 = seg2.to_i + delay.to_i
if(seg2 > 60)
min = min + 1
seg2 = seg2 - 60
if(min >60)
h = h + 1
min = min - 60

Spliteo de nuevo, y guardo la hora, minuto y segundo, lo mismo con los segundos y los decimales. A los segundos le sumo el delay que tenia por parametro, y reacomodo.

Esta quizas es la linea mas fea, pero tiene mucho sentido:

lines[i] = h+ "\:" + min + "\:" + seg2.to_s + "\," + dec + "\-\-\>" + hf+ "\:" + minf + "\:" + seg2f.to_s + "\," + decf + "\n"

Solamente le asigno a la linea que contiene el tiempo del parlamento, los elementos modificados. Es verdad, se ve fea sin colorcitos, pero bueno, no quedaba otra.

Por ultimo, reestablezco indices y hago:

f.pos = 0
f.print lines
f.truncate(f.pos)

La primera vuelve el cursor al inicio del archivo, despues imprimo el array "lines" modificado en el archivo y hago... ¿truncate? no se para que, pero sin eso no funcionaba :p Que sincero que soy, je.


Espero que esto les haga ver que no es tan feo como creian... porque sino me van a venir a buscar de Ruby a cagarme a trompadas, por no hacerles buena publicidad :(


Saludos gente!


Blue!

No hay comentarios: