#region WordWrap Methods
public static String WordWrap(String aText, int maxWidth)
{
//spazio separatore delle parole (lo spazio)
char _WORD_SEPARATOR_ = '\x20';
//caratteri speciali, caratteri che possono essere usati
//come sepratori di parole
char[] _SPECIAL_CHARS_ = {':', ';', '.', ',', '?', '!', '-', '+'};
//StringBuilder per costruzione della stringa finale...
//la stringa finale sarà lunga almeno tanto qnto qlla iniziale.
StringBuilder sb = new StringBuilder(aText.Length);
//StringReader per la lettura delle stringa di input
StringReader sr = new StringReader(aText);
//Ciclo di lettura linea per linea (Paragraph)...
String Paragraph = null;
while((Paragraph = sr.ReadLine()) != null)
{
//Se il paragrafo non eccede la lunghezza massima è OK
if(Paragraph.Length < maxWidth)
{
sb.Append(Paragraph);
}
else
{
//spazio disponbile per ogni linea
int restLen = maxWidth;
//...divido il paragrafo che eccdede la lunghezza per parole
foreach(string Word in Paragraph.Split(new char[]{_WORD_SEPARATOR_}))
{
//...vedo se nella riga che sto costruendo
//c'è spazio per la parola in esame...
string CurrentWord = Word;
//Fino a che la parola in esame non è stata consumata/analizzata tutta...
while(CurrentWord.Length > 0)
{
if(CurrentWord.Length < restLen)
{
//ok c'è spazio per la parola!
sb.Append(CurrentWord).Append(_WORD_SEPARATOR_);
restLen -= CurrentWord.Length + 1;
break; //esame parola completo
}
else
{
//la parola è troppo lunga e non ho tutta la riga a
//disposizione... vado a capo...
if(restLen < maxWidth)
{
sb.Append(Environment.NewLine);
restLen = maxWidth;
}
else
{
//La parola è troppo lunga controllo se è possibile
//separarla per caratteri "speciali"...
//...cerco il carattere "speciale" che è più vicino al limite!
int index = 0;
foreach(char c in _SPECIAL_CHARS_)
{
int p = CurrentWord.LastIndexOf(c);
if(p != -1 && p < restLen && p > index)
index = p;
}
if(index > 0)
{
//ok sono riuscito a trovare un compromesso...
sb.Append(CurrentWord.Substring(0, index + 1));
sb.Append(Environment.NewLine);
CurrentWord = CurrentWord.Substring(index + 1);
restLen = maxWidth;
}
else
{
//nessun compromesso possibile! :(
//la linea non ci sta nella linea corrente e non ci starebbe
//nemmeno in una nuova linea... qsta parola s'ha da tagliare :/
sb.Append(CurrentWord.Substring(0, maxWidth));
sb.Append(Environment.NewLine);
CurrentWord = CurrentWord.Substring(maxWidth);
restLen = maxWidth;
}
}
}
}
}
}
sb.Append(Environment.NewLine);
}
return sb.ToString();
}
#endregion
posted @ venerdì 8 aprile 2005 11:47