util.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import { useStage } from "@/core/hook/use-global-vars";
  2. import { useUnitTransform } from "@/core/hook/use-viewer";
  3. import { Text } from "konva/lib/shapes/Text";
  4. export const useGetPointerTextNdx = () => {
  5. const stage = useStage();
  6. return (shape: Text) => {
  7. let pointerPos = stage.value?.getNode().pointerPos;
  8. const str = shape.text();
  9. if (!pointerPos || str.length === 0) {
  10. return str.length;
  11. }
  12. const transform = shape.getAbsoluteTransform().invert()
  13. const textPos = {x: 0, y: 0}
  14. const finalPos = transform.point({
  15. x: pointerPos.x - textPos.x,
  16. y: pointerPos.y - textPos.y,
  17. });
  18. const width = shape.width();
  19. const textHeight = shape.textHeight;
  20. const lineNdx = Math.floor(finalPos.y / textHeight);
  21. const textArr = shape.textArr;
  22. let ndx = str.length;
  23. if (lineNdx >= textArr.length || lineNdx < 0) return ndx;
  24. console.log(textArr, lineNdx)
  25. const line = textArr[lineNdx];
  26. const hanlfSize = shape.fontSize() / 2
  27. let i = 0;
  28. let x = (width - line.width) / 2;
  29. let after = false;
  30. for (; i < line.text.length; i++) {
  31. const size = shape.measureSize(line.text[i]);
  32. x += size.width;
  33. if (x > finalPos.x) {
  34. const diff = x - finalPos.x
  35. console.log(diff, hanlfSize, shape.fontSize())
  36. if (diff < hanlfSize && line.text.length >= i + 1) {
  37. after = true;
  38. }
  39. break;
  40. }
  41. }
  42. console.log(i, after)
  43. if (i === line.text.length) {
  44. ndx = line.text.length - 1;
  45. after = true;
  46. } else {
  47. ndx = i;
  48. }
  49. let strNdx = 0;
  50. let emptyCount = 0;
  51. for (let i = 0; i < lineNdx; i++) {
  52. const cStr = textArr[i].text;
  53. if (!cStr) {
  54. // emptyCount++;
  55. } else if (i !== lineNdx) {
  56. strNdx = strNdx + str.substring(strNdx).indexOf(cStr) + cStr.length;
  57. emptyCount = 0;
  58. } else {
  59. strNdx = strNdx + str.substring(strNdx).indexOf(cStr);
  60. emptyCount = 0;
  61. }
  62. if (i !== lineNdx) {
  63. if (textArr[i].lastInParagraph) {
  64. strNdx += 1;
  65. }
  66. }
  67. }
  68. const char = line.text[ndx];
  69. const yStr = str.substring(strNdx + emptyCount);
  70. i = ndx;
  71. for (; i < yStr.length; i++) {
  72. if (yStr[i] === char) {
  73. break;
  74. }
  75. }
  76. ndx = strNdx + emptyCount + i + (after ? 1 : 0);
  77. if (import.meta.env.DEV) {
  78. console.log(
  79. strNdx,
  80. ndx,
  81. emptyCount,
  82. str.substring(strNdx + emptyCount),
  83. i,
  84. char,
  85. yStr,
  86. yStr[i]
  87. );
  88. }
  89. return ndx;
  90. };
  91. };