Wrappare i testi ad una certa lunghezza di caratteri.

#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

Print
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011