Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ellipsis with C# (ending on a full word)

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

like image 791
Marko Avatar asked Sep 27 '10 03:09

Marko


People also ask

What is Va_list in C?

va_list is a complete object type suitable for holding the information needed by the macros va_start, va_copy, va_arg, and va_end. If a va_list instance is created, passed to another function, and used via va_arg in that function, then any subsequent use in the calling function should be preceded by a call to va_end.

What does 3 dots mean in C?

The three dots '...' are called an ellipsis. Using them in a function makes that function a variadic function. To use them in a function declaration means that the function will accept an arbitrary number of parameters after the ones already defined.

What is Variadic function in C?

Variadic functions are functions that can take a variable number of arguments. In C programming, a variadic function adds flexibility to the program. It takes one fixed argument and then any number of arguments can be passed.

What is Varargs C?

ISO C defines a syntax for declaring a function to take a variable number or type of arguments. (Such functions are referred to as varargs functions or variadic functions.)


2 Answers

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...
like image 174
Preet Sangha Avatar answered Sep 30 '22 18:09

Preet Sangha


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.
like image 39
Lars Avatar answered Sep 30 '22 19:09

Lars