Ellipsis with C# (ending on a full word)
Asked Answered
F

2

8

I'm trying to implement ellipsis in Umbraco, the requirement being 15 characters of intro text but always ending on a full word.

I thought of using XSLT, but then realised that I can use a simple extension method written in C# instead.

I can easily substring the text and append "..." but am stuck with the issue of having to end it with a full word.. Here's my code so far (very complicated :p)

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

Example text

Lorem ipsum dolor sit amet, amet consectetur adipiscing elit.

If we implemented the ellipsis method above (length = 15), the output would look like

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

I'd like to make sure that no word ever gets sliced, so the output should look like

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

Any help appreciated.

EDIT

After running the sample for the code below, it appears that if the ellipsis length ends on the last word, no text is displayed at all.

Here's the output, see line 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

Favianus answered 27/9, 2010 at 3:36 Comment(1)
You should use the ellipsis character … rather than three dotsFirearm
D
20
if (text.Length <= length) return text;
int pos = text.IndexOf(" ", length) ;
if (pos >= 0)
    return text.Substring(0, pos) + "...";
return text;

Edit: This is the program I tested it with:

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;
        }
    }
}

Here is output:

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...
Dagnydago answered 27/9, 2010 at 3:45 Comment(8)
Hi @Preet, actually this doesn't work it just returns ... When I debug, the pos variable is -2.Favianus
Sorry I did it without a compiler handy, have corrected it nowDagnydago
Much better! Thank you fellow kiwi :)Favianus
Hey @Preet, I just ran your code with a sample of 90 characters (using the same text) and it seems that there is an issue with the last word. See my question updateFavianus
This will produce sentences with more characters then the max you put in. Lets take 30 as an example, produces a sentence with 35 characters, 32 without the dots. It should be MAX 30 including the dots (imho). Also instead of using dots, use &hellip; (three dots in one character)Atheroma
follow-up: quickfix: use text.LastIndexOf(" ", length) instead (wont take dots length into account though).Atheroma
Nice function. Just a suggestion... it would be good idea to make sure string isn't null before checking its length.Agribusiness
@dhsto - please feel free to edit the answer to make it better. Thanks.Dagnydago
G
3

I want to give an alternative implemenation because the code given by Preet does not ensure a maximum text length. I had to implement a word ellipsis function that returns a hard length limited text word ellipsis trimming. Additionally punctuation marks are also trimmed just before the ellipsis.

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 tested - works as a charm.

Output:

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.
Goldeneye answered 13/2, 2013 at 9:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.