Il word wrapping consiste nel mandare a capo una parola quando la linea in cui si trova supera una certa lunghezza.
Un modo un po’ hackish per farlo:
def wordwrap(str, lunghezza ) str.gsub( /\n/, "\n\n" ).gsub( /(.{1,#{lunghezza}})(\s+|$)/, "\\1\n" ) endPossiamo migliorarlo un po’, ad esempio facendolo diventare un metodo di
String, e mettendo un valore di default (un valore di default e’ sempre utile)
class String def wordwrap( lung=72 ) gsub( /\n/, "\n\n" ).gsub( /(.{1,#{lun}})(\s+|$)/, "\\1\n" ) end endMa questo metodo rimane molto brutto e poco elastico. Fortunatemente ruby possiede un potente modulo, chiamato Text::Format che permette di effettuare molteplici operazioni sulle stringhe Nel nostro caso si potrebbe fare
require 'text/format' formattatore = Text::Format.new { @columns = 72 } formattatore.format( stringa )Quale logica guida questo sistema? Nulla di speciale.
Text::Format.new accetta
in input un blocco, e lo esegue al suo interno
(tramite il metodo instance_eval(&blocco).)
Eseguendolo imposta il valore della variabile @columns a 68.
Quando viene chiamato il metodo format(), viene usata questa variabile ( e molte altre, documentate insieme al modulo) per formattare la stringa.
In effetti se provate questo codice vi troverete una curiosa indentazione all’inizio
del testo. Se volete eliminarla vi bastera’ scrivere
Text::Format.new { @columns = 68 @first_indent = 0 }