2010-10-29 15 views
16

Prima di re-inventare la ruota (male), vorrei sapere se esiste un codice Java esistente per avvolgere le righe di testo su una larghezza massima specificata. L'ideale sarebbe:Codice Java per l'avvolgimento di righe di testo su una larghezza massima della linea

  • rispetto Linebreaks esistenti
  • spezzare le righe che superano una lunghezza massima confini di parola
  • rottura parole la cui lunghezza supera la larghezza massima della linea da trattini inserimento

Modifica: qui non ci sono "pixel", solo java.lang.String. "larghezza massima" si riferisce al numero di caratteri su una linea.

+2

Thar be Dragons :-) –

+1

Sei alla ricerca di un algoritmo pixel perfetto, o farebbe un'approssimazione? – aioobe

risposta

0

Che cosa si vuole fare sarebbe lavorare solo se si visualizza i risultati con un carattere a larghezza fissa. Altrimenti il ​​numero di caratteri in una riga non sarebbe lo stesso da linea a linea. Se per te va bene, direi che il tuo è un caso abbastanza raro (specialmente considerando la sillabazione), quindi dubito che troverai soluzioni già pronte.

0

Se si sta tentando di formattare un po 'di documentazione, c'è anche la vecchia famiglia di comandi unix roff (o runoff). Dovresti solo inserire i comandi di formattazione e lasciare che roff faccia il lavoro pesante.

1
public static List<String> stringBreak(String string, int maxChar) { 

    List<String> subLines = new ArrayList<String>(); 

    int length = string.length(); 
    int start = 0; 
    int end = maxChar; 
    if (length > maxChar) { 

     int noOfLines = (length/maxChar) + 1; 

     int endOfStr[] = new int[noOfLines]; 

     for (int f = 0; f < noOfLines - 1; f++) { 

      int end1 = maxChar; 

      endOfStr[f] = end; 

      if (string.charAt(end - 1) != ' ') { 

       if (string.charAt(end - 2) == ' ') { 

        subLines.add(string.substring(start, end - 1)); 
        start = end - 1; 
        end = end - 1 + end1; 

       } else if (string.charAt(end - 2) != ' ' 
         && string.charAt(end) == ' ') { 

        subLines.add(string.substring(start, end)); 
        start = end; 
        end = end + end1; 

       } else if (string.charAt(end - 2) != ' ') { 

        subLines.add(string.substring(start, end) + "-"); 
        start = end; 
        end = end + end1; 

       } else if (string.charAt(end + 2) == ' ') { 
        System.out.println("m here ............"); 
        int lastSpaceIndex = string.substring(start, end) 
          .lastIndexOf(""); 
        subLines.add(string.substring(start, lastSpaceIndex)); 

        start = lastSpaceIndex; 
        end = lastSpaceIndex + end1; 
       } 

      } else { 

       subLines.add(string.substring(start, end)); 
       start = end; 
       end = end + end1; 
      } 

     } 

     subLines.add(string.substring(endOfStr[noOfLines - 2], length)); 

    } 

    return subLines; 
} 
+9

Il mio cervello ha lanciato un IndexOutOfBoundsException durante la lettura di questo snippet di codice. :( –

0

Ecco il mio prendere

private static final String linebreak = "\n"; // or "\r\n"; 

public static String wrap(String string, int lineLength) { 
    StringBuilder b = new StringBuilder(); 
    for (String line : string.split(Pattern.quote(linebreak))) { 
     b.append(wrapLine(line, lineLength)); 
    } 
    return b.toString(); 
} 

private static String wrapLine(String line, int lineLength) { 
    if (line.length() == 0) return linebreak; 
    if (line.length() <= lineLength) return line + linebreak; 
    String[] words = line.split(" "); 
    StringBuilder allLines = new StringBuilder(); 
    StringBuilder trimmedLine = new StringBuilder(); 
    for (String word : words) { 
     if (trimmedLine.length() + 1 + word.length() <= lineLength) { 
      trimmedLine.append(word).append(" "); 
     } else { 
      allLines.append(trimmedLine).append(linebreak); 
      trimmedLine = new StringBuilder(); 
      trimmedLine.append(word).append(" "); 
     } 
    } 
    if (trimmedLine.length() > 0) { 
     allLines.append(trimmedLine); 
    } 
    allLines.append(linebreak); 
    return allLines.toString(); 
} 

(Trips Questa soluzione due spazi ad uno spazio (in modo stesso difetto che @jett ha con Apache Commons WordUtils)).