Многоточие с C # (заканчивается на полное слово) - PullRequest
8 голосов
/ 27 сентября 2010

Я пытаюсь реализовать многоточие в Umbraco, требование состоит из 15 символов вводного текста, но всегда заканчивается полным словом.

Я думал об использовании XSLT, но потом понял, что вместо этого я могу использовать простой метод расширения, написанный на C #.

Я могу легко вставить текст и добавить "...", но я застрял с проблемой необходимости заканчивать его полным словом. Вот мой код (очень сложный: p)

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

Пример текста

Lorem Ipsum Dolor Sit Amet, Amet Concetetur Adipiscing Elit.

Если мы реализовали метод эллипса выше (длина = 15), результат будет выглядеть как

Lorem Ipsum Dolor Sit Amet, Amet Concectetur Adipi ...

Я бы хотел убедиться, что ни одно слово никогда не разрезается, поэтому вывод должен выглядеть как

Lorem Ipsum Dolor Sit Amet, Amet Concetetur Adipiscing ...

Любая помощь приветствуется.

EDIT

После запуска примера для приведенного ниже кода выясняется, что если длина многоточия заканчивается на последнем слове, текст вообще не отображается.

Вот вывод, см. Строку 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

Ответы [ 2 ]

20 голосов
/ 27 сентября 2010
if (text.Length <= length) return text;
int pos = text.IndexOf(" ", length) ;
if (pos >= 0)
    return text.Substring(0, pos) + "...";
return text;

Редактировать: это программа, с которой я тестировал:

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

Вот вывод:

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...
3 голосов
/ 13 февраля 2013

Я хочу дать альтернативную реализацию, потому что код, данный Preet, не обеспечивает максимальную длину текста. Мне пришлось реализовать функцию многоточия слова, которая возвращает ограниченную многоточную текстовую многоточность слова. Кроме того, знаки препинания также обрезаются непосредственно перед многоточием.

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

Юнит проверен - работает как брелок.

Выход:

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.
...