00001 var baseToString = require('./_baseToString'), 00002 castSlice = require('./_castSlice'), 00003 hasUnicode = require('./_hasUnicode'), 00004 isObject = require('./isObject'), 00005 isRegExp = require('./isRegExp'), 00006 stringSize = require('./_stringSize'), 00007 stringToArray = require('./_stringToArray'), 00008 toInteger = require('./toInteger'), 00009 toString = require('./toString'); 00010 00012 var DEFAULT_TRUNC_LENGTH = 30, 00013 DEFAULT_TRUNC_OMISSION = '...'; 00014 00016 var reFlags = /\w*$/; 00017 00055 function truncate(string, options) { 00056 var length = DEFAULT_TRUNC_LENGTH, 00057 omission = DEFAULT_TRUNC_OMISSION; 00058 00059 if (isObject(options)) { 00060 var separator = 'separator' in options ? options.separator : separator; 00061 length = 'length' in options ? toInteger(options.length) : length; 00062 omission = 'omission' in options ? baseToString(options.omission) : omission; 00063 } 00064 string = toString(string); 00065 00066 var strLength = string.length; 00067 if (hasUnicode(string)) { 00068 var strSymbols = stringToArray(string); 00069 strLength = strSymbols.length; 00070 } 00071 if (length >= strLength) { 00072 return string; 00073 } 00074 var end = length - stringSize(omission); 00075 if (end < 1) { 00076 return omission; 00077 } 00078 var result = strSymbols 00079 ? castSlice(strSymbols, 0, end).join('') 00080 : string.slice(0, end); 00081 00082 if (separator === undefined) { 00083 return result + omission; 00084 } 00085 if (strSymbols) { 00086 end += (result.length - end); 00087 } 00088 if (isRegExp(separator)) { 00089 if (string.slice(end).search(separator)) { 00090 var match, 00091 substring = result; 00092 00093 if (!separator.global) { 00094 separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g'); 00095 } 00096 separator.lastIndex = 0; 00097 while ((match = separator.exec(substring))) { 00098 var newEnd = match.index; 00099 } 00100 result = result.slice(0, newEnd === undefined ? end : newEnd); 00101 } 00102 } else if (string.indexOf(baseToString(separator), end) != end) { 00103 var index = result.lastIndexOf(separator); 00104 if (index > -1) { 00105 result = result.slice(0, index); 00106 } 00107 } 00108 return result + omission; 00109 } 00110 00111 module.exports = truncate;