|
var baseToString = require('./_baseToString'), |
|
castSlice = require('./_castSlice'), |
|
hasUnicode = require('./_hasUnicode'), |
|
isObject = require('./isObject'), |
|
isRegExp = require('./isRegExp'), |
|
stringSize = require('./_stringSize'), |
|
stringToArray = require('./_stringToArray'), |
|
toInteger = require('./toInteger'), |
|
toString = require('./toString'); |
|
|
|
|
|
var DEFAULT_TRUNC_LENGTH = 30, |
|
DEFAULT_TRUNC_OMISSION = '...'; |
|
|
|
|
|
var reFlags = /\w*$/; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function truncate(string, options) { |
|
var length = DEFAULT_TRUNC_LENGTH, |
|
omission = DEFAULT_TRUNC_OMISSION; |
|
|
|
if (isObject(options)) { |
|
var separator = 'separator' in options ? options.separator : separator; |
|
length = 'length' in options ? toInteger(options.length) : length; |
|
omission = 'omission' in options ? baseToString(options.omission) : omission; |
|
} |
|
string = toString(string); |
|
|
|
var strLength = string.length; |
|
if (hasUnicode(string)) { |
|
var strSymbols = stringToArray(string); |
|
strLength = strSymbols.length; |
|
} |
|
if (length >= strLength) { |
|
return string; |
|
} |
|
var end = length - stringSize(omission); |
|
if (end < 1) { |
|
return omission; |
|
} |
|
var result = strSymbols |
|
? castSlice(strSymbols, 0, end).join('') |
|
: string.slice(0, end); |
|
|
|
if (separator === undefined) { |
|
return result + omission; |
|
} |
|
if (strSymbols) { |
|
end += (result.length - end); |
|
} |
|
if (isRegExp(separator)) { |
|
if (string.slice(end).search(separator)) { |
|
var match, |
|
substring = result; |
|
|
|
if (!separator.global) { |
|
separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g'); |
|
} |
|
separator.lastIndex = 0; |
|
while ((match = separator.exec(substring))) { |
|
var newEnd = match.index; |
|
} |
|
result = result.slice(0, newEnd === undefined ? end : newEnd); |
|
} |
|
} else if (string.indexOf(baseToString(separator), end) != end) { |
|
var index = result.lastIndexOf(separator); |
|
if (index > -1) { |
|
result = result.slice(0, index); |
|
} |
|
} |
|
return result + omission; |
|
} |
|
|
|
module.exports = truncate; |
|
|