2010-09-27 10 views
8

Sto cercando di implementare i puntini di sospensione in Umbraco, il requisito è di 15 caratteri di testo introduttivo ma termina sempre con una parola completa.Ellipsis con C# (che termina con una parola completa)

Ho pensato di utilizzare XSLT, ma poi mi sono reso conto che posso utilizzare un metodo di estensione semplice scritto in C#.

posso facilmente sottostringa del testo e aggiungere "..." ma sono bloccato con il problema di dover concludere con una parola piena .. Ecco il mio codice finora (molto complicato: p)

public string Ellipsis(string text, int length) 
{ 
    return text.Substring(0, length) + "..."; 
} 

testo Esempio

Lorem ipsum dolor sit amet, consectetur adipiscing elit amet.

Se abbiamo implementato il metodo di puntini di sospensione di cui sopra (lunghezza = 15), l'output sarà simile

Lorem ipsum dolor sit amet, consectetur amet adipi ...

Mi piacerebbe essere sicuro che nessuna parola venga mai affettata, quindi l'output dovrebbe apparire come

Lorem ipsum dolor sit amet, consectetur adipiscing del amet ...

Qualsiasi aiuto apprezzato.

EDIT

Dopo aver eseguito il campione per il codice qui sotto, sembra che se la lunghezza puntini di sospensione termina l'ultima parola, nessun testo viene visualizzato affatto.

ecco l'output, vedere la linea 56-60

0 : Lorem... 
1 : Lorem... 
2 : Lorem... 
3 : Lorem... 
4 : Lorem... 
5 : Lorem... 
6 : Lorem ipsum... 
7 : Lorem ipsum... 
8 : Lorem ipsum... 
9 : Lorem ipsum... 
10 : Lorem ipsum... 
11 : Lorem ipsum... 
12 : Lorem ipsum dolor... 
13 : Lorem ipsum dolor... 
14 : Lorem ipsum dolor... 
15 : Lorem ipsum dolor... 
16 : Lorem ipsum dolor... 
17 : Lorem ipsum dolor... 
18 : Lorem ipsum dolor sit... 
19 : Lorem ipsum dolor sit... 
20 : Lorem ipsum dolor sit... 
21 : Lorem ipsum dolor sit... 
22 : Lorem ipsum dolor sit amet,... 
23 : Lorem ipsum dolor sit amet,... 
24 : Lorem ipsum dolor sit amet,... 
25 : Lorem ipsum dolor sit amet,... 
26 : Lorem ipsum dolor sit amet,... 
27 : Lorem ipsum dolor sit amet,... 
28 : Lorem ipsum dolor sit amet, amet... 
29 : Lorem ipsum dolor sit amet, amet... 
30 : Lorem ipsum dolor sit amet, amet... 
31 : Lorem ipsum dolor sit amet, amet... 
32 : Lorem ipsum dolor sit amet, amet... 
33 : Lorem ipsum dolor sit amet, amet consectetur... 
34 : Lorem ipsum dolor sit amet, amet consectetur... 
35 : Lorem ipsum dolor sit amet, amet consectetur... 
36 : Lorem ipsum dolor sit amet, amet consectetur... 
37 : Lorem ipsum dolor sit amet, amet consectetur... 
38 : Lorem ipsum dolor sit amet, amet consectetur... 
39 : Lorem ipsum dolor sit amet, amet consectetur... 
40 : Lorem ipsum dolor sit amet, amet consectetur... 
41 : Lorem ipsum dolor sit amet, amet consectetur... 
42 : Lorem ipsum dolor sit amet, amet consectetur... 
43 : Lorem ipsum dolor sit amet, amet consectetur... 
44 : Lorem ipsum dolor sit amet, amet consectetur... 
45 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
46 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
47 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
48 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
49 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
50 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
51 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
52 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
53 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
54 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
55 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
56 : ... 
57 : ... 
58 : ... 
59 : ... 
60 : ... 
61 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
62 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
63 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
64 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
65 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
66 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
67 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
68 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
69 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
70 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
71 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
72 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
73 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
74 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
75 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
76 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
77 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
78 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
79 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 

Marko

+0

si dovrebbe usare il carattere puntini di sospensione ... invece di tre punti – Dann

risposta

19
if (text.Length <= length) return text; 
int pos = text.IndexOf(" ", length) ; 
if (pos >= 0) 
    return text.Substring(0, pos) + "..."; 
return text; 

Edit: Questo è il programma che ho testato con:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 { 
    class Program { 
     static void Main(string[] args) { 
      for (int i = 0; i < 40; ++i) { 
       string s = Ellipsis("Lorem ipsum dolor sit amet, amet consectetur adipiscing elit.", i); 
       Console.WriteLine("{0} : {1}", i, s); 
      } 
     } 

     static public string Ellipsis(string text, int length) { 
      if (text.Length <= length) return text; 
      int pos = text.IndexOf(" ", length) ; 
      if (pos >= 0) 
      return text.Substring(0, pos) + "..."; 
      return text; 
     } 
    } 
} 

Ecco uscita:

0 : Lorem... 
1 : Lorem... 
2 : Lorem... 
3 : Lorem... 
4 : Lorem... 
5 : Lorem... 
6 : Lorem ipsum... 
7 : Lorem ipsum... 
8 : Lorem ipsum... 
9 : Lorem ipsum... 
10 : Lorem ipsum... 
11 : Lorem ipsum... 
12 : Lorem ipsum dolor... 
13 : Lorem ipsum dolor... 
14 : Lorem ipsum dolor... 
15 : Lorem ipsum dolor... 
16 : Lorem ipsum dolor... 
17 : Lorem ipsum dolor... 
18 : Lorem ipsum dolor sit... 
19 : Lorem ipsum dolor sit... 
20 : Lorem ipsum dolor sit... 
21 : Lorem ipsum dolor sit... 
22 : Lorem ipsum dolor sit amet,... 
23 : Lorem ipsum dolor sit amet,... 
24 : Lorem ipsum dolor sit amet,... 
25 : Lorem ipsum dolor sit amet,... 
26 : Lorem ipsum dolor sit amet,... 
27 : Lorem ipsum dolor sit amet,... 
28 : Lorem ipsum dolor sit amet, amet... 
29 : Lorem ipsum dolor sit amet, amet... 
30 : Lorem ipsum dolor sit amet, amet... 
31 : Lorem ipsum dolor sit amet, amet... 
32 : Lorem ipsum dolor sit amet, amet... 
33 : Lorem ipsum dolor sit amet, amet consectetur... 
34 : Lorem ipsum dolor sit amet, amet consectetur... 
35 : Lorem ipsum dolor sit amet, amet consectetur... 
36 : Lorem ipsum dolor sit amet, amet consectetur... 
37 : Lorem ipsum dolor sit amet, amet consectetur... 
38 : Lorem ipsum dolor sit amet, amet consectetur... 
39 : Lorem ipsum dolor sit amet, amet consectetur... 
+0

Hi @Preet, in realtà questo non funziona restituisce solo ** '' ... ** Quando il debug, la variabile ** pos ** è -2. – Marko

+0

Mi dispiace, l'ho fatto senza un compilatore a portata di mano, l'ho corretto ora –

+0

Molto meglio! Grazie amico kiwi :) – Marko

3

Voglio fornire una implementazione alternativa perché il codice fornito da Preet non garantisce una lunghezza massima del testo. Ho dovuto implementare una funzione di ellissi di parola che restituisce un taglio di ellissi di parola di testo con lunghezza limitata. Inoltre, i segni di punteggiatura vengono ritagliati subito prima dei puntini di sospensione.

public class WordProcessing 
{ 
    static public string WordEllipsis(string text, int maxLength, string ellipsis = "...") 
    { 
     string result; 

     if (text.Length <= maxLength) 
     { 
      result = text; 
     } 
     else if (maxLength <= ellipsis.Length) 
     { 
      result = ellipsis.Substring(0, maxLength); 
     } 
     else 
     { 
      result = text.Substring(0, maxLength - ellipsis.Length); 
      var lastWordPosition = result.LastIndexOf(' '); 

      if (lastWordPosition < 0) 
      { 
       lastWordPosition = 0; 
      } 
      result = result.Substring(0, lastWordPosition).Trim(new[] { '.', ',', '!', '?' }) + ellipsis; 
     } 

     return result; 
    } 
} 

Unità testata - funziona come un fascino.

uscita:

0 : 
1 : . 
2 : .. 
3 : ... 
4 : ... 
5 : ... 
6 : ... 
7 : ... 
8 : ... 
9 : Lorem... 
10 : Lorem... 
11 : Lorem... 
12 : Lorem... 
13 : Lorem... 
14 : Lorem... 
15 : Lorem ipsum... 
16 : Lorem ipsum... 
17 : Lorem ipsum... 
18 : Lorem ipsum... 
19 : Lorem ipsum... 
20 : Lorem ipsum... 
21 : Lorem ipsum dolor... 
22 : Lorem ipsum dolor... 
23 : Lorem ipsum dolor... 
24 : Lorem ipsum dolor... 
25 : Lorem ipsum dolor sit... 
26 : Lorem ipsum dolor sit... 
27 : Lorem ipsum dolor sit... 
28 : Lorem ipsum dolor sit... 
29 : Lorem ipsum dolor sit... 
30 : Lorem ipsum dolor sit... 
31 : Lorem ipsum dolor sit amet... 
32 : Lorem ipsum dolor sit amet... 
33 : Lorem ipsum dolor sit amet... 
34 : Lorem ipsum dolor sit amet... 
35 : Lorem ipsum dolor sit amet... 
36 : Lorem ipsum dolor sit amet, amet... 
37 : Lorem ipsum dolor sit amet, amet... 
38 : Lorem ipsum dolor sit amet, amet... 
39 : Lorem ipsum dolor sit amet, amet... 
40 : Lorem ipsum dolor sit amet, amet... 
41 : Lorem ipsum dolor sit amet, amet... 
42 : Lorem ipsum dolor sit amet, amet... 
43 : Lorem ipsum dolor sit amet, amet... 
44 : Lorem ipsum dolor sit amet, amet... 
45 : Lorem ipsum dolor sit amet, amet... 
46 : Lorem ipsum dolor sit amet, amet... 
47 : Lorem ipsum dolor sit amet, amet... 
48 : Lorem ipsum dolor sit amet, amet consectetur... 
49 : Lorem ipsum dolor sit amet, amet consectetur... 
50 : Lorem ipsum dolor sit amet, amet consectetur... 
51 : Lorem ipsum dolor sit amet, amet consectetur... 
52 : Lorem ipsum dolor sit amet, amet consectetur... 
53 : Lorem ipsum dolor sit amet, amet consectetur... 
54 : Lorem ipsum dolor sit amet, amet consectetur... 
55 : Lorem ipsum dolor sit amet, amet consectetur... 
56 : Lorem ipsum dolor sit amet, amet consectetur... 
57 : Lorem ipsum dolor sit amet, amet consectetur... 
58 : Lorem ipsum dolor sit amet, amet consectetur... 
59 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
60 : Lorem ipsum dolor sit amet, amet consectetur adipiscing... 
61 : Lorem ipsum dolor sit amet, amet consectetur adipiscing elit. 
Problemi correlati