1 | var baseToString = require('./_baseToString'),
|
2 | castSlice = require('./_castSlice'),
|
3 | hasUnicode = require('./_hasUnicode'),
|
4 | isObject = require('./isObject'),
|
5 | isRegExp = require('./isRegExp'),
|
6 | stringSize = require('./_stringSize'),
|
7 | stringToArray = require('./_stringToArray'),
|
8 | toInteger = require('./toInteger'),
|
9 | toString = require('./toString');
|
10 |
|
11 |
|
12 | var DEFAULT_TRUNC_LENGTH = 30,
|
13 | DEFAULT_TRUNC_OMISSION = '...';
|
14 |
|
15 |
|
16 | var reFlags = /\w*$/;
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 | function truncate(string, options) {
|
56 | var length = DEFAULT_TRUNC_LENGTH,
|
57 | omission = DEFAULT_TRUNC_OMISSION;
|
58 |
|
59 | if (isObject(options)) {
|
60 | var separator = 'separator' in options ? options.separator : separator;
|
61 | length = 'length' in options ? toInteger(options.length) : length;
|
62 | omission = 'omission' in options ? baseToString(options.omission) : omission;
|
63 | }
|
64 | string = toString(string);
|
65 |
|
66 | var strLength = string.length;
|
67 | if (hasUnicode(string)) {
|
68 | var strSymbols = stringToArray(string);
|
69 | strLength = strSymbols.length;
|
70 | }
|
71 | if (length >= strLength) {
|
72 | return string;
|
73 | }
|
74 | var end = length - stringSize(omission);
|
75 | if (end < 1) {
|
76 | return omission;
|
77 | }
|
78 | var result = strSymbols
|
79 | ? castSlice(strSymbols, 0, end).join('')
|
80 | : string.slice(0, end);
|
81 |
|
82 | if (separator === undefined) {
|
83 | return result + omission;
|
84 | }
|
85 | if (strSymbols) {
|
86 | end += (result.length - end);
|
87 | }
|
88 | if (isRegExp(separator)) {
|
89 | if (string.slice(end).search(separator)) {
|
90 | var match,
|
91 | substring = result;
|
92 |
|
93 | if (!separator.global) {
|
94 | separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
|
95 | }
|
96 | separator.lastIndex = 0;
|
97 | while ((match = separator.exec(substring))) {
|
98 | var newEnd = match.index;
|
99 | }
|
100 | result = result.slice(0, newEnd === undefined ? end : newEnd);
|
101 | }
|
102 | } else if (string.indexOf(baseToString(separator), end) != end) {
|
103 | var index = result.lastIndexOf(separator);
|
104 | if (index > -1) {
|
105 | result = result.slice(0, index);
|
106 | }
|
107 | }
|
108 | return result + omission;
|
109 | }
|
110 |
|
111 | module.exports = truncate;
|