label.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.ellipsisLabel = exports.testLabel = exports.getLabelLength = exports.getMaxLabelWidth = void 0;
  4. var util_1 = require("@antv/util");
  5. var text_1 = require("./text");
  6. var ELLIPSIS_CODE = '\u2026';
  7. var ELLIPSIS_CODE_LENGTH = 2; // 省略号的长度
  8. /** 大数据量阈值 */
  9. var OPTIMIZE_THRESHOLD = 400;
  10. /**
  11. * 针对大数据量做优化的 getMaxLabelWidth,做法不是直接去比较每一个 label 的最大宽度
  12. * 而是先通过比较每个 label 每个的字符串的长度,这里区分了下中英文字符
  13. * 最终是去字符串最“长”的那个 label 的宽度。
  14. * @param labels
  15. */
  16. function getMaxLabelWidthOptimized(labels) {
  17. var texts = labels.map(function (label) {
  18. var text = label.attr('text');
  19. return util_1.isNil(text) ? '' : "" + text;
  20. });
  21. var maxLen = 0;
  22. var maxIdx = 0;
  23. for (var i = 0; i < texts.length; i += 1) {
  24. var len = 0;
  25. for (var j = 0; j <= texts[i].length; j += 1) {
  26. var code = texts[i].charCodeAt(j);
  27. if (code >= 19968 && code <= 40869) {
  28. len += 2;
  29. }
  30. else {
  31. len += 1;
  32. }
  33. }
  34. if (len > maxLen) {
  35. maxLen = len;
  36. maxIdx = i;
  37. }
  38. }
  39. return labels[maxIdx].getBBox().width;
  40. }
  41. /** 获取最长的 label */
  42. function getMaxLabelWidth(labels) {
  43. if (labels.length > OPTIMIZE_THRESHOLD) {
  44. return getMaxLabelWidthOptimized(labels);
  45. }
  46. var max = 0;
  47. util_1.each(labels, function (label) {
  48. var bbox = label.getBBox();
  49. var width = bbox.width;
  50. if (max < width) {
  51. max = width;
  52. }
  53. });
  54. return max;
  55. }
  56. exports.getMaxLabelWidth = getMaxLabelWidth;
  57. /** 获取label长度 */
  58. function getLabelLength(isVertical, label) {
  59. var bbox = label.getCanvasBBox();
  60. return isVertical ? bbox.width : bbox.height;
  61. }
  62. exports.getLabelLength = getLabelLength;
  63. /* label长度是否超过约束值 */
  64. function testLabel(label, limitLength) {
  65. return label.getBBox().width < limitLength;
  66. }
  67. exports.testLabel = testLabel;
  68. /** 处理 text shape 的自动省略 */
  69. function ellipsisLabel(isVertical, label, limitLength, position) {
  70. var _a;
  71. if (position === void 0) { position = 'tail'; }
  72. var text = (_a = label.attr('text')) !== null && _a !== void 0 ? _a : ''; // 避免出现null、undefined
  73. if (position === 'tail') {
  74. // component 里的缩略处理做得很糟糕,文字长度测算完全不准确
  75. // 这里暂时只对 tail 做处理
  76. var font = util_1.pick(label.attr(), ['fontSize', 'fontFamily', 'fontWeight', 'fontStyle', 'fontVariant']);
  77. var ellipsisText = util_1.getEllipsisText(text, limitLength, font, '…');
  78. if (text !== ellipsisText) {
  79. label.attr('text', ellipsisText);
  80. label.set('tip', text);
  81. return true;
  82. }
  83. label.set('tip', null);
  84. return false;
  85. }
  86. var labelLength = getLabelLength(isVertical, label);
  87. var codeLength = text_1.strLen(text);
  88. var ellipsisFlag = false;
  89. if (limitLength < labelLength) {
  90. var reserveLength = Math.floor((limitLength / labelLength) * codeLength) - ELLIPSIS_CODE_LENGTH; // 计算出来的应该保存的长度
  91. var newText = void 0;
  92. if (reserveLength >= 0) {
  93. newText = text_1.ellipsisString(text, reserveLength, position);
  94. }
  95. else {
  96. newText = ELLIPSIS_CODE;
  97. }
  98. if (newText) {
  99. label.attr('text', newText);
  100. ellipsisFlag = true;
  101. }
  102. }
  103. if (ellipsisFlag) {
  104. label.set('tip', text);
  105. }
  106. else {
  107. label.set('tip', null);
  108. }
  109. return ellipsisFlag;
  110. }
  111. exports.ellipsisLabel = ellipsisLabel;
  112. //# sourceMappingURL=label.js.map