智慧水务管理系统 - 精河县供水工程综合管理平台

truncate-smart.js 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.truncateSmart = truncateSmart;
  4. /**
  5. * Date: 2015-10-05
  6. * Author: Kasper Søfren <soefritz@gmail.com> (https://github.com/kafoso)
  7. *
  8. * A truncation feature, where the ellipsis will be placed at a section within
  9. * the URL making it still somewhat human readable.
  10. *
  11. * @param {String} url A URL.
  12. * @param {Number} truncateLen The maximum length of the truncated output URL string.
  13. * @param {String} ellipsisChars The characters to place within the url, e.g. "...".
  14. * @return {String} The truncated URL.
  15. */
  16. function truncateSmart(url, truncateLen, ellipsisChars) {
  17. var ellipsisLengthBeforeParsing;
  18. var ellipsisLength;
  19. if (ellipsisChars == null) {
  20. ellipsisChars = '&hellip;';
  21. ellipsisLength = 3;
  22. ellipsisLengthBeforeParsing = 8;
  23. }
  24. else {
  25. ellipsisLength = ellipsisChars.length;
  26. ellipsisLengthBeforeParsing = ellipsisChars.length;
  27. }
  28. // If the URL is shorter than the truncate length, return it as is
  29. if (url.length <= truncateLen) {
  30. return url;
  31. }
  32. var availableLength = truncateLen - ellipsisLength;
  33. var urlObj = parseUrl(url);
  34. // Clean up the URL by removing any malformed query string
  35. // (e.g. "?foo=bar?ignorethis")
  36. if (urlObj.query) {
  37. var matchQuery = urlObj.query.match(/^(.*?)(?=(\?|#))(.*?)$/i);
  38. if (matchQuery) {
  39. // Malformed URL; two or more "?". Removed any content behind the 2nd.
  40. urlObj.query = urlObj.query.substr(0, matchQuery[1].length);
  41. url = buildUrl(urlObj);
  42. }
  43. }
  44. if (url.length <= truncateLen) {
  45. return url; // removing a malformed query string brought the URL under the truncateLength
  46. }
  47. // Clean up the URL by removing 'www.' from the host if it exists
  48. if (urlObj.host) {
  49. urlObj.host = urlObj.host.replace(/^www\./, '');
  50. url = buildUrl(urlObj);
  51. }
  52. if (url.length <= truncateLen) {
  53. return url; // removing 'www.' brought the URL under the truncateLength
  54. }
  55. // Process and build the truncated URL, starting with the hostname
  56. var truncatedUrl = '';
  57. if (urlObj.host) {
  58. truncatedUrl += urlObj.host;
  59. }
  60. if (truncatedUrl.length >= availableLength) {
  61. if (urlObj.host.length === truncateLen) {
  62. return (urlObj.host.substr(0, truncateLen - ellipsisLength) + ellipsisChars).substr(0, availableLength + ellipsisLengthBeforeParsing);
  63. }
  64. return buildSegment(truncatedUrl, availableLength, ellipsisChars).substr(0, availableLength + ellipsisLengthBeforeParsing);
  65. }
  66. // If we still have available chars left, add the path and query string
  67. var pathAndQuery = '';
  68. if (urlObj.path) {
  69. pathAndQuery += '/' + urlObj.path;
  70. }
  71. if (urlObj.query) {
  72. pathAndQuery += '?' + urlObj.query;
  73. }
  74. if (pathAndQuery) {
  75. if ((truncatedUrl + pathAndQuery).length >= availableLength) {
  76. if ((truncatedUrl + pathAndQuery).length == truncateLen) {
  77. return (truncatedUrl + pathAndQuery).substr(0, truncateLen);
  78. }
  79. var remainingAvailableLength = availableLength - truncatedUrl.length;
  80. return (truncatedUrl + buildSegment(pathAndQuery, remainingAvailableLength, ellipsisChars)).substr(0, availableLength + ellipsisLengthBeforeParsing);
  81. }
  82. else {
  83. truncatedUrl += pathAndQuery;
  84. }
  85. }
  86. // If we still have available chars left, add the fragment
  87. if (urlObj.fragment) {
  88. var fragment = '#' + urlObj.fragment;
  89. if ((truncatedUrl + fragment).length >= availableLength) {
  90. if ((truncatedUrl + fragment).length == truncateLen) {
  91. return (truncatedUrl + fragment).substr(0, truncateLen);
  92. }
  93. var remainingAvailableLength2 = availableLength - truncatedUrl.length;
  94. return (truncatedUrl + buildSegment(fragment, remainingAvailableLength2, ellipsisChars)).substr(0, availableLength + ellipsisLengthBeforeParsing);
  95. }
  96. else {
  97. truncatedUrl += fragment;
  98. }
  99. }
  100. // If we still have available chars left, add the scheme
  101. if (urlObj.scheme && urlObj.host) {
  102. var scheme = urlObj.scheme + '://';
  103. if ((truncatedUrl + scheme).length < availableLength) {
  104. return (scheme + truncatedUrl).substr(0, truncateLen);
  105. }
  106. }
  107. if (truncatedUrl.length <= truncateLen) {
  108. return truncatedUrl;
  109. }
  110. var end = '';
  111. if (availableLength > 0) {
  112. end = truncatedUrl.substr(-1 * Math.floor(availableLength / 2));
  113. }
  114. return (truncatedUrl.substr(0, Math.ceil(availableLength / 2)) + ellipsisChars + end).substr(0, availableLength + ellipsisLengthBeforeParsing);
  115. }
  116. /**
  117. * Parses a URL into its components: scheme, host, path, query, and fragment.
  118. */
  119. function parseUrl(url) {
  120. // Functionality inspired by PHP function of same name
  121. var urlObj = {};
  122. var urlSub = url;
  123. // Parse scheme
  124. var match = urlSub.match(/^([a-z]+):\/\//i);
  125. if (match) {
  126. urlObj.scheme = match[1];
  127. urlSub = urlSub.slice(match[0].length);
  128. }
  129. // Parse host
  130. match = urlSub.match(/^(.*?)(?=(\?|#|\/|$))/i);
  131. if (match) {
  132. urlObj.host = match[1];
  133. urlSub = urlSub.slice(match[0].length);
  134. }
  135. // Parse path
  136. match = urlSub.match(/^\/(.*?)(?=(\?|#|$))/i);
  137. if (match) {
  138. urlObj.path = match[1];
  139. urlSub = urlSub.slice(match[0].length);
  140. }
  141. // Parse query
  142. match = urlSub.match(/^\?(.*?)(?=(#|$))/i);
  143. if (match) {
  144. urlObj.query = match[1];
  145. urlSub = urlSub.slice(match[0].length);
  146. }
  147. // Parse fragment
  148. match = urlSub.match(/^#(.*?)$/i);
  149. if (match) {
  150. urlObj.fragment = match[1];
  151. //urlSub = urlSub.slice(match[0].length); -- not used. Uncomment if adding another block.
  152. }
  153. return urlObj;
  154. }
  155. function buildUrl(urlObj) {
  156. var url = '';
  157. if (urlObj.scheme && urlObj.host) {
  158. url += urlObj.scheme + '://';
  159. }
  160. if (urlObj.host) {
  161. url += urlObj.host;
  162. }
  163. if (urlObj.path) {
  164. url += '/' + urlObj.path;
  165. }
  166. if (urlObj.query) {
  167. url += '?' + urlObj.query;
  168. }
  169. if (urlObj.fragment) {
  170. url += '#' + urlObj.fragment;
  171. }
  172. return url;
  173. }
  174. function buildSegment(segment, remainingAvailableLength, ellipsisChars) {
  175. var remainingAvailableLengthHalf = remainingAvailableLength / 2;
  176. var startOffset = Math.ceil(remainingAvailableLengthHalf);
  177. var endOffset = -1 * Math.floor(remainingAvailableLengthHalf);
  178. var end = '';
  179. if (endOffset < 0) {
  180. end = segment.substr(endOffset);
  181. }
  182. return segment.substr(0, startOffset) + ellipsisChars + end;
  183. }
  184. //# sourceMappingURL=truncate-smart.js.map